]> git.openstreetmap.org Git - rails.git/blobdiff - vendor/assets/iD/iD/mapillary-js/mapillary.js
Update to iD v2.19.0
[rails.git] / vendor / assets / iD / iD / mapillary-js / mapillary.js
index 8b0ef028901cb7eaf57e3a04def5e42ae76b7124..2f5ed53516c93df077c2ee17c443a2c48406cb4f 100644 (file)
@@ -156,7 +156,7 @@ function getSegDistSq(px, py, a, b) {
     return dx * dx + dy * dy;
 }
 
-},{"tinyqueue":177}],2:[function(require,module,exports){
+},{"tinyqueue":243}],2:[function(require,module,exports){
 /*
  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
  *
@@ -490,196 +490,10 @@ module.exports = (function split(undef) {
 })();
 
 },{}],6:[function(require,module,exports){
-// shim for using process in browser
-var process = module.exports = {};
-
-// cached from whatever global is present so that test runners that stub it
-// don't break things.  But we need to wrap it in a try catch in case it is
-// wrapped in strict mode code which doesn't define any globals.  It's inside a
-// function because try/catches deoptimize in certain engines.
-
-var cachedSetTimeout;
-var cachedClearTimeout;
-
-function defaultSetTimout() {
-    throw new Error('setTimeout has not been defined');
-}
-function defaultClearTimeout () {
-    throw new Error('clearTimeout has not been defined');
-}
-(function () {
-    try {
-        if (typeof setTimeout === 'function') {
-            cachedSetTimeout = setTimeout;
-        } else {
-            cachedSetTimeout = defaultSetTimout;
-        }
-    } catch (e) {
-        cachedSetTimeout = defaultSetTimout;
-    }
-    try {
-        if (typeof clearTimeout === 'function') {
-            cachedClearTimeout = clearTimeout;
-        } else {
-            cachedClearTimeout = defaultClearTimeout;
-        }
-    } catch (e) {
-        cachedClearTimeout = defaultClearTimeout;
-    }
-} ())
-function runTimeout(fun) {
-    if (cachedSetTimeout === setTimeout) {
-        //normal enviroments in sane situations
-        return setTimeout(fun, 0);
-    }
-    // if setTimeout wasn't available but was latter defined
-    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
-        cachedSetTimeout = setTimeout;
-        return setTimeout(fun, 0);
-    }
-    try {
-        // when when somebody has screwed with setTimeout but no I.E. maddness
-        return cachedSetTimeout(fun, 0);
-    } catch(e){
-        try {
-            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
-            return cachedSetTimeout.call(null, fun, 0);
-        } catch(e){
-            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
-            return cachedSetTimeout.call(this, fun, 0);
-        }
-    }
-
-
-}
-function runClearTimeout(marker) {
-    if (cachedClearTimeout === clearTimeout) {
-        //normal enviroments in sane situations
-        return clearTimeout(marker);
-    }
-    // if clearTimeout wasn't available but was latter defined
-    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
-        cachedClearTimeout = clearTimeout;
-        return clearTimeout(marker);
-    }
-    try {
-        // when when somebody has screwed with setTimeout but no I.E. maddness
-        return cachedClearTimeout(marker);
-    } catch (e){
-        try {
-            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
-            return cachedClearTimeout.call(null, marker);
-        } catch (e){
-            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
-            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
-            return cachedClearTimeout.call(this, marker);
-        }
-    }
-
-
-
-}
-var queue = [];
-var draining = false;
-var currentQueue;
-var queueIndex = -1;
-
-function cleanUpNextTick() {
-    if (!draining || !currentQueue) {
-        return;
-    }
-    draining = false;
-    if (currentQueue.length) {
-        queue = currentQueue.concat(queue);
-    } else {
-        queueIndex = -1;
-    }
-    if (queue.length) {
-        drainQueue();
-    }
-}
-
-function drainQueue() {
-    if (draining) {
-        return;
-    }
-    var timeout = runTimeout(cleanUpNextTick);
-    draining = true;
-
-    var len = queue.length;
-    while(len) {
-        currentQueue = queue;
-        queue = [];
-        while (++queueIndex < len) {
-            if (currentQueue) {
-                currentQueue[queueIndex].run();
-            }
-        }
-        queueIndex = -1;
-        len = queue.length;
-    }
-    currentQueue = null;
-    draining = false;
-    runClearTimeout(timeout);
-}
-
-process.nextTick = function (fun) {
-    var args = new Array(arguments.length - 1);
-    if (arguments.length > 1) {
-        for (var i = 1; i < arguments.length; i++) {
-            args[i - 1] = arguments[i];
-        }
-    }
-    queue.push(new Item(fun, args));
-    if (queue.length === 1 && !draining) {
-        runTimeout(drainQueue);
-    }
-};
-
-// v8 likes predictible objects
-function Item(fun, array) {
-    this.fun = fun;
-    this.array = array;
-}
-Item.prototype.run = function () {
-    this.fun.apply(null, this.array);
-};
-process.title = 'browser';
-process.browser = true;
-process.env = {};
-process.argv = [];
-process.version = ''; // empty string to avoid regexp issues
-process.versions = {};
-
-function noop() {}
-
-process.on = noop;
-process.addListener = noop;
-process.once = noop;
-process.off = noop;
-process.removeListener = noop;
-process.removeAllListeners = noop;
-process.emit = noop;
-process.prependListener = noop;
-process.prependOnceListener = noop;
-
-process.listeners = function (name) { return [] }
-
-process.binding = function (name) {
-    throw new Error('process.binding is not supported');
-};
-
-process.cwd = function () { return '/' };
-process.chdir = function (dir) {
-    throw new Error('process.chdir is not supported');
-};
-process.umask = function() { return 0; };
-
-},{}],7:[function(require,module,exports){
 /*!
  * The buffer module from node.js, for the browser.
  *
- * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * @author   Feross Aboukhadijeh <https://feross.org>
  * @license  MIT
  */
 /* eslint-disable no-proto */
@@ -724,16 +538,32 @@ function typedArraySupport () {
   // Can typed array instances can be augmented?
   try {
     var arr = new Uint8Array(1)
-    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
+    arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } }
     return arr.foo() === 42
   } catch (e) {
     return false
   }
 }
 
+Object.defineProperty(Buffer.prototype, 'parent', {
+  enumerable: true,
+  get: function () {
+    if (!Buffer.isBuffer(this)) return undefined
+    return this.buffer
+  }
+})
+
+Object.defineProperty(Buffer.prototype, 'offset', {
+  enumerable: true,
+  get: function () {
+    if (!Buffer.isBuffer(this)) return undefined
+    return this.byteOffset
+  }
+})
+
 function createBuffer (length) {
   if (length > K_MAX_LENGTH) {
-    throw new RangeError('Invalid typed array length')
+    throw new RangeError('The value "' + length + '" is invalid for option "size"')
   }
   // Return an augmented `Uint8Array` instance
   var buf = new Uint8Array(length)
@@ -755,8 +585,8 @@ function Buffer (arg, encodingOrOffset, length) {
   // Common case.
   if (typeof arg === 'number') {
     if (typeof encodingOrOffset === 'string') {
-      throw new Error(
-        'If encoding is specified then the first argument must be a string'
+      throw new TypeError(
+        'The "string" argument must be of type string. Received type number'
       )
     }
     return allocUnsafe(arg)
@@ -765,7 +595,7 @@ function Buffer (arg, encodingOrOffset, length) {
 }
 
 // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
-if (typeof Symbol !== 'undefined' && Symbol.species &&
+if (typeof Symbol !== 'undefined' && Symbol.species != null &&
     Buffer[Symbol.species] === Buffer) {
   Object.defineProperty(Buffer, Symbol.species, {
     value: null,
@@ -778,19 +608,51 @@ if (typeof Symbol !== 'undefined' && Symbol.species &&
 Buffer.poolSize = 8192 // not used by this implementation
 
 function from (value, encodingOrOffset, length) {
-  if (typeof value === 'number') {
-    throw new TypeError('"value" argument must not be a number')
+  if (typeof value === 'string') {
+    return fromString(value, encodingOrOffset)
+  }
+
+  if (ArrayBuffer.isView(value)) {
+    return fromArrayLike(value)
+  }
+
+  if (value == null) {
+    throw TypeError(
+      'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
+      'or Array-like Object. Received type ' + (typeof value)
+    )
   }
 
-  if (value instanceof ArrayBuffer) {
+  if (isInstance(value, ArrayBuffer) ||
+      (value && isInstance(value.buffer, ArrayBuffer))) {
     return fromArrayBuffer(value, encodingOrOffset, length)
   }
 
-  if (typeof value === 'string') {
-    return fromString(value, encodingOrOffset)
+  if (typeof value === 'number') {
+    throw new TypeError(
+      'The "value" argument must not be of type number. Received type number'
+    )
   }
 
-  return fromObject(value)
+  var valueOf = value.valueOf && value.valueOf()
+  if (valueOf != null && valueOf !== value) {
+    return Buffer.from(valueOf, encodingOrOffset, length)
+  }
+
+  var b = fromObject(value)
+  if (b) return b
+
+  if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&
+      typeof value[Symbol.toPrimitive] === 'function') {
+    return Buffer.from(
+      value[Symbol.toPrimitive]('string'), encodingOrOffset, length
+    )
+  }
+
+  throw new TypeError(
+    'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
+    'or Array-like Object. Received type ' + (typeof value)
+  )
 }
 
 /**
@@ -812,9 +674,9 @@ Buffer.__proto__ = Uint8Array
 
 function assertSize (size) {
   if (typeof size !== 'number') {
-    throw new TypeError('"size" argument must be a number')
+    throw new TypeError('"size" argument must be of type number')
   } else if (size < 0) {
-    throw new RangeError('"size" argument must not be negative')
+    throw new RangeError('The value "' + size + '" is invalid for option "size"')
   }
 }
 
@@ -866,7 +728,7 @@ function fromString (string, encoding) {
   }
 
   if (!Buffer.isEncoding(encoding)) {
-    throw new TypeError('"encoding" must be a valid string encoding')
+    throw new TypeError('Unknown encoding: ' + encoding)
   }
 
   var length = byteLength(string, encoding) | 0
@@ -895,11 +757,11 @@ function fromArrayLike (array) {
 
 function fromArrayBuffer (array, byteOffset, length) {
   if (byteOffset < 0 || array.byteLength < byteOffset) {
-    throw new RangeError('\'offset\' is out of bounds')
+    throw new RangeError('"offset" is outside of buffer bounds')
   }
 
   if (array.byteLength < byteOffset + (length || 0)) {
-    throw new RangeError('\'length\' is out of bounds')
+    throw new RangeError('"length" is outside of buffer bounds')
   }
 
   var buf
@@ -929,20 +791,16 @@ function fromObject (obj) {
     return buf
   }
 
-  if (obj) {
-    if (isArrayBufferView(obj) || 'length' in obj) {
-      if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
-        return createBuffer(0)
-      }
-      return fromArrayLike(obj)
-    }
-
-    if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
-      return fromArrayLike(obj.data)
+  if (obj.length !== undefined) {
+    if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
+      return createBuffer(0)
     }
+    return fromArrayLike(obj)
   }
 
-  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
+  if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
+    return fromArrayLike(obj.data)
+  }
 }
 
 function checked (length) {
@@ -963,12 +821,17 @@ function SlowBuffer (length) {
 }
 
 Buffer.isBuffer = function isBuffer (b) {
-  return b != null && b._isBuffer === true
+  return b != null && b._isBuffer === true &&
+    b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false
 }
 
 Buffer.compare = function compare (a, b) {
+  if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)
+  if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)
   if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
-    throw new TypeError('Arguments must be Buffers')
+    throw new TypeError(
+      'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
+    )
   }
 
   if (a === b) return 0
@@ -1029,6 +892,9 @@ Buffer.concat = function concat (list, length) {
   var pos = 0
   for (i = 0; i < list.length; ++i) {
     var buf = list[i]
+    if (isInstance(buf, Uint8Array)) {
+      buf = Buffer.from(buf)
+    }
     if (!Buffer.isBuffer(buf)) {
       throw new TypeError('"list" argument must be an Array of Buffers')
     }
@@ -1042,15 +908,19 @@ function byteLength (string, encoding) {
   if (Buffer.isBuffer(string)) {
     return string.length
   }
-  if (isArrayBufferView(string) || string instanceof ArrayBuffer) {
+  if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {
     return string.byteLength
   }
   if (typeof string !== 'string') {
-    string = '' + string
+    throw new TypeError(
+      'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
+      'Received type ' + typeof string
+    )
   }
 
   var len = string.length
-  if (len === 0) return 0
+  var mustMatch = (arguments.length > 2 && arguments[2] === true)
+  if (!mustMatch && len === 0) return 0
 
   // Use a for loop to avoid recursion
   var loweredCase = false
@@ -1062,7 +932,6 @@ function byteLength (string, encoding) {
         return len
       case 'utf8':
       case 'utf-8':
-      case undefined:
         return utf8ToBytes(string).length
       case 'ucs2':
       case 'ucs-2':
@@ -1074,7 +943,9 @@ function byteLength (string, encoding) {
       case 'base64':
         return base64ToBytes(string).length
       default:
-        if (loweredCase) return utf8ToBytes(string).length // assume utf8
+        if (loweredCase) {
+          return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8
+        }
         encoding = ('' + encoding).toLowerCase()
         loweredCase = true
     }
@@ -1210,6 +1081,8 @@ Buffer.prototype.toString = function toString () {
   return slowToString.apply(this, arguments)
 }
 
+Buffer.prototype.toLocaleString = Buffer.prototype.toString
+
 Buffer.prototype.equals = function equals (b) {
   if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
   if (this === b) return true
@@ -1219,16 +1092,20 @@ Buffer.prototype.equals = function equals (b) {
 Buffer.prototype.inspect = function inspect () {
   var str = ''
   var max = exports.INSPECT_MAX_BYTES
-  if (this.length > 0) {
-    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
-    if (this.length > max) str += ' ... '
-  }
+  str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()
+  if (this.length > max) str += ' ... '
   return '<Buffer ' + str + '>'
 }
 
 Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
+  if (isInstance(target, Uint8Array)) {
+    target = Buffer.from(target, target.offset, target.byteLength)
+  }
   if (!Buffer.isBuffer(target)) {
-    throw new TypeError('Argument must be a Buffer')
+    throw new TypeError(
+      'The "target" argument must be one of type Buffer or Uint8Array. ' +
+      'Received type ' + (typeof target)
+    )
   }
 
   if (start === undefined) {
@@ -1307,7 +1184,7 @@ function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
   } else if (byteOffset < -0x80000000) {
     byteOffset = -0x80000000
   }
-  byteOffset = +byteOffset  // Coerce to Number.
+  byteOffset = +byteOffset // Coerce to Number.
   if (numberIsNaN(byteOffset)) {
     // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
     byteOffset = dir ? 0 : (buffer.length - 1)
@@ -1430,9 +1307,7 @@ function hexWrite (buf, string, offset, length) {
     }
   }
 
-  // must be an even number of digits
   var strLen = string.length
-  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
 
   if (length > strLen / 2) {
     length = strLen / 2
@@ -1561,8 +1436,8 @@ function utf8Slice (buf, start, end) {
     var codePoint = null
     var bytesPerSequence = (firstByte > 0xEF) ? 4
       : (firstByte > 0xDF) ? 3
-      : (firstByte > 0xBF) ? 2
-      : 1
+        : (firstByte > 0xBF) ? 2
+          : 1
 
     if (i + bytesPerSequence <= end) {
       var secondByte, thirdByte, fourthByte, tempCodePoint
@@ -2125,6 +2000,7 @@ Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert
 
 // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
 Buffer.prototype.copy = function copy (target, targetStart, start, end) {
+  if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
   if (!start) start = 0
   if (!end && end !== 0) end = this.length
   if (targetStart >= target.length) targetStart = target.length
@@ -2139,7 +2015,7 @@ Buffer.prototype.copy = function copy (target, targetStart, start, end) {
   if (targetStart < 0) {
     throw new RangeError('targetStart out of bounds')
   }
-  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
+  if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
   if (end < 0) throw new RangeError('sourceEnd out of bounds')
 
   // Are we oob?
@@ -2149,22 +2025,19 @@ Buffer.prototype.copy = function copy (target, targetStart, start, end) {
   }
 
   var len = end - start
-  var i
 
-  if (this === target && start < targetStart && targetStart < end) {
+  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
+    // Use built-in when available, missing from IE11
+    this.copyWithin(targetStart, start, end)
+  } else if (this === target && start < targetStart && targetStart < end) {
     // descending copy from end
-    for (i = len - 1; i >= 0; --i) {
-      target[i + targetStart] = this[i + start]
-    }
-  } else if (len < 1000) {
-    // ascending copy from start
-    for (i = 0; i < len; ++i) {
+    for (var i = len - 1; i >= 0; --i) {
       target[i + targetStart] = this[i + start]
     }
   } else {
     Uint8Array.prototype.set.call(
       target,
-      this.subarray(start, start + len),
+      this.subarray(start, end),
       targetStart
     )
   }
@@ -2187,18 +2060,20 @@ Buffer.prototype.fill = function fill (val, start, end, encoding) {
       encoding = end
       end = this.length
     }
-    if (val.length === 1) {
-      var code = val.charCodeAt(0)
-      if (code < 256) {
-        val = code
-      }
-    }
     if (encoding !== undefined && typeof encoding !== 'string') {
       throw new TypeError('encoding must be a string')
     }
     if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
       throw new TypeError('Unknown encoding: ' + encoding)
     }
+    if (val.length === 1) {
+      var code = val.charCodeAt(0)
+      if ((encoding === 'utf8' && code < 128) ||
+          encoding === 'latin1') {
+        // Fast path: If `val` fits into a single byte, use that numeric value.
+        val = code
+      }
+    }
   } else if (typeof val === 'number') {
     val = val & 255
   }
@@ -2225,8 +2100,12 @@ Buffer.prototype.fill = function fill (val, start, end, encoding) {
   } else {
     var bytes = Buffer.isBuffer(val)
       ? val
-      : new Buffer(val, encoding)
+      : Buffer.from(val, encoding)
     var len = bytes.length
+    if (len === 0) {
+      throw new TypeError('The value "' + val +
+        '" is invalid for argument "value"')
+    }
     for (i = 0; i < end - start; ++i) {
       this[i + start] = bytes[i % len]
     }
@@ -2241,6 +2120,8 @@ Buffer.prototype.fill = function fill (val, start, end, encoding) {
 var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g
 
 function base64clean (str) {
+  // Node takes equal signs as end of the Base64 encoding
+  str = str.split('=')[0]
   // Node strips out invalid characters like \n and \t from the string, base64-js does not
   str = str.trim().replace(INVALID_BASE64_RE, '')
   // Node converts strings with length < 2 to ''
@@ -2374,19 +2255,210 @@ function blitBuffer (src, dst, offset, length) {
   return i
 }
 
-// Node 0.10 supports `ArrayBuffer` but lacks `ArrayBuffer.isView`
-function isArrayBufferView (obj) {
-  return (typeof ArrayBuffer.isView === 'function') && ArrayBuffer.isView(obj)
+// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
+// the `instanceof` check but they should be treated as of that type.
+// See: https://github.com/feross/buffer/issues/166
+function isInstance (obj, type) {
+  return obj instanceof type ||
+    (obj != null && obj.constructor != null && obj.constructor.name != null &&
+      obj.constructor.name === type.name)
 }
-
 function numberIsNaN (obj) {
+  // For IE11 support
   return obj !== obj // eslint-disable-line no-self-compare
 }
 
-},{"base64-js":3,"ieee754":17}],8:[function(require,module,exports){
+},{"base64-js":3,"ieee754":17}],7:[function(require,module,exports){
+// shim for using process in browser
+var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things.  But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals.  It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+    throw new Error('setTimeout has not been defined');
+}
+function defaultClearTimeout () {
+    throw new Error('clearTimeout has not been defined');
+}
+(function () {
+    try {
+        if (typeof setTimeout === 'function') {
+            cachedSetTimeout = setTimeout;
+        } else {
+            cachedSetTimeout = defaultSetTimout;
+        }
+    } catch (e) {
+        cachedSetTimeout = defaultSetTimout;
+    }
+    try {
+        if (typeof clearTimeout === 'function') {
+            cachedClearTimeout = clearTimeout;
+        } else {
+            cachedClearTimeout = defaultClearTimeout;
+        }
+    } catch (e) {
+        cachedClearTimeout = defaultClearTimeout;
+    }
+} ())
+function runTimeout(fun) {
+    if (cachedSetTimeout === setTimeout) {
+        //normal enviroments in sane situations
+        return setTimeout(fun, 0);
+    }
+    // if setTimeout wasn't available but was latter defined
+    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+        cachedSetTimeout = setTimeout;
+        return setTimeout(fun, 0);
+    }
+    try {
+        // when when somebody has screwed with setTimeout but no I.E. maddness
+        return cachedSetTimeout(fun, 0);
+    } catch(e){
+        try {
+            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+            return cachedSetTimeout.call(null, fun, 0);
+        } catch(e){
+            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+            return cachedSetTimeout.call(this, fun, 0);
+        }
+    }
+
+
+}
+function runClearTimeout(marker) {
+    if (cachedClearTimeout === clearTimeout) {
+        //normal enviroments in sane situations
+        return clearTimeout(marker);
+    }
+    // if clearTimeout wasn't available but was latter defined
+    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+        cachedClearTimeout = clearTimeout;
+        return clearTimeout(marker);
+    }
+    try {
+        // when when somebody has screwed with setTimeout but no I.E. maddness
+        return cachedClearTimeout(marker);
+    } catch (e){
+        try {
+            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
+            return cachedClearTimeout.call(null, marker);
+        } catch (e){
+            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+            return cachedClearTimeout.call(this, marker);
+        }
+    }
+
+
+
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {
+    if (!draining || !currentQueue) {
+        return;
+    }
+    draining = false;
+    if (currentQueue.length) {
+        queue = currentQueue.concat(queue);
+    } else {
+        queueIndex = -1;
+    }
+    if (queue.length) {
+        drainQueue();
+    }
+}
+
+function drainQueue() {
+    if (draining) {
+        return;
+    }
+    var timeout = runTimeout(cleanUpNextTick);
+    draining = true;
+
+    var len = queue.length;
+    while(len) {
+        currentQueue = queue;
+        queue = [];
+        while (++queueIndex < len) {
+            if (currentQueue) {
+                currentQueue[queueIndex].run();
+            }
+        }
+        queueIndex = -1;
+        len = queue.length;
+    }
+    currentQueue = null;
+    draining = false;
+    runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {
+    var args = new Array(arguments.length - 1);
+    if (arguments.length > 1) {
+        for (var i = 1; i < arguments.length; i++) {
+            args[i - 1] = arguments[i];
+        }
+    }
+    queue.push(new Item(fun, args));
+    if (queue.length === 1 && !draining) {
+        runTimeout(drainQueue);
+    }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {
+    this.fun = fun;
+    this.array = array;
+}
+Item.prototype.run = function () {
+    this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+process.prependListener = noop;
+process.prependOnceListener = noop;
+
+process.listeners = function (name) { return [] }
+
+process.binding = function (name) {
+    throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+    throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+
+},{}],8:[function(require,module,exports){
 'use strict';
 
 module.exports = earcut;
+module.exports.default = earcut;
 
 function earcut(data, holeIndices, dim) {
 
@@ -2397,9 +2469,9 @@ function earcut(data, holeIndices, dim) {
         outerNode = linkedList(data, 0, outerLen, dim, true),
         triangles = [];
 
-    if (!outerNode) return triangles;
+    if (!outerNode || outerNode.next === outerNode.prev) return triangles;
 
-    var minX, minY, maxX, maxY, x, y, size;
+    var minX, minY, maxX, maxY, x, y, invSize;
 
     if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);
 
@@ -2417,11 +2489,12 @@ function earcut(data, holeIndices, dim) {
             if (y > maxY) maxY = y;
         }
 
-        // minX, minY and size are later used to transform coords into integers for z-order calculation
-        size = Math.max(maxX - minX, maxY - minY);
+        // minX, minY and invSize are later used to transform coords into integers for z-order calculation
+        invSize = Math.max(maxX - minX, maxY - minY);
+        invSize = invSize !== 0 ? 1 / invSize : 0;
     }
 
-    earcutLinked(outerNode, triangles, dim, minX, minY, size);
+    earcutLinked(outerNode, triangles, dim, minX, minY, invSize);
 
     return triangles;
 }
@@ -2457,7 +2530,7 @@ function filterPoints(start, end) {
         if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
             removeNode(p);
             p = end = p.prev;
-            if (p === p.next) return null;
+            if (p === p.next) break;
             again = true;
 
         } else {
@@ -2469,11 +2542,11 @@ function filterPoints(start, end) {
 }
 
 // main ear slicing loop which triangulates a polygon (given as a linked list)
-function earcutLinked(ear, triangles, dim, minX, minY, size, pass) {
+function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {
     if (!ear) return;
 
     // interlink polygon nodes in z-order
-    if (!pass && size) indexCurve(ear, minX, minY, size);
+    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);
 
     var stop = ear,
         prev, next;
@@ -2483,7 +2556,7 @@ function earcutLinked(ear, triangles, dim, minX, minY, size, pass) {
         prev = ear.prev;
         next = ear.next;
 
-        if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) {
+        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
             // cut off the triangle
             triangles.push(prev.i / dim);
             triangles.push(ear.i / dim);
@@ -2491,7 +2564,7 @@ function earcutLinked(ear, triangles, dim, minX, minY, size, pass) {
 
             removeNode(ear);
 
-            // skipping the next vertice leads to less sliver triangles
+            // skipping the next vertex leads to less sliver triangles
             ear = next.next;
             stop = next.next;
 
@@ -2504,16 +2577,16 @@ function earcutLinked(ear, triangles, dim, minX, minY, size, pass) {
         if (ear === stop) {
             // try filtering points and slicing again
             if (!pass) {
-                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1);
+                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);
 
             // if this didn't work, try curing all small self-intersections locally
             } else if (pass === 1) {
-                ear = cureLocalIntersections(ear, triangles, dim);
-                earcutLinked(ear, triangles, dim, minX, minY, size, 2);
+                ear = cureLocalIntersections(filterPoints(ear), triangles, dim);
+                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);
 
             // as a last resort, try splitting the remaining polygon into two
             } else if (pass === 2) {
-                splitEarcut(ear, triangles, dim, minX, minY, size);
+                splitEarcut(ear, triangles, dim, minX, minY, invSize);
             }
 
             break;
@@ -2541,7 +2614,7 @@ function isEar(ear) {
     return true;
 }
 
-function isEarHashed(ear, minX, minY, size) {
+function isEarHashed(ear, minX, minY, invSize) {
     var a = ear.prev,
         b = ear,
         c = ear.next;
@@ -2555,22 +2628,26 @@ function isEarHashed(ear, minX, minY, size) {
         maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);
 
     // z-order range for the current triangle bbox;
-    var minZ = zOrder(minTX, minTY, minX, minY, size),
-        maxZ = zOrder(maxTX, maxTY, minX, minY, size);
+    var minZ = zOrder(minTX, minTY, minX, minY, invSize),
+        maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);
 
-    // first look for points inside the triangle in increasing z-order
-    var p = ear.nextZ;
+    var p = ear.prevZ,
+        n = ear.nextZ;
 
-    while (p && p.z <= maxZ) {
+    // look for points inside the triangle in both directions
+    while (p && p.z >= minZ && n && n.z <= maxZ) {
         if (p !== ear.prev && p !== ear.next &&
             pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
             area(p.prev, p, p.next) >= 0) return false;
-        p = p.nextZ;
-    }
+        p = p.prevZ;
 
-    // then look for points in decreasing z-order
-    p = ear.prevZ;
+        if (n !== ear.prev && n !== ear.next &&
+            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
+            area(n.prev, n, n.next) >= 0) return false;
+        n = n.nextZ;
+    }
 
+    // look for remaining points in decreasing z-order
     while (p && p.z >= minZ) {
         if (p !== ear.prev && p !== ear.next &&
             pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
@@ -2578,6 +2655,14 @@ function isEarHashed(ear, minX, minY, size) {
         p = p.prevZ;
     }
 
+    // look for remaining points in increasing z-order
+    while (n && n.z <= maxZ) {
+        if (n !== ear.prev && n !== ear.next &&
+            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
+            area(n.prev, n, n.next) >= 0) return false;
+        n = n.nextZ;
+    }
+
     return true;
 }
 
@@ -2603,11 +2688,11 @@ function cureLocalIntersections(start, triangles, dim) {
         p = p.next;
     } while (p !== start);
 
-    return p;
+    return filterPoints(p);
 }
 
 // try splitting polygon into two and triangulate them independently
-function splitEarcut(start, triangles, dim, minX, minY, size) {
+function splitEarcut(start, triangles, dim, minX, minY, invSize) {
     // look for a valid diagonal that divides the polygon into two
     var a = start;
     do {
@@ -2622,8 +2707,8 @@ function splitEarcut(start, triangles, dim, minX, minY, size) {
                 c = filterPoints(c, c.next);
 
                 // run earcut on each half
-                earcutLinked(a, triangles, dim, minX, minY, size);
-                earcutLinked(c, triangles, dim, minX, minY, size);
+                earcutLinked(a, triangles, dim, minX, minY, invSize);
+                earcutLinked(c, triangles, dim, minX, minY, invSize);
                 return;
             }
             b = b.next;
@@ -2665,6 +2750,9 @@ function eliminateHole(hole, outerNode) {
     outerNode = findHoleBridge(hole, outerNode);
     if (outerNode) {
         var b = splitPolygon(outerNode, hole);
+
+        // filter collinear points around the cuts
+        filterPoints(outerNode, outerNode.next);
         filterPoints(b, b.next);
     }
 }
@@ -2680,7 +2768,7 @@ function findHoleBridge(hole, outerNode) {
     // find a segment intersected by a ray from the hole's leftmost point to the left;
     // segment's endpoint with lesser x will be potential connection point
     do {
-        if (hy <= p.y && hy >= p.next.y) {
+        if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
             var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
             if (x <= hx && x > qx) {
                 qx = x;
@@ -2696,7 +2784,7 @@ function findHoleBridge(hole, outerNode) {
 
     if (!m) return null;
 
-    if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint
+    if (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint
 
     // look for points inside the triangle of hole point, segment intersection and endpoint;
     // if there are no points found, we have a valid connection;
@@ -2708,31 +2796,37 @@ function findHoleBridge(hole, outerNode) {
         tanMin = Infinity,
         tan;
 
-    p = m.next;
+    p = m;
 
-    while (p !== stop) {
-        if (hx >= p.x && p.x >= mx &&
+    do {
+        if (hx >= p.x && p.x >= mx && hx !== p.x &&
                 pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
 
             tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
 
-            if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {
+            if (locallyInside(p, hole) &&
+                (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {
                 m = p;
                 tanMin = tan;
             }
         }
 
         p = p.next;
-    }
+    } while (p !== stop);
 
     return m;
 }
 
+// whether sector in vertex m contains sector in vertex p in the same coordinates
+function sectorContainsSector(m, p) {
+    return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;
+}
+
 // interlink polygon nodes in z-order
-function indexCurve(start, minX, minY, size) {
+function indexCurve(start, minX, minY, invSize) {
     var p = start;
     do {
-        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size);
+        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);
         p.prevZ = p.prev;
         p.nextZ = p.next;
         p = p.next;
@@ -2765,20 +2859,11 @@ function sortLinked(list) {
                 q = q.nextZ;
                 if (!q) break;
             }
-
             qSize = inSize;
 
             while (pSize > 0 || (qSize > 0 && q)) {
 
-                if (pSize === 0) {
-                    e = q;
-                    q = q.nextZ;
-                    qSize--;
-                } else if (qSize === 0 || !q) {
-                    e = p;
-                    p = p.nextZ;
-                    pSize--;
-                } else if (p.z <= q.z) {
+                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
                     e = p;
                     p = p.nextZ;
                     pSize--;
@@ -2806,11 +2891,11 @@ function sortLinked(list) {
     return list;
 }
 
-// z-order of a point given coords and size of the data bounding box
-function zOrder(x, y, minX, minY, size) {
+// z-order of a point given coords and inverse of the longer side of data bbox
+function zOrder(x, y, minX, minY, invSize) {
     // coords are transformed into non-negative 15-bit integer range
-    x = 32767 * (x - minX) / size;
-    y = 32767 * (y - minY) / size;
+    x = 32767 * (x - minX) * invSize;
+    y = 32767 * (y - minY) * invSize;
 
     x = (x | (x << 8)) & 0x00FF00FF;
     x = (x | (x << 4)) & 0x0F0F0F0F;
@@ -2830,7 +2915,7 @@ function getLeftmost(start) {
     var p = start,
         leftmost = start;
     do {
-        if (p.x < leftmost.x) leftmost = p;
+        if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;
         p = p.next;
     } while (p !== start);
 
@@ -2846,8 +2931,10 @@ function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
 
 // check if a diagonal between two polygon nodes is valid (lies in polygon interior)
 function isValidDiagonal(a, b) {
-    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&
-           locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);
+    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges
+           (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible
+            (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors
+            equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case
 }
 
 // signed area of a triangle
@@ -2862,10 +2949,28 @@ function equals(p1, p2) {
 
 // check if two segments intersect
 function intersects(p1, q1, p2, q2) {
-    if ((equals(p1, q1) && equals(p2, q2)) ||
-        (equals(p1, q2) && equals(p2, q1))) return true;
-    return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&
-           area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;
+    var o1 = sign(area(p1, q1, p2));
+    var o2 = sign(area(p1, q1, q2));
+    var o3 = sign(area(p2, q2, p1));
+    var o4 = sign(area(p2, q2, q1));
+
+    if (o1 !== o2 && o3 !== o4) return true; // general case
+
+    if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1
+    if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1
+    if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2
+    if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2
+
+    return false;
+}
+
+// for collinear points p, q, r, check if point q lies on segment pr
+function onSegment(p, q, r) {
+    return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);
+}
+
+function sign(num) {
+    return num > 0 ? 1 : num < 0 ? -1 : 0;
 }
 
 // check if a polygon diagonal intersects any polygon segments
@@ -2894,7 +2999,8 @@ function middleInside(a, b) {
         px = (a.x + b.x) / 2,
         py = (a.y + b.y) / 2;
     do {
-        if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
+        if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&
+                (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
             inside = !inside;
         p = p.next;
     } while (p !== a);
@@ -2951,14 +3057,14 @@ function removeNode(p) {
 }
 
 function Node(i, x, y) {
-    // vertice index in coordinates array
+    // vertex index in coordinates array
     this.i = i;
 
     // vertex coordinates
     this.x = x;
     this.y = y;
 
-    // previous and next vertice nodes in a polygon ring
+    // previous and next vertex nodes in a polygon ring
     this.prev = null;
     this.next = null;
 
@@ -3869,13660 +3975,22742 @@ Geohash.neighbours = function(geohash) {
 if (typeof module != 'undefined' && module.exports) module.exports = Geohash; // CommonJS, node.js
 
 },{}],22:[function(require,module,exports){
-(function (process){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
+/**
+ * martinez v0.7.0
+ * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
+ *
+ * @author Alex Milevski <info@w8r.name>
+ * @license MIT
+ * @preserve
+ */
 
-// resolves . and .. elements in a path array with directory names there
-// must be no slashes, empty elements, or device names (c:\) in the array
-// (so also no leading and trailing slashes - it does not distinguish
-// relative and absolute paths)
-function normalizeArray(parts, allowAboveRoot) {
-  // if the path tries to go above the root, `up` ends up > 0
-  var up = 0;
-  for (var i = parts.length - 1; i >= 0; i--) {
-    var last = parts[i];
-    if (last === '.') {
-      parts.splice(i, 1);
-    } else if (last === '..') {
-      parts.splice(i, 1);
-      up++;
-    } else if (up) {
-      parts.splice(i, 1);
-      up--;
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+  typeof define === 'function' && define.amd ? define(['exports'], factory) :
+  (global = global || self, factory(global.martinez = {}));
+}(this, (function (exports) { 'use strict';
+
+  function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
+
+  var SplayTree = function SplayTree(compare, noDuplicates) {
+    if ( compare === void 0 ) compare = DEFAULT_COMPARE;
+    if ( noDuplicates === void 0 ) noDuplicates = false;
+
+    this._compare = compare;
+    this._root = null;
+    this._size = 0;
+    this._noDuplicates = !!noDuplicates;
+  };
+
+  var prototypeAccessors = { size: { configurable: true } };
+
+
+  SplayTree.prototype.rotateLeft = function rotateLeft (x) {
+    var y = x.right;
+    if (y) {
+      x.right = y.left;
+      if (y.left) { y.left.parent = x; }
+      y.parent = x.parent;
     }
-  }
 
-  // if the path is allowed to go above the root, restore leading ..s
-  if (allowAboveRoot) {
-    for (; up--; up) {
-      parts.unshift('..');
+    if (!x.parent)              { this._root = y; }
+    else if (x === x.parent.left) { x.parent.left = y; }
+    else                        { x.parent.right = y; }
+    if (y) { y.left = x; }
+    x.parent = y;
+  };
+
+
+  SplayTree.prototype.rotateRight = function rotateRight (x) {
+    var y = x.left;
+    if (y) {
+      x.left = y.right;
+      if (y.right) { y.right.parent = x; }
+      y.parent = x.parent;
     }
-  }
 
-  return parts;
-}
+    if (!x.parent)             { this._root = y; }
+    else if(x === x.parent.left) { x.parent.left = y; }
+    else                       { x.parent.right = y; }
+    if (y) { y.right = x; }
+    x.parent = y;
+  };
 
-// Split a filename into [root, dir, basename, ext], unix version
-// 'root' is just a slash, or nothing.
-var splitPathRe =
-    /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
-var splitPath = function(filename) {
-  return splitPathRe.exec(filename).slice(1);
-};
 
-// path.resolve([from ...], to)
-// posix version
-exports.resolve = function() {
-  var resolvedPath = '',
-      resolvedAbsolute = false;
+  SplayTree.prototype._splay = function _splay (x) {
+    while (x.parent) {
+      var p = x.parent;
+      if (!p.parent) {
+        if (p.left === x) { this.rotateRight(p); }
+        else            { this.rotateLeft(p); }
+      } else if (p.left === x && p.parent.left === p) {
+        this.rotateRight(p.parent);
+        this.rotateRight(p);
+      } else if (p.right === x && p.parent.right === p) {
+        this.rotateLeft(p.parent);
+        this.rotateLeft(p);
+      } else if (p.left === x && p.parent.right === p) {
+        this.rotateRight(p);
+        this.rotateLeft(p);
+      } else {
+        this.rotateLeft(p);
+        this.rotateRight(p);
+      }
+    }
+  };
 
-  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
-    var path = (i >= 0) ? arguments[i] : process.cwd();
 
-    // Skip empty and invalid entries
-    if (typeof path !== 'string') {
-      throw new TypeError('Arguments to path.resolve must be strings');
-    } else if (!path) {
-      continue;
+  SplayTree.prototype.splay = function splay (x) {
+    var p, gp, ggp, l, r;
+
+    while (x.parent) {
+      p = x.parent;
+      gp = p.parent;
+
+      if (gp && gp.parent) {
+        ggp = gp.parent;
+        if (ggp.left === gp) { ggp.left= x; }
+        else               { ggp.right = x; }
+        x.parent = ggp;
+      } else {
+        x.parent = null;
+        this._root = x;
+      }
+
+      l = x.left; r = x.right;
+
+      if (x === p.left) { // left
+        if (gp) {
+          if (gp.left === p) {
+            /* zig-zig */
+            if (p.right) {
+              gp.left = p.right;
+              gp.left.parent = gp;
+            } else { gp.left = null; }
+
+            p.right = gp;
+            gp.parent = p;
+          } else {
+            /* zig-zag */
+            if (l) {
+              gp.right = l;
+              l.parent = gp;
+            } else { gp.right = null; }
+
+            x.left  = gp;
+            gp.parent = x;
+          }
+        }
+        if (r) {
+          p.left = r;
+          r.parent = p;
+        } else { p.left = null; }
+
+        x.right= p;
+        p.parent = x;
+      } else { // right
+        if (gp) {
+          if (gp.right === p) {
+            /* zig-zig */
+            if (p.left) {
+              gp.right = p.left;
+              gp.right.parent = gp;
+            } else { gp.right = null; }
+
+            p.left = gp;
+            gp.parent = p;
+          } else {
+            /* zig-zag */
+            if (r) {
+              gp.left = r;
+              r.parent = gp;
+            } else { gp.left = null; }
+
+            x.right = gp;
+            gp.parent = x;
+          }
+        }
+        if (l) {
+          p.right = l;
+          l.parent = p;
+        } else { p.right = null; }
+
+        x.left = p;
+        p.parent = x;
+      }
     }
+  };
 
-    resolvedPath = path + '/' + resolvedPath;
-    resolvedAbsolute = path.charAt(0) === '/';
-  }
 
-  // At this point the path should be resolved to a full absolute path, but
-  // handle relative paths to be safe (might happen when process.cwd() fails)
+  SplayTree.prototype.replace = function replace (u, v) {
+    if (!u.parent) { this._root = v; }
+    else if (u === u.parent.left) { u.parent.left = v; }
+    else { u.parent.right = v; }
+    if (v) { v.parent = u.parent; }
+  };
 
-  // Normalize the path
-  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
-    return !!p;
-  }), !resolvedAbsolute).join('/');
 
-  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
-};
+  SplayTree.prototype.minNode = function minNode (u) {
+      if ( u === void 0 ) u = this._root;
 
-// path.normalize(path)
-// posix version
-exports.normalize = function(path) {
-  var isAbsolute = exports.isAbsolute(path),
-      trailingSlash = substr(path, -1) === '/';
+    if (u) { while (u.left) { u = u.left; } }
+    return u;
+  };
 
-  // Normalize the path
-  path = normalizeArray(filter(path.split('/'), function(p) {
-    return !!p;
-  }), !isAbsolute).join('/');
 
-  if (!path && !isAbsolute) {
-    path = '.';
-  }
-  if (path && trailingSlash) {
-    path += '/';
-  }
+  SplayTree.prototype.maxNode = function maxNode (u) {
+      if ( u === void 0 ) u = this._root;
 
-  return (isAbsolute ? '/' : '') + path;
-};
+    if (u) { while (u.right) { u = u.right; } }
+    return u;
+  };
 
-// posix version
-exports.isAbsolute = function(path) {
-  return path.charAt(0) === '/';
-};
 
-// posix version
-exports.join = function() {
-  var paths = Array.prototype.slice.call(arguments, 0);
-  return exports.normalize(filter(paths, function(p, index) {
-    if (typeof p !== 'string') {
-      throw new TypeError('Arguments to path.join must be strings');
+  SplayTree.prototype.insert = function insert (key, data) {
+    var z = this._root;
+    var p = null;
+    var comp = this._compare;
+    var cmp;
+
+    if (this._noDuplicates) {
+      while (z) {
+        p = z;
+        cmp = comp(z.key, key);
+        if (cmp === 0) { return; }
+        else if (comp(z.key, key) < 0) { z = z.right; }
+        else { z = z.left; }
+      }
+    } else {
+      while (z) {
+        p = z;
+        if (comp(z.key, key) < 0) { z = z.right; }
+        else { z = z.left; }
+      }
     }
-    return p;
-  }).join('/'));
-};
 
+    z = { key: key, data: data, left: null, right: null, parent: p };
 
-// path.relative(from, to)
-// posix version
-exports.relative = function(from, to) {
-  from = exports.resolve(from).substr(1);
-  to = exports.resolve(to).substr(1);
+    if (!p)                        { this._root = z; }
+    else if (comp(p.key, z.key) < 0) { p.right = z; }
+    else                           { p.left= z; }
 
-  function trim(arr) {
-    var start = 0;
-    for (; start < arr.length; start++) {
-      if (arr[start] !== '') break;
+    this.splay(z);
+    this._size++;
+    return z;
+  };
+
+
+  SplayTree.prototype.find = function find (key) {
+    var z  = this._root;
+    var comp = this._compare;
+    while (z) {
+      var cmp = comp(z.key, key);
+      if    (cmp < 0) { z = z.right; }
+      else if (cmp > 0) { z = z.left; }
+      else            { return z; }
     }
+    return null;
+  };
 
-    var end = arr.length - 1;
-    for (; end >= 0; end--) {
-      if (arr[end] !== '') break;
+  /**
+   * Whether the tree contains a node with the given key
+   * @param{Key} key
+   * @return {boolean} true/false
+   */
+  SplayTree.prototype.contains = function contains (key) {
+    var node     = this._root;
+    var comparator = this._compare;
+    while (node){
+      var cmp = comparator(key, node.key);
+      if    (cmp === 0) { return true; }
+      else if (cmp < 0) { node = node.left; }
+      else              { node = node.right; }
     }
 
-    if (start > end) return [];
-    return arr.slice(start, end - start + 1);
-  }
+    return false;
+  };
 
-  var fromParts = trim(from.split('/'));
-  var toParts = trim(to.split('/'));
 
-  var length = Math.min(fromParts.length, toParts.length);
-  var samePartsLength = length;
-  for (var i = 0; i < length; i++) {
-    if (fromParts[i] !== toParts[i]) {
-      samePartsLength = i;
-      break;
-    }
-  }
+  SplayTree.prototype.remove = function remove (key) {
+    var z = this.find(key);
 
-  var outputParts = [];
-  for (var i = samePartsLength; i < fromParts.length; i++) {
-    outputParts.push('..');
-  }
+    if (!z) { return false; }
 
-  outputParts = outputParts.concat(toParts.slice(samePartsLength));
+    this.splay(z);
 
-  return outputParts.join('/');
-};
+    if (!z.left) { this.replace(z, z.right); }
+    else if (!z.right) { this.replace(z, z.left); }
+    else {
+      var y = this.minNode(z.right);
+      if (y.parent !== z) {
+        this.replace(y, y.right);
+        y.right = z.right;
+        y.right.parent = y;
+      }
+      this.replace(z, y);
+      y.left = z.left;
+      y.left.parent = y;
+    }
 
-exports.sep = '/';
-exports.delimiter = ':';
+    this._size--;
+    return true;
+  };
 
-exports.dirname = function(path) {
-  var result = splitPath(path),
-      root = result[0],
-      dir = result[1];
 
-  if (!root && !dir) {
-    // No dirname whatsoever
-    return '.';
-  }
+  SplayTree.prototype.removeNode = function removeNode (z) {
+    if (!z) { return false; }
 
-  if (dir) {
-    // It has a dirname, strip trailing slash
-    dir = dir.substr(0, dir.length - 1);
-  }
+    this.splay(z);
 
-  return root + dir;
-};
+    if (!z.left) { this.replace(z, z.right); }
+    else if (!z.right) { this.replace(z, z.left); }
+    else {
+      var y = this.minNode(z.right);
+      if (y.parent !== z) {
+        this.replace(y, y.right);
+        y.right = z.right;
+        y.right.parent = y;
+      }
+      this.replace(z, y);
+      y.left = z.left;
+      y.left.parent = y;
+    }
 
+    this._size--;
+    return true;
+  };
 
-exports.basename = function(path, ext) {
-  var f = splitPath(path)[2];
-  // TODO: make this comparison case-insensitive on windows?
-  if (ext && f.substr(-1 * ext.length) === ext) {
-    f = f.substr(0, f.length - ext.length);
-  }
-  return f;
-};
 
+  SplayTree.prototype.erase = function erase (key) {
+    var z = this.find(key);
+    if (!z) { return; }
 
-exports.extname = function(path) {
-  return splitPath(path)[3];
-};
+    this.splay(z);
 
-function filter (xs, f) {
-    if (xs.filter) return xs.filter(f);
-    var res = [];
-    for (var i = 0; i < xs.length; i++) {
-        if (f(xs[i], i, xs)) res.push(xs[i]);
-    }
-    return res;
-}
+    var s = z.left;
+    var t = z.right;
 
-// String.prototype.substr - negative index don't work in IE8
-var substr = 'ab'.substr(-1) === 'b'
-    ? function (str, start, len) { return str.substr(start, len) }
-    : function (str, start, len) {
-        if (start < 0) start = str.length + start;
-        return str.substr(start, len);
+    var sMax = null;
+    if (s) {
+      s.parent = null;
+      sMax = this.maxNode(s);
+      this.splay(sMax);
+      this._root = sMax;
+    }
+    if (t) {
+      if (s) { sMax.right = t; }
+      else { this._root = t; }
+      t.parent = sMax;
     }
-;
 
-}).call(this,require('_process'))
+    this._size--;
+  };
 
-},{"_process":6}],23:[function(require,module,exports){
-'use strict';
+  /**
+   * Removes and returns the node with smallest key
+   * @return {?Node}
+   */
+  SplayTree.prototype.pop = function pop () {
+    var node = this._root, returnValue = null;
+    if (node) {
+      while (node.left) { node = node.left; }
+      returnValue = { key: node.key, data: node.data };
+      this.remove(node.key);
+    }
+    return returnValue;
+  };
 
-module.exports = Pbf;
 
-var ieee754 = require('ieee754');
+  /* eslint-disable class-methods-use-this */
 
-function Pbf(buf) {
-    this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
-    this.pos = 0;
-    this.type = 0;
-    this.length = this.buf.length;
-}
+  /**
+   * Successor node
+   * @param{Node} node
+   * @return {?Node}
+   */
+  SplayTree.prototype.next = function next (node) {
+    var successor = node;
+    if (successor) {
+      if (successor.right) {
+        successor = successor.right;
+        while (successor && successor.left) { successor = successor.left; }
+      } else {
+        successor = node.parent;
+        while (successor && successor.right === node) {
+          node = successor; successor = successor.parent;
+        }
+      }
+    }
+    return successor;
+  };
 
-Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
-Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
-Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
-Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
 
-var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
-    SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
+  /**
+   * Predecessor node
+   * @param{Node} node
+   * @return {?Node}
+   */
+  SplayTree.prototype.prev = function prev (node) {
+    var predecessor = node;
+    if (predecessor) {
+      if (predecessor.left) {
+        predecessor = predecessor.left;
+        while (predecessor && predecessor.right) { predecessor = predecessor.right; }
+      } else {
+        predecessor = node.parent;
+        while (predecessor && predecessor.left === node) {
+          node = predecessor;
+          predecessor = predecessor.parent;
+        }
+      }
+    }
+    return predecessor;
+  };
+  /* eslint-enable class-methods-use-this */
 
-Pbf.prototype = {
 
-    destroy: function() {
-        this.buf = null;
-    },
+  /**
+   * @param{forEachCallback} callback
+   * @return {SplayTree}
+   */
+  SplayTree.prototype.forEach = function forEach (callback) {
+    var current = this._root;
+    var s = [], done = false, i = 0;
+
+    while (!done) {
+      // Reach the left most Node of the current Node
+      if (current) {
+        // Place pointer to a tree node on the stack
+        // before traversing the node's left subtree
+        s.push(current);
+        current = current.left;
+      } else {
+        // BackTrack from the empty subtree and visit the Node
+        // at the top of the stack; however, if the stack is
+        // empty you are done
+        if (s.length > 0) {
+          current = s.pop();
+          callback(current, i++);
+
+          // We have visited the node and its left
+          // subtree. Now, it's right subtree's turn
+          current = current.right;
+        } else { done = true; }
+      }
+    }
+    return this;
+  };
 
-    // === READING =================================================================
 
-    readFields: function(readField, result, end) {
-        end = end || this.length;
+  /**
+   * Walk key range from `low` to `high`. Stops if `fn` returns a value.
+   * @param{Key}    low
+   * @param{Key}    high
+   * @param{Function} fn
+   * @param{*?}     ctx
+   * @return {SplayTree}
+   */
+  SplayTree.prototype.range = function range (low, high, fn, ctx) {
+    var Q = [];
+    var compare = this._compare;
+    var node = this._root, cmp;
+
+    while (Q.length !== 0 || node) {
+      if (node) {
+        Q.push(node);
+        node = node.left;
+      } else {
+        node = Q.pop();
+        cmp = compare(node.key, high);
+        if (cmp > 0) {
+          break;
+        } else if (compare(node.key, low) >= 0) {
+          if (fn.call(ctx, node)) { return this; } // stop if smth is returned
+        }
+        node = node.right;
+      }
+    }
+    return this;
+  };
 
-        while (this.pos < end) {
-            var val = this.readVarint(),
-                tag = val >> 3,
-                startPos = this.pos;
+  /**
+   * Returns all keys in order
+   * @return {Array<Key>}
+   */
+  SplayTree.prototype.keys = function keys () {
+    var current = this._root;
+    var s = [], r = [], done = false;
+
+    while (!done) {
+      if (current) {
+        s.push(current);
+        current = current.left;
+      } else {
+        if (s.length > 0) {
+          current = s.pop();
+          r.push(current.key);
+          current = current.right;
+        } else { done = true; }
+      }
+    }
+    return r;
+  };
 
-            this.type = val & 0x7;
-            readField(tag, result, this);
 
-            if (this.pos === startPos) this.skip(val);
-        }
-        return result;
-    },
+  /**
+   * Returns `data` fields of all nodes in order.
+   * @return {Array<Value>}
+   */
+  SplayTree.prototype.values = function values () {
+    var current = this._root;
+    var s = [], r = [], done = false;
+
+    while (!done) {
+      if (current) {
+        s.push(current);
+        current = current.left;
+      } else {
+        if (s.length > 0) {
+          current = s.pop();
+          r.push(current.data);
+          current = current.right;
+        } else { done = true; }
+      }
+    }
+    return r;
+  };
 
-    readMessage: function(readField, result) {
-        return this.readFields(readField, result, this.readVarint() + this.pos);
-    },
 
-    readFixed32: function() {
-        var val = readUInt32(this.buf, this.pos);
-        this.pos += 4;
-        return val;
-    },
+  /**
+   * Returns node at given index
+   * @param{number} index
+   * @return {?Node}
+   */
+  SplayTree.prototype.at = function at (index) {
+    // removed after a consideration, more misleading than useful
+    // index = index % this.size;
+    // if (index < 0) index = this.size - index;
+
+    var current = this._root;
+    var s = [], done = false, i = 0;
+
+    while (!done) {
+      if (current) {
+        s.push(current);
+        current = current.left;
+      } else {
+        if (s.length > 0) {
+          current = s.pop();
+          if (i === index) { return current; }
+          i++;
+          current = current.right;
+        } else { done = true; }
+      }
+    }
+    return null;
+  };
 
-    readSFixed32: function() {
-        var val = readInt32(this.buf, this.pos);
-        this.pos += 4;
-        return val;
-    },
+  /**
+   * Bulk-load items. Both array have to be same size
+   * @param{Array<Key>}  keys
+   * @param{Array<Value>}[values]
+   * @param{Boolean}     [presort=false] Pre-sort keys and values, using
+   *                                       tree's comparator. Sorting is done
+   *                                       in-place
+   * @return {AVLTree}
+   */
+  SplayTree.prototype.load = function load (keys, values, presort) {
+      if ( keys === void 0 ) keys = [];
+      if ( values === void 0 ) values = [];
+      if ( presort === void 0 ) presort = false;
+
+    if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
+    var size = keys.length;
+    if (presort) { sort(keys, values, 0, size - 1, this._compare); }
+    this._root = loadRecursive(null, keys, values, 0, size);
+    this._size = size;
+    return this;
+  };
 
-    // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
 
-    readFixed64: function() {
-        var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
-        this.pos += 8;
-        return val;
-    },
+  SplayTree.prototype.min = function min () {
+    var node = this.minNode(this._root);
+    if (node) { return node.key; }
+    else    { return null; }
+  };
 
-    readSFixed64: function() {
-        var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
-        this.pos += 8;
-        return val;
-    },
 
-    readFloat: function() {
-        var val = ieee754.read(this.buf, this.pos, true, 23, 4);
-        this.pos += 4;
-        return val;
-    },
+  SplayTree.prototype.max = function max () {
+    var node = this.maxNode(this._root);
+    if (node) { return node.key; }
+    else    { return null; }
+  };
 
-    readDouble: function() {
-        var val = ieee754.read(this.buf, this.pos, true, 52, 8);
-        this.pos += 8;
-        return val;
-    },
+  SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
+  prototypeAccessors.size.get = function () { return this._size; };
 
-    readVarint: function(isSigned) {
-        var buf = this.buf,
-            val, b;
 
-        b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
-        b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
-        b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
-        b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
-        b = buf[this.pos];   val |= (b & 0x0f) << 28;
+  /**
+   * Create a tree and load it with items
+   * @param{Array<Key>}        keys
+   * @param{Array<Value>?}      [values]
+
+   * @param{Function?}          [comparator]
+   * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
+   *                                             tree's comparator. Sorting is done
+   *                                             in-place
+   * @param{Boolean?}           [noDuplicates=false] Allow duplicates
+   * @return {SplayTree}
+   */
+  SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
+    return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
+  };
 
-        return readVarintRemainder(val, isSigned, this);
-    },
+  Object.defineProperties( SplayTree.prototype, prototypeAccessors );
 
-    readVarint64: function() { // for compatibility with v2.0.1
-        return this.readVarint(true);
-    },
 
-    readSVarint: function() {
-        var num = this.readVarint();
-        return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
-    },
+  function loadRecursive (parent, keys, values, start, end) {
+    var size = end - start;
+    if (size > 0) {
+      var middle = start + Math.floor(size / 2);
+      var key    = keys[middle];
+      var data   = values[middle];
+      var node   = { key: key, data: data, parent: parent };
+      node.left    = loadRecursive(node, keys, values, start, middle);
+      node.right   = loadRecursive(node, keys, values, middle + 1, end);
+      return node;
+    }
+    return null;
+  }
 
-    readBoolean: function() {
-        return Boolean(this.readVarint());
-    },
 
-    readString: function() {
-        var end = this.readVarint() + this.pos,
-            str = readUtf8(this.buf, this.pos, end);
-        this.pos = end;
-        return str;
-    },
+  function sort(keys, values, left, right, compare) {
+    if (left >= right) { return; }
 
-    readBytes: function() {
-        var end = this.readVarint() + this.pos,
-            buffer = this.buf.subarray(this.pos, end);
-        this.pos = end;
-        return buffer;
-    },
+    var pivot = keys[(left + right) >> 1];
+    var i = left - 1;
+    var j = right + 1;
 
-    // verbose for performance reasons; doesn't affect gzipped size
+    while (true) {
+      do { i++; } while (compare(keys[i], pivot) < 0);
+      do { j--; } while (compare(keys[j], pivot) > 0);
+      if (i >= j) { break; }
 
-    readPackedVarint: function(arr, isSigned) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readVarint(isSigned));
-        return arr;
-    },
-    readPackedSVarint: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readSVarint());
-        return arr;
-    },
-    readPackedBoolean: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readBoolean());
-        return arr;
-    },
-    readPackedFloat: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readFloat());
-        return arr;
-    },
-    readPackedDouble: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readDouble());
-        return arr;
-    },
-    readPackedFixed32: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readFixed32());
-        return arr;
-    },
-    readPackedSFixed32: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readSFixed32());
-        return arr;
-    },
-    readPackedFixed64: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readFixed64());
-        return arr;
-    },
-    readPackedSFixed64: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readSFixed64());
-        return arr;
-    },
+      var tmp = keys[i];
+      keys[i] = keys[j];
+      keys[j] = tmp;
 
-    skip: function(val) {
-        var type = val & 0x7;
-        if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
-        else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
-        else if (type === Pbf.Fixed32) this.pos += 4;
-        else if (type === Pbf.Fixed64) this.pos += 8;
-        else throw new Error('Unimplemented type: ' + type);
-    },
+      tmp = values[i];
+      values[i] = values[j];
+      values[j] = tmp;
+    }
 
-    // === WRITING =================================================================
+    sort(keys, values,  left,     j, compare);
+    sort(keys, values, j + 1, right, compare);
+  }
 
-    writeTag: function(tag, type) {
-        this.writeVarint((tag << 3) | type);
-    },
+  var NORMAL               = 0;
+  var NON_CONTRIBUTING     = 1;
+  var SAME_TRANSITION      = 2;
+  var DIFFERENT_TRANSITION = 3;
 
-    realloc: function(min) {
-        var length = this.length || 16;
+  var INTERSECTION = 0;
+  var UNION        = 1;
+  var DIFFERENCE   = 2;
+  var XOR          = 3;
 
-        while (length < this.pos + min) length *= 2;
+  /**
+   * @param  {SweepEvent} event
+   * @param  {SweepEvent} prev
+   * @param  {Operation} operation
+   */
+  function computeFields (event, prev, operation) {
+    // compute inOut and otherInOut fields
+    if (prev === null) {
+      event.inOut      = false;
+      event.otherInOut = true;
 
-        if (length !== this.length) {
-            var buf = new Uint8Array(length);
-            buf.set(this.buf);
-            this.buf = buf;
-            this.length = length;
-        }
-    },
+    // previous line segment in sweepline belongs to the same polygon
+    } else {
+      if (event.isSubject === prev.isSubject) {
+        event.inOut      = !prev.inOut;
+        event.otherInOut = prev.otherInOut;
 
-    finish: function() {
-        this.length = this.pos;
-        this.pos = 0;
-        return this.buf.subarray(0, this.length);
-    },
-
-    writeFixed32: function(val) {
-        this.realloc(4);
-        writeInt32(this.buf, val, this.pos);
-        this.pos += 4;
-    },
-
-    writeSFixed32: function(val) {
-        this.realloc(4);
-        writeInt32(this.buf, val, this.pos);
-        this.pos += 4;
-    },
+      // previous line segment in sweepline belongs to the clipping polygon
+      } else {
+        event.inOut      = !prev.otherInOut;
+        event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
+      }
 
-    writeFixed64: function(val) {
-        this.realloc(8);
-        writeInt32(this.buf, val & -1, this.pos);
-        writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
-        this.pos += 8;
-    },
+      // compute prevInResult field
+      if (prev) {
+        event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
+          ? prev.prevInResult : prev;
+      }
+    }
 
-    writeSFixed64: function(val) {
-        this.realloc(8);
-        writeInt32(this.buf, val & -1, this.pos);
-        writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
-        this.pos += 8;
-    },
+    // check if the line segment belongs to the Boolean operation
+    var isInResult = inResult(event, operation);
+    if (isInResult) {
+      event.resultTransition = determineResultTransition(event, operation);
+    } else {
+      event.resultTransition = 0;
+    }
+  }
 
-    writeVarint: function(val) {
-        val = +val || 0;
 
-        if (val > 0xfffffff || val < 0) {
-            writeBigVarint(val, this);
-            return;
+  /* eslint-disable indent */
+  function inResult(event, operation) {
+    switch (event.type) {
+      case NORMAL:
+        switch (operation) {
+          case INTERSECTION:
+            return !event.otherInOut;
+          case UNION:
+            return event.otherInOut;
+          case DIFFERENCE:
+            // return (event.isSubject && !event.otherInOut) ||
+            //         (!event.isSubject && event.otherInOut);
+            return (event.isSubject && event.otherInOut) ||
+                    (!event.isSubject && !event.otherInOut);
+          case XOR:
+            return true;
+        }
+        break;
+      case SAME_TRANSITION:
+        return operation === INTERSECTION || operation === UNION;
+      case DIFFERENT_TRANSITION:
+        return operation === DIFFERENCE;
+      case NON_CONTRIBUTING:
+        return false;
+    }
+    return false;
+  }
+  /* eslint-enable indent */
+
+
+  function determineResultTransition(event, operation) {
+    var thisIn = !event.inOut;
+    var thatIn = !event.otherInOut;
+
+    var isIn;
+    switch (operation) {
+      case INTERSECTION:
+        isIn = thisIn && thatIn; break;
+      case UNION:
+        isIn = thisIn || thatIn; break;
+      case XOR:
+        isIn = thisIn ^ thatIn; break;
+      case DIFFERENCE:
+        if (event.isSubject) {
+          isIn = thisIn && !thatIn;
+        } else {
+          isIn = thatIn && !thisIn;
         }
+        break;
+    }
+    return isIn ? +1 : -1;
+  }
 
-        this.realloc(4);
+  var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
 
-        this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-        this.buf[this.pos++] =   (val >>> 7) & 0x7f;
-    },
+    /**
+     * Is left endpoint?
+     * @type {Boolean}
+     */
+    this.left = left;
 
-    writeSVarint: function(val) {
-        this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
-    },
+    /**
+     * @type {Array.<Number>}
+     */
+    this.point = point;
 
-    writeBoolean: function(val) {
-        this.writeVarint(Boolean(val));
-    },
+    /**
+     * Other edge reference
+     * @type {SweepEvent}
+     */
+    this.otherEvent = otherEvent;
 
-    writeString: function(str) {
-        str = String(str);
-        this.realloc(str.length * 4);
+    /**
+     * Belongs to source or clipping polygon
+     * @type {Boolean}
+     */
+    this.isSubject = isSubject;
 
-        this.pos++; // reserve 1 byte for short string length
+    /**
+     * Edge contribution type
+     * @type {Number}
+     */
+    this.type = edgeType || NORMAL;
 
-        var startPos = this.pos;
-        // write the string directly to the buffer and see how much was written
-        this.pos = writeUtf8(this.buf, str, this.pos);
-        var len = this.pos - startPos;
 
-        if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
+    /**
+     * In-out transition for the sweepline crossing polygon
+     * @type {Boolean}
+     */
+    this.inOut = false;
 
-        // finally, write the message length in the reserved place and restore the position
-        this.pos = startPos - 1;
-        this.writeVarint(len);
-        this.pos += len;
-    },
 
-    writeFloat: function(val) {
-        this.realloc(4);
-        ieee754.write(this.buf, val, this.pos, true, 23, 4);
-        this.pos += 4;
-    },
+    /**
+     * @type {Boolean}
+     */
+    this.otherInOut = false;
 
-    writeDouble: function(val) {
-        this.realloc(8);
-        ieee754.write(this.buf, val, this.pos, true, 52, 8);
-        this.pos += 8;
-    },
+    /**
+     * Previous event in result?
+     * @type {SweepEvent}
+     */
+    this.prevInResult = null;
 
-    writeBytes: function(buffer) {
-        var len = buffer.length;
-        this.writeVarint(len);
-        this.realloc(len);
-        for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
-    },
+    /**
+     * Type of result transition (0 = not in result, +1 = out-in, -1, in-out)
+     * @type {Number}
+     */
+    this.resultTransition = 0;
 
-    writeRawMessage: function(fn, obj) {
-        this.pos++; // reserve 1 byte for short message length
+    // connection step
 
-        // write the message directly to the buffer and see how much was written
-        var startPos = this.pos;
-        fn(obj, this);
-        var len = this.pos - startPos;
+    /**
+     * @type {Number}
+     */
+    this.otherPos = -1;
 
-        if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
+    /**
+     * @type {Number}
+     */
+    this.outputContourId = -1;
 
-        // finally, write the message length in the reserved place and restore the position
-        this.pos = startPos - 1;
-        this.writeVarint(len);
-        this.pos += len;
-    },
+    this.isExteriorRing = true; // TODO: Looks unused, remove?
+  };
 
-    writeMessage: function(tag, fn, obj) {
-        this.writeTag(tag, Pbf.Bytes);
-        this.writeRawMessage(fn, obj);
-    },
+  var prototypeAccessors$1 = { inResult: { configurable: true } };
 
-    writePackedVarint:   function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr);   },
-    writePackedSVarint:  function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr);  },
-    writePackedBoolean:  function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr);  },
-    writePackedFloat:    function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr);    },
-    writePackedDouble:   function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr);   },
-    writePackedFixed32:  function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr);  },
-    writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },
-    writePackedFixed64:  function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr);  },
-    writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },
 
-    writeBytesField: function(tag, buffer) {
-        this.writeTag(tag, Pbf.Bytes);
-        this.writeBytes(buffer);
-    },
-    writeFixed32Field: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed32);
-        this.writeFixed32(val);
-    },
-    writeSFixed32Field: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed32);
-        this.writeSFixed32(val);
-    },
-    writeFixed64Field: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed64);
-        this.writeFixed64(val);
-    },
-    writeSFixed64Field: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed64);
-        this.writeSFixed64(val);
-    },
-    writeVarintField: function(tag, val) {
-        this.writeTag(tag, Pbf.Varint);
-        this.writeVarint(val);
-    },
-    writeSVarintField: function(tag, val) {
-        this.writeTag(tag, Pbf.Varint);
-        this.writeSVarint(val);
-    },
-    writeStringField: function(tag, str) {
-        this.writeTag(tag, Pbf.Bytes);
-        this.writeString(str);
-    },
-    writeFloatField: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed32);
-        this.writeFloat(val);
-    },
-    writeDoubleField: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed64);
-        this.writeDouble(val);
-    },
-    writeBooleanField: function(tag, val) {
-        this.writeVarintField(tag, Boolean(val));
-    }
-};
+  /**
+   * @param{Array.<Number>}p
+   * @return {Boolean}
+   */
+  SweepEvent.prototype.isBelow = function isBelow (p) {
+    var p0 = this.point, p1 = this.otherEvent.point;
+    return this.left
+      ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
+      // signedArea(this.point, this.otherEvent.point, p) > 0 :
+      : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
+      //signedArea(this.otherEvent.point, this.point, p) > 0;
+  };
 
-function readVarintRemainder(l, s, p) {
-    var buf = p.buf,
-        h, b;
 
-    b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
+  /**
+   * @param{Array.<Number>}p
+   * @return {Boolean}
+   */
+  SweepEvent.prototype.isAbove = function isAbove (p) {
+    return !this.isBelow(p);
+  };
 
-    throw new Error('Expected varint not more than 10 bytes');
-}
 
-function readPackedEnd(pbf) {
-    return pbf.type === Pbf.Bytes ?
-        pbf.readVarint() + pbf.pos : pbf.pos + 1;
-}
+  /**
+   * @return {Boolean}
+   */
+  SweepEvent.prototype.isVertical = function isVertical () {
+    return this.point[0] === this.otherEvent.point[0];
+  };
 
-function toNum(low, high, isSigned) {
-    if (isSigned) {
-        return high * 0x100000000 + (low >>> 0);
-    }
 
-    return ((high >>> 0) * 0x100000000) + (low >>> 0);
-}
+  /**
+   * Does event belong to result?
+   * @return {Boolean}
+   */
+  prototypeAccessors$1.inResult.get = function () {
+    return this.resultTransition !== 0;
+  };
 
-function writeBigVarint(val, pbf) {
-    var low, high;
 
-    if (val >= 0) {
-        low  = (val % 0x100000000) | 0;
-        high = (val / 0x100000000) | 0;
-    } else {
-        low  = ~(-val % 0x100000000);
-        high = ~(-val / 0x100000000);
+  SweepEvent.prototype.clone = function clone () {
+    var copy = new SweepEvent(
+      this.point, this.left, this.otherEvent, this.isSubject, this.type);
 
-        if (low ^ 0xffffffff) {
-            low = (low + 1) | 0;
-        } else {
-            low = 0;
-            high = (high + 1) | 0;
-        }
-    }
+    copy.contourId      = this.contourId;
+    copy.resultTransition = this.resultTransition;
+    copy.prevInResult   = this.prevInResult;
+    copy.isExteriorRing = this.isExteriorRing;
+    copy.inOut          = this.inOut;
+    copy.otherInOut     = this.otherInOut;
 
-    if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
-        throw new Error('Given varint doesn\'t fit into 10 bytes');
-    }
+    return copy;
+  };
 
-    pbf.realloc(10);
+  Object.defineProperties( SweepEvent.prototype, prototypeAccessors$1 );
 
-    writeBigVarintLow(low, high, pbf);
-    writeBigVarintHigh(high, pbf);
-}
+  function equals(p1, p2) {
+    if (p1[0] === p2[0]) {
+      if (p1[1] === p2[1]) {
+        return true;
+      } else {
+        return false;
+      }
+    }
+    return false;
+  }
 
-function writeBigVarintLow(low, high, pbf) {
-    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-    pbf.buf[pbf.pos]   = low & 0x7f;
-}
+  // const EPSILON = 1e-9;
+  // const abs = Math.abs;
+  // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
+  // Precision problem.
+  //
+  // module.exports = function equals(p1, p2) {
+  //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
+  // };
+
+  var epsilon = 1.1102230246251565e-16;
+  var splitter = 134217729;
+  var resulterrbound = (3 + 8 * epsilon) * epsilon;
+
+  // fast_expansion_sum_zeroelim routine from oritinal code
+  function sum(elen, e, flen, f, h) {
+      var Q, Qnew, hh, bvirt;
+      var enow = e[0];
+      var fnow = f[0];
+      var eindex = 0;
+      var findex = 0;
+      if ((fnow > enow) === (fnow > -enow)) {
+          Q = enow;
+          enow = e[++eindex];
+      } else {
+          Q = fnow;
+          fnow = f[++findex];
+      }
+      var hindex = 0;
+      if (eindex < elen && findex < flen) {
+          if ((fnow > enow) === (fnow > -enow)) {
+              Qnew = enow + Q;
+              hh = Q - (Qnew - enow);
+              enow = e[++eindex];
+          } else {
+              Qnew = fnow + Q;
+              hh = Q - (Qnew - fnow);
+              fnow = f[++findex];
+          }
+          Q = Qnew;
+          if (hh !== 0) {
+              h[hindex++] = hh;
+          }
+          while (eindex < elen && findex < flen) {
+              if ((fnow > enow) === (fnow > -enow)) {
+                  Qnew = Q + enow;
+                  bvirt = Qnew - Q;
+                  hh = Q - (Qnew - bvirt) + (enow - bvirt);
+                  enow = e[++eindex];
+              } else {
+                  Qnew = Q + fnow;
+                  bvirt = Qnew - Q;
+                  hh = Q - (Qnew - bvirt) + (fnow - bvirt);
+                  fnow = f[++findex];
+              }
+              Q = Qnew;
+              if (hh !== 0) {
+                  h[hindex++] = hh;
+              }
+          }
+      }
+      while (eindex < elen) {
+          Qnew = Q + enow;
+          bvirt = Qnew - Q;
+          hh = Q - (Qnew - bvirt) + (enow - bvirt);
+          enow = e[++eindex];
+          Q = Qnew;
+          if (hh !== 0) {
+              h[hindex++] = hh;
+          }
+      }
+      while (findex < flen) {
+          Qnew = Q + fnow;
+          bvirt = Qnew - Q;
+          hh = Q - (Qnew - bvirt) + (fnow - bvirt);
+          fnow = f[++findex];
+          Q = Qnew;
+          if (hh !== 0) {
+              h[hindex++] = hh;
+          }
+      }
+      if (Q !== 0 || hindex === 0) {
+          h[hindex++] = Q;
+      }
+      return hindex;
+  }
 
-function writeBigVarintHigh(high, pbf) {
-    var lsb = (high & 0x07) << 4;
+  function estimate(elen, e) {
+      var Q = e[0];
+      for (var i = 1; i < elen; i++) { Q += e[i]; }
+      return Q;
+  }
 
-    pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f;
-}
+  function vec(n) {
+      return new Float64Array(n);
+  }
 
-function makeRoomForExtraLength(startPos, len, pbf) {
-    var extraLen =
-        len <= 0x3fff ? 1 :
-        len <= 0x1fffff ? 2 :
-        len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7));
+  var ccwerrboundA = (3 + 16 * epsilon) * epsilon;
+  var ccwerrboundB = (2 + 12 * epsilon) * epsilon;
+  var ccwerrboundC = (9 + 64 * epsilon) * epsilon * epsilon;
+
+  var B = vec(4);
+  var C1 = vec(8);
+  var C2 = vec(12);
+  var D = vec(16);
+  var u = vec(4);
+
+  function orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {
+      var acxtail, acytail, bcxtail, bcytail;
+      var bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;
+
+      var acx = ax - cx;
+      var bcx = bx - cx;
+      var acy = ay - cy;
+      var bcy = by - cy;
+
+      s1 = acx * bcy;
+      c = splitter * acx;
+      ahi = c - (c - acx);
+      alo = acx - ahi;
+      c = splitter * bcy;
+      bhi = c - (c - bcy);
+      blo = bcy - bhi;
+      s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
+      t1 = acy * bcx;
+      c = splitter * acy;
+      ahi = c - (c - acy);
+      alo = acy - ahi;
+      c = splitter * bcx;
+      bhi = c - (c - bcx);
+      blo = bcx - bhi;
+      t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
+      _i = s0 - t0;
+      bvirt = s0 - _i;
+      B[0] = s0 - (_i + bvirt) + (bvirt - t0);
+      _j = s1 + _i;
+      bvirt = _j - s1;
+      _0 = s1 - (_j - bvirt) + (_i - bvirt);
+      _i = _0 - t1;
+      bvirt = _0 - _i;
+      B[1] = _0 - (_i + bvirt) + (bvirt - t1);
+      u3 = _j + _i;
+      bvirt = u3 - _j;
+      B[2] = _j - (u3 - bvirt) + (_i - bvirt);
+      B[3] = u3;
+
+      var det = estimate(4, B);
+      var errbound = ccwerrboundB * detsum;
+      if (det >= errbound || -det >= errbound) {
+          return det;
+      }
 
-    // if 1 byte isn't enough for encoding message length, shift the data to the right
-    pbf.realloc(extraLen);
-    for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
-}
+      bvirt = ax - acx;
+      acxtail = ax - (acx + bvirt) + (bvirt - cx);
+      bvirt = bx - bcx;
+      bcxtail = bx - (bcx + bvirt) + (bvirt - cx);
+      bvirt = ay - acy;
+      acytail = ay - (acy + bvirt) + (bvirt - cy);
+      bvirt = by - bcy;
+      bcytail = by - (bcy + bvirt) + (bvirt - cy);
+
+      if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) {
+          return det;
+      }
 
-function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
-function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
-function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
-function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
-function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
-function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
-function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
-function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
-function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
+      errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);
+      det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail);
+      if (det >= errbound || -det >= errbound) { return det; }
+
+      s1 = acxtail * bcy;
+      c = splitter * acxtail;
+      ahi = c - (c - acxtail);
+      alo = acxtail - ahi;
+      c = splitter * bcy;
+      bhi = c - (c - bcy);
+      blo = bcy - bhi;
+      s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
+      t1 = acytail * bcx;
+      c = splitter * acytail;
+      ahi = c - (c - acytail);
+      alo = acytail - ahi;
+      c = splitter * bcx;
+      bhi = c - (c - bcx);
+      blo = bcx - bhi;
+      t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
+      _i = s0 - t0;
+      bvirt = s0 - _i;
+      u[0] = s0 - (_i + bvirt) + (bvirt - t0);
+      _j = s1 + _i;
+      bvirt = _j - s1;
+      _0 = s1 - (_j - bvirt) + (_i - bvirt);
+      _i = _0 - t1;
+      bvirt = _0 - _i;
+      u[1] = _0 - (_i + bvirt) + (bvirt - t1);
+      u3 = _j + _i;
+      bvirt = u3 - _j;
+      u[2] = _j - (u3 - bvirt) + (_i - bvirt);
+      u[3] = u3;
+      var C1len = sum(4, B, 4, u, C1);
+
+      s1 = acx * bcytail;
+      c = splitter * acx;
+      ahi = c - (c - acx);
+      alo = acx - ahi;
+      c = splitter * bcytail;
+      bhi = c - (c - bcytail);
+      blo = bcytail - bhi;
+      s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
+      t1 = acy * bcxtail;
+      c = splitter * acy;
+      ahi = c - (c - acy);
+      alo = acy - ahi;
+      c = splitter * bcxtail;
+      bhi = c - (c - bcxtail);
+      blo = bcxtail - bhi;
+      t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
+      _i = s0 - t0;
+      bvirt = s0 - _i;
+      u[0] = s0 - (_i + bvirt) + (bvirt - t0);
+      _j = s1 + _i;
+      bvirt = _j - s1;
+      _0 = s1 - (_j - bvirt) + (_i - bvirt);
+      _i = _0 - t1;
+      bvirt = _0 - _i;
+      u[1] = _0 - (_i + bvirt) + (bvirt - t1);
+      u3 = _j + _i;
+      bvirt = u3 - _j;
+      u[2] = _j - (u3 - bvirt) + (_i - bvirt);
+      u[3] = u3;
+      var C2len = sum(C1len, C1, 4, u, C2);
+
+      s1 = acxtail * bcytail;
+      c = splitter * acxtail;
+      ahi = c - (c - acxtail);
+      alo = acxtail - ahi;
+      c = splitter * bcytail;
+      bhi = c - (c - bcytail);
+      blo = bcytail - bhi;
+      s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
+      t1 = acytail * bcxtail;
+      c = splitter * acytail;
+      ahi = c - (c - acytail);
+      alo = acytail - ahi;
+      c = splitter * bcxtail;
+      bhi = c - (c - bcxtail);
+      blo = bcxtail - bhi;
+      t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
+      _i = s0 - t0;
+      bvirt = s0 - _i;
+      u[0] = s0 - (_i + bvirt) + (bvirt - t0);
+      _j = s1 + _i;
+      bvirt = _j - s1;
+      _0 = s1 - (_j - bvirt) + (_i - bvirt);
+      _i = _0 - t1;
+      bvirt = _0 - _i;
+      u[1] = _0 - (_i + bvirt) + (bvirt - t1);
+      u3 = _j + _i;
+      bvirt = u3 - _j;
+      u[2] = _j - (u3 - bvirt) + (_i - bvirt);
+      u[3] = u3;
+      var Dlen = sum(C2len, C2, 4, u, D);
+
+      return D[Dlen - 1];
+  }
 
-// Buffer code below from https://github.com/feross/buffer, MIT-licensed
+  function orient2d(ax, ay, bx, by, cx, cy) {
+      var detleft = (ay - cy) * (bx - cx);
+      var detright = (ax - cx) * (by - cy);
+      var det = detleft - detright;
 
-function readUInt32(buf, pos) {
-    return ((buf[pos]) |
-        (buf[pos + 1] << 8) |
-        (buf[pos + 2] << 16)) +
-        (buf[pos + 3] * 0x1000000);
-}
+      if (detleft === 0 || detright === 0 || (detleft > 0) !== (detright > 0)) { return det; }
 
-function writeInt32(buf, val, pos) {
-    buf[pos] = val;
-    buf[pos + 1] = (val >>> 8);
-    buf[pos + 2] = (val >>> 16);
-    buf[pos + 3] = (val >>> 24);
-}
+      var detsum = Math.abs(detleft + detright);
+      if (Math.abs(det) >= ccwerrboundA * detsum) { return det; }
 
-function readInt32(buf, pos) {
-    return ((buf[pos]) |
-        (buf[pos + 1] << 8) |
-        (buf[pos + 2] << 16)) +
-        (buf[pos + 3] << 24);
-}
+      return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);
+  }
 
-function readUtf8(buf, pos, end) {
-    var str = '';
-    var i = pos;
+  /**
+   * Signed area of the triangle (p0, p1, p2)
+   * @param  {Array.<Number>} p0
+   * @param  {Array.<Number>} p1
+   * @param  {Array.<Number>} p2
+   * @return {Number}
+   */
+  function signedArea(p0, p1, p2) {
+    var res = orient2d(p0[0], p0[1], p1[0], p1[1], p2[0], p2[1]);
+    if (res > 0) { return -1; }
+    if (res < 0) { return 1; }
+    return 0;
+  }
 
-    while (i < end) {
-        var b0 = buf[i];
-        var c = null; // codepoint
-        var bytesPerSequence =
-            b0 > 0xEF ? 4 :
-            b0 > 0xDF ? 3 :
-            b0 > 0xBF ? 2 : 1;
+  /**
+   * @param  {SweepEvent} e1
+   * @param  {SweepEvent} e2
+   * @return {Number}
+   */
+  function compareEvents(e1, e2) {
+    var p1 = e1.point;
+    var p2 = e2.point;
 
-        if (i + bytesPerSequence > end) break;
+    // Different x-coordinate
+    if (p1[0] > p2[0]) { return 1; }
+    if (p1[0] < p2[0]) { return -1; }
 
-        var b1, b2, b3;
+    // Different points, but same x-coordinate
+    // Event with lower y-coordinate is processed first
+    if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
 
-        if (bytesPerSequence === 1) {
-            if (b0 < 0x80) {
-                c = b0;
-            }
-        } else if (bytesPerSequence === 2) {
-            b1 = buf[i + 1];
-            if ((b1 & 0xC0) === 0x80) {
-                c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
-                if (c <= 0x7F) {
-                    c = null;
-                }
-            }
-        } else if (bytesPerSequence === 3) {
-            b1 = buf[i + 1];
-            b2 = buf[i + 2];
-            if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
-                c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
-                if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
-                    c = null;
-                }
-            }
-        } else if (bytesPerSequence === 4) {
-            b1 = buf[i + 1];
-            b2 = buf[i + 2];
-            b3 = buf[i + 3];
-            if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
-                c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
-                if (c <= 0xFFFF || c >= 0x110000) {
-                    c = null;
-                }
-            }
-        }
+    return specialCases(e1, e2, p1);
+  }
 
-        if (c === null) {
-            c = 0xFFFD;
-            bytesPerSequence = 1;
 
-        } else if (c > 0xFFFF) {
-            c -= 0x10000;
-            str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
-            c = 0xDC00 | c & 0x3FF;
-        }
+  /* eslint-disable no-unused-vars */
+  function specialCases(e1, e2, p1, p2) {
+    // Same coordinates, but one is a left endpoint and the other is
+    // a right endpoint. The right endpoint is processed first
+    if (e1.left !== e2.left)
+      { return e1.left ? 1 : -1; }
 
-        str += String.fromCharCode(c);
-        i += bytesPerSequence;
+    // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
+    // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
+    // Same coordinates, both events
+    // are left endpoints or right endpoints.
+    // not collinear
+    if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
+      // the event associate to the bottom segment is processed first
+      return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
     }
 
-    return str;
-}
+    return (!e1.isSubject && e2.isSubject) ? 1 : -1;
+  }
+  /* eslint-enable no-unused-vars */
 
-function writeUtf8(buf, str, pos) {
-    for (var i = 0, c, lead; i < str.length; i++) {
-        c = str.charCodeAt(i); // code point
+  /**
+   * @param  {SweepEvent} se
+   * @param  {Array.<Number>} p
+   * @param  {Queue} queue
+   * @return {Queue}
+   */
+  function divideSegment(se, p, queue)  {
+    var r = new SweepEvent(p, false, se,            se.isSubject);
+    var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
 
-        if (c > 0xD7FF && c < 0xE000) {
-            if (lead) {
-                if (c < 0xDC00) {
-                    buf[pos++] = 0xEF;
-                    buf[pos++] = 0xBF;
-                    buf[pos++] = 0xBD;
-                    lead = c;
-                    continue;
-                } else {
-                    c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
-                    lead = null;
-                }
-            } else {
-                if (c > 0xDBFF || (i + 1 === str.length)) {
-                    buf[pos++] = 0xEF;
-                    buf[pos++] = 0xBF;
-                    buf[pos++] = 0xBD;
-                } else {
-                    lead = c;
-                }
-                continue;
-            }
-        } else if (lead) {
-            buf[pos++] = 0xEF;
-            buf[pos++] = 0xBF;
-            buf[pos++] = 0xBD;
-            lead = null;
-        }
+    /* eslint-disable no-console */
+    if (equals(se.point, se.otherEvent.point)) {
+      console.warn('what is that, a collapsed segment?', se);
+    }
+    /* eslint-enable no-console */
 
-        if (c < 0x80) {
-            buf[pos++] = c;
-        } else {
-            if (c < 0x800) {
-                buf[pos++] = c >> 0x6 | 0xC0;
-            } else {
-                if (c < 0x10000) {
-                    buf[pos++] = c >> 0xC | 0xE0;
-                } else {
-                    buf[pos++] = c >> 0x12 | 0xF0;
-                    buf[pos++] = c >> 0xC & 0x3F | 0x80;
-                }
-                buf[pos++] = c >> 0x6 & 0x3F | 0x80;
-            }
-            buf[pos++] = c & 0x3F | 0x80;
-        }
+    r.contourId = l.contourId = se.contourId;
+
+    // avoid a rounding error. The left event would be processed after the right event
+    if (compareEvents(l, se.otherEvent) > 0) {
+      se.otherEvent.left = true;
+      l.left = false;
     }
-    return pos;
-}
 
-},{"ieee754":17}],24:[function(require,module,exports){
-'use strict';
+    // avoid a rounding error. The left event would be processed after the right event
+    // if (compareEvents(se, r) > 0) {}
 
-module.exports = partialSort;
+    se.otherEvent.otherEvent = l;
+    se.otherEvent = r;
 
-// Floyd-Rivest selection algorithm:
-// Rearrange items so that all items in the [left, k] range are smaller than all items in (k, right];
-// The k-th element will have the (k - left + 1)th smallest value in [left, right]
+    queue.push(l);
+    queue.push(r);
 
-function partialSort(arr, k, left, right, compare) {
-    left = left || 0;
-    right = right || (arr.length - 1);
-    compare = compare || defaultCompare;
+    return queue;
+  }
 
-    while (right > left) {
-        if (right - left > 600) {
-            var n = right - left + 1;
-            var m = k - left + 1;
-            var z = Math.log(n);
-            var s = 0.5 * Math.exp(2 * z / 3);
-            var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
-            var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
-            var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
-            partialSort(arr, k, newLeft, newRight, compare);
-        }
+  //const EPS = 1e-9;
 
-        var t = arr[k];
-        var i = left;
-        var j = right;
+  /**
+   * Finds the magnitude of the cross product of two vectors (if we pretend
+   * they're in three dimensions)
+   *
+   * @param {Object} a First vector
+   * @param {Object} b Second vector
+   * @private
+   * @returns {Number} The magnitude of the cross product
+   */
+  function crossProduct(a, b) {
+    return (a[0] * b[1]) - (a[1] * b[0]);
+  }
 
-        swap(arr, left, k);
-        if (compare(arr[right], t) > 0) swap(arr, left, right);
+  /**
+   * Finds the dot product of two vectors.
+   *
+   * @param {Object} a First vector
+   * @param {Object} b Second vector
+   * @private
+   * @returns {Number} The dot product
+   */
+  function dotProduct(a, b) {
+    return (a[0] * b[0]) + (a[1] * b[1]);
+  }
 
-        while (i < j) {
-            swap(arr, i, j);
-            i++;
-            j--;
-            while (compare(arr[i], t) < 0) i++;
-            while (compare(arr[j], t) > 0) j--;
-        }
+  /**
+   * Finds the intersection (if any) between two line segments a and b, given the
+   * line segments' end points a1, a2 and b1, b2.
+   *
+   * This algorithm is based on Schneider and Eberly.
+   * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
+   * Page 244.
+   *
+   * @param {Array.<Number>} a1 point of first line
+   * @param {Array.<Number>} a2 point of first line
+   * @param {Array.<Number>} b1 point of second line
+   * @param {Array.<Number>} b2 point of second line
+   * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
+   *                                         (meaning connected segments) as
+   *                                         intersections
+   * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
+   * intersection. If they overlap, the two end points of the overlapping segment.
+   * Otherwise, null.
+   */
+  function intersection (a1, a2, b1, b2, noEndpointTouch) {
+    // The algorithm expects our lines in the form P + sd, where P is a point,
+    // s is on the interval [0, 1], and d is a vector.
+    // We are passed two points. P can be the first point of each pair. The
+    // vector, then, could be thought of as the distance (in x and y components)
+    // from the first point to the second point.
+    // So first, let's make our vectors:
+    var va = [a2[0] - a1[0], a2[1] - a1[1]];
+    var vb = [b2[0] - b1[0], b2[1] - b1[1]];
+    // We also define a function to convert back to regular point form:
+
+    /* eslint-disable arrow-body-style */
+
+    function toPoint(p, s, d) {
+      return [
+        p[0] + s * d[0],
+        p[1] + s * d[1]
+      ];
+    }
+
+    /* eslint-enable arrow-body-style */
+
+    // The rest is pretty much a straight port of the algorithm.
+    var e = [b1[0] - a1[0], b1[1] - a1[1]];
+    var kross    = crossProduct(va, vb);
+    var sqrKross = kross * kross;
+    var sqrLenA  = dotProduct(va, va);
+    //const sqrLenB  = dotProduct(vb, vb);
+
+    // Check for line intersection. This works because of the properties of the
+    // cross product -- specifically, two vectors are parallel if and only if the
+    // cross product is the 0 vector. The full calculation involves relative error
+    // to account for possible very small line segments. See Schneider & Eberly
+    // for details.
+    if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
+      // If they're not parallel, then (because these are line segments) they
+      // still might not actually intersect. This code checks that the
+      // intersection point of the lines is actually on both line segments.
+      var s = crossProduct(e, vb) / kross;
+      if (s < 0 || s > 1) {
+        // not on line segment a
+        return null;
+      }
+      var t = crossProduct(e, va) / kross;
+      if (t < 0 || t > 1) {
+        // not on line segment b
+        return null;
+      }
+      if (s === 0 || s === 1) {
+        // on an endpoint of line segment a
+        return noEndpointTouch ? null : [toPoint(a1, s, va)];
+      }
+      if (t === 0 || t === 1) {
+        // on an endpoint of line segment b
+        return noEndpointTouch ? null : [toPoint(b1, t, vb)];
+      }
+      return [toPoint(a1, s, va)];
+    }
 
-        if (compare(arr[left], t) === 0) swap(arr, left, j);
-        else {
-            j++;
-            swap(arr, j, right);
-        }
+    // If we've reached this point, then the lines are either parallel or the
+    // same, but the segments could overlap partially or fully, or not at all.
+    // So we need to find the overlap, if any. To do that, we can use e, which is
+    // the (vector) difference between the two initial points. If this is parallel
+    // with the line itself, then the two lines are the same line, and there will
+    // be overlap.
+    //const sqrLenE = dotProduct(e, e);
+    kross = crossProduct(e, va);
+    sqrKross = kross * kross;
 
-        if (j <= k) left = j + 1;
-        if (k <= j) right = j - 1;
+    if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
+    // Lines are just parallel, not the same. No overlap.
+      return null;
     }
-}
 
-function swap(arr, i, j) {
-    var tmp = arr[i];
-    arr[i] = arr[j];
-    arr[j] = tmp;
-}
+    var sa = dotProduct(va, e) / sqrLenA;
+    var sb = sa + dotProduct(va, vb) / sqrLenA;
+    var smin = Math.min(sa, sb);
+    var smax = Math.max(sa, sb);
 
-function defaultCompare(a, b) {
-    return a < b ? -1 : a > b ? 1 : 0;
-}
+    // this is, essentially, the FindIntersection acting on floats from
+    // Schneider & Eberly, just inlined into this function.
+    if (smin <= 1 && smax >= 0) {
 
-},{}],25:[function(require,module,exports){
-'use strict';
+      // overlap on an end point
+      if (smin === 1) {
+        return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
+      }
+
+      if (smax === 0) {
+        return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
+      }
 
-module.exports = rbush;
+      if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
 
-var quickselect = require('quickselect');
+      // There's overlap on a segment -- two points of intersection. Return both.
+      return [
+        toPoint(a1, smin > 0 ? smin : 0, va),
+        toPoint(a1, smax < 1 ? smax : 1, va)
+      ];
+    }
 
-function rbush(maxEntries, format) {
-    if (!(this instanceof rbush)) return new rbush(maxEntries, format);
+    return null;
+  }
 
-    // max entries in a node is 9 by default; min node fill is 40% for best performance
-    this._maxEntries = Math.max(4, maxEntries || 9);
-    this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
+  /**
+   * @param  {SweepEvent} se1
+   * @param  {SweepEvent} se2
+   * @param  {Queue}      queue
+   * @return {Number}
+   */
+  function possibleIntersection (se1, se2, queue) {
+    // that disallows self-intersecting polygons,
+    // did cost us half a day, so I'll leave it
+    // out of respect
+    // if (se1.isSubject === se2.isSubject) return;
+    var inter = intersection(
+      se1.point, se1.otherEvent.point,
+      se2.point, se2.otherEvent.point
+    );
+
+    var nintersections = inter ? inter.length : 0;
+    if (nintersections === 0) { return 0; } // no intersection
+
+    // the line segments intersect at an endpoint of both line segments
+    if ((nintersections === 1) &&
+        (equals(se1.point, se2.point) ||
+         equals(se1.otherEvent.point, se2.otherEvent.point))) {
+      return 0;
+    }
+
+    if (nintersections === 2 && se1.isSubject === se2.isSubject) {
+      // if(se1.contourId === se2.contourId){
+      // console.warn('Edges of the same polygon overlap',
+      //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
+      // }
+      //throw new Error('Edges of the same polygon overlap');
+      return 0;
+    }
+
+    // The line segments associated to se1 and se2 intersect
+    if (nintersections === 1) {
+
+      // if the intersection point is not an endpoint of se1
+      if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
+        divideSegment(se1, inter[0], queue);
+      }
 
-    if (format) {
-        this._initFormat(format);
+      // if the intersection point is not an endpoint of se2
+      if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
+        divideSegment(se2, inter[0], queue);
+      }
+      return 1;
     }
 
-    this.clear();
-}
+    // The line segments associated to se1 and se2 overlap
+    var events        = [];
+    var leftCoincide  = false;
+    var rightCoincide = false;
 
-rbush.prototype = {
+    if (equals(se1.point, se2.point)) {
+      leftCoincide = true; // linked
+    } else if (compareEvents(se1, se2) === 1) {
+      events.push(se2, se1);
+    } else {
+      events.push(se1, se2);
+    }
 
-    all: function () {
-        return this._all(this.data, []);
-    },
+    if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
+      rightCoincide = true;
+    } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
+      events.push(se2.otherEvent, se1.otherEvent);
+    } else {
+      events.push(se1.otherEvent, se2.otherEvent);
+    }
 
-    search: function (bbox) {
+    if ((leftCoincide && rightCoincide) || leftCoincide) {
+      // both line segments are equal or share the left endpoint
+      se2.type = NON_CONTRIBUTING;
+      se1.type = (se2.inOut === se1.inOut)
+        ? SAME_TRANSITION : DIFFERENT_TRANSITION;
 
-        var node = this.data,
-            result = [],
-            toBBox = this.toBBox;
+      if (leftCoincide && !rightCoincide) {
+        // honestly no idea, but changing events selection from [2, 1]
+        // to [0, 1] fixes the overlapping self-intersecting polygons issue
+        divideSegment(events[1].otherEvent, events[0].point, queue);
+      }
+      return 2;
+    }
 
-        if (!intersects(bbox, node)) return result;
+    // the line segments share the right endpoint
+    if (rightCoincide) {
+      divideSegment(events[0], events[1].point, queue);
+      return 3;
+    }
 
-        var nodesToSearch = [],
-            i, len, child, childBBox;
+    // no line segment includes totally the other one
+    if (events[0] !== events[3].otherEvent) {
+      divideSegment(events[0], events[1].point, queue);
+      divideSegment(events[1], events[2].point, queue);
+      return 3;
+    }
 
-        while (node) {
-            for (i = 0, len = node.children.length; i < len; i++) {
+    // one line segment includes the other one
+    divideSegment(events[0], events[1].point, queue);
+    divideSegment(events[3].otherEvent, events[2].point, queue);
 
-                child = node.children[i];
-                childBBox = node.leaf ? toBBox(child) : child;
+    return 3;
+  }
 
-                if (intersects(bbox, childBBox)) {
-                    if (node.leaf) result.push(child);
-                    else if (contains(bbox, childBBox)) this._all(child, result);
-                    else nodesToSearch.push(child);
-                }
-            }
-            node = nodesToSearch.pop();
-        }
+  /**
+   * @param  {SweepEvent} le1
+   * @param  {SweepEvent} le2
+   * @return {Number}
+   */
+  function compareSegments(le1, le2) {
+    if (le1 === le2) { return 0; }
 
-        return result;
-    },
+    // Segments are not collinear
+    if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
+      signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
 
-    collides: function (bbox) {
+      // If they share their left endpoint use the right endpoint to sort
+      if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
 
-        var node = this.data,
-            toBBox = this.toBBox;
+      // Different left endpoint: use the left endpoint to sort
+      if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
 
-        if (!intersects(bbox, node)) return false;
+      // has the line segment associated to e1 been inserted
+      // into S after the line segment associated to e2 ?
+      if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
 
-        var nodesToSearch = [],
-            i, len, child, childBBox;
+      // The line segment associated to e2 has been inserted
+      // into S after the line segment associated to e1
+      return le1.isBelow(le2.point) ? -1 : 1;
+    }
 
-        while (node) {
-            for (i = 0, len = node.children.length; i < len; i++) {
+    if (le1.isSubject === le2.isSubject) { // same polygon
+      var p1 = le1.point, p2 = le2.point;
+      if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
+        p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
+        if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
+        else { return le1.contourId > le2.contourId ? 1 : -1; }
+      }
+    } else { // Segments are collinear, but belong to separate polygons
+      return le1.isSubject ? -1 : 1;
+    }
 
-                child = node.children[i];
-                childBBox = node.leaf ? toBBox(child) : child;
+    return compareEvents(le1, le2) === 1 ? 1 : -1;
+  }
 
-                if (intersects(bbox, childBBox)) {
-                    if (node.leaf || contains(bbox, childBBox)) return true;
-                    nodesToSearch.push(child);
-                }
-            }
-            node = nodesToSearch.pop();
-        }
+  function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
+    var sweepLine = new SplayTree(compareSegments);
+    var sortedEvents = [];
 
-        return false;
-    },
+    var rightbound = Math.min(sbbox[2], cbbox[2]);
 
-    load: function (data) {
-        if (!(data && data.length)) return this;
+    var prev, next, begin;
 
-        if (data.length < this._minEntries) {
-            for (var i = 0, len = data.length; i < len; i++) {
-                this.insert(data[i]);
-            }
-            return this;
-        }
+    while (eventQueue.length !== 0) {
+      var event = eventQueue.pop();
+      sortedEvents.push(event);
 
-        // recursively build the tree with the given data from stratch using OMT algorithm
-        var node = this._build(data.slice(), 0, data.length - 1, 0);
+      // optimization by bboxes for intersection and difference goes here
+      if ((operation === INTERSECTION && event.point[0] > rightbound) ||
+          (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
+        break;
+      }
 
-        if (!this.data.children.length) {
-            // save as is if tree is empty
-            this.data = node;
+      if (event.left) {
+        next  = prev = sweepLine.insert(event);
+        begin = sweepLine.minNode();
 
-        } else if (this.data.height === node.height) {
-            // split root if trees have the same height
-            this._splitRoot(this.data, node);
+        if (prev !== begin) { prev = sweepLine.prev(prev); }
+        else                { prev = null; }
 
-        } else {
-            if (this.data.height < node.height) {
-                // swap trees if inserted one is bigger
-                var tmpNode = this.data;
-                this.data = node;
-                node = tmpNode;
-            }
+        next = sweepLine.next(next);
 
-            // insert the small tree into the large tree at appropriate level
-            this._insert(node, this.data.height - node.height - 1, true);
+        var prevEvent = prev ? prev.key : null;
+        var prevprevEvent = (void 0);
+        computeFields(event, prevEvent, operation);
+        if (next) {
+          if (possibleIntersection(event, next.key, eventQueue) === 2) {
+            computeFields(event, prevEvent, operation);
+            computeFields(event, next.key, operation);
+          }
         }
 
-        return this;
-    },
+        if (prev) {
+          if (possibleIntersection(prev.key, event, eventQueue) === 2) {
+            var prevprev = prev;
+            if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
+            else                    { prevprev = null; }
 
-    insert: function (item) {
-        if (item) this._insert(item, this.data.height - 1);
-        return this;
-    },
+            prevprevEvent = prevprev ? prevprev.key : null;
+            computeFields(prevEvent, prevprevEvent, operation);
+            computeFields(event,     prevEvent,     operation);
+          }
+        }
+      } else {
+        event = event.otherEvent;
+        next = prev = sweepLine.find(event);
 
-    clear: function () {
-        this.data = createNode([]);
-        return this;
-    },
+        if (prev && next) {
 
-    remove: function (item, equalsFn) {
-        if (!item) return this;
+          if (prev !== begin) { prev = sweepLine.prev(prev); }
+          else                { prev = null; }
 
-        var node = this.data,
-            bbox = this.toBBox(item),
-            path = [],
-            indexes = [],
-            i, parent, index, goingUp;
+          next = sweepLine.next(next);
+          sweepLine.remove(event);
 
-        // depth-first iterative tree traversal
-        while (node || path.length) {
+          if (next && prev) {
+            possibleIntersection(prev.key, next.key, eventQueue);
+          }
+        }
+      }
+    }
+    return sortedEvents;
+  }
 
-            if (!node) { // go up
-                node = path.pop();
-                parent = path[path.length - 1];
-                i = indexes.pop();
-                goingUp = true;
-            }
+  var Contour = function Contour() {
+    this.points = [];
+    this.holeIds = [];
+    this.holeOf = null;
+    this.depth = null;
+  };
 
-            if (node.leaf) { // check current node
-                index = findItem(item, node.children, equalsFn);
+  Contour.prototype.isExterior = function isExterior () {
+    return this.holeOf == null;
+  };
 
-                if (index !== -1) {
-                    // item found, remove the item and condense tree upwards
-                    node.children.splice(index, 1);
-                    path.push(node);
-                    this._condense(path);
-                    return this;
-                }
-            }
+  /**
+   * @param  {Array.<SweepEvent>} sortedEvents
+   * @return {Array.<SweepEvent>}
+   */
+  function orderEvents(sortedEvents) {
+    var event, i, len, tmp;
+    var resultEvents = [];
+    for (i = 0, len = sortedEvents.length; i < len; i++) {
+      event = sortedEvents[i];
+      if ((event.left && event.inResult) ||
+        (!event.left && event.otherEvent.inResult)) {
+        resultEvents.push(event);
+      }
+    }
+    // Due to overlapping edges the resultEvents array can be not wholly sorted
+    var sorted = false;
+    while (!sorted) {
+      sorted = true;
+      for (i = 0, len = resultEvents.length; i < len; i++) {
+        if ((i + 1) < len &&
+          compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
+          tmp = resultEvents[i];
+          resultEvents[i] = resultEvents[i + 1];
+          resultEvents[i + 1] = tmp;
+          sorted = false;
+        }
+      }
+    }
 
-            if (!goingUp && !node.leaf && contains(node, bbox)) { // go down
-                path.push(node);
-                indexes.push(i);
-                i = 0;
-                parent = node;
-                node = node.children[0];
 
-            } else if (parent) { // go right
-                i++;
-                node = parent.children[i];
-                goingUp = false;
+    for (i = 0, len = resultEvents.length; i < len; i++) {
+      event = resultEvents[i];
+      event.otherPos = i;
+    }
 
-            } else node = null; // nothing found
-        }
+    // imagine, the right event is found in the beginning of the queue,
+    // when his left counterpart is not marked yet
+    for (i = 0, len = resultEvents.length; i < len; i++) {
+      event = resultEvents[i];
+      if (!event.left) {
+        tmp = event.otherPos;
+        event.otherPos = event.otherEvent.otherPos;
+        event.otherEvent.otherPos = tmp;
+      }
+    }
 
-        return this;
-    },
+    return resultEvents;
+  }
 
-    toBBox: function (item) { return item; },
 
-    compareMinX: compareNodeMinX,
-    compareMinY: compareNodeMinY,
+  /**
+   * @param  {Number} pos
+   * @param  {Array.<SweepEvent>} resultEvents
+   * @param  {Object>}    processed
+   * @return {Number}
+   */
+  function nextPos(pos, resultEvents, processed, origPos) {
+    var newPos = pos + 1,
+        p = resultEvents[pos].point,
+        p1;
+    var length = resultEvents.length;
+
+    if (newPos < length)
+      { p1 = resultEvents[newPos].point; }
+
+    while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
+      if (!processed[newPos]) {
+        return newPos;
+      } else   {
+        newPos++;
+      }
+      p1 = resultEvents[newPos].point;
+    }
 
-    toJSON: function () { return this.data; },
+    newPos = pos - 1;
 
-    fromJSON: function (data) {
-        this.data = data;
-        return this;
-    },
+    while (processed[newPos] && newPos > origPos) {
+      newPos--;
+    }
+
+    return newPos;
+  }
 
-    _all: function (node, result) {
-        var nodesToSearch = [];
-        while (node) {
-            if (node.leaf) result.push.apply(result, node.children);
-            else nodesToSearch.push.apply(nodesToSearch, node.children);
 
-            node = nodesToSearch.pop();
+  function initializeContourFromContext(event, contours, contourId) {
+    var contour = new Contour();
+    if (event.prevInResult != null) {
+      var prevInResult = event.prevInResult;
+      // Note that it is valid to query the "previous in result" for its output contour id,
+      // because we must have already processed it (i.e., assigned an output contour id)
+      // in an earlier iteration, otherwise it wouldn't be possible that it is "previous in
+      // result".
+      var lowerContourId = prevInResult.outputContourId;
+      var lowerResultTransition = prevInResult.resultTransition;
+      if (lowerResultTransition > 0) {
+        // We are inside. Now we have to check if the thing below us is another hole or
+        // an exterior contour.
+        var lowerContour = contours[lowerContourId];
+        if (lowerContour.holeOf != null) {
+          // The lower contour is a hole => Connect the new contour as a hole to its parent,
+          // and use same depth.
+          var parentContourId = lowerContour.holeOf;
+          contours[parentContourId].holeIds.push(contourId);
+          contour.holeOf = parentContourId;
+          contour.depth = contours[lowerContourId].depth;
+        } else {
+          // The lower contour is an exterior contour => Connect the new contour as a hole,
+          // and increment depth.
+          contours[lowerContourId].holeIds.push(contourId);
+          contour.holeOf = lowerContourId;
+          contour.depth = contours[lowerContourId].depth + 1;
         }
-        return result;
-    },
+      } else {
+        // We are outside => this contour is an exterior contour of same depth.
+        contour.holeOf = null;
+        contour.depth = contours[lowerContourId].depth;
+      }
+    } else {
+      // There is no lower/previous contour => this contour is an exterior contour of depth 0.
+      contour.holeOf = null;
+      contour.depth = 0;
+    }
+    return contour;
+  }
+
+  /**
+   * @param  {Array.<SweepEvent>} sortedEvents
+   * @return {Array.<*>} polygons
+   */
+  function connectEdges(sortedEvents) {
+    var i, len;
+    var resultEvents = orderEvents(sortedEvents);
 
-    _build: function (items, left, right, height) {
+    // "false"-filled array
+    var processed = {};
+    var contours = [];
 
-        var N = right - left + 1,
-            M = this._maxEntries,
-            node;
+    var loop = function (  ) {
 
-        if (N <= M) {
-            // reached leaf level; return leaf
-            node = createNode(items.slice(left, right + 1));
-            calcBBox(node, this.toBBox);
-            return node;
-        }
+      if (processed[i]) {
+        return;
+      }
+
+      var contourId = contours.length;
+      var contour = initializeContourFromContext(resultEvents[i], contours, contourId);
+
+      // Helper function that combines marking an event as processed with assigning its output contour ID
+      var markAsProcessed = function (pos) {
+        processed[pos] = true;
+        resultEvents[pos].outputContourId = contourId;
+      };
+
+      var pos = i;
+      var origPos = i;
+
+      var initial = resultEvents[i].point;
+      contour.points.push(initial);
+
+      /* eslint no-constant-condition: "off" */
+      while (true) {
+        markAsProcessed(pos);
+
+        pos = resultEvents[pos].otherPos;
+
+        markAsProcessed(pos);
+        contour.points.push(resultEvents[pos].point);
 
-        if (!height) {
-            // target height of the bulk-loaded tree
-            height = Math.ceil(Math.log(N) / Math.log(M));
+        pos = nextPos(pos, resultEvents, processed, origPos);
 
-            // target number of root entries to maximize storage utilization
-            M = Math.ceil(N / Math.pow(M, height - 1));
+        if (pos == origPos) {
+          break;
         }
+      }
 
-        node = createNode([]);
-        node.leaf = false;
-        node.height = height;
+      contours.push(contour);
+    };
 
-        // split the items into M mostly square tiles
+    for (i = 0, len = resultEvents.length; i < len; i++) loop(  );
 
-        var N2 = Math.ceil(N / M),
-            N1 = N2 * Math.ceil(Math.sqrt(M)),
-            i, j, right2, right3;
+    return contours;
+  }
 
-        multiSelect(items, left, right, N1, this.compareMinX);
+  var tinyqueue = TinyQueue;
+  var default_1 = TinyQueue;
 
-        for (i = left; i <= right; i += N1) {
+  function TinyQueue(data, compare) {
+      if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
 
-            right2 = Math.min(i + N1 - 1, right);
+      this.data = data || [];
+      this.length = this.data.length;
+      this.compare = compare || defaultCompare;
 
-            multiSelect(items, i, right2, N2, this.compareMinY);
+      if (this.length > 0) {
+          for (var i = (this.length >> 1) - 1; i >= 0; i--) { this._down(i); }
+      }
+  }
 
-            for (j = i; j <= right2; j += N2) {
+  function defaultCompare(a, b) {
+      return a < b ? -1 : a > b ? 1 : 0;
+  }
 
-                right3 = Math.min(j + N2 - 1, right2);
+  TinyQueue.prototype = {
 
-                // pack each entry recursively
-                node.children.push(this._build(items, j, right3, height - 1));
-            }
-        }
+      push: function (item) {
+          this.data.push(item);
+          this.length++;
+          this._up(this.length - 1);
+      },
 
-        calcBBox(node, this.toBBox);
+      pop: function () {
+          if (this.length === 0) { return undefined; }
 
-        return node;
-    },
+          var top = this.data[0];
+          this.length--;
+
+          if (this.length > 0) {
+              this.data[0] = this.data[this.length];
+              this._down(0);
+          }
+          this.data.pop();
+
+          return top;
+      },
+
+      peek: function () {
+          return this.data[0];
+      },
+
+      _up: function (pos) {
+          var data = this.data;
+          var compare = this.compare;
+          var item = data[pos];
+
+          while (pos > 0) {
+              var parent = (pos - 1) >> 1;
+              var current = data[parent];
+              if (compare(item, current) >= 0) { break; }
+              data[pos] = current;
+              pos = parent;
+          }
 
-    _chooseSubtree: function (bbox, node, level, path) {
+          data[pos] = item;
+      },
 
-        var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
+      _down: function (pos) {
+          var data = this.data;
+          var compare = this.compare;
+          var halfLength = this.length >> 1;
+          var item = data[pos];
 
-        while (true) {
-            path.push(node);
+          while (pos < halfLength) {
+              var left = (pos << 1) + 1;
+              var right = left + 1;
+              var best = data[left];
+
+              if (right < this.length && compare(data[right], best) < 0) {
+                  left = right;
+                  best = data[right];
+              }
+              if (compare(best, item) >= 0) { break; }
 
-            if (node.leaf || path.length - 1 === level) break;
+              data[pos] = best;
+              pos = left;
+          }
 
-            minArea = minEnlargement = Infinity;
+          data[pos] = item;
+      }
+  };
+  tinyqueue.default = default_1;
 
-            for (i = 0, len = node.children.length; i < len; i++) {
-                child = node.children[i];
-                area = bboxArea(child);
-                enlargement = enlargedArea(bbox, child) - area;
+  var max = Math.max;
+  var min = Math.min;
 
-                // choose entry with the least area enlargement
-                if (enlargement < minEnlargement) {
-                    minEnlargement = enlargement;
-                    minArea = area < minArea ? area : minArea;
-                    targetNode = child;
+  var contourId = 0;
 
-                } else if (enlargement === minEnlargement) {
-                    // otherwise choose one with the smallest area
-                    if (area < minArea) {
-                        minArea = area;
-                        targetNode = child;
-                    }
-                }
-            }
 
-            node = targetNode || node.children[0];
-        }
+  function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
+    var i, len, s1, s2, e1, e2;
+    for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
+      s1 = contourOrHole[i];
+      s2 = contourOrHole[i + 1];
+      e1 = new SweepEvent(s1, false, undefined, isSubject);
+      e2 = new SweepEvent(s2, false, e1,        isSubject);
+      e1.otherEvent = e2;
 
-        return node;
-    },
+      if (s1[0] === s2[0] && s1[1] === s2[1]) {
+        continue; // skip collapsed edges, or it breaks
+      }
+
+      e1.contourId = e2.contourId = depth;
+      if (!isExteriorRing) {
+        e1.isExteriorRing = false;
+        e2.isExteriorRing = false;
+      }
+      if (compareEvents(e1, e2) > 0) {
+        e2.left = true;
+      } else {
+        e1.left = true;
+      }
+
+      var x = s1[0], y = s1[1];
+      bbox[0] = min(bbox[0], x);
+      bbox[1] = min(bbox[1], y);
+      bbox[2] = max(bbox[2], x);
+      bbox[3] = max(bbox[3], y);
+
+      // Pushing it so the queue is sorted from left to right,
+      // with object on the left having the highest priority.
+      Q.push(e1);
+      Q.push(e2);
+    }
+  }
+
+
+  function fillQueue(subject, clipping, sbbox, cbbox, operation) {
+    var eventQueue = new tinyqueue(null, compareEvents);
+    var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
+
+    for (i = 0, ii = subject.length; i < ii; i++) {
+      polygonSet = subject[i];
+      for (j = 0, jj = polygonSet.length; j < jj; j++) {
+        isExteriorRing = j === 0;
+        if (isExteriorRing) { contourId++; }
+        processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
+      }
+    }
+
+    for (i = 0, ii = clipping.length; i < ii; i++) {
+      polygonSet = clipping[i];
+      for (j = 0, jj = polygonSet.length; j < jj; j++) {
+        isExteriorRing = j === 0;
+        if (operation === DIFFERENCE) { isExteriorRing = false; }
+        if (isExteriorRing) { contourId++; }
+        processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
+      }
+    }
+
+    return eventQueue;
+  }
+
+  var EMPTY = [];
+
+
+  function trivialOperation(subject, clipping, operation) {
+    var result = null;
+    if (subject.length * clipping.length === 0) {
+      if        (operation === INTERSECTION) {
+        result = EMPTY;
+      } else if (operation === DIFFERENCE) {
+        result = subject;
+      } else if (operation === UNION ||
+                 operation === XOR) {
+        result = (subject.length === 0) ? clipping : subject;
+      }
+    }
+    return result;
+  }
+
+
+  function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
+    var result = null;
+    if (sbbox[0] > cbbox[2] ||
+        cbbox[0] > sbbox[2] ||
+        sbbox[1] > cbbox[3] ||
+        cbbox[1] > sbbox[3]) {
+      if        (operation === INTERSECTION) {
+        result = EMPTY;
+      } else if (operation === DIFFERENCE) {
+        result = subject;
+      } else if (operation === UNION ||
+                 operation === XOR) {
+        result = subject.concat(clipping);
+      }
+    }
+    return result;
+  }
 
-    _insert: function (item, level, isNode) {
 
-        var toBBox = this.toBBox,
-            bbox = isNode ? item : toBBox(item),
-            insertPath = [];
+  function boolean(subject, clipping, operation) {
+    if (typeof subject[0][0][0] === 'number') {
+      subject = [subject];
+    }
+    if (typeof clipping[0][0][0] === 'number') {
+      clipping = [clipping];
+    }
+    var trivial = trivialOperation(subject, clipping, operation);
+    if (trivial) {
+      return trivial === EMPTY ? null : trivial;
+    }
+    var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
+    var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
+
+    // console.time('fill queue');
+    var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
+    //console.timeEnd('fill queue');
 
-        // find the best node for accommodating the item, saving all nodes along the path too
-        var node = this._chooseSubtree(bbox, this.data, level, insertPath);
+    trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
+    if (trivial) {
+      return trivial === EMPTY ? null : trivial;
+    }
+    // console.time('subdivide edges');
+    var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
+    //console.timeEnd('subdivide edges');
 
-        // put the item into the node
-        node.children.push(item);
-        extend(node, bbox);
+    // console.time('connect vertices');
+    var contours = connectEdges(sortedEvents);
+    //console.timeEnd('connect vertices');
 
-        // split on node overflow; propagate upwards if necessary
-        while (level >= 0) {
-            if (insertPath[level].children.length > this._maxEntries) {
-                this._split(insertPath, level);
-                level--;
-            } else break;
+    // Convert contours to polygons
+    var polygons = [];
+    for (var i = 0; i < contours.length; i++) {
+      var contour = contours[i];
+      if (contour.isExterior()) {
+        // The exterior ring goes first
+        var rings = [contour.points];
+        // Followed by holes if any
+        for (var j = 0; j < contour.holeIds.length; j++) {
+          var holeId = contour.holeIds[j];
+          rings.push(contours[holeId].points);
         }
+        polygons.push(rings);
+      }
+    }
 
-        // adjust bboxes along the insertion path
-        this._adjustParentBBoxes(bbox, insertPath, level);
-    },
+    return polygons;
+  }
 
-    // split overflowed node into two
-    _split: function (insertPath, level) {
+  function union (subject, clipping) {
+    return boolean(subject, clipping, UNION);
+  }
 
-        var node = insertPath[level],
-            M = node.children.length,
-            m = this._minEntries;
+  function diff (subject, clipping) {
+    return boolean(subject, clipping, DIFFERENCE);
+  }
 
-        this._chooseSplitAxis(node, m, M);
+  function xor (subject, clipping) {
+    return boolean(subject, clipping, XOR);
+  }
 
-        var splitIndex = this._chooseSplitIndex(node, m, M);
+  function intersection$1 (subject, clipping) {
+    return boolean(subject, clipping, INTERSECTION);
+  }
 
-        var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
-        newNode.height = node.height;
-        newNode.leaf = node.leaf;
+  /**
+   * @enum {Number}
+   */
+  var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
 
-        calcBBox(node, this.toBBox);
-        calcBBox(newNode, this.toBBox);
+  exports.diff = diff;
+  exports.intersection = intersection$1;
+  exports.operations = operations;
+  exports.union = union;
+  exports.xor = xor;
 
-        if (level) insertPath[level - 1].children.push(newNode);
-        else this._splitRoot(node, newNode);
-    },
+  Object.defineProperty(exports, '__esModule', { value: true });
 
-    _splitRoot: function (node, newNode) {
-        // split root node
-        this.data = createNode([node, newNode]);
-        this.data.height = node.height + 1;
-        this.data.leaf = false;
-        calcBBox(this.data, this.toBBox);
-    },
+})));
 
-    _chooseSplitIndex: function (node, m, M) {
 
-        var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
+},{}],23:[function(require,module,exports){
+// Top level file is just a mixin of submodules & constants
+'use strict';
 
-        minOverlap = minArea = Infinity;
+var assign    = require('./lib/utils/common').assign;
 
-        for (i = m; i <= M - m; i++) {
-            bbox1 = distBBox(node, 0, i, this.toBBox);
-            bbox2 = distBBox(node, i, M, this.toBBox);
+var deflate   = require('./lib/deflate');
+var inflate   = require('./lib/inflate');
+var constants = require('./lib/zlib/constants');
 
-            overlap = intersectionArea(bbox1, bbox2);
-            area = bboxArea(bbox1) + bboxArea(bbox2);
+var pako = {};
 
-            // choose distribution with minimum overlap
-            if (overlap < minOverlap) {
-                minOverlap = overlap;
-                index = i;
+assign(pako, deflate, inflate, constants);
 
-                minArea = area < minArea ? area : minArea;
+module.exports = pako;
 
-            } else if (overlap === minOverlap) {
-                // otherwise choose distribution with minimum area
-                if (area < minArea) {
-                    minArea = area;
-                    index = i;
-                }
-            }
-        }
+},{"./lib/deflate":24,"./lib/inflate":25,"./lib/utils/common":26,"./lib/zlib/constants":29}],24:[function(require,module,exports){
+'use strict';
 
-        return index;
-    },
 
-    // sorts node children by the best axis for split
-    _chooseSplitAxis: function (node, m, M) {
+var zlib_deflate = require('./zlib/deflate');
+var utils        = require('./utils/common');
+var strings      = require('./utils/strings');
+var msg          = require('./zlib/messages');
+var ZStream      = require('./zlib/zstream');
+
+var toString = Object.prototype.toString;
 
-        var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
-            compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
-            xMargin = this._allDistMargin(node, m, M, compareMinX),
-            yMargin = this._allDistMargin(node, m, M, compareMinY);
+/* Public constants ==========================================================*/
+/* ===========================================================================*/
 
-        // if total distributions margin value is minimal for x, sort by minX,
-        // otherwise it's already sorted by minY
-        if (xMargin < yMargin) node.children.sort(compareMinX);
-    },
+var Z_NO_FLUSH      = 0;
+var Z_FINISH        = 4;
 
-    // total margin of all possible split distributions where each node is at least m full
-    _allDistMargin: function (node, m, M, compare) {
+var Z_OK            = 0;
+var Z_STREAM_END    = 1;
+var Z_SYNC_FLUSH    = 2;
 
-        node.children.sort(compare);
+var Z_DEFAULT_COMPRESSION = -1;
 
-        var toBBox = this.toBBox,
-            leftBBox = distBBox(node, 0, m, toBBox),
-            rightBBox = distBBox(node, M - m, M, toBBox),
-            margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
-            i, child;
+var Z_DEFAULT_STRATEGY    = 0;
 
-        for (i = m; i < M - m; i++) {
-            child = node.children[i];
-            extend(leftBBox, node.leaf ? toBBox(child) : child);
-            margin += bboxMargin(leftBBox);
-        }
+var Z_DEFLATED  = 8;
 
-        for (i = M - m - 1; i >= m; i--) {
-            child = node.children[i];
-            extend(rightBBox, node.leaf ? toBBox(child) : child);
-            margin += bboxMargin(rightBBox);
-        }
+/* ===========================================================================*/
 
-        return margin;
-    },
 
-    _adjustParentBBoxes: function (bbox, path, level) {
-        // adjust bboxes along the given tree path
-        for (var i = level; i >= 0; i--) {
-            extend(path[i], bbox);
-        }
-    },
+/**
+ * class Deflate
+ *
+ * Generic JS-style wrapper for zlib calls. If you don't need
+ * streaming behaviour - use more simple functions: [[deflate]],
+ * [[deflateRaw]] and [[gzip]].
+ **/
 
-    _condense: function (path) {
-        // go through the path, removing empty nodes and updating bboxes
-        for (var i = path.length - 1, siblings; i >= 0; i--) {
-            if (path[i].children.length === 0) {
-                if (i > 0) {
-                    siblings = path[i - 1].children;
-                    siblings.splice(siblings.indexOf(path[i]), 1);
+/* internal
+ * Deflate.chunks -> Array
+ *
+ * Chunks of output data, if [[Deflate#onData]] not overridden.
+ **/
 
-                } else this.clear();
+/**
+ * Deflate.result -> Uint8Array|Array
+ *
+ * Compressed result, generated by default [[Deflate#onData]]
+ * and [[Deflate#onEnd]] handlers. Filled after you push last chunk
+ * (call [[Deflate#push]] with `Z_FINISH` / `true` param)  or if you
+ * push a chunk with explicit flush (call [[Deflate#push]] with
+ * `Z_SYNC_FLUSH` param).
+ **/
 
-            } else calcBBox(path[i], this.toBBox);
-        }
-    },
+/**
+ * Deflate.err -> Number
+ *
+ * Error code after deflate finished. 0 (Z_OK) on success.
+ * You will not need it in real life, because deflate errors
+ * are possible only on wrong options or bad `onData` / `onEnd`
+ * custom handlers.
+ **/
+
+/**
+ * Deflate.msg -> String
+ *
+ * Error message, if [[Deflate.err]] != 0
+ **/
 
-    _initFormat: function (format) {
-        // data format (minX, minY, maxX, maxY accessors)
 
-        // uses eval-type function compilation instead of just accepting a toBBox function
-        // because the algorithms are very sensitive to sorting functions performance,
-        // so they should be dead simple and without inner calls
+/**
+ * new Deflate(options)
+ * - options (Object): zlib deflate options.
+ *
+ * Creates new deflator instance with specified params. Throws exception
+ * on bad params. Supported options:
+ *
+ * - `level`
+ * - `windowBits`
+ * - `memLevel`
+ * - `strategy`
+ * - `dictionary`
+ *
+ * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
+ * for more information on these.
+ *
+ * Additional options, for internal needs:
+ *
+ * - `chunkSize` - size of generated data chunks (16K by default)
+ * - `raw` (Boolean) - do raw deflate
+ * - `gzip` (Boolean) - create gzip wrapper
+ * - `to` (String) - if equal to 'string', then result will be "binary string"
+ *    (each char code [0..255])
+ * - `header` (Object) - custom header for gzip
+ *   - `text` (Boolean) - true if compressed data believed to be text
+ *   - `time` (Number) - modification time, unix timestamp
+ *   - `os` (Number) - operation system code
+ *   - `extra` (Array) - array of bytes with extra data (max 65536)
+ *   - `name` (String) - file name (binary string)
+ *   - `comment` (String) - comment (binary string)
+ *   - `hcrc` (Boolean) - true if header crc should be added
+ *
+ * ##### Example:
+ *
+ * ```javascript
+ * var pako = require('pako')
+ *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
+ *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
+ *
+ * var deflate = new pako.Deflate({ level: 3});
+ *
+ * deflate.push(chunk1, false);
+ * deflate.push(chunk2, true);  // true -> last chunk
+ *
+ * if (deflate.err) { throw new Error(deflate.err); }
+ *
+ * console.log(deflate.result);
+ * ```
+ **/
+function Deflate(options) {
+  if (!(this instanceof Deflate)) return new Deflate(options);
+
+  this.options = utils.assign({
+    level: Z_DEFAULT_COMPRESSION,
+    method: Z_DEFLATED,
+    chunkSize: 16384,
+    windowBits: 15,
+    memLevel: 8,
+    strategy: Z_DEFAULT_STRATEGY,
+    to: ''
+  }, options || {});
+
+  var opt = this.options;
+
+  if (opt.raw && (opt.windowBits > 0)) {
+    opt.windowBits = -opt.windowBits;
+  }
+
+  else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {
+    opt.windowBits += 16;
+  }
 
-        var compareArr = ['return a', ' - b', ';'];
+  this.err    = 0;      // error code, if happens (0 = Z_OK)
+  this.msg    = '';     // error message
+  this.ended  = false;  // used to avoid multiple onEnd() calls
+  this.chunks = [];     // chunks of compressed data
+
+  this.strm = new ZStream();
+  this.strm.avail_out = 0;
+
+  var status = zlib_deflate.deflateInit2(
+    this.strm,
+    opt.level,
+    opt.method,
+    opt.windowBits,
+    opt.memLevel,
+    opt.strategy
+  );
+
+  if (status !== Z_OK) {
+    throw new Error(msg[status]);
+  }
 
-        this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
-        this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
+  if (opt.header) {
+    zlib_deflate.deflateSetHeader(this.strm, opt.header);
+  }
 
-        this.toBBox = new Function('a',
-            'return {minX: a' + format[0] +
-            ', minY: a' + format[1] +
-            ', maxX: a' + format[2] +
-            ', maxY: a' + format[3] + '};');
+  if (opt.dictionary) {
+    var dict;
+    // Convert data if needed
+    if (typeof opt.dictionary === 'string') {
+      // If we need to compress text, change encoding to utf8.
+      dict = strings.string2buf(opt.dictionary);
+    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {
+      dict = new Uint8Array(opt.dictionary);
+    } else {
+      dict = opt.dictionary;
     }
-};
 
-function findItem(item, items, equalsFn) {
-    if (!equalsFn) return items.indexOf(item);
+    status = zlib_deflate.deflateSetDictionary(this.strm, dict);
 
-    for (var i = 0; i < items.length; i++) {
-        if (equalsFn(item, items[i])) return i;
+    if (status !== Z_OK) {
+      throw new Error(msg[status]);
     }
-    return -1;
-}
 
-// calculate node's bbox from bboxes of its children
-function calcBBox(node, toBBox) {
-    distBBox(node, 0, node.children.length, toBBox, node);
+    this._dict_set = true;
+  }
 }
 
-// min bounding rectangle of node children from k to p-1
-function distBBox(node, k, p, toBBox, destNode) {
-    if (!destNode) destNode = createNode(null);
-    destNode.minX = Infinity;
-    destNode.minY = Infinity;
-    destNode.maxX = -Infinity;
-    destNode.maxY = -Infinity;
+/**
+ * Deflate#push(data[, mode]) -> Boolean
+ * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be
+ *   converted to utf8 byte sequence.
+ * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
+ *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.
+ *
+ * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with
+ * new compressed chunks. Returns `true` on success. The last data block must have
+ * mode Z_FINISH (or `true`). That will flush internal pending buffers and call
+ * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you
+ * can use mode Z_SYNC_FLUSH, keeping the compression context.
+ *
+ * On fail call [[Deflate#onEnd]] with error code and return false.
+ *
+ * We strongly recommend to use `Uint8Array` on input for best speed (output
+ * array format is detected automatically). Also, don't skip last param and always
+ * use the same type in your code (boolean or number). That will improve JS speed.
+ *
+ * For regular `Array`-s make sure all elements are [0..255].
+ *
+ * ##### Example
+ *
+ * ```javascript
+ * push(chunk, false); // push one of data chunks
+ * ...
+ * push(chunk, true);  // push last chunk
+ * ```
+ **/
+Deflate.prototype.push = function (data, mode) {
+  var strm = this.strm;
+  var chunkSize = this.options.chunkSize;
+  var status, _mode;
+
+  if (this.ended) { return false; }
+
+  _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);
+
+  // Convert data if needed
+  if (typeof data === 'string') {
+    // If we need to compress text, change encoding to utf8.
+    strm.input = strings.string2buf(data);
+  } else if (toString.call(data) === '[object ArrayBuffer]') {
+    strm.input = new Uint8Array(data);
+  } else {
+    strm.input = data;
+  }
+
+  strm.next_in = 0;
+  strm.avail_in = strm.input.length;
 
-    for (var i = k, child; i < p; i++) {
-        child = node.children[i];
-        extend(destNode, node.leaf ? toBBox(child) : child);
+  do {
+    if (strm.avail_out === 0) {
+      strm.output = new utils.Buf8(chunkSize);
+      strm.next_out = 0;
+      strm.avail_out = chunkSize;
     }
+    status = zlib_deflate.deflate(strm, _mode);    /* no bad return value */
 
-    return destNode;
-}
+    if (status !== Z_STREAM_END && status !== Z_OK) {
+      this.onEnd(status);
+      this.ended = true;
+      return false;
+    }
+    if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) {
+      if (this.options.to === 'string') {
+        this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));
+      } else {
+        this.onData(utils.shrinkBuf(strm.output, strm.next_out));
+      }
+    }
+  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);
 
-function extend(a, b) {
-    a.minX = Math.min(a.minX, b.minX);
-    a.minY = Math.min(a.minY, b.minY);
-    a.maxX = Math.max(a.maxX, b.maxX);
-    a.maxY = Math.max(a.maxY, b.maxY);
-    return a;
-}
+  // Finalize on the last chunk.
+  if (_mode === Z_FINISH) {
+    status = zlib_deflate.deflateEnd(this.strm);
+    this.onEnd(status);
+    this.ended = true;
+    return status === Z_OK;
+  }
+
+  // callback interim results if Z_SYNC_FLUSH.
+  if (_mode === Z_SYNC_FLUSH) {
+    this.onEnd(Z_OK);
+    strm.avail_out = 0;
+    return true;
+  }
 
-function compareNodeMinX(a, b) { return a.minX - b.minX; }
-function compareNodeMinY(a, b) { return a.minY - b.minY; }
+  return true;
+};
 
-function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
-function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
 
-function enlargedArea(a, b) {
-    return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
-           (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
-}
+/**
+ * Deflate#onData(chunk) -> Void
+ * - chunk (Uint8Array|Array|String): output data. Type of array depends
+ *   on js engine support. When string output requested, each chunk
+ *   will be string.
+ *
+ * By default, stores data blocks in `chunks[]` property and glue
+ * those in `onEnd`. Override this handler, if you need another behaviour.
+ **/
+Deflate.prototype.onData = function (chunk) {
+  this.chunks.push(chunk);
+};
 
-function intersectionArea(a, b) {
-    var minX = Math.max(a.minX, b.minX),
-        minY = Math.max(a.minY, b.minY),
-        maxX = Math.min(a.maxX, b.maxX),
-        maxY = Math.min(a.maxY, b.maxY);
 
-    return Math.max(0, maxX - minX) *
-           Math.max(0, maxY - minY);
-}
+/**
+ * Deflate#onEnd(status) -> Void
+ * - status (Number): deflate status. 0 (Z_OK) on success,
+ *   other if not.
+ *
+ * Called once after you tell deflate that the input stream is
+ * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)
+ * or if an error happened. By default - join collected chunks,
+ * free memory and fill `results` / `err` properties.
+ **/
+Deflate.prototype.onEnd = function (status) {
+  // On success - join
+  if (status === Z_OK) {
+    if (this.options.to === 'string') {
+      this.result = this.chunks.join('');
+    } else {
+      this.result = utils.flattenChunks(this.chunks);
+    }
+  }
+  this.chunks = [];
+  this.err = status;
+  this.msg = this.strm.msg;
+};
+
+
+/**
+ * deflate(data[, options]) -> Uint8Array|Array|String
+ * - data (Uint8Array|Array|String): input data to compress.
+ * - options (Object): zlib deflate options.
+ *
+ * Compress `data` with deflate algorithm and `options`.
+ *
+ * Supported options are:
+ *
+ * - level
+ * - windowBits
+ * - memLevel
+ * - strategy
+ * - dictionary
+ *
+ * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
+ * for more information on these.
+ *
+ * Sugar (options):
+ *
+ * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
+ *   negative windowBits implicitly.
+ * - `to` (String) - if equal to 'string', then result will be "binary string"
+ *    (each char code [0..255])
+ *
+ * ##### Example:
+ *
+ * ```javascript
+ * var pako = require('pako')
+ *   , data = Uint8Array([1,2,3,4,5,6,7,8,9]);
+ *
+ * console.log(pako.deflate(data));
+ * ```
+ **/
+function deflate(input, options) {
+  var deflator = new Deflate(options);
+
+  deflator.push(input, true);
 
-function contains(a, b) {
-    return a.minX <= b.minX &&
-           a.minY <= b.minY &&
-           b.maxX <= a.maxX &&
-           b.maxY <= a.maxY;
+  // That will never happens, if you don't cheat with options :)
+  if (deflator.err) { throw deflator.msg || msg[deflator.err]; }
+
+  return deflator.result;
 }
 
-function intersects(a, b) {
-    return b.minX <= a.maxX &&
-           b.minY <= a.maxY &&
-           b.maxX >= a.minX &&
-           b.maxY >= a.minY;
+
+/**
+ * deflateRaw(data[, options]) -> Uint8Array|Array|String
+ * - data (Uint8Array|Array|String): input data to compress.
+ * - options (Object): zlib deflate options.
+ *
+ * The same as [[deflate]], but creates raw data, without wrapper
+ * (header and adler32 crc).
+ **/
+function deflateRaw(input, options) {
+  options = options || {};
+  options.raw = true;
+  return deflate(input, options);
 }
 
-function createNode(children) {
-    return {
-        children: children,
-        height: 1,
-        leaf: true,
-        minX: Infinity,
-        minY: Infinity,
-        maxX: -Infinity,
-        maxY: -Infinity
-    };
+
+/**
+ * gzip(data[, options]) -> Uint8Array|Array|String
+ * - data (Uint8Array|Array|String): input data to compress.
+ * - options (Object): zlib deflate options.
+ *
+ * The same as [[deflate]], but create gzip wrapper instead of
+ * deflate one.
+ **/
+function gzip(input, options) {
+  options = options || {};
+  options.gzip = true;
+  return deflate(input, options);
 }
 
-// sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
-// combines selection algorithm with binary divide & conquer approach
 
-function multiSelect(arr, left, right, n, compare) {
-    var stack = [left, right],
-        mid;
+exports.Deflate = Deflate;
+exports.deflate = deflate;
+exports.deflateRaw = deflateRaw;
+exports.gzip = gzip;
+
+},{"./utils/common":26,"./utils/strings":27,"./zlib/deflate":31,"./zlib/messages":36,"./zlib/zstream":38}],25:[function(require,module,exports){
+'use strict';
+
+
+var zlib_inflate = require('./zlib/inflate');
+var utils        = require('./utils/common');
+var strings      = require('./utils/strings');
+var c            = require('./zlib/constants');
+var msg          = require('./zlib/messages');
+var ZStream      = require('./zlib/zstream');
+var GZheader     = require('./zlib/gzheader');
+
+var toString = Object.prototype.toString;
+
+/**
+ * class Inflate
+ *
+ * Generic JS-style wrapper for zlib calls. If you don't need
+ * streaming behaviour - use more simple functions: [[inflate]]
+ * and [[inflateRaw]].
+ **/
+
+/* internal
+ * inflate.chunks -> Array
+ *
+ * Chunks of output data, if [[Inflate#onData]] not overridden.
+ **/
+
+/**
+ * Inflate.result -> Uint8Array|Array|String
+ *
+ * Uncompressed result, generated by default [[Inflate#onData]]
+ * and [[Inflate#onEnd]] handlers. Filled after you push last chunk
+ * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you
+ * push a chunk with explicit flush (call [[Inflate#push]] with
+ * `Z_SYNC_FLUSH` param).
+ **/
+
+/**
+ * Inflate.err -> Number
+ *
+ * Error code after inflate finished. 0 (Z_OK) on success.
+ * Should be checked if broken data possible.
+ **/
+
+/**
+ * Inflate.msg -> String
+ *
+ * Error message, if [[Inflate.err]] != 0
+ **/
+
+
+/**
+ * new Inflate(options)
+ * - options (Object): zlib inflate options.
+ *
+ * Creates new inflator instance with specified params. Throws exception
+ * on bad params. Supported options:
+ *
+ * - `windowBits`
+ * - `dictionary`
+ *
+ * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
+ * for more information on these.
+ *
+ * Additional options, for internal needs:
+ *
+ * - `chunkSize` - size of generated data chunks (16K by default)
+ * - `raw` (Boolean) - do raw inflate
+ * - `to` (String) - if equal to 'string', then result will be converted
+ *   from utf8 to utf16 (javascript) string. When string output requested,
+ *   chunk length can differ from `chunkSize`, depending on content.
+ *
+ * By default, when no options set, autodetect deflate/gzip data format via
+ * wrapper header.
+ *
+ * ##### Example:
+ *
+ * ```javascript
+ * var pako = require('pako')
+ *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
+ *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
+ *
+ * var inflate = new pako.Inflate({ level: 3});
+ *
+ * inflate.push(chunk1, false);
+ * inflate.push(chunk2, true);  // true -> last chunk
+ *
+ * if (inflate.err) { throw new Error(inflate.err); }
+ *
+ * console.log(inflate.result);
+ * ```
+ **/
+function Inflate(options) {
+  if (!(this instanceof Inflate)) return new Inflate(options);
+
+  this.options = utils.assign({
+    chunkSize: 16384,
+    windowBits: 0,
+    to: ''
+  }, options || {});
+
+  var opt = this.options;
+
+  // Force window size for `raw` data, if not set directly,
+  // because we have no header for autodetect.
+  if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {
+    opt.windowBits = -opt.windowBits;
+    if (opt.windowBits === 0) { opt.windowBits = -15; }
+  }
+
+  // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate
+  if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&
+      !(options && options.windowBits)) {
+    opt.windowBits += 32;
+  }
+
+  // Gzip header has no info about windows size, we can do autodetect only
+  // for deflate. So, if window size not set, force it to max when gzip possible
+  if ((opt.windowBits > 15) && (opt.windowBits < 48)) {
+    // bit 3 (16) -> gzipped data
+    // bit 4 (32) -> autodetect gzip/deflate
+    if ((opt.windowBits & 15) === 0) {
+      opt.windowBits |= 15;
+    }
+  }
+
+  this.err    = 0;      // error code, if happens (0 = Z_OK)
+  this.msg    = '';     // error message
+  this.ended  = false;  // used to avoid multiple onEnd() calls
+  this.chunks = [];     // chunks of compressed data
+
+  this.strm   = new ZStream();
+  this.strm.avail_out = 0;
+
+  var status  = zlib_inflate.inflateInit2(
+    this.strm,
+    opt.windowBits
+  );
 
-    while (stack.length) {
-        right = stack.pop();
-        left = stack.pop();
+  if (status !== c.Z_OK) {
+    throw new Error(msg[status]);
+  }
 
-        if (right - left <= n) continue;
+  this.header = new GZheader();
 
-        mid = left + Math.ceil((right - left) / n / 2) * n;
-        quickselect(arr, mid, left, right, compare);
+  zlib_inflate.inflateGetHeader(this.strm, this.header);
 
-        stack.push(left, mid, mid, right);
+  // Setup dictionary
+  if (opt.dictionary) {
+    // Convert data if needed
+    if (typeof opt.dictionary === 'string') {
+      opt.dictionary = strings.string2buf(opt.dictionary);
+    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {
+      opt.dictionary = new Uint8Array(opt.dictionary);
+    }
+    if (opt.raw) { //In raw mode we need to set the dictionary early
+      status = zlib_inflate.inflateSetDictionary(this.strm, opt.dictionary);
+      if (status !== c.Z_OK) {
+        throw new Error(msg[status]);
+      }
     }
+  }
 }
 
-},{"quickselect":24}],26:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subject_1 = require('./Subject');
-var ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError');
 /**
- * @class BehaviorSubject<T>
- */
-var BehaviorSubject = (function (_super) {
-    __extends(BehaviorSubject, _super);
-    function BehaviorSubject(_value) {
-        _super.call(this);
-        this._value = _value;
+ * Inflate#push(data[, mode]) -> Boolean
+ * - data (Uint8Array|Array|ArrayBuffer|String): input data
+ * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
+ *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.
+ *
+ * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with
+ * new output chunks. Returns `true` on success. The last data block must have
+ * mode Z_FINISH (or `true`). That will flush internal pending buffers and call
+ * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you
+ * can use mode Z_SYNC_FLUSH, keeping the decompression context.
+ *
+ * On fail call [[Inflate#onEnd]] with error code and return false.
+ *
+ * We strongly recommend to use `Uint8Array` on input for best speed (output
+ * format is detected automatically). Also, don't skip last param and always
+ * use the same type in your code (boolean or number). That will improve JS speed.
+ *
+ * For regular `Array`-s make sure all elements are [0..255].
+ *
+ * ##### Example
+ *
+ * ```javascript
+ * push(chunk, false); // push one of data chunks
+ * ...
+ * push(chunk, true);  // push last chunk
+ * ```
+ **/
+Inflate.prototype.push = function (data, mode) {
+  var strm = this.strm;
+  var chunkSize = this.options.chunkSize;
+  var dictionary = this.options.dictionary;
+  var status, _mode;
+  var next_out_utf8, tail, utf8str;
+
+  // Flag to properly process Z_BUF_ERROR on testing inflate call
+  // when we check that all output data was flushed.
+  var allowBufError = false;
+
+  if (this.ended) { return false; }
+  _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);
+
+  // Convert data if needed
+  if (typeof data === 'string') {
+    // Only binary strings can be decompressed on practice
+    strm.input = strings.binstring2buf(data);
+  } else if (toString.call(data) === '[object ArrayBuffer]') {
+    strm.input = new Uint8Array(data);
+  } else {
+    strm.input = data;
+  }
+
+  strm.next_in = 0;
+  strm.avail_in = strm.input.length;
+
+  do {
+    if (strm.avail_out === 0) {
+      strm.output = new utils.Buf8(chunkSize);
+      strm.next_out = 0;
+      strm.avail_out = chunkSize;
     }
-    Object.defineProperty(BehaviorSubject.prototype, "value", {
-        get: function () {
-            return this.getValue();
-        },
-        enumerable: true,
-        configurable: true
-    });
-    BehaviorSubject.prototype._subscribe = function (subscriber) {
-        var subscription = _super.prototype._subscribe.call(this, subscriber);
-        if (subscription && !subscription.closed) {
-            subscriber.next(this._value);
-        }
-        return subscription;
-    };
-    BehaviorSubject.prototype.getValue = function () {
-        if (this.hasError) {
-            throw this.thrownError;
-        }
-        else if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else {
-            return this._value;
+
+    status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);    /* no bad return value */
+
+    if (status === c.Z_NEED_DICT && dictionary) {
+      status = zlib_inflate.inflateSetDictionary(this.strm, dictionary);
+    }
+
+    if (status === c.Z_BUF_ERROR && allowBufError === true) {
+      status = c.Z_OK;
+      allowBufError = false;
+    }
+
+    if (status !== c.Z_STREAM_END && status !== c.Z_OK) {
+      this.onEnd(status);
+      this.ended = true;
+      return false;
+    }
+
+    if (strm.next_out) {
+      if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {
+
+        if (this.options.to === 'string') {
+
+          next_out_utf8 = strings.utf8border(strm.output, strm.next_out);
+
+          tail = strm.next_out - next_out_utf8;
+          utf8str = strings.buf2string(strm.output, next_out_utf8);
+
+          // move tail
+          strm.next_out = tail;
+          strm.avail_out = chunkSize - tail;
+          if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }
+
+          this.onData(utf8str);
+
+        } else {
+          this.onData(utils.shrinkBuf(strm.output, strm.next_out));
         }
-    };
-    BehaviorSubject.prototype.next = function (value) {
-        _super.prototype.next.call(this, this._value = value);
-    };
-    return BehaviorSubject;
-}(Subject_1.Subject));
-exports.BehaviorSubject = BehaviorSubject;
+      }
+    }
 
-},{"./Subject":34,"./util/ObjectUnsubscribedError":160}],27:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    // When no more input data, we should check that internal inflate buffers
+    // are flushed. The only way to do it when avail_out = 0 - run one more
+    // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.
+    // Here we set flag to process this error properly.
+    //
+    // NOTE. Deflate does not return error in this case and does not needs such
+    // logic.
+    if (strm.avail_in === 0 && strm.avail_out === 0) {
+      allowBufError = true;
+    }
+
+  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);
+
+  if (status === c.Z_STREAM_END) {
+    _mode = c.Z_FINISH;
+  }
+
+  // Finalize on the last chunk.
+  if (_mode === c.Z_FINISH) {
+    status = zlib_inflate.inflateEnd(this.strm);
+    this.onEnd(status);
+    this.ended = true;
+    return status === c.Z_OK;
+  }
+
+  // callback interim results if Z_SYNC_FLUSH.
+  if (_mode === c.Z_SYNC_FLUSH) {
+    this.onEnd(c.Z_OK);
+    strm.avail_out = 0;
+    return true;
+  }
+
+  return true;
 };
-var Subscriber_1 = require('./Subscriber');
+
+
 /**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var InnerSubscriber = (function (_super) {
-    __extends(InnerSubscriber, _super);
-    function InnerSubscriber(parent, outerValue, outerIndex) {
-        _super.call(this);
-        this.parent = parent;
-        this.outerValue = outerValue;
-        this.outerIndex = outerIndex;
-        this.index = 0;
-    }
-    InnerSubscriber.prototype._next = function (value) {
-        this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);
-    };
-    InnerSubscriber.prototype._error = function (error) {
-        this.parent.notifyError(error, this);
-        this.unsubscribe();
-    };
-    InnerSubscriber.prototype._complete = function () {
-        this.parent.notifyComplete(this);
-        this.unsubscribe();
-    };
-    return InnerSubscriber;
-}(Subscriber_1.Subscriber));
-exports.InnerSubscriber = InnerSubscriber;
+ * Inflate#onData(chunk) -> Void
+ * - chunk (Uint8Array|Array|String): output data. Type of array depends
+ *   on js engine support. When string output requested, each chunk
+ *   will be string.
+ *
+ * By default, stores data blocks in `chunks[]` property and glue
+ * those in `onEnd`. Override this handler, if you need another behaviour.
+ **/
+Inflate.prototype.onData = function (chunk) {
+  this.chunks.push(chunk);
+};
+
 
-},{"./Subscriber":36}],28:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('./Observable');
 /**
- * Represents a push-based event or value that an {@link Observable} can emit.
- * This class is particularly useful for operators that manage notifications,
- * like {@link materialize}, {@link dematerialize}, {@link observeOn}, and
- * others. Besides wrapping the actual delivered value, it also annotates it
- * with metadata of, for instance, what type of push message it is (`next`,
- * `error`, or `complete`).
- *
- * @see {@link materialize}
- * @see {@link dematerialize}
- * @see {@link observeOn}
- *
- * @class Notification<T>
- */
-var Notification = (function () {
-    function Notification(kind, value, error) {
-        this.kind = kind;
-        this.value = value;
-        this.error = error;
-        this.hasValue = kind === 'N';
+ * Inflate#onEnd(status) -> Void
+ * - status (Number): inflate status. 0 (Z_OK) on success,
+ *   other if not.
+ *
+ * Called either after you tell inflate that the input stream is
+ * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)
+ * or if an error happened. By default - join collected chunks,
+ * free memory and fill `results` / `err` properties.
+ **/
+Inflate.prototype.onEnd = function (status) {
+  // On success - join
+  if (status === c.Z_OK) {
+    if (this.options.to === 'string') {
+      // Glue & convert here, until we teach pako to send
+      // utf8 aligned strings to onData
+      this.result = this.chunks.join('');
+    } else {
+      this.result = utils.flattenChunks(this.chunks);
     }
-    /**
-     * Delivers to the given `observer` the value wrapped by this Notification.
-     * @param {Observer} observer
-     * @return
-     */
-    Notification.prototype.observe = function (observer) {
-        switch (this.kind) {
-            case 'N':
-                return observer.next && observer.next(this.value);
-            case 'E':
-                return observer.error && observer.error(this.error);
-            case 'C':
-                return observer.complete && observer.complete();
-        }
-    };
-    /**
-     * Given some {@link Observer} callbacks, deliver the value represented by the
-     * current Notification to the correctly corresponding callback.
-     * @param {function(value: T): void} next An Observer `next` callback.
-     * @param {function(err: any): void} [error] An Observer `error` callback.
-     * @param {function(): void} [complete] An Observer `complete` callback.
-     * @return {any}
-     */
-    Notification.prototype.do = function (next, error, complete) {
-        var kind = this.kind;
-        switch (kind) {
-            case 'N':
-                return next && next(this.value);
-            case 'E':
-                return error && error(this.error);
-            case 'C':
-                return complete && complete();
-        }
-    };
-    /**
-     * Takes an Observer or its individual callback functions, and calls `observe`
-     * or `do` methods accordingly.
-     * @param {Observer|function(value: T): void} nextOrObserver An Observer or
-     * the `next` callback.
-     * @param {function(err: any): void} [error] An Observer `error` callback.
-     * @param {function(): void} [complete] An Observer `complete` callback.
-     * @return {any}
-     */
-    Notification.prototype.accept = function (nextOrObserver, error, complete) {
-        if (nextOrObserver && typeof nextOrObserver.next === 'function') {
-            return this.observe(nextOrObserver);
-        }
-        else {
-            return this.do(nextOrObserver, error, complete);
-        }
-    };
-    /**
-     * Returns a simple Observable that just delivers the notification represented
-     * by this Notification instance.
-     * @return {any}
-     */
-    Notification.prototype.toObservable = function () {
-        var kind = this.kind;
-        switch (kind) {
-            case 'N':
-                return Observable_1.Observable.of(this.value);
-            case 'E':
-                return Observable_1.Observable.throw(this.error);
-            case 'C':
-                return Observable_1.Observable.empty();
-        }
-        throw new Error('unexpected notification kind value');
-    };
-    /**
-     * A shortcut to create a Notification instance of the type `next` from a
-     * given value.
-     * @param {T} value The `next` value.
-     * @return {Notification<T>} The "next" Notification representing the
-     * argument.
-     */
-    Notification.createNext = function (value) {
-        if (typeof value !== 'undefined') {
-            return new Notification('N', value);
-        }
-        return Notification.undefinedValueNotification;
-    };
-    /**
-     * A shortcut to create a Notification instance of the type `error` from a
-     * given error.
-     * @param {any} [err] The `error` error.
-     * @return {Notification<T>} The "error" Notification representing the
-     * argument.
-     */
-    Notification.createError = function (err) {
-        return new Notification('E', undefined, err);
-    };
-    /**
-     * A shortcut to create a Notification instance of the type `complete`.
-     * @return {Notification<any>} The valueless "complete" Notification.
-     */
-    Notification.createComplete = function () {
-        return Notification.completeNotification;
-    };
-    Notification.completeNotification = new Notification('C');
-    Notification.undefinedValueNotification = new Notification('N', undefined);
-    return Notification;
-}());
-exports.Notification = Notification;
+  }
+  this.chunks = [];
+  this.err = status;
+  this.msg = this.strm.msg;
+};
+
 
-},{"./Observable":29}],29:[function(require,module,exports){
-"use strict";
-var root_1 = require('./util/root');
-var toSubscriber_1 = require('./util/toSubscriber');
-var observable_1 = require('./symbol/observable');
 /**
- * A representation of any set of values over any amount of time. This the most basic building block
- * of RxJS.
+ * inflate(data[, options]) -> Uint8Array|Array|String
+ * - data (Uint8Array|Array|String): input data to decompress.
+ * - options (Object): zlib inflate options.
  *
- * @class Observable<T>
- */
-var Observable = (function () {
-    /**
-     * @constructor
-     * @param {Function} subscribe the function that is  called when the Observable is
-     * initially subscribed to. This function is given a Subscriber, to which new values
-     * can be `next`ed, or an `error` method can be called to raise an error, or
-     * `complete` can be called to notify of a successful completion.
-     */
-    function Observable(subscribe) {
-        this._isScalar = false;
-        if (subscribe) {
-            this._subscribe = subscribe;
-        }
-    }
-    /**
-     * Creates a new Observable, with this Observable as the source, and the passed
-     * operator defined as the new observable's operator.
-     * @method lift
-     * @param {Operator} operator the operator defining the operation to take on the observable
-     * @return {Observable} a new observable with the Operator applied
-     */
-    Observable.prototype.lift = function (operator) {
-        var observable = new Observable();
-        observable.source = this;
-        observable.operator = operator;
-        return observable;
-    };
-    /**
-     * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.
-     *
-     * <span class="informal">Use it when you have all these Observables, but still nothing is happening.</span>
-     *
-     * `subscribe` is not a regular operator, but a method that calls Observables internal `subscribe` function. It
-     * might be for example a function that you passed to a {@link create} static factory, but most of the time it is
-     * a library implementation, which defines what and when will be emitted by an Observable. This means that calling
-     * `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often
-     * thought.
-     *
-     * Apart from starting the execution of an Observable, this method allows you to listen for values
-     * that an Observable emits, as well as for when it completes or errors. You can achieve this in two
-     * following ways.
-     *
-     * The first way is creating an object that implements {@link Observer} interface. It should have methods
-     * defined by that interface, but note that it should be just a regular JavaScript object, which you can create
-     * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular do
-     * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also
-     * that your object does not have to implement all methods. If you find yourself creating a method that doesn't
-     * do anything, you can simply omit it. Note however, that if `error` method is not provided, all errors will
-     * be left uncaught.
-     *
-     * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.
-     * This means you can provide three functions as arguments to `subscribe`, where first function is equivalent
-     * of a `next` method, second of an `error` method and third of a `complete` method. Just as in case of Observer,
-     * if you do not need to listen for something, you can omit a function, preferably by passing `undefined` or `null`,
-     * since `subscribe` recognizes these functions by where they were placed in function call. When it comes
-     * to `error` function, just as before, if not provided, errors emitted by an Observable will be thrown.
-     *
-     * Whatever style of calling `subscribe` you use, in both cases it returns a Subscription object.
-     * This object allows you to call `unsubscribe` on it, which in turn will stop work that an Observable does and will clean
-     * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback
-     * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.
-     *
-     * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.
-     * It is an Observable itself that decides when these functions will be called. For example {@link of}
-     * by default emits all its values synchronously. Always check documentation for how given Observable
-     * will behave when subscribed and if its default behavior can be modified with a {@link Scheduler}.
-     *
-     * @example <caption>Subscribe with an Observer</caption>
-     * const sumObserver = {
-     *   sum: 0,
-     *   next(value) {
-     *     console.log('Adding: ' + value);
-     *     this.sum = this.sum + value;
-     *   },
-     *   error() { // We actually could just remote this method,
-     *   },        // since we do not really care about errors right now.
-     *   complete() {
-     *     console.log('Sum equals: ' + this.sum);
-     *   }
-     * };
-     *
-     * Rx.Observable.of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.
-     * .subscribe(sumObserver);
-     *
-     * // Logs:
-     * // "Adding: 1"
-     * // "Adding: 2"
-     * // "Adding: 3"
-     * // "Sum equals: 6"
-     *
-     *
-     * @example <caption>Subscribe with functions</caption>
-     * let sum = 0;
-     *
-     * Rx.Observable.of(1, 2, 3)
-     * .subscribe(
-     *   function(value) {
-     *     console.log('Adding: ' + value);
-     *     sum = sum + value;
-     *   },
-     *   undefined,
-     *   function() {
-     *     console.log('Sum equals: ' + sum);
-     *   }
-     * );
-     *
-     * // Logs:
-     * // "Adding: 1"
-     * // "Adding: 2"
-     * // "Adding: 3"
-     * // "Sum equals: 6"
-     *
-     *
-     * @example <caption>Cancel a subscription</caption>
-     * const subscription = Rx.Observable.interval(1000).subscribe(
-     *   num => console.log(num),
-     *   undefined,
-     *   () => console.log('completed!') // Will not be called, even
-     * );                                // when cancelling subscription
-     *
-     *
-     * setTimeout(() => {
-     *   subscription.unsubscribe();
-     *   console.log('unsubscribed!');
-     * }, 2500);
-     *
-     * // Logs:
-     * // 0 after 1s
-     * // 1 after 2s
-     * // "unsubscribed!" after 2,5s
-     *
-     *
-     * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,
-     *  or the first of three possible handlers, which is the handler for each value emitted from the subscribed
-     *  Observable.
-     * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,
-     *  the error will be thrown as unhandled.
-     * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.
-     * @return {ISubscription} a subscription reference to the registered handlers
-     * @method subscribe
-     */
-    Observable.prototype.subscribe = function (observerOrNext, error, complete) {
-        var operator = this.operator;
-        var sink = toSubscriber_1.toSubscriber(observerOrNext, error, complete);
-        if (operator) {
-            operator.call(sink, this.source);
-        }
-        else {
-            sink.add(this.source ? this._subscribe(sink) : this._trySubscribe(sink));
-        }
-        if (sink.syncErrorThrowable) {
-            sink.syncErrorThrowable = false;
-            if (sink.syncErrorThrown) {
-                throw sink.syncErrorValue;
-            }
-        }
-        return sink;
-    };
-    Observable.prototype._trySubscribe = function (sink) {
-        try {
-            return this._subscribe(sink);
-        }
-        catch (err) {
-            sink.syncErrorThrown = true;
-            sink.syncErrorValue = err;
-            sink.error(err);
-        }
-    };
-    /**
-     * @method forEach
-     * @param {Function} next a handler for each value emitted by the observable
-     * @param {PromiseConstructor} [PromiseCtor] a constructor function used to instantiate the Promise
-     * @return {Promise} a promise that either resolves on observable completion or
-     *  rejects with the handled error
-     */
-    Observable.prototype.forEach = function (next, PromiseCtor) {
-        var _this = this;
-        if (!PromiseCtor) {
-            if (root_1.root.Rx && root_1.root.Rx.config && root_1.root.Rx.config.Promise) {
-                PromiseCtor = root_1.root.Rx.config.Promise;
-            }
-            else if (root_1.root.Promise) {
-                PromiseCtor = root_1.root.Promise;
-            }
-        }
-        if (!PromiseCtor) {
-            throw new Error('no Promise impl found');
-        }
-        return new PromiseCtor(function (resolve, reject) {
-            // Must be declared in a separate statement to avoid a RefernceError when
-            // accessing subscription below in the closure due to Temporal Dead Zone.
-            var subscription;
-            subscription = _this.subscribe(function (value) {
-                if (subscription) {
-                    // if there is a subscription, then we can surmise
-                    // the next handling is asynchronous. Any errors thrown
-                    // need to be rejected explicitly and unsubscribe must be
-                    // called manually
-                    try {
-                        next(value);
-                    }
-                    catch (err) {
-                        reject(err);
-                        subscription.unsubscribe();
-                    }
-                }
-                else {
-                    // if there is NO subscription, then we're getting a nexted
-                    // value synchronously during subscription. We can just call it.
-                    // If it errors, Observable's `subscribe` will ensure the
-                    // unsubscription logic is called, then synchronously rethrow the error.
-                    // After that, Promise will trap the error and send it
-                    // down the rejection path.
-                    next(value);
-                }
-            }, reject, resolve);
-        });
-    };
-    Observable.prototype._subscribe = function (subscriber) {
-        return this.source.subscribe(subscriber);
-    };
-    /**
-     * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable
-     * @method Symbol.observable
-     * @return {Observable} this instance of the observable
-     */
-    Observable.prototype[observable_1.observable] = function () {
-        return this;
-    };
-    // HACK: Since TypeScript inherits static properties too, we have to
-    // fight against TypeScript here so Subject can have a different static create signature
-    /**
-     * Creates a new cold Observable by calling the Observable constructor
-     * @static true
-     * @owner Observable
-     * @method create
-     * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor
-     * @return {Observable} a new cold observable
-     */
-    Observable.create = function (subscribe) {
-        return new Observable(subscribe);
-    };
-    return Observable;
-}());
-exports.Observable = Observable;
+ * Decompress `data` with inflate/ungzip and `options`. Autodetect
+ * format via wrapper header by default. That's why we don't provide
+ * separate `ungzip` method.
+ *
+ * Supported options are:
+ *
+ * - windowBits
+ *
+ * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
+ * for more information.
+ *
+ * Sugar (options):
+ *
+ * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
+ *   negative windowBits implicitly.
+ * - `to` (String) - if equal to 'string', then result will be converted
+ *   from utf8 to utf16 (javascript) string. When string output requested,
+ *   chunk length can differ from `chunkSize`, depending on content.
+ *
+ *
+ * ##### Example:
+ *
+ * ```javascript
+ * var pako = require('pako')
+ *   , input = pako.deflate([1,2,3,4,5,6,7,8,9])
+ *   , output;
+ *
+ * try {
+ *   output = pako.inflate(input);
+ * } catch (err)
+ *   console.log(err);
+ * }
+ * ```
+ **/
+function inflate(input, options) {
+  var inflator = new Inflate(options);
+
+  inflator.push(input, true);
+
+  // That will never happens, if you don't cheat with options :)
+  if (inflator.err) { throw inflator.msg || msg[inflator.err]; }
+
+  return inflator.result;
+}
 
-},{"./symbol/observable":155,"./util/root":172,"./util/toSubscriber":174}],30:[function(require,module,exports){
-"use strict";
-exports.empty = {
-    closed: true,
-    next: function (value) { },
-    error: function (err) { throw err; },
-    complete: function () { }
-};
 
-},{}],31:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('./Subscriber');
 /**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var OuterSubscriber = (function (_super) {
-    __extends(OuterSubscriber, _super);
-    function OuterSubscriber() {
-        _super.apply(this, arguments);
+ * inflateRaw(data[, options]) -> Uint8Array|Array|String
+ * - data (Uint8Array|Array|String): input data to decompress.
+ * - options (Object): zlib inflate options.
+ *
+ * The same as [[inflate]], but creates raw data, without wrapper
+ * (header and adler32 crc).
+ **/
+function inflateRaw(input, options) {
+  options = options || {};
+  options.raw = true;
+  return inflate(input, options);
+}
+
+
+/**
+ * ungzip(data[, options]) -> Uint8Array|Array|String
+ * - data (Uint8Array|Array|String): input data to decompress.
+ * - options (Object): zlib inflate options.
+ *
+ * Just shortcut to [[inflate]], because it autodetects format
+ * by header.content. Done for convenience.
+ **/
+
+
+exports.Inflate = Inflate;
+exports.inflate = inflate;
+exports.inflateRaw = inflateRaw;
+exports.ungzip  = inflate;
+
+},{"./utils/common":26,"./utils/strings":27,"./zlib/constants":29,"./zlib/gzheader":32,"./zlib/inflate":34,"./zlib/messages":36,"./zlib/zstream":38}],26:[function(require,module,exports){
+'use strict';
+
+
+var TYPED_OK =  (typeof Uint8Array !== 'undefined') &&
+                (typeof Uint16Array !== 'undefined') &&
+                (typeof Int32Array !== 'undefined');
+
+function _has(obj, key) {
+  return Object.prototype.hasOwnProperty.call(obj, key);
+}
+
+exports.assign = function (obj /*from1, from2, from3, ...*/) {
+  var sources = Array.prototype.slice.call(arguments, 1);
+  while (sources.length) {
+    var source = sources.shift();
+    if (!source) { continue; }
+
+    if (typeof source !== 'object') {
+      throw new TypeError(source + 'must be non-object');
     }
-    OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    OuterSubscriber.prototype.notifyError = function (error, innerSub) {
-        this.destination.error(error);
-    };
-    OuterSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.destination.complete();
-    };
-    return OuterSubscriber;
-}(Subscriber_1.Subscriber));
-exports.OuterSubscriber = OuterSubscriber;
 
-},{"./Subscriber":36}],32:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    for (var p in source) {
+      if (_has(source, p)) {
+        obj[p] = source[p];
+      }
+    }
+  }
+
+  return obj;
 };
-var Subject_1 = require('./Subject');
-var queue_1 = require('./scheduler/queue');
-var Subscription_1 = require('./Subscription');
-var observeOn_1 = require('./operator/observeOn');
-var ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError');
-var SubjectSubscription_1 = require('./SubjectSubscription');
-/**
- * @class ReplaySubject<T>
- */
-var ReplaySubject = (function (_super) {
-    __extends(ReplaySubject, _super);
-    function ReplaySubject(bufferSize, windowTime, scheduler) {
-        if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }
-        if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }
-        _super.call(this);
-        this.scheduler = scheduler;
-        this._events = [];
-        this._bufferSize = bufferSize < 1 ? 1 : bufferSize;
-        this._windowTime = windowTime < 1 ? 1 : windowTime;
+
+
+// reduce buffer size, avoiding mem copy
+exports.shrinkBuf = function (buf, size) {
+  if (buf.length === size) { return buf; }
+  if (buf.subarray) { return buf.subarray(0, size); }
+  buf.length = size;
+  return buf;
+};
+
+
+var fnTyped = {
+  arraySet: function (dest, src, src_offs, len, dest_offs) {
+    if (src.subarray && dest.subarray) {
+      dest.set(src.subarray(src_offs, src_offs + len), dest_offs);
+      return;
     }
-    ReplaySubject.prototype.next = function (value) {
-        var now = this._getNow();
-        this._events.push(new ReplayEvent(now, value));
-        this._trimBufferThenGetEvents();
-        _super.prototype.next.call(this, value);
-    };
-    ReplaySubject.prototype._subscribe = function (subscriber) {
-        var _events = this._trimBufferThenGetEvents();
-        var scheduler = this.scheduler;
-        var subscription;
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else if (this.hasError) {
-            subscription = Subscription_1.Subscription.EMPTY;
-        }
-        else if (this.isStopped) {
-            subscription = Subscription_1.Subscription.EMPTY;
-        }
-        else {
-            this.observers.push(subscriber);
-            subscription = new SubjectSubscription_1.SubjectSubscription(this, subscriber);
-        }
-        if (scheduler) {
-            subscriber.add(subscriber = new observeOn_1.ObserveOnSubscriber(subscriber, scheduler));
-        }
-        var len = _events.length;
-        for (var i = 0; i < len && !subscriber.closed; i++) {
-            subscriber.next(_events[i].value);
-        }
-        if (this.hasError) {
-            subscriber.error(this.thrownError);
-        }
-        else if (this.isStopped) {
-            subscriber.complete();
-        }
-        return subscription;
-    };
-    ReplaySubject.prototype._getNow = function () {
-        return (this.scheduler || queue_1.queue).now();
-    };
-    ReplaySubject.prototype._trimBufferThenGetEvents = function () {
-        var now = this._getNow();
-        var _bufferSize = this._bufferSize;
-        var _windowTime = this._windowTime;
-        var _events = this._events;
-        var eventsCount = _events.length;
-        var spliceCount = 0;
-        // Trim events that fall out of the time window.
-        // Start at the front of the list. Break early once
-        // we encounter an event that falls within the window.
-        while (spliceCount < eventsCount) {
-            if ((now - _events[spliceCount].time) < _windowTime) {
-                break;
-            }
-            spliceCount++;
-        }
-        if (eventsCount > _bufferSize) {
-            spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);
-        }
-        if (spliceCount > 0) {
-            _events.splice(0, spliceCount);
-        }
-        return _events;
-    };
-    return ReplaySubject;
-}(Subject_1.Subject));
-exports.ReplaySubject = ReplaySubject;
-var ReplayEvent = (function () {
-    function ReplayEvent(time, value) {
-        this.time = time;
-        this.value = value;
+    // Fallback to ordinary array
+    for (var i = 0; i < len; i++) {
+      dest[dest_offs + i] = src[src_offs + i];
     }
-    return ReplayEvent;
-}());
+  },
+  // Join array of chunks to single array.
+  flattenChunks: function (chunks) {
+    var i, l, len, pos, chunk, result;
 
-},{"./Subject":34,"./SubjectSubscription":35,"./Subscription":37,"./operator/observeOn":129,"./scheduler/queue":153,"./util/ObjectUnsubscribedError":160}],33:[function(require,module,exports){
-"use strict";
-/**
- * An execution context and a data structure to order tasks and schedule their
- * execution. Provides a notion of (potentially virtual) time, through the
- * `now()` getter method.
- *
- * Each unit of work in a Scheduler is called an {@link Action}.
- *
- * ```ts
- * class Scheduler {
- *   now(): number;
- *   schedule(work, delay?, state?): Subscription;
- * }
- * ```
- *
- * @class Scheduler
- */
-var Scheduler = (function () {
-    function Scheduler(SchedulerAction, now) {
-        if (now === void 0) { now = Scheduler.now; }
-        this.SchedulerAction = SchedulerAction;
-        this.now = now;
+    // calculate data length
+    len = 0;
+    for (i = 0, l = chunks.length; i < l; i++) {
+      len += chunks[i].length;
     }
-    /**
-     * Schedules a function, `work`, for execution. May happen at some point in
-     * the future, according to the `delay` parameter, if specified. May be passed
-     * some context object, `state`, which will be passed to the `work` function.
-     *
-     * The given arguments will be processed an stored as an Action object in a
-     * queue of actions.
-     *
-     * @param {function(state: ?T): ?Subscription} work A function representing a
-     * task, or some unit of work to be executed by the Scheduler.
-     * @param {number} [delay] Time to wait before executing the work, where the
-     * time unit is implicit and defined by the Scheduler itself.
-     * @param {T} [state] Some contextual data that the `work` function uses when
-     * called by the Scheduler.
-     * @return {Subscription} A subscription in order to be able to unsubscribe
-     * the scheduled work.
-     */
-    Scheduler.prototype.schedule = function (work, delay, state) {
-        if (delay === void 0) { delay = 0; }
-        return new this.SchedulerAction(this, work).schedule(state, delay);
-    };
-    Scheduler.now = Date.now ? Date.now : function () { return +new Date(); };
-    return Scheduler;
-}());
-exports.Scheduler = Scheduler;
 
-},{}],34:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    // join chunks
+    result = new Uint8Array(len);
+    pos = 0;
+    for (i = 0, l = chunks.length; i < l; i++) {
+      chunk = chunks[i];
+      result.set(chunk, pos);
+      pos += chunk.length;
+    }
+
+    return result;
+  }
 };
-var Observable_1 = require('./Observable');
-var Subscriber_1 = require('./Subscriber');
-var Subscription_1 = require('./Subscription');
-var ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError');
-var SubjectSubscription_1 = require('./SubjectSubscription');
-var rxSubscriber_1 = require('./symbol/rxSubscriber');
-/**
- * @class SubjectSubscriber<T>
- */
-var SubjectSubscriber = (function (_super) {
-    __extends(SubjectSubscriber, _super);
-    function SubjectSubscriber(destination) {
-        _super.call(this, destination);
-        this.destination = destination;
+
+var fnUntyped = {
+  arraySet: function (dest, src, src_offs, len, dest_offs) {
+    for (var i = 0; i < len; i++) {
+      dest[dest_offs + i] = src[src_offs + i];
     }
-    return SubjectSubscriber;
-}(Subscriber_1.Subscriber));
-exports.SubjectSubscriber = SubjectSubscriber;
-/**
- * @class Subject<T>
- */
-var Subject = (function (_super) {
-    __extends(Subject, _super);
-    function Subject() {
-        _super.call(this);
-        this.observers = [];
-        this.closed = false;
-        this.isStopped = false;
-        this.hasError = false;
-        this.thrownError = null;
+  },
+  // Join array of chunks to single array.
+  flattenChunks: function (chunks) {
+    return [].concat.apply([], chunks);
+  }
+};
+
+
+// Enable/Disable typed arrays use, for testing
+//
+exports.setTyped = function (on) {
+  if (on) {
+    exports.Buf8  = Uint8Array;
+    exports.Buf16 = Uint16Array;
+    exports.Buf32 = Int32Array;
+    exports.assign(exports, fnTyped);
+  } else {
+    exports.Buf8  = Array;
+    exports.Buf16 = Array;
+    exports.Buf32 = Array;
+    exports.assign(exports, fnUntyped);
+  }
+};
+
+exports.setTyped(TYPED_OK);
+
+},{}],27:[function(require,module,exports){
+// String encode/decode helpers
+'use strict';
+
+
+var utils = require('./common');
+
+
+// Quick check if we can use fast array to bin string conversion
+//
+// - apply(Array) can fail on Android 2.2
+// - apply(Uint8Array) can fail on iOS 5.1 Safari
+//
+var STR_APPLY_OK = true;
+var STR_APPLY_UIA_OK = true;
+
+try { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }
+try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }
+
+
+// Table with utf8 lengths (calculated by first byte of sequence)
+// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
+// because max possible codepoint is 0x10ffff
+var _utf8len = new utils.Buf8(256);
+for (var q = 0; q < 256; q++) {
+  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);
+}
+_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start
+
+
+// convert string to array (typed, when possible)
+exports.string2buf = function (str) {
+  var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
+
+  // count binary size
+  for (m_pos = 0; m_pos < str_len; m_pos++) {
+    c = str.charCodeAt(m_pos);
+    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {
+      c2 = str.charCodeAt(m_pos + 1);
+      if ((c2 & 0xfc00) === 0xdc00) {
+        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
+        m_pos++;
+      }
     }
-    Subject.prototype[rxSubscriber_1.rxSubscriber] = function () {
-        return new SubjectSubscriber(this);
-    };
-    Subject.prototype.lift = function (operator) {
-        var subject = new AnonymousSubject(this, this);
-        subject.operator = operator;
-        return subject;
-    };
-    Subject.prototype.next = function (value) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        if (!this.isStopped) {
-            var observers = this.observers;
-            var len = observers.length;
-            var copy = observers.slice();
-            for (var i = 0; i < len; i++) {
-                copy[i].next(value);
-            }
-        }
-    };
-    Subject.prototype.error = function (err) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        this.hasError = true;
-        this.thrownError = err;
-        this.isStopped = true;
-        var observers = this.observers;
-        var len = observers.length;
-        var copy = observers.slice();
-        for (var i = 0; i < len; i++) {
-            copy[i].error(err);
-        }
-        this.observers.length = 0;
-    };
-    Subject.prototype.complete = function () {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        this.isStopped = true;
-        var observers = this.observers;
-        var len = observers.length;
-        var copy = observers.slice();
-        for (var i = 0; i < len; i++) {
-            copy[i].complete();
-        }
-        this.observers.length = 0;
-    };
-    Subject.prototype.unsubscribe = function () {
-        this.isStopped = true;
-        this.closed = true;
-        this.observers = null;
-    };
-    Subject.prototype._trySubscribe = function (subscriber) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else {
-            return _super.prototype._trySubscribe.call(this, subscriber);
-        }
-    };
-    Subject.prototype._subscribe = function (subscriber) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else if (this.hasError) {
-            subscriber.error(this.thrownError);
-            return Subscription_1.Subscription.EMPTY;
-        }
-        else if (this.isStopped) {
-            subscriber.complete();
-            return Subscription_1.Subscription.EMPTY;
-        }
-        else {
-            this.observers.push(subscriber);
-            return new SubjectSubscription_1.SubjectSubscription(this, subscriber);
-        }
-    };
-    Subject.prototype.asObservable = function () {
-        var observable = new Observable_1.Observable();
-        observable.source = this;
-        return observable;
-    };
-    Subject.create = function (destination, source) {
-        return new AnonymousSubject(destination, source);
-    };
-    return Subject;
-}(Observable_1.Observable));
-exports.Subject = Subject;
-/**
- * @class AnonymousSubject<T>
- */
-var AnonymousSubject = (function (_super) {
-    __extends(AnonymousSubject, _super);
-    function AnonymousSubject(destination, source) {
-        _super.call(this);
-        this.destination = destination;
-        this.source = source;
+    buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
+  }
+
+  // allocate buffer
+  buf = new utils.Buf8(buf_len);
+
+  // convert
+  for (i = 0, m_pos = 0; i < buf_len; m_pos++) {
+    c = str.charCodeAt(m_pos);
+    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {
+      c2 = str.charCodeAt(m_pos + 1);
+      if ((c2 & 0xfc00) === 0xdc00) {
+        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
+        m_pos++;
+      }
     }
-    AnonymousSubject.prototype.next = function (value) {
-        var destination = this.destination;
-        if (destination && destination.next) {
-            destination.next(value);
-        }
-    };
-    AnonymousSubject.prototype.error = function (err) {
-        var destination = this.destination;
-        if (destination && destination.error) {
-            this.destination.error(err);
-        }
-    };
-    AnonymousSubject.prototype.complete = function () {
-        var destination = this.destination;
-        if (destination && destination.complete) {
-            this.destination.complete();
-        }
-    };
-    AnonymousSubject.prototype._subscribe = function (subscriber) {
-        var source = this.source;
-        if (source) {
-            return this.source.subscribe(subscriber);
-        }
-        else {
-            return Subscription_1.Subscription.EMPTY;
-        }
-    };
-    return AnonymousSubject;
-}(Subject));
-exports.AnonymousSubject = AnonymousSubject;
+    if (c < 0x80) {
+      /* one byte */
+      buf[i++] = c;
+    } else if (c < 0x800) {
+      /* two bytes */
+      buf[i++] = 0xC0 | (c >>> 6);
+      buf[i++] = 0x80 | (c & 0x3f);
+    } else if (c < 0x10000) {
+      /* three bytes */
+      buf[i++] = 0xE0 | (c >>> 12);
+      buf[i++] = 0x80 | (c >>> 6 & 0x3f);
+      buf[i++] = 0x80 | (c & 0x3f);
+    } else {
+      /* four bytes */
+      buf[i++] = 0xf0 | (c >>> 18);
+      buf[i++] = 0x80 | (c >>> 12 & 0x3f);
+      buf[i++] = 0x80 | (c >>> 6 & 0x3f);
+      buf[i++] = 0x80 | (c & 0x3f);
+    }
+  }
 
-},{"./Observable":29,"./SubjectSubscription":35,"./Subscriber":36,"./Subscription":37,"./symbol/rxSubscriber":156,"./util/ObjectUnsubscribedError":160}],35:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+  return buf;
 };
-var Subscription_1 = require('./Subscription');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var SubjectSubscription = (function (_super) {
-    __extends(SubjectSubscription, _super);
-    function SubjectSubscription(subject, subscriber) {
-        _super.call(this);
-        this.subject = subject;
-        this.subscriber = subscriber;
-        this.closed = false;
+
+// Helper (used in 2 places)
+function buf2binstring(buf, len) {
+  // On Chrome, the arguments in a function call that are allowed is `65534`.
+  // If the length of the buffer is smaller than that, we can use this optimization,
+  // otherwise we will take a slower path.
+  if (len < 65534) {
+    if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {
+      return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));
     }
-    SubjectSubscription.prototype.unsubscribe = function () {
-        if (this.closed) {
-            return;
-        }
-        this.closed = true;
-        var subject = this.subject;
-        var observers = subject.observers;
-        this.subject = null;
-        if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {
-            return;
-        }
-        var subscriberIndex = observers.indexOf(this.subscriber);
-        if (subscriberIndex !== -1) {
-            observers.splice(subscriberIndex, 1);
-        }
-    };
-    return SubjectSubscription;
-}(Subscription_1.Subscription));
-exports.SubjectSubscription = SubjectSubscription;
+  }
 
-},{"./Subscription":37}],36:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+  var result = '';
+  for (var i = 0; i < len; i++) {
+    result += String.fromCharCode(buf[i]);
+  }
+  return result;
+}
+
+
+// Convert byte array to binary string
+exports.buf2binstring = function (buf) {
+  return buf2binstring(buf, buf.length);
 };
-var isFunction_1 = require('./util/isFunction');
-var Subscription_1 = require('./Subscription');
-var Observer_1 = require('./Observer');
-var rxSubscriber_1 = require('./symbol/rxSubscriber');
-/**
- * Implements the {@link Observer} interface and extends the
- * {@link Subscription} class. While the {@link Observer} is the public API for
- * consuming the values of an {@link Observable}, all Observers get converted to
- * a Subscriber, in order to provide Subscription-like capabilities such as
- * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for
- * implementing operators, but it is rarely used as a public API.
- *
- * @class Subscriber<T>
- */
-var Subscriber = (function (_super) {
-    __extends(Subscriber, _super);
-    /**
-     * @param {Observer|function(value: T): void} [destinationOrNext] A partially
-     * defined Observer or a `next` callback function.
-     * @param {function(e: ?any): void} [error] The `error` callback of an
-     * Observer.
-     * @param {function(): void} [complete] The `complete` callback of an
-     * Observer.
-     */
-    function Subscriber(destinationOrNext, error, complete) {
-        _super.call(this);
-        this.syncErrorValue = null;
-        this.syncErrorThrown = false;
-        this.syncErrorThrowable = false;
-        this.isStopped = false;
-        switch (arguments.length) {
-            case 0:
-                this.destination = Observer_1.empty;
-                break;
-            case 1:
-                if (!destinationOrNext) {
-                    this.destination = Observer_1.empty;
-                    break;
-                }
-                if (typeof destinationOrNext === 'object') {
-                    if (destinationOrNext instanceof Subscriber) {
-                        this.destination = destinationOrNext;
-                        this.destination.add(this);
-                    }
-                    else {
-                        this.syncErrorThrowable = true;
-                        this.destination = new SafeSubscriber(this, destinationOrNext);
-                    }
-                    break;
-                }
-            default:
-                this.syncErrorThrowable = true;
-                this.destination = new SafeSubscriber(this, destinationOrNext, error, complete);
-                break;
-        }
+
+
+// Convert binary string (typed, when possible)
+exports.binstring2buf = function (str) {
+  var buf = new utils.Buf8(str.length);
+  for (var i = 0, len = buf.length; i < len; i++) {
+    buf[i] = str.charCodeAt(i);
+  }
+  return buf;
+};
+
+
+// convert array to string
+exports.buf2string = function (buf, max) {
+  var i, out, c, c_len;
+  var len = max || buf.length;
+
+  // Reserve max possible length (2 words per char)
+  // NB: by unknown reasons, Array is significantly faster for
+  //     String.fromCharCode.apply than Uint16Array.
+  var utf16buf = new Array(len * 2);
+
+  for (out = 0, i = 0; i < len;) {
+    c = buf[i++];
+    // quick process ascii
+    if (c < 0x80) { utf16buf[out++] = c; continue; }
+
+    c_len = _utf8len[c];
+    // skip 5 & 6 byte codes
+    if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }
+
+    // apply mask on first byte
+    c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
+    // join the rest
+    while (c_len > 1 && i < len) {
+      c = (c << 6) | (buf[i++] & 0x3f);
+      c_len--;
     }
-    Subscriber.prototype[rxSubscriber_1.rxSubscriber] = function () { return this; };
-    /**
-     * A static factory for a Subscriber, given a (potentially partial) definition
-     * of an Observer.
-     * @param {function(x: ?T): void} [next] The `next` callback of an Observer.
-     * @param {function(e: ?any): void} [error] The `error` callback of an
-     * Observer.
-     * @param {function(): void} [complete] The `complete` callback of an
-     * Observer.
-     * @return {Subscriber<T>} A Subscriber wrapping the (partially defined)
-     * Observer represented by the given arguments.
-     */
-    Subscriber.create = function (next, error, complete) {
-        var subscriber = new Subscriber(next, error, complete);
-        subscriber.syncErrorThrowable = false;
-        return subscriber;
-    };
-    /**
-     * The {@link Observer} callback to receive notifications of type `next` from
-     * the Observable, with a value. The Observable may call this method 0 or more
-     * times.
-     * @param {T} [value] The `next` value.
-     * @return {void}
-     */
-    Subscriber.prototype.next = function (value) {
-        if (!this.isStopped) {
-            this._next(value);
-        }
-    };
-    /**
-     * The {@link Observer} callback to receive notifications of type `error` from
-     * the Observable, with an attached {@link Error}. Notifies the Observer that
-     * the Observable has experienced an error condition.
-     * @param {any} [err] The `error` exception.
-     * @return {void}
-     */
-    Subscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            this.isStopped = true;
-            this._error(err);
-        }
-    };
-    /**
-     * The {@link Observer} callback to receive a valueless notification of type
-     * `complete` from the Observable. Notifies the Observer that the Observable
-     * has finished sending push-based notifications.
-     * @return {void}
-     */
-    Subscriber.prototype.complete = function () {
-        if (!this.isStopped) {
-            this.isStopped = true;
-            this._complete();
-        }
-    };
-    Subscriber.prototype.unsubscribe = function () {
-        if (this.closed) {
-            return;
-        }
-        this.isStopped = true;
-        _super.prototype.unsubscribe.call(this);
-    };
-    Subscriber.prototype._next = function (value) {
-        this.destination.next(value);
-    };
-    Subscriber.prototype._error = function (err) {
-        this.destination.error(err);
-        this.unsubscribe();
-    };
-    Subscriber.prototype._complete = function () {
-        this.destination.complete();
-        this.unsubscribe();
-    };
-    Subscriber.prototype._unsubscribeAndRecycle = function () {
-        var _a = this, _parent = _a._parent, _parents = _a._parents;
-        this._parent = null;
-        this._parents = null;
-        this.unsubscribe();
-        this.closed = false;
-        this.isStopped = false;
-        this._parent = _parent;
-        this._parents = _parents;
-        return this;
-    };
-    return Subscriber;
-}(Subscription_1.Subscription));
-exports.Subscriber = Subscriber;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var SafeSubscriber = (function (_super) {
-    __extends(SafeSubscriber, _super);
-    function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) {
-        _super.call(this);
-        this._parentSubscriber = _parentSubscriber;
-        var next;
-        var context = this;
-        if (isFunction_1.isFunction(observerOrNext)) {
-            next = observerOrNext;
-        }
-        else if (observerOrNext) {
-            next = observerOrNext.next;
-            error = observerOrNext.error;
-            complete = observerOrNext.complete;
-            if (observerOrNext !== Observer_1.empty) {
-                context = Object.create(observerOrNext);
-                if (isFunction_1.isFunction(context.unsubscribe)) {
-                    this.add(context.unsubscribe.bind(context));
-                }
-                context.unsubscribe = this.unsubscribe.bind(this);
-            }
-        }
-        this._context = context;
-        this._next = next;
-        this._error = error;
-        this._complete = complete;
-    }
-    SafeSubscriber.prototype.next = function (value) {
-        if (!this.isStopped && this._next) {
-            var _parentSubscriber = this._parentSubscriber;
-            if (!_parentSubscriber.syncErrorThrowable) {
-                this.__tryOrUnsub(this._next, value);
-            }
-            else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var _parentSubscriber = this._parentSubscriber;
-            if (this._error) {
-                if (!_parentSubscriber.syncErrorThrowable) {
-                    this.__tryOrUnsub(this._error, err);
-                    this.unsubscribe();
-                }
-                else {
-                    this.__tryOrSetError(_parentSubscriber, this._error, err);
-                    this.unsubscribe();
-                }
-            }
-            else if (!_parentSubscriber.syncErrorThrowable) {
-                this.unsubscribe();
-                throw err;
-            }
-            else {
-                _parentSubscriber.syncErrorValue = err;
-                _parentSubscriber.syncErrorThrown = true;
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.complete = function () {
-        var _this = this;
-        if (!this.isStopped) {
-            var _parentSubscriber = this._parentSubscriber;
-            if (this._complete) {
-                var wrappedComplete = function () { return _this._complete.call(_this._context); };
-                if (!_parentSubscriber.syncErrorThrowable) {
-                    this.__tryOrUnsub(wrappedComplete);
-                    this.unsubscribe();
-                }
-                else {
-                    this.__tryOrSetError(_parentSubscriber, wrappedComplete);
-                    this.unsubscribe();
-                }
-            }
-            else {
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {
-        try {
-            fn.call(this._context, value);
-        }
-        catch (err) {
-            this.unsubscribe();
-            throw err;
-        }
-    };
-    SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {
-        try {
-            fn.call(this._context, value);
-        }
-        catch (err) {
-            parent.syncErrorValue = err;
-            parent.syncErrorThrown = true;
-            return true;
-        }
-        return false;
-    };
-    SafeSubscriber.prototype._unsubscribe = function () {
-        var _parentSubscriber = this._parentSubscriber;
-        this._context = null;
-        this._parentSubscriber = null;
-        _parentSubscriber.unsubscribe();
-    };
-    return SafeSubscriber;
-}(Subscriber));
 
-},{"./Observer":30,"./Subscription":37,"./symbol/rxSubscriber":156,"./util/isFunction":167}],37:[function(require,module,exports){
-"use strict";
-var isArray_1 = require('./util/isArray');
-var isObject_1 = require('./util/isObject');
-var isFunction_1 = require('./util/isFunction');
-var tryCatch_1 = require('./util/tryCatch');
-var errorObject_1 = require('./util/errorObject');
-var UnsubscriptionError_1 = require('./util/UnsubscriptionError');
-/**
- * Represents a disposable resource, such as the execution of an Observable. A
- * Subscription has one important method, `unsubscribe`, that takes no argument
- * and just disposes the resource held by the subscription.
- *
- * Additionally, subscriptions may be grouped together through the `add()`
- * method, which will attach a child Subscription to the current Subscription.
- * When a Subscription is unsubscribed, all its children (and its grandchildren)
- * will be unsubscribed as well.
- *
- * @class Subscription
- */
-var Subscription = (function () {
-    /**
-     * @param {function(): void} [unsubscribe] A function describing how to
-     * perform the disposal of resources when the `unsubscribe` method is called.
-     */
-    function Subscription(unsubscribe) {
-        /**
-         * A flag to indicate whether this Subscription has already been unsubscribed.
-         * @type {boolean}
-         */
-        this.closed = false;
-        this._parent = null;
-        this._parents = null;
-        this._subscriptions = null;
-        if (unsubscribe) {
-            this._unsubscribe = unsubscribe;
-        }
+    // terminated by end of string?
+    if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
+
+    if (c < 0x10000) {
+      utf16buf[out++] = c;
+    } else {
+      c -= 0x10000;
+      utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
+      utf16buf[out++] = 0xdc00 | (c & 0x3ff);
     }
-    /**
-     * Disposes the resources held by the subscription. May, for instance, cancel
-     * an ongoing Observable execution or cancel any other type of work that
-     * started when the Subscription was created.
-     * @return {void}
-     */
-    Subscription.prototype.unsubscribe = function () {
-        var hasErrors = false;
-        var errors;
-        if (this.closed) {
-            return;
-        }
-        var _a = this, _parent = _a._parent, _parents = _a._parents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions;
-        this.closed = true;
-        this._parent = null;
-        this._parents = null;
-        // null out _subscriptions first so any child subscriptions that attempt
-        // to remove themselves from this subscription will noop
-        this._subscriptions = null;
-        var index = -1;
-        var len = _parents ? _parents.length : 0;
-        // if this._parent is null, then so is this._parents, and we
-        // don't have to remove ourselves from any parent subscriptions.
-        while (_parent) {
-            _parent.remove(this);
-            // if this._parents is null or index >= len,
-            // then _parent is set to null, and the loop exits
-            _parent = ++index < len && _parents[index] || null;
-        }
-        if (isFunction_1.isFunction(_unsubscribe)) {
-            var trial = tryCatch_1.tryCatch(_unsubscribe).call(this);
-            if (trial === errorObject_1.errorObject) {
-                hasErrors = true;
-                errors = errors || (errorObject_1.errorObject.e instanceof UnsubscriptionError_1.UnsubscriptionError ?
-                    flattenUnsubscriptionErrors(errorObject_1.errorObject.e.errors) : [errorObject_1.errorObject.e]);
-            }
-        }
-        if (isArray_1.isArray(_subscriptions)) {
-            index = -1;
-            len = _subscriptions.length;
-            while (++index < len) {
-                var sub = _subscriptions[index];
-                if (isObject_1.isObject(sub)) {
-                    var trial = tryCatch_1.tryCatch(sub.unsubscribe).call(sub);
-                    if (trial === errorObject_1.errorObject) {
-                        hasErrors = true;
-                        errors = errors || [];
-                        var err = errorObject_1.errorObject.e;
-                        if (err instanceof UnsubscriptionError_1.UnsubscriptionError) {
-                            errors = errors.concat(flattenUnsubscriptionErrors(err.errors));
-                        }
-                        else {
-                            errors.push(err);
-                        }
-                    }
-                }
-            }
-        }
-        if (hasErrors) {
-            throw new UnsubscriptionError_1.UnsubscriptionError(errors);
-        }
-    };
-    /**
-     * Adds a tear down to be called during the unsubscribe() of this
-     * Subscription.
-     *
-     * If the tear down being added is a subscription that is already
-     * unsubscribed, is the same reference `add` is being called on, or is
-     * `Subscription.EMPTY`, it will not be added.
-     *
-     * If this subscription is already in an `closed` state, the passed
-     * tear down logic will be executed immediately.
-     *
-     * @param {TeardownLogic} teardown The additional logic to execute on
-     * teardown.
-     * @return {Subscription} Returns the Subscription used or created to be
-     * added to the inner subscriptions list. This Subscription can be used with
-     * `remove()` to remove the passed teardown logic from the inner subscriptions
-     * list.
-     */
-    Subscription.prototype.add = function (teardown) {
-        if (!teardown || (teardown === Subscription.EMPTY)) {
-            return Subscription.EMPTY;
-        }
-        if (teardown === this) {
-            return this;
-        }
-        var subscription = teardown;
-        switch (typeof teardown) {
-            case 'function':
-                subscription = new Subscription(teardown);
-            case 'object':
-                if (subscription.closed || typeof subscription.unsubscribe !== 'function') {
-                    return subscription;
-                }
-                else if (this.closed) {
-                    subscription.unsubscribe();
-                    return subscription;
-                }
-                else if (typeof subscription._addParent !== 'function' /* quack quack */) {
-                    var tmp = subscription;
-                    subscription = new Subscription();
-                    subscription._subscriptions = [tmp];
-                }
-                break;
-            default:
-                throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');
-        }
-        var subscriptions = this._subscriptions || (this._subscriptions = []);
-        subscriptions.push(subscription);
-        subscription._addParent(this);
-        return subscription;
-    };
-    /**
-     * Removes a Subscription from the internal list of subscriptions that will
-     * unsubscribe during the unsubscribe process of this Subscription.
-     * @param {Subscription} subscription The subscription to remove.
-     * @return {void}
-     */
-    Subscription.prototype.remove = function (subscription) {
-        var subscriptions = this._subscriptions;
-        if (subscriptions) {
-            var subscriptionIndex = subscriptions.indexOf(subscription);
-            if (subscriptionIndex !== -1) {
-                subscriptions.splice(subscriptionIndex, 1);
-            }
-        }
-    };
-    Subscription.prototype._addParent = function (parent) {
-        var _a = this, _parent = _a._parent, _parents = _a._parents;
-        if (!_parent || _parent === parent) {
-            // If we don't have a parent, or the new parent is the same as the
-            // current parent, then set this._parent to the new parent.
-            this._parent = parent;
-        }
-        else if (!_parents) {
-            // If there's already one parent, but not multiple, allocate an Array to
-            // store the rest of the parent Subscriptions.
-            this._parents = [parent];
-        }
-        else if (_parents.indexOf(parent) === -1) {
-            // Only add the new parent to the _parents list if it's not already there.
-            _parents.push(parent);
-        }
-    };
-    Subscription.EMPTY = (function (empty) {
-        empty.closed = true;
-        return empty;
-    }(new Subscription()));
-    return Subscription;
-}());
-exports.Subscription = Subscription;
-function flattenUnsubscriptionErrors(errors) {
-    return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError_1.UnsubscriptionError) ? err.errors : err); }, []);
+  }
+
+  return buf2binstring(utf16buf, out);
+};
+
+
+// Calculate max possible position in utf8 buffer,
+// that will not break sequence. If that's not possible
+// - (very small limits) return max size as is.
+//
+// buf[] - utf8 bytes array
+// max   - length limit (mandatory);
+exports.utf8border = function (buf, max) {
+  var pos;
+
+  max = max || buf.length;
+  if (max > buf.length) { max = buf.length; }
+
+  // go back from last position, until start of sequence found
+  pos = max - 1;
+  while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
+
+  // Very small and broken sequence,
+  // return max, because we should return something anyway.
+  if (pos < 0) { return max; }
+
+  // If we came to start of buffer - that means buffer is too small,
+  // return max too.
+  if (pos === 0) { return max; }
+
+  return (pos + _utf8len[buf[pos]] > max) ? pos : max;
+};
+
+},{"./common":26}],28:[function(require,module,exports){
+'use strict';
+
+// Note: adler32 takes 12% for level 0 and 2% for level 6.
+// It isn't worth it to make additional optimizations as in original.
+// Small size is preferable.
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+function adler32(adler, buf, len, pos) {
+  var s1 = (adler & 0xffff) |0,
+      s2 = ((adler >>> 16) & 0xffff) |0,
+      n = 0;
+
+  while (len !== 0) {
+    // Set limit ~ twice less than 5552, to keep
+    // s2 in 31-bits, because we force signed ints.
+    // in other case %= will fail.
+    n = len > 2000 ? 2000 : len;
+    len -= n;
+
+    do {
+      s1 = (s1 + buf[pos++]) |0;
+      s2 = (s2 + s1) |0;
+    } while (--n);
+
+    s1 %= 65521;
+    s2 %= 65521;
+  }
+
+  return (s1 | (s2 << 16)) |0;
 }
 
-},{"./util/UnsubscriptionError":162,"./util/errorObject":163,"./util/isArray":164,"./util/isFunction":167,"./util/isObject":169,"./util/tryCatch":175}],38:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var combineLatest_1 = require('../../observable/combineLatest');
-Observable_1.Observable.combineLatest = combineLatest_1.combineLatest;
 
-},{"../../Observable":29,"../../observable/combineLatest":97}],39:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var defer_1 = require('../../observable/defer');
-Observable_1.Observable.defer = defer_1.defer;
+module.exports = adler32;
 
-},{"../../Observable":29,"../../observable/defer":98}],40:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var empty_1 = require('../../observable/empty');
-Observable_1.Observable.empty = empty_1.empty;
+},{}],29:[function(require,module,exports){
+'use strict';
 
-},{"../../Observable":29,"../../observable/empty":99}],41:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var from_1 = require('../../observable/from');
-Observable_1.Observable.from = from_1.from;
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
 
-},{"../../Observable":29,"../../observable/from":100}],42:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var fromEvent_1 = require('../../observable/fromEvent');
-Observable_1.Observable.fromEvent = fromEvent_1.fromEvent;
+module.exports = {
 
-},{"../../Observable":29,"../../observable/fromEvent":101}],43:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var fromPromise_1 = require('../../observable/fromPromise');
-Observable_1.Observable.fromPromise = fromPromise_1.fromPromise;
+  /* Allowed flush values; see deflate() and inflate() below for details */
+  Z_NO_FLUSH:         0,
+  Z_PARTIAL_FLUSH:    1,
+  Z_SYNC_FLUSH:       2,
+  Z_FULL_FLUSH:       3,
+  Z_FINISH:           4,
+  Z_BLOCK:            5,
+  Z_TREES:            6,
+
+  /* Return codes for the compression/decompression functions. Negative values
+  * are errors, positive values are used for special but normal events.
+  */
+  Z_OK:               0,
+  Z_STREAM_END:       1,
+  Z_NEED_DICT:        2,
+  Z_ERRNO:           -1,
+  Z_STREAM_ERROR:    -2,
+  Z_DATA_ERROR:      -3,
+  //Z_MEM_ERROR:     -4,
+  Z_BUF_ERROR:       -5,
+  //Z_VERSION_ERROR: -6,
+
+  /* compression levels */
+  Z_NO_COMPRESSION:         0,
+  Z_BEST_SPEED:             1,
+  Z_BEST_COMPRESSION:       9,
+  Z_DEFAULT_COMPRESSION:   -1,
+
+
+  Z_FILTERED:               1,
+  Z_HUFFMAN_ONLY:           2,
+  Z_RLE:                    3,
+  Z_FIXED:                  4,
+  Z_DEFAULT_STRATEGY:       0,
+
+  /* Possible values of the data_type field (though see inflate()) */
+  Z_BINARY:                 0,
+  Z_TEXT:                   1,
+  //Z_ASCII:                1, // = Z_TEXT (deprecated)
+  Z_UNKNOWN:                2,
+
+  /* The deflate compression method */
+  Z_DEFLATED:               8
+  //Z_NULL:                 null // Use -1 or null inline, depending on var type
+};
 
-},{"../../Observable":29,"../../observable/fromPromise":102}],44:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var merge_1 = require('../../observable/merge');
-Observable_1.Observable.merge = merge_1.merge;
+},{}],30:[function(require,module,exports){
+'use strict';
 
-},{"../../Observable":29,"../../observable/merge":103}],45:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var of_1 = require('../../observable/of');
-Observable_1.Observable.of = of_1.of;
+// Note: we can't get significant speed boost here.
+// So write code to minimize size - no pregenerated tables
+// and array tools dependencies.
 
-},{"../../Observable":29,"../../observable/of":104}],46:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var throw_1 = require('../../observable/throw');
-Observable_1.Observable.throw = throw_1._throw;
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+// Use ordinary array, since untyped makes no boost here
+function makeTable() {
+  var c, table = [];
+
+  for (var n = 0; n < 256; n++) {
+    c = n;
+    for (var k = 0; k < 8; k++) {
+      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
+    }
+    table[n] = c;
+  }
 
-},{"../../Observable":29,"../../observable/throw":105}],47:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var timer_1 = require('../../observable/timer');
-Observable_1.Observable.timer = timer_1.timer;
+  return table;
+}
 
-},{"../../Observable":29,"../../observable/timer":106}],48:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var zip_1 = require('../../observable/zip');
-Observable_1.Observable.zip = zip_1.zip;
+// Create table on load. Just 255 signed longs. Not a problem.
+var crcTable = makeTable();
 
-},{"../../Observable":29,"../../observable/zip":107}],49:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var buffer_1 = require('../../operator/buffer');
-Observable_1.Observable.prototype.buffer = buffer_1.buffer;
 
-},{"../../Observable":29,"../../operator/buffer":108}],50:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var bufferCount_1 = require('../../operator/bufferCount');
-Observable_1.Observable.prototype.bufferCount = bufferCount_1.bufferCount;
+function crc32(crc, buf, len, pos) {
+  var t = crcTable,
+      end = pos + len;
 
-},{"../../Observable":29,"../../operator/bufferCount":109}],51:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var bufferWhen_1 = require('../../operator/bufferWhen');
-Observable_1.Observable.prototype.bufferWhen = bufferWhen_1.bufferWhen;
+  crc ^= -1;
 
-},{"../../Observable":29,"../../operator/bufferWhen":110}],52:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var catch_1 = require('../../operator/catch');
-Observable_1.Observable.prototype.catch = catch_1._catch;
-Observable_1.Observable.prototype._catch = catch_1._catch;
+  for (var i = pos; i < end; i++) {
+    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
+  }
 
-},{"../../Observable":29,"../../operator/catch":111}],53:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var combineLatest_1 = require('../../operator/combineLatest');
-Observable_1.Observable.prototype.combineLatest = combineLatest_1.combineLatest;
+  return (crc ^ (-1)); // >>> 0;
+}
 
-},{"../../Observable":29,"../../operator/combineLatest":112}],54:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var concat_1 = require('../../operator/concat');
-Observable_1.Observable.prototype.concat = concat_1.concat;
 
-},{"../../Observable":29,"../../operator/concat":113}],55:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var debounceTime_1 = require('../../operator/debounceTime');
-Observable_1.Observable.prototype.debounceTime = debounceTime_1.debounceTime;
+module.exports = crc32;
 
-},{"../../Observable":29,"../../operator/debounceTime":114}],56:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var delay_1 = require('../../operator/delay');
-Observable_1.Observable.prototype.delay = delay_1.delay;
+},{}],31:[function(require,module,exports){
+'use strict';
 
-},{"../../Observable":29,"../../operator/delay":115}],57:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var distinct_1 = require('../../operator/distinct');
-Observable_1.Observable.prototype.distinct = distinct_1.distinct;
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+var utils   = require('../utils/common');
+var trees   = require('./trees');
+var adler32 = require('./adler32');
+var crc32   = require('./crc32');
+var msg     = require('./messages');
+
+/* Public constants ==========================================================*/
+/* ===========================================================================*/
+
+
+/* Allowed flush values; see deflate() and inflate() below for details */
+var Z_NO_FLUSH      = 0;
+var Z_PARTIAL_FLUSH = 1;
+//var Z_SYNC_FLUSH    = 2;
+var Z_FULL_FLUSH    = 3;
+var Z_FINISH        = 4;
+var Z_BLOCK         = 5;
+//var Z_TREES         = 6;
+
+
+/* Return codes for the compression/decompression functions. Negative values
+ * are errors, positive values are used for special but normal events.
+ */
+var Z_OK            = 0;
+var Z_STREAM_END    = 1;
+//var Z_NEED_DICT     = 2;
+//var Z_ERRNO         = -1;
+var Z_STREAM_ERROR  = -2;
+var Z_DATA_ERROR    = -3;
+//var Z_MEM_ERROR     = -4;
+var Z_BUF_ERROR     = -5;
+//var Z_VERSION_ERROR = -6;
 
-},{"../../Observable":29,"../../operator/distinct":116}],58:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var distinctUntilChanged_1 = require('../../operator/distinctUntilChanged');
-Observable_1.Observable.prototype.distinctUntilChanged = distinctUntilChanged_1.distinctUntilChanged;
 
-},{"../../Observable":29,"../../operator/distinctUntilChanged":117}],59:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var do_1 = require('../../operator/do');
-Observable_1.Observable.prototype.do = do_1._do;
-Observable_1.Observable.prototype._do = do_1._do;
+/* compression levels */
+//var Z_NO_COMPRESSION      = 0;
+//var Z_BEST_SPEED          = 1;
+//var Z_BEST_COMPRESSION    = 9;
+var Z_DEFAULT_COMPRESSION = -1;
 
-},{"../../Observable":29,"../../operator/do":118}],60:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var expand_1 = require('../../operator/expand');
-Observable_1.Observable.prototype.expand = expand_1.expand;
 
-},{"../../Observable":29,"../../operator/expand":119}],61:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var filter_1 = require('../../operator/filter');
-Observable_1.Observable.prototype.filter = filter_1.filter;
+var Z_FILTERED            = 1;
+var Z_HUFFMAN_ONLY        = 2;
+var Z_RLE                 = 3;
+var Z_FIXED               = 4;
+var Z_DEFAULT_STRATEGY    = 0;
 
-},{"../../Observable":29,"../../operator/filter":120}],62:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var finally_1 = require('../../operator/finally');
-Observable_1.Observable.prototype.finally = finally_1._finally;
-Observable_1.Observable.prototype._finally = finally_1._finally;
+/* Possible values of the data_type field (though see inflate()) */
+//var Z_BINARY              = 0;
+//var Z_TEXT                = 1;
+//var Z_ASCII               = 1; // = Z_TEXT
+var Z_UNKNOWN             = 2;
 
-},{"../../Observable":29,"../../operator/finally":121}],63:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var first_1 = require('../../operator/first');
-Observable_1.Observable.prototype.first = first_1.first;
 
-},{"../../Observable":29,"../../operator/first":122}],64:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var last_1 = require('../../operator/last');
-Observable_1.Observable.prototype.last = last_1.last;
+/* The deflate compression method */
+var Z_DEFLATED  = 8;
 
-},{"../../Observable":29,"../../operator/last":123}],65:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var map_1 = require('../../operator/map');
-Observable_1.Observable.prototype.map = map_1.map;
+/*============================================================================*/
 
-},{"../../Observable":29,"../../operator/map":124}],66:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var merge_1 = require('../../operator/merge');
-Observable_1.Observable.prototype.merge = merge_1.merge;
 
-},{"../../Observable":29,"../../operator/merge":125}],67:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var mergeAll_1 = require('../../operator/mergeAll');
-Observable_1.Observable.prototype.mergeAll = mergeAll_1.mergeAll;
+var MAX_MEM_LEVEL = 9;
+/* Maximum value for memLevel in deflateInit2 */
+var MAX_WBITS = 15;
+/* 32K LZ77 window */
+var DEF_MEM_LEVEL = 8;
 
-},{"../../Observable":29,"../../operator/mergeAll":126}],68:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var mergeMap_1 = require('../../operator/mergeMap');
-Observable_1.Observable.prototype.mergeMap = mergeMap_1.mergeMap;
-Observable_1.Observable.prototype.flatMap = mergeMap_1.mergeMap;
 
-},{"../../Observable":29,"../../operator/mergeMap":127}],69:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var pairwise_1 = require('../../operator/pairwise');
-Observable_1.Observable.prototype.pairwise = pairwise_1.pairwise;
+var LENGTH_CODES  = 29;
+/* number of length codes, not counting the special END_BLOCK code */
+var LITERALS      = 256;
+/* number of literal bytes 0..255 */
+var L_CODES       = LITERALS + 1 + LENGTH_CODES;
+/* number of Literal or Length codes, including the END_BLOCK code */
+var D_CODES       = 30;
+/* number of distance codes */
+var BL_CODES      = 19;
+/* number of codes used to transfer the bit lengths */
+var HEAP_SIZE     = 2 * L_CODES + 1;
+/* maximum heap size */
+var MAX_BITS  = 15;
+/* All codes must not exceed MAX_BITS bits */
 
-},{"../../Observable":29,"../../operator/pairwise":130}],70:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var pluck_1 = require('../../operator/pluck');
-Observable_1.Observable.prototype.pluck = pluck_1.pluck;
+var MIN_MATCH = 3;
+var MAX_MATCH = 258;
+var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);
 
-},{"../../Observable":29,"../../operator/pluck":131}],71:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var publish_1 = require('../../operator/publish');
-Observable_1.Observable.prototype.publish = publish_1.publish;
+var PRESET_DICT = 0x20;
 
-},{"../../Observable":29,"../../operator/publish":132}],72:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var publishReplay_1 = require('../../operator/publishReplay');
-Observable_1.Observable.prototype.publishReplay = publishReplay_1.publishReplay;
+var INIT_STATE = 42;
+var EXTRA_STATE = 69;
+var NAME_STATE = 73;
+var COMMENT_STATE = 91;
+var HCRC_STATE = 103;
+var BUSY_STATE = 113;
+var FINISH_STATE = 666;
 
-},{"../../Observable":29,"../../operator/publishReplay":133}],73:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var scan_1 = require('../../operator/scan');
-Observable_1.Observable.prototype.scan = scan_1.scan;
+var BS_NEED_MORE      = 1; /* block not completed, need more input or more output */
+var BS_BLOCK_DONE     = 2; /* block flush performed */
+var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */
+var BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */
 
-},{"../../Observable":29,"../../operator/scan":134}],74:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var share_1 = require('../../operator/share');
-Observable_1.Observable.prototype.share = share_1.share;
+var OS_CODE = 0x03; // Unix :) . Don't detect, use this default.
 
-},{"../../Observable":29,"../../operator/share":135}],75:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var skip_1 = require('../../operator/skip');
-Observable_1.Observable.prototype.skip = skip_1.skip;
+function err(strm, errorCode) {
+  strm.msg = msg[errorCode];
+  return errorCode;
+}
 
-},{"../../Observable":29,"../../operator/skip":136}],76:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var skipUntil_1 = require('../../operator/skipUntil');
-Observable_1.Observable.prototype.skipUntil = skipUntil_1.skipUntil;
+function rank(f) {
+  return ((f) << 1) - ((f) > 4 ? 9 : 0);
+}
 
-},{"../../Observable":29,"../../operator/skipUntil":137}],77:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var skipWhile_1 = require('../../operator/skipWhile');
-Observable_1.Observable.prototype.skipWhile = skipWhile_1.skipWhile;
+function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
 
-},{"../../Observable":29,"../../operator/skipWhile":138}],78:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var startWith_1 = require('../../operator/startWith');
-Observable_1.Observable.prototype.startWith = startWith_1.startWith;
 
-},{"../../Observable":29,"../../operator/startWith":139}],79:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var switchMap_1 = require('../../operator/switchMap');
-Observable_1.Observable.prototype.switchMap = switchMap_1.switchMap;
+/* =========================================================================
+ * Flush as much pending output as possible. All deflate() output goes
+ * through this function so some applications may wish to modify it
+ * to avoid allocating a large strm->output buffer and copying into it.
+ * (See also read_buf()).
+ */
+function flush_pending(strm) {
+  var s = strm.state;
 
-},{"../../Observable":29,"../../operator/switchMap":140}],80:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var take_1 = require('../../operator/take');
-Observable_1.Observable.prototype.take = take_1.take;
+  //_tr_flush_bits(s);
+  var len = s.pending;
+  if (len > strm.avail_out) {
+    len = strm.avail_out;
+  }
+  if (len === 0) { return; }
+
+  utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);
+  strm.next_out += len;
+  s.pending_out += len;
+  strm.total_out += len;
+  strm.avail_out -= len;
+  s.pending -= len;
+  if (s.pending === 0) {
+    s.pending_out = 0;
+  }
+}
 
-},{"../../Observable":29,"../../operator/take":141}],81:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var takeUntil_1 = require('../../operator/takeUntil');
-Observable_1.Observable.prototype.takeUntil = takeUntil_1.takeUntil;
 
-},{"../../Observable":29,"../../operator/takeUntil":142}],82:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var throttleTime_1 = require('../../operator/throttleTime');
-Observable_1.Observable.prototype.throttleTime = throttleTime_1.throttleTime;
+function flush_block_only(s, last) {
+  trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);
+  s.block_start = s.strstart;
+  flush_pending(s.strm);
+}
 
-},{"../../Observable":29,"../../operator/throttleTime":144}],83:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var withLatestFrom_1 = require('../../operator/withLatestFrom');
-Observable_1.Observable.prototype.withLatestFrom = withLatestFrom_1.withLatestFrom;
 
-},{"../../Observable":29,"../../operator/withLatestFrom":145}],84:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var zip_1 = require('../../operator/zip');
-Observable_1.Observable.prototype.zip = zip_1.zipProto;
+function put_byte(s, b) {
+  s.pending_buf[s.pending++] = b;
+}
 
-},{"../../Observable":29,"../../operator/zip":146}],85:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-var ScalarObservable_1 = require('./ScalarObservable');
-var EmptyObservable_1 = require('./EmptyObservable');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
+
+/* =========================================================================
+ * Put a short in the pending buffer. The 16-bit value is put in MSB order.
+ * IN assertion: the stream state is correct and there is enough room in
+ * pending_buf.
  */
-var ArrayLikeObservable = (function (_super) {
-    __extends(ArrayLikeObservable, _super);
-    function ArrayLikeObservable(arrayLike, scheduler) {
-        _super.call(this);
-        this.arrayLike = arrayLike;
-        this.scheduler = scheduler;
-        if (!scheduler && arrayLike.length === 1) {
-            this._isScalar = true;
-            this.value = arrayLike[0];
-        }
-    }
-    ArrayLikeObservable.create = function (arrayLike, scheduler) {
-        var length = arrayLike.length;
-        if (length === 0) {
-            return new EmptyObservable_1.EmptyObservable();
-        }
-        else if (length === 1) {
-            return new ScalarObservable_1.ScalarObservable(arrayLike[0], scheduler);
-        }
-        else {
-            return new ArrayLikeObservable(arrayLike, scheduler);
-        }
-    };
-    ArrayLikeObservable.dispatch = function (state) {
-        var arrayLike = state.arrayLike, index = state.index, length = state.length, subscriber = state.subscriber;
-        if (subscriber.closed) {
-            return;
-        }
-        if (index >= length) {
-            subscriber.complete();
-            return;
-        }
-        subscriber.next(arrayLike[index]);
-        state.index = index + 1;
-        this.schedule(state);
-    };
-    ArrayLikeObservable.prototype._subscribe = function (subscriber) {
-        var index = 0;
-        var _a = this, arrayLike = _a.arrayLike, scheduler = _a.scheduler;
-        var length = arrayLike.length;
-        if (scheduler) {
-            return scheduler.schedule(ArrayLikeObservable.dispatch, 0, {
-                arrayLike: arrayLike, index: index, length: length, subscriber: subscriber
-            });
-        }
-        else {
-            for (var i = 0; i < length && !subscriber.closed; i++) {
-                subscriber.next(arrayLike[i]);
-            }
-            subscriber.complete();
-        }
-    };
-    return ArrayLikeObservable;
-}(Observable_1.Observable));
-exports.ArrayLikeObservable = ArrayLikeObservable;
+function putShortMSB(s, b) {
+//  put_byte(s, (Byte)(b >> 8));
+//  put_byte(s, (Byte)(b & 0xff));
+  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;
+  s.pending_buf[s.pending++] = b & 0xff;
+}
 
-},{"../Observable":29,"./EmptyObservable":89,"./ScalarObservable":95}],86:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-var ScalarObservable_1 = require('./ScalarObservable');
-var EmptyObservable_1 = require('./EmptyObservable');
-var isScheduler_1 = require('../util/isScheduler');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
+
+/* ===========================================================================
+ * Read a new buffer from the current input stream, update the adler32
+ * and total number of bytes read.  All deflate() input goes through
+ * this function so some applications may wish to modify it to avoid
+ * allocating a large strm->input buffer and copying from it.
+ * (See also flush_pending()).
  */
-var ArrayObservable = (function (_super) {
-    __extends(ArrayObservable, _super);
-    function ArrayObservable(array, scheduler) {
-        _super.call(this);
-        this.array = array;
-        this.scheduler = scheduler;
-        if (!scheduler && array.length === 1) {
-            this._isScalar = true;
-            this.value = array[0];
-        }
+function read_buf(strm, buf, start, size) {
+  var len = strm.avail_in;
+
+  if (len > size) { len = size; }
+  if (len === 0) { return 0; }
+
+  strm.avail_in -= len;
+
+  // zmemcpy(buf, strm->next_in, len);
+  utils.arraySet(buf, strm.input, strm.next_in, len, start);
+  if (strm.state.wrap === 1) {
+    strm.adler = adler32(strm.adler, buf, len, start);
+  }
+
+  else if (strm.state.wrap === 2) {
+    strm.adler = crc32(strm.adler, buf, len, start);
+  }
+
+  strm.next_in += len;
+  strm.total_in += len;
+
+  return len;
+}
+
+
+/* ===========================================================================
+ * Set match_start to the longest match starting at the given string and
+ * return its length. Matches shorter or equal to prev_length are discarded,
+ * in which case the result is equal to prev_length and match_start is
+ * garbage.
+ * IN assertions: cur_match is the head of the hash chain for the current
+ *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
+ * OUT assertion: the match length is not greater than s->lookahead.
+ */
+function longest_match(s, cur_match) {
+  var chain_length = s.max_chain_length;      /* max hash chain length */
+  var scan = s.strstart; /* current string */
+  var match;                       /* matched string */
+  var len;                           /* length of current match */
+  var best_len = s.prev_length;              /* best match length so far */
+  var nice_match = s.nice_match;             /* stop if match long enough */
+  var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?
+      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;
+
+  var _win = s.window; // shortcut
+
+  var wmask = s.w_mask;
+  var prev  = s.prev;
+
+  /* Stop when cur_match becomes <= limit. To simplify the code,
+   * we prevent matches with the string of window index 0.
+   */
+
+  var strend = s.strstart + MAX_MATCH;
+  var scan_end1  = _win[scan + best_len - 1];
+  var scan_end   = _win[scan + best_len];
+
+  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+   * It is easy to get rid of this optimization if necessary.
+   */
+  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
+
+  /* Do not waste too much time if we already have a good match: */
+  if (s.prev_length >= s.good_match) {
+    chain_length >>= 2;
+  }
+  /* Do not look for matches beyond the end of the input. This is necessary
+   * to make deflate deterministic.
+   */
+  if (nice_match > s.lookahead) { nice_match = s.lookahead; }
+
+  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+
+  do {
+    // Assert(cur_match < s->strstart, "no future");
+    match = cur_match;
+
+    /* Skip to next match if the match length cannot increase
+     * or if the match length is less than 2.  Note that the checks below
+     * for insufficient lookahead only occur occasionally for performance
+     * reasons.  Therefore uninitialized memory will be accessed, and
+     * conditional jumps will be made that depend on those values.
+     * However the length of the match is limited to the lookahead, so
+     * the output of deflate is not affected by the uninitialized values.
+     */
+
+    if (_win[match + best_len]     !== scan_end  ||
+        _win[match + best_len - 1] !== scan_end1 ||
+        _win[match]                !== _win[scan] ||
+        _win[++match]              !== _win[scan + 1]) {
+      continue;
     }
-    ArrayObservable.create = function (array, scheduler) {
-        return new ArrayObservable(array, scheduler);
-    };
-    /**
-     * Creates an Observable that emits some values you specify as arguments,
-     * immediately one after the other, and then emits a complete notification.
-     *
-     * <span class="informal">Emits the arguments you provide, then completes.
-     * </span>
-     *
-     * <img src="./img/of.png" width="100%">
-     *
-     * This static operator is useful for creating a simple Observable that only
-     * emits the arguments given, and the complete notification thereafter. It can
-     * be used for composing with other Observables, such as with {@link concat}.
-     * By default, it uses a `null` IScheduler, which means the `next`
-     * notifications are sent synchronously, although with a different IScheduler
-     * it is possible to determine when those notifications will be delivered.
-     *
-     * @example <caption>Emit 10, 20, 30, then 'a', 'b', 'c', then start ticking every second.</caption>
-     * var numbers = Rx.Observable.of(10, 20, 30);
-     * var letters = Rx.Observable.of('a', 'b', 'c');
-     * var interval = Rx.Observable.interval(1000);
-     * var result = numbers.concat(letters).concat(interval);
-     * result.subscribe(x => console.log(x));
-     *
-     * @see {@link create}
-     * @see {@link empty}
-     * @see {@link never}
-     * @see {@link throw}
-     *
-     * @param {...T} values Arguments that represent `next` values to be emitted.
-     * @param {Scheduler} [scheduler] A {@link IScheduler} to use for scheduling
-     * the emissions of the `next` notifications.
-     * @return {Observable<T>} An Observable that emits each given input value.
-     * @static true
-     * @name of
-     * @owner Observable
+
+    /* The check at best_len-1 can be removed because it will be made
+     * again later. (This heuristic is not always a win.)
+     * It is not necessary to compare scan[2] and match[2] since they
+     * are always equal when the other bytes match, given that
+     * the hash keys are equal and that HASH_BITS >= 8.
      */
-    ArrayObservable.of = function () {
-        var array = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            array[_i - 0] = arguments[_i];
-        }
-        var scheduler = array[array.length - 1];
-        if (isScheduler_1.isScheduler(scheduler)) {
-            array.pop();
-        }
-        else {
-            scheduler = null;
-        }
-        var len = array.length;
-        if (len > 1) {
-            return new ArrayObservable(array, scheduler);
-        }
-        else if (len === 1) {
-            return new ScalarObservable_1.ScalarObservable(array[0], scheduler);
-        }
-        else {
-            return new EmptyObservable_1.EmptyObservable(scheduler);
-        }
-    };
-    ArrayObservable.dispatch = function (state) {
-        var array = state.array, index = state.index, count = state.count, subscriber = state.subscriber;
-        if (index >= count) {
-            subscriber.complete();
-            return;
-        }
-        subscriber.next(array[index]);
-        if (subscriber.closed) {
-            return;
-        }
-        state.index = index + 1;
-        this.schedule(state);
-    };
-    ArrayObservable.prototype._subscribe = function (subscriber) {
-        var index = 0;
-        var array = this.array;
-        var count = array.length;
-        var scheduler = this.scheduler;
-        if (scheduler) {
-            return scheduler.schedule(ArrayObservable.dispatch, 0, {
-                array: array, index: index, count: count, subscriber: subscriber
-            });
-        }
-        else {
-            for (var i = 0; i < count && !subscriber.closed; i++) {
-                subscriber.next(array[i]);
-            }
-            subscriber.complete();
-        }
-    };
-    return ArrayObservable;
-}(Observable_1.Observable));
-exports.ArrayObservable = ArrayObservable;
+    scan += 2;
+    match++;
+    // Assert(*scan == *match, "match[2]?");
 
-},{"../Observable":29,"../util/isScheduler":171,"./EmptyObservable":89,"./ScalarObservable":95}],87:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subject_1 = require('../Subject');
-var Observable_1 = require('../Observable');
-var Subscriber_1 = require('../Subscriber');
-var Subscription_1 = require('../Subscription');
-/**
- * @class ConnectableObservable<T>
- */
-var ConnectableObservable = (function (_super) {
-    __extends(ConnectableObservable, _super);
-    function ConnectableObservable(source, subjectFactory) {
-        _super.call(this);
-        this.source = source;
-        this.subjectFactory = subjectFactory;
-        this._refCount = 0;
-        this._isComplete = false;
+    /* We check for insufficient lookahead only every 8th comparison;
+     * the 256th check will be made at strstart+258.
+     */
+    do {
+      /*jshint noempty:false*/
+    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
+             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
+             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
+             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
+             scan < strend);
+
+    // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+
+    len = MAX_MATCH - (strend - scan);
+    scan = strend - MAX_MATCH;
+
+    if (len > best_len) {
+      s.match_start = cur_match;
+      best_len = len;
+      if (len >= nice_match) {
+        break;
+      }
+      scan_end1  = _win[scan + best_len - 1];
+      scan_end   = _win[scan + best_len];
     }
-    ConnectableObservable.prototype._subscribe = function (subscriber) {
-        return this.getSubject().subscribe(subscriber);
-    };
-    ConnectableObservable.prototype.getSubject = function () {
-        var subject = this._subject;
-        if (!subject || subject.isStopped) {
-            this._subject = this.subjectFactory();
-        }
-        return this._subject;
-    };
-    ConnectableObservable.prototype.connect = function () {
-        var connection = this._connection;
-        if (!connection) {
-            this._isComplete = false;
-            connection = this._connection = new Subscription_1.Subscription();
-            connection.add(this.source
-                .subscribe(new ConnectableSubscriber(this.getSubject(), this)));
-            if (connection.closed) {
-                this._connection = null;
-                connection = Subscription_1.Subscription.EMPTY;
-            }
-            else {
-                this._connection = connection;
-            }
-        }
-        return connection;
-    };
-    ConnectableObservable.prototype.refCount = function () {
-        return this.lift(new RefCountOperator(this));
-    };
-    return ConnectableObservable;
-}(Observable_1.Observable));
-exports.ConnectableObservable = ConnectableObservable;
-var connectableProto = ConnectableObservable.prototype;
-exports.connectableObservableDescriptor = {
-    operator: { value: null },
-    _refCount: { value: 0, writable: true },
-    _subject: { value: null, writable: true },
-    _connection: { value: null, writable: true },
-    _subscribe: { value: connectableProto._subscribe },
-    _isComplete: { value: connectableProto._isComplete, writable: true },
-    getSubject: { value: connectableProto.getSubject },
-    connect: { value: connectableProto.connect },
-    refCount: { value: connectableProto.refCount }
-};
-var ConnectableSubscriber = (function (_super) {
-    __extends(ConnectableSubscriber, _super);
-    function ConnectableSubscriber(destination, connectable) {
-        _super.call(this, destination);
-        this.connectable = connectable;
+  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);
+
+  if (best_len <= s.lookahead) {
+    return best_len;
+  }
+  return s.lookahead;
+}
+
+
+/* ===========================================================================
+ * Fill the window when the lookahead becomes insufficient.
+ * Updates strstart and lookahead.
+ *
+ * IN assertion: lookahead < MIN_LOOKAHEAD
+ * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
+ *    At least one byte has been read, or avail_in == 0; reads are
+ *    performed for at least two bytes (required for the zip translate_eol
+ *    option -- not supported here).
+ */
+function fill_window(s) {
+  var _w_size = s.w_size;
+  var p, n, m, more, str;
+
+  //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
+
+  do {
+    more = s.window_size - s.lookahead - s.strstart;
+
+    // JS ints have 32 bit, block below not needed
+    /* Deal with !@#$% 64K limit: */
+    //if (sizeof(int) <= 2) {
+    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
+    //        more = wsize;
+    //
+    //  } else if (more == (unsigned)(-1)) {
+    //        /* Very unlikely, but possible on 16 bit machine if
+    //         * strstart == 0 && lookahead == 1 (input done a byte at time)
+    //         */
+    //        more--;
+    //    }
+    //}
+
+
+    /* If the window is almost full and there is insufficient lookahead,
+     * move the upper half to the lower one to make room in the upper half.
+     */
+    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {
+
+      utils.arraySet(s.window, s.window, _w_size, _w_size, 0);
+      s.match_start -= _w_size;
+      s.strstart -= _w_size;
+      /* we now have strstart >= MAX_DIST */
+      s.block_start -= _w_size;
+
+      /* Slide the hash table (could be avoided with 32 bit values
+       at the expense of memory usage). We slide even when level == 0
+       to keep the hash table consistent if we switch back to level > 0
+       later. (Using level 0 permanently is not an optimal usage of
+       zlib, so we don't care about this pathological case.)
+       */
+
+      n = s.hash_size;
+      p = n;
+      do {
+        m = s.head[--p];
+        s.head[p] = (m >= _w_size ? m - _w_size : 0);
+      } while (--n);
+
+      n = _w_size;
+      p = n;
+      do {
+        m = s.prev[--p];
+        s.prev[p] = (m >= _w_size ? m - _w_size : 0);
+        /* If n is not on any hash chain, prev[n] is garbage but
+         * its value will never be used.
+         */
+      } while (--n);
+
+      more += _w_size;
     }
-    ConnectableSubscriber.prototype._error = function (err) {
-        this._unsubscribe();
-        _super.prototype._error.call(this, err);
-    };
-    ConnectableSubscriber.prototype._complete = function () {
-        this.connectable._isComplete = true;
-        this._unsubscribe();
-        _super.prototype._complete.call(this);
-    };
-    ConnectableSubscriber.prototype._unsubscribe = function () {
-        var connectable = this.connectable;
-        if (connectable) {
-            this.connectable = null;
-            var connection = connectable._connection;
-            connectable._refCount = 0;
-            connectable._subject = null;
-            connectable._connection = null;
-            if (connection) {
-                connection.unsubscribe();
-            }
-        }
-    };
-    return ConnectableSubscriber;
-}(Subject_1.SubjectSubscriber));
-var RefCountOperator = (function () {
-    function RefCountOperator(connectable) {
-        this.connectable = connectable;
+    if (s.strm.avail_in === 0) {
+      break;
     }
-    RefCountOperator.prototype.call = function (subscriber, source) {
-        var connectable = this.connectable;
-        connectable._refCount++;
-        var refCounter = new RefCountSubscriber(subscriber, connectable);
-        var subscription = source.subscribe(refCounter);
-        if (!refCounter.closed) {
-            refCounter.connection = connectable.connect();
+
+    /* If there was no sliding:
+     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
+     *    more == window_size - lookahead - strstart
+     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
+     * => more >= window_size - 2*WSIZE + 2
+     * In the BIG_MEM or MMAP case (not yet supported),
+     *   window_size == input_size + MIN_LOOKAHEAD  &&
+     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
+     * Otherwise, window_size == 2*WSIZE so more >= 2.
+     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
+     */
+    //Assert(more >= 2, "more < 2");
+    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);
+    s.lookahead += n;
+
+    /* Initialize the hash value now that we have some input: */
+    if (s.lookahead + s.insert >= MIN_MATCH) {
+      str = s.strstart - s.insert;
+      s.ins_h = s.window[str];
+
+      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */
+      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;
+//#if MIN_MATCH != 3
+//        Call update_hash() MIN_MATCH-3 more times
+//#endif
+      while (s.insert) {
+        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
+        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;
+
+        s.prev[str & s.w_mask] = s.head[s.ins_h];
+        s.head[s.ins_h] = str;
+        str++;
+        s.insert--;
+        if (s.lookahead + s.insert < MIN_MATCH) {
+          break;
         }
-        return subscription;
-    };
-    return RefCountOperator;
-}());
-var RefCountSubscriber = (function (_super) {
-    __extends(RefCountSubscriber, _super);
-    function RefCountSubscriber(destination, connectable) {
-        _super.call(this, destination);
-        this.connectable = connectable;
+      }
     }
-    RefCountSubscriber.prototype._unsubscribe = function () {
-        var connectable = this.connectable;
-        if (!connectable) {
-            this.connection = null;
-            return;
-        }
-        this.connectable = null;
-        var refCount = connectable._refCount;
-        if (refCount <= 0) {
-            this.connection = null;
-            return;
-        }
-        connectable._refCount = refCount - 1;
-        if (refCount > 1) {
-            this.connection = null;
-            return;
-        }
-        ///
-        // Compare the local RefCountSubscriber's connection Subscription to the
-        // connection Subscription on the shared ConnectableObservable. In cases
-        // where the ConnectableObservable source synchronously emits values, and
-        // the RefCountSubscriber's downstream Observers synchronously unsubscribe,
-        // execution continues to here before the RefCountOperator has a chance to
-        // supply the RefCountSubscriber with the shared connection Subscription.
-        // For example:
-        // ```
-        // Observable.range(0, 10)
-        //   .publish()
-        //   .refCount()
-        //   .take(5)
-        //   .subscribe();
-        // ```
-        // In order to account for this case, RefCountSubscriber should only dispose
-        // the ConnectableObservable's shared connection Subscription if the
-        // connection Subscription exists, *and* either:
-        //   a. RefCountSubscriber doesn't have a reference to the shared connection
-        //      Subscription yet, or,
-        //   b. RefCountSubscriber's connection Subscription reference is identical
-        //      to the shared connection Subscription
-        ///
-        var connection = this.connection;
-        var sharedConnection = connectable._connection;
-        this.connection = null;
-        if (sharedConnection && (!connection || sharedConnection === connection)) {
-            sharedConnection.unsubscribe();
-        }
-    };
-    return RefCountSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Observable":29,"../Subject":34,"../Subscriber":36,"../Subscription":37}],88:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-var OuterSubscriber_1 = require('../OuterSubscriber');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var DeferObservable = (function (_super) {
-    __extends(DeferObservable, _super);
-    function DeferObservable(observableFactory) {
-        _super.call(this);
-        this.observableFactory = observableFactory;
-    }
-    /**
-     * Creates an Observable that, on subscribe, calls an Observable factory to
-     * make an Observable for each new Observer.
-     *
-     * <span class="informal">Creates the Observable lazily, that is, only when it
-     * is subscribed.
-     * </span>
-     *
-     * <img src="./img/defer.png" width="100%">
-     *
-     * `defer` allows you to create the Observable only when the Observer
-     * subscribes, and create a fresh Observable for each Observer. It waits until
-     * an Observer subscribes to it, and then it generates an Observable,
-     * typically with an Observable factory function. It does this afresh for each
-     * subscriber, so although each subscriber may think it is subscribing to the
-     * same Observable, in fact each subscriber gets its own individual
-     * Observable.
-     *
-     * @example <caption>Subscribe to either an Observable of clicks or an Observable of interval, at random</caption>
-     * var clicksOrInterval = Rx.Observable.defer(function () {
-     *   if (Math.random() > 0.5) {
-     *     return Rx.Observable.fromEvent(document, 'click');
-     *   } else {
-     *     return Rx.Observable.interval(1000);
-     *   }
-     * });
-     * clicksOrInterval.subscribe(x => console.log(x));
-     *
-     * // Results in the following behavior:
-     * // If the result of Math.random() is greater than 0.5 it will listen
-     * // for clicks anywhere on the "document"; when document is clicked it
-     * // will log a MouseEvent object to the console. If the result is less
-     * // than 0.5 it will emit ascending numbers, one every second(1000ms).
-     *
-     * @see {@link create}
-     *
-     * @param {function(): SubscribableOrPromise} observableFactory The Observable
-     * factory function to invoke for each Observer that subscribes to the output
-     * Observable. May also return a Promise, which will be converted on the fly
-     * to an Observable.
-     * @return {Observable} An Observable whose Observers' subscriptions trigger
-     * an invocation of the given Observable factory function.
-     * @static true
-     * @name defer
-     * @owner Observable
+    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
+     * but this is not important since only literal bytes will be emitted.
      */
-    DeferObservable.create = function (observableFactory) {
-        return new DeferObservable(observableFactory);
-    };
-    DeferObservable.prototype._subscribe = function (subscriber) {
-        return new DeferSubscriber(subscriber, this.observableFactory);
-    };
-    return DeferObservable;
-}(Observable_1.Observable));
-exports.DeferObservable = DeferObservable;
-var DeferSubscriber = (function (_super) {
-    __extends(DeferSubscriber, _super);
-    function DeferSubscriber(destination, factory) {
-        _super.call(this, destination);
-        this.factory = factory;
-        this.tryDefer();
-    }
-    DeferSubscriber.prototype.tryDefer = function () {
-        try {
-            this._callFactory();
-        }
-        catch (err) {
-            this._error(err);
-        }
-    };
-    DeferSubscriber.prototype._callFactory = function () {
-        var result = this.factory();
-        if (result) {
-            this.add(subscribeToResult_1.subscribeToResult(this, result));
-        }
-    };
-    return DeferSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
 
-},{"../Observable":29,"../OuterSubscriber":31,"../util/subscribeToResult":173}],89:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
+  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);
+
+  /* If the WIN_INIT bytes after the end of the current data have never been
+   * written, then zero those bytes in order to avoid memory check reports of
+   * the use of uninitialized (or uninitialised as Julian writes) bytes by
+   * the longest match routines.  Update the high water mark for the next
+   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match
+   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
+   */
+//  if (s.high_water < s.window_size) {
+//    var curr = s.strstart + s.lookahead;
+//    var init = 0;
+//
+//    if (s.high_water < curr) {
+//      /* Previous high water mark below current data -- zero WIN_INIT
+//       * bytes or up to end of window, whichever is less.
+//       */
+//      init = s.window_size - curr;
+//      if (init > WIN_INIT)
+//        init = WIN_INIT;
+//      zmemzero(s->window + curr, (unsigned)init);
+//      s->high_water = curr + init;
+//    }
+//    else if (s->high_water < (ulg)curr + WIN_INIT) {
+//      /* High water mark at or above current data, but below current data
+//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
+//       * to end of window, whichever is less.
+//       */
+//      init = (ulg)curr + WIN_INIT - s->high_water;
+//      if (init > s->window_size - s->high_water)
+//        init = s->window_size - s->high_water;
+//      zmemzero(s->window + s->high_water, (unsigned)init);
+//      s->high_water += init;
+//    }
+//  }
+//
+//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
+//    "not enough room for search");
+}
+
+/* ===========================================================================
+ * Copy without compression as much as possible from the input stream, return
+ * the current block state.
+ * This function does not insert new strings in the dictionary since
+ * uncompressible data is probably not useful. This function is used
+ * only for the level=0 compression option.
+ * NOTE: this function should be optimized to avoid extra copying from
+ * window to pending_buf.
  */
-var EmptyObservable = (function (_super) {
-    __extends(EmptyObservable, _super);
-    function EmptyObservable(scheduler) {
-        _super.call(this);
-        this.scheduler = scheduler;
+function deflate_stored(s, flush) {
+  /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
+   * to pending_buf_size, and each stored block has a 5 byte header:
+   */
+  var max_block_size = 0xffff;
+
+  if (max_block_size > s.pending_buf_size - 5) {
+    max_block_size = s.pending_buf_size - 5;
+  }
+
+  /* Copy as much as possible from input to output: */
+  for (;;) {
+    /* Fill the window as much as possible: */
+    if (s.lookahead <= 1) {
+
+      //Assert(s->strstart < s->w_size+MAX_DIST(s) ||
+      //  s->block_start >= (long)s->w_size, "slide too late");
+//      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||
+//        s.block_start >= s.w_size)) {
+//        throw  new Error("slide too late");
+//      }
+
+      fill_window(s);
+      if (s.lookahead === 0 && flush === Z_NO_FLUSH) {
+        return BS_NEED_MORE;
+      }
+
+      if (s.lookahead === 0) {
+        break;
+      }
+      /* flush the current block */
     }
-    /**
-     * Creates an Observable that emits no items to the Observer and immediately
-     * emits a complete notification.
-     *
-     * <span class="informal">Just emits 'complete', and nothing else.
-     * </span>
-     *
-     * <img src="./img/empty.png" width="100%">
-     *
-     * This static operator is useful for creating a simple Observable that only
-     * emits the complete notification. It can be used for composing with other
-     * Observables, such as in a {@link mergeMap}.
-     *
-     * @example <caption>Emit the number 7, then complete.</caption>
-     * var result = Rx.Observable.empty().startWith(7);
-     * result.subscribe(x => console.log(x));
-     *
-     * @example <caption>Map and flatten only odd numbers to the sequence 'a', 'b', 'c'</caption>
-     * var interval = Rx.Observable.interval(1000);
-     * var result = interval.mergeMap(x =>
-     *   x % 2 === 1 ? Rx.Observable.of('a', 'b', 'c') : Rx.Observable.empty()
-     * );
-     * result.subscribe(x => console.log(x));
-     *
-     * // Results in the following to the console:
-     * // x is equal to the count on the interval eg(0,1,2,3,...)
-     * // x will occur every 1000ms
-     * // if x % 2 is equal to 1 print abc
-     * // if x % 2 is not equal to 1 nothing will be output
-     *
-     * @see {@link create}
-     * @see {@link never}
-     * @see {@link of}
-     * @see {@link throw}
-     *
-     * @param {Scheduler} [scheduler] A {@link IScheduler} to use for scheduling
-     * the emission of the complete notification.
-     * @return {Observable} An "empty" Observable: emits only the complete
-     * notification.
-     * @static true
-     * @name empty
-     * @owner Observable
-     */
-    EmptyObservable.create = function (scheduler) {
-        return new EmptyObservable(scheduler);
-    };
-    EmptyObservable.dispatch = function (arg) {
-        var subscriber = arg.subscriber;
-        subscriber.complete();
-    };
-    EmptyObservable.prototype._subscribe = function (subscriber) {
-        var scheduler = this.scheduler;
-        if (scheduler) {
-            return scheduler.schedule(EmptyObservable.dispatch, 0, { subscriber: subscriber });
-        }
-        else {
-            subscriber.complete();
-        }
-    };
-    return EmptyObservable;
-}(Observable_1.Observable));
-exports.EmptyObservable = EmptyObservable;
+    //Assert(s->block_start >= 0L, "block gone");
+//    if (s.block_start < 0) throw new Error("block gone");
+
+    s.strstart += s.lookahead;
+    s.lookahead = 0;
+
+    /* Emit a stored block if pending_buf will be full: */
+    var max_start = s.block_start + max_block_size;
+
+    if (s.strstart === 0 || s.strstart >= max_start) {
+      /* strstart == 0 is possible when wraparound on 16-bit machine */
+      s.lookahead = s.strstart - max_start;
+      s.strstart = max_start;
+      /*** FLUSH_BLOCK(s, 0); ***/
+      flush_block_only(s, false);
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+      /***/
+
 
-},{"../Observable":29}],90:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var ErrorObservable = (function (_super) {
-    __extends(ErrorObservable, _super);
-    function ErrorObservable(error, scheduler) {
-        _super.call(this);
-        this.error = error;
-        this.scheduler = scheduler;
     }
-    /**
-     * Creates an Observable that emits no items to the Observer and immediately
-     * emits an error notification.
-     *
-     * <span class="informal">Just emits 'error', and nothing else.
-     * </span>
-     *
-     * <img src="./img/throw.png" width="100%">
-     *
-     * This static operator is useful for creating a simple Observable that only
-     * emits the error notification. It can be used for composing with other
-     * Observables, such as in a {@link mergeMap}.
-     *
-     * @example <caption>Emit the number 7, then emit an error.</caption>
-     * var result = Rx.Observable.throw(new Error('oops!')).startWith(7);
-     * result.subscribe(x => console.log(x), e => console.error(e));
-     *
-     * @example <caption>Map and flatten numbers to the sequence 'a', 'b', 'c', but throw an error for 13</caption>
-     * var interval = Rx.Observable.interval(1000);
-     * var result = interval.mergeMap(x =>
-     *   x === 13 ?
-     *     Rx.Observable.throw('Thirteens are bad') :
-     *     Rx.Observable.of('a', 'b', 'c')
-     * );
-     * result.subscribe(x => console.log(x), e => console.error(e));
-     *
-     * @see {@link create}
-     * @see {@link empty}
-     * @see {@link never}
-     * @see {@link of}
-     *
-     * @param {any} error The particular Error to pass to the error notification.
-     * @param {Scheduler} [scheduler] A {@link IScheduler} to use for scheduling
-     * the emission of the error notification.
-     * @return {Observable} An error Observable: emits only the error notification
-     * using the given error argument.
-     * @static true
-     * @name throw
-     * @owner Observable
+    /* Flush if we may have to slide, otherwise block_start may become
+     * negative and the data will be gone:
      */
-    ErrorObservable.create = function (error, scheduler) {
-        return new ErrorObservable(error, scheduler);
-    };
-    ErrorObservable.dispatch = function (arg) {
-        var error = arg.error, subscriber = arg.subscriber;
-        subscriber.error(error);
-    };
-    ErrorObservable.prototype._subscribe = function (subscriber) {
-        var error = this.error;
-        var scheduler = this.scheduler;
-        subscriber.syncErrorThrowable = true;
-        if (scheduler) {
-            return scheduler.schedule(ErrorObservable.dispatch, 0, {
-                error: error, subscriber: subscriber
-            });
-        }
-        else {
-            subscriber.error(error);
-        }
-    };
-    return ErrorObservable;
-}(Observable_1.Observable));
-exports.ErrorObservable = ErrorObservable;
+    if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {
+      /*** FLUSH_BLOCK(s, 0); ***/
+      flush_block_only(s, false);
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+      /***/
+    }
+  }
 
-},{"../Observable":29}],91:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-var tryCatch_1 = require('../util/tryCatch');
-var isFunction_1 = require('../util/isFunction');
-var errorObject_1 = require('../util/errorObject');
-var Subscription_1 = require('../Subscription');
-var toString = Object.prototype.toString;
-function isNodeStyleEventEmitter(sourceObj) {
-    return !!sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';
-}
-function isJQueryStyleEventEmitter(sourceObj) {
-    return !!sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';
-}
-function isNodeList(sourceObj) {
-    return !!sourceObj && toString.call(sourceObj) === '[object NodeList]';
-}
-function isHTMLCollection(sourceObj) {
-    return !!sourceObj && toString.call(sourceObj) === '[object HTMLCollection]';
-}
-function isEventTarget(sourceObj) {
-    return !!sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';
+  s.insert = 0;
+
+  if (flush === Z_FINISH) {
+    /*** FLUSH_BLOCK(s, 1); ***/
+    flush_block_only(s, true);
+    if (s.strm.avail_out === 0) {
+      return BS_FINISH_STARTED;
+    }
+    /***/
+    return BS_FINISH_DONE;
+  }
+
+  if (s.strstart > s.block_start) {
+    /*** FLUSH_BLOCK(s, 0); ***/
+    flush_block_only(s, false);
+    if (s.strm.avail_out === 0) {
+      return BS_NEED_MORE;
+    }
+    /***/
+  }
+
+  return BS_NEED_MORE;
 }
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var FromEventObservable = (function (_super) {
-    __extends(FromEventObservable, _super);
-    function FromEventObservable(sourceObj, eventName, selector, options) {
-        _super.call(this);
-        this.sourceObj = sourceObj;
-        this.eventName = eventName;
-        this.selector = selector;
-        this.options = options;
-    }
-    /* tslint:enable:max-line-length */
-    /**
-     * Creates an Observable that emits events of a specific type coming from the
-     * given event target.
-     *
-     * <span class="informal">Creates an Observable from DOM events, or Node
-     * EventEmitter events or others.</span>
-     *
-     * <img src="./img/fromEvent.png" width="100%">
-     *
-     * Creates an Observable by attaching an event listener to an "event target",
-     * which may be an object with `addEventListener` and `removeEventListener`,
-     * a Node.js EventEmitter, a jQuery style EventEmitter, a NodeList from the
-     * DOM, or an HTMLCollection from the DOM. The event handler is attached when
-     * the output Observable is subscribed, and removed when the Subscription is
-     * unsubscribed.
-     *
-     * @example <caption>Emits clicks happening on the DOM document</caption>
-     * var clicks = Rx.Observable.fromEvent(document, 'click');
-     * clicks.subscribe(x => console.log(x));
-     *
-     * // Results in:
-     * // MouseEvent object logged to console everytime a click
-     * // occurs on the document.
-     *
-     * @see {@link from}
-     * @see {@link fromEventPattern}
-     *
-     * @param {EventTargetLike} target The DOMElement, event target, Node.js
-     * EventEmitter, NodeList or HTMLCollection to attach the event handler to.
-     * @param {string} eventName The event name of interest, being emitted by the
-     * `target`.
-     * @param {EventListenerOptions} [options] Options to pass through to addEventListener
-     * @param {SelectorMethodSignature<T>} [selector] An optional function to
-     * post-process results. It takes the arguments from the event handler and
-     * should return a single value.
-     * @return {Observable<T>}
-     * @static true
-     * @name fromEvent
-     * @owner Observable
-     */
-    FromEventObservable.create = function (target, eventName, options, selector) {
-        if (isFunction_1.isFunction(options)) {
-            selector = options;
-            options = undefined;
-        }
-        return new FromEventObservable(target, eventName, selector, options);
-    };
-    FromEventObservable.setupSubscription = function (sourceObj, eventName, handler, subscriber, options) {
-        var unsubscribe;
-        if (isNodeList(sourceObj) || isHTMLCollection(sourceObj)) {
-            for (var i = 0, len = sourceObj.length; i < len; i++) {
-                FromEventObservable.setupSubscription(sourceObj[i], eventName, handler, subscriber, options);
-            }
-        }
-        else if (isEventTarget(sourceObj)) {
-            var source_1 = sourceObj;
-            sourceObj.addEventListener(eventName, handler, options);
-            unsubscribe = function () { return source_1.removeEventListener(eventName, handler); };
-        }
-        else if (isJQueryStyleEventEmitter(sourceObj)) {
-            var source_2 = sourceObj;
-            sourceObj.on(eventName, handler);
-            unsubscribe = function () { return source_2.off(eventName, handler); };
-        }
-        else if (isNodeStyleEventEmitter(sourceObj)) {
-            var source_3 = sourceObj;
-            sourceObj.addListener(eventName, handler);
-            unsubscribe = function () { return source_3.removeListener(eventName, handler); };
-        }
-        else {
-            throw new TypeError('Invalid event target');
-        }
-        subscriber.add(new Subscription_1.Subscription(unsubscribe));
-    };
-    FromEventObservable.prototype._subscribe = function (subscriber) {
-        var sourceObj = this.sourceObj;
-        var eventName = this.eventName;
-        var options = this.options;
-        var selector = this.selector;
-        var handler = selector ? function () {
-            var args = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                args[_i - 0] = arguments[_i];
-            }
-            var result = tryCatch_1.tryCatch(selector).apply(void 0, args);
-            if (result === errorObject_1.errorObject) {
-                subscriber.error(errorObject_1.errorObject.e);
-            }
-            else {
-                subscriber.next(result);
-            }
-        } : function (e) { return subscriber.next(e); };
-        FromEventObservable.setupSubscription(sourceObj, eventName, handler, subscriber, options);
-    };
-    return FromEventObservable;
-}(Observable_1.Observable));
-exports.FromEventObservable = FromEventObservable;
 
-},{"../Observable":29,"../Subscription":37,"../util/errorObject":163,"../util/isFunction":167,"../util/tryCatch":175}],92:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var isArray_1 = require('../util/isArray');
-var isArrayLike_1 = require('../util/isArrayLike');
-var isPromise_1 = require('../util/isPromise');
-var PromiseObservable_1 = require('./PromiseObservable');
-var IteratorObservable_1 = require('./IteratorObservable');
-var ArrayObservable_1 = require('./ArrayObservable');
-var ArrayLikeObservable_1 = require('./ArrayLikeObservable');
-var iterator_1 = require('../symbol/iterator');
-var Observable_1 = require('../Observable');
-var observeOn_1 = require('../operator/observeOn');
-var observable_1 = require('../symbol/observable');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
+/* ===========================================================================
+ * Compress as much as possible from the input stream, return the current
+ * block state.
+ * This function does not perform lazy evaluation of matches and inserts
+ * new strings in the dictionary only for unmatched strings or for short
+ * matches. It is used only for the fast compression options.
  */
-var FromObservable = (function (_super) {
-    __extends(FromObservable, _super);
-    function FromObservable(ish, scheduler) {
-        _super.call(this, null);
-        this.ish = ish;
-        this.scheduler = scheduler;
+function deflate_fast(s, flush) {
+  var hash_head;        /* head of the hash chain */
+  var bflush;           /* set if current block must be flushed */
+
+  for (;;) {
+    /* Make sure that we always have enough lookahead, except
+     * at the end of the input file. We need MAX_MATCH bytes
+     * for the next match, plus MIN_MATCH bytes to insert the
+     * string following the next match.
+     */
+    if (s.lookahead < MIN_LOOKAHEAD) {
+      fill_window(s);
+      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
+        return BS_NEED_MORE;
+      }
+      if (s.lookahead === 0) {
+        break; /* flush the current block */
+      }
     }
-    /**
-     * Creates an Observable from an Array, an array-like object, a Promise, an
-     * iterable object, or an Observable-like object.
-     *
-     * <span class="informal">Converts almost anything to an Observable.</span>
-     *
-     * <img src="./img/from.png" width="100%">
-     *
-     * Convert various other objects and data types into Observables. `from`
-     * converts a Promise or an array-like or an
-     * [iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#iterable)
-     * object into an Observable that emits the items in that promise or array or
-     * iterable. A String, in this context, is treated as an array of characters.
-     * Observable-like objects (contains a function named with the ES2015 Symbol
-     * for Observable) can also be converted through this operator.
-     *
-     * @example <caption>Converts an array to an Observable</caption>
-     * var array = [10, 20, 30];
-     * var result = Rx.Observable.from(array);
-     * result.subscribe(x => console.log(x));
-     *
-     * // Results in the following:
-     * // 10 20 30
-     *
-     * @example <caption>Convert an infinite iterable (from a generator) to an Observable</caption>
-     * function* generateDoubles(seed) {
-     *   var i = seed;
-     *   while (true) {
-     *     yield i;
-     *     i = 2 * i; // double it
-     *   }
-     * }
-     *
-     * var iterator = generateDoubles(3);
-     * var result = Rx.Observable.from(iterator).take(10);
-     * result.subscribe(x => console.log(x));
-     *
-     * // Results in the following:
-     * // 3 6 12 24 48 96 192 384 768 1536
-     *
-     * @see {@link create}
-     * @see {@link fromEvent}
-     * @see {@link fromEventPattern}
-     * @see {@link fromPromise}
-     *
-     * @param {ObservableInput<T>} ish A subscribable object, a Promise, an
-     * Observable-like, an Array, an iterable or an array-like object to be
-     * converted.
-     * @param {Scheduler} [scheduler] The scheduler on which to schedule the
-     * emissions of values.
-     * @return {Observable<T>} The Observable whose values are originally from the
-     * input object that was converted.
-     * @static true
-     * @name from
-     * @owner Observable
-     */
-    FromObservable.create = function (ish, scheduler) {
-        if (ish != null) {
-            if (typeof ish[observable_1.observable] === 'function') {
-                if (ish instanceof Observable_1.Observable && !scheduler) {
-                    return ish;
-                }
-                return new FromObservable(ish, scheduler);
-            }
-            else if (isArray_1.isArray(ish)) {
-                return new ArrayObservable_1.ArrayObservable(ish, scheduler);
-            }
-            else if (isPromise_1.isPromise(ish)) {
-                return new PromiseObservable_1.PromiseObservable(ish, scheduler);
-            }
-            else if (typeof ish[iterator_1.iterator] === 'function' || typeof ish === 'string') {
-                return new IteratorObservable_1.IteratorObservable(ish, scheduler);
-            }
-            else if (isArrayLike_1.isArrayLike(ish)) {
-                return new ArrayLikeObservable_1.ArrayLikeObservable(ish, scheduler);
-            }
-        }
-        throw new TypeError((ish !== null && typeof ish || ish) + ' is not observable');
-    };
-    FromObservable.prototype._subscribe = function (subscriber) {
-        var ish = this.ish;
-        var scheduler = this.scheduler;
-        if (scheduler == null) {
-            return ish[observable_1.observable]().subscribe(subscriber);
-        }
-        else {
-            return ish[observable_1.observable]().subscribe(new observeOn_1.ObserveOnSubscriber(subscriber, scheduler, 0));
-        }
-    };
-    return FromObservable;
-}(Observable_1.Observable));
-exports.FromObservable = FromObservable;
 
-},{"../Observable":29,"../operator/observeOn":129,"../symbol/iterator":154,"../symbol/observable":155,"../util/isArray":164,"../util/isArrayLike":165,"../util/isPromise":170,"./ArrayLikeObservable":85,"./ArrayObservable":86,"./IteratorObservable":93,"./PromiseObservable":94}],93:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var root_1 = require('../util/root');
-var Observable_1 = require('../Observable');
-var iterator_1 = require('../symbol/iterator');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var IteratorObservable = (function (_super) {
-    __extends(IteratorObservable, _super);
-    function IteratorObservable(iterator, scheduler) {
-        _super.call(this);
-        this.scheduler = scheduler;
-        if (iterator == null) {
-            throw new Error('iterator cannot be null.');
-        }
-        this.iterator = getIterator(iterator);
+    /* Insert the string window[strstart .. strstart+2] in the
+     * dictionary, and set hash_head to the head of the hash chain:
+     */
+    hash_head = 0/*NIL*/;
+    if (s.lookahead >= MIN_MATCH) {
+      /*** INSERT_STRING(s, s.strstart, hash_head); ***/
+      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
+      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
+      s.head[s.ins_h] = s.strstart;
+      /***/
     }
-    IteratorObservable.create = function (iterator, scheduler) {
-        return new IteratorObservable(iterator, scheduler);
-    };
-    IteratorObservable.dispatch = function (state) {
-        var index = state.index, hasError = state.hasError, iterator = state.iterator, subscriber = state.subscriber;
-        if (hasError) {
-            subscriber.error(state.error);
-            return;
-        }
-        var result = iterator.next();
-        if (result.done) {
-            subscriber.complete();
-            return;
-        }
-        subscriber.next(result.value);
-        state.index = index + 1;
-        if (subscriber.closed) {
-            if (typeof iterator.return === 'function') {
-                iterator.return();
-            }
-            return;
-        }
-        this.schedule(state);
-    };
-    IteratorObservable.prototype._subscribe = function (subscriber) {
-        var index = 0;
-        var _a = this, iterator = _a.iterator, scheduler = _a.scheduler;
-        if (scheduler) {
-            return scheduler.schedule(IteratorObservable.dispatch, 0, {
-                index: index, iterator: iterator, subscriber: subscriber
-            });
-        }
-        else {
-            do {
-                var result = iterator.next();
-                if (result.done) {
-                    subscriber.complete();
-                    break;
-                }
-                else {
-                    subscriber.next(result.value);
-                }
-                if (subscriber.closed) {
-                    if (typeof iterator.return === 'function') {
-                        iterator.return();
-                    }
-                    break;
-                }
-            } while (true);
-        }
-    };
-    return IteratorObservable;
-}(Observable_1.Observable));
-exports.IteratorObservable = IteratorObservable;
-var StringIterator = (function () {
-    function StringIterator(str, idx, len) {
-        if (idx === void 0) { idx = 0; }
-        if (len === void 0) { len = str.length; }
-        this.str = str;
-        this.idx = idx;
-        this.len = len;
-    }
-    StringIterator.prototype[iterator_1.iterator] = function () { return (this); };
-    StringIterator.prototype.next = function () {
-        return this.idx < this.len ? {
-            done: false,
-            value: this.str.charAt(this.idx++)
-        } : {
-            done: true,
-            value: undefined
-        };
-    };
-    return StringIterator;
-}());
-var ArrayIterator = (function () {
-    function ArrayIterator(arr, idx, len) {
-        if (idx === void 0) { idx = 0; }
-        if (len === void 0) { len = toLength(arr); }
-        this.arr = arr;
-        this.idx = idx;
-        this.len = len;
-    }
-    ArrayIterator.prototype[iterator_1.iterator] = function () { return this; };
-    ArrayIterator.prototype.next = function () {
-        return this.idx < this.len ? {
-            done: false,
-            value: this.arr[this.idx++]
-        } : {
-            done: true,
-            value: undefined
-        };
-    };
-    return ArrayIterator;
-}());
-function getIterator(obj) {
-    var i = obj[iterator_1.iterator];
-    if (!i && typeof obj === 'string') {
-        return new StringIterator(obj);
+
+    /* Find the longest match, discarding those <= prev_length.
+     * At this point we have always match_length < MIN_MATCH
+     */
+    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {
+      /* To simplify the code, we prevent matches with the string
+       * of window index 0 (in particular we have to avoid a match
+       * of the string with itself at the start of the input file).
+       */
+      s.match_length = longest_match(s, hash_head);
+      /* longest_match() sets match_start */
     }
-    if (!i && obj.length !== undefined) {
-        return new ArrayIterator(obj);
+    if (s.match_length >= MIN_MATCH) {
+      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only
+
+      /*** _tr_tally_dist(s, s.strstart - s.match_start,
+                     s.match_length - MIN_MATCH, bflush); ***/
+      bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);
+
+      s.lookahead -= s.match_length;
+
+      /* Insert new strings in the hash table only if the match length
+       * is not too large. This saves time but degrades compression.
+       */
+      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {
+        s.match_length--; /* string at strstart already in table */
+        do {
+          s.strstart++;
+          /*** INSERT_STRING(s, s.strstart, hash_head); ***/
+          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
+          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
+          s.head[s.ins_h] = s.strstart;
+          /***/
+          /* strstart never exceeds WSIZE-MAX_MATCH, so there are
+           * always MIN_MATCH bytes ahead.
+           */
+        } while (--s.match_length !== 0);
+        s.strstart++;
+      } else
+      {
+        s.strstart += s.match_length;
+        s.match_length = 0;
+        s.ins_h = s.window[s.strstart];
+        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
+        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;
+
+//#if MIN_MATCH != 3
+//                Call UPDATE_HASH() MIN_MATCH-3 more times
+//#endif
+        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
+         * matter since it will be recomputed at next deflate call.
+         */
+      }
+    } else {
+      /* No match, output a literal byte */
+      //Tracevv((stderr,"%c", s.window[s.strstart]));
+      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
+      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
+
+      s.lookahead--;
+      s.strstart++;
+    }
+    if (bflush) {
+      /*** FLUSH_BLOCK(s, 0); ***/
+      flush_block_only(s, false);
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+      /***/
     }
-    if (!i) {
-        throw new TypeError('object is not iterable');
+  }
+  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);
+  if (flush === Z_FINISH) {
+    /*** FLUSH_BLOCK(s, 1); ***/
+    flush_block_only(s, true);
+    if (s.strm.avail_out === 0) {
+      return BS_FINISH_STARTED;
+    }
+    /***/
+    return BS_FINISH_DONE;
+  }
+  if (s.last_lit) {
+    /*** FLUSH_BLOCK(s, 0); ***/
+    flush_block_only(s, false);
+    if (s.strm.avail_out === 0) {
+      return BS_NEED_MORE;
     }
-    return obj[iterator_1.iterator]();
+    /***/
+  }
+  return BS_BLOCK_DONE;
 }
-var maxSafeInteger = Math.pow(2, 53) - 1;
-function toLength(o) {
-    var len = +o.length;
-    if (isNaN(len)) {
-        return 0;
-    }
-    if (len === 0 || !numberIsFinite(len)) {
-        return len;
+
+/* ===========================================================================
+ * Same as above, but achieves better compression. We use a lazy
+ * evaluation for matches: a match is finally adopted only if there is
+ * no better match at the next window position.
+ */
+function deflate_slow(s, flush) {
+  var hash_head;          /* head of hash chain */
+  var bflush;              /* set if current block must be flushed */
+
+  var max_insert;
+
+  /* Process the input block. */
+  for (;;) {
+    /* Make sure that we always have enough lookahead, except
+     * at the end of the input file. We need MAX_MATCH bytes
+     * for the next match, plus MIN_MATCH bytes to insert the
+     * string following the next match.
+     */
+    if (s.lookahead < MIN_LOOKAHEAD) {
+      fill_window(s);
+      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
+        return BS_NEED_MORE;
+      }
+      if (s.lookahead === 0) { break; } /* flush the current block */
     }
-    len = sign(len) * Math.floor(Math.abs(len));
-    if (len <= 0) {
-        return 0;
+
+    /* Insert the string window[strstart .. strstart+2] in the
+     * dictionary, and set hash_head to the head of the hash chain:
+     */
+    hash_head = 0/*NIL*/;
+    if (s.lookahead >= MIN_MATCH) {
+      /*** INSERT_STRING(s, s.strstart, hash_head); ***/
+      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
+      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
+      s.head[s.ins_h] = s.strstart;
+      /***/
     }
-    if (len > maxSafeInteger) {
-        return maxSafeInteger;
+
+    /* Find the longest match, discarding those <= prev_length.
+     */
+    s.prev_length = s.match_length;
+    s.prev_match = s.match_start;
+    s.match_length = MIN_MATCH - 1;
+
+    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&
+        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {
+      /* To simplify the code, we prevent matches with the string
+       * of window index 0 (in particular we have to avoid a match
+       * of the string with itself at the start of the input file).
+       */
+      s.match_length = longest_match(s, hash_head);
+      /* longest_match() sets match_start */
+
+      if (s.match_length <= 5 &&
+         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {
+
+        /* If prev_match is also MIN_MATCH, match_start is garbage
+         * but we will ignore the current match anyway.
+         */
+        s.match_length = MIN_MATCH - 1;
+      }
     }
-    return len;
-}
-function numberIsFinite(value) {
-    return typeof value === 'number' && root_1.root.isFinite(value);
-}
-function sign(value) {
-    var valueAsNumber = +value;
-    if (valueAsNumber === 0) {
-        return valueAsNumber;
+    /* If there was a match at the previous step and the current
+     * match is not better, output the previous match:
+     */
+    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {
+      max_insert = s.strstart + s.lookahead - MIN_MATCH;
+      /* Do not insert strings in hash table beyond this. */
+
+      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);
+
+      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,
+                     s.prev_length - MIN_MATCH, bflush);***/
+      bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);
+      /* Insert in hash table all strings up to the end of the match.
+       * strstart-1 and strstart are already inserted. If there is not
+       * enough lookahead, the last two strings are not inserted in
+       * the hash table.
+       */
+      s.lookahead -= s.prev_length - 1;
+      s.prev_length -= 2;
+      do {
+        if (++s.strstart <= max_insert) {
+          /*** INSERT_STRING(s, s.strstart, hash_head); ***/
+          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
+          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
+          s.head[s.ins_h] = s.strstart;
+          /***/
+        }
+      } while (--s.prev_length !== 0);
+      s.match_available = 0;
+      s.match_length = MIN_MATCH - 1;
+      s.strstart++;
+
+      if (bflush) {
+        /*** FLUSH_BLOCK(s, 0); ***/
+        flush_block_only(s, false);
+        if (s.strm.avail_out === 0) {
+          return BS_NEED_MORE;
+        }
+        /***/
+      }
+
+    } else if (s.match_available) {
+      /* If there was no match at the previous position, output a
+       * single literal. If there was a match but the current match
+       * is longer, truncate the previous match to a single literal.
+       */
+      //Tracevv((stderr,"%c", s->window[s->strstart-1]));
+      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
+      bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
+
+      if (bflush) {
+        /*** FLUSH_BLOCK_ONLY(s, 0) ***/
+        flush_block_only(s, false);
+        /***/
+      }
+      s.strstart++;
+      s.lookahead--;
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+    } else {
+      /* There is no previous match to compare with, wait for
+       * the next step to decide.
+       */
+      s.match_available = 1;
+      s.strstart++;
+      s.lookahead--;
     }
-    if (isNaN(valueAsNumber)) {
-        return valueAsNumber;
+  }
+  //Assert (flush != Z_NO_FLUSH, "no flush?");
+  if (s.match_available) {
+    //Tracevv((stderr,"%c", s->window[s->strstart-1]));
+    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
+    bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
+
+    s.match_available = 0;
+  }
+  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;
+  if (flush === Z_FINISH) {
+    /*** FLUSH_BLOCK(s, 1); ***/
+    flush_block_only(s, true);
+    if (s.strm.avail_out === 0) {
+      return BS_FINISH_STARTED;
+    }
+    /***/
+    return BS_FINISH_DONE;
+  }
+  if (s.last_lit) {
+    /*** FLUSH_BLOCK(s, 0); ***/
+    flush_block_only(s, false);
+    if (s.strm.avail_out === 0) {
+      return BS_NEED_MORE;
     }
-    return valueAsNumber < 0 ? -1 : 1;
+    /***/
+  }
+
+  return BS_BLOCK_DONE;
 }
 
-},{"../Observable":29,"../symbol/iterator":154,"../util/root":172}],94:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var root_1 = require('../util/root');
-var Observable_1 = require('../Observable');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
+
+/* ===========================================================================
+ * For Z_RLE, simply look for runs of bytes, generate matches only of distance
+ * one.  Do not maintain a hash table.  (It will be regenerated if this run of
+ * deflate switches away from Z_RLE.)
  */
-var PromiseObservable = (function (_super) {
-    __extends(PromiseObservable, _super);
-    function PromiseObservable(promise, scheduler) {
-        _super.call(this);
-        this.promise = promise;
-        this.scheduler = scheduler;
+function deflate_rle(s, flush) {
+  var bflush;            /* set if current block must be flushed */
+  var prev;              /* byte at distance one to match */
+  var scan, strend;      /* scan goes up to strend for length of run */
+
+  var _win = s.window;
+
+  for (;;) {
+    /* Make sure that we always have enough lookahead, except
+     * at the end of the input file. We need MAX_MATCH bytes
+     * for the longest run, plus one for the unrolled loop.
+     */
+    if (s.lookahead <= MAX_MATCH) {
+      fill_window(s);
+      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {
+        return BS_NEED_MORE;
+      }
+      if (s.lookahead === 0) { break; } /* flush the current block */
     }
-    /**
-     * Converts a Promise to an Observable.
-     *
-     * <span class="informal">Returns an Observable that just emits the Promise's
-     * resolved value, then completes.</span>
-     *
-     * Converts an ES2015 Promise or a Promises/A+ spec compliant Promise to an
-     * Observable. If the Promise resolves with a value, the output Observable
-     * emits that resolved value as a `next`, and then completes. If the Promise
-     * is rejected, then the output Observable emits the corresponding Error.
-     *
-     * @example <caption>Convert the Promise returned by Fetch to an Observable</caption>
-     * var result = Rx.Observable.fromPromise(fetch('http://myserver.com/'));
-     * result.subscribe(x => console.log(x), e => console.error(e));
-     *
-     * @see {@link bindCallback}
-     * @see {@link from}
-     *
-     * @param {PromiseLike<T>} promise The promise to be converted.
-     * @param {Scheduler} [scheduler] An optional IScheduler to use for scheduling
-     * the delivery of the resolved value (or the rejection).
-     * @return {Observable<T>} An Observable which wraps the Promise.
-     * @static true
-     * @name fromPromise
-     * @owner Observable
-     */
-    PromiseObservable.create = function (promise, scheduler) {
-        return new PromiseObservable(promise, scheduler);
-    };
-    PromiseObservable.prototype._subscribe = function (subscriber) {
-        var _this = this;
-        var promise = this.promise;
-        var scheduler = this.scheduler;
-        if (scheduler == null) {
-            if (this._isScalar) {
-                if (!subscriber.closed) {
-                    subscriber.next(this.value);
-                    subscriber.complete();
-                }
-            }
-            else {
-                promise.then(function (value) {
-                    _this.value = value;
-                    _this._isScalar = true;
-                    if (!subscriber.closed) {
-                        subscriber.next(value);
-                        subscriber.complete();
-                    }
-                }, function (err) {
-                    if (!subscriber.closed) {
-                        subscriber.error(err);
-                    }
-                })
-                    .then(null, function (err) {
-                    // escape the promise trap, throw unhandled errors
-                    root_1.root.setTimeout(function () { throw err; });
-                });
-            }
-        }
-        else {
-            if (this._isScalar) {
-                if (!subscriber.closed) {
-                    return scheduler.schedule(dispatchNext, 0, { value: this.value, subscriber: subscriber });
-                }
-            }
-            else {
-                promise.then(function (value) {
-                    _this.value = value;
-                    _this._isScalar = true;
-                    if (!subscriber.closed) {
-                        subscriber.add(scheduler.schedule(dispatchNext, 0, { value: value, subscriber: subscriber }));
-                    }
-                }, function (err) {
-                    if (!subscriber.closed) {
-                        subscriber.add(scheduler.schedule(dispatchError, 0, { err: err, subscriber: subscriber }));
-                    }
-                })
-                    .then(null, function (err) {
-                    // escape the promise trap, throw unhandled errors
-                    root_1.root.setTimeout(function () { throw err; });
-                });
-            }
+
+    /* See how many times the previous byte repeats */
+    s.match_length = 0;
+    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {
+      scan = s.strstart - 1;
+      prev = _win[scan];
+      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
+        strend = s.strstart + MAX_MATCH;
+        do {
+          /*jshint noempty:false*/
+        } while (prev === _win[++scan] && prev === _win[++scan] &&
+                 prev === _win[++scan] && prev === _win[++scan] &&
+                 prev === _win[++scan] && prev === _win[++scan] &&
+                 prev === _win[++scan] && prev === _win[++scan] &&
+                 scan < strend);
+        s.match_length = MAX_MATCH - (strend - scan);
+        if (s.match_length > s.lookahead) {
+          s.match_length = s.lookahead;
         }
-    };
-    return PromiseObservable;
-}(Observable_1.Observable));
-exports.PromiseObservable = PromiseObservable;
-function dispatchNext(arg) {
-    var value = arg.value, subscriber = arg.subscriber;
-    if (!subscriber.closed) {
-        subscriber.next(value);
-        subscriber.complete();
-    }
-}
-function dispatchError(arg) {
-    var err = arg.err, subscriber = arg.subscriber;
-    if (!subscriber.closed) {
-        subscriber.error(err);
+      }
+      //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
     }
-}
 
-},{"../Observable":29,"../util/root":172}],95:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var ScalarObservable = (function (_super) {
-    __extends(ScalarObservable, _super);
-    function ScalarObservable(value, scheduler) {
-        _super.call(this);
-        this.value = value;
-        this.scheduler = scheduler;
-        this._isScalar = true;
-        if (scheduler) {
-            this._isScalar = false;
-        }
+    /* Emit match if have run of MIN_MATCH or longer, else emit literal */
+    if (s.match_length >= MIN_MATCH) {
+      //check_match(s, s.strstart, s.strstart - 1, s.match_length);
+
+      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/
+      bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);
+
+      s.lookahead -= s.match_length;
+      s.strstart += s.match_length;
+      s.match_length = 0;
+    } else {
+      /* No match, output a literal byte */
+      //Tracevv((stderr,"%c", s->window[s->strstart]));
+      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
+      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
+
+      s.lookahead--;
+      s.strstart++;
+    }
+    if (bflush) {
+      /*** FLUSH_BLOCK(s, 0); ***/
+      flush_block_only(s, false);
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+      /***/
     }
-    ScalarObservable.create = function (value, scheduler) {
-        return new ScalarObservable(value, scheduler);
-    };
-    ScalarObservable.dispatch = function (state) {
-        var done = state.done, value = state.value, subscriber = state.subscriber;
-        if (done) {
-            subscriber.complete();
-            return;
-        }
-        subscriber.next(value);
-        if (subscriber.closed) {
-            return;
-        }
-        state.done = true;
-        this.schedule(state);
-    };
-    ScalarObservable.prototype._subscribe = function (subscriber) {
-        var value = this.value;
-        var scheduler = this.scheduler;
-        if (scheduler) {
-            return scheduler.schedule(ScalarObservable.dispatch, 0, {
-                done: false, value: value, subscriber: subscriber
-            });
-        }
-        else {
-            subscriber.next(value);
-            if (!subscriber.closed) {
-                subscriber.complete();
-            }
-        }
-    };
-    return ScalarObservable;
-}(Observable_1.Observable));
-exports.ScalarObservable = ScalarObservable;
+  }
+  s.insert = 0;
+  if (flush === Z_FINISH) {
+    /*** FLUSH_BLOCK(s, 1); ***/
+    flush_block_only(s, true);
+    if (s.strm.avail_out === 0) {
+      return BS_FINISH_STARTED;
+    }
+    /***/
+    return BS_FINISH_DONE;
+  }
+  if (s.last_lit) {
+    /*** FLUSH_BLOCK(s, 0); ***/
+    flush_block_only(s, false);
+    if (s.strm.avail_out === 0) {
+      return BS_NEED_MORE;
+    }
+    /***/
+  }
+  return BS_BLOCK_DONE;
+}
 
-},{"../Observable":29}],96:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var isNumeric_1 = require('../util/isNumeric');
-var Observable_1 = require('../Observable');
-var async_1 = require('../scheduler/async');
-var isScheduler_1 = require('../util/isScheduler');
-var isDate_1 = require('../util/isDate');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
+/* ===========================================================================
+ * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.
+ * (It will be regenerated if this run of deflate switches away from Huffman.)
  */
-var TimerObservable = (function (_super) {
-    __extends(TimerObservable, _super);
-    function TimerObservable(dueTime, period, scheduler) {
-        if (dueTime === void 0) { dueTime = 0; }
-        _super.call(this);
-        this.period = -1;
-        this.dueTime = 0;
-        if (isNumeric_1.isNumeric(period)) {
-            this.period = Number(period) < 1 && 1 || Number(period);
-        }
-        else if (isScheduler_1.isScheduler(period)) {
-            scheduler = period;
-        }
-        if (!isScheduler_1.isScheduler(scheduler)) {
-            scheduler = async_1.async;
-        }
-        this.scheduler = scheduler;
-        this.dueTime = isDate_1.isDate(dueTime) ?
-            (+dueTime - this.scheduler.now()) :
-            dueTime;
-    }
-    /**
-     * Creates an Observable that starts emitting after an `initialDelay` and
-     * emits ever increasing numbers after each `period` of time thereafter.
-     *
-     * <span class="informal">Its like {@link interval}, but you can specify when
-     * should the emissions start.</span>
-     *
-     * <img src="./img/timer.png" width="100%">
-     *
-     * `timer` returns an Observable that emits an infinite sequence of ascending
-     * integers, with a constant interval of time, `period` of your choosing
-     * between those emissions. The first emission happens after the specified
-     * `initialDelay`. The initial delay may be a {@link Date}. By default, this
-     * operator uses the `async` IScheduler to provide a notion of time, but you
-     * may pass any IScheduler to it. If `period` is not specified, the output
-     * Observable emits only one value, `0`. Otherwise, it emits an infinite
-     * sequence.
-     *
-     * @example <caption>Emits ascending numbers, one every second (1000ms), starting after 3 seconds</caption>
-     * var numbers = Rx.Observable.timer(3000, 1000);
-     * numbers.subscribe(x => console.log(x));
-     *
-     * @example <caption>Emits one number after five seconds</caption>
-     * var numbers = Rx.Observable.timer(5000);
-     * numbers.subscribe(x => console.log(x));
-     *
-     * @see {@link interval}
-     * @see {@link delay}
-     *
-     * @param {number|Date} initialDelay The initial delay time to wait before
-     * emitting the first value of `0`.
-     * @param {number} [period] The period of time between emissions of the
-     * subsequent numbers.
-     * @param {Scheduler} [scheduler=async] The IScheduler to use for scheduling
-     * the emission of values, and providing a notion of "time".
-     * @return {Observable} An Observable that emits a `0` after the
-     * `initialDelay` and ever increasing numbers after each `period` of time
-     * thereafter.
-     * @static true
-     * @name timer
-     * @owner Observable
-     */
-    TimerObservable.create = function (initialDelay, period, scheduler) {
-        if (initialDelay === void 0) { initialDelay = 0; }
-        return new TimerObservable(initialDelay, period, scheduler);
-    };
-    TimerObservable.dispatch = function (state) {
-        var index = state.index, period = state.period, subscriber = state.subscriber;
-        var action = this;
-        subscriber.next(index);
-        if (subscriber.closed) {
-            return;
-        }
-        else if (period === -1) {
-            return subscriber.complete();
-        }
-        state.index = index + 1;
-        action.schedule(state, period);
-    };
-    TimerObservable.prototype._subscribe = function (subscriber) {
-        var index = 0;
-        var _a = this, period = _a.period, dueTime = _a.dueTime, scheduler = _a.scheduler;
-        return scheduler.schedule(TimerObservable.dispatch, dueTime, {
-            index: index, period: period, subscriber: subscriber
-        });
-    };
-    return TimerObservable;
-}(Observable_1.Observable));
-exports.TimerObservable = TimerObservable;
+function deflate_huff(s, flush) {
+  var bflush;             /* set if current block must be flushed */
 
-},{"../Observable":29,"../scheduler/async":152,"../util/isDate":166,"../util/isNumeric":168,"../util/isScheduler":171}],97:[function(require,module,exports){
-"use strict";
-var isScheduler_1 = require('../util/isScheduler');
-var isArray_1 = require('../util/isArray');
-var ArrayObservable_1 = require('./ArrayObservable');
-var combineLatest_1 = require('../operator/combineLatest');
-/* tslint:enable:max-line-length */
-/**
- * Combines multiple Observables to create an Observable whose values are
- * calculated from the latest values of each of its input Observables.
- *
- * <span class="informal">Whenever any input Observable emits a value, it
- * computes a formula using the latest values from all the inputs, then emits
- * the output of that formula.</span>
- *
- * <img src="./img/combineLatest.png" width="100%">
- *
- * `combineLatest` combines the values from all the Observables passed as
- * arguments. This is done by subscribing to each Observable in order and,
- * whenever any Observable emits, collecting an array of the most recent
- * values from each Observable. So if you pass `n` Observables to operator,
- * returned Observable will always emit an array of `n` values, in order
- * corresponding to order of passed Observables (value from the first Observable
- * on the first place and so on).
- *
- * Static version of `combineLatest` accepts either an array of Observables
- * or each Observable can be put directly as an argument. Note that array of
- * Observables is good choice, if you don't know beforehand how many Observables
- * you will combine. Passing empty array will result in Observable that
- * completes immediately.
- *
- * To ensure output array has always the same length, `combineLatest` will
- * actually wait for all input Observables to emit at least once,
- * before it starts emitting results. This means if some Observable emits
- * values before other Observables started emitting, all that values but last
- * will be lost. On the other hand, is some Observable does not emit value but
- * completes, resulting Observable will complete at the same moment without
- * emitting anything, since it will be now impossible to include value from
- * completed Observable in resulting array. Also, if some input Observable does
- * not emit any value and never completes, `combineLatest` will also never emit
- * and never complete, since, again, it will wait for all streams to emit some
- * value.
- *
- * If at least one Observable was passed to `combineLatest` and all passed Observables
- * emitted something, resulting Observable will complete when all combined
- * streams complete. So even if some Observable completes, result of
- * `combineLatest` will still emit values when other Observables do. In case
- * of completed Observable, its value from now on will always be the last
- * emitted value. On the other hand, if any Observable errors, `combineLatest`
- * will error immediately as well, and all other Observables will be unsubscribed.
- *
- * `combineLatest` accepts as optional parameter `project` function, which takes
- * as arguments all values that would normally be emitted by resulting Observable.
- * `project` can return any kind of value, which will be then emitted by Observable
- * instead of default array. Note that `project` does not take as argument that array
- * of values, but values themselves. That means default `project` can be imagined
- * as function that takes all its arguments and puts them into an array.
- *
- *
- * @example <caption>Combine two timer Observables</caption>
- * const firstTimer = Rx.Observable.timer(0, 1000); // emit 0, 1, 2... after every second, starting from now
- * const secondTimer = Rx.Observable.timer(500, 1000); // emit 0, 1, 2... after every second, starting 0,5s from now
- * const combinedTimers = Rx.Observable.combineLatest(firstTimer, secondTimer);
- * combinedTimers.subscribe(value => console.log(value));
- * // Logs
- * // [0, 0] after 0.5s
- * // [1, 0] after 1s
- * // [1, 1] after 1.5s
- * // [2, 1] after 2s
- *
- *
- * @example <caption>Combine an array of Observables</caption>
- * const observables = [1, 5, 10].map(
- *   n => Rx.Observable.of(n).delay(n * 1000).startWith(0) // emit 0 and then emit n after n seconds
- * );
- * const combined = Rx.Observable.combineLatest(observables);
- * combined.subscribe(value => console.log(value));
- * // Logs
- * // [0, 0, 0] immediately
- * // [1, 0, 0] after 1s
- * // [1, 5, 0] after 5s
- * // [1, 5, 10] after 10s
- *
- *
- * @example <caption>Use project function to dynamically calculate the Body-Mass Index</caption>
- * var weight = Rx.Observable.of(70, 72, 76, 79, 75);
- * var height = Rx.Observable.of(1.76, 1.77, 1.78);
- * var bmi = Rx.Observable.combineLatest(weight, height, (w, h) => w / (h * h));
- * bmi.subscribe(x => console.log('BMI is ' + x));
- *
- * // With output to console:
- * // BMI is 24.212293388429753
- * // BMI is 23.93948099205209
- * // BMI is 23.671253629592222
- *
- *
- * @see {@link combineAll}
- * @see {@link merge}
- * @see {@link withLatestFrom}
- *
- * @param {ObservableInput} observable1 An input Observable to combine with other Observables.
- * @param {ObservableInput} observable2 An input Observable to combine with other Observables.
- * More than one input Observables may be given as arguments
- * or an array of Observables may be given as the first argument.
- * @param {function} [project] An optional function to project the values from
- * the combined latest values into a new value on the output Observable.
- * @param {Scheduler} [scheduler=null] The IScheduler to use for subscribing to
- * each input Observable.
- * @return {Observable} An Observable of projected values from the most recent
- * values from each input Observable, or an array of the most recent values from
- * each input Observable.
- * @static true
- * @name combineLatest
- * @owner Observable
- */
-function combineLatest() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
-    }
-    var project = null;
-    var scheduler = null;
-    if (isScheduler_1.isScheduler(observables[observables.length - 1])) {
-        scheduler = observables.pop();
+  for (;;) {
+    /* Make sure that we have a literal to write. */
+    if (s.lookahead === 0) {
+      fill_window(s);
+      if (s.lookahead === 0) {
+        if (flush === Z_NO_FLUSH) {
+          return BS_NEED_MORE;
+        }
+        break;      /* flush the current block */
+      }
     }
-    if (typeof observables[observables.length - 1] === 'function') {
-        project = observables.pop();
+
+    /* Output a literal byte */
+    s.match_length = 0;
+    //Tracevv((stderr,"%c", s->window[s->strstart]));
+    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
+    bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
+    s.lookahead--;
+    s.strstart++;
+    if (bflush) {
+      /*** FLUSH_BLOCK(s, 0); ***/
+      flush_block_only(s, false);
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+      /***/
     }
-    // if the first and only other argument besides the resultSelector is an array
-    // assume it's been called with `combineLatest([obs1, obs2, obs3], project)`
-    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
-        observables = observables[0];
+  }
+  s.insert = 0;
+  if (flush === Z_FINISH) {
+    /*** FLUSH_BLOCK(s, 1); ***/
+    flush_block_only(s, true);
+    if (s.strm.avail_out === 0) {
+      return BS_FINISH_STARTED;
+    }
+    /***/
+    return BS_FINISH_DONE;
+  }
+  if (s.last_lit) {
+    /*** FLUSH_BLOCK(s, 0); ***/
+    flush_block_only(s, false);
+    if (s.strm.avail_out === 0) {
+      return BS_NEED_MORE;
     }
-    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new combineLatest_1.CombineLatestOperator(project));
+    /***/
+  }
+  return BS_BLOCK_DONE;
 }
-exports.combineLatest = combineLatest;
 
-},{"../operator/combineLatest":112,"../util/isArray":164,"../util/isScheduler":171,"./ArrayObservable":86}],98:[function(require,module,exports){
-"use strict";
-var DeferObservable_1 = require('./DeferObservable');
-exports.defer = DeferObservable_1.DeferObservable.create;
+/* Values for max_lazy_match, good_match and max_chain_length, depending on
+ * the desired pack level (0..9). The values given below have been tuned to
+ * exclude worst case performance for pathological files. Better values may be
+ * found for specific files.
+ */
+function Config(good_length, max_lazy, nice_length, max_chain, func) {
+  this.good_length = good_length;
+  this.max_lazy = max_lazy;
+  this.nice_length = nice_length;
+  this.max_chain = max_chain;
+  this.func = func;
+}
+
+var configuration_table;
+
+configuration_table = [
+  /*      good lazy nice chain */
+  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */
+  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */
+  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */
+  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */
+
+  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */
+  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */
+  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */
+  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */
+  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */
+  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */
+];
+
+
+/* ===========================================================================
+ * Initialize the "longest match" routines for a new zlib stream
+ */
+function lm_init(s) {
+  s.window_size = 2 * s.w_size;
 
-},{"./DeferObservable":88}],99:[function(require,module,exports){
-"use strict";
-var EmptyObservable_1 = require('./EmptyObservable');
-exports.empty = EmptyObservable_1.EmptyObservable.create;
+  /*** CLEAR_HASH(s); ***/
+  zero(s.head); // Fill with NIL (= 0);
 
-},{"./EmptyObservable":89}],100:[function(require,module,exports){
-"use strict";
-var FromObservable_1 = require('./FromObservable');
-exports.from = FromObservable_1.FromObservable.create;
+  /* Set the default configuration parameters:
+   */
+  s.max_lazy_match = configuration_table[s.level].max_lazy;
+  s.good_match = configuration_table[s.level].good_length;
+  s.nice_match = configuration_table[s.level].nice_length;
+  s.max_chain_length = configuration_table[s.level].max_chain;
+
+  s.strstart = 0;
+  s.block_start = 0;
+  s.lookahead = 0;
+  s.insert = 0;
+  s.match_length = s.prev_length = MIN_MATCH - 1;
+  s.match_available = 0;
+  s.ins_h = 0;
+}
+
+
+function DeflateState() {
+  this.strm = null;            /* pointer back to this zlib stream */
+  this.status = 0;            /* as the name implies */
+  this.pending_buf = null;      /* output still pending */
+  this.pending_buf_size = 0;  /* size of pending_buf */
+  this.pending_out = 0;       /* next pending byte to output to the stream */
+  this.pending = 0;           /* nb of bytes in the pending buffer */
+  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
+  this.gzhead = null;         /* gzip header information to write */
+  this.gzindex = 0;           /* where in extra, name, or comment */
+  this.method = Z_DEFLATED; /* can only be DEFLATED */
+  this.last_flush = -1;   /* value of flush param for previous deflate call */
+
+  this.w_size = 0;  /* LZ77 window size (32K by default) */
+  this.w_bits = 0;  /* log2(w_size)  (8..16) */
+  this.w_mask = 0;  /* w_size - 1 */
+
+  this.window = null;
+  /* Sliding window. Input bytes are read into the second half of the window,
+   * and move to the first half later to keep a dictionary of at least wSize
+   * bytes. With this organization, matches are limited to a distance of
+   * wSize-MAX_MATCH bytes, but this ensures that IO is always
+   * performed with a length multiple of the block size.
+   */
 
-},{"./FromObservable":92}],101:[function(require,module,exports){
-"use strict";
-var FromEventObservable_1 = require('./FromEventObservable');
-exports.fromEvent = FromEventObservable_1.FromEventObservable.create;
+  this.window_size = 0;
+  /* Actual size of window: 2*wSize, except when the user input buffer
+   * is directly used as sliding window.
+   */
 
-},{"./FromEventObservable":91}],102:[function(require,module,exports){
-"use strict";
-var PromiseObservable_1 = require('./PromiseObservable');
-exports.fromPromise = PromiseObservable_1.PromiseObservable.create;
+  this.prev = null;
+  /* Link to older string with same hash index. To limit the size of this
+   * array to 64K, this link is maintained only for the last 32K strings.
+   * An index in this array is thus a window index modulo 32K.
+   */
 
-},{"./PromiseObservable":94}],103:[function(require,module,exports){
-"use strict";
-var merge_1 = require('../operator/merge');
-exports.merge = merge_1.mergeStatic;
+  this.head = null;   /* Heads of the hash chains or NIL. */
 
-},{"../operator/merge":125}],104:[function(require,module,exports){
-"use strict";
-var ArrayObservable_1 = require('./ArrayObservable');
-exports.of = ArrayObservable_1.ArrayObservable.of;
+  this.ins_h = 0;       /* hash index of string to be inserted */
+  this.hash_size = 0;   /* number of elements in hash table */
+  this.hash_bits = 0;   /* log2(hash_size) */
+  this.hash_mask = 0;   /* hash_size-1 */
 
-},{"./ArrayObservable":86}],105:[function(require,module,exports){
-"use strict";
-var ErrorObservable_1 = require('./ErrorObservable');
-exports._throw = ErrorObservable_1.ErrorObservable.create;
+  this.hash_shift = 0;
+  /* Number of bits by which ins_h must be shifted at each input
+   * step. It must be such that after MIN_MATCH steps, the oldest
+   * byte no longer takes part in the hash key, that is:
+   *   hash_shift * MIN_MATCH >= hash_bits
+   */
 
-},{"./ErrorObservable":90}],106:[function(require,module,exports){
-"use strict";
-var TimerObservable_1 = require('./TimerObservable');
-exports.timer = TimerObservable_1.TimerObservable.create;
+  this.block_start = 0;
+  /* Window position at the beginning of the current output block. Gets
+   * negative when the window is moved backwards.
+   */
 
-},{"./TimerObservable":96}],107:[function(require,module,exports){
-"use strict";
-var zip_1 = require('../operator/zip');
-exports.zip = zip_1.zipStatic;
+  this.match_length = 0;      /* length of best match */
+  this.prev_match = 0;        /* previous match */
+  this.match_available = 0;   /* set if previous match exists */
+  this.strstart = 0;          /* start of string to insert */
+  this.match_start = 0;       /* start of matching string */
+  this.lookahead = 0;         /* number of valid bytes ahead in window */
 
-},{"../operator/zip":146}],108:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Buffers the source Observable values until `closingNotifier` emits.
- *
- * <span class="informal">Collects values from the past as an array, and emits
- * that array only when another Observable emits.</span>
- *
- * <img src="./img/buffer.png" width="100%">
- *
- * Buffers the incoming Observable values until the given `closingNotifier`
- * Observable emits a value, at which point it emits the buffer on the output
- * Observable and starts a new buffer internally, awaiting the next time
- * `closingNotifier` emits.
- *
- * @example <caption>On every click, emit array of most recent interval events</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var interval = Rx.Observable.interval(1000);
- * var buffered = interval.buffer(clicks);
- * buffered.subscribe(x => console.log(x));
- *
- * @see {@link bufferCount}
- * @see {@link bufferTime}
- * @see {@link bufferToggle}
- * @see {@link bufferWhen}
- * @see {@link window}
- *
- * @param {Observable<any>} closingNotifier An Observable that signals the
- * buffer to be emitted on the output Observable.
- * @return {Observable<T[]>} An Observable of buffers, which are arrays of
- * values.
- * @method buffer
- * @owner Observable
- */
-function buffer(closingNotifier) {
-    return this.lift(new BufferOperator(closingNotifier));
+  this.prev_length = 0;
+  /* Length of the best match at previous step. Matches not greater than this
+   * are discarded. This is used in the lazy match evaluation.
+   */
+
+  this.max_chain_length = 0;
+  /* To speed up deflation, hash chains are never searched beyond this
+   * length.  A higher limit improves compression ratio but degrades the
+   * speed.
+   */
+
+  this.max_lazy_match = 0;
+  /* Attempt to find a better match only when the current match is strictly
+   * smaller than this value. This mechanism is used only for compression
+   * levels >= 4.
+   */
+  // That's alias to max_lazy_match, don't use directly
+  //this.max_insert_length = 0;
+  /* Insert new strings in the hash table only if the match length is not
+   * greater than this length. This saves time but degrades compression.
+   * max_insert_length is used only for compression levels <= 3.
+   */
+
+  this.level = 0;     /* compression level (1..9) */
+  this.strategy = 0;  /* favor or force Huffman coding*/
+
+  this.good_match = 0;
+  /* Use a faster search when the previous match is longer than this */
+
+  this.nice_match = 0; /* Stop searching when current match exceeds this */
+
+              /* used by trees.c: */
+
+  /* Didn't use ct_data typedef below to suppress compiler warning */
+
+  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */
+  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
+  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */
+
+  // Use flat array of DOUBLE size, with interleaved fata,
+  // because JS does not support effective
+  this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);
+  this.dyn_dtree  = new utils.Buf16((2 * D_CODES + 1) * 2);
+  this.bl_tree    = new utils.Buf16((2 * BL_CODES + 1) * 2);
+  zero(this.dyn_ltree);
+  zero(this.dyn_dtree);
+  zero(this.bl_tree);
+
+  this.l_desc   = null;         /* desc. for literal tree */
+  this.d_desc   = null;         /* desc. for distance tree */
+  this.bl_desc  = null;         /* desc. for bit length tree */
+
+  //ush bl_count[MAX_BITS+1];
+  this.bl_count = new utils.Buf16(MAX_BITS + 1);
+  /* number of codes at each bit length for an optimal tree */
+
+  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */
+  this.heap = new utils.Buf16(2 * L_CODES + 1);  /* heap used to build the Huffman trees */
+  zero(this.heap);
+
+  this.heap_len = 0;               /* number of elements in the heap */
+  this.heap_max = 0;               /* element of largest frequency */
+  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
+   * The same heap array is used to build all trees.
+   */
+
+  this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];
+  zero(this.depth);
+  /* Depth of each subtree used as tie breaker for trees of equal frequency
+   */
+
+  this.l_buf = 0;          /* buffer index for literals or lengths */
+
+  this.lit_bufsize = 0;
+  /* Size of match buffer for literals/lengths.  There are 4 reasons for
+   * limiting lit_bufsize to 64K:
+   *   - frequencies can be kept in 16 bit counters
+   *   - if compression is not successful for the first block, all input
+   *     data is still in the window so we can still emit a stored block even
+   *     when input comes from standard input.  (This can also be done for
+   *     all blocks if lit_bufsize is not greater than 32K.)
+   *   - if compression is not successful for a file smaller than 64K, we can
+   *     even emit a stored file instead of a stored block (saving 5 bytes).
+   *     This is applicable only for zip (not gzip or zlib).
+   *   - creating new Huffman trees less frequently may not provide fast
+   *     adaptation to changes in the input data statistics. (Take for
+   *     example a binary file with poorly compressible code followed by
+   *     a highly compressible string table.) Smaller buffer sizes give
+   *     fast adaptation but have of course the overhead of transmitting
+   *     trees more frequently.
+   *   - I can't count above 4
+   */
+
+  this.last_lit = 0;      /* running index in l_buf */
+
+  this.d_buf = 0;
+  /* Buffer index for distances. To simplify the code, d_buf and l_buf have
+   * the same number of elements. To use different lengths, an extra flag
+   * array would be necessary.
+   */
+
+  this.opt_len = 0;       /* bit length of current block with optimal trees */
+  this.static_len = 0;    /* bit length of current block with static trees */
+  this.matches = 0;       /* number of string matches in current block */
+  this.insert = 0;        /* bytes at end of window left to insert */
+
+
+  this.bi_buf = 0;
+  /* Output buffer. bits are inserted starting at the bottom (least
+   * significant bits).
+   */
+  this.bi_valid = 0;
+  /* Number of valid bits in bi_buf.  All bits above the last valid bit
+   * are always zero.
+   */
+
+  // Used for window memory init. We safely ignore it for JS. That makes
+  // sense only for pointers and memory check tools.
+  //this.high_water = 0;
+  /* High water mark offset in window for initialized bytes -- bytes above
+   * this are set to zero in order to avoid memory check warnings when
+   * longest match routines access bytes past the input.  This is then
+   * updated to the new high water mark.
+   */
 }
-exports.buffer = buffer;
-var BufferOperator = (function () {
-    function BufferOperator(closingNotifier) {
-        this.closingNotifier = closingNotifier;
-    }
-    BufferOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));
-    };
-    return BufferOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var BufferSubscriber = (function (_super) {
-    __extends(BufferSubscriber, _super);
-    function BufferSubscriber(destination, closingNotifier) {
-        _super.call(this, destination);
-        this.buffer = [];
-        this.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));
-    }
-    BufferSubscriber.prototype._next = function (value) {
-        this.buffer.push(value);
-    };
-    BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var buffer = this.buffer;
-        this.buffer = [];
-        this.destination.next(buffer);
-    };
-    return BufferSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],109:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/**
- * Buffers the source Observable values until the size hits the maximum
- * `bufferSize` given.
- *
- * <span class="informal">Collects values from the past as an array, and emits
- * that array only when its size reaches `bufferSize`.</span>
- *
- * <img src="./img/bufferCount.png" width="100%">
- *
- * Buffers a number of values from the source Observable by `bufferSize` then
- * emits the buffer and clears it, and starts a new buffer each
- * `startBufferEvery` values. If `startBufferEvery` is not provided or is
- * `null`, then new buffers are started immediately at the start of the source
- * and when each buffer closes and is emitted.
- *
- * @example <caption>Emit the last two click events as an array</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var buffered = clicks.bufferCount(2);
- * buffered.subscribe(x => console.log(x));
- *
- * @example <caption>On every click, emit the last two click events as an array</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var buffered = clicks.bufferCount(2, 1);
- * buffered.subscribe(x => console.log(x));
- *
- * @see {@link buffer}
- * @see {@link bufferTime}
- * @see {@link bufferToggle}
- * @see {@link bufferWhen}
- * @see {@link pairwise}
- * @see {@link windowCount}
- *
- * @param {number} bufferSize The maximum size of the buffer emitted.
- * @param {number} [startBufferEvery] Interval at which to start a new buffer.
- * For example if `startBufferEvery` is `2`, then a new buffer will be started
- * on every other value from the source. A new buffer is started at the
- * beginning of the source by default.
- * @return {Observable<T[]>} An Observable of arrays of buffered values.
- * @method bufferCount
- * @owner Observable
- */
-function bufferCount(bufferSize, startBufferEvery) {
-    if (startBufferEvery === void 0) { startBufferEvery = null; }
-    return this.lift(new BufferCountOperator(bufferSize, startBufferEvery));
+
+function deflateResetKeep(strm) {
+  var s;
+
+  if (!strm || !strm.state) {
+    return err(strm, Z_STREAM_ERROR);
+  }
+
+  strm.total_in = strm.total_out = 0;
+  strm.data_type = Z_UNKNOWN;
+
+  s = strm.state;
+  s.pending = 0;
+  s.pending_out = 0;
+
+  if (s.wrap < 0) {
+    s.wrap = -s.wrap;
+    /* was made negative by deflate(..., Z_FINISH); */
+  }
+  s.status = (s.wrap ? INIT_STATE : BUSY_STATE);
+  strm.adler = (s.wrap === 2) ?
+    0  // crc32(0, Z_NULL, 0)
+  :
+    1; // adler32(0, Z_NULL, 0)
+  s.last_flush = Z_NO_FLUSH;
+  trees._tr_init(s);
+  return Z_OK;
 }
-exports.bufferCount = bufferCount;
-var BufferCountOperator = (function () {
-    function BufferCountOperator(bufferSize, startBufferEvery) {
-        this.bufferSize = bufferSize;
-        this.startBufferEvery = startBufferEvery;
-        if (!startBufferEvery || bufferSize === startBufferEvery) {
-            this.subscriberClass = BufferCountSubscriber;
-        }
-        else {
-            this.subscriberClass = BufferSkipCountSubscriber;
-        }
-    }
-    BufferCountOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));
-    };
-    return BufferCountOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var BufferCountSubscriber = (function (_super) {
-    __extends(BufferCountSubscriber, _super);
-    function BufferCountSubscriber(destination, bufferSize) {
-        _super.call(this, destination);
-        this.bufferSize = bufferSize;
-        this.buffer = [];
-    }
-    BufferCountSubscriber.prototype._next = function (value) {
-        var buffer = this.buffer;
-        buffer.push(value);
-        if (buffer.length == this.bufferSize) {
-            this.destination.next(buffer);
-            this.buffer = [];
-        }
-    };
-    BufferCountSubscriber.prototype._complete = function () {
-        var buffer = this.buffer;
-        if (buffer.length > 0) {
-            this.destination.next(buffer);
-        }
-        _super.prototype._complete.call(this);
-    };
-    return BufferCountSubscriber;
-}(Subscriber_1.Subscriber));
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var BufferSkipCountSubscriber = (function (_super) {
-    __extends(BufferSkipCountSubscriber, _super);
-    function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) {
-        _super.call(this, destination);
-        this.bufferSize = bufferSize;
-        this.startBufferEvery = startBufferEvery;
-        this.buffers = [];
-        this.count = 0;
-    }
-    BufferSkipCountSubscriber.prototype._next = function (value) {
-        var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count;
-        this.count++;
-        if (count % startBufferEvery === 0) {
-            buffers.push([]);
-        }
-        for (var i = buffers.length; i--;) {
-            var buffer = buffers[i];
-            buffer.push(value);
-            if (buffer.length === bufferSize) {
-                buffers.splice(i, 1);
-                this.destination.next(buffer);
-            }
-        }
-    };
-    BufferSkipCountSubscriber.prototype._complete = function () {
-        var _a = this, buffers = _a.buffers, destination = _a.destination;
-        while (buffers.length > 0) {
-            var buffer = buffers.shift();
-            if (buffer.length > 0) {
-                destination.next(buffer);
-            }
-        }
-        _super.prototype._complete.call(this);
-    };
-    return BufferSkipCountSubscriber;
-}(Subscriber_1.Subscriber));
 
-},{"../Subscriber":36}],110:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscription_1 = require('../Subscription');
-var tryCatch_1 = require('../util/tryCatch');
-var errorObject_1 = require('../util/errorObject');
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Buffers the source Observable values, using a factory function of closing
- * Observables to determine when to close, emit, and reset the buffer.
- *
- * <span class="informal">Collects values from the past as an array. When it
- * starts collecting values, it calls a function that returns an Observable that
- * tells when to close the buffer and restart collecting.</span>
- *
- * <img src="./img/bufferWhen.png" width="100%">
- *
- * Opens a buffer immediately, then closes the buffer when the observable
- * returned by calling `closingSelector` function emits a value. When it closes
- * the buffer, it immediately opens a new buffer and repeats the process.
- *
- * @example <caption>Emit an array of the last clicks every [1-5] random seconds</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var buffered = clicks.bufferWhen(() =>
- *   Rx.Observable.interval(1000 + Math.random() * 4000)
- * );
- * buffered.subscribe(x => console.log(x));
- *
- * @see {@link buffer}
- * @see {@link bufferCount}
- * @see {@link bufferTime}
- * @see {@link bufferToggle}
- * @see {@link windowWhen}
- *
- * @param {function(): Observable} closingSelector A function that takes no
- * arguments and returns an Observable that signals buffer closure.
- * @return {Observable<T[]>} An observable of arrays of buffered values.
- * @method bufferWhen
- * @owner Observable
- */
-function bufferWhen(closingSelector) {
-    return this.lift(new BufferWhenOperator(closingSelector));
+
+function deflateReset(strm) {
+  var ret = deflateResetKeep(strm);
+  if (ret === Z_OK) {
+    lm_init(strm.state);
+  }
+  return ret;
 }
-exports.bufferWhen = bufferWhen;
-var BufferWhenOperator = (function () {
-    function BufferWhenOperator(closingSelector) {
-        this.closingSelector = closingSelector;
+
+
+function deflateSetHeader(strm, head) {
+  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
+  if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }
+  strm.state.gzhead = head;
+  return Z_OK;
+}
+
+
+function deflateInit2(strm, level, method, windowBits, memLevel, strategy) {
+  if (!strm) { // === Z_NULL
+    return Z_STREAM_ERROR;
+  }
+  var wrap = 1;
+
+  if (level === Z_DEFAULT_COMPRESSION) {
+    level = 6;
+  }
+
+  if (windowBits < 0) { /* suppress zlib wrapper */
+    wrap = 0;
+    windowBits = -windowBits;
+  }
+
+  else if (windowBits > 15) {
+    wrap = 2;           /* write gzip wrapper instead */
+    windowBits -= 16;
+  }
+
+
+  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||
+    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
+    strategy < 0 || strategy > Z_FIXED) {
+    return err(strm, Z_STREAM_ERROR);
+  }
+
+
+  if (windowBits === 8) {
+    windowBits = 9;
+  }
+  /* until 256-byte window bug fixed */
+
+  var s = new DeflateState();
+
+  strm.state = s;
+  s.strm = strm;
+
+  s.wrap = wrap;
+  s.gzhead = null;
+  s.w_bits = windowBits;
+  s.w_size = 1 << s.w_bits;
+  s.w_mask = s.w_size - 1;
+
+  s.hash_bits = memLevel + 7;
+  s.hash_size = 1 << s.hash_bits;
+  s.hash_mask = s.hash_size - 1;
+  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
+
+  s.window = new utils.Buf8(s.w_size * 2);
+  s.head = new utils.Buf16(s.hash_size);
+  s.prev = new utils.Buf16(s.w_size);
+
+  // Don't need mem init magic for JS.
+  //s.high_water = 0;  /* nothing written to s->window yet */
+
+  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
+
+  s.pending_buf_size = s.lit_bufsize * 4;
+
+  //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
+  //s->pending_buf = (uchf *) overlay;
+  s.pending_buf = new utils.Buf8(s.pending_buf_size);
+
+  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)
+  //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
+  s.d_buf = 1 * s.lit_bufsize;
+
+  //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
+  s.l_buf = (1 + 2) * s.lit_bufsize;
+
+  s.level = level;
+  s.strategy = strategy;
+  s.method = method;
+
+  return deflateReset(strm);
+}
+
+function deflateInit(strm, level) {
+  return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
+}
+
+
+function deflate(strm, flush) {
+  var old_flush, s;
+  var beg, val; // for gzip header write only
+
+  if (!strm || !strm.state ||
+    flush > Z_BLOCK || flush < 0) {
+    return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;
+  }
+
+  s = strm.state;
+
+  if (!strm.output ||
+      (!strm.input && strm.avail_in !== 0) ||
+      (s.status === FINISH_STATE && flush !== Z_FINISH)) {
+    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);
+  }
+
+  s.strm = strm; /* just in case */
+  old_flush = s.last_flush;
+  s.last_flush = flush;
+
+  /* Write the header */
+  if (s.status === INIT_STATE) {
+
+    if (s.wrap === 2) { // GZIP header
+      strm.adler = 0;  //crc32(0L, Z_NULL, 0);
+      put_byte(s, 31);
+      put_byte(s, 139);
+      put_byte(s, 8);
+      if (!s.gzhead) { // s->gzhead == Z_NULL
+        put_byte(s, 0);
+        put_byte(s, 0);
+        put_byte(s, 0);
+        put_byte(s, 0);
+        put_byte(s, 0);
+        put_byte(s, s.level === 9 ? 2 :
+                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
+                     4 : 0));
+        put_byte(s, OS_CODE);
+        s.status = BUSY_STATE;
+      }
+      else {
+        put_byte(s, (s.gzhead.text ? 1 : 0) +
+                    (s.gzhead.hcrc ? 2 : 0) +
+                    (!s.gzhead.extra ? 0 : 4) +
+                    (!s.gzhead.name ? 0 : 8) +
+                    (!s.gzhead.comment ? 0 : 16)
+        );
+        put_byte(s, s.gzhead.time & 0xff);
+        put_byte(s, (s.gzhead.time >> 8) & 0xff);
+        put_byte(s, (s.gzhead.time >> 16) & 0xff);
+        put_byte(s, (s.gzhead.time >> 24) & 0xff);
+        put_byte(s, s.level === 9 ? 2 :
+                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
+                     4 : 0));
+        put_byte(s, s.gzhead.os & 0xff);
+        if (s.gzhead.extra && s.gzhead.extra.length) {
+          put_byte(s, s.gzhead.extra.length & 0xff);
+          put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);
+        }
+        if (s.gzhead.hcrc) {
+          strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);
+        }
+        s.gzindex = 0;
+        s.status = EXTRA_STATE;
+      }
     }
-    BufferWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector));
-    };
-    return BufferWhenOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var BufferWhenSubscriber = (function (_super) {
-    __extends(BufferWhenSubscriber, _super);
-    function BufferWhenSubscriber(destination, closingSelector) {
-        _super.call(this, destination);
-        this.closingSelector = closingSelector;
-        this.subscribing = false;
-        this.openBuffer();
+    else // DEFLATE header
+    {
+      var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;
+      var level_flags = -1;
+
+      if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {
+        level_flags = 0;
+      } else if (s.level < 6) {
+        level_flags = 1;
+      } else if (s.level === 6) {
+        level_flags = 2;
+      } else {
+        level_flags = 3;
+      }
+      header |= (level_flags << 6);
+      if (s.strstart !== 0) { header |= PRESET_DICT; }
+      header += 31 - (header % 31);
+
+      s.status = BUSY_STATE;
+      putShortMSB(s, header);
+
+      /* Save the adler32 of the preset dictionary: */
+      if (s.strstart !== 0) {
+        putShortMSB(s, strm.adler >>> 16);
+        putShortMSB(s, strm.adler & 0xffff);
+      }
+      strm.adler = 1; // adler32(0L, Z_NULL, 0);
     }
-    BufferWhenSubscriber.prototype._next = function (value) {
-        this.buffer.push(value);
-    };
-    BufferWhenSubscriber.prototype._complete = function () {
-        var buffer = this.buffer;
-        if (buffer) {
-            this.destination.next(buffer);
-        }
-        _super.prototype._complete.call(this);
-    };
-    BufferWhenSubscriber.prototype._unsubscribe = function () {
-        this.buffer = null;
-        this.subscribing = false;
-    };
-    BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.openBuffer();
-    };
-    BufferWhenSubscriber.prototype.notifyComplete = function () {
-        if (this.subscribing) {
-            this.complete();
-        }
-        else {
-            this.openBuffer();
-        }
-    };
-    BufferWhenSubscriber.prototype.openBuffer = function () {
-        var closingSubscription = this.closingSubscription;
-        if (closingSubscription) {
-            this.remove(closingSubscription);
-            closingSubscription.unsubscribe();
-        }
-        var buffer = this.buffer;
-        if (this.buffer) {
-            this.destination.next(buffer);
+  }
+
+//#ifdef GZIP
+  if (s.status === EXTRA_STATE) {
+    if (s.gzhead.extra/* != Z_NULL*/) {
+      beg = s.pending;  /* start of bytes to update crc */
+
+      while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {
+        if (s.pending === s.pending_buf_size) {
+          if (s.gzhead.hcrc && s.pending > beg) {
+            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+          }
+          flush_pending(strm);
+          beg = s.pending;
+          if (s.pending === s.pending_buf_size) {
+            break;
+          }
         }
-        this.buffer = [];
-        var closingNotifier = tryCatch_1.tryCatch(this.closingSelector)();
-        if (closingNotifier === errorObject_1.errorObject) {
-            this.error(errorObject_1.errorObject.e);
+        put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);
+        s.gzindex++;
+      }
+      if (s.gzhead.hcrc && s.pending > beg) {
+        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+      }
+      if (s.gzindex === s.gzhead.extra.length) {
+        s.gzindex = 0;
+        s.status = NAME_STATE;
+      }
+    }
+    else {
+      s.status = NAME_STATE;
+    }
+  }
+  if (s.status === NAME_STATE) {
+    if (s.gzhead.name/* != Z_NULL*/) {
+      beg = s.pending;  /* start of bytes to update crc */
+      //int val;
+
+      do {
+        if (s.pending === s.pending_buf_size) {
+          if (s.gzhead.hcrc && s.pending > beg) {
+            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+          }
+          flush_pending(strm);
+          beg = s.pending;
+          if (s.pending === s.pending_buf_size) {
+            val = 1;
+            break;
+          }
         }
-        else {
-            closingSubscription = new Subscription_1.Subscription();
-            this.closingSubscription = closingSubscription;
-            this.add(closingSubscription);
-            this.subscribing = true;
-            closingSubscription.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));
-            this.subscribing = false;
+        // JS specific: little magic to add zero terminator to end of string
+        if (s.gzindex < s.gzhead.name.length) {
+          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;
+        } else {
+          val = 0;
         }
-    };
-    return BufferWhenSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
+        put_byte(s, val);
+      } while (val !== 0);
 
-},{"../OuterSubscriber":31,"../Subscription":37,"../util/errorObject":163,"../util/subscribeToResult":173,"../util/tryCatch":175}],111:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Catches errors on the observable to be handled by returning a new observable or throwing an error.
- *
- * <img src="./img/catch.png" width="100%">
- *
- * @example <caption>Continues with a different Observable when there's an error</caption>
- *
- * Observable.of(1, 2, 3, 4, 5)
- *   .map(n => {
- *        if (n == 4) {
- *          throw 'four!';
- *     }
- *        return n;
- *   })
- *   .catch(err => Observable.of('I', 'II', 'III', 'IV', 'V'))
- *   .subscribe(x => console.log(x));
- *   // 1, 2, 3, I, II, III, IV, V
- *
- * @example <caption>Retries the caught source Observable again in case of error, similar to retry() operator</caption>
- *
- * Observable.of(1, 2, 3, 4, 5)
- *   .map(n => {
- *        if (n === 4) {
- *          throw 'four!';
- *     }
- *        return n;
- *   })
- *   .catch((err, caught) => caught)
- *   .take(30)
- *   .subscribe(x => console.log(x));
- *   // 1, 2, 3, 1, 2, 3, ...
- *
- * @example <caption>Throws a new error when the source Observable throws an error</caption>
- *
- * Observable.of(1, 2, 3, 4, 5)
- *   .map(n => {
- *     if (n == 4) {
- *       throw 'four!';
- *     }
- *     return n;
- *   })
- *   .catch(err => {
- *     throw 'error in source. Details: ' + err;
- *   })
- *   .subscribe(
- *     x => console.log(x),
- *     err => console.log(err)
- *   );
- *   // 1, 2, 3, error in source. Details: four!
- *
- * @param {function} selector a function that takes as arguments `err`, which is the error, and `caught`, which
- *  is the source observable, in case you'd like to "retry" that observable by returning it again. Whatever observable
- *  is returned by the `selector` will be used to continue the observable chain.
- * @return {Observable} An observable that originates from either the source or the observable returned by the
- *  catch `selector` function.
- * @method catch
- * @name catch
- * @owner Observable
- */
-function _catch(selector) {
-    var operator = new CatchOperator(selector);
-    var caught = this.lift(operator);
-    return (operator.caught = caught);
-}
-exports._catch = _catch;
-var CatchOperator = (function () {
-    function CatchOperator(selector) {
-        this.selector = selector;
+      if (s.gzhead.hcrc && s.pending > beg) {
+        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+      }
+      if (val === 0) {
+        s.gzindex = 0;
+        s.status = COMMENT_STATE;
+      }
     }
-    CatchOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));
-    };
-    return CatchOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var CatchSubscriber = (function (_super) {
-    __extends(CatchSubscriber, _super);
-    function CatchSubscriber(destination, selector, caught) {
-        _super.call(this, destination);
-        this.selector = selector;
-        this.caught = caught;
+    else {
+      s.status = COMMENT_STATE;
     }
-    // NOTE: overriding `error` instead of `_error` because we don't want
-    // to have this flag this subscriber as `isStopped`. We can mimic the
-    // behavior of the RetrySubscriber (from the `retry` operator), where
-    // we unsubscribe from our source chain, reset our Subscriber flags,
-    // then subscribe to the selector result.
-    CatchSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var result = void 0;
-            try {
-                result = this.selector(err, this.caught);
-            }
-            catch (err2) {
-                _super.prototype.error.call(this, err2);
-                return;
-            }
-            this._unsubscribeAndRecycle();
-            this.add(subscribeToResult_1.subscribeToResult(this, result));
+  }
+  if (s.status === COMMENT_STATE) {
+    if (s.gzhead.comment/* != Z_NULL*/) {
+      beg = s.pending;  /* start of bytes to update crc */
+      //int val;
+
+      do {
+        if (s.pending === s.pending_buf_size) {
+          if (s.gzhead.hcrc && s.pending > beg) {
+            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+          }
+          flush_pending(strm);
+          beg = s.pending;
+          if (s.pending === s.pending_buf_size) {
+            val = 1;
+            break;
+          }
         }
-    };
-    return CatchSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
+        // JS specific: little magic to add zero terminator to end of string
+        if (s.gzindex < s.gzhead.comment.length) {
+          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;
+        } else {
+          val = 0;
+        }
+        put_byte(s, val);
+      } while (val !== 0);
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],112:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var ArrayObservable_1 = require('../observable/ArrayObservable');
-var isArray_1 = require('../util/isArray');
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-var none = {};
-/* tslint:enable:max-line-length */
-/**
- * Combines multiple Observables to create an Observable whose values are
- * calculated from the latest values of each of its input Observables.
- *
- * <span class="informal">Whenever any input Observable emits a value, it
- * computes a formula using the latest values from all the inputs, then emits
- * the output of that formula.</span>
- *
- * <img src="./img/combineLatest.png" width="100%">
- *
- * `combineLatest` combines the values from this Observable with values from
- * Observables passed as arguments. This is done by subscribing to each
- * Observable, in order, and collecting an array of each of the most recent
- * values any time any of the input Observables emits, then either taking that
- * array and passing it as arguments to an optional `project` function and
- * emitting the return value of that, or just emitting the array of recent
- * values directly if there is no `project` function.
- *
- * @example <caption>Dynamically calculate the Body-Mass Index from an Observable of weight and one for height</caption>
- * var weight = Rx.Observable.of(70, 72, 76, 79, 75);
- * var height = Rx.Observable.of(1.76, 1.77, 1.78);
- * var bmi = weight.combineLatest(height, (w, h) => w / (h * h));
- * bmi.subscribe(x => console.log('BMI is ' + x));
- *
- * // With output to console:
- * // BMI is 24.212293388429753
- * // BMI is 23.93948099205209
- * // BMI is 23.671253629592222
- *
- * @see {@link combineAll}
- * @see {@link merge}
- * @see {@link withLatestFrom}
- *
- * @param {ObservableInput} other An input Observable to combine with the source
- * Observable. More than one input Observables may be given as argument.
- * @param {function} [project] An optional function to project the values from
- * the combined latest values into a new value on the output Observable.
- * @return {Observable} An Observable of projected values from the most recent
- * values from each input Observable, or an array of the most recent values from
- * each input Observable.
- * @method combineLatest
- * @owner Observable
- */
-function combineLatest() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
-    }
-    var project = null;
-    if (typeof observables[observables.length - 1] === 'function') {
-        project = observables.pop();
+      if (s.gzhead.hcrc && s.pending > beg) {
+        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+      }
+      if (val === 0) {
+        s.status = HCRC_STATE;
+      }
     }
-    // if the first and only other argument besides the resultSelector is an array
-    // assume it's been called with `combineLatest([obs1, obs2, obs3], project)`
-    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
-        observables = observables[0].slice();
+    else {
+      s.status = HCRC_STATE;
     }
-    observables.unshift(this);
-    return this.lift.call(new ArrayObservable_1.ArrayObservable(observables), new CombineLatestOperator(project));
-}
-exports.combineLatest = combineLatest;
-var CombineLatestOperator = (function () {
-    function CombineLatestOperator(project) {
-        this.project = project;
+  }
+  if (s.status === HCRC_STATE) {
+    if (s.gzhead.hcrc) {
+      if (s.pending + 2 > s.pending_buf_size) {
+        flush_pending(strm);
+      }
+      if (s.pending + 2 <= s.pending_buf_size) {
+        put_byte(s, strm.adler & 0xff);
+        put_byte(s, (strm.adler >> 8) & 0xff);
+        strm.adler = 0; //crc32(0L, Z_NULL, 0);
+        s.status = BUSY_STATE;
+      }
     }
-    CombineLatestOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new CombineLatestSubscriber(subscriber, this.project));
-    };
-    return CombineLatestOperator;
-}());
-exports.CombineLatestOperator = CombineLatestOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var CombineLatestSubscriber = (function (_super) {
-    __extends(CombineLatestSubscriber, _super);
-    function CombineLatestSubscriber(destination, project) {
-        _super.call(this, destination);
-        this.project = project;
-        this.active = 0;
-        this.values = [];
-        this.observables = [];
+    else {
+      s.status = BUSY_STATE;
     }
-    CombineLatestSubscriber.prototype._next = function (observable) {
-        this.values.push(none);
-        this.observables.push(observable);
-    };
-    CombineLatestSubscriber.prototype._complete = function () {
-        var observables = this.observables;
-        var len = observables.length;
-        if (len === 0) {
-            this.destination.complete();
+  }
+//#endif
+
+  /* Flush as much pending output as possible */
+  if (s.pending !== 0) {
+    flush_pending(strm);
+    if (strm.avail_out === 0) {
+      /* Since avail_out is 0, deflate will be called again with
+       * more output space, but possibly with both pending and
+       * avail_in equal to zero. There won't be anything to do,
+       * but this is not an error situation so make sure we
+       * return OK instead of BUF_ERROR at next call of deflate:
+       */
+      s.last_flush = -1;
+      return Z_OK;
+    }
+
+    /* Make sure there is something to do and avoid duplicate consecutive
+     * flushes. For repeated and useless calls with Z_FINISH, we keep
+     * returning Z_STREAM_END instead of Z_BUF_ERROR.
+     */
+  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
+    flush !== Z_FINISH) {
+    return err(strm, Z_BUF_ERROR);
+  }
+
+  /* User must not provide more input after the first FINISH: */
+  if (s.status === FINISH_STATE && strm.avail_in !== 0) {
+    return err(strm, Z_BUF_ERROR);
+  }
+
+  /* Start a new block or continue the current one.
+   */
+  if (strm.avail_in !== 0 || s.lookahead !== 0 ||
+    (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {
+    var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :
+      (s.strategy === Z_RLE ? deflate_rle(s, flush) :
+        configuration_table[s.level].func(s, flush));
+
+    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {
+      s.status = FINISH_STATE;
+    }
+    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {
+      if (strm.avail_out === 0) {
+        s.last_flush = -1;
+        /* avoid BUF_ERROR next call, see above */
+      }
+      return Z_OK;
+      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
+       * of deflate should use the same flush parameter to make sure
+       * that the flush is complete. So we don't have to output an
+       * empty block here, this will be done at next call. This also
+       * ensures that for a very small output buffer, we emit at most
+       * one empty block.
+       */
+    }
+    if (bstate === BS_BLOCK_DONE) {
+      if (flush === Z_PARTIAL_FLUSH) {
+        trees._tr_align(s);
+      }
+      else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
+
+        trees._tr_stored_block(s, 0, 0, false);
+        /* For a full flush, this empty block will be recognized
+         * as a special marker by inflate_sync().
+         */
+        if (flush === Z_FULL_FLUSH) {
+          /*** CLEAR_HASH(s); ***/             /* forget history */
+          zero(s.head); // Fill with NIL (= 0);
+
+          if (s.lookahead === 0) {
+            s.strstart = 0;
+            s.block_start = 0;
+            s.insert = 0;
+          }
         }
-        else {
-            this.active = len;
-            this.toRespond = len;
-            for (var i = 0; i < len; i++) {
-                var observable = observables[i];
-                this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));
+      }
+      flush_pending(strm);
+      if (strm.avail_out === 0) {
+        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */
+        return Z_OK;
+      }
+    }
+  }
+  //Assert(strm->avail_out > 0, "bug2");
+  //if (strm.avail_out <= 0) { throw new Error("bug2");}
+
+  if (flush !== Z_FINISH) { return Z_OK; }
+  if (s.wrap <= 0) { return Z_STREAM_END; }
+
+  /* Write the trailer */
+  if (s.wrap === 2) {
+    put_byte(s, strm.adler & 0xff);
+    put_byte(s, (strm.adler >> 8) & 0xff);
+    put_byte(s, (strm.adler >> 16) & 0xff);
+    put_byte(s, (strm.adler >> 24) & 0xff);
+    put_byte(s, strm.total_in & 0xff);
+    put_byte(s, (strm.total_in >> 8) & 0xff);
+    put_byte(s, (strm.total_in >> 16) & 0xff);
+    put_byte(s, (strm.total_in >> 24) & 0xff);
+  }
+  else
+  {
+    putShortMSB(s, strm.adler >>> 16);
+    putShortMSB(s, strm.adler & 0xffff);
+  }
+
+  flush_pending(strm);
+  /* If avail_out is zero, the application will call deflate again
+   * to flush the rest.
+   */
+  if (s.wrap > 0) { s.wrap = -s.wrap; }
+  /* write the trailer only once! */
+  return s.pending !== 0 ? Z_OK : Z_STREAM_END;
+}
+
+function deflateEnd(strm) {
+  var status;
+
+  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
+    return Z_STREAM_ERROR;
+  }
+
+  status = strm.state.status;
+  if (status !== INIT_STATE &&
+    status !== EXTRA_STATE &&
+    status !== NAME_STATE &&
+    status !== COMMENT_STATE &&
+    status !== HCRC_STATE &&
+    status !== BUSY_STATE &&
+    status !== FINISH_STATE
+  ) {
+    return err(strm, Z_STREAM_ERROR);
+  }
+
+  strm.state = null;
+
+  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;
+}
+
+
+/* =========================================================================
+ * Initializes the compression dictionary from the given byte
+ * sequence without producing any compressed output.
+ */
+function deflateSetDictionary(strm, dictionary) {
+  var dictLength = dictionary.length;
+
+  var s;
+  var str, n;
+  var wrap;
+  var avail;
+  var next;
+  var input;
+  var tmpDict;
+
+  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
+    return Z_STREAM_ERROR;
+  }
+
+  s = strm.state;
+  wrap = s.wrap;
+
+  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {
+    return Z_STREAM_ERROR;
+  }
+
+  /* when using zlib wrappers, compute Adler-32 for provided dictionary */
+  if (wrap === 1) {
+    /* adler32(strm->adler, dictionary, dictLength); */
+    strm.adler = adler32(strm.adler, dictionary, dictLength, 0);
+  }
+
+  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */
+
+  /* if dictionary would fill window, just replace the history */
+  if (dictLength >= s.w_size) {
+    if (wrap === 0) {            /* already empty otherwise */
+      /*** CLEAR_HASH(s); ***/
+      zero(s.head); // Fill with NIL (= 0);
+      s.strstart = 0;
+      s.block_start = 0;
+      s.insert = 0;
+    }
+    /* use the tail */
+    // dictionary = dictionary.slice(dictLength - s.w_size);
+    tmpDict = new utils.Buf8(s.w_size);
+    utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);
+    dictionary = tmpDict;
+    dictLength = s.w_size;
+  }
+  /* insert dictionary into window and hash */
+  avail = strm.avail_in;
+  next = strm.next_in;
+  input = strm.input;
+  strm.avail_in = dictLength;
+  strm.next_in = 0;
+  strm.input = dictionary;
+  fill_window(s);
+  while (s.lookahead >= MIN_MATCH) {
+    str = s.strstart;
+    n = s.lookahead - (MIN_MATCH - 1);
+    do {
+      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
+      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;
+
+      s.prev[str & s.w_mask] = s.head[s.ins_h];
+
+      s.head[s.ins_h] = str;
+      str++;
+    } while (--n);
+    s.strstart = str;
+    s.lookahead = MIN_MATCH - 1;
+    fill_window(s);
+  }
+  s.strstart += s.lookahead;
+  s.block_start = s.strstart;
+  s.insert = s.lookahead;
+  s.lookahead = 0;
+  s.match_length = s.prev_length = MIN_MATCH - 1;
+  s.match_available = 0;
+  strm.next_in = next;
+  strm.input = input;
+  strm.avail_in = avail;
+  s.wrap = wrap;
+  return Z_OK;
+}
+
+
+exports.deflateInit = deflateInit;
+exports.deflateInit2 = deflateInit2;
+exports.deflateReset = deflateReset;
+exports.deflateResetKeep = deflateResetKeep;
+exports.deflateSetHeader = deflateSetHeader;
+exports.deflate = deflate;
+exports.deflateEnd = deflateEnd;
+exports.deflateSetDictionary = deflateSetDictionary;
+exports.deflateInfo = 'pako deflate (from Nodeca project)';
+
+/* Not implemented
+exports.deflateBound = deflateBound;
+exports.deflateCopy = deflateCopy;
+exports.deflateParams = deflateParams;
+exports.deflatePending = deflatePending;
+exports.deflatePrime = deflatePrime;
+exports.deflateTune = deflateTune;
+*/
+
+},{"../utils/common":26,"./adler32":28,"./crc32":30,"./messages":36,"./trees":37}],32:[function(require,module,exports){
+'use strict';
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+function GZheader() {
+  /* true if compressed data believed to be text */
+  this.text       = 0;
+  /* modification time */
+  this.time       = 0;
+  /* extra flags (not used when writing a gzip file) */
+  this.xflags     = 0;
+  /* operating system */
+  this.os         = 0;
+  /* pointer to extra field or Z_NULL if none */
+  this.extra      = null;
+  /* extra field length (valid if extra != Z_NULL) */
+  this.extra_len  = 0; // Actually, we don't need it in JS,
+                       // but leave for few code modifications
+
+  //
+  // Setup limits is not necessary because in js we should not preallocate memory
+  // for inflate use constant limit in 65536 bytes
+  //
+
+  /* space at extra (only when reading header) */
+  // this.extra_max  = 0;
+  /* pointer to zero-terminated file name or Z_NULL */
+  this.name       = '';
+  /* space at name (only when reading header) */
+  // this.name_max   = 0;
+  /* pointer to zero-terminated comment or Z_NULL */
+  this.comment    = '';
+  /* space at comment (only when reading header) */
+  // this.comm_max   = 0;
+  /* true if there was or will be a header crc */
+  this.hcrc       = 0;
+  /* true when done reading gzip header (not used when writing a gzip file) */
+  this.done       = false;
+}
+
+module.exports = GZheader;
+
+},{}],33:[function(require,module,exports){
+'use strict';
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+// See state defs from inflate.js
+var BAD = 30;       /* got a data error -- remain here until reset */
+var TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
+
+/*
+   Decode literal, length, and distance codes and write out the resulting
+   literal and match bytes until either not enough input or output is
+   available, an end-of-block is encountered, or a data error is encountered.
+   When large enough input and output buffers are supplied to inflate(), for
+   example, a 16K input buffer and a 64K output buffer, more than 95% of the
+   inflate execution time is spent in this routine.
+
+   Entry assumptions:
+
+        state.mode === LEN
+        strm.avail_in >= 6
+        strm.avail_out >= 258
+        start >= strm.avail_out
+        state.bits < 8
+
+   On return, state.mode is one of:
+
+        LEN -- ran out of enough output space or enough available input
+        TYPE -- reached end of block code, inflate() to interpret next block
+        BAD -- error in block data
+
+   Notes:
+
+    - The maximum input bits used by a length/distance pair is 15 bits for the
+      length code, 5 bits for the length extra, 15 bits for the distance code,
+      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.
+      Therefore if strm.avail_in >= 6, then there is enough input to avoid
+      checking for available input while decoding.
+
+    - The maximum bytes that a single length/distance pair can output is 258
+      bytes, which is the maximum length that can be coded.  inflate_fast()
+      requires strm.avail_out >= 258 for each loop to avoid checking for
+      output space.
+ */
+module.exports = function inflate_fast(strm, start) {
+  var state;
+  var _in;                    /* local strm.input */
+  var last;                   /* have enough input while in < last */
+  var _out;                   /* local strm.output */
+  var beg;                    /* inflate()'s initial strm.output */
+  var end;                    /* while out < end, enough space available */
+//#ifdef INFLATE_STRICT
+  var dmax;                   /* maximum distance from zlib header */
+//#endif
+  var wsize;                  /* window size or zero if not using window */
+  var whave;                  /* valid bytes in the window */
+  var wnext;                  /* window write index */
+  // Use `s_window` instead `window`, avoid conflict with instrumentation tools
+  var s_window;               /* allocated sliding window, if wsize != 0 */
+  var hold;                   /* local strm.hold */
+  var bits;                   /* local strm.bits */
+  var lcode;                  /* local strm.lencode */
+  var dcode;                  /* local strm.distcode */
+  var lmask;                  /* mask for first level of length codes */
+  var dmask;                  /* mask for first level of distance codes */
+  var here;                   /* retrieved table entry */
+  var op;                     /* code bits, operation, extra bits, or */
+                              /*  window position, window bytes to copy */
+  var len;                    /* match length, unused bytes */
+  var dist;                   /* match distance */
+  var from;                   /* where to copy match from */
+  var from_source;
+
+
+  var input, output; // JS specific, because we have no pointers
+
+  /* copy state to local variables */
+  state = strm.state;
+  //here = state.here;
+  _in = strm.next_in;
+  input = strm.input;
+  last = _in + (strm.avail_in - 5);
+  _out = strm.next_out;
+  output = strm.output;
+  beg = _out - (start - strm.avail_out);
+  end = _out + (strm.avail_out - 257);
+//#ifdef INFLATE_STRICT
+  dmax = state.dmax;
+//#endif
+  wsize = state.wsize;
+  whave = state.whave;
+  wnext = state.wnext;
+  s_window = state.window;
+  hold = state.hold;
+  bits = state.bits;
+  lcode = state.lencode;
+  dcode = state.distcode;
+  lmask = (1 << state.lenbits) - 1;
+  dmask = (1 << state.distbits) - 1;
+
+
+  /* decode literals and length/distances until end-of-block or not enough
+     input data or output space */
+
+  top:
+  do {
+    if (bits < 15) {
+      hold += input[_in++] << bits;
+      bits += 8;
+      hold += input[_in++] << bits;
+      bits += 8;
+    }
+
+    here = lcode[hold & lmask];
+
+    dolen:
+    for (;;) { // Goto emulation
+      op = here >>> 24/*here.bits*/;
+      hold >>>= op;
+      bits -= op;
+      op = (here >>> 16) & 0xff/*here.op*/;
+      if (op === 0) {                          /* literal */
+        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+        //        "inflate:         literal '%c'\n" :
+        //        "inflate:         literal 0x%02x\n", here.val));
+        output[_out++] = here & 0xffff/*here.val*/;
+      }
+      else if (op & 16) {                     /* length base */
+        len = here & 0xffff/*here.val*/;
+        op &= 15;                           /* number of extra bits */
+        if (op) {
+          if (bits < op) {
+            hold += input[_in++] << bits;
+            bits += 8;
+          }
+          len += hold & ((1 << op) - 1);
+          hold >>>= op;
+          bits -= op;
+        }
+        //Tracevv((stderr, "inflate:         length %u\n", len));
+        if (bits < 15) {
+          hold += input[_in++] << bits;
+          bits += 8;
+          hold += input[_in++] << bits;
+          bits += 8;
+        }
+        here = dcode[hold & dmask];
+
+        dodist:
+        for (;;) { // goto emulation
+          op = here >>> 24/*here.bits*/;
+          hold >>>= op;
+          bits -= op;
+          op = (here >>> 16) & 0xff/*here.op*/;
+
+          if (op & 16) {                      /* distance base */
+            dist = here & 0xffff/*here.val*/;
+            op &= 15;                       /* number of extra bits */
+            if (bits < op) {
+              hold += input[_in++] << bits;
+              bits += 8;
+              if (bits < op) {
+                hold += input[_in++] << bits;
+                bits += 8;
+              }
             }
-        }
-    };
-    CombineLatestSubscriber.prototype.notifyComplete = function (unused) {
-        if ((this.active -= 1) === 0) {
-            this.destination.complete();
-        }
-    };
-    CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var values = this.values;
-        var oldVal = values[outerIndex];
-        var toRespond = !this.toRespond
-            ? 0
-            : oldVal === none ? --this.toRespond : this.toRespond;
-        values[outerIndex] = innerValue;
-        if (toRespond === 0) {
-            if (this.project) {
-                this._tryProject(values);
+            dist += hold & ((1 << op) - 1);
+//#ifdef INFLATE_STRICT
+            if (dist > dmax) {
+              strm.msg = 'invalid distance too far back';
+              state.mode = BAD;
+              break top;
+            }
+//#endif
+            hold >>>= op;
+            bits -= op;
+            //Tracevv((stderr, "inflate:         distance %u\n", dist));
+            op = _out - beg;                /* max distance in output */
+            if (dist > op) {                /* see if copy from window */
+              op = dist - op;               /* distance back in window */
+              if (op > whave) {
+                if (state.sane) {
+                  strm.msg = 'invalid distance too far back';
+                  state.mode = BAD;
+                  break top;
+                }
+
+// (!) This block is disabled in zlib defaults,
+// don't enable it for binary compatibility
+//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+//                if (len <= op - whave) {
+//                  do {
+//                    output[_out++] = 0;
+//                  } while (--len);
+//                  continue top;
+//                }
+//                len -= op - whave;
+//                do {
+//                  output[_out++] = 0;
+//                } while (--op > whave);
+//                if (op === 0) {
+//                  from = _out - dist;
+//                  do {
+//                    output[_out++] = output[from++];
+//                  } while (--len);
+//                  continue top;
+//                }
+//#endif
+              }
+              from = 0; // window index
+              from_source = s_window;
+              if (wnext === 0) {           /* very common case */
+                from += wsize - op;
+                if (op < len) {         /* some from window */
+                  len -= op;
+                  do {
+                    output[_out++] = s_window[from++];
+                  } while (--op);
+                  from = _out - dist;  /* rest from output */
+                  from_source = output;
+                }
+              }
+              else if (wnext < op) {      /* wrap around window */
+                from += wsize + wnext - op;
+                op -= wnext;
+                if (op < len) {         /* some from end of window */
+                  len -= op;
+                  do {
+                    output[_out++] = s_window[from++];
+                  } while (--op);
+                  from = 0;
+                  if (wnext < len) {  /* some from start of window */
+                    op = wnext;
+                    len -= op;
+                    do {
+                      output[_out++] = s_window[from++];
+                    } while (--op);
+                    from = _out - dist;      /* rest from output */
+                    from_source = output;
+                  }
+                }
+              }
+              else {                      /* contiguous in window */
+                from += wnext - op;
+                if (op < len) {         /* some from window */
+                  len -= op;
+                  do {
+                    output[_out++] = s_window[from++];
+                  } while (--op);
+                  from = _out - dist;  /* rest from output */
+                  from_source = output;
+                }
+              }
+              while (len > 2) {
+                output[_out++] = from_source[from++];
+                output[_out++] = from_source[from++];
+                output[_out++] = from_source[from++];
+                len -= 3;
+              }
+              if (len) {
+                output[_out++] = from_source[from++];
+                if (len > 1) {
+                  output[_out++] = from_source[from++];
+                }
+              }
             }
             else {
-                this.destination.next(values.slice());
+              from = _out - dist;          /* copy direct from output */
+              do {                        /* minimum length is three */
+                output[_out++] = output[from++];
+                output[_out++] = output[from++];
+                output[_out++] = output[from++];
+                len -= 3;
+              } while (len > 2);
+              if (len) {
+                output[_out++] = output[from++];
+                if (len > 1) {
+                  output[_out++] = output[from++];
+                }
+              }
             }
+          }
+          else if ((op & 64) === 0) {          /* 2nd level distance code */
+            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
+            continue dodist;
+          }
+          else {
+            strm.msg = 'invalid distance code';
+            state.mode = BAD;
+            break top;
+          }
+
+          break; // need to emulate goto via "continue"
         }
-    };
-    CombineLatestSubscriber.prototype._tryProject = function (values) {
-        var result;
-        try {
-            result = this.project.apply(this, values);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return CombineLatestSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.CombineLatestSubscriber = CombineLatestSubscriber;
+      }
+      else if ((op & 64) === 0) {              /* 2nd level length code */
+        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
+        continue dolen;
+      }
+      else if (op & 32) {                     /* end-of-block */
+        //Tracevv((stderr, "inflate:         end of block\n"));
+        state.mode = TYPE;
+        break top;
+      }
+      else {
+        strm.msg = 'invalid literal/length code';
+        state.mode = BAD;
+        break top;
+      }
 
-},{"../OuterSubscriber":31,"../observable/ArrayObservable":86,"../util/isArray":164,"../util/subscribeToResult":173}],113:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../Observable');
-var isScheduler_1 = require('../util/isScheduler');
-var ArrayObservable_1 = require('../observable/ArrayObservable');
-var mergeAll_1 = require('./mergeAll');
-/* tslint:enable:max-line-length */
-/**
- * Creates an output Observable which sequentially emits all values from every
- * given input Observable after the current Observable.
- *
- * <span class="informal">Concatenates multiple Observables together by
- * sequentially emitting their values, one Observable after the other.</span>
- *
- * <img src="./img/concat.png" width="100%">
- *
- * Joins this Observable with multiple other Observables by subscribing to them
- * one at a time, starting with the source, and merging their results into the
- * output Observable. Will wait for each Observable to complete before moving
- * on to the next.
- *
- * @example <caption>Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10</caption>
- * var timer = Rx.Observable.interval(1000).take(4);
- * var sequence = Rx.Observable.range(1, 10);
- * var result = timer.concat(sequence);
- * result.subscribe(x => console.log(x));
- *
- * // results in:
- * // 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10
- *
- * @example <caption>Concatenate 3 Observables</caption>
- * var timer1 = Rx.Observable.interval(1000).take(10);
- * var timer2 = Rx.Observable.interval(2000).take(6);
- * var timer3 = Rx.Observable.interval(500).take(10);
- * var result = timer1.concat(timer2, timer3);
- * result.subscribe(x => console.log(x));
- *
- * // results in the following:
- * // (Prints to console sequentially)
- * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9
- * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5
- * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9
- *
- * @see {@link concatAll}
- * @see {@link concatMap}
- * @see {@link concatMapTo}
- *
- * @param {ObservableInput} other An input Observable to concatenate after the source
- * Observable. More than one input Observables may be given as argument.
- * @param {Scheduler} [scheduler=null] An optional IScheduler to schedule each
- * Observable subscription on.
- * @return {Observable} All values of each passed Observable merged into a
- * single Observable, in order, in serial fashion.
- * @method concat
- * @owner Observable
- */
-function concat() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
+      break; // need to emulate goto via "continue"
     }
-    return this.lift.call(concatStatic.apply(void 0, [this].concat(observables)));
-}
-exports.concat = concat;
-/* tslint:enable:max-line-length */
-/**
- * Creates an output Observable which sequentially emits all values from given
- * Observable and then moves on to the next.
- *
- * <span class="informal">Concatenates multiple Observables together by
- * sequentially emitting their values, one Observable after the other.</span>
- *
- * <img src="./img/concat.png" width="100%">
- *
- * `concat` joins multiple Observables together, by subscribing to them one at a time and
- * merging their results into the output Observable. You can pass either an array of
- * Observables, or put them directly as arguments. Passing an empty array will result
- * in Observable that completes immediately.
- *
- * `concat` will subscribe to first input Observable and emit all its values, without
- * changing or affecting them in any way. When that Observable completes, it will
- * subscribe to then next Observable passed and, again, emit its values. This will be
- * repeated, until the operator runs out of Observables. When last input Observable completes,
- * `concat` will complete as well. At any given moment only one Observable passed to operator
- * emits values. If you would like to emit values from passed Observables concurrently, check out
- * {@link merge} instead, especially with optional `concurrent` parameter. As a matter of fact,
- * `concat` is an equivalent of `merge` operator with `concurrent` parameter set to `1`.
- *
- * Note that if some input Observable never completes, `concat` will also never complete
- * and Observables following the one that did not complete will never be subscribed. On the other
- * hand, if some Observable simply completes immediately after it is subscribed, it will be
- * invisible for `concat`, which will just move on to the next Observable.
- *
- * If any Observable in chain errors, instead of passing control to the next Observable,
- * `concat` will error immediately as well. Observables that would be subscribed after
- * the one that emitted error, never will.
- *
- * If you pass to `concat` the same Observable many times, its stream of values
- * will be "replayed" on every subscription, which means you can repeat given Observable
- * as many times as you like. If passing the same Observable to `concat` 1000 times becomes tedious,
- * you can always use {@link repeat}.
- *
- * @example <caption>Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10</caption>
- * var timer = Rx.Observable.interval(1000).take(4);
- * var sequence = Rx.Observable.range(1, 10);
- * var result = Rx.Observable.concat(timer, sequence);
- * result.subscribe(x => console.log(x));
- *
- * // results in:
- * // 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10
- *
- *
- * @example <caption>Concatenate an array of 3 Observables</caption>
- * var timer1 = Rx.Observable.interval(1000).take(10);
- * var timer2 = Rx.Observable.interval(2000).take(6);
- * var timer3 = Rx.Observable.interval(500).take(10);
- * var result = Rx.Observable.concat([timer1, timer2, timer3]); // note that array is passed
- * result.subscribe(x => console.log(x));
- *
- * // results in the following:
- * // (Prints to console sequentially)
- * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9
- * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5
- * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9
- *
- *
- * @example <caption>Concatenate the same Observable to repeat it</caption>
- * const timer = Rx.Observable.interval(1000).take(2);
- *
- * Rx.Observable.concat(timer, timer) // concating the same Observable!
- * .subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('...and it is done!')
- * );
- *
- * // Logs:
- * // 0 after 1s
- * // 1 after 2s
- * // 0 after 3s
- * // 1 after 4s
- * // "...and it is done!" also after 4s
- *
- * @see {@link concatAll}
- * @see {@link concatMap}
- * @see {@link concatMapTo}
- *
- * @param {ObservableInput} input1 An input Observable to concatenate with others.
- * @param {ObservableInput} input2 An input Observable to concatenate with others.
- * More than one input Observables may be given as argument.
- * @param {Scheduler} [scheduler=null] An optional IScheduler to schedule each
- * Observable subscription on.
- * @return {Observable} All values of each passed Observable merged into a
- * single Observable, in order, in serial fashion.
- * @static true
- * @name concat
- * @owner Observable
+  } while (_in < last && _out < end);
+
+  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
+  len = bits >> 3;
+  _in -= len;
+  bits -= len << 3;
+  hold &= (1 << bits) - 1;
+
+  /* update state and return */
+  strm.next_in = _in;
+  strm.next_out = _out;
+  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
+  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
+  state.hold = hold;
+  state.bits = bits;
+  return;
+};
+
+},{}],34:[function(require,module,exports){
+'use strict';
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+var utils         = require('../utils/common');
+var adler32       = require('./adler32');
+var crc32         = require('./crc32');
+var inflate_fast  = require('./inffast');
+var inflate_table = require('./inftrees');
+
+var CODES = 0;
+var LENS = 1;
+var DISTS = 2;
+
+/* Public constants ==========================================================*/
+/* ===========================================================================*/
+
+
+/* Allowed flush values; see deflate() and inflate() below for details */
+//var Z_NO_FLUSH      = 0;
+//var Z_PARTIAL_FLUSH = 1;
+//var Z_SYNC_FLUSH    = 2;
+//var Z_FULL_FLUSH    = 3;
+var Z_FINISH        = 4;
+var Z_BLOCK         = 5;
+var Z_TREES         = 6;
+
+
+/* Return codes for the compression/decompression functions. Negative values
+ * are errors, positive values are used for special but normal events.
  */
-function concatStatic() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
-    }
-    var scheduler = null;
-    var args = observables;
-    if (isScheduler_1.isScheduler(args[observables.length - 1])) {
-        scheduler = args.pop();
-    }
-    if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) {
-        return observables[0];
+var Z_OK            = 0;
+var Z_STREAM_END    = 1;
+var Z_NEED_DICT     = 2;
+//var Z_ERRNO         = -1;
+var Z_STREAM_ERROR  = -2;
+var Z_DATA_ERROR    = -3;
+var Z_MEM_ERROR     = -4;
+var Z_BUF_ERROR     = -5;
+//var Z_VERSION_ERROR = -6;
+
+/* The deflate compression method */
+var Z_DEFLATED  = 8;
+
+
+/* STATES ====================================================================*/
+/* ===========================================================================*/
+
+
+var    HEAD = 1;       /* i: waiting for magic header */
+var    FLAGS = 2;      /* i: waiting for method and flags (gzip) */
+var    TIME = 3;       /* i: waiting for modification time (gzip) */
+var    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */
+var    EXLEN = 5;      /* i: waiting for extra length (gzip) */
+var    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */
+var    NAME = 7;       /* i: waiting for end of file name (gzip) */
+var    COMMENT = 8;    /* i: waiting for end of comment (gzip) */
+var    HCRC = 9;       /* i: waiting for header crc (gzip) */
+var    DICTID = 10;    /* i: waiting for dictionary check value */
+var    DICT = 11;      /* waiting for inflateSetDictionary() call */
+var        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
+var        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */
+var        STORED = 14;    /* i: waiting for stored size (length and complement) */
+var        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */
+var        COPY = 16;      /* i/o: waiting for input or output to copy stored block */
+var        TABLE = 17;     /* i: waiting for dynamic block table lengths */
+var        LENLENS = 18;   /* i: waiting for code length code lengths */
+var        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */
+var            LEN_ = 20;      /* i: same as LEN below, but only first time in */
+var            LEN = 21;       /* i: waiting for length/lit/eob code */
+var            LENEXT = 22;    /* i: waiting for length extra bits */
+var            DIST = 23;      /* i: waiting for distance code */
+var            DISTEXT = 24;   /* i: waiting for distance extra bits */
+var            MATCH = 25;     /* o: waiting for output space to copy string */
+var            LIT = 26;       /* o: waiting for output space to write literal */
+var    CHECK = 27;     /* i: waiting for 32-bit check value */
+var    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */
+var    DONE = 29;      /* finished check, done -- remain here until reset */
+var    BAD = 30;       /* got a data error -- remain here until reset */
+var    MEM = 31;       /* got an inflate() memory error -- remain here until reset */
+var    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */
+
+/* ===========================================================================*/
+
+
+
+var ENOUGH_LENS = 852;
+var ENOUGH_DISTS = 592;
+//var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);
+
+var MAX_WBITS = 15;
+/* 32K LZ77 window */
+var DEF_WBITS = MAX_WBITS;
+
+
+function zswap32(q) {
+  return  (((q >>> 24) & 0xff) +
+          ((q >>> 8) & 0xff00) +
+          ((q & 0xff00) << 8) +
+          ((q & 0xff) << 24));
+}
+
+
+function InflateState() {
+  this.mode = 0;             /* current inflate mode */
+  this.last = false;          /* true if processing last block */
+  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
+  this.havedict = false;      /* true if dictionary provided */
+  this.flags = 0;             /* gzip header method and flags (0 if zlib) */
+  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */
+  this.check = 0;             /* protected copy of check value */
+  this.total = 0;             /* protected copy of output count */
+  // TODO: may be {}
+  this.head = null;           /* where to save gzip header information */
+
+  /* sliding window */
+  this.wbits = 0;             /* log base 2 of requested window size */
+  this.wsize = 0;             /* window size or zero if not using window */
+  this.whave = 0;             /* valid bytes in the window */
+  this.wnext = 0;             /* window write index */
+  this.window = null;         /* allocated sliding window, if needed */
+
+  /* bit accumulator */
+  this.hold = 0;              /* input bit accumulator */
+  this.bits = 0;              /* number of bits in "in" */
+
+  /* for string and stored block copying */
+  this.length = 0;            /* literal or length of data to copy */
+  this.offset = 0;            /* distance back to copy string from */
+
+  /* for table and code decoding */
+  this.extra = 0;             /* extra bits needed */
+
+  /* fixed and dynamic code tables */
+  this.lencode = null;          /* starting table for length/literal codes */
+  this.distcode = null;         /* starting table for distance codes */
+  this.lenbits = 0;           /* index bits for lencode */
+  this.distbits = 0;          /* index bits for distcode */
+
+  /* dynamic table building */
+  this.ncode = 0;             /* number of code length code lengths */
+  this.nlen = 0;              /* number of length code lengths */
+  this.ndist = 0;             /* number of distance code lengths */
+  this.have = 0;              /* number of code lengths in lens[] */
+  this.next = null;              /* next available space in codes[] */
+
+  this.lens = new utils.Buf16(320); /* temporary storage for code lengths */
+  this.work = new utils.Buf16(288); /* work area for code table building */
+
+  /*
+   because we don't have pointers in js, we use lencode and distcode directly
+   as buffers so we don't need codes
+  */
+  //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */
+  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */
+  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */
+  this.sane = 0;                   /* if false, allow invalid distance too far */
+  this.back = 0;                   /* bits back of last unprocessed length/lit */
+  this.was = 0;                    /* initial length of match */
+}
+
+function inflateResetKeep(strm) {
+  var state;
+
+  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
+  state = strm.state;
+  strm.total_in = strm.total_out = state.total = 0;
+  strm.msg = ''; /*Z_NULL*/
+  if (state.wrap) {       /* to support ill-conceived Java test suite */
+    strm.adler = state.wrap & 1;
+  }
+  state.mode = HEAD;
+  state.last = 0;
+  state.havedict = 0;
+  state.dmax = 32768;
+  state.head = null/*Z_NULL*/;
+  state.hold = 0;
+  state.bits = 0;
+  //state.lencode = state.distcode = state.next = state.codes;
+  state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
+  state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
+
+  state.sane = 1;
+  state.back = -1;
+  //Tracev((stderr, "inflate: reset\n"));
+  return Z_OK;
+}
+
+function inflateReset(strm) {
+  var state;
+
+  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
+  state = strm.state;
+  state.wsize = 0;
+  state.whave = 0;
+  state.wnext = 0;
+  return inflateResetKeep(strm);
+
+}
+
+function inflateReset2(strm, windowBits) {
+  var wrap;
+  var state;
+
+  /* get the state */
+  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
+  state = strm.state;
+
+  /* extract wrap request from windowBits parameter */
+  if (windowBits < 0) {
+    wrap = 0;
+    windowBits = -windowBits;
+  }
+  else {
+    wrap = (windowBits >> 4) + 1;
+    if (windowBits < 48) {
+      windowBits &= 15;
     }
-    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(1));
+  }
+
+  /* set number of window bits, free window if different */
+  if (windowBits && (windowBits < 8 || windowBits > 15)) {
+    return Z_STREAM_ERROR;
+  }
+  if (state.window !== null && state.wbits !== windowBits) {
+    state.window = null;
+  }
+
+  /* update state and reset the rest of it */
+  state.wrap = wrap;
+  state.wbits = windowBits;
+  return inflateReset(strm);
 }
-exports.concatStatic = concatStatic;
 
-},{"../Observable":29,"../observable/ArrayObservable":86,"../util/isScheduler":171,"./mergeAll":126}],114:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var async_1 = require('../scheduler/async');
-/**
- * Emits a value from the source Observable only after a particular time span
- * has passed without another source emission.
- *
- * <span class="informal">It's like {@link delay}, but passes only the most
- * recent value from each burst of emissions.</span>
- *
- * <img src="./img/debounceTime.png" width="100%">
- *
- * `debounceTime` delays values emitted by the source Observable, but drops
- * previous pending delayed emissions if a new value arrives on the source
- * Observable. This operator keeps track of the most recent value from the
- * source Observable, and emits that only when `dueTime` enough time has passed
- * without any other value appearing on the source Observable. If a new value
- * appears before `dueTime` silence occurs, the previous value will be dropped
- * and will not be emitted on the output Observable.
- *
- * This is a rate-limiting operator, because it is impossible for more than one
- * value to be emitted in any time window of duration `dueTime`, but it is also
- * a delay-like operator since output emissions do not occur at the same time as
- * they did on the source Observable. Optionally takes a {@link IScheduler} for
- * managing timers.
- *
- * @example <caption>Emit the most recent click after a burst of clicks</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = clicks.debounceTime(1000);
- * result.subscribe(x => console.log(x));
- *
- * @see {@link auditTime}
- * @see {@link debounce}
- * @see {@link delay}
- * @see {@link sampleTime}
- * @see {@link throttleTime}
- *
- * @param {number} dueTime The timeout duration in milliseconds (or the time
- * unit determined internally by the optional `scheduler`) for the window of
- * time required to wait for emission silence before emitting the most recent
- * source value.
- * @param {Scheduler} [scheduler=async] The {@link IScheduler} to use for
- * managing the timers that handle the timeout for each value.
- * @return {Observable} An Observable that delays the emissions of the source
- * Observable by the specified `dueTime`, and may drop some values if they occur
- * too frequently.
- * @method debounceTime
- * @owner Observable
- */
-function debounceTime(dueTime, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return this.lift(new DebounceTimeOperator(dueTime, scheduler));
+function inflateInit2(strm, windowBits) {
+  var ret;
+  var state;
+
+  if (!strm) { return Z_STREAM_ERROR; }
+  //strm.msg = Z_NULL;                 /* in case we return an error */
+
+  state = new InflateState();
+
+  //if (state === Z_NULL) return Z_MEM_ERROR;
+  //Tracev((stderr, "inflate: allocated\n"));
+  strm.state = state;
+  state.window = null/*Z_NULL*/;
+  ret = inflateReset2(strm, windowBits);
+  if (ret !== Z_OK) {
+    strm.state = null/*Z_NULL*/;
+  }
+  return ret;
 }
-exports.debounceTime = debounceTime;
-var DebounceTimeOperator = (function () {
-    function DebounceTimeOperator(dueTime, scheduler) {
-        this.dueTime = dueTime;
-        this.scheduler = scheduler;
-    }
-    DebounceTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));
-    };
-    return DebounceTimeOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var DebounceTimeSubscriber = (function (_super) {
-    __extends(DebounceTimeSubscriber, _super);
-    function DebounceTimeSubscriber(destination, dueTime, scheduler) {
-        _super.call(this, destination);
-        this.dueTime = dueTime;
-        this.scheduler = scheduler;
-        this.debouncedSubscription = null;
-        this.lastValue = null;
-        this.hasValue = false;
-    }
-    DebounceTimeSubscriber.prototype._next = function (value) {
-        this.clearDebounce();
-        this.lastValue = value;
-        this.hasValue = true;
-        this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));
-    };
-    DebounceTimeSubscriber.prototype._complete = function () {
-        this.debouncedNext();
-        this.destination.complete();
-    };
-    DebounceTimeSubscriber.prototype.debouncedNext = function () {
-        this.clearDebounce();
-        if (this.hasValue) {
-            this.destination.next(this.lastValue);
-            this.lastValue = null;
-            this.hasValue = false;
-        }
-    };
-    DebounceTimeSubscriber.prototype.clearDebounce = function () {
-        var debouncedSubscription = this.debouncedSubscription;
-        if (debouncedSubscription !== null) {
-            this.remove(debouncedSubscription);
-            debouncedSubscription.unsubscribe();
-            this.debouncedSubscription = null;
-        }
-    };
-    return DebounceTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchNext(subscriber) {
-    subscriber.debouncedNext();
+
+function inflateInit(strm) {
+  return inflateInit2(strm, DEF_WBITS);
 }
 
-},{"../Subscriber":36,"../scheduler/async":152}],115:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var async_1 = require('../scheduler/async');
-var isDate_1 = require('../util/isDate');
-var Subscriber_1 = require('../Subscriber');
-var Notification_1 = require('../Notification');
-/**
- * Delays the emission of items from the source Observable by a given timeout or
- * until a given Date.
- *
- * <span class="informal">Time shifts each item by some specified amount of
- * milliseconds.</span>
- *
- * <img src="./img/delay.png" width="100%">
- *
- * If the delay argument is a Number, this operator time shifts the source
- * Observable by that amount of time expressed in milliseconds. The relative
- * time intervals between the values are preserved.
- *
- * If the delay argument is a Date, this operator time shifts the start of the
- * Observable execution until the given date occurs.
- *
- * @example <caption>Delay each click by one second</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var delayedClicks = clicks.delay(1000); // each click emitted after 1 second
- * delayedClicks.subscribe(x => console.log(x));
- *
- * @example <caption>Delay all clicks until a future date happens</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var date = new Date('March 15, 2050 12:00:00'); // in the future
- * var delayedClicks = clicks.delay(date); // click emitted only after that date
- * delayedClicks.subscribe(x => console.log(x));
- *
- * @see {@link debounceTime}
- * @see {@link delayWhen}
- *
- * @param {number|Date} delay The delay duration in milliseconds (a `number`) or
- * a `Date` until which the emission of the source items is delayed.
- * @param {Scheduler} [scheduler=async] The IScheduler to use for
- * managing the timers that handle the time-shift for each item.
- * @return {Observable} An Observable that delays the emissions of the source
- * Observable by the specified timeout or Date.
- * @method delay
- * @owner Observable
+
+/*
+ Return state with length and distance decoding tables and index sizes set to
+ fixed code decoding.  Normally this returns fixed tables from inffixed.h.
+ If BUILDFIXED is defined, then instead this routine builds the tables the
+ first time it's called, and returns those tables the first time and
+ thereafter.  This reduces the size of the code by about 2K bytes, in
+ exchange for a little execution time.  However, BUILDFIXED should not be
+ used for threaded applications, since the rewriting of the tables and virgin
+ may not be thread-safe.
  */
-function delay(delay, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    var absoluteDelay = isDate_1.isDate(delay);
-    var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);
-    return this.lift(new DelayOperator(delayFor, scheduler));
+var virgin = true;
+
+var lenfix, distfix; // We have no pointers in JS, so keep tables separate
+
+function fixedtables(state) {
+  /* build fixed huffman tables if first call (may not be thread safe) */
+  if (virgin) {
+    var sym;
+
+    lenfix = new utils.Buf32(512);
+    distfix = new utils.Buf32(32);
+
+    /* literal/length table */
+    sym = 0;
+    while (sym < 144) { state.lens[sym++] = 8; }
+    while (sym < 256) { state.lens[sym++] = 9; }
+    while (sym < 280) { state.lens[sym++] = 7; }
+    while (sym < 288) { state.lens[sym++] = 8; }
+
+    inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });
+
+    /* distance table */
+    sym = 0;
+    while (sym < 32) { state.lens[sym++] = 5; }
+
+    inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });
+
+    /* do this just once */
+    virgin = false;
+  }
+
+  state.lencode = lenfix;
+  state.lenbits = 9;
+  state.distcode = distfix;
+  state.distbits = 5;
 }
-exports.delay = delay;
-var DelayOperator = (function () {
-    function DelayOperator(delay, scheduler) {
-        this.delay = delay;
-        this.scheduler = scheduler;
-    }
-    DelayOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));
-    };
-    return DelayOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
+
+
+/*
+ Update the window with the last wsize (normally 32K) bytes written before
+ returning.  If window does not exist yet, create it.  This is only called
+ when a window is already in use, or when output has been written during this
+ inflate call, but the end of the deflate stream has not been reached yet.
+ It is also called to create a window for dictionary data when a dictionary
+ is loaded.
+
+ Providing output buffers larger than 32K to inflate() should provide a speed
+ advantage, since only the last 32K of output is copied to the sliding window
+ upon return from inflate(), and since all distances after the first 32K of
+ output will fall in the output data, making match copies simpler and faster.
+ The advantage may be dependent on the size of the processor's data caches.
  */
-var DelaySubscriber = (function (_super) {
-    __extends(DelaySubscriber, _super);
-    function DelaySubscriber(destination, delay, scheduler) {
-        _super.call(this, destination);
-        this.delay = delay;
-        this.scheduler = scheduler;
-        this.queue = [];
-        this.active = false;
-        this.errored = false;
-    }
-    DelaySubscriber.dispatch = function (state) {
-        var source = state.source;
-        var queue = source.queue;
-        var scheduler = state.scheduler;
-        var destination = state.destination;
-        while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {
-            queue.shift().notification.observe(destination);
-        }
-        if (queue.length > 0) {
-            var delay_1 = Math.max(0, queue[0].time - scheduler.now());
-            this.schedule(state, delay_1);
-        }
-        else {
-            source.active = false;
-        }
-    };
-    DelaySubscriber.prototype._schedule = function (scheduler) {
-        this.active = true;
-        this.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {
-            source: this, destination: this.destination, scheduler: scheduler
-        }));
-    };
-    DelaySubscriber.prototype.scheduleNotification = function (notification) {
-        if (this.errored === true) {
-            return;
-        }
-        var scheduler = this.scheduler;
-        var message = new DelayMessage(scheduler.now() + this.delay, notification);
-        this.queue.push(message);
-        if (this.active === false) {
-            this._schedule(scheduler);
-        }
-    };
-    DelaySubscriber.prototype._next = function (value) {
-        this.scheduleNotification(Notification_1.Notification.createNext(value));
-    };
-    DelaySubscriber.prototype._error = function (err) {
-        this.errored = true;
-        this.queue = [];
-        this.destination.error(err);
-    };
-    DelaySubscriber.prototype._complete = function () {
-        this.scheduleNotification(Notification_1.Notification.createComplete());
-    };
-    return DelaySubscriber;
-}(Subscriber_1.Subscriber));
-var DelayMessage = (function () {
-    function DelayMessage(time, notification) {
-        this.time = time;
-        this.notification = notification;
-    }
-    return DelayMessage;
-}());
+function updatewindow(strm, src, end, copy) {
+  var dist;
+  var state = strm.state;
 
-},{"../Notification":28,"../Subscriber":36,"../scheduler/async":152,"../util/isDate":166}],116:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-var Set_1 = require('../util/Set');
-/**
- * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from previous items.
- *
- * If a keySelector function is provided, then it will project each value from the source observable into a new value that it will
- * check for equality with previously projected values. If a keySelector function is not provided, it will use each value from the
- * source observable directly with an equality check against previous values.
- *
- * In JavaScript runtimes that support `Set`, this operator will use a `Set` to improve performance of the distinct value checking.
- *
- * In other runtimes, this operator will use a minimal implementation of `Set` that relies on an `Array` and `indexOf` under the
- * hood, so performance will degrade as more values are checked for distinction. Even in newer browsers, a long-running `distinct`
- * use might result in memory leaks. To help alleviate this in some scenarios, an optional `flushes` parameter is also provided so
- * that the internal `Set` can be "flushed", basically clearing it of values.
- *
- * @example <caption>A simple example with numbers</caption>
- * Observable.of(1, 1, 2, 2, 2, 1, 2, 3, 4, 3, 2, 1)
- *   .distinct()
- *   .subscribe(x => console.log(x)); // 1, 2, 3, 4
- *
- * @example <caption>An example using a keySelector function</caption>
- * interface Person {
- *    age: number,
- *    name: string
- * }
- *
- * Observable.of<Person>(
- *     { age: 4, name: 'Foo'},
- *     { age: 7, name: 'Bar'},
- *     { age: 5, name: 'Foo'})
- *     .distinct((p: Person) => p.name)
- *     .subscribe(x => console.log(x));
- *
- * // displays:
- * // { age: 4, name: 'Foo' }
- * // { age: 7, name: 'Bar' }
- *
- * @see {@link distinctUntilChanged}
- * @see {@link distinctUntilKeyChanged}
- *
- * @param {function} [keySelector] Optional function to select which value you want to check as distinct.
- * @param {Observable} [flushes] Optional Observable for flushing the internal HashSet of the operator.
- * @return {Observable} An Observable that emits items from the source Observable with distinct values.
- * @method distinct
- * @owner Observable
- */
-function distinct(keySelector, flushes) {
-    return this.lift(new DistinctOperator(keySelector, flushes));
-}
-exports.distinct = distinct;
-var DistinctOperator = (function () {
-    function DistinctOperator(keySelector, flushes) {
-        this.keySelector = keySelector;
-        this.flushes = flushes;
+  /* if it hasn't been done already, allocate space for the window */
+  if (state.window === null) {
+    state.wsize = 1 << state.wbits;
+    state.wnext = 0;
+    state.whave = 0;
+
+    state.window = new utils.Buf8(state.wsize);
+  }
+
+  /* copy state->wsize or less output bytes into the circular window */
+  if (copy >= state.wsize) {
+    utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);
+    state.wnext = 0;
+    state.whave = state.wsize;
+  }
+  else {
+    dist = state.wsize - state.wnext;
+    if (dist > copy) {
+      dist = copy;
+    }
+    //zmemcpy(state->window + state->wnext, end - copy, dist);
+    utils.arraySet(state.window, src, end - copy, dist, state.wnext);
+    copy -= dist;
+    if (copy) {
+      //zmemcpy(state->window, end - copy, copy);
+      utils.arraySet(state.window, src, end - copy, copy, 0);
+      state.wnext = copy;
+      state.whave = state.wsize;
     }
-    DistinctOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));
-    };
-    return DistinctOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var DistinctSubscriber = (function (_super) {
-    __extends(DistinctSubscriber, _super);
-    function DistinctSubscriber(destination, keySelector, flushes) {
-        _super.call(this, destination);
-        this.keySelector = keySelector;
-        this.values = new Set_1.Set();
-        if (flushes) {
-            this.add(subscribeToResult_1.subscribeToResult(this, flushes));
-        }
+    else {
+      state.wnext += dist;
+      if (state.wnext === state.wsize) { state.wnext = 0; }
+      if (state.whave < state.wsize) { state.whave += dist; }
     }
-    DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.values.clear();
-    };
-    DistinctSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    DistinctSubscriber.prototype._next = function (value) {
-        if (this.keySelector) {
-            this._useKeySelector(value);
-        }
-        else {
-            this._finalizeNext(value, value);
-        }
-    };
-    DistinctSubscriber.prototype._useKeySelector = function (value) {
-        var key;
-        var destination = this.destination;
-        try {
-            key = this.keySelector(value);
-        }
-        catch (err) {
-            destination.error(err);
-            return;
-        }
-        this._finalizeNext(key, value);
-    };
-    DistinctSubscriber.prototype._finalizeNext = function (key, value) {
-        var values = this.values;
-        if (!values.has(key)) {
-            values.add(key);
-            this.destination.next(value);
-        }
-    };
-    return DistinctSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.DistinctSubscriber = DistinctSubscriber;
+  }
+  return 0;
+}
+
+function inflate(strm, flush) {
+  var state;
+  var input, output;          // input/output buffers
+  var next;                   /* next input INDEX */
+  var put;                    /* next output INDEX */
+  var have, left;             /* available input and output */
+  var hold;                   /* bit buffer */
+  var bits;                   /* bits in bit buffer */
+  var _in, _out;              /* save starting available input and output */
+  var copy;                   /* number of stored or match bytes to copy */
+  var from;                   /* where to copy match bytes from */
+  var from_source;
+  var here = 0;               /* current decoding table entry */
+  var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
+  //var last;                   /* parent table entry */
+  var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
+  var len;                    /* length to copy for repeats, bits to drop */
+  var ret;                    /* return code */
+  var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */
+  var opts;
+
+  var n; // temporary var for NEED_BITS
+
+  var order = /* permutation of code lengths */
+    [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];
+
+
+  if (!strm || !strm.state || !strm.output ||
+      (!strm.input && strm.avail_in !== 0)) {
+    return Z_STREAM_ERROR;
+  }
 
-},{"../OuterSubscriber":31,"../util/Set":161,"../util/subscribeToResult":173}],117:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var tryCatch_1 = require('../util/tryCatch');
-var errorObject_1 = require('../util/errorObject');
-/* tslint:enable:max-line-length */
-/**
- * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from the previous item.
- *
- * If a comparator function is provided, then it will be called for each item to test for whether or not that value should be emitted.
- *
- * If a comparator function is not provided, an equality check is used by default.
- *
- * @example <caption>A simple example with numbers</caption>
- * Observable.of(1, 1, 2, 2, 2, 1, 1, 2, 3, 3, 4)
- *   .distinctUntilChanged()
- *   .subscribe(x => console.log(x)); // 1, 2, 1, 2, 3, 4
- *
- * @example <caption>An example using a compare function</caption>
- * interface Person {
- *    age: number,
- *    name: string
- * }
- *
- * Observable.of<Person>(
- *     { age: 4, name: 'Foo'},
- *     { age: 7, name: 'Bar'},
- *     { age: 5, name: 'Foo'})
- *     { age: 6, name: 'Foo'})
- *     .distinctUntilChanged((p: Person, q: Person) => p.name === q.name)
- *     .subscribe(x => console.log(x));
- *
- * // displays:
- * // { age: 4, name: 'Foo' }
- * // { age: 7, name: 'Bar' }
- * // { age: 5, name: 'Foo' }
- *
- * @see {@link distinct}
- * @see {@link distinctUntilKeyChanged}
- *
- * @param {function} [compare] Optional comparison function called to test if an item is distinct from the previous item in the source.
- * @return {Observable} An Observable that emits items from the source Observable with distinct values.
- * @method distinctUntilChanged
- * @owner Observable
- */
-function distinctUntilChanged(compare, keySelector) {
-    return this.lift(new DistinctUntilChangedOperator(compare, keySelector));
-}
-exports.distinctUntilChanged = distinctUntilChanged;
-var DistinctUntilChangedOperator = (function () {
-    function DistinctUntilChangedOperator(compare, keySelector) {
-        this.compare = compare;
-        this.keySelector = keySelector;
-    }
-    DistinctUntilChangedOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));
-    };
-    return DistinctUntilChangedOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var DistinctUntilChangedSubscriber = (function (_super) {
-    __extends(DistinctUntilChangedSubscriber, _super);
-    function DistinctUntilChangedSubscriber(destination, compare, keySelector) {
-        _super.call(this, destination);
-        this.keySelector = keySelector;
-        this.hasKey = false;
-        if (typeof compare === 'function') {
-            this.compare = compare;
+  state = strm.state;
+  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */
+
+
+  //--- LOAD() ---
+  put = strm.next_out;
+  output = strm.output;
+  left = strm.avail_out;
+  next = strm.next_in;
+  input = strm.input;
+  have = strm.avail_in;
+  hold = state.hold;
+  bits = state.bits;
+  //---
+
+  _in = have;
+  _out = left;
+  ret = Z_OK;
+
+  inf_leave: // goto emulation
+  for (;;) {
+    switch (state.mode) {
+      case HEAD:
+        if (state.wrap === 0) {
+          state.mode = TYPEDO;
+          break;
         }
-    }
-    DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {
-        return x === y;
-    };
-    DistinctUntilChangedSubscriber.prototype._next = function (value) {
-        var keySelector = this.keySelector;
-        var key = value;
-        if (keySelector) {
-            key = tryCatch_1.tryCatch(this.keySelector)(value);
-            if (key === errorObject_1.errorObject) {
-                return this.destination.error(errorObject_1.errorObject.e);
-            }
+        //=== NEEDBITS(16);
+        while (bits < 16) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */
+          state.check = 0/*crc32(0L, Z_NULL, 0)*/;
+          //=== CRC2(state.check, hold);
+          hbuf[0] = hold & 0xff;
+          hbuf[1] = (hold >>> 8) & 0xff;
+          state.check = crc32(state.check, hbuf, 2, 0);
+          //===//
+
+          //=== INITBITS();
+          hold = 0;
+          bits = 0;
+          //===//
+          state.mode = FLAGS;
+          break;
         }
-        var result = false;
-        if (this.hasKey) {
-            result = tryCatch_1.tryCatch(this.compare)(this.key, key);
-            if (result === errorObject_1.errorObject) {
-                return this.destination.error(errorObject_1.errorObject.e);
-            }
+        state.flags = 0;           /* expect zlib header */
+        if (state.head) {
+          state.head.done = false;
         }
-        else {
-            this.hasKey = true;
+        if (!(state.wrap & 1) ||   /* check if zlib header allowed */
+          (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
+          strm.msg = 'incorrect header check';
+          state.mode = BAD;
+          break;
         }
-        if (Boolean(result) === false) {
-            this.key = key;
-            this.destination.next(value);
+        if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {
+          strm.msg = 'unknown compression method';
+          state.mode = BAD;
+          break;
         }
-    };
-    return DistinctUntilChangedSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":36,"../util/errorObject":163,"../util/tryCatch":175}],118:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/* tslint:enable:max-line-length */
-/**
- * Perform a side effect for every emission on the source Observable, but return
- * an Observable that is identical to the source.
- *
- * <span class="informal">Intercepts each emission on the source and runs a
- * function, but returns an output which is identical to the source as long as errors don't occur.</span>
- *
- * <img src="./img/do.png" width="100%">
- *
- * Returns a mirrored Observable of the source Observable, but modified so that
- * the provided Observer is called to perform a side effect for every value,
- * error, and completion emitted by the source. Any errors that are thrown in
- * the aforementioned Observer or handlers are safely sent down the error path
- * of the output Observable.
- *
- * This operator is useful for debugging your Observables for the correct values
- * or performing other side effects.
- *
- * Note: this is different to a `subscribe` on the Observable. If the Observable
- * returned by `do` is not subscribed, the side effects specified by the
- * Observer will never happen. `do` therefore simply spies on existing
- * execution, it does not trigger an execution to happen like `subscribe` does.
- *
- * @example <caption>Map every click to the clientX position of that click, while also logging the click event</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var positions = clicks
- *   .do(ev => console.log(ev))
- *   .map(ev => ev.clientX);
- * positions.subscribe(x => console.log(x));
- *
- * @see {@link map}
- * @see {@link subscribe}
- *
- * @param {Observer|function} [nextOrObserver] A normal Observer object or a
- * callback for `next`.
- * @param {function} [error] Callback for errors in the source.
- * @param {function} [complete] Callback for the completion of the source.
- * @return {Observable} An Observable identical to the source, but runs the
- * specified Observer or callback(s) for each item.
- * @method do
- * @name do
- * @owner Observable
- */
-function _do(nextOrObserver, error, complete) {
-    return this.lift(new DoOperator(nextOrObserver, error, complete));
-}
-exports._do = _do;
-var DoOperator = (function () {
-    function DoOperator(nextOrObserver, error, complete) {
-        this.nextOrObserver = nextOrObserver;
-        this.error = error;
-        this.complete = complete;
-    }
-    DoOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DoSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));
-    };
-    return DoOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var DoSubscriber = (function (_super) {
-    __extends(DoSubscriber, _super);
-    function DoSubscriber(destination, nextOrObserver, error, complete) {
-        _super.call(this, destination);
-        var safeSubscriber = new Subscriber_1.Subscriber(nextOrObserver, error, complete);
-        safeSubscriber.syncErrorThrowable = true;
-        this.add(safeSubscriber);
-        this.safeSubscriber = safeSubscriber;
-    }
-    DoSubscriber.prototype._next = function (value) {
-        var safeSubscriber = this.safeSubscriber;
-        safeSubscriber.next(value);
-        if (safeSubscriber.syncErrorThrown) {
-            this.destination.error(safeSubscriber.syncErrorValue);
+        //--- DROPBITS(4) ---//
+        hold >>>= 4;
+        bits -= 4;
+        //---//
+        len = (hold & 0x0f)/*BITS(4)*/ + 8;
+        if (state.wbits === 0) {
+          state.wbits = len;
+        }
+        else if (len > state.wbits) {
+          strm.msg = 'invalid window size';
+          state.mode = BAD;
+          break;
         }
-        else {
-            this.destination.next(value);
+        state.dmax = 1 << len;
+        //Tracev((stderr, "inflate:   zlib header ok\n"));
+        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
+        state.mode = hold & 0x200 ? DICTID : TYPE;
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+        break;
+      case FLAGS:
+        //=== NEEDBITS(16); */
+        while (bits < 16) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        state.flags = hold;
+        if ((state.flags & 0xff) !== Z_DEFLATED) {
+          strm.msg = 'unknown compression method';
+          state.mode = BAD;
+          break;
         }
-    };
-    DoSubscriber.prototype._error = function (err) {
-        var safeSubscriber = this.safeSubscriber;
-        safeSubscriber.error(err);
-        if (safeSubscriber.syncErrorThrown) {
-            this.destination.error(safeSubscriber.syncErrorValue);
+        if (state.flags & 0xe000) {
+          strm.msg = 'unknown header flags set';
+          state.mode = BAD;
+          break;
         }
-        else {
-            this.destination.error(err);
+        if (state.head) {
+          state.head.text = ((hold >> 8) & 1);
+        }
+        if (state.flags & 0x0200) {
+          //=== CRC2(state.check, hold);
+          hbuf[0] = hold & 0xff;
+          hbuf[1] = (hold >>> 8) & 0xff;
+          state.check = crc32(state.check, hbuf, 2, 0);
+          //===//
+        }
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+        state.mode = TIME;
+        /* falls through */
+      case TIME:
+        //=== NEEDBITS(32); */
+        while (bits < 32) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        if (state.head) {
+          state.head.time = hold;
+        }
+        if (state.flags & 0x0200) {
+          //=== CRC4(state.check, hold)
+          hbuf[0] = hold & 0xff;
+          hbuf[1] = (hold >>> 8) & 0xff;
+          hbuf[2] = (hold >>> 16) & 0xff;
+          hbuf[3] = (hold >>> 24) & 0xff;
+          state.check = crc32(state.check, hbuf, 4, 0);
+          //===
+        }
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+        state.mode = OS;
+        /* falls through */
+      case OS:
+        //=== NEEDBITS(16); */
+        while (bits < 16) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        if (state.head) {
+          state.head.xflags = (hold & 0xff);
+          state.head.os = (hold >> 8);
+        }
+        if (state.flags & 0x0200) {
+          //=== CRC2(state.check, hold);
+          hbuf[0] = hold & 0xff;
+          hbuf[1] = (hold >>> 8) & 0xff;
+          state.check = crc32(state.check, hbuf, 2, 0);
+          //===//
+        }
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+        state.mode = EXLEN;
+        /* falls through */
+      case EXLEN:
+        if (state.flags & 0x0400) {
+          //=== NEEDBITS(16); */
+          while (bits < 16) {
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+          }
+          //===//
+          state.length = hold;
+          if (state.head) {
+            state.head.extra_len = hold;
+          }
+          if (state.flags & 0x0200) {
+            //=== CRC2(state.check, hold);
+            hbuf[0] = hold & 0xff;
+            hbuf[1] = (hold >>> 8) & 0xff;
+            state.check = crc32(state.check, hbuf, 2, 0);
+            //===//
+          }
+          //=== INITBITS();
+          hold = 0;
+          bits = 0;
+          //===//
+        }
+        else if (state.head) {
+          state.head.extra = null/*Z_NULL*/;
+        }
+        state.mode = EXTRA;
+        /* falls through */
+      case EXTRA:
+        if (state.flags & 0x0400) {
+          copy = state.length;
+          if (copy > have) { copy = have; }
+          if (copy) {
+            if (state.head) {
+              len = state.head.extra_len - state.length;
+              if (!state.head.extra) {
+                // Use untyped array for more convenient processing later
+                state.head.extra = new Array(state.head.extra_len);
+              }
+              utils.arraySet(
+                state.head.extra,
+                input,
+                next,
+                // extra field is limited to 65536 bytes
+                // - no need for additional size check
+                copy,
+                /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
+                len
+              );
+              //zmemcpy(state.head.extra + len, next,
+              //        len + copy > state.head.extra_max ?
+              //        state.head.extra_max - len : copy);
+            }
+            if (state.flags & 0x0200) {
+              state.check = crc32(state.check, input, copy, next);
+            }
+            have -= copy;
+            next += copy;
+            state.length -= copy;
+          }
+          if (state.length) { break inf_leave; }
+        }
+        state.length = 0;
+        state.mode = NAME;
+        /* falls through */
+      case NAME:
+        if (state.flags & 0x0800) {
+          if (have === 0) { break inf_leave; }
+          copy = 0;
+          do {
+            // TODO: 2 or 1 bytes?
+            len = input[next + copy++];
+            /* use constant limit because in js we should not preallocate memory */
+            if (state.head && len &&
+                (state.length < 65536 /*state.head.name_max*/)) {
+              state.head.name += String.fromCharCode(len);
+            }
+          } while (len && copy < have);
+
+          if (state.flags & 0x0200) {
+            state.check = crc32(state.check, input, copy, next);
+          }
+          have -= copy;
+          next += copy;
+          if (len) { break inf_leave; }
+        }
+        else if (state.head) {
+          state.head.name = null;
+        }
+        state.length = 0;
+        state.mode = COMMENT;
+        /* falls through */
+      case COMMENT:
+        if (state.flags & 0x1000) {
+          if (have === 0) { break inf_leave; }
+          copy = 0;
+          do {
+            len = input[next + copy++];
+            /* use constant limit because in js we should not preallocate memory */
+            if (state.head && len &&
+                (state.length < 65536 /*state.head.comm_max*/)) {
+              state.head.comment += String.fromCharCode(len);
+            }
+          } while (len && copy < have);
+          if (state.flags & 0x0200) {
+            state.check = crc32(state.check, input, copy, next);
+          }
+          have -= copy;
+          next += copy;
+          if (len) { break inf_leave; }
+        }
+        else if (state.head) {
+          state.head.comment = null;
+        }
+        state.mode = HCRC;
+        /* falls through */
+      case HCRC:
+        if (state.flags & 0x0200) {
+          //=== NEEDBITS(16); */
+          while (bits < 16) {
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+          }
+          //===//
+          if (hold !== (state.check & 0xffff)) {
+            strm.msg = 'header crc mismatch';
+            state.mode = BAD;
+            break;
+          }
+          //=== INITBITS();
+          hold = 0;
+          bits = 0;
+          //===//
+        }
+        if (state.head) {
+          state.head.hcrc = ((state.flags >> 9) & 1);
+          state.head.done = true;
+        }
+        strm.adler = state.check = 0;
+        state.mode = TYPE;
+        break;
+      case DICTID:
+        //=== NEEDBITS(32); */
+        while (bits < 32) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        strm.adler = state.check = zswap32(hold);
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+        state.mode = DICT;
+        /* falls through */
+      case DICT:
+        if (state.havedict === 0) {
+          //--- RESTORE() ---
+          strm.next_out = put;
+          strm.avail_out = left;
+          strm.next_in = next;
+          strm.avail_in = have;
+          state.hold = hold;
+          state.bits = bits;
+          //---
+          return Z_NEED_DICT;
+        }
+        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
+        state.mode = TYPE;
+        /* falls through */
+      case TYPE:
+        if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }
+        /* falls through */
+      case TYPEDO:
+        if (state.last) {
+          //--- BYTEBITS() ---//
+          hold >>>= bits & 7;
+          bits -= bits & 7;
+          //---//
+          state.mode = CHECK;
+          break;
         }
-    };
-    DoSubscriber.prototype._complete = function () {
-        var safeSubscriber = this.safeSubscriber;
-        safeSubscriber.complete();
-        if (safeSubscriber.syncErrorThrown) {
-            this.destination.error(safeSubscriber.syncErrorValue);
+        //=== NEEDBITS(3); */
+        while (bits < 3) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        state.last = (hold & 0x01)/*BITS(1)*/;
+        //--- DROPBITS(1) ---//
+        hold >>>= 1;
+        bits -= 1;
+        //---//
+
+        switch ((hold & 0x03)/*BITS(2)*/) {
+          case 0:                             /* stored block */
+            //Tracev((stderr, "inflate:     stored block%s\n",
+            //        state.last ? " (last)" : ""));
+            state.mode = STORED;
+            break;
+          case 1:                             /* fixed block */
+            fixedtables(state);
+            //Tracev((stderr, "inflate:     fixed codes block%s\n",
+            //        state.last ? " (last)" : ""));
+            state.mode = LEN_;             /* decode codes */
+            if (flush === Z_TREES) {
+              //--- DROPBITS(2) ---//
+              hold >>>= 2;
+              bits -= 2;
+              //---//
+              break inf_leave;
+            }
+            break;
+          case 2:                             /* dynamic block */
+            //Tracev((stderr, "inflate:     dynamic codes block%s\n",
+            //        state.last ? " (last)" : ""));
+            state.mode = TABLE;
+            break;
+          case 3:
+            strm.msg = 'invalid block type';
+            state.mode = BAD;
+        }
+        //--- DROPBITS(2) ---//
+        hold >>>= 2;
+        bits -= 2;
+        //---//
+        break;
+      case STORED:
+        //--- BYTEBITS() ---// /* go to byte boundary */
+        hold >>>= bits & 7;
+        bits -= bits & 7;
+        //---//
+        //=== NEEDBITS(32); */
+        while (bits < 32) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
+          strm.msg = 'invalid stored block lengths';
+          state.mode = BAD;
+          break;
         }
-        else {
-            this.destination.complete();
+        state.length = hold & 0xffff;
+        //Tracev((stderr, "inflate:       stored length %u\n",
+        //        state.length));
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+        state.mode = COPY_;
+        if (flush === Z_TREES) { break inf_leave; }
+        /* falls through */
+      case COPY_:
+        state.mode = COPY;
+        /* falls through */
+      case COPY:
+        copy = state.length;
+        if (copy) {
+          if (copy > have) { copy = have; }
+          if (copy > left) { copy = left; }
+          if (copy === 0) { break inf_leave; }
+          //--- zmemcpy(put, next, copy); ---
+          utils.arraySet(output, input, next, copy, put);
+          //---//
+          have -= copy;
+          next += copy;
+          left -= copy;
+          put += copy;
+          state.length -= copy;
+          break;
         }
-    };
-    return DoSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":36}],119:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var tryCatch_1 = require('../util/tryCatch');
-var errorObject_1 = require('../util/errorObject');
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/* tslint:enable:max-line-length */
-/**
- * Recursively projects each source value to an Observable which is merged in
- * the output Observable.
- *
- * <span class="informal">It's similar to {@link mergeMap}, but applies the
- * projection function to every source value as well as every output value.
- * It's recursive.</span>
- *
- * <img src="./img/expand.png" width="100%">
- *
- * Returns an Observable that emits items based on applying a function that you
- * supply to each item emitted by the source Observable, where that function
- * returns an Observable, and then merging those resulting Observables and
- * emitting the results of this merger. *Expand* will re-emit on the output
- * Observable every source value. Then, each output value is given to the
- * `project` function which returns an inner Observable to be merged on the
- * output Observable. Those output values resulting from the projection are also
- * given to the `project` function to produce new output values. This is how
- * *expand* behaves recursively.
- *
- * @example <caption>Start emitting the powers of two on every click, at most 10 of them</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var powersOfTwo = clicks
- *   .mapTo(1)
- *   .expand(x => Rx.Observable.of(2 * x).delay(1000))
- *   .take(10);
- * powersOfTwo.subscribe(x => console.log(x));
- *
- * @see {@link mergeMap}
- * @see {@link mergeScan}
- *
- * @param {function(value: T, index: number) => Observable} project A function
- * that, when applied to an item emitted by the source or the output Observable,
- * returns an Observable.
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @param {Scheduler} [scheduler=null] The IScheduler to use for subscribing to
- * each projected inner Observable.
- * @return {Observable} An Observable that emits the source values and also
- * result of applying the projection function to each value emitted on the
- * output Observable and and merging the results of the Observables obtained
- * from this transformation.
- * @method expand
- * @owner Observable
- */
-function expand(project, concurrent, scheduler) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    if (scheduler === void 0) { scheduler = undefined; }
-    concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;
-    return this.lift(new ExpandOperator(project, concurrent, scheduler));
-}
-exports.expand = expand;
-var ExpandOperator = (function () {
-    function ExpandOperator(project, concurrent, scheduler) {
-        this.project = project;
-        this.concurrent = concurrent;
-        this.scheduler = scheduler;
-    }
-    ExpandOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));
-    };
-    return ExpandOperator;
-}());
-exports.ExpandOperator = ExpandOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var ExpandSubscriber = (function (_super) {
-    __extends(ExpandSubscriber, _super);
-    function ExpandSubscriber(destination, project, concurrent, scheduler) {
-        _super.call(this, destination);
-        this.project = project;
-        this.concurrent = concurrent;
-        this.scheduler = scheduler;
-        this.index = 0;
-        this.active = 0;
-        this.hasCompleted = false;
-        if (concurrent < Number.POSITIVE_INFINITY) {
-            this.buffer = [];
+        //Tracev((stderr, "inflate:       stored end\n"));
+        state.mode = TYPE;
+        break;
+      case TABLE:
+        //=== NEEDBITS(14); */
+        while (bits < 14) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
+        //--- DROPBITS(5) ---//
+        hold >>>= 5;
+        bits -= 5;
+        //---//
+        state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
+        //--- DROPBITS(5) ---//
+        hold >>>= 5;
+        bits -= 5;
+        //---//
+        state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
+        //--- DROPBITS(4) ---//
+        hold >>>= 4;
+        bits -= 4;
+        //---//
+//#ifndef PKZIP_BUG_WORKAROUND
+        if (state.nlen > 286 || state.ndist > 30) {
+          strm.msg = 'too many length or distance symbols';
+          state.mode = BAD;
+          break;
         }
-    }
-    ExpandSubscriber.dispatch = function (arg) {
-        var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index;
-        subscriber.subscribeToProjection(result, value, index);
-    };
-    ExpandSubscriber.prototype._next = function (value) {
-        var destination = this.destination;
-        if (destination.closed) {
-            this._complete();
-            return;
+//#endif
+        //Tracev((stderr, "inflate:       table sizes ok\n"));
+        state.have = 0;
+        state.mode = LENLENS;
+        /* falls through */
+      case LENLENS:
+        while (state.have < state.ncode) {
+          //=== NEEDBITS(3);
+          while (bits < 3) {
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+          }
+          //===//
+          state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
+          //--- DROPBITS(3) ---//
+          hold >>>= 3;
+          bits -= 3;
+          //---//
+        }
+        while (state.have < 19) {
+          state.lens[order[state.have++]] = 0;
+        }
+        // We have separate tables & no pointers. 2 commented lines below not needed.
+        //state.next = state.codes;
+        //state.lencode = state.next;
+        // Switch to use dynamic table
+        state.lencode = state.lendyn;
+        state.lenbits = 7;
+
+        opts = { bits: state.lenbits };
+        ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
+        state.lenbits = opts.bits;
+
+        if (ret) {
+          strm.msg = 'invalid code lengths set';
+          state.mode = BAD;
+          break;
         }
-        var index = this.index++;
-        if (this.active < this.concurrent) {
-            destination.next(value);
-            var result = tryCatch_1.tryCatch(this.project)(value, index);
-            if (result === errorObject_1.errorObject) {
-                destination.error(errorObject_1.errorObject.e);
-            }
-            else if (!this.scheduler) {
-                this.subscribeToProjection(result, value, index);
+        //Tracev((stderr, "inflate:       code lengths ok\n"));
+        state.have = 0;
+        state.mode = CODELENS;
+        /* falls through */
+      case CODELENS:
+        while (state.have < state.nlen + state.ndist) {
+          for (;;) {
+            here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
+            here_bits = here >>> 24;
+            here_op = (here >>> 16) & 0xff;
+            here_val = here & 0xffff;
+
+            if ((here_bits) <= bits) { break; }
+            //--- PULLBYTE() ---//
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+            //---//
+          }
+          if (here_val < 16) {
+            //--- DROPBITS(here.bits) ---//
+            hold >>>= here_bits;
+            bits -= here_bits;
+            //---//
+            state.lens[state.have++] = here_val;
+          }
+          else {
+            if (here_val === 16) {
+              //=== NEEDBITS(here.bits + 2);
+              n = here_bits + 2;
+              while (bits < n) {
+                if (have === 0) { break inf_leave; }
+                have--;
+                hold += input[next++] << bits;
+                bits += 8;
+              }
+              //===//
+              //--- DROPBITS(here.bits) ---//
+              hold >>>= here_bits;
+              bits -= here_bits;
+              //---//
+              if (state.have === 0) {
+                strm.msg = 'invalid bit length repeat';
+                state.mode = BAD;
+                break;
+              }
+              len = state.lens[state.have - 1];
+              copy = 3 + (hold & 0x03);//BITS(2);
+              //--- DROPBITS(2) ---//
+              hold >>>= 2;
+              bits -= 2;
+              //---//
+            }
+            else if (here_val === 17) {
+              //=== NEEDBITS(here.bits + 3);
+              n = here_bits + 3;
+              while (bits < n) {
+                if (have === 0) { break inf_leave; }
+                have--;
+                hold += input[next++] << bits;
+                bits += 8;
+              }
+              //===//
+              //--- DROPBITS(here.bits) ---//
+              hold >>>= here_bits;
+              bits -= here_bits;
+              //---//
+              len = 0;
+              copy = 3 + (hold & 0x07);//BITS(3);
+              //--- DROPBITS(3) ---//
+              hold >>>= 3;
+              bits -= 3;
+              //---//
             }
             else {
-                var state = { subscriber: this, result: result, value: value, index: index };
-                this.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));
+              //=== NEEDBITS(here.bits + 7);
+              n = here_bits + 7;
+              while (bits < n) {
+                if (have === 0) { break inf_leave; }
+                have--;
+                hold += input[next++] << bits;
+                bits += 8;
+              }
+              //===//
+              //--- DROPBITS(here.bits) ---//
+              hold >>>= here_bits;
+              bits -= here_bits;
+              //---//
+              len = 0;
+              copy = 11 + (hold & 0x7f);//BITS(7);
+              //--- DROPBITS(7) ---//
+              hold >>>= 7;
+              bits -= 7;
+              //---//
+            }
+            if (state.have + copy > state.nlen + state.ndist) {
+              strm.msg = 'invalid bit length repeat';
+              state.mode = BAD;
+              break;
+            }
+            while (copy--) {
+              state.lens[state.have++] = len;
             }
+          }
         }
-        else {
-            this.buffer.push(value);
-        }
-    };
-    ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) {
-        this.active++;
-        this.add(subscribeToResult_1.subscribeToResult(this, result, value, index));
-    };
-    ExpandSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.hasCompleted && this.active === 0) {
-            this.destination.complete();
-        }
-    };
-    ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this._next(innerValue);
-    };
-    ExpandSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        this.remove(innerSub);
-        this.active--;
-        if (buffer && buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        if (this.hasCompleted && this.active === 0) {
-            this.destination.complete();
-        }
-    };
-    return ExpandSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.ExpandSubscriber = ExpandSubscriber;
 
-},{"../OuterSubscriber":31,"../util/errorObject":163,"../util/subscribeToResult":173,"../util/tryCatch":175}],120:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/* tslint:enable:max-line-length */
-/**
- * Filter items emitted by the source Observable by only emitting those that
- * satisfy a specified predicate.
- *
- * <span class="informal">Like
- * [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter),
- * it only emits a value from the source if it passes a criterion function.</span>
- *
- * <img src="./img/filter.png" width="100%">
- *
- * Similar to the well-known `Array.prototype.filter` method, this operator
- * takes values from the source Observable, passes them through a `predicate`
- * function and only emits those values that yielded `true`.
- *
- * @example <caption>Emit only click events whose target was a DIV element</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var clicksOnDivs = clicks.filter(ev => ev.target.tagName === 'DIV');
- * clicksOnDivs.subscribe(x => console.log(x));
- *
- * @see {@link distinct}
- * @see {@link distinctUntilChanged}
- * @see {@link distinctUntilKeyChanged}
- * @see {@link ignoreElements}
- * @see {@link partition}
- * @see {@link skip}
- *
- * @param {function(value: T, index: number): boolean} predicate A function that
- * evaluates each value emitted by the source Observable. If it returns `true`,
- * the value is emitted, if `false` the value is not passed to the output
- * Observable. The `index` parameter is the number `i` for the i-th source
- * emission that has happened since the subscription, starting from the number
- * `0`.
- * @param {any} [thisArg] An optional argument to determine the value of `this`
- * in the `predicate` function.
- * @return {Observable} An Observable of values from the source that were
- * allowed by the `predicate` function.
- * @method filter
- * @owner Observable
- */
-function filter(predicate, thisArg) {
-    return this.lift(new FilterOperator(predicate, thisArg));
-}
-exports.filter = filter;
-var FilterOperator = (function () {
-    function FilterOperator(predicate, thisArg) {
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-    }
-    FilterOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));
-    };
-    return FilterOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var FilterSubscriber = (function (_super) {
-    __extends(FilterSubscriber, _super);
-    function FilterSubscriber(destination, predicate, thisArg) {
-        _super.call(this, destination);
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-        this.count = 0;
-        this.predicate = predicate;
-    }
-    // the try catch block below is left specifically for
-    // optimization and perf reasons. a tryCatcher is not necessary here.
-    FilterSubscriber.prototype._next = function (value) {
-        var result;
-        try {
-            result = this.predicate.call(this.thisArg, value, this.count++);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (result) {
-            this.destination.next(value);
+        /* handle error breaks in while */
+        if (state.mode === BAD) { break; }
+
+        /* check for end-of-block code (better have one) */
+        if (state.lens[256] === 0) {
+          strm.msg = 'invalid code -- missing end-of-block';
+          state.mode = BAD;
+          break;
         }
-    };
-    return FilterSubscriber;
-}(Subscriber_1.Subscriber));
 
-},{"../Subscriber":36}],121:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var Subscription_1 = require('../Subscription');
-/**
- * Returns an Observable that mirrors the source Observable, but will call a specified function when
- * the source terminates on complete or error.
- * @param {function} callback Function to be called when source terminates.
- * @return {Observable} An Observable that mirrors the source, but will call the specified function on termination.
- * @method finally
- * @owner Observable
- */
-function _finally(callback) {
-    return this.lift(new FinallyOperator(callback));
-}
-exports._finally = _finally;
-var FinallyOperator = (function () {
-    function FinallyOperator(callback) {
-        this.callback = callback;
-    }
-    FinallyOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new FinallySubscriber(subscriber, this.callback));
-    };
-    return FinallyOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var FinallySubscriber = (function (_super) {
-    __extends(FinallySubscriber, _super);
-    function FinallySubscriber(destination, callback) {
-        _super.call(this, destination);
-        this.add(new Subscription_1.Subscription(callback));
-    }
-    return FinallySubscriber;
-}(Subscriber_1.Subscriber));
+        /* build code tables -- note: do not change the lenbits or distbits
+           values here (9 and 6) without reading the comments in inftrees.h
+           concerning the ENOUGH constants, which depend on those values */
+        state.lenbits = 9;
 
-},{"../Subscriber":36,"../Subscription":37}],122:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var EmptyError_1 = require('../util/EmptyError');
-/**
- * Emits only the first value (or the first value that meets some condition)
- * emitted by the source Observable.
- *
- * <span class="informal">Emits only the first value. Or emits only the first
- * value that passes some test.</span>
- *
- * <img src="./img/first.png" width="100%">
- *
- * If called with no arguments, `first` emits the first value of the source
- * Observable, then completes. If called with a `predicate` function, `first`
- * emits the first value of the source that matches the specified condition. It
- * may also take a `resultSelector` function to produce the output value from
- * the input value, and a `defaultValue` to emit in case the source completes
- * before it is able to emit a valid value. Throws an error if `defaultValue`
- * was not provided and a matching element is not found.
- *
- * @example <caption>Emit only the first click that happens on the DOM</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = clicks.first();
- * result.subscribe(x => console.log(x));
- *
- * @example <caption>Emits the first click that happens on a DIV</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = clicks.first(ev => ev.target.tagName === 'DIV');
- * result.subscribe(x => console.log(x));
- *
- * @see {@link filter}
- * @see {@link find}
- * @see {@link take}
- *
- * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`
- * callback if the Observable completes before any `next` notification was sent.
- *
- * @param {function(value: T, index: number, source: Observable<T>): boolean} [predicate]
- * An optional function called with each item to test for condition matching.
- * @param {function(value: T, index: number): R} [resultSelector] A function to
- * produce the value on the output Observable based on the values
- * and the indices of the source Observable. The arguments passed to this
- * function are:
- * - `value`: the value that was emitted on the source.
- * - `index`: the "index" of the value from the source.
- * @param {R} [defaultValue] The default value emitted in case no valid value
- * was found on the source.
- * @return {Observable<T|R>} An Observable of the first item that matches the
- * condition.
- * @method first
- * @owner Observable
- */
-function first(predicate, resultSelector, defaultValue) {
-    return this.lift(new FirstOperator(predicate, resultSelector, defaultValue, this));
-}
-exports.first = first;
-var FirstOperator = (function () {
-    function FirstOperator(predicate, resultSelector, defaultValue, source) {
-        this.predicate = predicate;
-        this.resultSelector = resultSelector;
-        this.defaultValue = defaultValue;
-        this.source = source;
-    }
-    FirstOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new FirstSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source));
-    };
-    return FirstOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var FirstSubscriber = (function (_super) {
-    __extends(FirstSubscriber, _super);
-    function FirstSubscriber(destination, predicate, resultSelector, defaultValue, source) {
-        _super.call(this, destination);
-        this.predicate = predicate;
-        this.resultSelector = resultSelector;
-        this.defaultValue = defaultValue;
-        this.source = source;
-        this.index = 0;
-        this.hasCompleted = false;
-        this._emitted = false;
-    }
-    FirstSubscriber.prototype._next = function (value) {
-        var index = this.index++;
-        if (this.predicate) {
-            this._tryPredicate(value, index);
-        }
-        else {
-            this._emit(value, index);
+        opts = { bits: state.lenbits };
+        ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
+        // We have separate tables & no pointers. 2 commented lines below not needed.
+        // state.next_index = opts.table_index;
+        state.lenbits = opts.bits;
+        // state.lencode = state.next;
+
+        if (ret) {
+          strm.msg = 'invalid literal/lengths set';
+          state.mode = BAD;
+          break;
         }
-    };
-    FirstSubscriber.prototype._tryPredicate = function (value, index) {
-        var result;
-        try {
-            result = this.predicate(value, index, this.source);
+
+        state.distbits = 6;
+        //state.distcode.copy(state.codes);
+        // Switch to use dynamic table
+        state.distcode = state.distdyn;
+        opts = { bits: state.distbits };
+        ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
+        // We have separate tables & no pointers. 2 commented lines below not needed.
+        // state.next_index = opts.table_index;
+        state.distbits = opts.bits;
+        // state.distcode = state.next;
+
+        if (ret) {
+          strm.msg = 'invalid distances set';
+          state.mode = BAD;
+          break;
         }
-        catch (err) {
-            this.destination.error(err);
-            return;
+        //Tracev((stderr, 'inflate:       codes ok\n'));
+        state.mode = LEN_;
+        if (flush === Z_TREES) { break inf_leave; }
+        /* falls through */
+      case LEN_:
+        state.mode = LEN;
+        /* falls through */
+      case LEN:
+        if (have >= 6 && left >= 258) {
+          //--- RESTORE() ---
+          strm.next_out = put;
+          strm.avail_out = left;
+          strm.next_in = next;
+          strm.avail_in = have;
+          state.hold = hold;
+          state.bits = bits;
+          //---
+          inflate_fast(strm, _out);
+          //--- LOAD() ---
+          put = strm.next_out;
+          output = strm.output;
+          left = strm.avail_out;
+          next = strm.next_in;
+          input = strm.input;
+          have = strm.avail_in;
+          hold = state.hold;
+          bits = state.bits;
+          //---
+
+          if (state.mode === TYPE) {
+            state.back = -1;
+          }
+          break;
         }
-        if (result) {
-            this._emit(value, index);
+        state.back = 0;
+        for (;;) {
+          here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/
+          here_bits = here >>> 24;
+          here_op = (here >>> 16) & 0xff;
+          here_val = here & 0xffff;
+
+          if (here_bits <= bits) { break; }
+          //--- PULLBYTE() ---//
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+          //---//
+        }
+        if (here_op && (here_op & 0xf0) === 0) {
+          last_bits = here_bits;
+          last_op = here_op;
+          last_val = here_val;
+          for (;;) {
+            here = state.lencode[last_val +
+                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
+            here_bits = here >>> 24;
+            here_op = (here >>> 16) & 0xff;
+            here_val = here & 0xffff;
+
+            if ((last_bits + here_bits) <= bits) { break; }
+            //--- PULLBYTE() ---//
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+            //---//
+          }
+          //--- DROPBITS(last.bits) ---//
+          hold >>>= last_bits;
+          bits -= last_bits;
+          //---//
+          state.back += last_bits;
+        }
+        //--- DROPBITS(here.bits) ---//
+        hold >>>= here_bits;
+        bits -= here_bits;
+        //---//
+        state.back += here_bits;
+        state.length = here_val;
+        if (here_op === 0) {
+          //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+          //        "inflate:         literal '%c'\n" :
+          //        "inflate:         literal 0x%02x\n", here.val));
+          state.mode = LIT;
+          break;
         }
-    };
-    FirstSubscriber.prototype._emit = function (value, index) {
-        if (this.resultSelector) {
-            this._tryResultSelector(value, index);
-            return;
+        if (here_op & 32) {
+          //Tracevv((stderr, "inflate:         end of block\n"));
+          state.back = -1;
+          state.mode = TYPE;
+          break;
         }
-        this._emitFinal(value);
-    };
-    FirstSubscriber.prototype._tryResultSelector = function (value, index) {
-        var result;
-        try {
-            result = this.resultSelector(value, index);
+        if (here_op & 64) {
+          strm.msg = 'invalid literal/length code';
+          state.mode = BAD;
+          break;
         }
-        catch (err) {
-            this.destination.error(err);
-            return;
+        state.extra = here_op & 15;
+        state.mode = LENEXT;
+        /* falls through */
+      case LENEXT:
+        if (state.extra) {
+          //=== NEEDBITS(state.extra);
+          n = state.extra;
+          while (bits < n) {
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+          }
+          //===//
+          state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
+          //--- DROPBITS(state.extra) ---//
+          hold >>>= state.extra;
+          bits -= state.extra;
+          //---//
+          state.back += state.extra;
+        }
+        //Tracevv((stderr, "inflate:         length %u\n", state.length));
+        state.was = state.length;
+        state.mode = DIST;
+        /* falls through */
+      case DIST:
+        for (;;) {
+          here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/
+          here_bits = here >>> 24;
+          here_op = (here >>> 16) & 0xff;
+          here_val = here & 0xffff;
+
+          if ((here_bits) <= bits) { break; }
+          //--- PULLBYTE() ---//
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+          //---//
+        }
+        if ((here_op & 0xf0) === 0) {
+          last_bits = here_bits;
+          last_op = here_op;
+          last_val = here_val;
+          for (;;) {
+            here = state.distcode[last_val +
+                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
+            here_bits = here >>> 24;
+            here_op = (here >>> 16) & 0xff;
+            here_val = here & 0xffff;
+
+            if ((last_bits + here_bits) <= bits) { break; }
+            //--- PULLBYTE() ---//
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+            //---//
+          }
+          //--- DROPBITS(last.bits) ---//
+          hold >>>= last_bits;
+          bits -= last_bits;
+          //---//
+          state.back += last_bits;
+        }
+        //--- DROPBITS(here.bits) ---//
+        hold >>>= here_bits;
+        bits -= here_bits;
+        //---//
+        state.back += here_bits;
+        if (here_op & 64) {
+          strm.msg = 'invalid distance code';
+          state.mode = BAD;
+          break;
         }
-        this._emitFinal(result);
-    };
-    FirstSubscriber.prototype._emitFinal = function (value) {
-        var destination = this.destination;
-        if (!this._emitted) {
-            this._emitted = true;
-            destination.next(value);
-            destination.complete();
-            this.hasCompleted = true;
+        state.offset = here_val;
+        state.extra = (here_op) & 15;
+        state.mode = DISTEXT;
+        /* falls through */
+      case DISTEXT:
+        if (state.extra) {
+          //=== NEEDBITS(state.extra);
+          n = state.extra;
+          while (bits < n) {
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+          }
+          //===//
+          state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
+          //--- DROPBITS(state.extra) ---//
+          hold >>>= state.extra;
+          bits -= state.extra;
+          //---//
+          state.back += state.extra;
+        }
+//#ifdef INFLATE_STRICT
+        if (state.offset > state.dmax) {
+          strm.msg = 'invalid distance too far back';
+          state.mode = BAD;
+          break;
         }
-    };
-    FirstSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        if (!this.hasCompleted && typeof this.defaultValue !== 'undefined') {
-            destination.next(this.defaultValue);
-            destination.complete();
+//#endif
+        //Tracevv((stderr, "inflate:         distance %u\n", state.offset));
+        state.mode = MATCH;
+        /* falls through */
+      case MATCH:
+        if (left === 0) { break inf_leave; }
+        copy = _out - left;
+        if (state.offset > copy) {         /* copy from window */
+          copy = state.offset - copy;
+          if (copy > state.whave) {
+            if (state.sane) {
+              strm.msg = 'invalid distance too far back';
+              state.mode = BAD;
+              break;
+            }
+// (!) This block is disabled in zlib defaults,
+// don't enable it for binary compatibility
+//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+//          Trace((stderr, "inflate.c too far\n"));
+//          copy -= state.whave;
+//          if (copy > state.length) { copy = state.length; }
+//          if (copy > left) { copy = left; }
+//          left -= copy;
+//          state.length -= copy;
+//          do {
+//            output[put++] = 0;
+//          } while (--copy);
+//          if (state.length === 0) { state.mode = LEN; }
+//          break;
+//#endif
+          }
+          if (copy > state.wnext) {
+            copy -= state.wnext;
+            from = state.wsize - copy;
+          }
+          else {
+            from = state.wnext - copy;
+          }
+          if (copy > state.length) { copy = state.length; }
+          from_source = state.window;
         }
-        else if (!this.hasCompleted) {
-            destination.error(new EmptyError_1.EmptyError);
+        else {                              /* copy from output */
+          from_source = output;
+          from = put - state.offset;
+          copy = state.length;
         }
-    };
-    return FirstSubscriber;
-}(Subscriber_1.Subscriber));
+        if (copy > left) { copy = left; }
+        left -= copy;
+        state.length -= copy;
+        do {
+          output[put++] = from_source[from++];
+        } while (--copy);
+        if (state.length === 0) { state.mode = LEN; }
+        break;
+      case LIT:
+        if (left === 0) { break inf_leave; }
+        output[put++] = state.length;
+        left--;
+        state.mode = LEN;
+        break;
+      case CHECK:
+        if (state.wrap) {
+          //=== NEEDBITS(32);
+          while (bits < 32) {
+            if (have === 0) { break inf_leave; }
+            have--;
+            // Use '|' instead of '+' to make sure that result is signed
+            hold |= input[next++] << bits;
+            bits += 8;
+          }
+          //===//
+          _out -= left;
+          strm.total_out += _out;
+          state.total += _out;
+          if (_out) {
+            strm.adler = state.check =
+                /*UPDATE(state.check, put - _out, _out);*/
+                (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));
 
-},{"../Subscriber":36,"../util/EmptyError":159}],123:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var EmptyError_1 = require('../util/EmptyError');
-/* tslint:enable:max-line-length */
-/**
- * Returns an Observable that emits only the last item emitted by the source Observable.
- * It optionally takes a predicate function as a parameter, in which case, rather than emitting
- * the last item from the source Observable, the resulting Observable will emit the last item
- * from the source Observable that satisfies the predicate.
- *
- * <img src="./img/last.png" width="100%">
- *
- * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`
- * callback if the Observable completes before any `next` notification was sent.
- * @param {function} predicate - The condition any source emitted item has to satisfy.
- * @return {Observable} An Observable that emits only the last item satisfying the given condition
- * from the source, or an NoSuchElementException if no such items are emitted.
- * @throws - Throws if no items that match the predicate are emitted by the source Observable.
- * @method last
- * @owner Observable
- */
-function last(predicate, resultSelector, defaultValue) {
-    return this.lift(new LastOperator(predicate, resultSelector, defaultValue, this));
-}
-exports.last = last;
-var LastOperator = (function () {
-    function LastOperator(predicate, resultSelector, defaultValue, source) {
-        this.predicate = predicate;
-        this.resultSelector = resultSelector;
-        this.defaultValue = defaultValue;
-        this.source = source;
+          }
+          _out = left;
+          // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too
+          if ((state.flags ? hold : zswap32(hold)) !== state.check) {
+            strm.msg = 'incorrect data check';
+            state.mode = BAD;
+            break;
+          }
+          //=== INITBITS();
+          hold = 0;
+          bits = 0;
+          //===//
+          //Tracev((stderr, "inflate:   check matches trailer\n"));
+        }
+        state.mode = LENGTH;
+        /* falls through */
+      case LENGTH:
+        if (state.wrap && state.flags) {
+          //=== NEEDBITS(32);
+          while (bits < 32) {
+            if (have === 0) { break inf_leave; }
+            have--;
+            hold += input[next++] << bits;
+            bits += 8;
+          }
+          //===//
+          if (hold !== (state.total & 0xffffffff)) {
+            strm.msg = 'incorrect length check';
+            state.mode = BAD;
+            break;
+          }
+          //=== INITBITS();
+          hold = 0;
+          bits = 0;
+          //===//
+          //Tracev((stderr, "inflate:   length matches trailer\n"));
+        }
+        state.mode = DONE;
+        /* falls through */
+      case DONE:
+        ret = Z_STREAM_END;
+        break inf_leave;
+      case BAD:
+        ret = Z_DATA_ERROR;
+        break inf_leave;
+      case MEM:
+        return Z_MEM_ERROR;
+      case SYNC:
+        /* falls through */
+      default:
+        return Z_STREAM_ERROR;
     }
-    LastOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new LastSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source));
-    };
-    return LastOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var LastSubscriber = (function (_super) {
-    __extends(LastSubscriber, _super);
-    function LastSubscriber(destination, predicate, resultSelector, defaultValue, source) {
-        _super.call(this, destination);
-        this.predicate = predicate;
-        this.resultSelector = resultSelector;
-        this.defaultValue = defaultValue;
-        this.source = source;
-        this.hasValue = false;
-        this.index = 0;
-        if (typeof defaultValue !== 'undefined') {
-            this.lastValue = defaultValue;
-            this.hasValue = true;
-        }
+  }
+
+  // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
+
+  /*
+     Return from inflate(), updating the total counts and the check value.
+     If there was no progress during the inflate() call, return a buffer
+     error.  Call updatewindow() to create and/or update the window state.
+     Note: a memory error from inflate() is non-recoverable.
+   */
+
+  //--- RESTORE() ---
+  strm.next_out = put;
+  strm.avail_out = left;
+  strm.next_in = next;
+  strm.avail_in = have;
+  state.hold = hold;
+  state.bits = bits;
+  //---
+
+  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&
+                      (state.mode < CHECK || flush !== Z_FINISH))) {
+    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
+      state.mode = MEM;
+      return Z_MEM_ERROR;
     }
-    LastSubscriber.prototype._next = function (value) {
-        var index = this.index++;
-        if (this.predicate) {
-            this._tryPredicate(value, index);
-        }
-        else {
-            if (this.resultSelector) {
-                this._tryResultSelector(value, index);
-                return;
-            }
-            this.lastValue = value;
-            this.hasValue = true;
-        }
-    };
-    LastSubscriber.prototype._tryPredicate = function (value, index) {
-        var result;
-        try {
-            result = this.predicate(value, index, this.source);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (result) {
-            if (this.resultSelector) {
-                this._tryResultSelector(value, index);
-                return;
-            }
-            this.lastValue = value;
-            this.hasValue = true;
-        }
-    };
-    LastSubscriber.prototype._tryResultSelector = function (value, index) {
-        var result;
-        try {
-            result = this.resultSelector(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.lastValue = result;
-        this.hasValue = true;
-    };
-    LastSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        if (this.hasValue) {
-            destination.next(this.lastValue);
-            destination.complete();
-        }
-        else {
-            destination.error(new EmptyError_1.EmptyError);
-        }
-    };
-    return LastSubscriber;
-}(Subscriber_1.Subscriber));
+  }
+  _in -= strm.avail_in;
+  _out -= strm.avail_out;
+  strm.total_in += _in;
+  strm.total_out += _out;
+  state.total += _out;
+  if (state.wrap && _out) {
+    strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
+      (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
+  }
+  strm.data_type = state.bits + (state.last ? 64 : 0) +
+                    (state.mode === TYPE ? 128 : 0) +
+                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
+  if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {
+    ret = Z_BUF_ERROR;
+  }
+  return ret;
+}
 
-},{"../Subscriber":36,"../util/EmptyError":159}],124:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/**
- * Applies a given `project` function to each value emitted by the source
- * Observable, and emits the resulting values as an Observable.
- *
- * <span class="informal">Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),
- * it passes each source value through a transformation function to get
- * corresponding output values.</span>
- *
- * <img src="./img/map.png" width="100%">
- *
- * Similar to the well known `Array.prototype.map` function, this operator
- * applies a projection to each value and emits that projection in the output
- * Observable.
- *
- * @example <caption>Map every click to the clientX position of that click</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var positions = clicks.map(ev => ev.clientX);
- * positions.subscribe(x => console.log(x));
- *
- * @see {@link mapTo}
- * @see {@link pluck}
- *
- * @param {function(value: T, index: number): R} project The function to apply
- * to each `value` emitted by the source Observable. The `index` parameter is
- * the number `i` for the i-th emission that has happened since the
- * subscription, starting from the number `0`.
- * @param {any} [thisArg] An optional argument to define what `this` is in the
- * `project` function.
- * @return {Observable<R>} An Observable that emits the values from the source
- * Observable transformed by the given `project` function.
- * @method map
- * @owner Observable
- */
-function map(project, thisArg) {
-    if (typeof project !== 'function') {
-        throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
-    }
-    return this.lift(new MapOperator(project, thisArg));
+function inflateEnd(strm) {
+
+  if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
+    return Z_STREAM_ERROR;
+  }
+
+  var state = strm.state;
+  if (state.window) {
+    state.window = null;
+  }
+  strm.state = null;
+  return Z_OK;
 }
-exports.map = map;
-var MapOperator = (function () {
-    function MapOperator(project, thisArg) {
-        this.project = project;
-        this.thisArg = thisArg;
-    }
-    MapOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));
-    };
-    return MapOperator;
-}());
-exports.MapOperator = MapOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var MapSubscriber = (function (_super) {
-    __extends(MapSubscriber, _super);
-    function MapSubscriber(destination, project, thisArg) {
-        _super.call(this, destination);
-        this.project = project;
-        this.count = 0;
-        this.thisArg = thisArg || this;
+
+function inflateGetHeader(strm, head) {
+  var state;
+
+  /* check state */
+  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
+  state = strm.state;
+  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }
+
+  /* save header structure */
+  state.head = head;
+  head.done = false;
+  return Z_OK;
+}
+
+function inflateSetDictionary(strm, dictionary) {
+  var dictLength = dictionary.length;
+
+  var state;
+  var dictid;
+  var ret;
+
+  /* check state */
+  if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }
+  state = strm.state;
+
+  if (state.wrap !== 0 && state.mode !== DICT) {
+    return Z_STREAM_ERROR;
+  }
+
+  /* check for correct dictionary identifier */
+  if (state.mode === DICT) {
+    dictid = 1; /* adler32(0, null, 0)*/
+    /* dictid = adler32(dictid, dictionary, dictLength); */
+    dictid = adler32(dictid, dictionary, dictLength, 0);
+    if (dictid !== state.check) {
+      return Z_DATA_ERROR;
     }
-    // NOTE: This looks unoptimized, but it's actually purposefully NOT
-    // using try/catch optimizations.
-    MapSubscriber.prototype._next = function (value) {
-        var result;
-        try {
-            result = this.project.call(this.thisArg, value, this.count++);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return MapSubscriber;
-}(Subscriber_1.Subscriber));
+  }
+  /* copy dictionary to window using updatewindow(), which will amend the
+   existing dictionary if appropriate */
+  ret = updatewindow(strm, dictionary, dictLength, dictLength);
+  if (ret) {
+    state.mode = MEM;
+    return Z_MEM_ERROR;
+  }
+  state.havedict = 1;
+  // Tracev((stderr, "inflate:   dictionary set\n"));
+  return Z_OK;
+}
+
+exports.inflateReset = inflateReset;
+exports.inflateReset2 = inflateReset2;
+exports.inflateResetKeep = inflateResetKeep;
+exports.inflateInit = inflateInit;
+exports.inflateInit2 = inflateInit2;
+exports.inflate = inflate;
+exports.inflateEnd = inflateEnd;
+exports.inflateGetHeader = inflateGetHeader;
+exports.inflateSetDictionary = inflateSetDictionary;
+exports.inflateInfo = 'pako inflate (from Nodeca project)';
+
+/* Not implemented
+exports.inflateCopy = inflateCopy;
+exports.inflateGetDictionary = inflateGetDictionary;
+exports.inflateMark = inflateMark;
+exports.inflatePrime = inflatePrime;
+exports.inflateSync = inflateSync;
+exports.inflateSyncPoint = inflateSyncPoint;
+exports.inflateUndermine = inflateUndermine;
+*/
+
+},{"../utils/common":26,"./adler32":28,"./crc32":30,"./inffast":33,"./inftrees":35}],35:[function(require,module,exports){
+'use strict';
 
-},{"../Subscriber":36}],125:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../Observable');
-var ArrayObservable_1 = require('../observable/ArrayObservable');
-var mergeAll_1 = require('./mergeAll');
-var isScheduler_1 = require('../util/isScheduler');
-/* tslint:enable:max-line-length */
-/**
- * Creates an output Observable which concurrently emits all values from every
- * given input Observable.
- *
- * <span class="informal">Flattens multiple Observables together by blending
- * their values into one Observable.</span>
- *
- * <img src="./img/merge.png" width="100%">
- *
- * `merge` subscribes to each given input Observable (either the source or an
- * Observable given as argument), and simply forwards (without doing any
- * transformation) all the values from all the input Observables to the output
- * Observable. The output Observable only completes once all input Observables
- * have completed. Any error delivered by an input Observable will be immediately
- * emitted on the output Observable.
- *
- * @example <caption>Merge together two Observables: 1s interval and clicks</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var timer = Rx.Observable.interval(1000);
- * var clicksOrTimer = clicks.merge(timer);
- * clicksOrTimer.subscribe(x => console.log(x));
- *
- * @example <caption>Merge together 3 Observables, but only 2 run concurrently</caption>
- * var timer1 = Rx.Observable.interval(1000).take(10);
- * var timer2 = Rx.Observable.interval(2000).take(6);
- * var timer3 = Rx.Observable.interval(500).take(10);
- * var concurrent = 2; // the argument
- * var merged = timer1.merge(timer2, timer3, concurrent);
- * merged.subscribe(x => console.log(x));
- *
- * @see {@link mergeAll}
- * @see {@link mergeMap}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- *
- * @param {ObservableInput} other An input Observable to merge with the source
- * Observable. More than one input Observables may be given as argument.
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @param {Scheduler} [scheduler=null] The IScheduler to use for managing
- * concurrency of input Observables.
- * @return {Observable} An Observable that emits items that are the result of
- * every input Observable.
- * @method merge
- * @owner Observable
- */
-function merge() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+var utils = require('../utils/common');
+
+var MAXBITS = 15;
+var ENOUGH_LENS = 852;
+var ENOUGH_DISTS = 592;
+//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
+
+var CODES = 0;
+var LENS = 1;
+var DISTS = 2;
+
+var lbase = [ /* Length codes 257..285 base */
+  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
+];
+
+var lext = [ /* Length codes 257..285 extra */
+  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
+  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
+];
+
+var dbase = [ /* Distance codes 0..29 base */
+  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
+  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
+  8193, 12289, 16385, 24577, 0, 0
+];
+
+var dext = [ /* Distance codes 0..29 extra */
+  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
+  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
+  28, 28, 29, 29, 64, 64
+];
+
+module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)
+{
+  var bits = opts.bits;
+      //here = opts.here; /* table entry for duplication */
+
+  var len = 0;               /* a code's length in bits */
+  var sym = 0;               /* index of code symbols */
+  var min = 0, max = 0;          /* minimum and maximum code lengths */
+  var root = 0;              /* number of index bits for root table */
+  var curr = 0;              /* number of index bits for current table */
+  var drop = 0;              /* code bits to drop for sub-table */
+  var left = 0;                   /* number of prefix codes available */
+  var used = 0;              /* code entries in table used */
+  var huff = 0;              /* Huffman code */
+  var incr;              /* for incrementing code, index */
+  var fill;              /* index for replicating entries */
+  var low;               /* low bits for current root entry */
+  var mask;              /* mask for low root bits */
+  var next;             /* next available space in table */
+  var base = null;     /* base value table to use */
+  var base_index = 0;
+//  var shoextra;    /* extra bits table to use */
+  var end;                    /* use base and extra for symbol > end */
+  var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */
+  var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */
+  var extra = null;
+  var extra_index = 0;
+
+  var here_bits, here_op, here_val;
+
+  /*
+   Process a set of code lengths to create a canonical Huffman code.  The
+   code lengths are lens[0..codes-1].  Each length corresponds to the
+   symbols 0..codes-1.  The Huffman code is generated by first sorting the
+   symbols by length from short to long, and retaining the symbol order
+   for codes with equal lengths.  Then the code starts with all zero bits
+   for the first code of the shortest length, and the codes are integer
+   increments for the same length, and zeros are appended as the length
+   increases.  For the deflate format, these bits are stored backwards
+   from their more natural integer increment ordering, and so when the
+   decoding tables are built in the large loop below, the integer codes
+   are incremented backwards.
+
+   This routine assumes, but does not check, that all of the entries in
+   lens[] are in the range 0..MAXBITS.  The caller must assure this.
+   1..MAXBITS is interpreted as that code length.  zero means that that
+   symbol does not occur in this code.
+
+   The codes are sorted by computing a count of codes for each length,
+   creating from that a table of starting indices for each length in the
+   sorted table, and then entering the symbols in order in the sorted
+   table.  The sorted table is work[], with that space being provided by
+   the caller.
+
+   The length counts are used for other purposes as well, i.e. finding
+   the minimum and maximum length codes, determining if there are any
+   codes at all, checking for a valid set of lengths, and looking ahead
+   at length counts to determine sub-table sizes when building the
+   decoding tables.
+   */
+
+  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
+  for (len = 0; len <= MAXBITS; len++) {
+    count[len] = 0;
+  }
+  for (sym = 0; sym < codes; sym++) {
+    count[lens[lens_index + sym]]++;
+  }
+
+  /* bound code lengths, force root to be within code lengths */
+  root = bits;
+  for (max = MAXBITS; max >= 1; max--) {
+    if (count[max] !== 0) { break; }
+  }
+  if (root > max) {
+    root = max;
+  }
+  if (max === 0) {                     /* no symbols to code at all */
+    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */
+    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;
+    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;
+    table[table_index++] = (1 << 24) | (64 << 16) | 0;
+
+
+    //table.op[opts.table_index] = 64;
+    //table.bits[opts.table_index] = 1;
+    //table.val[opts.table_index++] = 0;
+    table[table_index++] = (1 << 24) | (64 << 16) | 0;
+
+    opts.bits = 1;
+    return 0;     /* no symbols, but wait for decoding to report error */
+  }
+  for (min = 1; min < max; min++) {
+    if (count[min] !== 0) { break; }
+  }
+  if (root < min) {
+    root = min;
+  }
+
+  /* check for an over-subscribed or incomplete set of lengths */
+  left = 1;
+  for (len = 1; len <= MAXBITS; len++) {
+    left <<= 1;
+    left -= count[len];
+    if (left < 0) {
+      return -1;
+    }        /* over-subscribed */
+  }
+  if (left > 0 && (type === CODES || max !== 1)) {
+    return -1;                      /* incomplete set */
+  }
+
+  /* generate offsets into symbol table for each length for sorting */
+  offs[1] = 0;
+  for (len = 1; len < MAXBITS; len++) {
+    offs[len + 1] = offs[len] + count[len];
+  }
+
+  /* sort symbols by length, by symbol order within each length */
+  for (sym = 0; sym < codes; sym++) {
+    if (lens[lens_index + sym] !== 0) {
+      work[offs[lens[lens_index + sym]]++] = sym;
     }
-    return this.lift.call(mergeStatic.apply(void 0, [this].concat(observables)));
-}
-exports.merge = merge;
-/* tslint:enable:max-line-length */
-/**
- * Creates an output Observable which concurrently emits all values from every
- * given input Observable.
- *
- * <span class="informal">Flattens multiple Observables together by blending
- * their values into one Observable.</span>
- *
- * <img src="./img/merge.png" width="100%">
- *
- * `merge` subscribes to each given input Observable (as arguments), and simply
- * forwards (without doing any transformation) all the values from all the input
- * Observables to the output Observable. The output Observable only completes
- * once all input Observables have completed. Any error delivered by an input
- * Observable will be immediately emitted on the output Observable.
- *
- * @example <caption>Merge together two Observables: 1s interval and clicks</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var timer = Rx.Observable.interval(1000);
- * var clicksOrTimer = Rx.Observable.merge(clicks, timer);
- * clicksOrTimer.subscribe(x => console.log(x));
- *
- * // Results in the following:
- * // timer will emit ascending values, one every second(1000ms) to console
- * // clicks logs MouseEvents to console everytime the "document" is clicked
- * // Since the two streams are merged you see these happening
- * // as they occur.
- *
- * @example <caption>Merge together 3 Observables, but only 2 run concurrently</caption>
- * var timer1 = Rx.Observable.interval(1000).take(10);
- * var timer2 = Rx.Observable.interval(2000).take(6);
- * var timer3 = Rx.Observable.interval(500).take(10);
- * var concurrent = 2; // the argument
- * var merged = Rx.Observable.merge(timer1, timer2, timer3, concurrent);
- * merged.subscribe(x => console.log(x));
- *
- * // Results in the following:
- * // - First timer1 and timer2 will run concurrently
- * // - timer1 will emit a value every 1000ms for 10 iterations
- * // - timer2 will emit a value every 2000ms for 6 iterations
- * // - after timer1 hits it's max iteration, timer2 will
- * //   continue, and timer3 will start to run concurrently with timer2
- * // - when timer2 hits it's max iteration it terminates, and
- * //   timer3 will continue to emit a value every 500ms until it is complete
- *
- * @see {@link mergeAll}
- * @see {@link mergeMap}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- *
- * @param {...ObservableInput} observables Input Observables to merge together.
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @param {Scheduler} [scheduler=null] The IScheduler to use for managing
- * concurrency of input Observables.
- * @return {Observable} an Observable that emits items that are the result of
- * every input Observable.
- * @static true
- * @name merge
- * @owner Observable
- */
-function mergeStatic() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
+  }
+
+  /*
+   Create and fill in decoding tables.  In this loop, the table being
+   filled is at next and has curr index bits.  The code being used is huff
+   with length len.  That code is converted to an index by dropping drop
+   bits off of the bottom.  For codes where len is less than drop + curr,
+   those top drop + curr - len bits are incremented through all values to
+   fill the table with replicated entries.
+
+   root is the number of index bits for the root table.  When len exceeds
+   root, sub-tables are created pointed to by the root entry with an index
+   of the low root bits of huff.  This is saved in low to check for when a
+   new sub-table should be started.  drop is zero when the root table is
+   being filled, and drop is root when sub-tables are being filled.
+
+   When a new sub-table is needed, it is necessary to look ahead in the
+   code lengths to determine what size sub-table is needed.  The length
+   counts are used for this, and so count[] is decremented as codes are
+   entered in the tables.
+
+   used keeps track of how many table entries have been allocated from the
+   provided *table space.  It is checked for LENS and DIST tables against
+   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
+   the initial root table size constants.  See the comments in inftrees.h
+   for more information.
+
+   sym increments through all symbols, and the loop terminates when
+   all codes of length max, i.e. all codes, have been processed.  This
+   routine permits incomplete codes, so another loop after this one fills
+   in the rest of the decoding tables with invalid code markers.
+   */
+
+  /* set up for code type */
+  // poor man optimization - use if-else instead of switch,
+  // to avoid deopts in old v8
+  if (type === CODES) {
+    base = extra = work;    /* dummy value--not used */
+    end = 19;
+
+  } else if (type === LENS) {
+    base = lbase;
+    base_index -= 257;
+    extra = lext;
+    extra_index -= 257;
+    end = 256;
+
+  } else {                    /* DISTS */
+    base = dbase;
+    extra = dext;
+    end = -1;
+  }
+
+  /* initialize opts for loop */
+  huff = 0;                   /* starting code */
+  sym = 0;                    /* starting code symbol */
+  len = min;                  /* starting code length */
+  next = table_index;              /* current table to fill in */
+  curr = root;                /* current table index bits */
+  drop = 0;                   /* current bits to drop from code for index */
+  low = -1;                   /* trigger new sub-table when len > root */
+  used = 1 << root;          /* use root table entries */
+  mask = used - 1;            /* mask for comparing low */
+
+  /* check available table space */
+  if ((type === LENS && used > ENOUGH_LENS) ||
+    (type === DISTS && used > ENOUGH_DISTS)) {
+    return 1;
+  }
+
+  /* process all codes and make table entries */
+  for (;;) {
+    /* create table entry */
+    here_bits = len - drop;
+    if (work[sym] < end) {
+      here_op = 0;
+      here_val = work[sym];
     }
-    var concurrent = Number.POSITIVE_INFINITY;
-    var scheduler = null;
-    var last = observables[observables.length - 1];
-    if (isScheduler_1.isScheduler(last)) {
-        scheduler = observables.pop();
-        if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {
-            concurrent = observables.pop();
-        }
+    else if (work[sym] > end) {
+      here_op = extra[extra_index + work[sym]];
+      here_val = base[base_index + work[sym]];
     }
-    else if (typeof last === 'number') {
-        concurrent = observables.pop();
+    else {
+      here_op = 32 + 64;         /* end of block */
+      here_val = 0;
     }
-    if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) {
-        return observables[0];
+
+    /* replicate for those indices with low len bits equal to huff */
+    incr = 1 << (len - drop);
+    fill = 1 << curr;
+    min = fill;                 /* save offset to next table */
+    do {
+      fill -= incr;
+      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
+    } while (fill !== 0);
+
+    /* backwards increment the len-bit code huff */
+    incr = 1 << (len - 1);
+    while (huff & incr) {
+      incr >>= 1;
+    }
+    if (incr !== 0) {
+      huff &= incr - 1;
+      huff += incr;
+    } else {
+      huff = 0;
     }
-    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(concurrent));
-}
-exports.mergeStatic = mergeStatic;
 
-},{"../Observable":29,"../observable/ArrayObservable":86,"../util/isScheduler":171,"./mergeAll":126}],126:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Converts a higher-order Observable into a first-order Observable which
- * concurrently delivers all values that are emitted on the inner Observables.
- *
- * <span class="informal">Flattens an Observable-of-Observables.</span>
- *
- * <img src="./img/mergeAll.png" width="100%">
- *
- * `mergeAll` subscribes to an Observable that emits Observables, also known as
- * a higher-order Observable. Each time it observes one of these emitted inner
- * Observables, it subscribes to that and delivers all the values from the
- * inner Observable on the output Observable. The output Observable only
- * completes once all inner Observables have completed. Any error delivered by
- * a inner Observable will be immediately emitted on the output Observable.
- *
- * @example <caption>Spawn a new interval Observable for each click event, and blend their outputs as one Observable</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000));
- * var firstOrder = higherOrder.mergeAll();
- * firstOrder.subscribe(x => console.log(x));
- *
- * @example <caption>Count from 0 to 9 every second for each click, but only allow 2 concurrent timers</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000).take(10));
- * var firstOrder = higherOrder.mergeAll(2);
- * firstOrder.subscribe(x => console.log(x));
- *
- * @see {@link combineAll}
- * @see {@link concatAll}
- * @see {@link exhaust}
- * @see {@link merge}
- * @see {@link mergeMap}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- * @see {@link switch}
- * @see {@link zipAll}
- *
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of inner
- * Observables being subscribed to concurrently.
- * @return {Observable} An Observable that emits values coming from all the
- * inner Observables emitted by the source Observable.
- * @method mergeAll
- * @owner Observable
- */
-function mergeAll(concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    return this.lift(new MergeAllOperator(concurrent));
-}
-exports.mergeAll = mergeAll;
-var MergeAllOperator = (function () {
-    function MergeAllOperator(concurrent) {
-        this.concurrent = concurrent;
+    /* go to next symbol, update count, len */
+    sym++;
+    if (--count[len] === 0) {
+      if (len === max) { break; }
+      len = lens[lens_index + work[sym]];
     }
-    MergeAllOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new MergeAllSubscriber(observer, this.concurrent));
-    };
-    return MergeAllOperator;
-}());
-exports.MergeAllOperator = MergeAllOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var MergeAllSubscriber = (function (_super) {
-    __extends(MergeAllSubscriber, _super);
-    function MergeAllSubscriber(destination, concurrent) {
-        _super.call(this, destination);
-        this.concurrent = concurrent;
-        this.hasCompleted = false;
-        this.buffer = [];
-        this.active = 0;
+
+    /* create new sub-table if needed */
+    if (len > root && (huff & mask) !== low) {
+      /* if first time, transition to sub-tables */
+      if (drop === 0) {
+        drop = root;
+      }
+
+      /* increment past last table */
+      next += min;            /* here min is 1 << curr */
+
+      /* determine length of next table */
+      curr = len - drop;
+      left = 1 << curr;
+      while (curr + drop < max) {
+        left -= count[curr + drop];
+        if (left <= 0) { break; }
+        curr++;
+        left <<= 1;
+      }
+
+      /* check for enough space */
+      used += 1 << curr;
+      if ((type === LENS && used > ENOUGH_LENS) ||
+        (type === DISTS && used > ENOUGH_DISTS)) {
+        return 1;
+      }
+
+      /* point entry in root table to sub-table */
+      low = huff & mask;
+      /*table.op[low] = curr;
+      table.bits[low] = root;
+      table.val[low] = next - opts.table_index;*/
+      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
     }
-    MergeAllSubscriber.prototype._next = function (observable) {
-        if (this.active < this.concurrent) {
-            this.active++;
-            this.add(subscribeToResult_1.subscribeToResult(this, observable));
-        }
-        else {
-            this.buffer.push(observable);
-        }
-    };
-    MergeAllSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            this.destination.complete();
-        }
-    };
-    MergeAllSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        this.remove(innerSub);
-        this.active--;
-        if (buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        else if (this.active === 0 && this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return MergeAllSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.MergeAllSubscriber = MergeAllSubscriber;
+  }
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],127:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+  /* fill in remaining table entry if code is incomplete (guaranteed to have
+   at most one remaining entry, since if the code is incomplete, the
+   maximum code length that was allowed to get this far is one bit) */
+  if (huff !== 0) {
+    //table.op[next + huff] = 64;            /* invalid code marker */
+    //table.bits[next + huff] = len - drop;
+    //table.val[next + huff] = 0;
+    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
+  }
+
+  /* set return parameters */
+  //opts.table_index += used;
+  opts.bits = root;
+  return 0;
 };
-var subscribeToResult_1 = require('../util/subscribeToResult');
-var OuterSubscriber_1 = require('../OuterSubscriber');
-/* tslint:enable:max-line-length */
-/**
- * Projects each source value to an Observable which is merged in the output
- * Observable.
- *
- * <span class="informal">Maps each value to an Observable, then flattens all of
- * these inner Observables using {@link mergeAll}.</span>
- *
- * <img src="./img/mergeMap.png" width="100%">
- *
- * Returns an Observable that emits items based on applying a function that you
- * supply to each item emitted by the source Observable, where that function
- * returns an Observable, and then merging those resulting Observables and
- * emitting the results of this merger.
- *
- * @example <caption>Map and flatten each letter to an Observable ticking every 1 second</caption>
- * var letters = Rx.Observable.of('a', 'b', 'c');
- * var result = letters.mergeMap(x =>
- *   Rx.Observable.interval(1000).map(i => x+i)
- * );
- * result.subscribe(x => console.log(x));
- *
- * // Results in the following:
- * // a0
- * // b0
- * // c0
- * // a1
- * // b1
- * // c1
- * // continues to list a,b,c with respective ascending integers
- *
- * @see {@link concatMap}
- * @see {@link exhaustMap}
- * @see {@link merge}
- * @see {@link mergeAll}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- * @see {@link switchMap}
- *
- * @param {function(value: T, ?index: number): ObservableInput} project A function
- * that, when applied to an item emitted by the source Observable, returns an
- * Observable.
- * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]
- * A function to produce the value on the output Observable based on the values
- * and the indices of the source (outer) emission and the inner Observable
- * emission. The arguments passed to this function are:
- * - `outerValue`: the value that came from the source
- * - `innerValue`: the value that came from the projected Observable
- * - `outerIndex`: the "index" of the value that came from the source
- * - `innerIndex`: the "index" of the value from the projected Observable
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @return {Observable} An Observable that emits the result of applying the
- * projection function (and the optional `resultSelector`) to each item emitted
- * by the source Observable and merging the results of the Observables obtained
- * from this transformation.
- * @method mergeMap
- * @owner Observable
+
+},{"../utils/common":26}],36:[function(require,module,exports){
+'use strict';
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+module.exports = {
+  2:      'need dictionary',     /* Z_NEED_DICT       2  */
+  1:      'stream end',          /* Z_STREAM_END      1  */
+  0:      '',                    /* Z_OK              0  */
+  '-1':   'file error',          /* Z_ERRNO         (-1) */
+  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */
+  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */
+  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */
+  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */
+  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */
+};
+
+},{}],37:[function(require,module,exports){
+'use strict';
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+/* eslint-disable space-unary-ops */
+
+var utils = require('../utils/common');
+
+/* Public constants ==========================================================*/
+/* ===========================================================================*/
+
+
+//var Z_FILTERED          = 1;
+//var Z_HUFFMAN_ONLY      = 2;
+//var Z_RLE               = 3;
+var Z_FIXED               = 4;
+//var Z_DEFAULT_STRATEGY  = 0;
+
+/* Possible values of the data_type field (though see inflate()) */
+var Z_BINARY              = 0;
+var Z_TEXT                = 1;
+//var Z_ASCII             = 1; // = Z_TEXT
+var Z_UNKNOWN             = 2;
+
+/*============================================================================*/
+
+
+function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
+
+// From zutil.h
+
+var STORED_BLOCK = 0;
+var STATIC_TREES = 1;
+var DYN_TREES    = 2;
+/* The three kinds of block type */
+
+var MIN_MATCH    = 3;
+var MAX_MATCH    = 258;
+/* The minimum and maximum match lengths */
+
+// From deflate.h
+/* ===========================================================================
+ * Internal compression state.
  */
-function mergeMap(project, resultSelector, concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    if (typeof resultSelector === 'number') {
-        concurrent = resultSelector;
-        resultSelector = null;
-    }
-    return this.lift(new MergeMapOperator(project, resultSelector, concurrent));
-}
-exports.mergeMap = mergeMap;
-var MergeMapOperator = (function () {
-    function MergeMapOperator(project, resultSelector, concurrent) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        this.project = project;
-        this.resultSelector = resultSelector;
-        this.concurrent = concurrent;
-    }
-    MergeMapOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new MergeMapSubscriber(observer, this.project, this.resultSelector, this.concurrent));
-    };
-    return MergeMapOperator;
-}());
-exports.MergeMapOperator = MergeMapOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
+
+var LENGTH_CODES  = 29;
+/* number of length codes, not counting the special END_BLOCK code */
+
+var LITERALS      = 256;
+/* number of literal bytes 0..255 */
+
+var L_CODES       = LITERALS + 1 + LENGTH_CODES;
+/* number of Literal or Length codes, including the END_BLOCK code */
+
+var D_CODES       = 30;
+/* number of distance codes */
+
+var BL_CODES      = 19;
+/* number of codes used to transfer the bit lengths */
+
+var HEAP_SIZE     = 2 * L_CODES + 1;
+/* maximum heap size */
+
+var MAX_BITS      = 15;
+/* All codes must not exceed MAX_BITS bits */
+
+var Buf_size      = 16;
+/* size of bit buffer in bi_buf */
+
+
+/* ===========================================================================
+ * Constants
  */
-var MergeMapSubscriber = (function (_super) {
-    __extends(MergeMapSubscriber, _super);
-    function MergeMapSubscriber(destination, project, resultSelector, concurrent) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        _super.call(this, destination);
-        this.project = project;
-        this.resultSelector = resultSelector;
-        this.concurrent = concurrent;
-        this.hasCompleted = false;
-        this.buffer = [];
-        this.active = 0;
-        this.index = 0;
-    }
-    MergeMapSubscriber.prototype._next = function (value) {
-        if (this.active < this.concurrent) {
-            this._tryNext(value);
-        }
-        else {
-            this.buffer.push(value);
-        }
-    };
-    MergeMapSubscriber.prototype._tryNext = function (value) {
-        var result;
-        var index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.active++;
-        this._innerSub(result, value, index);
-    };
-    MergeMapSubscriber.prototype._innerSub = function (ish, value, index) {
-        this.add(subscribeToResult_1.subscribeToResult(this, ish, value, index));
-    };
-    MergeMapSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            this.destination.complete();
-        }
-    };
-    MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        if (this.resultSelector) {
-            this._notifyResultSelector(outerValue, innerValue, outerIndex, innerIndex);
-        }
-        else {
-            this.destination.next(innerValue);
-        }
-    };
-    MergeMapSubscriber.prototype._notifyResultSelector = function (outerValue, innerValue, outerIndex, innerIndex) {
-        var result;
-        try {
-            result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    MergeMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        this.remove(innerSub);
-        this.active--;
-        if (buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        else if (this.active === 0 && this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return MergeMapSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.MergeMapSubscriber = MergeMapSubscriber;
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],128:[function(require,module,exports){
-"use strict";
-var ConnectableObservable_1 = require('../observable/ConnectableObservable');
-/* tslint:enable:max-line-length */
-/**
- * Returns an Observable that emits the results of invoking a specified selector on items
- * emitted by a ConnectableObservable that shares a single subscription to the underlying stream.
- *
- * <img src="./img/multicast.png" width="100%">
- *
- * @param {Function|Subject} subjectOrSubjectFactory - Factory function to create an intermediate subject through
- * which the source sequence's elements will be multicast to the selector function
- * or Subject to push source elements into.
- * @param {Function} [selector] - Optional selector function that can use the multicasted source stream
- * as many times as needed, without causing multiple subscriptions to the source stream.
- * Subscribers to the given source will receive all notifications of the source from the
- * time of the subscription forward.
- * @return {Observable} An Observable that emits the results of invoking the selector
- * on the items emitted by a `ConnectableObservable` that shares a single subscription to
- * the underlying stream.
- * @method multicast
- * @owner Observable
+var MAX_BL_BITS = 7;
+/* Bit length codes must not exceed MAX_BL_BITS bits */
+
+var END_BLOCK   = 256;
+/* end of block literal code */
+
+var REP_3_6     = 16;
+/* repeat previous bit length 3-6 times (2 bits of repeat count) */
+
+var REPZ_3_10   = 17;
+/* repeat a zero length 3-10 times  (3 bits of repeat count) */
+
+var REPZ_11_138 = 18;
+/* repeat a zero length 11-138 times  (7 bits of repeat count) */
+
+/* eslint-disable comma-spacing,array-bracket-spacing */
+var extra_lbits =   /* extra bits for each length code */
+  [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];
+
+var extra_dbits =   /* extra bits for each distance code */
+  [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];
+
+var extra_blbits =  /* extra bits for each bit length code */
+  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];
+
+var bl_order =
+  [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
+/* eslint-enable comma-spacing,array-bracket-spacing */
+
+/* The lengths of the bit length codes are sent in order of decreasing
+ * probability, to avoid transmitting the lengths for unused bit length codes.
  */
-function multicast(subjectOrSubjectFactory, selector) {
-    var subjectFactory;
-    if (typeof subjectOrSubjectFactory === 'function') {
-        subjectFactory = subjectOrSubjectFactory;
-    }
-    else {
-        subjectFactory = function subjectFactory() {
-            return subjectOrSubjectFactory;
-        };
-    }
-    if (typeof selector === 'function') {
-        return this.lift(new MulticastOperator(subjectFactory, selector));
-    }
-    var connectable = Object.create(this, ConnectableObservable_1.connectableObservableDescriptor);
-    connectable.source = this;
-    connectable.subjectFactory = subjectFactory;
-    return connectable;
-}
-exports.multicast = multicast;
-var MulticastOperator = (function () {
-    function MulticastOperator(subjectFactory, selector) {
-        this.subjectFactory = subjectFactory;
-        this.selector = selector;
-    }
-    MulticastOperator.prototype.call = function (subscriber, source) {
-        var selector = this.selector;
-        var subject = this.subjectFactory();
-        var subscription = selector(subject).subscribe(subscriber);
-        subscription.add(source.subscribe(subject));
-        return subscription;
-    };
-    return MulticastOperator;
-}());
-exports.MulticastOperator = MulticastOperator;
 
-},{"../observable/ConnectableObservable":87}],129:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var Notification_1 = require('../Notification');
-/**
- *
- * Re-emits all notifications from source Observable with specified scheduler.
- *
- * <span class="informal">Ensure a specific scheduler is used, from outside of an Observable.</span>
- *
- * `observeOn` is an operator that accepts a scheduler as a first parameter, which will be used to reschedule
- * notifications emitted by the source Observable. It might be useful, if you do not have control over
- * internal scheduler of a given Observable, but want to control when its values are emitted nevertheless.
- *
- * Returned Observable emits the same notifications (nexted values, complete and error events) as the source Observable,
- * but rescheduled with provided scheduler. Note that this doesn't mean that source Observables internal
- * scheduler will be replaced in any way. Original scheduler still will be used, but when the source Observable emits
- * notification, it will be immediately scheduled again - this time with scheduler passed to `observeOn`.
- * An anti-pattern would be calling `observeOn` on Observable that emits lots of values synchronously, to split
- * that emissions into asynchronous chunks. For this to happen, scheduler would have to be passed into the source
- * Observable directly (usually into the operator that creates it). `observeOn` simply delays notifications a
- * little bit more, to ensure that they are emitted at expected moments.
- *
- * As a matter of fact, `observeOn` accepts second parameter, which specifies in milliseconds with what delay notifications
- * will be emitted. The main difference between {@link delay} operator and `observeOn` is that `observeOn`
- * will delay all notifications - including error notifications - while `delay` will pass through error
- * from source Observable immediately when it is emitted. In general it is highly recommended to use `delay` operator
- * for any kind of delaying of values in the stream, while using `observeOn` to specify which scheduler should be used
- * for notification emissions in general.
- *
- * @example <caption>Ensure values in subscribe are called just before browser repaint.</caption>
- * const intervals = Rx.Observable.interval(10); // Intervals are scheduled
- *                                               // with async scheduler by default...
- *
- * intervals
- * .observeOn(Rx.Scheduler.animationFrame)       // ...but we will observe on animationFrame
- * .subscribe(val => {                           // scheduler to ensure smooth animation.
- *   someDiv.style.height = val + 'px';
- * });
- *
- * @see {@link delay}
- *
- * @param {IScheduler} scheduler Scheduler that will be used to reschedule notifications from source Observable.
- * @param {number} [delay] Number of milliseconds that states with what delay every notification should be rescheduled.
- * @return {Observable<T>} Observable that emits the same notifications as the source Observable,
- * but with provided scheduler.
- *
- * @method observeOn
- * @owner Observable
+/* ===========================================================================
+ * Local data. These are initialized only once.
  */
-function observeOn(scheduler, delay) {
-    if (delay === void 0) { delay = 0; }
-    return this.lift(new ObserveOnOperator(scheduler, delay));
-}
-exports.observeOn = observeOn;
-var ObserveOnOperator = (function () {
-    function ObserveOnOperator(scheduler, delay) {
-        if (delay === void 0) { delay = 0; }
-        this.scheduler = scheduler;
-        this.delay = delay;
-    }
-    ObserveOnOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));
-    };
-    return ObserveOnOperator;
-}());
-exports.ObserveOnOperator = ObserveOnOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
+
+// We pre-fill arrays with 0 to avoid uninitialized gaps
+
+var DIST_CODE_LEN = 512; /* see definition of array dist_code below */
+
+// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1
+var static_ltree  = new Array((L_CODES + 2) * 2);
+zero(static_ltree);
+/* The static literal tree. Since the bit lengths are imposed, there is no
+ * need for the L_CODES extra codes used during heap construction. However
+ * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
+ * below).
  */
-var ObserveOnSubscriber = (function (_super) {
-    __extends(ObserveOnSubscriber, _super);
-    function ObserveOnSubscriber(destination, scheduler, delay) {
-        if (delay === void 0) { delay = 0; }
-        _super.call(this, destination);
-        this.scheduler = scheduler;
-        this.delay = delay;
-    }
-    ObserveOnSubscriber.dispatch = function (arg) {
-        var notification = arg.notification, destination = arg.destination;
-        notification.observe(destination);
-        this.unsubscribe();
-    };
-    ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {
-        this.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));
-    };
-    ObserveOnSubscriber.prototype._next = function (value) {
-        this.scheduleMessage(Notification_1.Notification.createNext(value));
-    };
-    ObserveOnSubscriber.prototype._error = function (err) {
-        this.scheduleMessage(Notification_1.Notification.createError(err));
-    };
-    ObserveOnSubscriber.prototype._complete = function () {
-        this.scheduleMessage(Notification_1.Notification.createComplete());
-    };
-    return ObserveOnSubscriber;
-}(Subscriber_1.Subscriber));
-exports.ObserveOnSubscriber = ObserveOnSubscriber;
-var ObserveOnMessage = (function () {
-    function ObserveOnMessage(notification, destination) {
-        this.notification = notification;
-        this.destination = destination;
-    }
-    return ObserveOnMessage;
-}());
-exports.ObserveOnMessage = ObserveOnMessage;
 
-},{"../Notification":28,"../Subscriber":36}],130:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/**
- * Groups pairs of consecutive emissions together and emits them as an array of
- * two values.
- *
- * <span class="informal">Puts the current value and previous value together as
- * an array, and emits that.</span>
- *
- * <img src="./img/pairwise.png" width="100%">
- *
- * The Nth emission from the source Observable will cause the output Observable
- * to emit an array [(N-1)th, Nth] of the previous and the current value, as a
- * pair. For this reason, `pairwise` emits on the second and subsequent
- * emissions from the source Observable, but not on the first emission, because
- * there is no previous value in that case.
- *
- * @example <caption>On every click (starting from the second), emit the relative distance to the previous click</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var pairs = clicks.pairwise();
- * var distance = pairs.map(pair => {
- *   var x0 = pair[0].clientX;
- *   var y0 = pair[0].clientY;
- *   var x1 = pair[1].clientX;
- *   var y1 = pair[1].clientY;
- *   return Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2));
- * });
- * distance.subscribe(x => console.log(x));
- *
- * @see {@link buffer}
- * @see {@link bufferCount}
- *
- * @return {Observable<Array<T>>} An Observable of pairs (as arrays) of
- * consecutive values from the source Observable.
- * @method pairwise
- * @owner Observable
+var static_dtree  = new Array(D_CODES * 2);
+zero(static_dtree);
+/* The static distance tree. (Actually a trivial tree since all codes use
+ * 5 bits.)
  */
-function pairwise() {
-    return this.lift(new PairwiseOperator());
+
+var _dist_code    = new Array(DIST_CODE_LEN);
+zero(_dist_code);
+/* Distance codes. The first 256 values correspond to the distances
+ * 3 .. 258, the last 256 values correspond to the top 8 bits of
+ * the 15 bit distances.
+ */
+
+var _length_code  = new Array(MAX_MATCH - MIN_MATCH + 1);
+zero(_length_code);
+/* length code for each normalized match length (0 == MIN_MATCH) */
+
+var base_length   = new Array(LENGTH_CODES);
+zero(base_length);
+/* First normalized length for each code (0 = MIN_MATCH) */
+
+var base_dist     = new Array(D_CODES);
+zero(base_dist);
+/* First normalized distance for each code (0 = distance of 1) */
+
+
+function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {
+
+  this.static_tree  = static_tree;  /* static tree or NULL */
+  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */
+  this.extra_base   = extra_base;   /* base index for extra_bits */
+  this.elems        = elems;        /* max number of elements in the tree */
+  this.max_length   = max_length;   /* max bit length for the codes */
+
+  // show if `static_tree` has data or dummy - needed for monomorphic objects
+  this.has_stree    = static_tree && static_tree.length;
 }
-exports.pairwise = pairwise;
-var PairwiseOperator = (function () {
-    function PairwiseOperator() {
-    }
-    PairwiseOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new PairwiseSubscriber(subscriber));
-    };
-    return PairwiseOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
+
+
+var static_l_desc;
+var static_d_desc;
+var static_bl_desc;
+
+
+function TreeDesc(dyn_tree, stat_desc) {
+  this.dyn_tree = dyn_tree;     /* the dynamic tree */
+  this.max_code = 0;            /* largest code with non zero frequency */
+  this.stat_desc = stat_desc;   /* the corresponding static tree */
+}
+
+
+
+function d_code(dist) {
+  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];
+}
+
+
+/* ===========================================================================
+ * Output a short LSB first on the stream.
+ * IN assertion: there is enough room in pendingBuf.
  */
-var PairwiseSubscriber = (function (_super) {
-    __extends(PairwiseSubscriber, _super);
-    function PairwiseSubscriber(destination) {
-        _super.call(this, destination);
-        this.hasPrev = false;
-    }
-    PairwiseSubscriber.prototype._next = function (value) {
-        if (this.hasPrev) {
-            this.destination.next([this.prev, value]);
-        }
-        else {
-            this.hasPrev = true;
-        }
-        this.prev = value;
-    };
-    return PairwiseSubscriber;
-}(Subscriber_1.Subscriber));
+function put_short(s, w) {
+//    put_byte(s, (uch)((w) & 0xff));
+//    put_byte(s, (uch)((ush)(w) >> 8));
+  s.pending_buf[s.pending++] = (w) & 0xff;
+  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;
+}
 
-},{"../Subscriber":36}],131:[function(require,module,exports){
-"use strict";
-var map_1 = require('./map');
-/**
- * Maps each source value (an object) to its specified nested property.
- *
- * <span class="informal">Like {@link map}, but meant only for picking one of
- * the nested properties of every emitted object.</span>
- *
- * <img src="./img/pluck.png" width="100%">
- *
- * Given a list of strings describing a path to an object property, retrieves
- * the value of a specified nested property from all values in the source
- * Observable. If a property can't be resolved, it will return `undefined` for
- * that value.
- *
- * @example <caption>Map every click to the tagName of the clicked target element</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var tagNames = clicks.pluck('target', 'tagName');
- * tagNames.subscribe(x => console.log(x));
- *
- * @see {@link map}
- *
- * @param {...string} properties The nested properties to pluck from each source
- * value (an object).
- * @return {Observable} A new Observable of property values from the source values.
- * @method pluck
- * @owner Observable
+
+/* ===========================================================================
+ * Send a value on a given number of bits.
+ * IN assertion: length <= 16 and value fits in length bits.
  */
-function pluck() {
-    var properties = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        properties[_i - 0] = arguments[_i];
-    }
-    var length = properties.length;
-    if (length === 0) {
-        throw new Error('list of properties cannot be empty.');
-    }
-    return map_1.map.call(this, plucker(properties, length));
+function send_bits(s, value, length) {
+  if (s.bi_valid > (Buf_size - length)) {
+    s.bi_buf |= (value << s.bi_valid) & 0xffff;
+    put_short(s, s.bi_buf);
+    s.bi_buf = value >> (Buf_size - s.bi_valid);
+    s.bi_valid += length - Buf_size;
+  } else {
+    s.bi_buf |= (value << s.bi_valid) & 0xffff;
+    s.bi_valid += length;
+  }
 }
-exports.pluck = pluck;
-function plucker(props, length) {
-    var mapper = function (x) {
-        var currentProp = x;
-        for (var i = 0; i < length; i++) {
-            var p = currentProp[props[i]];
-            if (typeof p !== 'undefined') {
-                currentProp = p;
-            }
-            else {
-                return undefined;
-            }
-        }
-        return currentProp;
-    };
-    return mapper;
+
+
+function send_code(s, c, tree) {
+  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);
 }
 
-},{"./map":124}],132:[function(require,module,exports){
-"use strict";
-var Subject_1 = require('../Subject');
-var multicast_1 = require('./multicast');
-/* tslint:enable:max-line-length */
-/**
- * Returns a ConnectableObservable, which is a variety of Observable that waits until its connect method is called
- * before it begins emitting items to those Observers that have subscribed to it.
- *
- * <img src="./img/publish.png" width="100%">
- *
- * @param {Function} [selector] - Optional selector function which can use the multicasted source sequence as many times
- * as needed, without causing multiple subscriptions to the source sequence.
- * Subscribers to the given source will receive all notifications of the source from the time of the subscription on.
- * @return A ConnectableObservable that upon connection causes the source Observable to emit items to its Observers.
- * @method publish
- * @owner Observable
+
+/* ===========================================================================
+ * Reverse the first len bits of a code, using straightforward code (a faster
+ * method would use a table)
+ * IN assertion: 1 <= len <= 15
  */
-function publish(selector) {
-    return selector ? multicast_1.multicast.call(this, function () { return new Subject_1.Subject(); }, selector) :
-        multicast_1.multicast.call(this, new Subject_1.Subject());
+function bi_reverse(code, len) {
+  var res = 0;
+  do {
+    res |= code & 1;
+    code >>>= 1;
+    res <<= 1;
+  } while (--len > 0);
+  return res >>> 1;
 }
-exports.publish = publish;
 
-},{"../Subject":34,"./multicast":128}],133:[function(require,module,exports){
-"use strict";
-var ReplaySubject_1 = require('../ReplaySubject');
-var multicast_1 = require('./multicast');
-/**
- * @param bufferSize
- * @param windowTime
- * @param scheduler
- * @return {ConnectableObservable<T>}
- * @method publishReplay
- * @owner Observable
+
+/* ===========================================================================
+ * Flush the bit buffer, keeping at most 7 bits in it.
  */
-function publishReplay(bufferSize, windowTime, scheduler) {
-    if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }
-    if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }
-    return multicast_1.multicast.call(this, new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler));
+function bi_flush(s) {
+  if (s.bi_valid === 16) {
+    put_short(s, s.bi_buf);
+    s.bi_buf = 0;
+    s.bi_valid = 0;
+
+  } else if (s.bi_valid >= 8) {
+    s.pending_buf[s.pending++] = s.bi_buf & 0xff;
+    s.bi_buf >>= 8;
+    s.bi_valid -= 8;
+  }
 }
-exports.publishReplay = publishReplay;
 
-},{"../ReplaySubject":32,"./multicast":128}],134:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/* tslint:enable:max-line-length */
-/**
- * Applies an accumulator function over the source Observable, and returns each
- * intermediate result, with an optional seed value.
- *
- * <span class="informal">It's like {@link reduce}, but emits the current
- * accumulation whenever the source emits a value.</span>
- *
- * <img src="./img/scan.png" width="100%">
- *
- * Combines together all values emitted on the source, using an accumulator
- * function that knows how to join a new source value into the accumulation from
- * the past. Is similar to {@link reduce}, but emits the intermediate
- * accumulations.
- *
- * Returns an Observable that applies a specified `accumulator` function to each
- * item emitted by the source Observable. If a `seed` value is specified, then
- * that value will be used as the initial value for the accumulator. If no seed
- * value is specified, the first item of the source is used as the seed.
- *
- * @example <caption>Count the number of click events</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var ones = clicks.mapTo(1);
- * var seed = 0;
- * var count = ones.scan((acc, one) => acc + one, seed);
- * count.subscribe(x => console.log(x));
- *
- * @see {@link expand}
- * @see {@link mergeScan}
- * @see {@link reduce}
- *
- * @param {function(acc: R, value: T, index: number): R} accumulator
- * The accumulator function called on each source value.
- * @param {T|R} [seed] The initial accumulation value.
- * @return {Observable<R>} An observable of the accumulated values.
- * @method scan
- * @owner Observable
+
+/* ===========================================================================
+ * Compute the optimal bit lengths for a tree and update the total bit length
+ * for the current block.
+ * IN assertion: the fields freq and dad are set, heap[heap_max] and
+ *    above are the tree nodes sorted by increasing frequency.
+ * OUT assertions: the field len is set to the optimal bit length, the
+ *     array bl_count contains the frequencies for each bit length.
+ *     The length opt_len is updated; static_len is also updated if stree is
+ *     not null.
  */
-function scan(accumulator, seed) {
-    var hasSeed = false;
-    // providing a seed of `undefined` *should* be valid and trigger
-    // hasSeed! so don't use `seed !== undefined` checks!
-    // For this reason, we have to check it here at the original call site
-    // otherwise inside Operator/Subscriber we won't know if `undefined`
-    // means they didn't provide anything or if they literally provided `undefined`
-    if (arguments.length >= 2) {
-        hasSeed = true;
-    }
-    return this.lift(new ScanOperator(accumulator, seed, hasSeed));
-}
-exports.scan = scan;
-var ScanOperator = (function () {
-    function ScanOperator(accumulator, seed, hasSeed) {
-        if (hasSeed === void 0) { hasSeed = false; }
-        this.accumulator = accumulator;
-        this.seed = seed;
-        this.hasSeed = hasSeed;
-    }
-    ScanOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));
-    };
-    return ScanOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var ScanSubscriber = (function (_super) {
-    __extends(ScanSubscriber, _super);
-    function ScanSubscriber(destination, accumulator, _seed, hasSeed) {
-        _super.call(this, destination);
-        this.accumulator = accumulator;
-        this._seed = _seed;
-        this.hasSeed = hasSeed;
-        this.index = 0;
+function gen_bitlen(s, desc)
+//    deflate_state *s;
+//    tree_desc *desc;    /* the tree descriptor */
+{
+  var tree            = desc.dyn_tree;
+  var max_code        = desc.max_code;
+  var stree           = desc.stat_desc.static_tree;
+  var has_stree       = desc.stat_desc.has_stree;
+  var extra           = desc.stat_desc.extra_bits;
+  var base            = desc.stat_desc.extra_base;
+  var max_length      = desc.stat_desc.max_length;
+  var h;              /* heap index */
+  var n, m;           /* iterate over the tree elements */
+  var bits;           /* bit length */
+  var xbits;          /* extra bits */
+  var f;              /* frequency */
+  var overflow = 0;   /* number of elements with bit length too large */
+
+  for (bits = 0; bits <= MAX_BITS; bits++) {
+    s.bl_count[bits] = 0;
+  }
+
+  /* In a first pass, compute the optimal bit lengths (which may
+   * overflow in the case of the bit length tree).
+   */
+  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */
+
+  for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {
+    n = s.heap[h];
+    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;
+    if (bits > max_length) {
+      bits = max_length;
+      overflow++;
     }
-    Object.defineProperty(ScanSubscriber.prototype, "seed", {
-        get: function () {
-            return this._seed;
-        },
-        set: function (value) {
-            this.hasSeed = true;
-            this._seed = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    ScanSubscriber.prototype._next = function (value) {
-        if (!this.hasSeed) {
-            this.seed = value;
-            this.destination.next(value);
-        }
-        else {
-            return this._tryNext(value);
-        }
-    };
-    ScanSubscriber.prototype._tryNext = function (value) {
-        var index = this.index++;
-        var result;
-        try {
-            result = this.accumulator(this.seed, value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-        this.seed = result;
-        this.destination.next(result);
-    };
-    return ScanSubscriber;
-}(Subscriber_1.Subscriber));
+    tree[n * 2 + 1]/*.Len*/ = bits;
+    /* We overwrite tree[n].Dad which is no longer needed */
 
-},{"../Subscriber":36}],135:[function(require,module,exports){
-"use strict";
-var multicast_1 = require('./multicast');
-var Subject_1 = require('../Subject');
-function shareSubjectFactory() {
-    return new Subject_1.Subject();
+    if (n > max_code) { continue; } /* not a leaf node */
+
+    s.bl_count[bits]++;
+    xbits = 0;
+    if (n >= base) {
+      xbits = extra[n - base];
+    }
+    f = tree[n * 2]/*.Freq*/;
+    s.opt_len += f * (bits + xbits);
+    if (has_stree) {
+      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);
+    }
+  }
+  if (overflow === 0) { return; }
+
+  // Trace((stderr,"\nbit length overflow\n"));
+  /* This happens for example on obj2 and pic of the Calgary corpus */
+
+  /* Find the first bit length which could increase: */
+  do {
+    bits = max_length - 1;
+    while (s.bl_count[bits] === 0) { bits--; }
+    s.bl_count[bits]--;      /* move one leaf down the tree */
+    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */
+    s.bl_count[max_length]--;
+    /* The brother of the overflow item also moves one step up,
+     * but this does not affect bl_count[max_length]
+     */
+    overflow -= 2;
+  } while (overflow > 0);
+
+  /* Now recompute all bit lengths, scanning in increasing frequency.
+   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
+   * lengths instead of fixing only the wrong ones. This idea is taken
+   * from 'ar' written by Haruhiko Okumura.)
+   */
+  for (bits = max_length; bits !== 0; bits--) {
+    n = s.bl_count[bits];
+    while (n !== 0) {
+      m = s.heap[--h];
+      if (m > max_code) { continue; }
+      if (tree[m * 2 + 1]/*.Len*/ !== bits) {
+        // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
+        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;
+        tree[m * 2 + 1]/*.Len*/ = bits;
+      }
+      n--;
+    }
+  }
 }
-/**
- * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one
- * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will
- * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`.
- * This is an alias for .publish().refCount().
- *
- * <img src="./img/share.png" width="100%">
- *
- * @return {Observable<T>} An Observable that upon connection causes the source Observable to emit items to its Observers.
- * @method share
- * @owner Observable
+
+
+/* ===========================================================================
+ * Generate the codes for a given tree and bit counts (which need not be
+ * optimal).
+ * IN assertion: the array bl_count contains the bit length statistics for
+ * the given tree and the field len is set for all tree elements.
+ * OUT assertion: the field code is set for all tree elements of non
+ *     zero code length.
  */
-function share() {
-    return multicast_1.multicast.call(this, shareSubjectFactory).refCount();
+function gen_codes(tree, max_code, bl_count)
+//    ct_data *tree;             /* the tree to decorate */
+//    int max_code;              /* largest code with non zero frequency */
+//    ushf *bl_count;            /* number of codes at each bit length */
+{
+  var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */
+  var code = 0;              /* running code value */
+  var bits;                  /* bit index */
+  var n;                     /* code index */
+
+  /* The distribution counts are first used to generate the code values
+   * without bit reversal.
+   */
+  for (bits = 1; bits <= MAX_BITS; bits++) {
+    next_code[bits] = code = (code + bl_count[bits - 1]) << 1;
+  }
+  /* Check that the bit counts in bl_count are consistent. The last code
+   * must be all ones.
+   */
+  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
+  //        "inconsistent bit counts");
+  //Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
+
+  for (n = 0;  n <= max_code; n++) {
+    var len = tree[n * 2 + 1]/*.Len*/;
+    if (len === 0) { continue; }
+    /* Now reverse the bits */
+    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);
+
+    //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
+    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
+  }
 }
-exports.share = share;
-;
 
-},{"../Subject":34,"./multicast":128}],136:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/**
- * Returns an Observable that skips the first `count` items emitted by the source Observable.
- *
- * <img src="./img/skip.png" width="100%">
- *
- * @param {Number} count - The number of times, items emitted by source Observable should be skipped.
- * @return {Observable} An Observable that skips values emitted by the source Observable.
- *
- * @method skip
- * @owner Observable
+
+/* ===========================================================================
+ * Initialize the various 'constant' tables.
  */
-function skip(count) {
-    return this.lift(new SkipOperator(count));
-}
-exports.skip = skip;
-var SkipOperator = (function () {
-    function SkipOperator(total) {
-        this.total = total;
+function tr_static_init() {
+  var n;        /* iterates over tree elements */
+  var bits;     /* bit counter */
+  var length;   /* length value */
+  var code;     /* code value */
+  var dist;     /* distance index */
+  var bl_count = new Array(MAX_BITS + 1);
+  /* number of codes at each bit length for an optimal tree */
+
+  // do check in _tr_init()
+  //if (static_init_done) return;
+
+  /* For some embedded targets, global variables are not initialized: */
+/*#ifdef NO_INIT_GLOBAL_POINTERS
+  static_l_desc.static_tree = static_ltree;
+  static_l_desc.extra_bits = extra_lbits;
+  static_d_desc.static_tree = static_dtree;
+  static_d_desc.extra_bits = extra_dbits;
+  static_bl_desc.extra_bits = extra_blbits;
+#endif*/
+
+  /* Initialize the mapping length (0..255) -> length code (0..28) */
+  length = 0;
+  for (code = 0; code < LENGTH_CODES - 1; code++) {
+    base_length[code] = length;
+    for (n = 0; n < (1 << extra_lbits[code]); n++) {
+      _length_code[length++] = code;
     }
-    SkipOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SkipSubscriber(subscriber, this.total));
-    };
-    return SkipOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var SkipSubscriber = (function (_super) {
-    __extends(SkipSubscriber, _super);
-    function SkipSubscriber(destination, total) {
-        _super.call(this, destination);
-        this.total = total;
-        this.count = 0;
+  }
+  //Assert (length == 256, "tr_static_init: length != 256");
+  /* Note that the length 255 (match length 258) can be represented
+   * in two different ways: code 284 + 5 bits or code 285, so we
+   * overwrite length_code[255] to use the best encoding:
+   */
+  _length_code[length - 1] = code;
+
+  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
+  dist = 0;
+  for (code = 0; code < 16; code++) {
+    base_dist[code] = dist;
+    for (n = 0; n < (1 << extra_dbits[code]); n++) {
+      _dist_code[dist++] = code;
     }
-    SkipSubscriber.prototype._next = function (x) {
-        if (++this.count > this.total) {
-            this.destination.next(x);
-        }
-    };
-    return SkipSubscriber;
-}(Subscriber_1.Subscriber));
+  }
+  //Assert (dist == 256, "tr_static_init: dist != 256");
+  dist >>= 7; /* from now on, all distances are divided by 128 */
+  for (; code < D_CODES; code++) {
+    base_dist[code] = dist << 7;
+    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {
+      _dist_code[256 + dist++] = code;
+    }
+  }
+  //Assert (dist == 256, "tr_static_init: 256+dist != 512");
 
-},{"../Subscriber":36}],137:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Returns an Observable that skips items emitted by the source Observable until a second Observable emits an item.
- *
- * <img src="./img/skipUntil.png" width="100%">
- *
- * @param {Observable} notifier - The second Observable that has to emit an item before the source Observable's elements begin to
- * be mirrored by the resulting Observable.
- * @return {Observable<T>} An Observable that skips items from the source Observable until the second Observable emits
- * an item, then emits the remaining items.
- * @method skipUntil
- * @owner Observable
+  /* Construct the codes of the static literal tree */
+  for (bits = 0; bits <= MAX_BITS; bits++) {
+    bl_count[bits] = 0;
+  }
+
+  n = 0;
+  while (n <= 143) {
+    static_ltree[n * 2 + 1]/*.Len*/ = 8;
+    n++;
+    bl_count[8]++;
+  }
+  while (n <= 255) {
+    static_ltree[n * 2 + 1]/*.Len*/ = 9;
+    n++;
+    bl_count[9]++;
+  }
+  while (n <= 279) {
+    static_ltree[n * 2 + 1]/*.Len*/ = 7;
+    n++;
+    bl_count[7]++;
+  }
+  while (n <= 287) {
+    static_ltree[n * 2 + 1]/*.Len*/ = 8;
+    n++;
+    bl_count[8]++;
+  }
+  /* Codes 286 and 287 do not exist, but we must include them in the
+   * tree construction to get a canonical Huffman tree (longest code
+   * all ones)
+   */
+  gen_codes(static_ltree, L_CODES + 1, bl_count);
+
+  /* The static distance tree is trivial: */
+  for (n = 0; n < D_CODES; n++) {
+    static_dtree[n * 2 + 1]/*.Len*/ = 5;
+    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);
+  }
+
+  // Now data ready and we can init static trees
+  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);
+  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);
+  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);
+
+  //static_init_done = true;
+}
+
+
+/* ===========================================================================
+ * Initialize a new block.
  */
-function skipUntil(notifier) {
-    return this.lift(new SkipUntilOperator(notifier));
+function init_block(s) {
+  var n; /* iterates over tree elements */
+
+  /* Initialize the trees. */
+  for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }
+  for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }
+  for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }
+
+  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;
+  s.opt_len = s.static_len = 0;
+  s.last_lit = s.matches = 0;
 }
-exports.skipUntil = skipUntil;
-var SkipUntilOperator = (function () {
-    function SkipUntilOperator(notifier) {
-        this.notifier = notifier;
-    }
-    SkipUntilOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SkipUntilSubscriber(subscriber, this.notifier));
-    };
-    return SkipUntilOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
+
+
+/* ===========================================================================
+ * Flush the bit buffer and align the output on a byte boundary
  */
-var SkipUntilSubscriber = (function (_super) {
-    __extends(SkipUntilSubscriber, _super);
-    function SkipUntilSubscriber(destination, notifier) {
-        _super.call(this, destination);
-        this.hasValue = false;
-        this.isInnerStopped = false;
-        this.add(subscribeToResult_1.subscribeToResult(this, notifier));
-    }
-    SkipUntilSubscriber.prototype._next = function (value) {
-        if (this.hasValue) {
-            _super.prototype._next.call(this, value);
-        }
-    };
-    SkipUntilSubscriber.prototype._complete = function () {
-        if (this.isInnerStopped) {
-            _super.prototype._complete.call(this);
-        }
-        else {
-            this.unsubscribe();
-        }
-    };
-    SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.hasValue = true;
-    };
-    SkipUntilSubscriber.prototype.notifyComplete = function () {
-        this.isInnerStopped = true;
-        if (this.isStopped) {
-            _super.prototype._complete.call(this);
-        }
-    };
-    return SkipUntilSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
+function bi_windup(s)
+{
+  if (s.bi_valid > 8) {
+    put_short(s, s.bi_buf);
+  } else if (s.bi_valid > 0) {
+    //put_byte(s, (Byte)s->bi_buf);
+    s.pending_buf[s.pending++] = s.bi_buf;
+  }
+  s.bi_buf = 0;
+  s.bi_valid = 0;
+}
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],138:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/**
- * Returns an Observable that skips all items emitted by the source Observable as long as a specified condition holds
- * true, but emits all further source items as soon as the condition becomes false.
- *
- * <img src="./img/skipWhile.png" width="100%">
- *
- * @param {Function} predicate - A function to test each item emitted from the source Observable.
- * @return {Observable<T>} An Observable that begins emitting items emitted by the source Observable when the
- * specified predicate becomes false.
- * @method skipWhile
- * @owner Observable
+/* ===========================================================================
+ * Copy a stored block, storing first the length and its
+ * one's complement if requested.
  */
-function skipWhile(predicate) {
-    return this.lift(new SkipWhileOperator(predicate));
+function copy_block(s, buf, len, header)
+//DeflateState *s;
+//charf    *buf;    /* the input data */
+//unsigned len;     /* its length */
+//int      header;  /* true if block header must be written */
+{
+  bi_windup(s);        /* align on byte boundary */
+
+  if (header) {
+    put_short(s, len);
+    put_short(s, ~len);
+  }
+//  while (len--) {
+//    put_byte(s, *buf++);
+//  }
+  utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);
+  s.pending += len;
 }
-exports.skipWhile = skipWhile;
-var SkipWhileOperator = (function () {
-    function SkipWhileOperator(predicate) {
-        this.predicate = predicate;
-    }
-    SkipWhileOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));
-    };
-    return SkipWhileOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
+
+/* ===========================================================================
+ * Compares to subtrees, using the tree depth as tie breaker when
+ * the subtrees have equal frequency. This minimizes the worst case length.
  */
-var SkipWhileSubscriber = (function (_super) {
-    __extends(SkipWhileSubscriber, _super);
-    function SkipWhileSubscriber(destination, predicate) {
-        _super.call(this, destination);
-        this.predicate = predicate;
-        this.skipping = true;
-        this.index = 0;
-    }
-    SkipWhileSubscriber.prototype._next = function (value) {
-        var destination = this.destination;
-        if (this.skipping) {
-            this.tryCallPredicate(value);
-        }
-        if (!this.skipping) {
-            destination.next(value);
-        }
-    };
-    SkipWhileSubscriber.prototype.tryCallPredicate = function (value) {
-        try {
-            var result = this.predicate(value, this.index++);
-            this.skipping = Boolean(result);
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    return SkipWhileSubscriber;
-}(Subscriber_1.Subscriber));
+function smaller(tree, n, m, depth) {
+  var _n2 = n * 2;
+  var _m2 = m * 2;
+  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||
+         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));
+}
+
+/* ===========================================================================
+ * Restore the heap property by moving down the tree starting at node k,
+ * exchanging a node with the smallest of its two sons if necessary, stopping
+ * when the heap property is re-established (each father smaller than its
+ * two sons).
+ */
+function pqdownheap(s, tree, k)
+//    deflate_state *s;
+//    ct_data *tree;  /* the tree to restore */
+//    int k;               /* node to move down */
+{
+  var v = s.heap[k];
+  var j = k << 1;  /* left son of k */
+  while (j <= s.heap_len) {
+    /* Set j to the smallest of the two sons: */
+    if (j < s.heap_len &&
+      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {
+      j++;
+    }
+    /* Exit if v is smaller than both sons */
+    if (smaller(tree, v, s.heap[j], s.depth)) { break; }
+
+    /* Exchange v with the smallest son */
+    s.heap[k] = s.heap[j];
+    k = j;
+
+    /* And continue down the tree, setting j to the left son of k */
+    j <<= 1;
+  }
+  s.heap[k] = v;
+}
 
-},{"../Subscriber":36}],139:[function(require,module,exports){
-"use strict";
-var ArrayObservable_1 = require('../observable/ArrayObservable');
-var ScalarObservable_1 = require('../observable/ScalarObservable');
-var EmptyObservable_1 = require('../observable/EmptyObservable');
-var concat_1 = require('./concat');
-var isScheduler_1 = require('../util/isScheduler');
-/* tslint:enable:max-line-length */
-/**
- * Returns an Observable that emits the items you specify as arguments before it begins to emit
- * items emitted by the source Observable.
- *
- * <img src="./img/startWith.png" width="100%">
- *
- * @param {...T} values - Items you want the modified Observable to emit first.
- * @param {Scheduler} [scheduler] - A {@link IScheduler} to use for scheduling
- * the emissions of the `next` notifications.
- * @return {Observable} An Observable that emits the items in the specified Iterable and then emits the items
- * emitted by the source Observable.
- * @method startWith
- * @owner Observable
+
+// inlined manually
+// var SMALLEST = 1;
+
+/* ===========================================================================
+ * Send the block data compressed using the given Huffman trees
  */
-function startWith() {
-    var array = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        array[_i - 0] = arguments[_i];
+function compress_block(s, ltree, dtree)
+//    deflate_state *s;
+//    const ct_data *ltree; /* literal tree */
+//    const ct_data *dtree; /* distance tree */
+{
+  var dist;           /* distance of matched string */
+  var lc;             /* match length or unmatched char (if dist == 0) */
+  var lx = 0;         /* running index in l_buf */
+  var code;           /* the code to send */
+  var extra;          /* number of extra bits to send */
+
+  if (s.last_lit !== 0) {
+    do {
+      dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);
+      lc = s.pending_buf[s.l_buf + lx];
+      lx++;
+
+      if (dist === 0) {
+        send_code(s, lc, ltree); /* send a literal byte */
+        //Tracecv(isgraph(lc), (stderr," '%c' ", lc));
+      } else {
+        /* Here, lc is the match length - MIN_MATCH */
+        code = _length_code[lc];
+        send_code(s, code + LITERALS + 1, ltree); /* send the length code */
+        extra = extra_lbits[code];
+        if (extra !== 0) {
+          lc -= base_length[code];
+          send_bits(s, lc, extra);       /* send the extra length bits */
+        }
+        dist--; /* dist is now the match distance - 1 */
+        code = d_code(dist);
+        //Assert (code < D_CODES, "bad d_code");
+
+        send_code(s, code, dtree);       /* send the distance code */
+        extra = extra_dbits[code];
+        if (extra !== 0) {
+          dist -= base_dist[code];
+          send_bits(s, dist, extra);   /* send the extra distance bits */
+        }
+      } /* literal or match pair ? */
+
+      /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
+      //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
+      //       "pendingBuf overflow");
+
+    } while (lx < s.last_lit);
+  }
+
+  send_code(s, END_BLOCK, ltree);
+}
+
+
+/* ===========================================================================
+ * Construct one Huffman tree and assigns the code bit strings and lengths.
+ * Update the total bit length for the current block.
+ * IN assertion: the field freq is set for all tree elements.
+ * OUT assertions: the fields len and code are set to the optimal bit length
+ *     and corresponding code. The length opt_len is updated; static_len is
+ *     also updated if stree is not null. The field max_code is set.
+ */
+function build_tree(s, desc)
+//    deflate_state *s;
+//    tree_desc *desc; /* the tree descriptor */
+{
+  var tree     = desc.dyn_tree;
+  var stree    = desc.stat_desc.static_tree;
+  var has_stree = desc.stat_desc.has_stree;
+  var elems    = desc.stat_desc.elems;
+  var n, m;          /* iterate over heap elements */
+  var max_code = -1; /* largest code with non zero frequency */
+  var node;          /* new node being created */
+
+  /* Construct the initial heap, with least frequent element in
+   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
+   * heap[0] is not used.
+   */
+  s.heap_len = 0;
+  s.heap_max = HEAP_SIZE;
+
+  for (n = 0; n < elems; n++) {
+    if (tree[n * 2]/*.Freq*/ !== 0) {
+      s.heap[++s.heap_len] = max_code = n;
+      s.depth[n] = 0;
+
+    } else {
+      tree[n * 2 + 1]/*.Len*/ = 0;
     }
-    var scheduler = array[array.length - 1];
-    if (isScheduler_1.isScheduler(scheduler)) {
-        array.pop();
+  }
+
+  /* The pkzip format requires that at least one distance code exists,
+   * and that at least one bit should be sent even if there is only one
+   * possible code. So to avoid special checks later on we force at least
+   * two codes of non zero frequency.
+   */
+  while (s.heap_len < 2) {
+    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);
+    tree[node * 2]/*.Freq*/ = 1;
+    s.depth[node] = 0;
+    s.opt_len--;
+
+    if (has_stree) {
+      s.static_len -= stree[node * 2 + 1]/*.Len*/;
     }
-    else {
-        scheduler = null;
+    /* node is 0 or 1 so it does not have extra bits */
+  }
+  desc.max_code = max_code;
+
+  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
+   * establish sub-heaps of increasing lengths:
+   */
+  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }
+
+  /* Construct the Huffman tree by repeatedly combining the least two
+   * frequent nodes.
+   */
+  node = elems;              /* next internal node of the tree */
+  do {
+    //pqremove(s, tree, n);  /* n = node of least frequency */
+    /*** pqremove ***/
+    n = s.heap[1/*SMALLEST*/];
+    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];
+    pqdownheap(s, tree, 1/*SMALLEST*/);
+    /***/
+
+    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */
+
+    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */
+    s.heap[--s.heap_max] = m;
+
+    /* Create a new node father of n and m */
+    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;
+    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
+    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;
+
+    /* and insert the new node in the heap */
+    s.heap[1/*SMALLEST*/] = node++;
+    pqdownheap(s, tree, 1/*SMALLEST*/);
+
+  } while (s.heap_len >= 2);
+
+  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];
+
+  /* At this point, the fields freq and dad are set. We can now
+   * generate the bit lengths.
+   */
+  gen_bitlen(s, desc);
+
+  /* The field len is now set, we can generate the bit codes */
+  gen_codes(tree, max_code, s.bl_count);
+}
+
+
+/* ===========================================================================
+ * Scan a literal or distance tree to determine the frequencies of the codes
+ * in the bit length tree.
+ */
+function scan_tree(s, tree, max_code)
+//    deflate_state *s;
+//    ct_data *tree;   /* the tree to be scanned */
+//    int max_code;    /* and its largest code of non zero frequency */
+{
+  var n;                     /* iterates over all tree elements */
+  var prevlen = -1;          /* last emitted length */
+  var curlen;                /* length of current code */
+
+  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
+
+  var count = 0;             /* repeat count of the current code */
+  var max_count = 7;         /* max repeat count */
+  var min_count = 4;         /* min repeat count */
+
+  if (nextlen === 0) {
+    max_count = 138;
+    min_count = 3;
+  }
+  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */
+
+  for (n = 0; n <= max_code; n++) {
+    curlen = nextlen;
+    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
+
+    if (++count < max_count && curlen === nextlen) {
+      continue;
+
+    } else if (count < min_count) {
+      s.bl_tree[curlen * 2]/*.Freq*/ += count;
+
+    } else if (curlen !== 0) {
+
+      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }
+      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;
+
+    } else if (count <= 10) {
+      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;
+
+    } else {
+      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;
     }
-    var len = array.length;
-    if (len === 1) {
-        return concat_1.concatStatic(new ScalarObservable_1.ScalarObservable(array[0], scheduler), this);
+
+    count = 0;
+    prevlen = curlen;
+
+    if (nextlen === 0) {
+      max_count = 138;
+      min_count = 3;
+
+    } else if (curlen === nextlen) {
+      max_count = 6;
+      min_count = 3;
+
+    } else {
+      max_count = 7;
+      min_count = 4;
     }
-    else if (len > 1) {
-        return concat_1.concatStatic(new ArrayObservable_1.ArrayObservable(array, scheduler), this);
+  }
+}
+
+
+/* ===========================================================================
+ * Send a literal or distance tree in compressed form, using the codes in
+ * bl_tree.
+ */
+function send_tree(s, tree, max_code)
+//    deflate_state *s;
+//    ct_data *tree; /* the tree to be scanned */
+//    int max_code;       /* and its largest code of non zero frequency */
+{
+  var n;                     /* iterates over all tree elements */
+  var prevlen = -1;          /* last emitted length */
+  var curlen;                /* length of current code */
+
+  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
+
+  var count = 0;             /* repeat count of the current code */
+  var max_count = 7;         /* max repeat count */
+  var min_count = 4;         /* min repeat count */
+
+  /* tree[max_code+1].Len = -1; */  /* guard already set */
+  if (nextlen === 0) {
+    max_count = 138;
+    min_count = 3;
+  }
+
+  for (n = 0; n <= max_code; n++) {
+    curlen = nextlen;
+    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
+
+    if (++count < max_count && curlen === nextlen) {
+      continue;
+
+    } else if (count < min_count) {
+      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);
+
+    } else if (curlen !== 0) {
+      if (curlen !== prevlen) {
+        send_code(s, curlen, s.bl_tree);
+        count--;
+      }
+      //Assert(count >= 3 && count <= 6, " 3_6?");
+      send_code(s, REP_3_6, s.bl_tree);
+      send_bits(s, count - 3, 2);
+
+    } else if (count <= 10) {
+      send_code(s, REPZ_3_10, s.bl_tree);
+      send_bits(s, count - 3, 3);
+
+    } else {
+      send_code(s, REPZ_11_138, s.bl_tree);
+      send_bits(s, count - 11, 7);
     }
-    else {
-        return concat_1.concatStatic(new EmptyObservable_1.EmptyObservable(scheduler), this);
+
+    count = 0;
+    prevlen = curlen;
+    if (nextlen === 0) {
+      max_count = 138;
+      min_count = 3;
+
+    } else if (curlen === nextlen) {
+      max_count = 6;
+      min_count = 3;
+
+    } else {
+      max_count = 7;
+      min_count = 4;
     }
+  }
 }
-exports.startWith = startWith;
 
-},{"../observable/ArrayObservable":86,"../observable/EmptyObservable":89,"../observable/ScalarObservable":95,"../util/isScheduler":171,"./concat":113}],140:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/* tslint:enable:max-line-length */
-/**
- * Projects each source value to an Observable which is merged in the output
- * Observable, emitting values only from the most recently projected Observable.
- *
- * <span class="informal">Maps each value to an Observable, then flattens all of
- * these inner Observables using {@link switch}.</span>
- *
- * <img src="./img/switchMap.png" width="100%">
- *
- * Returns an Observable that emits items based on applying a function that you
- * supply to each item emitted by the source Observable, where that function
- * returns an (so-called "inner") Observable. Each time it observes one of these
- * inner Observables, the output Observable begins emitting the items emitted by
- * that inner Observable. When a new inner Observable is emitted, `switchMap`
- * stops emitting items from the earlier-emitted inner Observable and begins
- * emitting items from the new one. It continues to behave like this for
- * subsequent inner Observables.
- *
- * @example <caption>Rerun an interval Observable on every click event</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = clicks.switchMap((ev) => Rx.Observable.interval(1000));
- * result.subscribe(x => console.log(x));
- *
- * @see {@link concatMap}
- * @see {@link exhaustMap}
- * @see {@link mergeMap}
- * @see {@link switch}
- * @see {@link switchMapTo}
- *
- * @param {function(value: T, ?index: number): ObservableInput} project A function
- * that, when applied to an item emitted by the source Observable, returns an
- * Observable.
- * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]
- * A function to produce the value on the output Observable based on the values
- * and the indices of the source (outer) emission and the inner Observable
- * emission. The arguments passed to this function are:
- * - `outerValue`: the value that came from the source
- * - `innerValue`: the value that came from the projected Observable
- * - `outerIndex`: the "index" of the value that came from the source
- * - `innerIndex`: the "index" of the value from the projected Observable
- * @return {Observable} An Observable that emits the result of applying the
- * projection function (and the optional `resultSelector`) to each item emitted
- * by the source Observable and taking only the values from the most recently
- * projected inner Observable.
- * @method switchMap
- * @owner Observable
+
+/* ===========================================================================
+ * Construct the Huffman tree for the bit lengths and return the index in
+ * bl_order of the last bit length code to send.
  */
-function switchMap(project, resultSelector) {
-    return this.lift(new SwitchMapOperator(project, resultSelector));
-}
-exports.switchMap = switchMap;
-var SwitchMapOperator = (function () {
-    function SwitchMapOperator(project, resultSelector) {
-        this.project = project;
-        this.resultSelector = resultSelector;
+function build_bl_tree(s) {
+  var max_blindex;  /* index of last bit length code of non zero freq */
+
+  /* Determine the bit length frequencies for literal and distance trees */
+  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);
+  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);
+
+  /* Build the bit length tree: */
+  build_tree(s, s.bl_desc);
+  /* opt_len now includes the length of the tree representations, except
+   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
+   */
+
+  /* Determine the number of bit length codes to send. The pkzip format
+   * requires that at least 4 bit length codes be sent. (appnote.txt says
+   * 3 but the actual value used is 4.)
+   */
+  for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {
+    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {
+      break;
     }
-    SwitchMapOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SwitchMapSubscriber(subscriber, this.project, this.resultSelector));
-    };
-    return SwitchMapOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
+  }
+  /* Update opt_len to include the bit length tree and counts */
+  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;
+  //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
+  //        s->opt_len, s->static_len));
+
+  return max_blindex;
+}
+
+
+/* ===========================================================================
+ * Send the header for a block using dynamic Huffman trees: the counts, the
+ * lengths of the bit length codes, the literal tree and the distance tree.
+ * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
  */
-var SwitchMapSubscriber = (function (_super) {
-    __extends(SwitchMapSubscriber, _super);
-    function SwitchMapSubscriber(destination, project, resultSelector) {
-        _super.call(this, destination);
-        this.project = project;
-        this.resultSelector = resultSelector;
-        this.index = 0;
-    }
-    SwitchMapSubscriber.prototype._next = function (value) {
-        var result;
-        var index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (error) {
-            this.destination.error(error);
-            return;
-        }
-        this._innerSub(result, value, index);
-    };
-    SwitchMapSubscriber.prototype._innerSub = function (result, value, index) {
-        var innerSubscription = this.innerSubscription;
-        if (innerSubscription) {
-            innerSubscription.unsubscribe();
-        }
-        this.add(this.innerSubscription = subscribeToResult_1.subscribeToResult(this, result, value, index));
-    };
-    SwitchMapSubscriber.prototype._complete = function () {
-        var innerSubscription = this.innerSubscription;
-        if (!innerSubscription || innerSubscription.closed) {
-            _super.prototype._complete.call(this);
-        }
-    };
-    SwitchMapSubscriber.prototype._unsubscribe = function () {
-        this.innerSubscription = null;
-    };
-    SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.remove(innerSub);
-        this.innerSubscription = null;
-        if (this.isStopped) {
-            _super.prototype._complete.call(this);
-        }
-    };
-    SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        if (this.resultSelector) {
-            this._tryNotifyNext(outerValue, innerValue, outerIndex, innerIndex);
-        }
-        else {
-            this.destination.next(innerValue);
-        }
-    };
-    SwitchMapSubscriber.prototype._tryNotifyNext = function (outerValue, innerValue, outerIndex, innerIndex) {
-        var result;
-        try {
-            result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return SwitchMapSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
+function send_all_trees(s, lcodes, dcodes, blcodes)
+//    deflate_state *s;
+//    int lcodes, dcodes, blcodes; /* number of codes for each tree */
+{
+  var rank;                    /* index in bl_order */
+
+  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
+  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
+  //        "too many codes");
+  //Tracev((stderr, "\nbl counts: "));
+  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */
+  send_bits(s, dcodes - 1,   5);
+  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */
+  for (rank = 0; rank < blcodes; rank++) {
+    //Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
+    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);
+  }
+  //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],141:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var ArgumentOutOfRangeError_1 = require('../util/ArgumentOutOfRangeError');
-var EmptyObservable_1 = require('../observable/EmptyObservable');
-/**
- * Emits only the first `count` values emitted by the source Observable.
- *
- * <span class="informal">Takes the first `count` values from the source, then
- * completes.</span>
- *
- * <img src="./img/take.png" width="100%">
- *
- * `take` returns an Observable that emits only the first `count` values emitted
- * by the source Observable. If the source emits fewer than `count` values then
- * all of its values are emitted. After that, it completes, regardless if the
- * source completes.
- *
- * @example <caption>Take the first 5 seconds of an infinite 1-second interval Observable</caption>
- * var interval = Rx.Observable.interval(1000);
- * var five = interval.take(5);
- * five.subscribe(x => console.log(x));
- *
- * @see {@link takeLast}
- * @see {@link takeUntil}
- * @see {@link takeWhile}
- * @see {@link skip}
- *
- * @throws {ArgumentOutOfRangeError} When using `take(i)`, it delivers an
- * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`.
- *
- * @param {number} count The maximum number of `next` values to emit.
- * @return {Observable<T>} An Observable that emits only the first `count`
- * values emitted by the source Observable, or all of the values from the source
- * if the source emits fewer than `count` values.
- * @method take
- * @owner Observable
+  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */
+  //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
+
+  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */
+  //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
+}
+
+
+/* ===========================================================================
+ * Check if the data type is TEXT or BINARY, using the following algorithm:
+ * - TEXT if the two conditions below are satisfied:
+ *    a) There are no non-portable control characters belonging to the
+ *       "black list" (0..6, 14..25, 28..31).
+ *    b) There is at least one printable character belonging to the
+ *       "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
+ * - BINARY otherwise.
+ * - The following partially-portable control characters form a
+ *   "gray list" that is ignored in this detection algorithm:
+ *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
+ * IN assertion: the fields Freq of dyn_ltree are set.
  */
-function take(count) {
-    if (count === 0) {
-        return new EmptyObservable_1.EmptyObservable();
+function detect_data_type(s) {
+  /* black_mask is the bit mask of black-listed bytes
+   * set bits 0..6, 14..25, and 28..31
+   * 0xf3ffc07f = binary 11110011111111111100000001111111
+   */
+  var black_mask = 0xf3ffc07f;
+  var n;
+
+  /* Check for non-textual ("black-listed") bytes. */
+  for (n = 0; n <= 31; n++, black_mask >>>= 1) {
+    if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {
+      return Z_BINARY;
     }
-    else {
-        return this.lift(new TakeOperator(count));
+  }
+
+  /* Check for textual ("white-listed") bytes. */
+  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||
+      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {
+    return Z_TEXT;
+  }
+  for (n = 32; n < LITERALS; n++) {
+    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {
+      return Z_TEXT;
     }
+  }
+
+  /* There are no "black-listed" or "white-listed" bytes:
+   * this stream either is empty or has tolerated ("gray-listed") bytes only.
+   */
+  return Z_BINARY;
 }
-exports.take = take;
-var TakeOperator = (function () {
-    function TakeOperator(total) {
-        this.total = total;
-        if (this.total < 0) {
-            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
-        }
-    }
-    TakeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TakeSubscriber(subscriber, this.total));
-    };
-    return TakeOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var TakeSubscriber = (function (_super) {
-    __extends(TakeSubscriber, _super);
-    function TakeSubscriber(destination, total) {
-        _super.call(this, destination);
-        this.total = total;
-        this.count = 0;
-    }
-    TakeSubscriber.prototype._next = function (value) {
-        var total = this.total;
-        var count = ++this.count;
-        if (count <= total) {
-            this.destination.next(value);
-            if (count === total) {
-                this.destination.complete();
-                this.unsubscribe();
-            }
-        }
-    };
-    return TakeSubscriber;
-}(Subscriber_1.Subscriber));
 
-},{"../Subscriber":36,"../observable/EmptyObservable":89,"../util/ArgumentOutOfRangeError":158}],142:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Emits the values emitted by the source Observable until a `notifier`
- * Observable emits a value.
- *
- * <span class="informal">Lets values pass until a second Observable,
- * `notifier`, emits something. Then, it completes.</span>
- *
- * <img src="./img/takeUntil.png" width="100%">
- *
- * `takeUntil` subscribes and begins mirroring the source Observable. It also
- * monitors a second Observable, `notifier` that you provide. If the `notifier`
- * emits a value or a complete notification, the output Observable stops
- * mirroring the source Observable and completes.
- *
- * @example <caption>Tick every second until the first click happens</caption>
- * var interval = Rx.Observable.interval(1000);
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = interval.takeUntil(clicks);
- * result.subscribe(x => console.log(x));
- *
- * @see {@link take}
- * @see {@link takeLast}
- * @see {@link takeWhile}
- * @see {@link skip}
- *
- * @param {Observable} notifier The Observable whose first emitted value will
- * cause the output Observable of `takeUntil` to stop emitting values from the
- * source Observable.
- * @return {Observable<T>} An Observable that emits the values from the source
- * Observable until such time as `notifier` emits its first value.
- * @method takeUntil
- * @owner Observable
+
+var static_init_done = false;
+
+/* ===========================================================================
+ * Initialize the tree data structures for a new zlib stream.
  */
-function takeUntil(notifier) {
-    return this.lift(new TakeUntilOperator(notifier));
+function _tr_init(s)
+{
+
+  if (!static_init_done) {
+    tr_static_init();
+    static_init_done = true;
+  }
+
+  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);
+  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);
+  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);
+
+  s.bi_buf = 0;
+  s.bi_valid = 0;
+
+  /* Initialize the first block of the first file: */
+  init_block(s);
 }
-exports.takeUntil = takeUntil;
-var TakeUntilOperator = (function () {
-    function TakeUntilOperator(notifier) {
-        this.notifier = notifier;
-    }
-    TakeUntilOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TakeUntilSubscriber(subscriber, this.notifier));
-    };
-    return TakeUntilOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
+
+
+/* ===========================================================================
+ * Send a stored block
  */
-var TakeUntilSubscriber = (function (_super) {
-    __extends(TakeUntilSubscriber, _super);
-    function TakeUntilSubscriber(destination, notifier) {
-        _super.call(this, destination);
-        this.notifier = notifier;
-        this.add(subscribeToResult_1.subscribeToResult(this, notifier));
-    }
-    TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.complete();
-    };
-    TakeUntilSubscriber.prototype.notifyComplete = function () {
-        // noop
-    };
-    return TakeUntilSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
+function _tr_stored_block(s, buf, stored_len, last)
+//DeflateState *s;
+//charf *buf;       /* input block */
+//ulg stored_len;   /* length of input block */
+//int last;         /* one if this is the last block for a file */
+{
+  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */
+  copy_block(s, buf, stored_len, true); /* with header */
+}
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],143:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-exports.defaultThrottleConfig = {
-    leading: true,
-    trailing: false
-};
-/**
- * Emits a value from the source Observable, then ignores subsequent source
- * values for a duration determined by another Observable, then repeats this
- * process.
- *
- * <span class="informal">It's like {@link throttleTime}, but the silencing
- * duration is determined by a second Observable.</span>
- *
- * <img src="./img/throttle.png" width="100%">
- *
- * `throttle` emits the source Observable values on the output Observable
- * when its internal timer is disabled, and ignores source values when the timer
- * is enabled. Initially, the timer is disabled. As soon as the first source
- * value arrives, it is forwarded to the output Observable, and then the timer
- * is enabled by calling the `durationSelector` function with the source value,
- * which returns the "duration" Observable. When the duration Observable emits a
- * value or completes, the timer is disabled, and this process repeats for the
- * next source value.
- *
- * @example <caption>Emit clicks at a rate of at most one click per second</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = clicks.throttle(ev => Rx.Observable.interval(1000));
- * result.subscribe(x => console.log(x));
- *
- * @see {@link audit}
- * @see {@link debounce}
- * @see {@link delayWhen}
- * @see {@link sample}
- * @see {@link throttleTime}
- *
- * @param {function(value: T): SubscribableOrPromise} durationSelector A function
- * that receives a value from the source Observable, for computing the silencing
- * duration for each source value, returned as an Observable or a Promise.
- * @param {Object} config a configuration object to define `leading` and `trailing` behavior. Defaults
- * to `{ leading: true, trailing: false }`.
- * @return {Observable<T>} An Observable that performs the throttle operation to
- * limit the rate of emissions from the source.
- * @method throttle
- * @owner Observable
+
+/* ===========================================================================
+ * Send one empty static block to give enough lookahead for inflate.
+ * This takes 10 bits, of which 7 may remain in the bit buffer.
  */
-function throttle(durationSelector, config) {
-    if (config === void 0) { config = exports.defaultThrottleConfig; }
-    return this.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing));
+function _tr_align(s) {
+  send_bits(s, STATIC_TREES << 1, 3);
+  send_code(s, END_BLOCK, static_ltree);
+  bi_flush(s);
 }
-exports.throttle = throttle;
-var ThrottleOperator = (function () {
-    function ThrottleOperator(durationSelector, leading, trailing) {
-        this.durationSelector = durationSelector;
-        this.leading = leading;
-        this.trailing = trailing;
+
+
+/* ===========================================================================
+ * Determine the best encoding for the current block: dynamic trees, static
+ * trees or store, and output the encoded block to the zip file.
+ */
+function _tr_flush_block(s, buf, stored_len, last)
+//DeflateState *s;
+//charf *buf;       /* input block, or NULL if too old */
+//ulg stored_len;   /* length of input block */
+//int last;         /* one if this is the last block for a file */
+{
+  var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */
+  var max_blindex = 0;        /* index of last bit length code of non zero freq */
+
+  /* Build the Huffman trees unless a stored block is forced */
+  if (s.level > 0) {
+
+    /* Check if the file is binary or text */
+    if (s.strm.data_type === Z_UNKNOWN) {
+      s.strm.data_type = detect_data_type(s);
     }
-    ThrottleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing));
-    };
-    return ThrottleOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc
- * @ignore
- * @extends {Ignored}
- */
-var ThrottleSubscriber = (function (_super) {
-    __extends(ThrottleSubscriber, _super);
-    function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) {
-        _super.call(this, destination);
-        this.destination = destination;
-        this.durationSelector = durationSelector;
-        this._leading = _leading;
-        this._trailing = _trailing;
-        this._hasTrailingValue = false;
-    }
-    ThrottleSubscriber.prototype._next = function (value) {
-        if (this.throttled) {
-            if (this._trailing) {
-                this._hasTrailingValue = true;
-                this._trailingValue = value;
-            }
-        }
-        else {
-            var duration = this.tryDurationSelector(value);
-            if (duration) {
-                this.add(this.throttled = subscribeToResult_1.subscribeToResult(this, duration));
-            }
-            if (this._leading) {
-                this.destination.next(value);
-                if (this._trailing) {
-                    this._hasTrailingValue = true;
-                    this._trailingValue = value;
-                }
-            }
-        }
-    };
-    ThrottleSubscriber.prototype.tryDurationSelector = function (value) {
-        try {
-            return this.durationSelector(value);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return null;
-        }
-    };
-    ThrottleSubscriber.prototype._unsubscribe = function () {
-        var _a = this, throttled = _a.throttled, _trailingValue = _a._trailingValue, _hasTrailingValue = _a._hasTrailingValue, _trailing = _a._trailing;
-        this._trailingValue = null;
-        this._hasTrailingValue = false;
-        if (throttled) {
-            this.remove(throttled);
-            this.throttled = null;
-            throttled.unsubscribe();
-        }
-    };
-    ThrottleSubscriber.prototype._sendTrailing = function () {
-        var _a = this, destination = _a.destination, throttled = _a.throttled, _trailing = _a._trailing, _trailingValue = _a._trailingValue, _hasTrailingValue = _a._hasTrailingValue;
-        if (throttled && _trailing && _hasTrailingValue) {
-            destination.next(_trailingValue);
-            this._trailingValue = null;
-            this._hasTrailingValue = false;
-        }
-    };
-    ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this._sendTrailing();
-        this._unsubscribe();
-    };
-    ThrottleSubscriber.prototype.notifyComplete = function () {
-        this._sendTrailing();
-        this._unsubscribe();
-    };
-    return ThrottleSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],144:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var async_1 = require('../scheduler/async');
-var throttle_1 = require('./throttle');
-/**
- * Emits a value from the source Observable, then ignores subsequent source
- * values for `duration` milliseconds, then repeats this process.
- *
- * <span class="informal">Lets a value pass, then ignores source values for the
- * next `duration` milliseconds.</span>
- *
- * <img src="./img/throttleTime.png" width="100%">
- *
- * `throttleTime` emits the source Observable values on the output Observable
- * when its internal timer is disabled, and ignores source values when the timer
- * is enabled. Initially, the timer is disabled. As soon as the first source
- * value arrives, it is forwarded to the output Observable, and then the timer
- * is enabled. After `duration` milliseconds (or the time unit determined
- * internally by the optional `scheduler`) has passed, the timer is disabled,
- * and this process repeats for the next source value. Optionally takes a
- * {@link IScheduler} for managing timers.
- *
- * @example <caption>Emit clicks at a rate of at most one click per second</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = clicks.throttleTime(1000);
- * result.subscribe(x => console.log(x));
- *
- * @see {@link auditTime}
- * @see {@link debounceTime}
- * @see {@link delay}
- * @see {@link sampleTime}
- * @see {@link throttle}
- *
- * @param {number} duration Time to wait before emitting another value after
- * emitting the last value, measured in milliseconds or the time unit determined
- * internally by the optional `scheduler`.
- * @param {Scheduler} [scheduler=async] The {@link IScheduler} to use for
- * managing the timers that handle the throttling.
- * @return {Observable<T>} An Observable that performs the throttle operation to
- * limit the rate of emissions from the source.
- * @method throttleTime
- * @owner Observable
+    /* Construct the literal and distance trees */
+    build_tree(s, s.l_desc);
+    // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
+    //        s->static_len));
+
+    build_tree(s, s.d_desc);
+    // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
+    //        s->static_len));
+    /* At this point, opt_len and static_len are the total bit lengths of
+     * the compressed block data, excluding the tree representations.
+     */
+
+    /* Build the bit length tree for the above two trees, and get the index
+     * in bl_order of the last bit length code to send.
+     */
+    max_blindex = build_bl_tree(s);
+
+    /* Determine the best encoding. Compute the block lengths in bytes. */
+    opt_lenb = (s.opt_len + 3 + 7) >>> 3;
+    static_lenb = (s.static_len + 3 + 7) >>> 3;
+
+    // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
+    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
+    //        s->last_lit));
+
+    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }
+
+  } else {
+    // Assert(buf != (char*)0, "lost buf");
+    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
+  }
+
+  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {
+    /* 4: two words for the lengths */
+
+    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
+     * Otherwise we can't have processed more than WSIZE input bytes since
+     * the last block flush, because compression would have been
+     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
+     * transform a block into a stored block.
+     */
+    _tr_stored_block(s, buf, stored_len, last);
+
+  } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {
+
+    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);
+    compress_block(s, static_ltree, static_dtree);
+
+  } else {
+    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);
+    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);
+    compress_block(s, s.dyn_ltree, s.dyn_dtree);
+  }
+  // Assert (s->compressed_len == s->bits_sent, "bad compressed size");
+  /* The above check is made mod 2^32, for files larger than 512 MB
+   * and uLong implemented on 32 bits.
+   */
+  init_block(s);
+
+  if (last) {
+    bi_windup(s);
+  }
+  // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
+  //       s->compressed_len-7*last));
+}
+
+/* ===========================================================================
+ * Save the match info and tally the frequency counts. Return true if
+ * the current block must be flushed.
  */
-function throttleTime(duration, scheduler, config) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    if (config === void 0) { config = throttle_1.defaultThrottleConfig; }
-    return this.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing));
+function _tr_tally(s, dist, lc)
+//    deflate_state *s;
+//    unsigned dist;  /* distance of matched string */
+//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */
+{
+  //var out_length, in_length, dcode;
+
+  s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;
+  s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;
+
+  s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;
+  s.last_lit++;
+
+  if (dist === 0) {
+    /* lc is the unmatched char */
+    s.dyn_ltree[lc * 2]/*.Freq*/++;
+  } else {
+    s.matches++;
+    /* Here, lc is the match length - MIN_MATCH */
+    dist--;             /* dist = match distance - 1 */
+    //Assert((ush)dist < (ush)MAX_DIST(s) &&
+    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
+    //       (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");
+
+    s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;
+    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;
+  }
+
+// (!) This block is disabled in zlib defaults,
+// don't enable it for binary compatibility
+
+//#ifdef TRUNCATE_BLOCK
+//  /* Try to guess if it is profitable to stop the current block here */
+//  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {
+//    /* Compute an upper bound for the compressed length */
+//    out_length = s.last_lit*8;
+//    in_length = s.strstart - s.block_start;
+//
+//    for (dcode = 0; dcode < D_CODES; dcode++) {
+//      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);
+//    }
+//    out_length >>>= 3;
+//    //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
+//    //       s->last_lit, in_length, out_length,
+//    //       100L - out_length*100L/in_length));
+//    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {
+//      return true;
+//    }
+//  }
+//#endif
+
+  return (s.last_lit === s.lit_bufsize - 1);
+  /* We avoid equality with lit_bufsize because of wraparound at 64K
+   * on 16 bit machines and because stored blocks are restricted to
+   * 64K-1 bytes.
+   */
 }
-exports.throttleTime = throttleTime;
-var ThrottleTimeOperator = (function () {
-    function ThrottleTimeOperator(duration, scheduler, leading, trailing) {
-        this.duration = duration;
-        this.scheduler = scheduler;
-        this.leading = leading;
-        this.trailing = trailing;
+
+exports._tr_init  = _tr_init;
+exports._tr_stored_block = _tr_stored_block;
+exports._tr_flush_block  = _tr_flush_block;
+exports._tr_tally = _tr_tally;
+exports._tr_align = _tr_align;
+
+},{"../utils/common":26}],38:[function(require,module,exports){
+'use strict';
+
+// (C) 1995-2013 Jean-loup Gailly and Mark Adler
+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+//   claim that you wrote the original software. If you use this software
+//   in a product, an acknowledgment in the product documentation would be
+//   appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+//   misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+
+function ZStream() {
+  /* next input byte */
+  this.input = null; // JS specific, because we have no pointers
+  this.next_in = 0;
+  /* number of bytes available at input */
+  this.avail_in = 0;
+  /* total number of input bytes read so far */
+  this.total_in = 0;
+  /* next output byte should be put there */
+  this.output = null; // JS specific, because we have no pointers
+  this.next_out = 0;
+  /* remaining free space at output */
+  this.avail_out = 0;
+  /* total number of bytes output so far */
+  this.total_out = 0;
+  /* last error message, NULL if no error */
+  this.msg = ''/*Z_NULL*/;
+  /* not visible by applications */
+  this.state = null;
+  /* best guess about the data type: binary or text */
+  this.data_type = 2/*Z_UNKNOWN*/;
+  /* adler32 value of the uncompressed data */
+  this.adler = 0;
+}
+
+module.exports = ZStream;
+
+},{}],39:[function(require,module,exports){
+(function (process){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// resolves . and .. elements in a path array with directory names there
+// must be no slashes, empty elements, or device names (c:\) in the array
+// (so also no leading and trailing slashes - it does not distinguish
+// relative and absolute paths)
+function normalizeArray(parts, allowAboveRoot) {
+  // if the path tries to go above the root, `up` ends up > 0
+  var up = 0;
+  for (var i = parts.length - 1; i >= 0; i--) {
+    var last = parts[i];
+    if (last === '.') {
+      parts.splice(i, 1);
+    } else if (last === '..') {
+      parts.splice(i, 1);
+      up++;
+    } else if (up) {
+      parts.splice(i, 1);
+      up--;
     }
-    ThrottleTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing));
-    };
-    return ThrottleTimeOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var ThrottleTimeSubscriber = (function (_super) {
-    __extends(ThrottleTimeSubscriber, _super);
-    function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) {
-        _super.call(this, destination);
-        this.duration = duration;
-        this.scheduler = scheduler;
-        this.leading = leading;
-        this.trailing = trailing;
-        this._hasTrailingValue = false;
-        this._trailingValue = null;
+  }
+
+  // if the path is allowed to go above the root, restore leading ..s
+  if (allowAboveRoot) {
+    for (; up--; up) {
+      parts.unshift('..');
     }
-    ThrottleTimeSubscriber.prototype._next = function (value) {
-        if (this.throttled) {
-            if (this.trailing) {
-                this._trailingValue = value;
-                this._hasTrailingValue = true;
-            }
-        }
-        else {
-            this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));
-            if (this.leading) {
-                this.destination.next(value);
-            }
-        }
-    };
-    ThrottleTimeSubscriber.prototype.clearThrottle = function () {
-        var throttled = this.throttled;
-        if (throttled) {
-            if (this.trailing && this._hasTrailingValue) {
-                this.destination.next(this._trailingValue);
-                this._trailingValue = null;
-                this._hasTrailingValue = false;
-            }
-            throttled.unsubscribe();
-            this.remove(throttled);
-            this.throttled = null;
-        }
-    };
-    return ThrottleTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchNext(arg) {
-    var subscriber = arg.subscriber;
-    subscriber.clearThrottle();
+  }
+
+  return parts;
 }
 
-},{"../Subscriber":36,"../scheduler/async":152,"./throttle":143}],145:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+// Split a filename into [root, dir, basename, ext], unix version
+// 'root' is just a slash, or nothing.
+var splitPathRe =
+    /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
+var splitPath = function(filename) {
+  return splitPathRe.exec(filename).slice(1);
 };
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/* tslint:enable:max-line-length */
-/**
- * Combines the source Observable with other Observables to create an Observable
- * whose values are calculated from the latest values of each, only when the
- * source emits.
- *
- * <span class="informal">Whenever the source Observable emits a value, it
- * computes a formula using that value plus the latest values from other input
- * Observables, then emits the output of that formula.</span>
- *
- * <img src="./img/withLatestFrom.png" width="100%">
- *
- * `withLatestFrom` combines each value from the source Observable (the
- * instance) with the latest values from the other input Observables only when
- * the source emits a value, optionally using a `project` function to determine
- * the value to be emitted on the output Observable. All input Observables must
- * emit at least one value before the output Observable will emit a value.
- *
- * @example <caption>On every click event, emit an array with the latest timer event plus the click event</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var timer = Rx.Observable.interval(1000);
- * var result = clicks.withLatestFrom(timer);
- * result.subscribe(x => console.log(x));
- *
- * @see {@link combineLatest}
- *
- * @param {ObservableInput} other An input Observable to combine with the source
- * Observable. More than one input Observables may be given as argument.
- * @param {Function} [project] Projection function for combining values
- * together. Receives all values in order of the Observables passed, where the
- * first parameter is a value from the source Observable. (e.g.
- * `a.withLatestFrom(b, c, (a1, b1, c1) => a1 + b1 + c1)`). If this is not
- * passed, arrays will be emitted on the output Observable.
- * @return {Observable} An Observable of projected values from the most recent
- * values from each input Observable, or an array of the most recent values from
- * each input Observable.
- * @method withLatestFrom
- * @owner Observable
- */
-function withLatestFrom() {
-    var args = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        args[_i - 0] = arguments[_i];
+
+// path.resolve([from ...], to)
+// posix version
+exports.resolve = function() {
+  var resolvedPath = '',
+      resolvedAbsolute = false;
+
+  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
+    var path = (i >= 0) ? arguments[i] : process.cwd();
+
+    // Skip empty and invalid entries
+    if (typeof path !== 'string') {
+      throw new TypeError('Arguments to path.resolve must be strings');
+    } else if (!path) {
+      continue;
+    }
+
+    resolvedPath = path + '/' + resolvedPath;
+    resolvedAbsolute = path.charAt(0) === '/';
+  }
+
+  // At this point the path should be resolved to a full absolute path, but
+  // handle relative paths to be safe (might happen when process.cwd() fails)
+
+  // Normalize the path
+  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
+    return !!p;
+  }), !resolvedAbsolute).join('/');
+
+  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
+};
+
+// path.normalize(path)
+// posix version
+exports.normalize = function(path) {
+  var isAbsolute = exports.isAbsolute(path),
+      trailingSlash = substr(path, -1) === '/';
+
+  // Normalize the path
+  path = normalizeArray(filter(path.split('/'), function(p) {
+    return !!p;
+  }), !isAbsolute).join('/');
+
+  if (!path && !isAbsolute) {
+    path = '.';
+  }
+  if (path && trailingSlash) {
+    path += '/';
+  }
+
+  return (isAbsolute ? '/' : '') + path;
+};
+
+// posix version
+exports.isAbsolute = function(path) {
+  return path.charAt(0) === '/';
+};
+
+// posix version
+exports.join = function() {
+  var paths = Array.prototype.slice.call(arguments, 0);
+  return exports.normalize(filter(paths, function(p, index) {
+    if (typeof p !== 'string') {
+      throw new TypeError('Arguments to path.join must be strings');
     }
-    var project;
-    if (typeof args[args.length - 1] === 'function') {
-        project = args.pop();
+    return p;
+  }).join('/'));
+};
+
+
+// path.relative(from, to)
+// posix version
+exports.relative = function(from, to) {
+  from = exports.resolve(from).substr(1);
+  to = exports.resolve(to).substr(1);
+
+  function trim(arr) {
+    var start = 0;
+    for (; start < arr.length; start++) {
+      if (arr[start] !== '') break;
     }
-    var observables = args;
-    return this.lift(new WithLatestFromOperator(observables, project));
-}
-exports.withLatestFrom = withLatestFrom;
-var WithLatestFromOperator = (function () {
-    function WithLatestFromOperator(observables, project) {
-        this.observables = observables;
-        this.project = project;
+
+    var end = arr.length - 1;
+    for (; end >= 0; end--) {
+      if (arr[end] !== '') break;
     }
-    WithLatestFromOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));
-    };
-    return WithLatestFromOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var WithLatestFromSubscriber = (function (_super) {
-    __extends(WithLatestFromSubscriber, _super);
-    function WithLatestFromSubscriber(destination, observables, project) {
-        _super.call(this, destination);
-        this.observables = observables;
-        this.project = project;
-        this.toRespond = [];
-        var len = observables.length;
-        this.values = new Array(len);
-        for (var i = 0; i < len; i++) {
-            this.toRespond.push(i);
-        }
-        for (var i = 0; i < len; i++) {
-            var observable = observables[i];
-            this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));
-        }
+
+    if (start > end) return [];
+    return arr.slice(start, end - start + 1);
+  }
+
+  var fromParts = trim(from.split('/'));
+  var toParts = trim(to.split('/'));
+
+  var length = Math.min(fromParts.length, toParts.length);
+  var samePartsLength = length;
+  for (var i = 0; i < length; i++) {
+    if (fromParts[i] !== toParts[i]) {
+      samePartsLength = i;
+      break;
     }
-    WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.values[outerIndex] = innerValue;
-        var toRespond = this.toRespond;
-        if (toRespond.length > 0) {
-            var found = toRespond.indexOf(outerIndex);
-            if (found !== -1) {
-                toRespond.splice(found, 1);
-            }
-        }
-    };
-    WithLatestFromSubscriber.prototype.notifyComplete = function () {
-        // noop
-    };
-    WithLatestFromSubscriber.prototype._next = function (value) {
-        if (this.toRespond.length === 0) {
-            var args = [value].concat(this.values);
-            if (this.project) {
-                this._tryProject(args);
-            }
-            else {
-                this.destination.next(args);
-            }
-        }
-    };
-    WithLatestFromSubscriber.prototype._tryProject = function (args) {
-        var result;
-        try {
-            result = this.project.apply(this, args);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return WithLatestFromSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
+  }
 
-},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],146:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+  var outputParts = [];
+  for (var i = samePartsLength; i < fromParts.length; i++) {
+    outputParts.push('..');
+  }
+
+  outputParts = outputParts.concat(toParts.slice(samePartsLength));
+
+  return outputParts.join('/');
 };
-var ArrayObservable_1 = require('../observable/ArrayObservable');
-var isArray_1 = require('../util/isArray');
-var Subscriber_1 = require('../Subscriber');
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-var iterator_1 = require('../symbol/iterator');
-/* tslint:enable:max-line-length */
-/**
- * @param observables
- * @return {Observable<R>}
- * @method zip
- * @owner Observable
- */
-function zipProto() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
+
+exports.sep = '/';
+exports.delimiter = ':';
+
+exports.dirname = function(path) {
+  var result = splitPath(path),
+      root = result[0],
+      dir = result[1];
+
+  if (!root && !dir) {
+    // No dirname whatsoever
+    return '.';
+  }
+
+  if (dir) {
+    // It has a dirname, strip trailing slash
+    dir = dir.substr(0, dir.length - 1);
+  }
+
+  return root + dir;
+};
+
+
+exports.basename = function(path, ext) {
+  var f = splitPath(path)[2];
+  // TODO: make this comparison case-insensitive on windows?
+  if (ext && f.substr(-1 * ext.length) === ext) {
+    f = f.substr(0, f.length - ext.length);
+  }
+  return f;
+};
+
+
+exports.extname = function(path) {
+  return splitPath(path)[3];
+};
+
+function filter (xs, f) {
+    if (xs.filter) return xs.filter(f);
+    var res = [];
+    for (var i = 0; i < xs.length; i++) {
+        if (f(xs[i], i, xs)) res.push(xs[i]);
     }
-    return this.lift.call(zipStatic.apply(void 0, [this].concat(observables)));
+    return res;
 }
-exports.zipProto = zipProto;
-/* tslint:enable:max-line-length */
-/**
- * Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each
- * of its input Observables.
- *
- * If the latest parameter is a function, this function is used to compute the created value from the input values.
- * Otherwise, an array of the input values is returned.
- *
- * @example <caption>Combine age and name from different sources</caption>
- *
- * let age$ = Observable.of<number>(27, 25, 29);
- * let name$ = Observable.of<string>('Foo', 'Bar', 'Beer');
- * let isDev$ = Observable.of<boolean>(true, true, false);
- *
- * Observable
- *     .zip(age$,
- *          name$,
- *          isDev$,
- *          (age: number, name: string, isDev: boolean) => ({ age, name, isDev }))
- *     .subscribe(x => console.log(x));
- *
- * // outputs
- * // { age: 27, name: 'Foo', isDev: true }
- * // { age: 25, name: 'Bar', isDev: true }
- * // { age: 29, name: 'Beer', isDev: false }
- *
- * @param observables
- * @return {Observable<R>}
- * @static true
- * @name zip
- * @owner Observable
- */
-function zipStatic() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
-    }
-    var project = observables[observables.length - 1];
-    if (typeof project === 'function') {
-        observables.pop();
+
+// String.prototype.substr - negative index don't work in IE8
+var substr = 'ab'.substr(-1) === 'b'
+    ? function (str, start, len) { return str.substr(start, len) }
+    : function (str, start, len) {
+        if (start < 0) start = str.length + start;
+        return str.substr(start, len);
     }
-    return new ArrayObservable_1.ArrayObservable(observables).lift(new ZipOperator(project));
+;
+
+}).call(this,require('_process'))
+
+},{"_process":7}],40:[function(require,module,exports){
+'use strict';
+
+module.exports = Pbf;
+
+var ieee754 = require('ieee754');
+
+function Pbf(buf) {
+    this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
+    this.pos = 0;
+    this.type = 0;
+    this.length = this.buf.length;
 }
-exports.zipStatic = zipStatic;
-var ZipOperator = (function () {
-    function ZipOperator(project) {
-        this.project = project;
-    }
-    ZipOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ZipSubscriber(subscriber, this.project));
-    };
-    return ZipOperator;
-}());
-exports.ZipOperator = ZipOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var ZipSubscriber = (function (_super) {
-    __extends(ZipSubscriber, _super);
-    function ZipSubscriber(destination, project, values) {
-        if (values === void 0) { values = Object.create(null); }
-        _super.call(this, destination);
-        this.iterators = [];
-        this.active = 0;
-        this.project = (typeof project === 'function') ? project : null;
-        this.values = values;
-    }
-    ZipSubscriber.prototype._next = function (value) {
-        var iterators = this.iterators;
-        if (isArray_1.isArray(value)) {
-            iterators.push(new StaticArrayIterator(value));
-        }
-        else if (typeof value[iterator_1.iterator] === 'function') {
-            iterators.push(new StaticIterator(value[iterator_1.iterator]()));
-        }
-        else {
-            iterators.push(new ZipBufferIterator(this.destination, this, value));
-        }
-    };
-    ZipSubscriber.prototype._complete = function () {
-        var iterators = this.iterators;
-        var len = iterators.length;
-        if (len === 0) {
-            this.destination.complete();
-            return;
+
+Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
+Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
+Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
+Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
+
+var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
+    SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
+
+// Threshold chosen based on both benchmarking and knowledge about browser string
+// data structures (which currently switch structure types at 12 bytes or more)
+var TEXT_DECODER_MIN_LENGTH = 12;
+var utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf8');
+
+Pbf.prototype = {
+
+    destroy: function() {
+        this.buf = null;
+    },
+
+    // === READING =================================================================
+
+    readFields: function(readField, result, end) {
+        end = end || this.length;
+
+        while (this.pos < end) {
+            var val = this.readVarint(),
+                tag = val >> 3,
+                startPos = this.pos;
+
+            this.type = val & 0x7;
+            readField(tag, result, this);
+
+            if (this.pos === startPos) this.skip(val);
         }
-        this.active = len;
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            if (iterator.stillUnsubscribed) {
-                this.add(iterator.subscribe(iterator, i));
-            }
-            else {
-                this.active--; // not an observable
-            }
-        }
-    };
-    ZipSubscriber.prototype.notifyInactive = function () {
-        this.active--;
-        if (this.active === 0) {
-            this.destination.complete();
-        }
-    };
-    ZipSubscriber.prototype.checkIterators = function () {
-        var iterators = this.iterators;
-        var len = iterators.length;
-        var destination = this.destination;
-        // abort if not all of them have values
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {
-                return;
-            }
-        }
-        var shouldComplete = false;
-        var args = [];
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            var result = iterator.next();
-            // check to see if it's completed now that you've gotten
-            // the next value.
-            if (iterator.hasCompleted()) {
-                shouldComplete = true;
-            }
-            if (result.done) {
-                destination.complete();
-                return;
-            }
-            args.push(result.value);
-        }
-        if (this.project) {
-            this._tryProject(args);
-        }
-        else {
-            destination.next(args);
-        }
-        if (shouldComplete) {
-            destination.complete();
-        }
-    };
-    ZipSubscriber.prototype._tryProject = function (args) {
-        var result;
-        try {
-            result = this.project.apply(this, args);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return ZipSubscriber;
-}(Subscriber_1.Subscriber));
-exports.ZipSubscriber = ZipSubscriber;
-var StaticIterator = (function () {
-    function StaticIterator(iterator) {
-        this.iterator = iterator;
-        this.nextResult = iterator.next();
-    }
-    StaticIterator.prototype.hasValue = function () {
-        return true;
-    };
-    StaticIterator.prototype.next = function () {
-        var result = this.nextResult;
-        this.nextResult = this.iterator.next();
         return result;
-    };
-    StaticIterator.prototype.hasCompleted = function () {
-        var nextResult = this.nextResult;
-        return nextResult && nextResult.done;
-    };
-    return StaticIterator;
-}());
-var StaticArrayIterator = (function () {
-    function StaticArrayIterator(array) {
-        this.array = array;
-        this.index = 0;
-        this.length = 0;
-        this.length = array.length;
-    }
-    StaticArrayIterator.prototype[iterator_1.iterator] = function () {
-        return this;
-    };
-    StaticArrayIterator.prototype.next = function (value) {
-        var i = this.index++;
-        var array = this.array;
-        return i < this.length ? { value: array[i], done: false } : { value: null, done: true };
-    };
-    StaticArrayIterator.prototype.hasValue = function () {
-        return this.array.length > this.index;
-    };
-    StaticArrayIterator.prototype.hasCompleted = function () {
-        return this.array.length === this.index;
-    };
-    return StaticArrayIterator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var ZipBufferIterator = (function (_super) {
-    __extends(ZipBufferIterator, _super);
-    function ZipBufferIterator(destination, parent, observable) {
-        _super.call(this, destination);
-        this.parent = parent;
-        this.observable = observable;
-        this.stillUnsubscribed = true;
-        this.buffer = [];
-        this.isComplete = false;
-    }
-    ZipBufferIterator.prototype[iterator_1.iterator] = function () {
-        return this;
-    };
-    // NOTE: there is actually a name collision here with Subscriber.next and Iterator.next
-    //    this is legit because `next()` will never be called by a subscription in this case.
-    ZipBufferIterator.prototype.next = function () {
-        var buffer = this.buffer;
-        if (buffer.length === 0 && this.isComplete) {
-            return { value: null, done: true };
-        }
-        else {
-            return { value: buffer.shift(), done: false };
-        }
-    };
-    ZipBufferIterator.prototype.hasValue = function () {
-        return this.buffer.length > 0;
-    };
-    ZipBufferIterator.prototype.hasCompleted = function () {
-        return this.buffer.length === 0 && this.isComplete;
-    };
-    ZipBufferIterator.prototype.notifyComplete = function () {
-        if (this.buffer.length > 0) {
-            this.isComplete = true;
-            this.parent.notifyInactive();
-        }
-        else {
-            this.destination.complete();
-        }
-    };
-    ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.buffer.push(innerValue);
-        this.parent.checkIterators();
-    };
-    ZipBufferIterator.prototype.subscribe = function (value, index) {
-        return subscribeToResult_1.subscribeToResult(this, this.observable, this, index);
-    };
-    return ZipBufferIterator;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":31,"../Subscriber":36,"../observable/ArrayObservable":86,"../symbol/iterator":154,"../util/isArray":164,"../util/subscribeToResult":173}],147:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscription_1 = require('../Subscription');
-/**
- * A unit of work to be executed in a {@link Scheduler}. An action is typically
- * created from within a Scheduler and an RxJS user does not need to concern
- * themselves about creating and manipulating an Action.
- *
- * ```ts
- * class Action<T> extends Subscription {
- *   new (scheduler: Scheduler, work: (state?: T) => void);
- *   schedule(state?: T, delay: number = 0): Subscription;
- * }
- * ```
- *
- * @class Action<T>
- */
-var Action = (function (_super) {
-    __extends(Action, _super);
-    function Action(scheduler, work) {
-        _super.call(this);
-    }
-    /**
-     * Schedules this action on its parent Scheduler for execution. May be passed
-     * some context object, `state`. May happen at some point in the future,
-     * according to the `delay` parameter, if specified.
-     * @param {T} [state] Some contextual data that the `work` function uses when
-     * called by the Scheduler.
-     * @param {number} [delay] Time to wait before executing the work, where the
-     * time unit is implicit and defined by the Scheduler.
-     * @return {void}
-     */
-    Action.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        return this;
-    };
-    return Action;
-}(Subscription_1.Subscription));
-exports.Action = Action;
-
-},{"../Subscription":37}],148:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var root_1 = require('../util/root');
-var Action_1 = require('./Action');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var AsyncAction = (function (_super) {
-    __extends(AsyncAction, _super);
-    function AsyncAction(scheduler, work) {
-        _super.call(this, scheduler, work);
-        this.scheduler = scheduler;
-        this.work = work;
-        this.pending = false;
-    }
-    AsyncAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (this.closed) {
-            return this;
-        }
-        // Always replace the current state with the new state.
-        this.state = state;
-        // Set the pending flag indicating that this action has been scheduled, or
-        // has recursively rescheduled itself.
-        this.pending = true;
-        var id = this.id;
-        var scheduler = this.scheduler;
-        //
-        // Important implementation note:
-        //
-        // Actions only execute once by default, unless rescheduled from within the
-        // scheduled callback. This allows us to implement single and repeat
-        // actions via the same code path, without adding API surface area, as well
-        // as mimic traditional recursion but across asynchronous boundaries.
-        //
-        // However, JS runtimes and timers distinguish between intervals achieved by
-        // serial `setTimeout` calls vs. a single `setInterval` call. An interval of
-        // serial `setTimeout` calls can be individually delayed, which delays
-        // scheduling the next `setTimeout`, and so on. `setInterval` attempts to
-        // guarantee the interval callback will be invoked more precisely to the
-        // interval period, regardless of load.
-        //
-        // Therefore, we use `setInterval` to schedule single and repeat actions.
-        // If the action reschedules itself with the same delay, the interval is not
-        // canceled. If the action doesn't reschedule, or reschedules with a
-        // different delay, the interval will be canceled after scheduled callback
-        // execution.
-        //
-        if (id != null) {
-            this.id = this.recycleAsyncId(scheduler, id, delay);
-        }
-        this.delay = delay;
-        // If this action has already an async Id, don't request a new one.
-        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
-        return this;
-    };
-    AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        return root_1.root.setInterval(scheduler.flush.bind(scheduler, this), delay);
-    };
-    AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        // If this action is rescheduled with the same delay time, don't clear the interval id.
-        if (delay !== null && this.delay === delay && this.pending === false) {
-            return id;
-        }
-        // Otherwise, if the action's delay time is different from the current delay,
-        // or the action has been rescheduled before it's executed, clear the interval id
-        return root_1.root.clearInterval(id) && undefined || undefined;
-    };
-    /**
-     * Immediately executes this action and the `work` it contains.
-     * @return {any}
-     */
-    AsyncAction.prototype.execute = function (state, delay) {
-        if (this.closed) {
-            return new Error('executing a cancelled action');
-        }
-        this.pending = false;
-        var error = this._execute(state, delay);
-        if (error) {
-            return error;
-        }
-        else if (this.pending === false && this.id != null) {
-            // Dequeue if the action didn't reschedule itself. Don't call
-            // unsubscribe(), because the action could reschedule later.
-            // For example:
-            // ```
-            // scheduler.schedule(function doWork(counter) {
-            //   /* ... I'm a busy worker bee ... */
-            //   var originalAction = this;
-            //   /* wait 100ms before rescheduling the action */
-            //   setTimeout(function () {
-            //     originalAction.schedule(counter + 1);
-            //   }, 100);
-            // }, 1000);
-            // ```
-            this.id = this.recycleAsyncId(this.scheduler, this.id, null);
-        }
-    };
-    AsyncAction.prototype._execute = function (state, delay) {
-        var errored = false;
-        var errorValue = undefined;
-        try {
-            this.work(state);
-        }
-        catch (e) {
-            errored = true;
-            errorValue = !!e && e || new Error(e);
-        }
-        if (errored) {
-            this.unsubscribe();
-            return errorValue;
-        }
-    };
-    AsyncAction.prototype._unsubscribe = function () {
-        var id = this.id;
-        var scheduler = this.scheduler;
-        var actions = scheduler.actions;
-        var index = actions.indexOf(this);
-        this.work = null;
-        this.state = null;
-        this.pending = false;
-        this.scheduler = null;
-        if (index !== -1) {
-            actions.splice(index, 1);
-        }
-        if (id != null) {
-            this.id = this.recycleAsyncId(scheduler, id, null);
-        }
-        this.delay = null;
-    };
-    return AsyncAction;
-}(Action_1.Action));
-exports.AsyncAction = AsyncAction;
+    },
 
-},{"../util/root":172,"./Action":147}],149:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Scheduler_1 = require('../Scheduler');
-var AsyncScheduler = (function (_super) {
-    __extends(AsyncScheduler, _super);
-    function AsyncScheduler() {
-        _super.apply(this, arguments);
-        this.actions = [];
-        /**
-         * A flag to indicate whether the Scheduler is currently executing a batch of
-         * queued actions.
-         * @type {boolean}
-         */
-        this.active = false;
-        /**
-         * An internal ID used to track the latest asynchronous task such as those
-         * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and
-         * others.
-         * @type {any}
-         */
-        this.scheduled = undefined;
-    }
-    AsyncScheduler.prototype.flush = function (action) {
-        var actions = this.actions;
-        if (this.active) {
-            actions.push(action);
-            return;
-        }
-        var error;
-        this.active = true;
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (action = actions.shift()); // exhaust the scheduler queue
-        this.active = false;
-        if (error) {
-            while (action = actions.shift()) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    return AsyncScheduler;
-}(Scheduler_1.Scheduler));
-exports.AsyncScheduler = AsyncScheduler;
+    readMessage: function(readField, result) {
+        return this.readFields(readField, result, this.readVarint() + this.pos);
+    },
 
-},{"../Scheduler":33}],150:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var AsyncAction_1 = require('./AsyncAction');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var QueueAction = (function (_super) {
-    __extends(QueueAction, _super);
-    function QueueAction(scheduler, work) {
-        _super.call(this, scheduler, work);
-        this.scheduler = scheduler;
-        this.work = work;
-    }
-    QueueAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (delay > 0) {
-            return _super.prototype.schedule.call(this, state, delay);
-        }
-        this.delay = delay;
-        this.state = state;
-        this.scheduler.flush(this);
-        return this;
-    };
-    QueueAction.prototype.execute = function (state, delay) {
-        return (delay > 0 || this.closed) ?
-            _super.prototype.execute.call(this, state, delay) :
-            this._execute(state, delay);
-    };
-    QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        // If delay exists and is greater than 0, or if the delay is null (the
-        // action wasn't rescheduled) but was originally scheduled as an async
-        // action, then recycle as an async action.
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-        }
-        // Otherwise flush the scheduler starting with this action.
-        return scheduler.flush(this);
-    };
-    return QueueAction;
-}(AsyncAction_1.AsyncAction));
-exports.QueueAction = QueueAction;
+    readFixed32: function() {
+        var val = readUInt32(this.buf, this.pos);
+        this.pos += 4;
+        return val;
+    },
 
-},{"./AsyncAction":148}],151:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var AsyncScheduler_1 = require('./AsyncScheduler');
-var QueueScheduler = (function (_super) {
-    __extends(QueueScheduler, _super);
-    function QueueScheduler() {
-        _super.apply(this, arguments);
-    }
-    return QueueScheduler;
-}(AsyncScheduler_1.AsyncScheduler));
-exports.QueueScheduler = QueueScheduler;
+    readSFixed32: function() {
+        var val = readInt32(this.buf, this.pos);
+        this.pos += 4;
+        return val;
+    },
 
-},{"./AsyncScheduler":149}],152:[function(require,module,exports){
-"use strict";
-var AsyncAction_1 = require('./AsyncAction');
-var AsyncScheduler_1 = require('./AsyncScheduler');
-/**
- *
- * Async Scheduler
- *
- * <span class="informal">Schedule task as if you used setTimeout(task, duration)</span>
- *
- * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript
- * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating
- * in intervals.
- *
- * If you just want to "defer" task, that is to perform it right after currently
- * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),
- * better choice will be the {@link asap} scheduler.
- *
- * @example <caption>Use async scheduler to delay task</caption>
- * const task = () => console.log('it works!');
- *
- * Rx.Scheduler.async.schedule(task, 2000);
- *
- * // After 2 seconds logs:
- * // "it works!"
- *
- *
- * @example <caption>Use async scheduler to repeat task in intervals</caption>
- * function task(state) {
- *   console.log(state);
- *   this.schedule(state + 1, 1000); // `this` references currently executing Action,
- *                                   // which we reschedule with new state and delay
- * }
- *
- * Rx.Scheduler.async.schedule(task, 3000, 0);
- *
- * // Logs:
- * // 0 after 3s
- * // 1 after 4s
- * // 2 after 5s
- * // 3 after 6s
- *
- * @static true
- * @name async
- * @owner Scheduler
- */
-exports.async = new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction);
+    // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
 
-},{"./AsyncAction":148,"./AsyncScheduler":149}],153:[function(require,module,exports){
-"use strict";
-var QueueAction_1 = require('./QueueAction');
-var QueueScheduler_1 = require('./QueueScheduler');
-/**
- *
- * Queue Scheduler
- *
- * <span class="informal">Put every next task on a queue, instead of executing it immediately</span>
- *
- * `queue` scheduler, when used with delay, behaves the same as {@link async} scheduler.
- *
- * When used without delay, it schedules given task synchronously - executes it right when
- * it is scheduled. However when called recursively, that is when inside the scheduled task,
- * another task is scheduled with queue scheduler, instead of executing immediately as well,
- * that task will be put on a queue and wait for current one to finish.
- *
- * This means that when you execute task with `queue` scheduler, you are sure it will end
- * before any other task scheduled with that scheduler will start.
- *
- * @examples <caption>Schedule recursively first, then do something</caption>
- *
- * Rx.Scheduler.queue.schedule(() => {
- *   Rx.Scheduler.queue.schedule(() => console.log('second')); // will not happen now, but will be put on a queue
- *
- *   console.log('first');
- * });
- *
- * // Logs:
- * // "first"
- * // "second"
- *
- *
- * @example <caption>Reschedule itself recursively</caption>
- *
- * Rx.Scheduler.queue.schedule(function(state) {
- *   if (state !== 0) {
- *     console.log('before', state);
- *     this.schedule(state - 1); // `this` references currently executing Action,
- *                               // which we reschedule with new state
- *     console.log('after', state);
- *   }
- * }, 0, 3);
- *
- * // In scheduler that runs recursively, you would expect:
- * // "before", 3
- * // "before", 2
- * // "before", 1
- * // "after", 1
- * // "after", 2
- * // "after", 3
- *
- * // But with queue it logs:
- * // "before", 3
- * // "after", 3
- * // "before", 2
- * // "after", 2
- * // "before", 1
- * // "after", 1
- *
- *
- * @static true
- * @name queue
- * @owner Scheduler
- */
-exports.queue = new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction);
+    readFixed64: function() {
+        var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
+        this.pos += 8;
+        return val;
+    },
 
-},{"./QueueAction":150,"./QueueScheduler":151}],154:[function(require,module,exports){
-"use strict";
-var root_1 = require('../util/root');
-function symbolIteratorPonyfill(root) {
-    var Symbol = root.Symbol;
-    if (typeof Symbol === 'function') {
-        if (!Symbol.iterator) {
-            Symbol.iterator = Symbol('iterator polyfill');
-        }
-        return Symbol.iterator;
-    }
-    else {
-        // [for Mozilla Gecko 27-35:](https://mzl.la/2ewE1zC)
-        var Set_1 = root.Set;
-        if (Set_1 && typeof new Set_1()['@@iterator'] === 'function') {
-            return '@@iterator';
-        }
-        var Map_1 = root.Map;
-        // required for compatability with es6-shim
-        if (Map_1) {
-            var keys = Object.getOwnPropertyNames(Map_1.prototype);
-            for (var i = 0; i < keys.length; ++i) {
-                var key = keys[i];
-                // according to spec, Map.prototype[@@iterator] and Map.orototype.entries must be equal.
-                if (key !== 'entries' && key !== 'size' && Map_1.prototype[key] === Map_1.prototype['entries']) {
-                    return key;
-                }
-            }
-        }
-        return '@@iterator';
-    }
-}
-exports.symbolIteratorPonyfill = symbolIteratorPonyfill;
-exports.iterator = symbolIteratorPonyfill(root_1.root);
-/**
- * @deprecated use iterator instead
- */
-exports.$$iterator = exports.iterator;
+    readSFixed64: function() {
+        var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
+        this.pos += 8;
+        return val;
+    },
 
-},{"../util/root":172}],155:[function(require,module,exports){
-"use strict";
-var root_1 = require('../util/root');
-function getSymbolObservable(context) {
-    var $$observable;
-    var Symbol = context.Symbol;
-    if (typeof Symbol === 'function') {
-        if (Symbol.observable) {
-            $$observable = Symbol.observable;
-        }
-        else {
-            $$observable = Symbol('observable');
-            Symbol.observable = $$observable;
-        }
-    }
-    else {
-        $$observable = '@@observable';
-    }
-    return $$observable;
-}
-exports.getSymbolObservable = getSymbolObservable;
-exports.observable = getSymbolObservable(root_1.root);
-/**
- * @deprecated use observable instead
- */
-exports.$$observable = exports.observable;
+    readFloat: function() {
+        var val = ieee754.read(this.buf, this.pos, true, 23, 4);
+        this.pos += 4;
+        return val;
+    },
 
-},{"../util/root":172}],156:[function(require,module,exports){
-"use strict";
-var root_1 = require('../util/root');
-var Symbol = root_1.root.Symbol;
-exports.rxSubscriber = (typeof Symbol === 'function' && typeof Symbol.for === 'function') ?
-    Symbol.for('rxSubscriber') : '@@rxSubscriber';
-/**
- * @deprecated use rxSubscriber instead
- */
-exports.$$rxSubscriber = exports.rxSubscriber;
+    readDouble: function() {
+        var val = ieee754.read(this.buf, this.pos, true, 52, 8);
+        this.pos += 8;
+        return val;
+    },
 
-},{"../util/root":172}],157:[function(require,module,exports){
-"use strict";
-var root_1 = require('./root');
-var RequestAnimationFrameDefinition = (function () {
-    function RequestAnimationFrameDefinition(root) {
-        if (root.requestAnimationFrame) {
-            this.cancelAnimationFrame = root.cancelAnimationFrame.bind(root);
-            this.requestAnimationFrame = root.requestAnimationFrame.bind(root);
-        }
-        else if (root.mozRequestAnimationFrame) {
-            this.cancelAnimationFrame = root.mozCancelAnimationFrame.bind(root);
-            this.requestAnimationFrame = root.mozRequestAnimationFrame.bind(root);
-        }
-        else if (root.webkitRequestAnimationFrame) {
-            this.cancelAnimationFrame = root.webkitCancelAnimationFrame.bind(root);
-            this.requestAnimationFrame = root.webkitRequestAnimationFrame.bind(root);
-        }
-        else if (root.msRequestAnimationFrame) {
-            this.cancelAnimationFrame = root.msCancelAnimationFrame.bind(root);
-            this.requestAnimationFrame = root.msRequestAnimationFrame.bind(root);
-        }
-        else if (root.oRequestAnimationFrame) {
-            this.cancelAnimationFrame = root.oCancelAnimationFrame.bind(root);
-            this.requestAnimationFrame = root.oRequestAnimationFrame.bind(root);
-        }
-        else {
-            this.cancelAnimationFrame = root.clearTimeout.bind(root);
-            this.requestAnimationFrame = function (cb) { return root.setTimeout(cb, 1000 / 60); };
-        }
-    }
-    return RequestAnimationFrameDefinition;
-}());
-exports.RequestAnimationFrameDefinition = RequestAnimationFrameDefinition;
-exports.AnimationFrame = new RequestAnimationFrameDefinition(root_1.root);
+    readVarint: function(isSigned) {
+        var buf = this.buf,
+            val, b;
 
-},{"./root":172}],158:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-/**
- * An error thrown when an element was queried at a certain index of an
- * Observable, but no such index or position exists in that sequence.
- *
- * @see {@link elementAt}
- * @see {@link take}
- * @see {@link takeLast}
- *
- * @class ArgumentOutOfRangeError
- */
-var ArgumentOutOfRangeError = (function (_super) {
-    __extends(ArgumentOutOfRangeError, _super);
-    function ArgumentOutOfRangeError() {
-        var err = _super.call(this, 'argument out of range');
-        this.name = err.name = 'ArgumentOutOfRangeError';
-        this.stack = err.stack;
-        this.message = err.message;
-    }
-    return ArgumentOutOfRangeError;
-}(Error));
-exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError;
+        b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
+        b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
+        b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
+        b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
+        b = buf[this.pos];   val |= (b & 0x0f) << 28;
 
-},{}],159:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-/**
- * An error thrown when an Observable or a sequence was queried but has no
- * elements.
- *
- * @see {@link first}
- * @see {@link last}
- * @see {@link single}
- *
- * @class EmptyError
- */
-var EmptyError = (function (_super) {
-    __extends(EmptyError, _super);
-    function EmptyError() {
-        var err = _super.call(this, 'no elements in sequence');
-        this.name = err.name = 'EmptyError';
-        this.stack = err.stack;
-        this.message = err.message;
-    }
-    return EmptyError;
-}(Error));
-exports.EmptyError = EmptyError;
+        return readVarintRemainder(val, isSigned, this);
+    },
 
-},{}],160:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-/**
- * An error thrown when an action is invalid because the object has been
- * unsubscribed.
- *
- * @see {@link Subject}
- * @see {@link BehaviorSubject}
- *
- * @class ObjectUnsubscribedError
- */
-var ObjectUnsubscribedError = (function (_super) {
-    __extends(ObjectUnsubscribedError, _super);
-    function ObjectUnsubscribedError() {
-        var err = _super.call(this, 'object unsubscribed');
-        this.name = err.name = 'ObjectUnsubscribedError';
-        this.stack = err.stack;
-        this.message = err.message;
-    }
-    return ObjectUnsubscribedError;
-}(Error));
-exports.ObjectUnsubscribedError = ObjectUnsubscribedError;
+    readVarint64: function() { // for compatibility with v2.0.1
+        return this.readVarint(true);
+    },
 
-},{}],161:[function(require,module,exports){
-"use strict";
-var root_1 = require('./root');
-function minimalSetImpl() {
-    // THIS IS NOT a full impl of Set, this is just the minimum
-    // bits of functionality we need for this library.
-    return (function () {
-        function MinimalSet() {
-            this._values = [];
-        }
-        MinimalSet.prototype.add = function (value) {
-            if (!this.has(value)) {
-                this._values.push(value);
-            }
-        };
-        MinimalSet.prototype.has = function (value) {
-            return this._values.indexOf(value) !== -1;
-        };
-        Object.defineProperty(MinimalSet.prototype, "size", {
-            get: function () {
-                return this._values.length;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        MinimalSet.prototype.clear = function () {
-            this._values.length = 0;
-        };
-        return MinimalSet;
-    }());
-}
-exports.minimalSetImpl = minimalSetImpl;
-exports.Set = root_1.root.Set || minimalSetImpl();
+    readSVarint: function() {
+        var num = this.readVarint();
+        return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
+    },
 
-},{"./root":172}],162:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-/**
- * An error thrown when one or more errors have occurred during the
- * `unsubscribe` of a {@link Subscription}.
- */
-var UnsubscriptionError = (function (_super) {
-    __extends(UnsubscriptionError, _super);
-    function UnsubscriptionError(errors) {
-        _super.call(this);
-        this.errors = errors;
-        var err = Error.call(this, errors ?
-            errors.length + " errors occurred during unsubscription:\n  " + errors.map(function (err, i) { return ((i + 1) + ") " + err.toString()); }).join('\n  ') : '');
-        this.name = err.name = 'UnsubscriptionError';
-        this.stack = err.stack;
-        this.message = err.message;
-    }
-    return UnsubscriptionError;
-}(Error));
-exports.UnsubscriptionError = UnsubscriptionError;
+    readBoolean: function() {
+        return Boolean(this.readVarint());
+    },
 
-},{}],163:[function(require,module,exports){
-"use strict";
-// typeof any so that it we don't have to cast when comparing a result to the error object
-exports.errorObject = { e: {} };
+    readString: function() {
+        var end = this.readVarint() + this.pos;
+        var pos = this.pos;
+        this.pos = end;
 
-},{}],164:[function(require,module,exports){
-"use strict";
-exports.isArray = Array.isArray || (function (x) { return x && typeof x.length === 'number'; });
+        if (end - pos >= TEXT_DECODER_MIN_LENGTH && utf8TextDecoder) {
+            // longer strings are fast with the built-in browser TextDecoder API
+            return readUtf8TextDecoder(this.buf, pos, end);
+        }
+        // short strings are fast with our custom implementation
+        return readUtf8(this.buf, pos, end);
+    },
 
-},{}],165:[function(require,module,exports){
-"use strict";
-exports.isArrayLike = (function (x) { return x && typeof x.length === 'number'; });
+    readBytes: function() {
+        var end = this.readVarint() + this.pos,
+            buffer = this.buf.subarray(this.pos, end);
+        this.pos = end;
+        return buffer;
+    },
 
-},{}],166:[function(require,module,exports){
-"use strict";
-function isDate(value) {
-    return value instanceof Date && !isNaN(+value);
-}
-exports.isDate = isDate;
+    // verbose for performance reasons; doesn't affect gzipped size
 
-},{}],167:[function(require,module,exports){
-"use strict";
-function isFunction(x) {
-    return typeof x === 'function';
-}
-exports.isFunction = isFunction;
-
-},{}],168:[function(require,module,exports){
-"use strict";
-var isArray_1 = require('../util/isArray');
-function isNumeric(val) {
-    // parseFloat NaNs numeric-cast false positives (null|true|false|"")
-    // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
-    // subtraction forces infinities to NaN
-    // adding 1 corrects loss of precision from parseFloat (#15100)
-    return !isArray_1.isArray(val) && (val - parseFloat(val) + 1) >= 0;
-}
-exports.isNumeric = isNumeric;
-;
-
-},{"../util/isArray":164}],169:[function(require,module,exports){
-"use strict";
-function isObject(x) {
-    return x != null && typeof x === 'object';
-}
-exports.isObject = isObject;
+    readPackedVarint: function(arr, isSigned) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned));
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readVarint(isSigned));
+        return arr;
+    },
+    readPackedSVarint: function(arr) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readSVarint());
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readSVarint());
+        return arr;
+    },
+    readPackedBoolean: function(arr) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readBoolean());
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readBoolean());
+        return arr;
+    },
+    readPackedFloat: function(arr) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readFloat());
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readFloat());
+        return arr;
+    },
+    readPackedDouble: function(arr) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readDouble());
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readDouble());
+        return arr;
+    },
+    readPackedFixed32: function(arr) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readFixed32());
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readFixed32());
+        return arr;
+    },
+    readPackedSFixed32: function(arr) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed32());
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readSFixed32());
+        return arr;
+    },
+    readPackedFixed64: function(arr) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readFixed64());
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readFixed64());
+        return arr;
+    },
+    readPackedSFixed64: function(arr) {
+        if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed64());
+        var end = readPackedEnd(this);
+        arr = arr || [];
+        while (this.pos < end) arr.push(this.readSFixed64());
+        return arr;
+    },
 
-},{}],170:[function(require,module,exports){
-"use strict";
-function isPromise(value) {
-    return value && typeof value.subscribe !== 'function' && typeof value.then === 'function';
-}
-exports.isPromise = isPromise;
+    skip: function(val) {
+        var type = val & 0x7;
+        if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
+        else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
+        else if (type === Pbf.Fixed32) this.pos += 4;
+        else if (type === Pbf.Fixed64) this.pos += 8;
+        else throw new Error('Unimplemented type: ' + type);
+    },
 
-},{}],171:[function(require,module,exports){
-"use strict";
-function isScheduler(value) {
-    return value && typeof value.schedule === 'function';
-}
-exports.isScheduler = isScheduler;
+    // === WRITING =================================================================
 
-},{}],172:[function(require,module,exports){
-(function (global){
-"use strict";
-// CommonJS / Node have global context exposed as "global" variable.
-// We don't want to include the whole node.d.ts this this compilation unit so we'll just fake
-// the global "global" var for now.
-var __window = typeof window !== 'undefined' && window;
-var __self = typeof self !== 'undefined' && typeof WorkerGlobalScope !== 'undefined' &&
-    self instanceof WorkerGlobalScope && self;
-var __global = typeof global !== 'undefined' && global;
-var _root = __window || __global || __self;
-exports.root = _root;
-// Workaround Closure Compiler restriction: The body of a goog.module cannot use throw.
-// This is needed when used with angular/tsickle which inserts a goog.module statement.
-// Wrap in IIFE
-(function () {
-    if (!_root) {
-        throw new Error('RxJS could not find any global context (window, self, global)');
-    }
-})();
+    writeTag: function(tag, type) {
+        this.writeVarint((tag << 3) | type);
+    },
 
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+    realloc: function(min) {
+        var length = this.length || 16;
 
-},{}],173:[function(require,module,exports){
-"use strict";
-var root_1 = require('./root');
-var isArrayLike_1 = require('./isArrayLike');
-var isPromise_1 = require('./isPromise');
-var isObject_1 = require('./isObject');
-var Observable_1 = require('../Observable');
-var iterator_1 = require('../symbol/iterator');
-var InnerSubscriber_1 = require('../InnerSubscriber');
-var observable_1 = require('../symbol/observable');
-function subscribeToResult(outerSubscriber, result, outerValue, outerIndex) {
-    var destination = new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex);
-    if (destination.closed) {
-        return null;
-    }
-    if (result instanceof Observable_1.Observable) {
-        if (result._isScalar) {
-            destination.next(result.value);
-            destination.complete();
-            return null;
-        }
-        else {
-            return result.subscribe(destination);
-        }
-    }
-    else if (isArrayLike_1.isArrayLike(result)) {
-        for (var i = 0, len = result.length; i < len && !destination.closed; i++) {
-            destination.next(result[i]);
-        }
-        if (!destination.closed) {
-            destination.complete();
-        }
-    }
-    else if (isPromise_1.isPromise(result)) {
-        result.then(function (value) {
-            if (!destination.closed) {
-                destination.next(value);
-                destination.complete();
-            }
-        }, function (err) { return destination.error(err); })
-            .then(null, function (err) {
-            // Escaping the Promise trap: globally throw unhandled errors
-            root_1.root.setTimeout(function () { throw err; });
-        });
-        return destination;
-    }
-    else if (result && typeof result[iterator_1.iterator] === 'function') {
-        var iterator = result[iterator_1.iterator]();
-        do {
-            var item = iterator.next();
-            if (item.done) {
-                destination.complete();
-                break;
-            }
-            destination.next(item.value);
-            if (destination.closed) {
-                break;
-            }
-        } while (true);
-    }
-    else if (result && typeof result[observable_1.observable] === 'function') {
-        var obs = result[observable_1.observable]();
-        if (typeof obs.subscribe !== 'function') {
-            destination.error(new TypeError('Provided object does not correctly implement Symbol.observable'));
-        }
-        else {
-            return obs.subscribe(new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex));
-        }
-    }
-    else {
-        var value = isObject_1.isObject(result) ? 'an invalid object' : "'" + result + "'";
-        var msg = ("You provided " + value + " where a stream was expected.")
-            + ' You can provide an Observable, Promise, Array, or Iterable.';
-        destination.error(new TypeError(msg));
-    }
-    return null;
-}
-exports.subscribeToResult = subscribeToResult;
+        while (length < this.pos + min) length *= 2;
 
-},{"../InnerSubscriber":27,"../Observable":29,"../symbol/iterator":154,"../symbol/observable":155,"./isArrayLike":165,"./isObject":169,"./isPromise":170,"./root":172}],174:[function(require,module,exports){
-"use strict";
-var Subscriber_1 = require('../Subscriber');
-var rxSubscriber_1 = require('../symbol/rxSubscriber');
-var Observer_1 = require('../Observer');
-function toSubscriber(nextOrObserver, error, complete) {
-    if (nextOrObserver) {
-        if (nextOrObserver instanceof Subscriber_1.Subscriber) {
-            return nextOrObserver;
-        }
-        if (nextOrObserver[rxSubscriber_1.rxSubscriber]) {
-            return nextOrObserver[rxSubscriber_1.rxSubscriber]();
+        if (length !== this.length) {
+            var buf = new Uint8Array(length);
+            buf.set(this.buf);
+            this.buf = buf;
+            this.length = length;
         }
-    }
-    if (!nextOrObserver && !error && !complete) {
-        return new Subscriber_1.Subscriber(Observer_1.empty);
-    }
-    return new Subscriber_1.Subscriber(nextOrObserver, error, complete);
-}
-exports.toSubscriber = toSubscriber;
-
-},{"../Observer":30,"../Subscriber":36,"../symbol/rxSubscriber":156}],175:[function(require,module,exports){
-"use strict";
-var errorObject_1 = require('./errorObject');
-var tryCatchTarget;
-function tryCatcher() {
-    try {
-        return tryCatchTarget.apply(this, arguments);
-    }
-    catch (e) {
-        errorObject_1.errorObject.e = e;
-        return errorObject_1.errorObject;
-    }
-}
-function tryCatch(fn) {
-    tryCatchTarget = fn;
-    return tryCatcher;
-}
-exports.tryCatch = tryCatch;
-;
-
-},{"./errorObject":163}],176:[function(require,module,exports){
-// threejs.org/license
-(function(l,xa){"object"===typeof exports&&"undefined"!==typeof module?xa(exports):"function"===typeof define&&define.amd?define(["exports"],xa):xa(l.THREE=l.THREE||{})})(this,function(l){function xa(){}function C(a,b){this.x=a||0;this.y=b||0}function ba(a,b,c,d,e,f,g,h,k,m){Object.defineProperty(this,"id",{value:hf++});this.uuid=Y.generateUUID();this.name="";this.image=void 0!==a?a:ba.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:ba.DEFAULT_MAPPING;this.wrapS=void 0!==c?c:1001;this.wrapT=
-void 0!==d?d:1001;this.magFilter=void 0!==e?e:1006;this.minFilter=void 0!==f?f:1008;this.anisotropy=void 0!==k?k:1;this.format=void 0!==g?g:1023;this.type=void 0!==h?h:1009;this.offset=new C(0,0);this.repeat=new C(1,1);this.generateMipmaps=!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.encoding=void 0!==m?m:3E3;this.version=0;this.onUpdate=null}function fa(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function Cb(a,b,c){this.uuid=Y.generateUUID();this.width=
-a;this.height=b;this.scissor=new fa(0,0,a,b);this.scissorTest=!1;this.viewport=new fa(0,0,a,b);c=c||{};void 0===c.minFilter&&(c.minFilter=1006);this.texture=new ba(void 0,void 0,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,c.encoding);this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.depthTexture=void 0!==c.depthTexture?c.depthTexture:null}function Db(a,b,c){Cb.call(this,a,b,c);this.activeMipMapLevel=
-this.activeCubeFace=0}function oa(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function n(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}function K(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}function db(a,b,c,d,e,f,g,h,k,m,q,v){ba.call(this,null,f,g,h,k,m,d,e,q,v);this.image={data:a,width:b,height:c};this.magFilter=void 0!==k?k:1003;this.minFilter=void 0!==
-m?m:1003;this.flipY=this.generateMipmaps=!1;this.unpackAlignment=1}function Xa(a,b,c,d,e,f,g,h,k,m){a=void 0!==a?a:[];ba.call(this,a,void 0!==b?b:301,c,d,e,f,g,h,k,m);this.flipY=!1}function Eb(a,b,c){var d=a[0];if(0>=d||0<d)return a;var e=b*c,f=xe[e];void 0===f&&(f=new Float32Array(e),xe[e]=f);if(0!==b)for(d.toArray(f,0),d=1,e=0;d!==b;++d)e+=c,a[d].toArray(f,e);return f}function ye(a,b){var c=ze[b];void 0===c&&(c=new Int32Array(b),ze[b]=c);for(var d=0;d!==b;++d)c[d]=a.allocTextureUnit();return c}
-function jf(a,b){a.uniform1f(this.addr,b)}function kf(a,b){a.uniform1i(this.addr,b)}function lf(a,b){void 0===b.x?a.uniform2fv(this.addr,b):a.uniform2f(this.addr,b.x,b.y)}function mf(a,b){void 0!==b.x?a.uniform3f(this.addr,b.x,b.y,b.z):void 0!==b.r?a.uniform3f(this.addr,b.r,b.g,b.b):a.uniform3fv(this.addr,b)}function nf(a,b){void 0===b.x?a.uniform4fv(this.addr,b):a.uniform4f(this.addr,b.x,b.y,b.z,b.w)}function of(a,b){a.uniformMatrix2fv(this.addr,!1,b.elements||b)}function pf(a,b){void 0===b.elements?
-a.uniformMatrix3fv(this.addr,!1,b):(Ae.set(b.elements),a.uniformMatrix3fv(this.addr,!1,Ae))}function qf(a,b){void 0===b.elements?a.uniformMatrix4fv(this.addr,!1,b):(Be.set(b.elements),a.uniformMatrix4fv(this.addr,!1,Be))}function rf(a,b,c){var d=c.allocTextureUnit();a.uniform1i(this.addr,d);c.setTexture2D(b||Ce,d)}function sf(a,b,c){var d=c.allocTextureUnit();a.uniform1i(this.addr,d);c.setTextureCube(b||De,d)}function Ee(a,b){a.uniform2iv(this.addr,b)}function Fe(a,b){a.uniform3iv(this.addr,b)}function Ge(a,
-b){a.uniform4iv(this.addr,b)}function tf(a){switch(a){case 5126:return jf;case 35664:return lf;case 35665:return mf;case 35666:return nf;case 35674:return of;case 35675:return pf;case 35676:return qf;case 35678:case 36198:return rf;case 35680:return sf;case 5124:case 35670:return kf;case 35667:case 35671:return Ee;case 35668:case 35672:return Fe;case 35669:case 35673:return Ge}}function uf(a,b){a.uniform1fv(this.addr,b)}function vf(a,b){a.uniform1iv(this.addr,b)}function wf(a,b){a.uniform2fv(this.addr,
-Eb(b,this.size,2))}function xf(a,b){a.uniform3fv(this.addr,Eb(b,this.size,3))}function yf(a,b){a.uniform4fv(this.addr,Eb(b,this.size,4))}function zf(a,b){a.uniformMatrix2fv(this.addr,!1,Eb(b,this.size,4))}function Af(a,b){a.uniformMatrix3fv(this.addr,!1,Eb(b,this.size,9))}function Bf(a,b){a.uniformMatrix4fv(this.addr,!1,Eb(b,this.size,16))}function Cf(a,b,c){var d=b.length,e=ye(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTexture2D(b[a]||Ce,e[a])}function Df(a,b,c){var d=b.length,e=ye(c,
-d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTextureCube(b[a]||De,e[a])}function Ef(a){switch(a){case 5126:return uf;case 35664:return wf;case 35665:return xf;case 35666:return yf;case 35674:return zf;case 35675:return Af;case 35676:return Bf;case 35678:return Cf;case 35680:return Df;case 5124:case 35670:return vf;case 35667:case 35671:return Ee;case 35668:case 35672:return Fe;case 35669:case 35673:return Ge}}function Ff(a,b,c){this.id=a;this.addr=c;this.setValue=tf(b.type)}function Gf(a,b,
-c){this.id=a;this.addr=c;this.size=b.size;this.setValue=Ef(b.type)}function He(a){this.id=a;this.seq=[];this.map={}}function eb(a,b,c){this.seq=[];this.map={};this.renderer=c;c=a.getProgramParameter(b,a.ACTIVE_UNIFORMS);for(var d=0;d<c;++d){var e=a.getActiveUniform(b,d),f=a.getUniformLocation(b,e.name),g=this,h=e.name,k=h.length;for(Pd.lastIndex=0;;){var m=Pd.exec(h),q=Pd.lastIndex,v=m[1],p=m[3];"]"===m[2]&&(v|=0);if(void 0===p||"["===p&&q+2===k){h=g;e=void 0===p?new Ff(v,e,f):new Gf(v,e,f);h.seq.push(e);
-h.map[e.id]=e;break}else p=g.map[v],void 0===p&&(p=new He(v),v=g,g=p,v.seq.push(g),v.map[g.id]=g),g=p}}}function G(a,b,c){return void 0===b&&void 0===c?this.set(a):this.setRGB(a,b,c)}function fd(a,b){this.min=void 0!==a?a:new C(Infinity,Infinity);this.max=void 0!==b?b:new C(-Infinity,-Infinity)}function Hf(a,b){var c,d,e,f,g,h,k,m,q,v,p=a.context,r=a.state,l,t,y,x,u,H;this.render=function(w,I,W){if(0!==b.length){w=new n;var D=W.w/W.z,O=.5*W.z,aa=.5*W.w,F=16/W.w,ja=new C(F*D,F),T=new n(1,1,0),fb=new C(1,
-1),Ya=new fd;Ya.min.set(W.x,W.y);Ya.max.set(W.x+(W.z-16),W.y+(W.w-16));if(void 0===x){var F=new Float32Array([-1,-1,0,0,1,-1,1,0,1,1,1,1,-1,1,0,1]),ka=new Uint16Array([0,1,2,0,2,3]);l=p.createBuffer();t=p.createBuffer();p.bindBuffer(p.ARRAY_BUFFER,l);p.bufferData(p.ARRAY_BUFFER,F,p.STATIC_DRAW);p.bindBuffer(p.ELEMENT_ARRAY_BUFFER,t);p.bufferData(p.ELEMENT_ARRAY_BUFFER,ka,p.STATIC_DRAW);u=p.createTexture();H=p.createTexture();r.bindTexture(p.TEXTURE_2D,u);p.texImage2D(p.TEXTURE_2D,0,p.RGB,16,16,0,
-p.RGB,p.UNSIGNED_BYTE,null);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_S,p.CLAMP_TO_EDGE);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_T,p.CLAMP_TO_EDGE);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MAG_FILTER,p.NEAREST);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MIN_FILTER,p.NEAREST);r.bindTexture(p.TEXTURE_2D,H);p.texImage2D(p.TEXTURE_2D,0,p.RGBA,16,16,0,p.RGBA,p.UNSIGNED_BYTE,null);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_S,p.CLAMP_TO_EDGE);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_T,p.CLAMP_TO_EDGE);
-p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MAG_FILTER,p.NEAREST);p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MIN_FILTER,p.NEAREST);var F=y={vertexShader:"uniform lowp int renderType;\nuniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\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 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\nvVisibility =        visibility.r / 9.0;\nvVisibility *= 1.0 - visibility.g / 9.0;\nvVisibility *=       visibility.b / 9.0;\nvVisibility *= 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:"uniform lowp int renderType;\nuniform sampler2D map;\nuniform float opacity;\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}"},ka=p.createProgram(),P=p.createShader(p.FRAGMENT_SHADER),
-M=p.createShader(p.VERTEX_SHADER),V="precision "+a.getPrecision()+" float;\n";p.shaderSource(P,V+F.fragmentShader);p.shaderSource(M,V+F.vertexShader);p.compileShader(P);p.compileShader(M);p.attachShader(ka,P);p.attachShader(ka,M);p.linkProgram(ka);x=ka;q=p.getAttribLocation(x,"position");v=p.getAttribLocation(x,"uv");c=p.getUniformLocation(x,"renderType");d=p.getUniformLocation(x,"map");e=p.getUniformLocation(x,"occlusionMap");f=p.getUniformLocation(x,"opacity");g=p.getUniformLocation(x,"color");
-h=p.getUniformLocation(x,"scale");k=p.getUniformLocation(x,"rotation");m=p.getUniformLocation(x,"screenPosition")}p.useProgram(x);r.initAttributes();r.enableAttribute(q);r.enableAttribute(v);r.disableUnusedAttributes();p.uniform1i(e,0);p.uniform1i(d,1);p.bindBuffer(p.ARRAY_BUFFER,l);p.vertexAttribPointer(q,2,p.FLOAT,!1,16,0);p.vertexAttribPointer(v,2,p.FLOAT,!1,16,8);p.bindBuffer(p.ELEMENT_ARRAY_BUFFER,t);r.disable(p.CULL_FACE);r.buffers.depth.setMask(!1);ka=0;for(P=b.length;ka<P;ka++)if(F=16/W.w,
-ja.set(F*D,F),M=b[ka],w.set(M.matrixWorld.elements[12],M.matrixWorld.elements[13],M.matrixWorld.elements[14]),w.applyMatrix4(I.matrixWorldInverse),w.applyMatrix4(I.projectionMatrix),T.copy(w),fb.x=W.x+T.x*O+O-8,fb.y=W.y+T.y*aa+aa-8,!0===Ya.containsPoint(fb)){r.activeTexture(p.TEXTURE0);r.bindTexture(p.TEXTURE_2D,null);r.activeTexture(p.TEXTURE1);r.bindTexture(p.TEXTURE_2D,u);p.copyTexImage2D(p.TEXTURE_2D,0,p.RGB,fb.x,fb.y,16,16,0);p.uniform1i(c,0);p.uniform2f(h,ja.x,ja.y);p.uniform3f(m,T.x,T.y,T.z);
-r.disable(p.BLEND);r.enable(p.DEPTH_TEST);p.drawElements(p.TRIANGLES,6,p.UNSIGNED_SHORT,0);r.activeTexture(p.TEXTURE0);r.bindTexture(p.TEXTURE_2D,H);p.copyTexImage2D(p.TEXTURE_2D,0,p.RGBA,fb.x,fb.y,16,16,0);p.uniform1i(c,1);r.disable(p.DEPTH_TEST);r.activeTexture(p.TEXTURE1);r.bindTexture(p.TEXTURE_2D,u);p.drawElements(p.TRIANGLES,6,p.UNSIGNED_SHORT,0);M.positionScreen.copy(T);M.customUpdateCallback?M.customUpdateCallback(M):M.updateLensFlares();p.uniform1i(c,2);r.enable(p.BLEND);for(var V=0,pa=M.lensFlares.length;V<
-pa;V++){var S=M.lensFlares[V];.001<S.opacity&&.001<S.scale&&(T.x=S.x,T.y=S.y,T.z=S.z,F=S.size*S.scale/W.w,ja.x=F*D,ja.y=F,p.uniform3f(m,T.x,T.y,T.z),p.uniform2f(h,ja.x,ja.y),p.uniform1f(k,S.rotation),p.uniform1f(f,S.opacity),p.uniform3f(g,S.color.r,S.color.g,S.color.b),r.setBlending(S.blending,S.blendEquation,S.blendSrc,S.blendDst),a.setTexture2D(S.texture,1),p.drawElements(p.TRIANGLES,6,p.UNSIGNED_SHORT,0))}}r.enable(p.CULL_FACE);r.enable(p.DEPTH_TEST);r.buffers.depth.setMask(!0);a.resetGLState()}}}
-function If(a,b){var c,d,e,f,g,h,k,m,q,v,p,r,l,t,y,x,u;function H(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:b.id-a.id}var w=a.context,I=a.state,W,D,O,aa,F=new n,ja=new oa,T=new n;this.render=function(n,Ya){if(0!==b.length){if(void 0===O){var ka=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]),P=new Uint16Array([0,1,2,0,2,3]);W=w.createBuffer();D=w.createBuffer();w.bindBuffer(w.ARRAY_BUFFER,W);w.bufferData(w.ARRAY_BUFFER,ka,w.STATIC_DRAW);
-w.bindBuffer(w.ELEMENT_ARRAY_BUFFER,D);w.bufferData(w.ELEMENT_ARRAY_BUFFER,P,w.STATIC_DRAW);var ka=w.createProgram(),P=w.createShader(w.VERTEX_SHADER),M=w.createShader(w.FRAGMENT_SHADER);w.shaderSource(P,["precision "+a.getPrecision()+" float;","#define SHADER_NAME SpriteMaterial\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 uvOffset;\nuniform vec2 uvScale;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvoid main() {\nvUV = uvOffset + uv * uvScale;\nvec2 alignedPosition = position * scale;\nvec2 rotatedPosition;\nrotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\nrotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\nvec4 finalPosition;\nfinalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\nfinalPosition.xy += rotatedPosition;\nfinalPosition = projectionMatrix * finalPosition;\ngl_Position = finalPosition;\n}"].join("\n"));
-w.shaderSource(M,["precision "+a.getPrecision()+" float;","#define SHADER_NAME SpriteMaterial\nuniform vec3 color;\nuniform sampler2D map;\nuniform float opacity;\nuniform int fogType;\nuniform vec3 fogColor;\nuniform float fogDensity;\nuniform float fogNear;\nuniform float fogFar;\nuniform float alphaTest;\nvarying vec2 vUV;\nvoid main() {\nvec4 texture = texture2D( map, vUV );\nif ( texture.a < alphaTest ) discard;\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\nif ( fogType > 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"].join("\n"));
-w.compileShader(P);w.compileShader(M);w.attachShader(ka,P);w.attachShader(ka,M);w.linkProgram(ka);O=ka;x=w.getAttribLocation(O,"position");u=w.getAttribLocation(O,"uv");c=w.getUniformLocation(O,"uvOffset");d=w.getUniformLocation(O,"uvScale");e=w.getUniformLocation(O,"rotation");f=w.getUniformLocation(O,"scale");g=w.getUniformLocation(O,"color");h=w.getUniformLocation(O,"map");k=w.getUniformLocation(O,"opacity");m=w.getUniformLocation(O,"modelViewMatrix");q=w.getUniformLocation(O,"projectionMatrix");
-v=w.getUniformLocation(O,"fogType");p=w.getUniformLocation(O,"fogDensity");r=w.getUniformLocation(O,"fogNear");l=w.getUniformLocation(O,"fogFar");t=w.getUniformLocation(O,"fogColor");y=w.getUniformLocation(O,"alphaTest");ka=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");ka.width=8;ka.height=8;P=ka.getContext("2d");P.fillStyle="white";P.fillRect(0,0,8,8);aa=new ba(ka);aa.needsUpdate=!0}w.useProgram(O);I.initAttributes();I.enableAttribute(x);I.enableAttribute(u);I.disableUnusedAttributes();
-I.disable(w.CULL_FACE);I.enable(w.BLEND);w.bindBuffer(w.ARRAY_BUFFER,W);w.vertexAttribPointer(x,2,w.FLOAT,!1,16,0);w.vertexAttribPointer(u,2,w.FLOAT,!1,16,8);w.bindBuffer(w.ELEMENT_ARRAY_BUFFER,D);w.uniformMatrix4fv(q,!1,Ya.projectionMatrix.elements);I.activeTexture(w.TEXTURE0);w.uniform1i(h,0);P=ka=0;(M=n.fog)?(w.uniform3f(t,M.color.r,M.color.g,M.color.b),M.isFog?(w.uniform1f(r,M.near),w.uniform1f(l,M.far),w.uniform1i(v,1),P=ka=1):M.isFogExp2&&(w.uniform1f(p,M.density),w.uniform1i(v,2),P=ka=2)):
-(w.uniform1i(v,0),P=ka=0);for(var M=0,V=b.length;M<V;M++){var pa=b[M];pa.modelViewMatrix.multiplyMatrices(Ya.matrixWorldInverse,pa.matrixWorld);pa.z=-pa.modelViewMatrix.elements[14]}b.sort(H);for(var S=[],M=0,V=b.length;M<V;M++){var pa=b[M],N=pa.material;if(!1!==N.visible){pa.onBeforeRender(a,n,Ya,void 0,N,void 0);w.uniform1f(y,N.alphaTest);w.uniformMatrix4fv(m,!1,pa.modelViewMatrix.elements);pa.matrixWorld.decompose(F,ja,T);S[0]=T.x;S[1]=T.y;var C=0;n.fog&&N.fog&&(C=P);ka!==C&&(w.uniform1i(v,C),
-ka=C);null!==N.map?(w.uniform2f(c,N.map.offset.x,N.map.offset.y),w.uniform2f(d,N.map.repeat.x,N.map.repeat.y)):(w.uniform2f(c,0,0),w.uniform2f(d,1,1));w.uniform1f(k,N.opacity);w.uniform3f(g,N.color.r,N.color.g,N.color.b);w.uniform1f(e,N.rotation);w.uniform2fv(f,S);I.setBlending(N.blending,N.blendEquation,N.blendSrc,N.blendDst,N.blendEquationAlpha,N.blendSrcAlpha,N.blendDstAlpha,N.premultipliedAlpha);I.buffers.depth.setTest(N.depthTest);I.buffers.depth.setMask(N.depthWrite);N.map?a.setTexture2D(N.map,
-0):a.setTexture2D(aa,0);w.drawElements(w.TRIANGLES,6,w.UNSIGNED_SHORT,0);pa.onAfterRender(a,n,Ya,void 0,N,void 0)}}I.enable(w.CULL_FACE);a.resetGLState()}}}function U(){Object.defineProperty(this,"id",{value:Jf++});this.uuid=Y.generateUUID();this.name="";this.type="Material";this.lights=this.fog=!0;this.blending=1;this.side=0;this.shading=2;this.vertexColors=0;this.opacity=1;this.transparent=!1;this.blendSrc=204;this.blendDst=205;this.blendEquation=100;this.blendEquationAlpha=this.blendDstAlpha=this.blendSrcAlpha=
-null;this.depthFunc=3;this.depthWrite=this.depthTest=!0;this.clippingPlanes=null;this.clipShadows=this.clipIntersection=!1;this.colorWrite=!0;this.precision=null;this.polygonOffset=!1;this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.dithering=!1;this.alphaTest=0;this.premultipliedAlpha=!1;this.overdraw=0;this.needsUpdate=this.visible=!0}function ra(a){U.call(this);this.type="ShaderMaterial";this.defines={};this.uniforms={};this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}";
-this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}";this.linewidth=1;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.clipping=this.lights=this.fog=!1;this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1};this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]};this.index0AttributeName=void 0;void 0!==a&&(void 0!==a.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),
-this.setValues(a))}function Za(a){U.call(this);this.type="MeshDepthMaterial";this.depthPacking=3200;this.morphTargets=this.skinning=!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.lights=this.fog=!1;this.setValues(a)}function Ra(a,b){this.min=void 0!==a?a:new n(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new n(-Infinity,-Infinity,-Infinity)}function Ea(a,b){this.center=void 0!==a?a:new n;this.radius=
-void 0!==b?b:0}function Ba(){this.elements=[1,0,0,0,1,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}function Aa(a,b){this.normal=void 0!==a?a:new n(1,0,0);this.constant=void 0!==b?b:0}function gd(a,b,c,d,e,f){this.planes=[void 0!==a?a:new Aa,void 0!==b?b:new Aa,void 0!==c?c:new Aa,void 0!==d?d:new Aa,void 0!==e?e:new Aa,void 0!==f?f:new Aa]}function Ie(a,b,c,d){function e(b,c,d,e){var f=b.geometry,g;g=t;var h=b.customDepthMaterial;
-d&&(g=y,h=b.customDistanceMaterial);h?g=h:(h=!1,c.morphTargets&&(f&&f.isBufferGeometry?h=f.morphAttributes&&f.morphAttributes.position&&0<f.morphAttributes.position.length:f&&f.isGeometry&&(h=f.morphTargets&&0<f.morphTargets.length)),b.isSkinnedMesh&&!1===c.skinning&&console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",b),b=b.isSkinnedMesh&&c.skinning,f=0,h&&(f|=1),b&&(f|=2),g=g[f]);a.localClippingEnabled&&!0===c.clipShadows&&0!==c.clippingPlanes.length&&(f=
-g.uuid,h=c.uuid,b=x[f],void 0===b&&(b={},x[f]=b),f=b[h],void 0===f&&(f=g.clone(),b[h]=f),g=f);g.visible=c.visible;g.wireframe=c.wireframe;h=c.side;F.renderSingleSided&&2==h&&(h=0);F.renderReverseSided&&(0===h?h=1:1===h&&(h=0));g.side=h;g.clipShadows=c.clipShadows;g.clippingPlanes=c.clippingPlanes;g.wireframeLinewidth=c.wireframeLinewidth;g.linewidth=c.linewidth;d&&void 0!==g.uniforms.lightPos&&g.uniforms.lightPos.value.copy(e);return g}function f(b,d,g,h){if(!1!==b.visible){if(b.layers.test(d.layers)&&
-(b.isMesh||b.isLine||b.isPoints)&&b.castShadow&&(!b.frustumCulled||k.intersectsObject(b))){b.modelViewMatrix.multiplyMatrices(g.matrixWorldInverse,b.matrixWorld);var m=c.update(b),p=b.material;if(Array.isArray(p))for(var q=m.groups,v=0,r=q.length;v<r;v++){var u=q[v],w=p[u.materialIndex];w&&w.visible&&(w=e(b,w,h,l),a.renderBufferDirect(g,null,m,w,b,u))}else p.visible&&(w=e(b,p,h,l),a.renderBufferDirect(g,null,m,w,b,null))}b=b.children;m=0;for(p=b.length;m<p;m++)f(b[m],d,g,h)}}var g=a.context,h=a.state,
-k=new gd,m=new K,q=b.shadows,v=new C,p=new C(d.maxTextureSize,d.maxTextureSize),r=new n,l=new n,t=Array(4),y=Array(4),x={},u=[new n(1,0,0),new n(-1,0,0),new n(0,0,1),new n(0,0,-1),new n(0,1,0),new n(0,-1,0)],H=[new n(0,1,0),new n(0,1,0),new n(0,1,0),new n(0,1,0),new n(0,0,1),new n(0,0,-1)],w=[new fa,new fa,new fa,new fa,new fa,new fa];b=new Za;b.depthPacking=3201;b.clipping=!0;d=$a.distanceRGBA;for(var I=Ca.clone(d.uniforms),W=0;4!==W;++W){var D=0!==(W&1),O=0!==(W&2),aa=b.clone();aa.morphTargets=
-D;aa.skinning=O;t[W]=aa;D=new ra({defines:{USE_SHADOWMAP:""},uniforms:I,vertexShader:d.vertexShader,fragmentShader:d.fragmentShader,morphTargets:D,skinning:O,clipping:!0});y[W]=D}var F=this;this.enabled=!1;this.autoUpdate=!0;this.needsUpdate=!1;this.type=1;this.renderSingleSided=this.renderReverseSided=!0;this.render=function(b,c){if(!1!==F.enabled&&(!1!==F.autoUpdate||!1!==F.needsUpdate)&&0!==q.length){h.disable(g.BLEND);h.buffers.color.setClear(1,1,1,1);h.buffers.depth.setTest(!0);h.setScissorTest(!1);
-for(var d,e=0,t=q.length;e<t;e++){var n=q[e];d=n.shadow;var y=n&&n.isPointLight;if(void 0===d)console.warn("THREE.WebGLShadowMap:",n,"has no shadow.");else{var x=d.camera;v.copy(d.mapSize);v.min(p);if(y){var D=v.x,I=v.y;w[0].set(2*D,I,D,I);w[1].set(0,I,D,I);w[2].set(3*D,I,D,I);w[3].set(D,I,D,I);w[4].set(3*D,0,D,I);w[5].set(D,0,D,I);v.x*=4;v.y*=2}null===d.map&&(d.map=new Cb(v.x,v.y,{minFilter:1003,magFilter:1003,format:1023}),d.map.texture.name=n.name+".shadowMap",x.updateProjectionMatrix());d.isSpotLightShadow&&
-d.update(n);D=d.map;I=d.matrix;l.setFromMatrixPosition(n.matrixWorld);x.position.copy(l);y?(d=6,I.makeTranslation(-l.x,-l.y,-l.z)):(d=1,r.setFromMatrixPosition(n.target.matrixWorld),x.lookAt(r),x.updateMatrixWorld(),I.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),I.multiply(x.projectionMatrix),I.multiply(x.matrixWorldInverse));a.setRenderTarget(D);a.clear();for(n=0;n<d;n++)y&&(r.copy(x.position),r.add(u[n]),x.up.copy(H[n]),x.lookAt(r),x.updateMatrixWorld(),h.viewport(w[n])),m.multiplyMatrices(x.projectionMatrix,
-x.matrixWorldInverse),k.setFromMatrix(m),f(b,c,x,y)}}e=a.getClearColor();t=a.getClearAlpha();a.setClearColor(e,t);F.needsUpdate=!1}}}function Kf(a){var b={};return{get:function(a){a.isInterleavedBufferAttribute&&(a=a.data);return b[a.uuid]},remove:function(c){c.isInterleavedBufferAttribute&&(c=c.data);var d=b[c.uuid];d&&(a.deleteBuffer(d.buffer),delete b[c.uuid])},update:function(c,d){c.isInterleavedBufferAttribute&&(c=c.data);var e=b[c.uuid];if(void 0===e){var e=c.uuid,f=c,g=f.array,h=f.dynamic?
-a.DYNAMIC_DRAW:a.STATIC_DRAW,k=a.createBuffer();a.bindBuffer(d,k);a.bufferData(d,g,h);f.onUploadCallback();h=a.FLOAT;g instanceof Float32Array?h=a.FLOAT:g instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):g instanceof Uint16Array?h=a.UNSIGNED_SHORT:g instanceof Int16Array?h=a.SHORT:g instanceof Uint32Array?h=a.UNSIGNED_INT:g instanceof Int32Array?h=a.INT:g instanceof Int8Array?h=a.BYTE:g instanceof Uint8Array&&(h=a.UNSIGNED_BYTE);b[e]={buffer:k,
-type:h,bytesPerElement:g.BYTES_PER_ELEMENT,version:f.version}}else e.version<c.version&&(f=c,g=f.array,k=f.updateRange,a.bindBuffer(d,e.buffer),!1===f.dynamic?a.bufferData(d,g,a.STATIC_DRAW):-1===k.count?a.bufferSubData(d,0,g):0===k.count?console.error("THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually."):(a.bufferSubData(d,k.offset*g.BYTES_PER_ELEMENT,g.subarray(k.offset,k.offset+
-k.count)),k.count=-1),e.version=c.version)}}}function ab(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||ab.DefaultOrder}function Qd(){this.mask=1}function z(){Object.defineProperty(this,"id",{value:Lf++});this.uuid=Y.generateUUID();this.name="";this.type="Object3D";this.parent=null;this.children=[];this.up=z.DefaultUp.clone();var a=new n,b=new ab,c=new oa,d=new n(1,1,1);b.onChange(function(){c.setFromEuler(b,!1)});c.onChange(function(){b.setFromQuaternion(c,void 0,!1)});Object.defineProperties(this,
-{position:{enumerable:!0,value:a},rotation:{enumerable:!0,value:b},quaternion:{enumerable:!0,value:c},scale:{enumerable:!0,value:d},modelViewMatrix:{value:new K},normalMatrix:{value:new Ba}});this.matrix=new K;this.matrixWorld=new K;this.matrixAutoUpdate=z.DefaultMatrixAutoUpdate;this.matrixWorldNeedsUpdate=!1;this.layers=new Qd;this.visible=!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.renderOrder=0;this.userData={}}function Na(){z.call(this);this.type="Camera";this.matrixWorldInverse=
-new K;this.projectionMatrix=new K}function Fb(a,b,c,d,e,f){Na.call(this);this.type="OrthographicCamera";this.zoom=1;this.view=null;this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=void 0!==e?e:.1;this.far=void 0!==f?f:2E3;this.updateProjectionMatrix()}function qa(a,b,c,d){Na.call(this);this.type="PerspectiveCamera";this.fov=void 0!==a?a:50;this.zoom=1;this.near=void 0!==c?c:.1;this.far=void 0!==d?d:2E3;this.focus=10;this.aspect=void 0!==b?b:1;this.view=null;this.filmGauge=35;this.filmOffset=
-0;this.updateProjectionMatrix()}function Sa(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d&&d.isVector3?d:new n;this.vertexNormals=Array.isArray(d)?d:[];this.color=e&&e.isColor?e:new G;this.vertexColors=Array.isArray(e)?e:[];this.materialIndex=void 0!==f?f:0}function J(){Object.defineProperty(this,"id",{value:Rd++});this.uuid=Y.generateUUID();this.name="";this.type="Geometry";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=
-[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function Z(a,b,c){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.uuid=Y.generateUUID();this.name="";this.array=a;this.itemSize=b;this.count=void 0!==a?a.length/b:0;this.normalized=!0===c;this.dynamic=
-!1;this.updateRange={offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function pc(a,b){Z.call(this,new Int8Array(a),b)}function qc(a,b){Z.call(this,new Uint8Array(a),b)}function rc(a,b){Z.call(this,new Uint8ClampedArray(a),b)}function sc(a,b){Z.call(this,new Int16Array(a),b)}function gb(a,b){Z.call(this,new Uint16Array(a),b)}function tc(a,b){Z.call(this,new Int32Array(a),b)}function hb(a,b){Z.call(this,new Uint32Array(a),b)}function B(a,b){Z.call(this,new Float32Array(a),b)}function uc(a,
-b){Z.call(this,new Float64Array(a),b)}function Je(){this.indices=[];this.vertices=[];this.normals=[];this.colors=[];this.uvs=[];this.uvs2=[];this.groups=[];this.morphTargets={};this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.uvsNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.verticesNeedUpdate=!1}function Sd(a){if(0===a.length)return-Infinity;for(var b=a[0],c=1,d=a.length;c<d;++c)a[c]>b&&(b=a[c]);return b}function E(){Object.defineProperty(this,
-"id",{value:Rd++});this.uuid=Y.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity}}function Gb(a,b,c,d,e,f){J.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};this.fromBufferGeometry(new ib(a,b,c,d,e,f));this.mergeVertices()}function ib(a,b,c,d,e,f){function g(a,b,
-c,d,e,f,g,l,W,D,O){var aa=f/W,F=g/D,ja=f/2,T=g/2,C=l/2;g=W+1;var B=D+1,z=f=0,P,M,V=new n;for(M=0;M<B;M++){var pa=M*F-T;for(P=0;P<g;P++)V[a]=(P*aa-ja)*d,V[b]=pa*e,V[c]=C,m.push(V.x,V.y,V.z),V[a]=0,V[b]=0,V[c]=0<l?1:-1,q.push(V.x,V.y,V.z),v.push(P/W),v.push(1-M/D),f+=1}for(M=0;M<D;M++)for(P=0;P<W;P++)a=p+P+g*(M+1),b=p+(P+1)+g*(M+1),c=p+(P+1)+g*M,k.push(p+P+g*M,a,c),k.push(a,b,c),z+=6;h.addGroup(r,z,O);r+=z;p+=f}E.call(this);this.type="BoxBufferGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,
-heightSegments:e,depthSegments:f};var h=this;d=Math.floor(d)||1;e=Math.floor(e)||1;f=Math.floor(f)||1;var k=[],m=[],q=[],v=[],p=0,r=0;g("z","y","x",-1,-1,c,b,a,f,e,0);g("z","y","x",1,-1,c,b,-a,f,e,1);g("x","z","y",1,1,a,c,b,d,f,2);g("x","z","y",1,-1,a,c,-b,d,f,3);g("x","y","z",1,-1,a,b,c,d,e,4);g("x","y","z",-1,-1,a,b,-c,d,e,5);this.setIndex(k);this.addAttribute("position",new B(m,3));this.addAttribute("normal",new B(q,3));this.addAttribute("uv",new B(v,2))}function vc(a,b,c,d){J.call(this);this.type=
-"PlaneGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};this.fromBufferGeometry(new jb(a,b,c,d));this.mergeVertices()}function jb(a,b,c,d){E.call(this);this.type="PlaneBufferGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};var e=a/2,f=b/2;c=Math.floor(c)||1;d=Math.floor(d)||1;var g=c+1,h=d+1,k=a/c,m=b/d,q=[],v=[],p=[],r=[];for(a=0;a<h;a++){var l=a*m-f;for(b=0;b<g;b++)v.push(b*k-e,-l,0),p.push(0,0,1),r.push(b/c),r.push(1-a/d)}for(a=0;a<d;a++)for(b=
-0;b<c;b++)e=b+g*(a+1),f=b+1+g*(a+1),h=b+1+g*a,q.push(b+g*a,e,h),q.push(e,f,h);this.setIndex(q);this.addAttribute("position",new B(v,3));this.addAttribute("normal",new B(p,3));this.addAttribute("uv",new B(r,2))}function ya(a){U.call(this);this.type="MeshBasicMaterial";this.color=new G(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=
-!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.lights=this.morphTargets=this.skinning=!1;this.setValues(a)}function kb(a,b){this.origin=void 0!==a?a:new n;this.direction=void 0!==b?b:new n}function Hb(a,b){this.start=void 0!==a?a:new n;this.end=void 0!==b?b:new n}function Ta(a,b,c){this.a=void 0!==a?a:new n;this.b=void 0!==b?b:new n;this.c=void 0!==c?c:new n}function la(a,b){z.call(this);this.type="Mesh";this.geometry=void 0!==a?a:new E;this.material=void 0!==
-b?b:new ya({color:16777215*Math.random()});this.drawMode=0;this.updateMorphTargets()}function Mf(a,b,c,d){function e(a,c){b.buffers.color.setClear(a.r,a.g,a.b,c,d)}var f=new G(0),g=0,h,k,m,q;return{getClearColor:function(){return f},setClearColor:function(a,b){f.set(a);g=void 0!==b?b:1;e(f,g)},getClearAlpha:function(){return g},setClearAlpha:function(a){g=a;e(f,g)},render:function(b,d,r){b=b.background;null===b?e(f,g):b&&b.isColor&&(e(b,1),r=!0);(a.autoClear||r)&&a.clear(a.autoClearColor,a.autoClearDepth,
-a.autoClearStencil);b&&b.isCubeTexture?(void 0===m&&(m=new qa,q=new la(new ib(5,5,5),new ra({uniforms:$a.cube.uniforms,vertexShader:$a.cube.vertexShader,fragmentShader:$a.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1}))),m.projectionMatrix.copy(d.projectionMatrix),m.matrixWorld.extractRotation(d.matrixWorld),m.matrixWorldInverse.getInverse(m.matrixWorld),q.material.uniforms.tCube.value=b,q.modelViewMatrix.multiplyMatrices(m.matrixWorldInverse,q.matrixWorld),c.update(q),a.renderBufferDirect(m,
-null,q.geometry,q.material,q,null)):b&&b.isTexture&&(void 0===h&&(h=new Fb(-1,1,1,-1,0,1),k=new la(new jb(2,2),new ya({depthTest:!1,depthWrite:!1,fog:!1}))),k.material.map=b,c.update(k),a.renderBufferDirect(h,null,k.geometry,k.material,k,null))}}}function Nf(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.program&&b.program&&a.program!==b.program?a.program.id-b.program.id:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function Of(a,b){return a.renderOrder!==
-b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function Pf(){var a=[],b=-1,c=[],d=-1;return{opaque:a,transparent:c,init:function(){d=b=-1},push:function(e,f,g,h,k){var m,q;g.transparent?(m=c,q=++d):(m=a,q=++b);(q=m[q])?(q.id=e.id,q.object=e,q.geometry=f,q.material=g,q.program=g.program,q.renderOrder=e.renderOrder,q.z=h,q.group=k):(q={id:e.id,object:e,geometry:f,material:g,program:g.program,renderOrder:e.renderOrder,z:h,group:k},m.push(q))},finish:function(){a.length=b+1;c.length=
-d+1},sort:function(){a.sort(Nf);c.sort(Of)}}}function Qf(){var a={};return{get:function(b,c){var d=b.id+","+c.id,e=a[d];void 0===e&&(e=new Pf,a[d]=e);return e},dispose:function(){a={}}}}function Rf(a,b,c){var d,e,f;this.setMode=function(a){d=a};this.setIndex=function(a){e=a.type;f=a.bytesPerElement};this.render=function(b,h){a.drawElements(d,h,e,b*f);c.calls++;c.vertices+=h;d===a.TRIANGLES&&(c.faces+=h/3)};this.renderInstances=function(g,h,k){var m=b.get("ANGLE_instanced_arrays");null===m?console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."):
-(m.drawElementsInstancedANGLE(d,k,e,h*f,g.maxInstancedCount),c.calls++,c.vertices+=k*g.maxInstancedCount,d===a.TRIANGLES&&(c.faces+=g.maxInstancedCount*k/3))}}function Sf(a,b,c){var d;this.setMode=function(a){d=a};this.render=function(b,f){a.drawArrays(d,b,f);c.calls++;c.vertices+=f;d===a.TRIANGLES&&(c.faces+=f/3)};this.renderInstances=function(e,f,g){var h=b.get("ANGLE_instanced_arrays");if(null===h)console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");
-else{var k=e.attributes.position;k.isInterleavedBufferAttribute?(g=k.data.count,h.drawArraysInstancedANGLE(d,0,g,e.maxInstancedCount)):h.drawArraysInstancedANGLE(d,f,g,e.maxInstancedCount);c.calls++;c.vertices+=g*e.maxInstancedCount;d===a.TRIANGLES&&(c.faces+=e.maxInstancedCount*g/3)}}}function Tf(a,b,c){function d(a){a=a.target;var h=e[a.id];null!==h.index&&b.remove(h.index);for(var k in h.attributes)b.remove(h.attributes[k]);a.removeEventListener("dispose",d);delete e[a.id];if(k=f[a.id])b.remove(k),
-delete f[a.id];if(k=f[h.id])b.remove(k),delete f[h.id];c.geometries--}var e={},f={};return{get:function(a,b){var f=e[b.id];if(f)return f;b.addEventListener("dispose",d);b.isBufferGeometry?f=b:b.isGeometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new E).setFromObject(a)),f=b._bufferGeometry);e[b.id]=f;c.geometries++;return f},update:function(c){var d=c.index,e=c.attributes;null!==d&&b.update(d,a.ELEMENT_ARRAY_BUFFER);for(var f in e)b.update(e[f],a.ARRAY_BUFFER);c=c.morphAttributes;for(f in c)for(var d=
-c[f],e=0,q=d.length;e<q;e++)b.update(d[e],a.ARRAY_BUFFER)},getWireframeAttribute:function(c){var d=f[c.id];if(d)return d;var d=[],e=c.index,m=c.attributes;if(null!==e)for(var e=e.array,m=0,q=e.length;m<q;m+=3){var v=e[m+0],p=e[m+1],r=e[m+2];d.push(v,p,p,r,r,v)}else for(e=m.position.array,m=0,q=e.length/3-1;m<q;m+=3)v=m+0,p=m+1,r=m+2,d.push(v,p,p,r,r,v);d=new (65535<Sd(d)?hb:gb)(d,1);b.update(d,a.ELEMENT_ARRAY_BUFFER);return f[c.id]=d}}}function Uf(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];
-var c;switch(b.type){case "DirectionalLight":c={direction:new n,color:new G,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case "SpotLight":c={position:new n,direction:new n,color:new G,distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case "PointLight":c={position:new n,color:new G,distance:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case "HemisphereLight":c={direction:new n,skyColor:new G,
-groundColor:new G};break;case "RectAreaLight":c={color:new G,position:new n,halfWidth:new n,halfHeight:new n}}return a[b.id]=c}}}function Vf(a,b,c){var d={};return{update:function(a){var f=c.frame,g=a.geometry,h=b.get(a,g);d[h.id]!==f&&(g.isGeometry&&h.updateFromObject(a),b.update(h),d[h.id]=f);return h},clear:function(){d={}}}}function Wf(a){a=a.split("\n");for(var b=0;b<a.length;b++)a[b]=b+1+": "+a[b];return a.join("\n")}function Ke(a,b,c){var d=a.createShader(b);a.shaderSource(d,c);a.compileShader(d);
-!1===a.getShaderParameter(d,a.COMPILE_STATUS)&&console.error("THREE.WebGLShader: Shader couldn't compile.");""!==a.getShaderInfoLog(d)&&console.warn("THREE.WebGLShader: gl.getShaderInfoLog()",b===a.VERTEX_SHADER?"vertex":"fragment",a.getShaderInfoLog(d),Wf(c));return d}function Le(a){switch(a){case 3E3:return["Linear","( value )"];case 3001:return["sRGB","( value )"];case 3002:return["RGBE","( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD",
-"( value, 256.0 )"];case 3007:return["Gamma","( value, float( GAMMA_FACTOR ) )"];default:throw Error("unsupported encoding: "+a);}}function Td(a,b){var c=Le(b);return"vec4 "+a+"( vec4 value ) { return "+c[0]+"ToLinear"+c[1]+"; }"}function Xf(a,b){var c=Le(b);return"vec4 "+a+"( vec4 value ) { return LinearTo"+c[0]+c[1]+"; }"}function Yf(a,b){var c;switch(b){case 1:c="Linear";break;case 2:c="Reinhard";break;case 3:c="Uncharted2";break;case 4:c="OptimizedCineon";break;default:throw Error("unsupported toneMapping: "+
-b);}return"vec3 "+a+"( vec3 color ) { return "+c+"ToneMapping( color ); }"}function Zf(a,b,c){a=a||{};return[a.derivatives||b.envMapCubeUV||b.bumpMap||b.normalMap||b.flatShading?"#extension GL_OES_standard_derivatives : enable":"",(a.fragDepth||b.logarithmicDepthBuffer)&&c.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"",a.drawBuffers&&c.get("WEBGL_draw_buffers")?"#extension GL_EXT_draw_buffers : require":"",(a.shaderTextureLOD||b.envMap)&&c.get("EXT_shader_texture_lod")?"#extension GL_EXT_shader_texture_lod : enable":
-""].filter(wc).join("\n")}function $f(a){var b=[],c;for(c in a){var d=a[c];!1!==d&&b.push("#define "+c+" "+d)}return b.join("\n")}function wc(a){return""!==a}function Me(a,b){return a.replace(/NUM_DIR_LIGHTS/g,b.numDirLights).replace(/NUM_SPOT_LIGHTS/g,b.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,b.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,b.numPointLights).replace(/NUM_HEMI_LIGHTS/g,b.numHemiLights)}function Ud(a){return a.replace(/^[ \t]*#include +<([\w\d.]+)>/gm,function(a,c){var d=X[c];
-if(void 0===d)throw Error("Can not resolve #include <"+c+">");return Ud(d)})}function Ne(a){return a.replace(/for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(a,c,d,e){a="";for(c=parseInt(c);c<parseInt(d);c++)a+=e.replace(/\[ i \]/g,"[ "+c+" ]");return a})}function ag(a,b,c,d,e){var f=a.context,g=c.extensions,h=c.defines,k=d.vertexShader,m=d.fragmentShader,q="SHADOWMAP_TYPE_BASIC";1===e.shadowMapType?q="SHADOWMAP_TYPE_PCF":2===e.shadowMapType&&(q="SHADOWMAP_TYPE_PCF_SOFT");
-var v="ENVMAP_TYPE_CUBE",p="ENVMAP_MODE_REFLECTION",r="ENVMAP_BLENDING_MULTIPLY";if(e.envMap){switch(c.envMap.mapping){case 301:case 302:v="ENVMAP_TYPE_CUBE";break;case 306:case 307:v="ENVMAP_TYPE_CUBE_UV";break;case 303:case 304:v="ENVMAP_TYPE_EQUIREC";break;case 305:v="ENVMAP_TYPE_SPHERE"}switch(c.envMap.mapping){case 302:case 304:p="ENVMAP_MODE_REFRACTION"}switch(c.combine){case 0:r="ENVMAP_BLENDING_MULTIPLY";break;case 1:r="ENVMAP_BLENDING_MIX";break;case 2:r="ENVMAP_BLENDING_ADD"}}var l=0<a.gammaFactor?
-a.gammaFactor:1,g=Zf(g,e,a.extensions),t=$f(h),n=f.createProgram();c.isRawShaderMaterial?(h=[t,"\n"].filter(wc).join("\n"),d=[g,t,"\n"].filter(wc).join("\n")):(h=["precision "+e.precision+" float;","precision "+e.precision+" int;","#define SHADER_NAME "+d.name,t,e.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+l,"#define MAX_BONES "+e.maxBones,e.useFog&&e.fog?"#define USE_FOG":"",e.useFog&&e.fogExp?"#define FOG_EXP2":"",e.map?"#define USE_MAP":"",e.envMap?"#define USE_ENVMAP":
-"",e.envMap?"#define "+p:"",e.lightMap?"#define USE_LIGHTMAP":"",e.aoMap?"#define USE_AOMAP":"",e.emissiveMap?"#define USE_EMISSIVEMAP":"",e.bumpMap?"#define USE_BUMPMAP":"",e.normalMap?"#define USE_NORMALMAP":"",e.displacementMap&&e.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",e.specularMap?"#define USE_SPECULARMAP":"",e.roughnessMap?"#define USE_ROUGHNESSMAP":"",e.metalnessMap?"#define USE_METALNESSMAP":"",e.alphaMap?"#define USE_ALPHAMAP":"",e.vertexColors?"#define USE_COLOR":"",e.flatShading?
-"#define FLAT_SHADED":"",e.skinning?"#define USE_SKINNING":"",e.useVertexTexture?"#define BONE_TEXTURE":"",e.morphTargets?"#define USE_MORPHTARGETS":"",e.morphNormals&&!1===e.flatShading?"#define USE_MORPHNORMALS":"",e.doubleSided?"#define DOUBLE_SIDED":"",e.flipSided?"#define FLIP_SIDED":"","#define NUM_CLIPPING_PLANES "+e.numClippingPlanes,e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapEnabled?"#define "+q:"",e.sizeAttenuation?"#define USE_SIZEATTENUATION":"",e.logarithmicDepthBuffer?
-"#define USE_LOGDEPTHBUF":"",e.logarithmicDepthBuffer&&a.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;",
-"\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(wc).join("\n"),
-d=[g,"precision "+e.precision+" float;","precision "+e.precision+" int;","#define SHADER_NAME "+d.name,t,e.alphaTest?"#define ALPHATEST "+e.alphaTest:"","#define GAMMA_FACTOR "+l,e.useFog&&e.fog?"#define USE_FOG":"",e.useFog&&e.fogExp?"#define FOG_EXP2":"",e.map?"#define USE_MAP":"",e.envMap?"#define USE_ENVMAP":"",e.envMap?"#define "+v:"",e.envMap?"#define "+p:"",e.envMap?"#define "+r:"",e.lightMap?"#define USE_LIGHTMAP":"",e.aoMap?"#define USE_AOMAP":"",e.emissiveMap?"#define USE_EMISSIVEMAP":"",
-e.bumpMap?"#define USE_BUMPMAP":"",e.normalMap?"#define USE_NORMALMAP":"",e.specularMap?"#define USE_SPECULARMAP":"",e.roughnessMap?"#define USE_ROUGHNESSMAP":"",e.metalnessMap?"#define USE_METALNESSMAP":"",e.alphaMap?"#define USE_ALPHAMAP":"",e.vertexColors?"#define USE_COLOR":"",e.gradientMap?"#define USE_GRADIENTMAP":"",e.flatShading?"#define FLAT_SHADED":"",e.doubleSided?"#define DOUBLE_SIDED":"",e.flipSided?"#define FLIP_SIDED":"","#define NUM_CLIPPING_PLANES "+e.numClippingPlanes,"#define UNION_CLIPPING_PLANES "+
-(e.numClippingPlanes-e.numClipIntersection),e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapEnabled?"#define "+q:"",e.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",e.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",e.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",e.logarithmicDepthBuffer&&a.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"",e.envMap&&a.extensions.get("EXT_shader_texture_lod")?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;",
-"uniform vec3 cameraPosition;",0!==e.toneMapping?"#define TONE_MAPPING":"",0!==e.toneMapping?X.tonemapping_pars_fragment:"",0!==e.toneMapping?Yf("toneMapping",e.toneMapping):"",e.dithering?"#define DITHERING":"",e.outputEncoding||e.mapEncoding||e.envMapEncoding||e.emissiveMapEncoding?X.encodings_pars_fragment:"",e.mapEncoding?Td("mapTexelToLinear",e.mapEncoding):"",e.envMapEncoding?Td("envMapTexelToLinear",e.envMapEncoding):"",e.emissiveMapEncoding?Td("emissiveMapTexelToLinear",e.emissiveMapEncoding):
-"",e.outputEncoding?Xf("linearToOutputTexel",e.outputEncoding):"",e.depthPacking?"#define DEPTH_PACKING "+c.depthPacking:"","\n"].filter(wc).join("\n"));k=Ud(k);k=Me(k,e);m=Ud(m);m=Me(m,e);c.isShaderMaterial||(k=Ne(k),m=Ne(m));m=d+m;k=Ke(f,f.VERTEX_SHADER,h+k);m=Ke(f,f.FRAGMENT_SHADER,m);f.attachShader(n,k);f.attachShader(n,m);void 0!==c.index0AttributeName?f.bindAttribLocation(n,0,c.index0AttributeName):!0===e.morphTargets&&f.bindAttribLocation(n,0,"position");f.linkProgram(n);e=f.getProgramInfoLog(n);
-q=f.getShaderInfoLog(k);v=f.getShaderInfoLog(m);r=p=!0;if(!1===f.getProgramParameter(n,f.LINK_STATUS))p=!1,console.error("THREE.WebGLProgram: shader error: ",f.getError(),"gl.VALIDATE_STATUS",f.getProgramParameter(n,f.VALIDATE_STATUS),"gl.getProgramInfoLog",e,q,v);else if(""!==e)console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",e);else if(""===q||""===v)r=!1;r&&(this.diagnostics={runnable:p,material:c,programLog:e,vertexShader:{log:q,prefix:h},fragmentShader:{log:v,prefix:d}});f.deleteShader(k);
-f.deleteShader(m);var x;this.getUniforms=function(){void 0===x&&(x=new eb(f,n,a));return x};var u;this.getAttributes=function(){if(void 0===u){for(var a={},b=f.getProgramParameter(n,f.ACTIVE_ATTRIBUTES),c=0;c<b;c++){var d=f.getActiveAttrib(n,c).name;a[d]=f.getAttribLocation(n,d)}u=a}return u};this.destroy=function(){f.deleteProgram(n);this.program=void 0};Object.defineProperties(this,{uniforms:{get:function(){console.warn("THREE.WebGLProgram: .uniforms is now .getUniforms().");return this.getUniforms()}},
-attributes:{get:function(){console.warn("THREE.WebGLProgram: .attributes is now .getAttributes().");return this.getAttributes()}}});this.id=bg++;this.code=b;this.usedTimes=1;this.program=n;this.vertexShader=k;this.fragmentShader=m;return this}function cg(a,b){function c(a,b){var c;a?a.isTexture?c=a.encoding:a.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),c=a.texture.encoding):c=3E3;3E3===
-c&&b&&(c=3007);return c}var d=[],e={MeshDepthMaterial:"depth",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"phong",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points"},f="precision supportsVertexTextures map mapEncoding envMap envMapMode envMapEncoding lightMap aoMap emissiveMap emissiveMapEncoding bumpMap normalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors fog useFog fogExp flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking dithering".split(" ");
-this.getParameters=function(d,f,k,m,q,v){var p=e[d.type],r;if(v.isSkinnedMesh)if(r=v.skeleton.bones,b.floatVertexTextures)r=1024;else{var l=Math.min(Math.floor((b.maxVertexUniforms-20)/4),r.length);l<r.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+r.length+" bones. This GPU supports "+l+"."),r=0):r=l}else r=0;l=a.getPrecision();null!==d.precision&&(l=b.getMaxPrecision(d.precision),l!==d.precision&&console.warn("THREE.WebGLProgram.getParameters:",d.precision,"not supported, using",l,"instead."));
-var t=a.getRenderTarget();return{shaderID:p,precision:l,supportsVertexTextures:b.vertexTextures,outputEncoding:c(t?t.texture:null,a.gammaOutput),map:!!d.map,mapEncoding:c(d.map,a.gammaInput),envMap:!!d.envMap,envMapMode:d.envMap&&d.envMap.mapping,envMapEncoding:c(d.envMap,a.gammaInput),envMapCubeUV:!!d.envMap&&(306===d.envMap.mapping||307===d.envMap.mapping),lightMap:!!d.lightMap,aoMap:!!d.aoMap,emissiveMap:!!d.emissiveMap,emissiveMapEncoding:c(d.emissiveMap,a.gammaInput),bumpMap:!!d.bumpMap,normalMap:!!d.normalMap,
-displacementMap:!!d.displacementMap,roughnessMap:!!d.roughnessMap,metalnessMap:!!d.metalnessMap,specularMap:!!d.specularMap,alphaMap:!!d.alphaMap,gradientMap:!!d.gradientMap,combine:d.combine,vertexColors:d.vertexColors,fog:!!k,useFog:d.fog,fogExp:k&&k.isFogExp2,flatShading:1===d.shading,sizeAttenuation:d.sizeAttenuation,logarithmicDepthBuffer:b.logarithmicDepthBuffer,skinning:d.skinning&&0<r,maxBones:r,useVertexTexture:b.floatVertexTextures,morphTargets:d.morphTargets,morphNormals:d.morphNormals,
-maxMorphTargets:a.maxMorphTargets,maxMorphNormals:a.maxMorphNormals,numDirLights:f.directional.length,numPointLights:f.point.length,numSpotLights:f.spot.length,numRectAreaLights:f.rectArea.length,numHemiLights:f.hemi.length,numClippingPlanes:m,numClipIntersection:q,dithering:d.dithering,shadowMapEnabled:a.shadowMap.enabled&&v.receiveShadow&&0<f.shadows.length,shadowMapType:a.shadowMap.type,toneMapping:a.toneMapping,physicallyCorrectLights:a.physicallyCorrectLights,premultipliedAlpha:d.premultipliedAlpha,
-alphaTest:d.alphaTest,doubleSided:2===d.side,flipSided:1===d.side,depthPacking:void 0!==d.depthPacking?d.depthPacking:!1}};this.getProgramCode=function(b,c){var d=[];c.shaderID?d.push(c.shaderID):(d.push(b.fragmentShader),d.push(b.vertexShader));if(void 0!==b.defines)for(var e in b.defines)d.push(e),d.push(b.defines[e]);for(e=0;e<f.length;e++)d.push(c[f[e]]);d.push(b.onBeforeCompile.toString());d.push(a.gammaOutput);return d.join()};this.acquireProgram=function(b,c,e,f){for(var q,v=0,p=d.length;v<
-p;v++){var r=d[v];if(r.code===f){q=r;++q.usedTimes;break}}void 0===q&&(q=new ag(a,f,b,c,e),d.push(q));return q};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=d.indexOf(a);d[b]=d[d.length-1];d.pop();a.destroy()}};this.programs=d}function dg(a,b,c,d,e,f,g){function h(a,b){if(a.width>b||a.height>b){var c=b/Math.max(a.width,a.height),d=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");d.width=Math.floor(a.width*c);d.height=Math.floor(a.height*c);d.getContext("2d").drawImage(a,
-0,0,a.width,a.height,0,0,d.width,d.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+d.width+"x"+d.height,a);return d}return a}function k(a){return Y.isPowerOfTwo(a.width)&&Y.isPowerOfTwo(a.height)}function m(a,b){return a.generateMipmaps&&b&&1003!==a.minFilter&&1006!==a.minFilter}function q(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function v(b){b=b.target;b.removeEventListener("dispose",v);a:{var c=d.get(b);if(b.image&&c.__image__webglTextureCube)a.deleteTexture(c.__image__webglTextureCube);
-else{if(void 0===c.__webglInit)break a;a.deleteTexture(c.__webglTexture)}d.remove(b)}g.textures--}function p(b){b=b.target;b.removeEventListener("dispose",p);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b.isWebGLRenderTargetCube)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer),
-c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer);d.remove(b.texture);d.remove(b)}g.textures--}function r(b,p){var q=d.get(b);if(0<b.version&&q.__version!==b.version){var r=b.image;if(void 0===r)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined",b);else if(!1===r.complete)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete",b);else{void 0===q.__webglInit&&(q.__webglInit=!0,b.addEventListener("dispose",v),q.__webglTexture=
-a.createTexture(),g.textures++);c.activeTexture(a.TEXTURE0+p);c.bindTexture(a.TEXTURE_2D,q.__webglTexture);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);a.pixelStorei(a.UNPACK_PREMULTIPLY_ALPHA_WEBGL,b.premultiplyAlpha);a.pixelStorei(a.UNPACK_ALIGNMENT,b.unpackAlignment);var t=h(b.image,e.maxTextureSize);if((1001!==b.wrapS||1001!==b.wrapT||1003!==b.minFilter&&1006!==b.minFilter)&&!1===k(t))if(r=t,r instanceof HTMLImageElement||r instanceof HTMLCanvasElement){var n=document.createElementNS("http://www.w3.org/1999/xhtml",
-"canvas");n.width=Y.nearestPowerOfTwo(r.width);n.height=Y.nearestPowerOfTwo(r.height);n.getContext("2d").drawImage(r,0,0,n.width,n.height);console.warn("THREE.WebGLRenderer: image is not power of two ("+r.width+"x"+r.height+"). Resized to "+n.width+"x"+n.height,r);t=n}else t=r;var r=k(t),n=f(b.format),y=f(b.type);l(a.TEXTURE_2D,b,r);var aa=b.mipmaps;if(b.isDepthTexture){aa=a.DEPTH_COMPONENT;if(1015===b.type){if(!x)throw Error("Float Depth Texture only supported in WebGL2.0");aa=a.DEPTH_COMPONENT32F}else x&&
-(aa=a.DEPTH_COMPONENT16);1026===b.format&&aa===a.DEPTH_COMPONENT&&1012!==b.type&&1014!==b.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),b.type=1012,y=f(b.type));1027===b.format&&(aa=a.DEPTH_STENCIL,1020!==b.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),b.type=1020,y=f(b.type)));c.texImage2D(a.TEXTURE_2D,0,aa,t.width,t.height,0,n,y,null)}else if(b.isDataTexture)if(0<aa.length&&
-r){for(var F=0,ja=aa.length;F<ja;F++)t=aa[F],c.texImage2D(a.TEXTURE_2D,F,n,t.width,t.height,0,n,y,t.data);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,n,t.width,t.height,0,n,y,t.data);else if(b.isCompressedTexture)for(F=0,ja=aa.length;F<ja;F++)t=aa[F],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(n)?c.compressedTexImage2D(a.TEXTURE_2D,F,n,t.width,t.height,0,t.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):
-c.texImage2D(a.TEXTURE_2D,F,n,t.width,t.height,0,n,y,t.data);else if(0<aa.length&&r){F=0;for(ja=aa.length;F<ja;F++)t=aa[F],c.texImage2D(a.TEXTURE_2D,F,n,n,y,t);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,n,n,y,t);m(b,r)&&a.generateMipmap(a.TEXTURE_2D);q.__version=b.version;if(b.onUpdate)b.onUpdate(b);return}}c.activeTexture(a.TEXTURE0+p);c.bindTexture(a.TEXTURE_2D,q.__webglTexture)}function l(c,g,h){h?(a.texParameteri(c,a.TEXTURE_WRAP_S,f(g.wrapS)),a.texParameteri(c,a.TEXTURE_WRAP_T,f(g.wrapT)),
-a.texParameteri(c,a.TEXTURE_MAG_FILTER,f(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,f(g.minFilter))):(a.texParameteri(c,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(c,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),1001===g.wrapS&&1001===g.wrapT||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.",g),a.texParameteri(c,a.TEXTURE_MAG_FILTER,q(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,q(g.minFilter)),
-1003!==g.minFilter&&1006!==g.minFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.",g));!(h=b.get("EXT_texture_filter_anisotropic"))||1015===g.type&&null===b.get("OES_texture_float_linear")||1016===g.type&&null===b.get("OES_texture_half_float_linear")||!(1<g.anisotropy||d.get(g).__currentAnisotropy)||(a.texParameterf(c,h.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(g.anisotropy,e.getMaxAnisotropy())),d.get(g).__currentAnisotropy=
-g.anisotropy)}function t(b,e,g,h){var k=f(e.texture.format),m=f(e.texture.type);c.texImage2D(h,0,k,e.width,e.height,0,k,m,null);a.bindFramebuffer(a.FRAMEBUFFER,b);a.framebufferTexture2D(a.FRAMEBUFFER,g,h,d.get(e.texture).__webglTexture,0);a.bindFramebuffer(a.FRAMEBUFFER,null)}function n(b,c){a.bindRenderbuffer(a.RENDERBUFFER,b);c.depthBuffer&&!c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_COMPONENT16,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.RENDERBUFFER,
-b)):c.depthBuffer&&c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_STENCIL,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.RENDERBUFFER,b)):a.renderbufferStorage(a.RENDERBUFFER,a.RGBA4,c.width,c.height);a.bindRenderbuffer(a.RENDERBUFFER,null)}var x="undefined"!==typeof WebGL2RenderingContext&&a instanceof WebGL2RenderingContext;this.setTexture2D=r;this.setTextureCube=function(b,p){var q=d.get(b);if(6===b.image.length)if(0<b.version&&q.__version!==
-b.version){q.__image__webglTextureCube||(b.addEventListener("dispose",v),q.__image__webglTextureCube=a.createTexture(),g.textures++);c.activeTexture(a.TEXTURE0+p);c.bindTexture(a.TEXTURE_CUBE_MAP,q.__image__webglTextureCube);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);for(var r=b&&b.isCompressedTexture,t=b.image[0]&&b.image[0].isDataTexture,n=[],y=0;6>y;y++)n[y]=r||t?t?b.image[y].image:b.image[y]:h(b.image[y],e.maxCubemapSize);var x=k(n[0]),F=f(b.format),ja=f(b.type);l(a.TEXTURE_CUBE_MAP,b,x);for(y=
-0;6>y;y++)if(r)for(var T,C=n[y].mipmaps,z=0,B=C.length;z<B;z++)T=C[z],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(F)?c.compressedTexImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+y,z,F,T.width,T.height,0,T.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+y,z,F,T.width,T.height,0,F,ja,T.data);else t?c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+y,0,F,n[y].width,n[y].height,
-0,F,ja,n[y].data):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+y,0,F,F,ja,n[y]);m(b,x)&&a.generateMipmap(a.TEXTURE_CUBE_MAP);q.__version=b.version;if(b.onUpdate)b.onUpdate(b)}else c.activeTexture(a.TEXTURE0+p),c.bindTexture(a.TEXTURE_CUBE_MAP,q.__image__webglTextureCube)};this.setTextureCubeDynamic=function(b,e){c.activeTexture(a.TEXTURE0+e);c.bindTexture(a.TEXTURE_CUBE_MAP,d.get(b).__webglTexture)};this.setupRenderTarget=function(b){var e=d.get(b),f=d.get(b.texture);b.addEventListener("dispose",p);
-f.__webglTexture=a.createTexture();g.textures++;var h=!0===b.isWebGLRenderTargetCube,q=k(b);if(h){e.__webglFramebuffer=[];for(var v=0;6>v;v++)e.__webglFramebuffer[v]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);l(a.TEXTURE_CUBE_MAP,b.texture,q);for(v=0;6>v;v++)t(e.__webglFramebuffer[v],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+v);m(b.texture,q)&&a.generateMipmap(a.TEXTURE_CUBE_MAP);c.bindTexture(a.TEXTURE_CUBE_MAP,
-null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),l(a.TEXTURE_2D,b.texture,q),t(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),m(b.texture,q)&&a.generateMipmap(a.TEXTURE_2D),c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=!0===b.isWebGLRenderTargetCube;if(b.depthTexture){if(f)throw Error("target.depthTexture not supported in Cube render targets");if(b&&b.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported!");a.bindFramebuffer(a.FRAMEBUFFER,
-e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate=!0);r(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,
-a.DEPTH_ATTACHMENT,a.TEXTURE_2D,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.TEXTURE_2D,e,0);else throw Error("Unknown depthTexture format");}else if(f)for(e.__webglDepthbuffer=[],f=0;6>f;f++)a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer[f]),e.__webglDepthbuffer[f]=a.createRenderbuffer(),n(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),n(e.__webglDepthbuffer,
-b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture,f=k(b);m(e,f)&&(b=b.isWebGLRenderTargetCube?a.TEXTURE_CUBE_MAP:a.TEXTURE_2D,e=d.get(e).__webglTexture,c.bindTexture(b,e),a.generateMipmap(b),c.bindTexture(b,null))}}function eg(){var a={};return{get:function(b){b=b.uuid;var c=a[b];void 0===c&&(c={},a[b]=c);return c},remove:function(b){delete a[b.uuid]},clear:function(){a={}}}}function fg(a,b,c){function d(b,c,d){var e=new Uint8Array(4),f=a.createTexture();
-a.bindTexture(b,f);a.texParameteri(b,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(b,a.TEXTURE_MAG_FILTER,a.NEAREST);for(b=0;b<d;b++)a.texImage2D(c+b,0,a.RGBA,1,1,0,a.RGBA,a.UNSIGNED_BYTE,e);return f}function e(b){!0!==u[b]&&(a.enable(b),u[b]=!0)}function f(b){!1!==u[b]&&(a.disable(b),u[b]=!1)}function g(b,d,g,h,k,m,p,q){0!==b?e(a.BLEND):f(a.BLEND);5===b||b===w&&q===ja||(2===b?q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE,a.ONE,a.ONE,a.ONE)):(a.blendEquation(a.FUNC_ADD),
-a.blendFunc(a.SRC_ALPHA,a.ONE)):3===b?q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.ZERO,a.ONE_MINUS_SRC_COLOR,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.ONE_MINUS_SRC_COLOR)):4===b?q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.SRC_COLOR,a.ZERO,a.SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.SRC_COLOR)):q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE,a.ONE_MINUS_SRC_ALPHA,
-a.ONE,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.SRC_ALPHA,a.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA)),w=b,ja=q);if(5===b){k=k||d;m=m||g;p=p||h;if(d!==I||k!==O)a.blendEquationSeparate(c(d),c(k)),I=d,O=k;if(g!==W||h!==D||m!==aa||p!==F)a.blendFuncSeparate(c(g),c(h),c(m),c(p)),W=g,D=h,aa=m,F=p}else F=aa=O=D=W=I=null}function h(b){T!==b&&(b?a.frontFace(a.CW):a.frontFace(a.CCW),T=b)}function k(b){0!==b?(e(a.CULL_FACE),b!==C&&(1===b?a.cullFace(a.BACK):
-2===b?a.cullFace(a.FRONT):a.cullFace(a.FRONT_AND_BACK))):f(a.CULL_FACE);C=b}function m(b,c,d){if(b){if(e(a.POLYGON_OFFSET_FILL),B!==c||P!==d)a.polygonOffset(c,d),B=c,P=d}else f(a.POLYGON_OFFSET_FILL)}function q(b){void 0===b&&(b=a.TEXTURE0+V-1);S!==b&&(a.activeTexture(b),S=b)}var v=new function(){var b=!1,c=new fa,d=null,e=new fa;return{setMask:function(c){d===c||b||(a.colorMask(c,c,c,c),d=c)},setLocked:function(a){b=a},setClear:function(b,d,f,g,h){!0===h&&(b*=g,d*=g,f*=g);c.set(b,d,f,g);!1===e.equals(c)&&
-(a.clearColor(b,d,f,g),e.copy(c))},reset:function(){b=!1;d=null;e.set(0,0,0,1)}}},p=new function(){var b=!1,c=null,d=null,g=null;return{setTest:function(b){b?e(a.DEPTH_TEST):f(a.DEPTH_TEST)},setMask:function(d){c===d||b||(a.depthMask(d),c=d)},setFunc:function(b){if(d!==b){if(b)switch(b){case 0:a.depthFunc(a.NEVER);break;case 1:a.depthFunc(a.ALWAYS);break;case 2:a.depthFunc(a.LESS);break;case 3:a.depthFunc(a.LEQUAL);break;case 4:a.depthFunc(a.EQUAL);break;case 5:a.depthFunc(a.GEQUAL);break;case 6:a.depthFunc(a.GREATER);
-break;case 7:a.depthFunc(a.NOTEQUAL);break;default:a.depthFunc(a.LEQUAL)}else a.depthFunc(a.LEQUAL);d=b}},setLocked:function(a){b=a},setClear:function(b){g!==b&&(a.clearDepth(b),g=b)},reset:function(){b=!1;g=d=c=null}}},r=new function(){var b=!1,c=null,d=null,g=null,h=null,k=null,m=null,p=null,q=null;return{setTest:function(b){b?e(a.STENCIL_TEST):f(a.STENCIL_TEST)},setMask:function(d){c===d||b||(a.stencilMask(d),c=d)},setFunc:function(b,c,e){if(d!==b||g!==c||h!==e)a.stencilFunc(b,c,e),d=b,g=c,h=e},
-setOp:function(b,c,d){if(k!==b||m!==c||p!==d)a.stencilOp(b,c,d),k=b,m=c,p=d},setLocked:function(a){b=a},setClear:function(b){q!==b&&(a.clearStencil(b),q=b)},reset:function(){b=!1;q=p=m=k=h=g=d=c=null}}},l=a.getParameter(a.MAX_VERTEX_ATTRIBS),t=new Uint8Array(l),n=new Uint8Array(l),x=new Uint8Array(l),u={},H=null,w=null,I=null,W=null,D=null,O=null,aa=null,F=null,ja=!1,T=null,C=null,z=null,B=null,P=null,M=null,V=a.getParameter(a.MAX_COMBINED_TEXTURE_IMAGE_UNITS),l=parseFloat(/^WebGL\ ([0-9])/.exec(a.getParameter(a.VERSION))[1]),
-pa=1<=parseFloat(l),S=null,N={},E=new fa,G=new fa,K={};K[a.TEXTURE_2D]=d(a.TEXTURE_2D,a.TEXTURE_2D,1);K[a.TEXTURE_CUBE_MAP]=d(a.TEXTURE_CUBE_MAP,a.TEXTURE_CUBE_MAP_POSITIVE_X,6);return{buffers:{color:v,depth:p,stencil:r},init:function(){v.setClear(0,0,0,1);p.setClear(1);r.setClear(0);e(a.DEPTH_TEST);p.setFunc(3);h(!1);k(1);e(a.CULL_FACE);e(a.BLEND);g(1)},initAttributes:function(){for(var a=0,b=t.length;a<b;a++)t[a]=0},enableAttribute:function(c){t[c]=1;0===n[c]&&(a.enableVertexAttribArray(c),n[c]=
-1);0!==x[c]&&(b.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(c,0),x[c]=0)},enableAttributeAndDivisor:function(c,d){t[c]=1;0===n[c]&&(a.enableVertexAttribArray(c),n[c]=1);x[c]!==d&&(b.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(c,d),x[c]=d)},disableUnusedAttributes:function(){for(var b=0,c=n.length;b!==c;++b)n[b]!==t[b]&&(a.disableVertexAttribArray(b),n[b]=0)},enable:e,disable:f,getCompressedTextureFormats:function(){if(null===H&&(H=[],b.get("WEBGL_compressed_texture_pvrtc")||
-b.get("WEBGL_compressed_texture_s3tc")||b.get("WEBGL_compressed_texture_etc1")))for(var c=a.getParameter(a.COMPRESSED_TEXTURE_FORMATS),d=0;d<c.length;d++)H.push(c[d]);return H},setBlending:g,setMaterial:function(b){2===b.side?f(a.CULL_FACE):e(a.CULL_FACE);h(1===b.side);!0===b.transparent?g(b.blending,b.blendEquation,b.blendSrc,b.blendDst,b.blendEquationAlpha,b.blendSrcAlpha,b.blendDstAlpha,b.premultipliedAlpha):g(0);p.setFunc(b.depthFunc);p.setTest(b.depthTest);p.setMask(b.depthWrite);v.setMask(b.colorWrite);
-m(b.polygonOffset,b.polygonOffsetFactor,b.polygonOffsetUnits)},setFlipSided:h,setCullFace:k,setLineWidth:function(b){b!==z&&(pa&&a.lineWidth(b),z=b)},setPolygonOffset:m,getScissorTest:function(){return M},setScissorTest:function(b){(M=b)?e(a.SCISSOR_TEST):f(a.SCISSOR_TEST)},activeTexture:q,bindTexture:function(b,c){null===S&&q();var d=N[S];void 0===d&&(d={type:void 0,texture:void 0},N[S]=d);if(d.type!==b||d.texture!==c)a.bindTexture(b,c||K[b]),d.type=b,d.texture=c},compressedTexImage2D:function(){try{a.compressedTexImage2D.apply(a,
-arguments)}catch(b){console.error("THREE.WebGLState:",b)}},texImage2D:function(){try{a.texImage2D.apply(a,arguments)}catch(b){console.error("THREE.WebGLState:",b)}},scissor:function(b){!1===E.equals(b)&&(a.scissor(b.x,b.y,b.z,b.w),E.copy(b))},viewport:function(b){!1===G.equals(b)&&(a.viewport(b.x,b.y,b.z,b.w),G.copy(b))},reset:function(){for(var b=0;b<n.length;b++)1===n[b]&&(a.disableVertexAttribArray(b),n[b]=0);u={};S=H=null;N={};C=T=w=null;v.reset();p.reset();r.reset()}}}function gg(a,b,c){function d(b){if("highp"===
-b){if(0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.HIGH_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.HIGH_FLOAT).precision)return"highp";b="mediump"}return"mediump"===b&&0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.MEDIUM_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.MEDIUM_FLOAT).precision?"mediump":"lowp"}var e,f=void 0!==c.precision?c.precision:"highp",g=d(f);g!==f&&(console.warn("THREE.WebGLRenderer:",f,"not supported, using",g,"instead."),f=g);c=
-!0===c.logarithmicDepthBuffer&&!!b.get("EXT_frag_depth");var g=a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS),h=a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS),k=a.getParameter(a.MAX_TEXTURE_SIZE),m=a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE),q=a.getParameter(a.MAX_VERTEX_ATTRIBS),v=a.getParameter(a.MAX_VERTEX_UNIFORM_VECTORS),p=a.getParameter(a.MAX_VARYING_VECTORS),r=a.getParameter(a.MAX_FRAGMENT_UNIFORM_VECTORS),l=0<h,t=!!b.get("OES_texture_float");return{getMaxAnisotropy:function(){if(void 0!==e)return e;
-var c=b.get("EXT_texture_filter_anisotropic");return e=null!==c?a.getParameter(c.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:d,precision:f,logarithmicDepthBuffer:c,maxTextures:g,maxVertexTextures:h,maxTextureSize:k,maxCubemapSize:m,maxAttributes:q,maxVertexUniforms:v,maxVaryings:p,maxFragmentUniforms:r,vertexTextures:l,floatFragmentTextures:t,floatVertexTextures:l&&t}}function kd(a){qa.call(this);this.cameras=a||[]}function hg(a){var b=this,c=null,d=null;"VRFrameData"in window&&(d=new window.VRFrameData);
-var e=new K,f=new K,g=new K,h=new qa;h.bounds=new fa(0,0,.5,1);h.layers.enable(1);var k=new qa;k.bounds=new fa(.5,0,.5,1);k.layers.enable(2);var m=new kd([h,k]);m.layers.enable(1);m.layers.enable(2);var q,v;window.addEventListener("vrdisplaypresentchange",function(){if(c.isPresenting){var d=c.getEyeParameters("left"),e=d.renderWidth,d=d.renderHeight;v=a.getPixelRatio();q=a.getSize();a.setDrawingBufferSize(2*e,d,1)}else b.enabled&&a.setDrawingBufferSize(q.width,q.height,v)},!1);this.standing=this.enabled=
-!1;this.getDevice=function(){return c};this.setDevice=function(a){void 0!==a&&(c=a)};this.getCamera=function(a){if(null===c)return a;c.depthNear=a.near;c.depthFar=a.far;c.getFrameData(d);var b=d.pose;null!==b.position?a.position.fromArray(b.position):a.position.set(0,0,0);null!==b.orientation&&a.quaternion.fromArray(b.orientation);a.updateMatrixWorld();b=c.stageParameters;this.standing&&b&&(f.fromArray(b.sittingToStandingTransform),g.getInverse(f),a.matrixWorld.multiply(f),a.matrixWorldInverse.multiply(g));
-if(!1===c.isPresenting)return a;m.matrixWorld.copy(a.matrixWorld);m.matrixWorldInverse.copy(a.matrixWorldInverse);h.matrixWorldInverse.fromArray(d.leftViewMatrix);k.matrixWorldInverse.fromArray(d.rightViewMatrix);this.standing&&b&&(h.matrixWorldInverse.multiply(g),k.matrixWorldInverse.multiply(g));a=a.parent;null!==a&&(e.getInverse(a.matrixWorld),h.matrixWorldInverse.multiply(e),k.matrixWorldInverse.multiply(e));h.matrixWorld.getInverse(h.matrixWorldInverse);k.matrixWorld.getInverse(k.matrixWorldInverse);
-h.projectionMatrix.fromArray(d.leftProjectionMatrix);k.projectionMatrix.fromArray(d.rightProjectionMatrix);m.projectionMatrix.copy(h.projectionMatrix);a=c.getLayers();a.length&&(a=a[0],null!==a.leftBounds&&4===a.leftBounds.length&&h.bounds.fromArray(a.leftBounds),null!==a.rightBounds&&4===a.rightBounds.length&&k.bounds.fromArray(a.rightBounds));return m};this.getStandingMatrix=function(){return f};this.submitFrame=function(){c&&c.isPresenting&&c.submitFrame()}}function ig(a){var b={};return{get:function(c){if(void 0!==
-b[c])return b[c];var d;switch(c){case "WEBGL_depth_texture":d=a.getExtension("WEBGL_depth_texture")||a.getExtension("MOZ_WEBGL_depth_texture")||a.getExtension("WEBKIT_WEBGL_depth_texture");break;case "EXT_texture_filter_anisotropic":d=a.getExtension("EXT_texture_filter_anisotropic")||a.getExtension("MOZ_EXT_texture_filter_anisotropic")||a.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case "WEBGL_compressed_texture_s3tc":d=a.getExtension("WEBGL_compressed_texture_s3tc")||a.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||
-a.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case "WEBGL_compressed_texture_pvrtc":d=a.getExtension("WEBGL_compressed_texture_pvrtc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;case "WEBGL_compressed_texture_etc1":d=a.getExtension("WEBGL_compressed_texture_etc1");break;default:d=a.getExtension(c)}null===d&&console.warn("THREE.WebGLRenderer: "+c+" extension not supported.");return b[c]=d}}}function jg(){function a(){m.value!==d&&(m.value=d,m.needsUpdate=0<e);c.numPlanes=
-e;c.numIntersection=0}function b(a,b,d,e){var f=null!==a?a.length:0,g=null;if(0!==f){g=m.value;if(!0!==e||null===g){e=d+4*f;b=b.matrixWorldInverse;k.getNormalMatrix(b);if(null===g||g.length<e)g=new Float32Array(e);for(e=0;e!==f;++e,d+=4)h.copy(a[e]).applyMatrix4(b,k),h.normal.toArray(g,d),g[d+3]=h.constant}m.value=g;m.needsUpdate=!0}c.numPlanes=f;return g}var c=this,d=null,e=0,f=!1,g=!1,h=new Aa,k=new Ba,m={value:null,needsUpdate:!1};this.uniform=m;this.numIntersection=this.numPlanes=0;this.init=
-function(a,c,g){var h=0!==a.length||c||0!==e||f;f=c;d=b(a,g,0);e=a.length;return h};this.beginShadows=function(){g=!0;b(null)};this.endShadows=function(){g=!1;a()};this.setState=function(c,h,k,r,l,t){if(!f||null===c||0===c.length||g&&!k)g?b(null):a();else{k=g?0:e;var n=4*k,x=l.clippingState||null;m.value=x;x=b(c,r,n,t);for(c=0;c!==n;++c)x[c]=d[c];l.clippingState=x;this.numIntersection=h?this.numPlanes:0;this.numPlanes+=k}}}function Xd(a){function b(){ga.init();ga.scissor(J.copy(ea).multiplyScalar(Q));
-ga.viewport(U.copy(hd).multiplyScalar(Q))}function c(){S=G=null;pa="";V=-1;ga.reset()}function d(a){a.preventDefault();c();b();ha.clear();xa.clear()}function e(a){a=a.target;a.removeEventListener("dispose",e);f(a);ha.remove(a)}function f(a){var b=ha.get(a).program;a.program=void 0;void 0!==b&&va.releaseProgram(b)}function g(a,b,c){a.render(function(a){B.renderBufferImmediate(a,b,c)})}function h(a,b){return Math.abs(b[0])-Math.abs(a[0])}function k(a,b,c){if(a.visible){if(a.layers.test(b.layers))if(a.isLight)aa.push(a);
-else if(a.isSprite)a.frustumCulled&&!Vd.intersectsSprite(a)||C.push(a);else if(a.isLensFlare)z.push(a);else if(a.isImmediateRenderObject)c&&Oa.setFromMatrixPosition(a.matrixWorld).applyMatrix4(jd),F.push(a,null,a.material,Oa.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.update(),!a.frustumCulled||Vd.intersectsObject(a)){c&&Oa.setFromMatrixPosition(a.matrixWorld).applyMatrix4(jd);var d=xa.update(a),e=a.material;if(Array.isArray(e))for(var f=d.groups,g=0,h=f.length;g<
-h;g++){var m=f[g],q=e[m.materialIndex];q&&q.visible&&F.push(a,d,q,Oa.z,m)}else e.visible&&F.push(a,d,e,Oa.z,null)}a=a.children;g=0;for(h=a.length;g<h;g++)k(a[g],b,c)}}function m(a,b,c,d){for(var e=0,f=a.length;e<f;e++){var g=a[e],h=g.object,k=g.geometry,m=void 0===d?g.material:d,g=g.group;if(c.isArrayCamera){N=c;for(var p=c.cameras,v=0,r=p.length;v<r;v++){var l=p[v];if(h.layers.test(l.layers)){var t=l.bounds,n=t.x*ba,ca=t.y*L,u=t.z*ba,t=t.w*L;B.setViewport(n,ca,u,t);B.setScissor(n,ca,u,t);B.setScissorTest(!0);
-q(h,b,l,k,m,g)}}}else N=null,q(h,b,c,k,m,g)}}function q(a,b,c,d,e,f){a.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse,a.matrixWorld);a.normalMatrix.getNormalMatrix(a.modelViewMatrix);a.onBeforeRender(B,b,c,d,e,f);if(a.isImmediateRenderObject){ga.setMaterial(e);var h=p(c,b.fog,e,a);pa="";g(a,h,e)}else B.renderBufferDirect(c,b.fog,d,e,a,f);a.onAfterRender(B,b,c,d,e,f)}function v(a,b,c){var d=ha.get(a);c=va.getParameters(a,da,b,Ha.numPlanes,Ha.numIntersection,c);var g=va.getProgramCode(a,c),h=
-d.program,k=!0;if(void 0===h)a.addEventListener("dispose",e);else if(h.code!==g)f(a);else{if(void 0!==c.shaderID)return;k=!1}k&&(c.shaderID?(h=$a[c.shaderID],d.shader={name:a.type,uniforms:Ca.clone(h.uniforms),vertexShader:h.vertexShader,fragmentShader:h.fragmentShader}):d.shader={name:a.type,uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader},a.onBeforeCompile(d.shader),h=va.acquireProgram(a,d.shader,c,g),d.program=h,a.program=h);c=h.getAttributes();if(a.morphTargets)for(g=
-a.numSupportedMorphTargets=0;g<B.maxMorphTargets;g++)0<=c["morphTarget"+g]&&a.numSupportedMorphTargets++;if(a.morphNormals)for(g=a.numSupportedMorphNormals=0;g<B.maxMorphNormals;g++)0<=c["morphNormal"+g]&&a.numSupportedMorphNormals++;c=d.shader.uniforms;if(!a.isShaderMaterial&&!a.isRawShaderMaterial||!0===a.clipping)d.numClippingPlanes=Ha.numPlanes,d.numIntersection=Ha.numIntersection,c.clippingPlanes=Ha.uniform;d.fog=b;d.lightsHash=da.hash;a.lights&&(c.ambientLightColor.value=da.ambient,c.directionalLights.value=
-da.directional,c.spotLights.value=da.spot,c.rectAreaLights.value=da.rectArea,c.pointLights.value=da.point,c.hemisphereLights.value=da.hemi,c.directionalShadowMap.value=da.directionalShadowMap,c.directionalShadowMatrix.value=da.directionalShadowMatrix,c.spotShadowMap.value=da.spotShadowMap,c.spotShadowMatrix.value=da.spotShadowMatrix,c.pointShadowMap.value=da.pointShadowMap,c.pointShadowMatrix.value=da.pointShadowMatrix);a=d.program.getUniforms();a=eb.seqWithValue(a.seq,c);d.uniformsList=a}function p(a,
-b,c,d){X=0;var e=ha.get(c);id&&(Wd||a!==S)&&Ha.setState(c.clippingPlanes,c.clipIntersection,c.clipShadows,a,e,a===S&&c.id===V);!1===c.needsUpdate&&(void 0===e.program?c.needsUpdate=!0:c.fog&&e.fog!==b?c.needsUpdate=!0:c.lights&&e.lightsHash!==da.hash?c.needsUpdate=!0:void 0===e.numClippingPlanes||e.numClippingPlanes===Ha.numPlanes&&e.numIntersection===Ha.numIntersection||(c.needsUpdate=!0));c.needsUpdate&&(v(c,b,d),c.needsUpdate=!1);var f=!1,g=!1,h=!1,k=e.program,m=k.getUniforms(),q=e.shader.uniforms;
-k.id!==G&&(A.useProgram(k.program),G=k.id,h=g=f=!0);c.id!==V&&(V=c.id,g=!0);if(f||a!==S){m.setValue(A,"projectionMatrix",a.projectionMatrix);ia.logarithmicDepthBuffer&&m.setValue(A,"logDepthBufFC",2/(Math.log(a.far+1)/Math.LN2));S!==(N||a)&&(S=N||a,h=g=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.envMap)f=m.map.cameraPosition,void 0!==f&&f.setValue(A,Oa.setFromMatrixPosition(a.matrixWorld));(c.isMeshPhongMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||
-c.isShaderMaterial||c.skinning)&&m.setValue(A,"viewMatrix",a.matrixWorldInverse)}if(c.skinning&&(m.setOptional(A,d,"bindMatrix"),m.setOptional(A,d,"bindMatrixInverse"),a=d.skeleton))if(f=a.bones,ia.floatVertexTextures){if(void 0===a.boneTexture){var f=Math.sqrt(4*f.length),f=Y.nextPowerOfTwo(Math.ceil(f)),f=Math.max(f,4),p=new Float32Array(f*f*4);p.set(a.boneMatrices);var t=new db(p,f,f,1023,1015);a.boneMatrices=p;a.boneTexture=t;a.boneTextureSize=f}m.setValue(A,"boneTexture",a.boneTexture);m.setValue(A,
-"boneTextureSize",a.boneTextureSize)}else m.setOptional(A,a,"boneMatrices");if(g){m.setValue(A,"toneMappingExposure",B.toneMappingExposure);m.setValue(A,"toneMappingWhitePoint",B.toneMappingWhitePoint);c.lights&&(g=h,q.ambientLightColor.needsUpdate=g,q.directionalLights.needsUpdate=g,q.pointLights.needsUpdate=g,q.spotLights.needsUpdate=g,q.rectAreaLights.needsUpdate=g,q.hemisphereLights.needsUpdate=g);b&&c.fog&&(q.fogColor.value=b.color,b.isFog?(q.fogNear.value=b.near,q.fogFar.value=b.far):b.isFogExp2&&
-(q.fogDensity.value=b.density));if(c.isMeshBasicMaterial||c.isMeshLambertMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.isMeshNormalMaterial||c.isMeshDepthMaterial){q.opacity.value=c.opacity;q.diffuse.value=c.color;c.emissive&&q.emissive.value.copy(c.emissive).multiplyScalar(c.emissiveIntensity);q.map.value=c.map;q.specularMap.value=c.specularMap;q.alphaMap.value=c.alphaMap;c.lightMap&&(q.lightMap.value=c.lightMap,q.lightMapIntensity.value=c.lightMapIntensity);c.aoMap&&(q.aoMap.value=
-c.aoMap,q.aoMapIntensity.value=c.aoMapIntensity);var n;c.map?n=c.map:c.specularMap?n=c.specularMap:c.displacementMap?n=c.displacementMap:c.normalMap?n=c.normalMap:c.bumpMap?n=c.bumpMap:c.roughnessMap?n=c.roughnessMap:c.metalnessMap?n=c.metalnessMap:c.alphaMap?n=c.alphaMap:c.emissiveMap&&(n=c.emissiveMap);void 0!==n&&(n.isWebGLRenderTarget&&(n=n.texture),b=n.offset,n=n.repeat,q.offsetRepeat.value.set(b.x,b.y,n.x,n.y));q.envMap.value=c.envMap;q.flipEnvMap.value=c.envMap&&c.envMap.isCubeTexture?-1:1;
-q.reflectivity.value=c.reflectivity;q.refractionRatio.value=c.refractionRatio}c.isLineBasicMaterial?(q.diffuse.value=c.color,q.opacity.value=c.opacity):c.isLineDashedMaterial?(q.diffuse.value=c.color,q.opacity.value=c.opacity,q.dashSize.value=c.dashSize,q.totalSize.value=c.dashSize+c.gapSize,q.scale.value=c.scale):c.isPointsMaterial?(q.diffuse.value=c.color,q.opacity.value=c.opacity,q.size.value=c.size*Q,q.scale.value=.5*L,q.map.value=c.map,null!==c.map&&(n=c.map.offset,c=c.map.repeat,q.offsetRepeat.value.set(n.x,
-n.y,c.x,c.y))):c.isMeshLambertMaterial?c.emissiveMap&&(q.emissiveMap.value=c.emissiveMap):c.isMeshToonMaterial?(r(q,c),c.gradientMap&&(q.gradientMap.value=c.gradientMap)):c.isMeshPhongMaterial?r(q,c):c.isMeshPhysicalMaterial?(q.clearCoat.value=c.clearCoat,q.clearCoatRoughness.value=c.clearCoatRoughness,l(q,c)):c.isMeshStandardMaterial?l(q,c):c.isMeshDepthMaterial?c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=c.displacementScale,q.displacementBias.value=c.displacementBias):
-c.isMeshNormalMaterial&&(c.bumpMap&&(q.bumpMap.value=c.bumpMap,q.bumpScale.value=c.bumpScale),c.normalMap&&(q.normalMap.value=c.normalMap,q.normalScale.value.copy(c.normalScale)),c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=c.displacementScale,q.displacementBias.value=c.displacementBias));void 0!==q.ltcMat&&(q.ltcMat.value=R.LTC_MAT_TEXTURE);void 0!==q.ltcMag&&(q.ltcMag.value=R.LTC_MAG_TEXTURE);eb.upload(A,e.uniformsList,q,B)}m.setValue(A,"modelViewMatrix",
-d.modelViewMatrix);m.setValue(A,"normalMatrix",d.normalMatrix);m.setValue(A,"modelMatrix",d.matrixWorld);return k}function r(a,b){a.specular.value=b.specular;a.shininess.value=Math.max(b.shininess,1E-4);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale);b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale));b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=b.displacementScale,
-a.displacementBias.value=b.displacementBias)}function l(a,b){a.roughness.value=b.roughness;a.metalness.value=b.metalness;b.roughnessMap&&(a.roughnessMap.value=b.roughnessMap);b.metalnessMap&&(a.metalnessMap.value=b.metalnessMap);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale);b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale));b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=
-b.displacementScale,a.displacementBias.value=b.displacementBias);b.envMap&&(a.envMapIntensity.value=b.envMapIntensity)}function t(a,b){var c,d,e,f,g=0,h=0,k=0,m,q,p,v=b.matrixWorldInverse,r=0,l=0,n=0,t=0,ca=0;c=0;for(d=a.length;c<d;c++)if(e=a[c],f=e.color,m=e.intensity,q=e.distance,p=e.shadow&&e.shadow.map?e.shadow.map.texture:null,e.isAmbientLight)g+=f.r*m,h+=f.g*m,k+=f.b*m;else if(e.isDirectionalLight){var u=wa.get(e);u.color.copy(e.color).multiplyScalar(e.intensity);u.direction.setFromMatrixPosition(e.matrixWorld);
-Oa.setFromMatrixPosition(e.target.matrixWorld);u.direction.sub(Oa);u.direction.transformDirection(v);if(u.shadow=e.castShadow)f=e.shadow,u.shadowBias=f.bias,u.shadowRadius=f.radius,u.shadowMapSize=f.mapSize;da.directionalShadowMap[r]=p;da.directionalShadowMatrix[r]=e.shadow.matrix;da.directional[r]=u;r++}else if(e.isSpotLight){u=wa.get(e);u.position.setFromMatrixPosition(e.matrixWorld);u.position.applyMatrix4(v);u.color.copy(f).multiplyScalar(m);u.distance=q;u.direction.setFromMatrixPosition(e.matrixWorld);
-Oa.setFromMatrixPosition(e.target.matrixWorld);u.direction.sub(Oa);u.direction.transformDirection(v);u.coneCos=Math.cos(e.angle);u.penumbraCos=Math.cos(e.angle*(1-e.penumbra));u.decay=0===e.distance?0:e.decay;if(u.shadow=e.castShadow)f=e.shadow,u.shadowBias=f.bias,u.shadowRadius=f.radius,u.shadowMapSize=f.mapSize;da.spotShadowMap[n]=p;da.spotShadowMatrix[n]=e.shadow.matrix;da.spot[n]=u;n++}else if(e.isRectAreaLight)u=wa.get(e),u.color.copy(f).multiplyScalar(m/(e.width*e.height)),u.position.setFromMatrixPosition(e.matrixWorld),
-u.position.applyMatrix4(v),oa.identity(),qa.copy(e.matrixWorld),qa.premultiply(v),oa.extractRotation(qa),u.halfWidth.set(.5*e.width,0,0),u.halfHeight.set(0,.5*e.height,0),u.halfWidth.applyMatrix4(oa),u.halfHeight.applyMatrix4(oa),da.rectArea[t]=u,t++;else if(e.isPointLight){u=wa.get(e);u.position.setFromMatrixPosition(e.matrixWorld);u.position.applyMatrix4(v);u.color.copy(e.color).multiplyScalar(e.intensity);u.distance=e.distance;u.decay=0===e.distance?0:e.decay;if(u.shadow=e.castShadow)f=e.shadow,
-u.shadowBias=f.bias,u.shadowRadius=f.radius,u.shadowMapSize=f.mapSize;da.pointShadowMap[l]=p;da.pointShadowMatrix[l]=e.shadow.matrix;da.point[l]=u;l++}else e.isHemisphereLight&&(u=wa.get(e),u.direction.setFromMatrixPosition(e.matrixWorld),u.direction.transformDirection(v),u.direction.normalize(),u.skyColor.copy(e.color).multiplyScalar(m),u.groundColor.copy(e.groundColor).multiplyScalar(m),da.hemi[ca]=u,ca++);da.ambient[0]=g;da.ambient[1]=h;da.ambient[2]=k;da.directional.length=r;da.spot.length=n;
-da.rectArea.length=t;da.point.length=l;da.hemi.length=ca;da.hash=r+","+l+","+n+","+t+","+ca+","+da.shadows.length}function y(a){var b;if(1E3===a)return A.REPEAT;if(1001===a)return A.CLAMP_TO_EDGE;if(1002===a)return A.MIRRORED_REPEAT;if(1003===a)return A.NEAREST;if(1004===a)return A.NEAREST_MIPMAP_NEAREST;if(1005===a)return A.NEAREST_MIPMAP_LINEAR;if(1006===a)return A.LINEAR;if(1007===a)return A.LINEAR_MIPMAP_NEAREST;if(1008===a)return A.LINEAR_MIPMAP_LINEAR;if(1009===a)return A.UNSIGNED_BYTE;if(1017===
-a)return A.UNSIGNED_SHORT_4_4_4_4;if(1018===a)return A.UNSIGNED_SHORT_5_5_5_1;if(1019===a)return A.UNSIGNED_SHORT_5_6_5;if(1010===a)return A.BYTE;if(1011===a)return A.SHORT;if(1012===a)return A.UNSIGNED_SHORT;if(1013===a)return A.INT;if(1014===a)return A.UNSIGNED_INT;if(1015===a)return A.FLOAT;if(1016===a&&(b=ma.get("OES_texture_half_float"),null!==b))return b.HALF_FLOAT_OES;if(1021===a)return A.ALPHA;if(1022===a)return A.RGB;if(1023===a)return A.RGBA;if(1024===a)return A.LUMINANCE;if(1025===a)return A.LUMINANCE_ALPHA;
-if(1026===a)return A.DEPTH_COMPONENT;if(1027===a)return A.DEPTH_STENCIL;if(100===a)return A.FUNC_ADD;if(101===a)return A.FUNC_SUBTRACT;if(102===a)return A.FUNC_REVERSE_SUBTRACT;if(200===a)return A.ZERO;if(201===a)return A.ONE;if(202===a)return A.SRC_COLOR;if(203===a)return A.ONE_MINUS_SRC_COLOR;if(204===a)return A.SRC_ALPHA;if(205===a)return A.ONE_MINUS_SRC_ALPHA;if(206===a)return A.DST_ALPHA;if(207===a)return A.ONE_MINUS_DST_ALPHA;if(208===a)return A.DST_COLOR;if(209===a)return A.ONE_MINUS_DST_COLOR;
-if(210===a)return A.SRC_ALPHA_SATURATE;if(2001===a||2002===a||2003===a||2004===a)if(b=ma.get("WEBGL_compressed_texture_s3tc"),null!==b){if(2001===a)return b.COMPRESSED_RGB_S3TC_DXT1_EXT;if(2002===a)return b.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(2003===a)return b.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(2004===a)return b.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(2100===a||2101===a||2102===a||2103===a)if(b=ma.get("WEBGL_compressed_texture_pvrtc"),null!==b){if(2100===a)return b.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(2101===a)return b.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
-if(2102===a)return b.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(2103===a)return b.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(2151===a&&(b=ma.get("WEBGL_compressed_texture_etc1"),null!==b))return b.COMPRESSED_RGB_ETC1_WEBGL;if(103===a||104===a)if(b=ma.get("EXT_blend_minmax"),null!==b){if(103===a)return b.MIN_EXT;if(104===a)return b.MAX_EXT}return 1020===a&&(b=ma.get("WEBGL_depth_texture"),null!==b)?b.UNSIGNED_INT_24_8_WEBGL:0}console.log("THREE.WebGLRenderer","86");a=a||{};var x=void 0!==a.canvas?a.canvas:document.createElementNS("http://www.w3.org/1999/xhtml",
-"canvas"),u=void 0!==a.context?a.context:null,H=void 0!==a.alpha?a.alpha:!1,w=void 0!==a.depth?a.depth:!0,I=void 0!==a.stencil?a.stencil:!0,W=void 0!==a.antialias?a.antialias:!1,D=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,O=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,aa=[],F=null,ja=new Float32Array(8),C=[],z=[];this.domElement=x;this.context=null;this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes=[];this.localClippingEnabled=
-!1;this.gammaFactor=2;this.physicallyCorrectLights=this.gammaOutput=this.gammaInput=!1;this.toneMappingWhitePoint=this.toneMappingExposure=this.toneMapping=1;this.maxMorphTargets=8;this.maxMorphNormals=4;var B=this,G=null,P=null,M=null,V=-1,pa="",S=null,N=null,J=new fa,Z=null,U=new fa,X=0,ba=x.width,L=x.height,Q=1,ea=new fa(0,0,ba,L),na=!1,hd=new fa(0,0,ba,L),Vd=new gd,Ha=new jg,id=!1,Wd=!1,jd=new K,Oa=new n,qa=new K,oa=new K,da={hash:"",ambient:[0,0,0],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],
-spot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],shadows:[]},ta={geometries:0,textures:0},la={frame:0,calls:0,vertices:0,faces:0,points:0};this.info={render:la,memory:ta,programs:null};var A;try{H={alpha:H,depth:w,stencil:I,antialias:W,premultipliedAlpha:D,preserveDrawingBuffer:O};A=u||x.getContext("webgl",H)||x.getContext("experimental-webgl",H);if(null===A){if(null!==x.getContext("webgl"))throw"Error creating WebGL context with your selected attributes.";
-throw"Error creating WebGL context.";}void 0===A.getShaderPrecisionFormat&&(A.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}});x.addEventListener("webglcontextlost",d,!1)}catch(kg){console.error("THREE.WebGLRenderer: "+kg)}var ma=new ig(A);ma.get("WEBGL_depth_texture");ma.get("OES_texture_float");ma.get("OES_texture_float_linear");ma.get("OES_texture_half_float");ma.get("OES_texture_half_float_linear");ma.get("OES_standard_derivatives");ma.get("ANGLE_instanced_arrays");
-ma.get("OES_element_index_uint")&&(E.MaxIndex=4294967296);var ia=new gg(A,ma,a),ga=new fg(A,ma,y),ha=new eg,ra=new dg(A,ma,ga,ha,ia,y,ta),ua=new Kf(A),za=new Tf(A,ua,ta),xa=new Vf(A,za,la),va=new cg(this,ia),wa=new Uf,Aa=new Qf,ya=new Mf(this,ga,xa,D),sa=new hg(this);this.info.programs=va.programs;var Da=new Sf(A,ma,la),Ea=new Rf(A,ma,la);b();this.context=A;this.capabilities=ia;this.extensions=ma;this.properties=ha;this.renderLists=Aa;this.state=ga;this.vr=sa;var Ba=new Ie(this,da,xa,ia);this.shadowMap=
-Ba;var Fa=new If(this,C),Ga=new Hf(this,z);this.getContext=function(){return A};this.getContextAttributes=function(){return A.getContextAttributes()};this.forceContextLoss=function(){var a=ma.get("WEBGL_lose_context");a&&a.loseContext()};this.getMaxAnisotropy=function(){return ia.getMaxAnisotropy()};this.getPrecision=function(){return ia.precision};this.getPixelRatio=function(){return Q};this.setPixelRatio=function(a){void 0!==a&&(Q=a,this.setSize(ba,L,!1))};this.getSize=function(){return{width:ba,
-height:L}};this.setSize=function(a,b,c){var d=sa.getDevice();d&&d.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(ba=a,L=b,x.width=a*Q,x.height=b*Q,!1!==c&&(x.style.width=a+"px",x.style.height=b+"px"),this.setViewport(0,0,a,b))};this.getDrawingBufferSize=function(){return{width:ba*Q,height:L*Q}};this.setDrawingBufferSize=function(a,b,c){ba=a;L=b;Q=c;x.width=a*c;x.height=b*c;this.setViewport(0,0,a,b)};this.setViewport=function(a,b,c,d){hd.set(a,L-
-b-d,c,d);ga.viewport(U.copy(hd).multiplyScalar(Q))};this.setScissor=function(a,b,c,d){ea.set(a,L-b-d,c,d);ga.scissor(J.copy(ea).multiplyScalar(Q))};this.setScissorTest=function(a){ga.setScissorTest(na=a)};this.getClearColor=ya.getClearColor;this.setClearColor=ya.setClearColor;this.getClearAlpha=ya.getClearAlpha;this.setClearAlpha=ya.setClearAlpha;this.clear=function(a,b,c){var d=0;if(void 0===a||a)d|=A.COLOR_BUFFER_BIT;if(void 0===b||b)d|=A.DEPTH_BUFFER_BIT;if(void 0===c||c)d|=A.STENCIL_BUFFER_BIT;
-A.clear(d)};this.clearColor=function(){this.clear(!0,!1,!1)};this.clearDepth=function(){this.clear(!1,!0,!1)};this.clearStencil=function(){this.clear(!1,!1,!0)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.resetGLState=c;this.dispose=function(){x.removeEventListener("webglcontextlost",d,!1);Aa.dispose()};this.renderBufferImmediate=function(a,b,c){ga.initAttributes();var d=ha.get(a);a.hasPositions&&!d.position&&(d.position=A.createBuffer());a.hasNormals&&!d.normal&&
-(d.normal=A.createBuffer());a.hasUvs&&!d.uv&&(d.uv=A.createBuffer());a.hasColors&&!d.color&&(d.color=A.createBuffer());b=b.getAttributes();a.hasPositions&&(A.bindBuffer(A.ARRAY_BUFFER,d.position),A.bufferData(A.ARRAY_BUFFER,a.positionArray,A.DYNAMIC_DRAW),ga.enableAttribute(b.position),A.vertexAttribPointer(b.position,3,A.FLOAT,!1,0,0));if(a.hasNormals){A.bindBuffer(A.ARRAY_BUFFER,d.normal);if(!c.isMeshPhongMaterial&&!c.isMeshStandardMaterial&&!c.isMeshNormalMaterial&&1===c.shading)for(var e=0,f=
-3*a.count;e<f;e+=9){var g=a.normalArray,h=(g[e+0]+g[e+3]+g[e+6])/3,k=(g[e+1]+g[e+4]+g[e+7])/3,m=(g[e+2]+g[e+5]+g[e+8])/3;g[e+0]=h;g[e+1]=k;g[e+2]=m;g[e+3]=h;g[e+4]=k;g[e+5]=m;g[e+6]=h;g[e+7]=k;g[e+8]=m}A.bufferData(A.ARRAY_BUFFER,a.normalArray,A.DYNAMIC_DRAW);ga.enableAttribute(b.normal);A.vertexAttribPointer(b.normal,3,A.FLOAT,!1,0,0)}a.hasUvs&&c.map&&(A.bindBuffer(A.ARRAY_BUFFER,d.uv),A.bufferData(A.ARRAY_BUFFER,a.uvArray,A.DYNAMIC_DRAW),ga.enableAttribute(b.uv),A.vertexAttribPointer(ua.uv,2,A.FLOAT,
-!1,0,0));a.hasColors&&0!==c.vertexColors&&(A.bindBuffer(A.ARRAY_BUFFER,d.color),A.bufferData(A.ARRAY_BUFFER,a.colorArray,A.DYNAMIC_DRAW),ga.enableAttribute(b.color),A.vertexAttribPointer(b.color,3,A.FLOAT,!1,0,0));ga.disableUnusedAttributes();A.drawArrays(A.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){ga.setMaterial(d);var g=p(a,b,d,e);a=c.id+"_"+g.id+"_"+(!0===d.wireframe);var k=!1;a!==pa&&(pa=a,k=!0);b=e.morphTargetInfluences;if(void 0!==b){var m=[];a=0;for(var q=
-b.length;a<q;a++)k=b[a],m.push([k,a]);m.sort(h);8<m.length&&(m.length=8);var v=c.morphAttributes;a=0;for(q=m.length;a<q;a++)k=m[a],ja[a]=k[0],0!==k[0]?(b=k[1],!0===d.morphTargets&&v.position&&c.addAttribute("morphTarget"+a,v.position[b]),!0===d.morphNormals&&v.normal&&c.addAttribute("morphNormal"+a,v.normal[b])):(!0===d.morphTargets&&c.removeAttribute("morphTarget"+a),!0===d.morphNormals&&c.removeAttribute("morphNormal"+a));a=m.length;for(b=ja.length;a<b;a++)ja[a]=0;g.getUniforms().setValue(A,"morphTargetInfluences",
-ja);k=!0}b=c.index;q=c.attributes.position;m=1;!0===d.wireframe&&(b=za.getWireframeAttribute(c),m=2);var r;a=Da;null!==b&&(r=ua.get(b),a=Ea,a.setIndex(r));if(k){k=void 0;if(c&&c.isInstancedBufferGeometry&&null===ma.get("ANGLE_instanced_arrays"))console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{void 0===k&&(k=0);ga.initAttributes();var v=c.attributes,g=g.getAttributes(),l=d.defaultAttributeValues,
-n;for(n in g){var t=g[n];if(0<=t){var u=v[n];if(void 0!==u){var ca=u.normalized,w=u.itemSize,x=ua.get(u),y=x.buffer,H=x.type,x=x.bytesPerElement;if(u.isInterleavedBufferAttribute){var I=u.data,D=I.stride,u=u.offset;I&&I.isInstancedInterleavedBuffer?(ga.enableAttributeAndDivisor(t,I.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=I.meshPerAttribute*I.count)):ga.enableAttribute(t);A.bindBuffer(A.ARRAY_BUFFER,y);A.vertexAttribPointer(t,w,H,ca,D*x,(k*D+u)*x)}else u.isInstancedBufferAttribute?
-(ga.enableAttributeAndDivisor(t,u.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=u.meshPerAttribute*u.count)):ga.enableAttribute(t),A.bindBuffer(A.ARRAY_BUFFER,y),A.vertexAttribPointer(t,w,H,ca,0,k*w*x)}else if(void 0!==l&&(ca=l[n],void 0!==ca))switch(ca.length){case 2:A.vertexAttrib2fv(t,ca);break;case 3:A.vertexAttrib3fv(t,ca);break;case 4:A.vertexAttrib4fv(t,ca);break;default:A.vertexAttrib1fv(t,ca)}}}ga.disableUnusedAttributes()}null!==b&&A.bindBuffer(A.ELEMENT_ARRAY_BUFFER,
-r.buffer)}r=0;null!==b?r=b.count:void 0!==q&&(r=q.count);b=c.drawRange.start*m;q=null!==f?f.start*m:0;n=Math.max(b,q);f=Math.max(0,Math.min(r,b+c.drawRange.count*m,q+(null!==f?f.count*m:Infinity))-1-n+1);if(0!==f){if(e.isMesh)if(!0===d.wireframe)ga.setLineWidth(d.wireframeLinewidth*(null===P?Q:1)),a.setMode(A.LINES);else switch(e.drawMode){case 0:a.setMode(A.TRIANGLES);break;case 1:a.setMode(A.TRIANGLE_STRIP);break;case 2:a.setMode(A.TRIANGLE_FAN)}else e.isLine?(d=d.linewidth,void 0===d&&(d=1),ga.setLineWidth(d*
-(null===P?Q:1)),e.isLineSegments?a.setMode(A.LINES):e.isLineLoop?a.setMode(A.LINE_LOOP):a.setMode(A.LINE_STRIP)):e.isPoints&&a.setMode(A.POINTS);c&&c.isInstancedBufferGeometry?0<c.maxInstancedCount&&a.renderInstances(c,n,f):a.render(n,f)}};this.compile=function(a,b){aa=[];a.traverse(function(a){a.isLight&&aa.push(a)});t(aa,b);a.traverse(function(b){if(b.material)if(Array.isArray(b.material))for(var c=0;c<b.material.length;c++)v(b.material[c],a.fog,b);else v(b.material,a.fog,b)})};this.animate=function(a){function b(){a();
-(sa.getDevice()||window).requestAnimationFrame(b)}(sa.getDevice()||window).requestAnimationFrame(b)};this.render=function(a,b,c,d){if(b&&b.isCamera){pa="";V=-1;S=null;!0===a.autoUpdate&&a.updateMatrixWorld();null===b.parent&&b.updateMatrixWorld();sa.enabled&&(b=sa.getCamera(b));jd.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);Vd.setFromMatrix(jd);aa.length=0;C.length=0;z.length=0;Wd=this.localClippingEnabled;id=Ha.init(this.clippingPlanes,Wd,b);F=Aa.get(a,b);F.init();k(a,b,B.sortObjects);
-F.finish();!0===B.sortObjects&&F.sort();id&&Ha.beginShadows();for(var e=aa,f=0,g=0,h=e.length;g<h;g++){var q=e[g];q.castShadow&&(da.shadows[f]=q,f++)}da.shadows.length=f;Ba.render(a,b);t(aa,b);id&&Ha.endShadows();la.frame++;la.calls=0;la.vertices=0;la.faces=0;la.points=0;void 0===c&&(c=null);this.setRenderTarget(c);ya.render(a,b,d);d=F.opaque;e=F.transparent;a.overrideMaterial?(f=a.overrideMaterial,d.length&&m(d,a,b,f),e.length&&m(e,a,b,f)):(d.length&&m(d,a,b),e.length&&m(e,a,b));Fa.render(a,b);Ga.render(a,
-b,U);c&&ra.updateRenderTargetMipmap(c);ga.buffers.depth.setTest(!0);ga.buffers.depth.setMask(!0);ga.buffers.color.setMask(!0);b.isArrayCamera&&B.setScissorTest(!1);sa.enabled&&sa.submitFrame()}else console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.")};this.setFaceCulling=function(a,b){ga.setCullFace(a);ga.setFlipSided(0===b)};this.allocTextureUnit=function(){var a=X;a>=ia.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+a+" texture units while this GPU supports only "+
-ia.maxTextures);X+=1;return a};this.setTexture2D=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTarget&&(a||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);ra.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),a=!0);ra.setTexture2D(b,c)}}();this.setTextureCube=function(){var a=
-!1;return function(b,c){b&&b.isWebGLRenderTargetCube&&(a||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&&6===b.image.length?ra.setTextureCube(b,c):ra.setTextureCubeDynamic(b,c)}}();this.getRenderTarget=function(){return P};this.setRenderTarget=function(a){(P=a)&&void 0===ha.get(a).__webglFramebuffer&&ra.setupRenderTarget(a);var b=a&&a.isWebGLRenderTargetCube,
-c;a?(c=ha.get(a),c=b?c.__webglFramebuffer[a.activeCubeFace]:c.__webglFramebuffer,J.copy(a.scissor),Z=a.scissorTest,U.copy(a.viewport)):(c=null,J.copy(ea).multiplyScalar(Q),Z=na,U.copy(hd).multiplyScalar(Q));M!==c&&(A.bindFramebuffer(A.FRAMEBUFFER,c),M=c);ga.scissor(J);ga.setScissorTest(Z);ga.viewport(U);b&&(b=ha.get(a.texture),A.framebufferTexture2D(A.FRAMEBUFFER,A.COLOR_ATTACHMENT0,A.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,b.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=
-function(a,b,c,d,e,f){if(a&&a.isWebGLRenderTarget){var g=ha.get(a).__webglFramebuffer;if(g){var h=!1;g!==M&&(A.bindFramebuffer(A.FRAMEBUFFER,g),h=!0);try{var k=a.texture,m=k.format,q=k.type;1023!==m&&y(m)!==A.getParameter(A.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===q||y(q)===A.getParameter(A.IMPLEMENTATION_COLOR_READ_TYPE)||1015===q&&(ma.get("OES_texture_float")||ma.get("WEBGL_color_buffer_float"))||
-1016===q&&ma.get("EXT_color_buffer_half_float")?A.checkFramebufferStatus(A.FRAMEBUFFER)===A.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&A.readPixels(b,c,d,e,y(m),y(q),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{h&&A.bindFramebuffer(A.FRAMEBUFFER,M)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")}}
-function Ib(a,b){this.name="";this.color=new G(a);this.density=void 0!==b?b:2.5E-4}function Jb(a,b,c){this.name="";this.color=new G(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function ld(){z.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function Yd(a,b,c,d,e){z.call(this);this.lensFlares=[];this.positionScreen=new n;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)}function bb(a){U.call(this);this.type="SpriteMaterial";
-this.color=new G(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}function xc(a){z.call(this);this.type="Sprite";this.material=void 0!==a?a:new bb}function yc(){z.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function zc(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else{console.warn("THREE.Skeleton boneInverses is the wrong length.");
-this.boneInverses=[];for(var c=0,d=this.bones.length;c<d;c++)this.boneInverses.push(new K)}}function md(){z.call(this);this.type="Bone"}function nd(a,b){la.call(this,a,b);this.type="SkinnedMesh";this.bindMode="attached";this.bindMatrix=new K;this.bindMatrixInverse=new K;var c=this.initBones(),c=new zc(c);this.bind(c,this.matrixWorld);this.normalizeSkinWeights()}function ea(a){U.call(this);this.type="LineBasicMaterial";this.color=new G(16777215);this.linewidth=1;this.linejoin=this.linecap="round";
-this.lights=!1;this.setValues(a)}function sa(a,b,c){if(1===c)return console.warn("THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead."),new Q(a,b);z.call(this);this.type="Line";this.geometry=void 0!==a?a:new E;this.material=void 0!==b?b:new ea({color:16777215*Math.random()})}function Q(a,b){sa.call(this,a,b);this.type="LineSegments"}function od(a,b){sa.call(this,a,b);this.type="LineLoop"}function Fa(a){U.call(this);this.type="PointsMaterial";this.color=
-new G(16777215);this.map=null;this.size=1;this.sizeAttenuation=!0;this.lights=!1;this.setValues(a)}function Kb(a,b){z.call(this);this.type="Points";this.geometry=void 0!==a?a:new E;this.material=void 0!==b?b:new Fa({color:16777215*Math.random()})}function Ac(){z.call(this);this.type="Group"}function pd(a,b,c,d,e,f,g,h,k){function m(){requestAnimationFrame(m);a.readyState>=a.HAVE_CURRENT_DATA&&(q.needsUpdate=!0)}ba.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1;var q=this;m()}function Lb(a,b,
-c,d,e,f,g,h,k,m,q,v){ba.call(this,null,f,g,h,k,m,d,e,q,v);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function qd(a,b,c,d,e,f,g,h,k){ba.call(this,a,b,c,d,e,f,g,h,k);this.needsUpdate=!0}function Bc(a,b,c,d,e,f,g,h,k,m){m=void 0!==m?m:1026;if(1026!==m&&1027!==m)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===c&&1026===m&&(c=1012);void 0===c&&1027===m&&(c=1020);ba.call(this,null,d,e,f,g,h,m,c,k);this.image={width:a,
-height:b};this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!==h?h:1003;this.generateMipmaps=this.flipY=!1}function Mb(a){E.call(this);this.type="WireframeGeometry";var b=[],c,d,e,f,g=[0,0],h={},k,m,q=["a","b","c"];if(a&&a.isGeometry){var v=a.faces;c=0;for(e=v.length;c<e;c++){var p=v[c];for(d=0;3>d;d++)k=p[q[d]],m=p[q[(d+1)%3]],g[0]=Math.min(k,m),g[1]=Math.max(k,m),k=g[0]+","+g[1],void 0===h[k]&&(h[k]={index1:g[0],index2:g[1]})}for(k in h)c=h[k],q=a.vertices[c.index1],b.push(q.x,q.y,q.z),q=a.vertices[c.index2],
-b.push(q.x,q.y,q.z)}else if(a&&a.isBufferGeometry){var r,q=new n;if(null!==a.index){v=a.attributes.position;p=a.index;r=a.groups;0===r.length&&(r=[{start:0,count:p.count,materialIndex:0}]);a=0;for(f=r.length;a<f;++a)for(c=r[a],d=c.start,e=c.count,c=d,e=d+e;c<e;c+=3)for(d=0;3>d;d++)k=p.getX(c+d),m=p.getX(c+(d+1)%3),g[0]=Math.min(k,m),g[1]=Math.max(k,m),k=g[0]+","+g[1],void 0===h[k]&&(h[k]={index1:g[0],index2:g[1]});for(k in h)c=h[k],q.fromBufferAttribute(v,c.index1),b.push(q.x,q.y,q.z),q.fromBufferAttribute(v,
-c.index2),b.push(q.x,q.y,q.z)}else for(v=a.attributes.position,c=0,e=v.count/3;c<e;c++)for(d=0;3>d;d++)h=3*c+d,q.fromBufferAttribute(v,h),b.push(q.x,q.y,q.z),h=3*c+(d+1)%3,q.fromBufferAttribute(v,h),b.push(q.x,q.y,q.z)}this.addAttribute("position",new B(b,3))}function Cc(a,b,c){J.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Nb(a,b,c));this.mergeVertices()}function Nb(a,b,c){E.call(this);this.type="ParametricBufferGeometry";this.parameters=
-{func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=new n,k=new n,m=new n,q=new n,v=new n,p,r,l=b+1;for(p=0;p<=c;p++){var t=p/c;for(r=0;r<=b;r++){var y=r/b,k=a(y,t,k);e.push(k.x,k.y,k.z);0<=y-1E-5?(m=a(y-1E-5,t,m),q.subVectors(k,m)):(m=a(y+1E-5,t,m),q.subVectors(m,k));0<=t-1E-5?(m=a(y,t-1E-5,m),v.subVectors(k,m)):(m=a(y,t+1E-5,m),v.subVectors(m,k));h.crossVectors(q,v).normalize();f.push(h.x,h.y,h.z);g.push(y,t)}}for(p=0;p<c;p++)for(r=0;r<b;r++)a=p*l+r+1,h=(p+1)*l+r+1,k=(p+1)*l+r,d.push(p*l+r,a,k),
-d.push(a,h,k);this.setIndex(d);this.addAttribute("position",new B(e,3));this.addAttribute("normal",new B(f,3));this.addAttribute("uv",new B(g,2))}function Dc(a,b,c,d){J.call(this);this.type="PolyhedronGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};this.fromBufferGeometry(new za(a,b,c,d));this.mergeVertices()}function za(a,b,c,d){function e(a){h.push(a.x,a.y,a.z)}function f(b,c){var d=3*b;c.x=a[d+0];c.y=a[d+1];c.z=a[d+2]}function g(a,b,c,d){0>d&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===
-c.z&&(k[b]=d/2/Math.PI+.5)}E.call(this);this.type="PolyhedronBufferGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};c=c||1;d=d||0;var h=[],k=[];(function(a){for(var c=new n,d=new n,g=new n,h=0;h<b.length;h+=3){f(b[h+0],c);f(b[h+1],d);f(b[h+2],g);var k=c,l=d,y=g,x=Math.pow(2,a),u=[],H,w;for(H=0;H<=x;H++){u[H]=[];var I=k.clone().lerp(y,H/x),W=l.clone().lerp(y,H/x),D=x-H;for(w=0;w<=D;w++)u[H][w]=0===w&&H===x?I:I.clone().lerp(W,w/D)}for(H=0;H<x;H++)for(w=0;w<2*(x-H)-1;w++)k=Math.floor(w/
-2),0===w%2?(e(u[H][k+1]),e(u[H+1][k]),e(u[H][k])):(e(u[H][k+1]),e(u[H+1][k+1]),e(u[H+1][k]))}})(d);(function(a){for(var b=new n,c=0;c<h.length;c+=3)b.x=h[c+0],b.y=h[c+1],b.z=h[c+2],b.normalize().multiplyScalar(a),h[c+0]=b.x,h[c+1]=b.y,h[c+2]=b.z})(c);(function(){for(var a=new n,b=0;b<h.length;b+=3)a.x=h[b+0],a.y=h[b+1],a.z=h[b+2],k.push(Math.atan2(a.z,-a.x)/2/Math.PI+.5,1-(Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+.5));for(var a=new n,b=new n,c=new n,d=new n,e=new C,f=new C,l=new C,y=0,
-x=0;y<h.length;y+=9,x+=6){a.set(h[y+0],h[y+1],h[y+2]);b.set(h[y+3],h[y+4],h[y+5]);c.set(h[y+6],h[y+7],h[y+8]);e.set(k[x+0],k[x+1]);f.set(k[x+2],k[x+3]);l.set(k[x+4],k[x+5]);d.copy(a).add(b).add(c).divideScalar(3);var u=Math.atan2(d.z,-d.x);g(e,x+0,a,u);g(f,x+2,b,u);g(l,x+4,c,u)}for(a=0;a<k.length;a+=6)b=k[a+0],c=k[a+2],d=k[a+4],e=Math.min(b,c,d),.9<Math.max(b,c,d)&&.1>e&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute("position",new B(h,3));this.addAttribute("normal",
-new B(h.slice(),3));this.addAttribute("uv",new B(k,2));0===d?this.computeVertexNormals():this.normalizeNormals()}function Ec(a,b){J.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ob(a,b));this.mergeVertices()}function Ob(a,b){za.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);this.type="TetrahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Fc(a,b){J.call(this);this.type="OctahedronGeometry";this.parameters=
-{radius:a,detail:b};this.fromBufferGeometry(new lb(a,b));this.mergeVertices()}function lb(a,b){za.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);this.type="OctahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Gc(a,b){J.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Pb(a,b));this.mergeVertices()}function Pb(a,b){var c=(1+Math.sqrt(5))/2;za.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);this.type="IcosahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Hc(a,b){J.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Qb(a,b));this.mergeVertices()}function Qb(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;za.call(this,
-[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Ic(a,
-b,c,d,e,f){J.call(this);this.type="TubeGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};void 0!==f&&console.warn("THREE.TubeGeometry: taper has been removed.");a=new Rb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Rb(a,b,c,d,e){function f(e){var f=a.getPointAt(e/b),m=g.normals[e];e=g.binormals[e];for(v=0;v<=d;v++){var q=v/d*Math.PI*2,l=Math.sin(q),q=-Math.cos(q);
-k.x=q*m.x+l*e.x;k.y=q*m.y+l*e.y;k.z=q*m.z+l*e.z;k.normalize();r.push(k.x,k.y,k.z);h.x=f.x+c*k.x;h.y=f.y+c*k.y;h.z=f.z+c*k.z;p.push(h.x,h.y,h.z)}}E.call(this);this.type="TubeBufferGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new n,k=new n,m=new C,q,v,p=[],r=[],l=[],t=[];for(q=0;q<b;q++)f(q);f(!1===e?b:0);for(q=0;q<=
-b;q++)for(v=0;v<=d;v++)m.x=q/b,m.y=v/d,l.push(m.x,m.y);(function(){for(v=1;v<=b;v++)for(q=1;q<=d;q++){var a=(d+1)*v+(q-1),c=(d+1)*v+q,e=(d+1)*(v-1)+q;t.push((d+1)*(v-1)+(q-1),a,e);t.push(a,c,e)}})();this.setIndex(t);this.addAttribute("position",new B(p,3));this.addAttribute("normal",new B(r,3));this.addAttribute("uv",new B(l,2))}function Jc(a,b,c,d,e,f,g){J.call(this);this.type="TorusKnotGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};void 0!==g&&console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.");
-this.fromBufferGeometry(new Sb(a,b,c,d,e,f));this.mergeVertices()}function Sb(a,b,c,d,e,f){function g(a,b,c,d,e){var f=Math.sin(a);b=c/b*a;c=Math.cos(b);e.x=d*(2+c)*.5*Math.cos(a);e.y=d*(2+c)*f*.5;e.z=d*Math.sin(b)*.5}E.call(this);this.type="TorusKnotBufferGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};a=a||100;b=b||40;c=Math.floor(c)||64;d=Math.floor(d)||8;e=e||2;f=f||3;var h=[],k=[],m=[],q=[],v,p,r=new n,l=new n,t=new n,y=new n,x=new n,u=new n,H=new n;for(v=
-0;v<=c;++v)for(p=v/c*e*Math.PI*2,g(p,e,f,a,t),g(p+.01,e,f,a,y),u.subVectors(y,t),H.addVectors(y,t),x.crossVectors(u,H),H.crossVectors(x,u),x.normalize(),H.normalize(),p=0;p<=d;++p){var w=p/d*Math.PI*2,I=-b*Math.cos(w),w=b*Math.sin(w);r.x=t.x+(I*H.x+w*x.x);r.y=t.y+(I*H.y+w*x.y);r.z=t.z+(I*H.z+w*x.z);k.push(r.x,r.y,r.z);l.subVectors(r,t).normalize();m.push(l.x,l.y,l.z);q.push(v/c);q.push(p/d)}for(p=1;p<=c;p++)for(v=1;v<=d;v++)a=(d+1)*p+(v-1),b=(d+1)*p+v,e=(d+1)*(p-1)+v,h.push((d+1)*(p-1)+(v-1),a,e),
-h.push(a,b,e);this.setIndex(h);this.addAttribute("position",new B(k,3));this.addAttribute("normal",new B(m,3));this.addAttribute("uv",new B(q,2))}function Kc(a,b,c,d,e){J.call(this);this.type="TorusGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};this.fromBufferGeometry(new Tb(a,b,c,d,e));this.mergeVertices()}function Tb(a,b,c,d,e){E.call(this);this.type="TorusBufferGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};a=a||100;b=
-b||40;c=Math.floor(c)||8;d=Math.floor(d)||6;e=e||2*Math.PI;var f=[],g=[],h=[],k=[],m=new n,q=new n,v=new n,p,r;for(p=0;p<=c;p++)for(r=0;r<=d;r++){var l=r/d*e,t=p/c*Math.PI*2;q.x=(a+b*Math.cos(t))*Math.cos(l);q.y=(a+b*Math.cos(t))*Math.sin(l);q.z=b*Math.sin(t);g.push(q.x,q.y,q.z);m.x=a*Math.cos(l);m.y=a*Math.sin(l);v.subVectors(q,m).normalize();h.push(v.x,v.y,v.z);k.push(r/d);k.push(p/c)}for(p=1;p<=c;p++)for(r=1;r<=d;r++)a=(d+1)*(p-1)+r-1,b=(d+1)*(p-1)+r,e=(d+1)*p+r,f.push((d+1)*p+r-1,a,e),f.push(a,
-b,e);this.setIndex(f);this.addAttribute("position",new B(g,3));this.addAttribute("normal",new B(h,3));this.addAttribute("uv",new B(k,2))}function cb(a,b){J.call(this);this.type="ExtrudeGeometry";this.parameters={shapes:a,options:b};this.fromBufferGeometry(new Ga(a,b));this.mergeVertices()}function Ga(a,b){"undefined"!==typeof a&&(E.call(this),this.type="ExtrudeBufferGeometry",a=Array.isArray(a)?a:[a],this.addShapeList(a,b),this.computeVertexNormals())}function Lc(a,b){J.call(this);this.type="TextGeometry";
-this.parameters={text:a,parameters:b};this.fromBufferGeometry(new Ub(a,b));this.mergeVertices()}function Ub(a,b){b=b||{};var c=b.font;if(!c||!c.isFont)return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new J;c=c.generateShapes(a,b.size,b.curveSegments);b.amount=void 0!==b.height?b.height:50;void 0===b.bevelThickness&&(b.bevelThickness=10);void 0===b.bevelSize&&(b.bevelSize=8);void 0===b.bevelEnabled&&(b.bevelEnabled=!1);Ga.call(this,c,b);this.type="TextBufferGeometry"}
-function Mc(a,b,c,d,e,f,g){J.call(this);this.type="SphereGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};this.fromBufferGeometry(new mb(a,b,c,d,e,f,g));this.mergeVertices()}function mb(a,b,c,d,e,f,g){E.call(this);this.type="SphereBufferGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};a=a||50;b=Math.max(3,Math.floor(b)||8);c=Math.max(2,Math.floor(c)||6);d=void 0!==
-d?d:0;e=void 0!==e?e:2*Math.PI;f=void 0!==f?f:0;g=void 0!==g?g:Math.PI;var h=f+g,k,m,q=0,v=[],p=new n,r=new n,l=[],t=[],y=[],x=[];for(m=0;m<=c;m++){var u=[],H=m/c;for(k=0;k<=b;k++){var w=k/b;p.x=-a*Math.cos(d+w*e)*Math.sin(f+H*g);p.y=a*Math.cos(f+H*g);p.z=a*Math.sin(d+w*e)*Math.sin(f+H*g);t.push(p.x,p.y,p.z);r.set(p.x,p.y,p.z).normalize();y.push(r.x,r.y,r.z);x.push(w,1-H);u.push(q++)}v.push(u)}for(m=0;m<c;m++)for(k=0;k<b;k++)a=v[m][k+1],d=v[m][k],e=v[m+1][k],g=v[m+1][k+1],(0!==m||0<f)&&l.push(a,d,
-g),(m!==c-1||h<Math.PI)&&l.push(d,e,g);this.setIndex(l);this.addAttribute("position",new B(t,3));this.addAttribute("normal",new B(y,3));this.addAttribute("uv",new B(x,2))}function Nc(a,b,c,d,e,f){J.call(this);this.type="RingGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};this.fromBufferGeometry(new Vb(a,b,c,d,e,f));this.mergeVertices()}function Vb(a,b,c,d,e,f){E.call(this);this.type="RingBufferGeometry";this.parameters={innerRadius:a,
-outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};a=a||20;b=b||50;e=void 0!==e?e:0;f=void 0!==f?f:2*Math.PI;c=void 0!==c?Math.max(3,c):8;d=void 0!==d?Math.max(1,d):1;var g=[],h=[],k=[],m=[],q=a,v=(b-a)/d,p=new n,r=new C,l,t;for(l=0;l<=d;l++){for(t=0;t<=c;t++)a=e+t/c*f,p.x=q*Math.cos(a),p.y=q*Math.sin(a),h.push(p.x,p.y,p.z),k.push(0,0,1),r.x=(p.x/b+1)/2,r.y=(p.y/b+1)/2,m.push(r.x,r.y);q+=v}for(l=0;l<d;l++)for(b=l*(c+1),t=0;t<c;t++)a=t+b,e=a+c+1,f=a+c+2,q=a+1,g.push(a,e,q),g.push(e,
-f,q);this.setIndex(g);this.addAttribute("position",new B(h,3));this.addAttribute("normal",new B(k,3));this.addAttribute("uv",new B(m,2))}function Oc(a,b,c,d){J.call(this);this.type="LatheGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};this.fromBufferGeometry(new Wb(a,b,c,d));this.mergeVertices()}function Wb(a,b,c,d){E.call(this);this.type="LatheBufferGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};b=Math.floor(b)||12;c=c||0;d=d||2*Math.PI;d=Y.clamp(d,
-0,2*Math.PI);var e=[],f=[],g=[],h=1/b,k=new n,m=new C,q,v;for(q=0;q<=b;q++){v=c+q*h*d;var p=Math.sin(v),r=Math.cos(v);for(v=0;v<=a.length-1;v++)k.x=a[v].x*p,k.y=a[v].y,k.z=a[v].x*r,f.push(k.x,k.y,k.z),m.x=q/b,m.y=v/(a.length-1),g.push(m.x,m.y)}for(q=0;q<b;q++)for(v=0;v<a.length-1;v++)c=v+q*a.length,h=c+a.length,k=c+a.length+1,m=c+1,e.push(c,h,m),e.push(h,k,m);this.setIndex(e);this.addAttribute("position",new B(f,3));this.addAttribute("uv",new B(g,2));this.computeVertexNormals();if(d===2*Math.PI)for(d=
-this.attributes.normal.array,e=new n,f=new n,g=new n,c=b*a.length*3,v=q=0;q<a.length;q++,v+=3)e.x=d[v+0],e.y=d[v+1],e.z=d[v+2],f.x=d[c+v+0],f.y=d[c+v+1],f.z=d[c+v+2],g.addVectors(e,f).normalize(),d[v+0]=d[c+v+0]=g.x,d[v+1]=d[c+v+1]=g.y,d[v+2]=d[c+v+2]=g.z}function Xb(a,b){J.call(this);this.type="ShapeGeometry";"object"===typeof b&&(console.warn("THREE.ShapeGeometry: Options parameter has been removed."),b=b.curveSegments);this.parameters={shapes:a,curveSegments:b};this.fromBufferGeometry(new Yb(a,
-b));this.mergeVertices()}function Yb(a,b){function c(a){var c,h,m=e.length/3;a=a.extractPoints(b);var l=a.shape,n=a.holes;if(!1===Ia.isClockWise(l))for(l=l.reverse(),a=0,c=n.length;a<c;a++)h=n[a],!0===Ia.isClockWise(h)&&(n[a]=h.reverse());var y=Ia.triangulateShape(l,n);a=0;for(c=n.length;a<c;a++)h=n[a],l=l.concat(h);a=0;for(c=l.length;a<c;a++)h=l[a],e.push(h.x,h.y,0),f.push(0,0,1),g.push(h.x,h.y);a=0;for(c=y.length;a<c;a++)l=y[a],d.push(l[0]+m,l[1]+m,l[2]+m),k+=3}E.call(this);this.type="ShapeBufferGeometry";
-this.parameters={shapes:a,curveSegments:b};b=b||12;var d=[],e=[],f=[],g=[],h=0,k=0;if(!1===Array.isArray(a))c(a);else for(var m=0;m<a.length;m++)c(a[m]),this.addGroup(h,k,m),h+=k,k=0;this.setIndex(d);this.addAttribute("position",new B(e,3));this.addAttribute("normal",new B(f,3));this.addAttribute("uv",new B(g,2))}function Zb(a,b){E.call(this);this.type="EdgesGeometry";this.parameters={thresholdAngle:b};var c=[],d=Math.cos(Y.DEG2RAD*(void 0!==b?b:1)),e=[0,0],f={},g,h,k=["a","b","c"],m;a.isBufferGeometry?
-(m=new J,m.fromBufferGeometry(a)):m=a.clone();m.mergeVertices();m.computeFaceNormals();var q=m.vertices;m=m.faces;for(var v=0,p=m.length;v<p;v++)for(var l=m[v],n=0;3>n;n++)g=l[k[n]],h=l[k[(n+1)%3]],e[0]=Math.min(g,h),e[1]=Math.max(g,h),g=e[0]+","+e[1],void 0===f[g]?f[g]={index1:e[0],index2:e[1],face1:v,face2:void 0}:f[g].face2=v;for(g in f)if(e=f[g],void 0===e.face2||m[e.face1].normal.dot(m[e.face2].normal)<=d)k=q[e.index1],c.push(k.x,k.y,k.z),k=q[e.index2],c.push(k.x,k.y,k.z);this.addAttribute("position",
-new B(c,3))}function nb(a,b,c,d,e,f,g,h){J.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new Ua(a,b,c,d,e,f,g,h));this.mergeVertices()}function Ua(a,b,c,d,e,f,g,h){function k(c){var e,f,k,t=new C,D=new n,O=0,aa=!0===c?a:b,F=!0===c?1:-1;f=ca;for(e=1;e<=d;e++)v.push(0,y*F,0),p.push(0,F,0),l.push(.5,.5),ca++;k=ca;for(e=0;e<=d;e++){var B=e/d*h+g,z=Math.cos(B),
-B=Math.sin(B);D.x=aa*B;D.y=y*F;D.z=aa*z;v.push(D.x,D.y,D.z);p.push(0,F,0);t.x=.5*z+.5;t.y=.5*B*F+.5;l.push(t.x,t.y);ca++}for(e=0;e<d;e++)t=f+e,D=k+e,!0===c?q.push(D,D+1,t):q.push(D+1,D,t),O+=3;m.addGroup(x,O,!0===c?1:2);x+=O}E.call(this);this.type="CylinderBufferGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};var m=this;a=void 0!==a?a:20;b=void 0!==b?b:20;c=void 0!==c?c:100;d=Math.floor(d)||8;e=Math.floor(e)||
-1;f=void 0!==f?f:!1;g=void 0!==g?g:0;h=void 0!==h?h:2*Math.PI;var q=[],v=[],p=[],l=[],ca=0,t=[],y=c/2,x=0;(function(){var f,k,w=new n,I=new n,W=0,D=(b-a)/c;for(k=0;k<=e;k++){var O=[],aa=k/e,F=aa*(b-a)+a;for(f=0;f<=d;f++){var B=f/d,C=B*h+g,z=Math.sin(C),C=Math.cos(C);I.x=F*z;I.y=-aa*c+y;I.z=F*C;v.push(I.x,I.y,I.z);w.set(z,D,C).normalize();p.push(w.x,w.y,w.z);l.push(B,1-aa);O.push(ca++)}t.push(O)}for(f=0;f<d;f++)for(k=0;k<e;k++)w=t[k+1][f],I=t[k+1][f+1],D=t[k][f+1],q.push(t[k][f],w,D),q.push(w,I,D),
-W+=6;m.addGroup(x,W,0);x+=W})();!1===f&&(0<a&&k(!0),0<b&&k(!1));this.setIndex(q);this.addAttribute("position",new B(v,3));this.addAttribute("normal",new B(p,3));this.addAttribute("uv",new B(l,2))}function Pc(a,b,c,d,e,f,g){nb.call(this,0,a,b,c,d,e,f,g);this.type="ConeGeometry";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Qc(a,b,c,d,e,f,g){Ua.call(this,0,a,b,c,d,e,f,g);this.type="ConeBufferGeometry";this.parameters={radius:a,
-height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Rc(a,b,c,d){J.call(this);this.type="CircleGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};this.fromBufferGeometry(new $b(a,b,c,d));this.mergeVertices()}function $b(a,b,c,d){E.call(this);this.type="CircleBufferGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};a=a||50;b=void 0!==b?Math.max(3,b):8;c=void 0!==c?c:0;d=void 0!==d?d:2*Math.PI;var e=[],f=[],g=[],
-h=[],k,m,q=new n,v=new C;f.push(0,0,0);g.push(0,0,1);h.push(.5,.5);m=0;for(k=3;m<=b;m++,k+=3){var p=c+m/b*d;q.x=a*Math.cos(p);q.y=a*Math.sin(p);f.push(q.x,q.y,q.z);g.push(0,0,1);v.x=(f[k]/a+1)/2;v.y=(f[k+1]/a+1)/2;h.push(v.x,v.y)}for(k=1;k<=b;k++)e.push(k,k+1,0);this.setIndex(e);this.addAttribute("position",new B(f,3));this.addAttribute("normal",new B(g,3));this.addAttribute("uv",new B(h,2))}function ac(a){ra.call(this,{uniforms:Ca.merge([R.lights,{opacity:{value:1}}]),vertexShader:X.shadow_vert,
-fragmentShader:X.shadow_frag});this.transparent=this.lights=!0;Object.defineProperties(this,{opacity:{enumerable:!0,get:function(){return this.uniforms.opacity.value},set:function(a){this.uniforms.opacity.value=a}}});this.setValues(a)}function bc(a){ra.call(this,a);this.type="RawShaderMaterial"}function Pa(a){U.call(this);this.defines={STANDARD:""};this.type="MeshStandardMaterial";this.color=new G(16777215);this.metalness=this.roughness=.5;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=
-null;this.aoMapIntensity=1;this.emissive=new G(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.metalnessMap=this.roughnessMap=null;this.envMapIntensity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=
-!1;this.setValues(a)}function ob(a){Pa.call(this);this.defines={PHYSICAL:""};this.type="MeshPhysicalMaterial";this.reflectivity=.5;this.clearCoatRoughness=this.clearCoat=0;this.setValues(a)}function Ja(a){U.call(this);this.type="MeshPhongMaterial";this.color=new G(16777215);this.specular=new G(1118481);this.shininess=30;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new G(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=
-1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function pb(a){Ja.call(this);this.defines={TOON:""};this.type="MeshToonMaterial";this.gradientMap=null;
-this.setValues(a)}function qb(a){U.call(this);this.type="MeshNormalMaterial";this.bumpMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.lights=this.fog=!1;this.setValues(a)}function rb(a){U.call(this);this.type="MeshLambertMaterial";this.color=new G(16777215);this.lightMap=this.map=null;this.lightMapIntensity=
-1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new G(0);this.emissiveIntensity=1;this.envMap=this.alphaMap=this.specularMap=this.emissiveMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function sb(a){U.call(this);this.type="LineDashedMaterial";this.color=new G(16777215);this.scale=this.linewidth=1;this.dashSize=
-3;this.gapSize=1;this.lights=!1;this.setValues(a)}function Zd(a,b,c){var d=this,e=!1,f=0,g=0;this.onStart=void 0;this.onLoad=a;this.onProgress=b;this.onError=c;this.itemStart=function(a){g++;if(!1===e&&void 0!==d.onStart)d.onStart(a,f,g);e=!0};this.itemEnd=function(a){f++;if(void 0!==d.onProgress)d.onProgress(a,f,g);if(f===g&&(e=!1,void 0!==d.onLoad))d.onLoad()};this.itemError=function(a){if(void 0!==d.onError)d.onError(a)}}function Ka(a){this.manager=void 0!==a?a:va}function Oe(a){this.manager=void 0!==
-a?a:va;this._parser=null}function $d(a){this.manager=void 0!==a?a:va;this._parser=null}function Sc(a){this.manager=void 0!==a?a:va}function ae(a){this.manager=void 0!==a?a:va}function rd(a){this.manager=void 0!==a?a:va}function na(a,b){z.call(this);this.type="Light";this.color=new G(a);this.intensity=void 0!==b?b:1;this.receiveShadow=void 0}function sd(a,b,c){na.call(this,a,c);this.type="HemisphereLight";this.castShadow=void 0;this.position.copy(z.DefaultUp);this.updateMatrix();this.groundColor=new G(b)}
-function tb(a){this.camera=a;this.bias=0;this.radius=1;this.mapSize=new C(512,512);this.map=null;this.matrix=new K}function td(){tb.call(this,new qa(50,1,.5,500))}function ud(a,b,c,d,e,f){na.call(this,a,b);this.type="SpotLight";this.position.copy(z.DefaultUp);this.updateMatrix();this.target=new z;Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(a){this.intensity=a/Math.PI}});this.distance=void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/3;this.penumbra=
-void 0!==e?e:0;this.decay=void 0!==f?f:1;this.shadow=new td}function vd(a,b,c,d){na.call(this,a,b);this.type="PointLight";Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(a){this.intensity=a/(4*Math.PI)}});this.distance=void 0!==c?c:0;this.decay=void 0!==d?d:1;this.shadow=new tb(new qa(90,1,.5,500))}function wd(){tb.call(this,new Fb(-5,5,5,-5,.5,500))}function xd(a,b){na.call(this,a,b);this.type="DirectionalLight";this.position.copy(z.DefaultUp);this.updateMatrix();
-this.target=new z;this.shadow=new wd}function yd(a,b){na.call(this,a,b);this.type="AmbientLight";this.castShadow=void 0}function zd(a,b,c,d){na.call(this,a,b);this.type="RectAreaLight";this.position.set(0,1,0);this.updateMatrix();this.width=void 0!==c?c:10;this.height=void 0!==d?d:10}function wa(a,b,c,d){this.parameterPositions=a;this._cachedIndex=0;this.resultBuffer=void 0!==d?d:new b.constructor(c);this.sampleValues=b;this.valueSize=c}function Ad(a,b,c,d){wa.call(this,a,b,c,d);this._offsetNext=
-this._weightNext=this._offsetPrev=this._weightPrev=-0}function Tc(a,b,c,d){wa.call(this,a,b,c,d)}function Bd(a,b,c,d){wa.call(this,a,b,c,d)}function ub(a,b,c,d){if(void 0===a)throw Error("track name is undefined");if(void 0===b||0===b.length)throw Error("no keyframes in track named "+a);this.name=a;this.times=ia.convertArray(b,this.TimeBufferType);this.values=ia.convertArray(c,this.ValueBufferType);this.setInterpolation(d||this.DefaultInterpolation);this.validate();this.optimize()}function cc(a,b,
-c,d){ub.call(this,a,b,c,d)}function Cd(a,b,c,d){wa.call(this,a,b,c,d)}function Uc(a,b,c,d){ub.call(this,a,b,c,d)}function dc(a,b,c,d){ub.call(this,a,b,c,d)}function Dd(a,b,c,d){ub.call(this,a,b,c,d)}function Ed(a,b,c){ub.call(this,a,b,c)}function Fd(a,b,c,d){ub.call(this,a,b,c,d)}function vb(a,b,c,d){ub.apply(this,arguments)}function Da(a,b,c){this.name=a;this.tracks=c;this.duration=void 0!==b?b:-1;this.uuid=Y.generateUUID();0>this.duration&&this.resetDuration();this.optimize()}function Gd(a){this.manager=
-void 0!==a?a:va;this.textures={}}function be(a){this.manager=void 0!==a?a:va}function ec(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}function ce(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!==a?a:va;this.withCredentials=!1}function Pe(a){this.manager=void 0!==a?a:va;this.texturePath=""}function Qe(a,b,c,d,e){b=.5*(d-b);e=.5*(e-c);var f=a*a;return(2*
-c-2*d+b+e)*a*f+(-3*c+3*d-2*b-e)*f+b*a+c}function wb(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function xb(a,b,c,d,e){var f=1-a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}function ua(){this.arcLengthDivisions=200}function Qa(a,b){this.arcLengthDivisions=200;this.v1=a;this.v2=b}function Vc(){this.arcLengthDivisions=200;this.curves=[];this.autoClose=!1}function Va(a,b,c,d,e,f,g,h){this.arcLengthDivisions=200;this.aX=a;this.aY=b;this.xRadius=c;this.yRadius=d;this.aStartAngle=e;this.aEndAngle=
-f;this.aClockwise=g;this.aRotation=h||0}function yb(a){this.arcLengthDivisions=200;this.points=void 0===a?[]:a}function fc(a,b,c,d){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c;this.v3=d}function gc(a,b,c){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c}function Wc(a){Vc.call(this);this.currentPoint=new C;a&&this.fromPoints(a)}function zb(){Wc.apply(this,arguments);this.holes=[]}function de(){this.subPaths=[];this.currentPath=null}function ee(a){this.data=a}function Re(a){this.manager=
-void 0!==a?a:va}function fe(a){this.manager=void 0!==a?a:va}function Se(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new qa;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new qa;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1}function Hd(a,b,c){z.call(this);this.type="CubeCamera";var d=new qa(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new n(1,0,0));this.add(d);var e=new qa(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new n(-1,0,0));this.add(e);
-var f=new qa(90,1,a,b);f.up.set(0,0,1);f.lookAt(new n(0,1,0));this.add(f);var g=new qa(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new n(0,-1,0));this.add(g);var h=new qa(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new n(0,0,1));this.add(h);var k=new qa(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new n(0,0,-1));this.add(k);this.renderTarget=new Db(c,c,{format:1022,magFilter:1006,minFilter:1006});this.renderTarget.texture.name="CubeCamera";this.updateCubeMap=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=
-this.renderTarget,p=c.texture.generateMipmaps;c.texture.generateMipmaps=!1;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.texture.generateMipmaps=p;c.activeCubeFace=5;a.render(b,k,c);a.setRenderTarget(null)}}function ge(){z.call(this);this.type="AudioListener";this.context=he.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=
-null}function hc(a){z.call(this);this.type="Audio";this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.loop=!1;this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function ie(a){hc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function je(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==
-b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function ke(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case "quaternion":b=this._slerp;break;case "string":case "bool":a=Array;b=this._select;break;default:b=this._lerp}this.buffer=new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function Te(a,b,c){c=c||ha.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function ha(a,
-b,c){this.path=b;this.parsedPath=c||ha.parseTrackName(b);this.node=ha.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function Ue(a){this.uuid=Y.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var b={};this._indicesByUUID=b;for(var c=0,d=arguments.length;c!==d;++c)b[arguments[c].uuid]=c;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var e=this;this.stats={objects:{get total(){return e._objects.length},get inUse(){return this.total-
-e.nCachedObjects_}},get bindingsPerObject(){return e._bindings.length}}}function Ve(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=
-null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function We(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Id(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function le(){E.call(this);this.type="InstancedBufferGeometry";
-this.maxInstancedCount=void 0}function me(a,b,c,d){this.uuid=Y.generateUUID();this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function ic(a,b){this.uuid=Y.generateUUID();this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function ne(a,b,c){ic.call(this,a,b);this.meshPerAttribute=c||1}function oe(a,b,c){Z.call(this,a,b);this.meshPerAttribute=c||1}function Xe(a,b,c,d){this.ray=
-new kb(a,b);this.near=c||0;this.far=d||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})}function Ye(a,b){return a.distance-b.distance}function pe(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=a.length;d<e;d++)pe(a[d],b,c,!0)}}function Ze(a){this.autoStart=void 0!==a?
-a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}function $e(a,b,c){this.radius=void 0!==a?a:1;this.phi=void 0!==b?b:0;this.theta=void 0!==c?c:0;return this}function af(a,b,c){this.radius=void 0!==a?a:1;this.theta=void 0!==b?b:0;this.y=void 0!==c?c:0;return this}function ta(a,b){la.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)}function Xc(a){z.call(this);
-this.material=a;this.render=function(a){}}function Yc(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16711680;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=3*c.faces.length:c&&c.isBufferGeometry&&(b=c.attributes.normal.count);c=new E;b=new B(6*b,3);c.addAttribute("position",b);Q.call(this,c,new ea({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function jc(a){z.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=
-!1;a=new E;for(var b=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1],c=0,d=1;32>c;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,Math.cos(f),Math.sin(f),1)}a.addAttribute("position",new B(b,3));b=new ea({fog:!1});this.cone=new Q(a,b);this.add(this.cone);this.update()}function bf(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,bf(a.children[c]));return b}function kc(a){for(var b=bf(a),c=new E,d=[],e=[],f=new G(0,
-0,1),g=new G(0,1,0),h=0;h<b.length;h++){var k=b[h];k.parent&&k.parent.isBone&&(d.push(0,0,0),d.push(0,0,0),e.push(f.r,f.g,f.b),e.push(g.r,g.g,g.b))}c.addAttribute("position",new B(d,3));c.addAttribute("color",new B(e,3));d=new ea({vertexColors:2,depthTest:!1,depthWrite:!1,transparent:!0});Q.call(this,c,d);this.root=a;this.bones=b;this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.onBeforeRender()}function lc(a,b){this.light=a;this.light.updateMatrixWorld();var c=new mb(b,4,2),d=new ya({wireframe:!0,
-fog:!1});d.color.copy(this.light.color);la.call(this,c,d);this.matrix=this.light.matrixWorld;this.matrixAutoUpdate=!1}function mc(a){z.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;a=new ea({color:a.color});var b=new E;b.addAttribute("position",new Z(new Float32Array(15),3));this.add(new sa(b,a));this.update()}function nc(a,b){z.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;var c=
-new lb(b);c.rotateY(.5*Math.PI);var d=new ya({vertexColors:2,wireframe:!0}),e=c.getAttribute("position"),e=new Float32Array(3*e.count);c.addAttribute("color",new Z(e,3));this.add(new la(c,d));this.update()}function Zc(a,b,c,d){a=a||10;b=b||10;c=new G(void 0!==c?c:4473924);d=new G(void 0!==d?d:8947848);var e=b/2,f=a/b,g=a/2;a=[];for(var h=[],k=0,m=0,q=-g;k<=b;k++,q+=f){a.push(-g,0,q,g,0,q);a.push(q,0,-g,q,0,g);var l=k===e?c:d;l.toArray(h,m);m+=3;l.toArray(h,m);m+=3;l.toArray(h,m);m+=3;l.toArray(h,
-m);m+=3}b=new E;b.addAttribute("position",new B(a,3));b.addAttribute("color",new B(h,3));c=new ea({vertexColors:2});Q.call(this,b,c)}function Jd(a,b,c,d,e,f){a=a||10;b=b||16;c=c||8;d=d||64;e=new G(void 0!==e?e:4473924);f=new G(void 0!==f?f:8947848);var g=[],h=[],k,m,q,l,p;for(q=0;q<=b;q++)m=q/b*2*Math.PI,k=Math.sin(m)*a,m=Math.cos(m)*a,g.push(0,0,0),g.push(k,0,m),p=q&1?e:f,h.push(p.r,p.g,p.b),h.push(p.r,p.g,p.b);for(q=0;q<=c;q++)for(p=q&1?e:f,l=a-a/c*q,b=0;b<d;b++)m=b/d*2*Math.PI,k=Math.sin(m)*l,
-m=Math.cos(m)*l,g.push(k,0,m),h.push(p.r,p.g,p.b),m=(b+1)/d*2*Math.PI,k=Math.sin(m)*l,m=Math.cos(m)*l,g.push(k,0,m),h.push(p.r,p.g,p.b);a=new E;a.addAttribute("position",new B(g,3));a.addAttribute("color",new B(h,3));g=new ea({vertexColors:2});Q.call(this,a,g)}function $c(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16776960;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=c.faces.length:console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.");
-c=new E;b=new B(6*b,3);c.addAttribute("position",b);Q.call(this,c,new ea({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function oc(a,b){z.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;void 0===b&&(b=1);var c=new E;c.addAttribute("position",new B([-b,b,0,b,b,0,b,-b,0,-b,-b,0,-b,b,0],3));var d=new ea({fog:!1});this.add(new sa(c,d));c=new E;c.addAttribute("position",new B([0,0,0,0,0,1],3));this.add(new sa(c,d));this.update()}
-function ad(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){f.push(0,0,0);g.push(b.r,b.g,b.b);void 0===h[a]&&(h[a]=[]);h[a].push(f.length/3-1)}var d=new E,e=new ea({color:16777215,vertexColors:1}),f=[],g=[],h={},k=new G(16755200),m=new G(16711680),q=new G(43775),l=new G(16777215),p=new G(3355443);b("n1","n2",k);b("n2","n4",k);b("n4","n3",k);b("n3","n1",k);b("f1","f2",k);b("f2","f4",k);b("f4","f3",k);b("f3","f1",k);b("n1","f1",k);b("n2","f2",k);b("n3","f3",k);b("n4","f4",k);b("p","n1",m);b("p",
-"n2",m);b("p","n3",m);b("p","n4",m);b("u1","u2",q);b("u2","u3",q);b("u3","u1",q);b("c","t",l);b("p","c",p);b("cn1","cn2",p);b("cn3","cn4",p);b("cf1","cf2",p);b("cf3","cf4",p);d.addAttribute("position",new B(f,3));d.addAttribute("color",new B(g,3));Q.call(this,d,e);this.camera=a;this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=h;this.update()}function Ab(a,b){this.object=a;void 0===b&&(b=16776960);var c=new Uint16Array([0,
-1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),d=new Float32Array(24),e=new E;e.setIndex(new Z(c,1));e.addAttribute("position",new Z(d,3));Q.call(this,e,new ea({color:b}));this.matrixAutoUpdate=!1;this.update()}function Bb(a,b,c,d,e,f){z.call(this);void 0===d&&(d=16776960);void 0===c&&(c=1);void 0===e&&(e=.2*c);void 0===f&&(f=.2*e);void 0===Kd&&(Kd=new E,Kd.addAttribute("position",new B([0,0,0,0,1,0],3)),qe=new Ua(0,.5,1,5,1),qe.translate(0,-.5,0));this.position.copy(b);this.line=new sa(Kd,new ea({color:d}));
-this.line.matrixAutoUpdate=!1;this.add(this.line);this.cone=new la(qe,new ya({color:d}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);this.setDirection(a);this.setLength(c,e,f)}function Ld(a){a=a||1;var b=[0,0,0,a,0,0,0,0,0,0,a,0,0,0,0,0,0,a];a=new E;a.addAttribute("position",new B(b,3));a.addAttribute("color",new B([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));b=new ea({vertexColors:2});Q.call(this,a,b)}function re(){var a=0,b=0,c=0,d=0;return{initCatmullRom:function(e,f,g,h,k){e=k*(g-e);h=k*
-(h-f);a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},initNonuniformCatmullRom:function(e,f,g,h,k,m,q){e=((f-e)/k-(g-e)/(k+m)+(g-f)/m)*m;h=((g-f)/m-(h-f)/(m+q)+(h-g)/q)*m;a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},calc:function(e){var f=e*e;return a+b*e+c*f+d*f*e}}}function La(a){this.arcLengthDivisions=200;2>a.length&&console.warn("THREE.CatmullRomCurve3: Points array needs at least two entries.");this.points=a||[];this.closed=!1}function bd(a,b,c,d){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=
-c;this.v3=d}function cd(a,b,c){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c}function dd(a,b){this.arcLengthDivisions=200;this.v1=a;this.v2=b}function Md(a,b,c,d,e,f){Va.call(this,a,b,c,c,d,e,f)}function cf(a){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");La.call(this,a);this.type="catmullrom";this.closed=!0}function df(a){console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");La.call(this,a);this.type=
-"catmullrom"}function se(a){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.");La.call(this,a);this.type="catmullrom"}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52));void 0===Number.isInteger&&(Number.isInteger=function(a){return"number"===typeof a&&isFinite(a)&&Math.floor(a)===a});void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0<a?1:+a});void 0===Function.prototype.name&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}});
-void 0===Object.assign&&function(){Object.assign=function(a){if(void 0===a||null===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=Object(a),c=1;c<arguments.length;c++){var d=arguments[c];if(void 0!==d&&null!==d)for(var e in d)Object.prototype.hasOwnProperty.call(d,e)&&(b[e]=d[e])}return b}}();Object.assign(xa.prototype,{addEventListener:function(a,b){void 0===this._listeners&&(this._listeners={});var c=this._listeners;void 0===c[a]&&(c[a]=[]);-1===c[a].indexOf(b)&&c[a].push(b)},
-hasEventListener:function(a,b){if(void 0===this._listeners)return!1;var c=this._listeners;return void 0!==c[a]&&-1!==c[a].indexOf(b)},removeEventListener:function(a,b){if(void 0!==this._listeners){var c=this._listeners[a];if(void 0!==c){var d=c.indexOf(b);-1!==d&&c.splice(d,1)}}},dispatchEvent:function(a){if(void 0!==this._listeners){var b=this._listeners[a.type];if(void 0!==b){a.target=this;for(var b=b.slice(0),c=0,d=b.length;c<d;c++)b[c].call(this,a)}}}});var Y={DEG2RAD:Math.PI/180,RAD2DEG:180/
-Math.PI,generateUUID:function(){var a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),b=Array(36),c=0,d;return function(){for(var e=0;36>e;e++)8===e||13===e||18===e||23===e?b[e]="-":14===e?b[e]="4":(2>=c&&(c=33554432+16777216*Math.random()|0),d=c&15,c>>=4,b[e]=a[19===e?d&3|8:d]);return b.join("")}}(),clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},lerp:function(a,
-b,c){return(1-c)*a+c*b},smoothstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},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*(.5-Math.random())},degToRad:function(a){return a*Y.DEG2RAD},radToDeg:function(a){return a*Y.RAD2DEG},isPowerOfTwo:function(a){return 0===
-(a&a-1)&&0!==a},nearestPowerOfTwo:function(a){return Math.pow(2,Math.round(Math.log(a)/Math.LN2))},nextPowerOfTwo:function(a){a--;a|=a>>1;a|=a>>2;a|=a>>4;a|=a>>8;a|=a>>16;a++;return a}};Object.defineProperties(C.prototype,{width:{get:function(){return this.x},set:function(a){this.x=a}},height:{get:function(){return this.y},set:function(a){this.y=a}}});Object.assign(C.prototype,{isVector2:!0,set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y=this.x=a;return this},setX:function(a){this.x=
-a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),
-this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},
-subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,
-Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a=new C,b=new C;return function(c,d){a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);
-this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},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.x*this.x+this.y*this.y)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||
-1)},angle:function(){var a=Math.atan2(this.y,this.x);0>a&&(a+=2*Math.PI);return a},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},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,
-a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);return this},rotateAround:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=this.x-
-a.x,f=this.y-a.y;this.x=e*c-f*d+a.x;this.y=e*d+f*c+a.y;return this}});var hf=0;ba.DEFAULT_IMAGE=void 0;ba.DEFAULT_MAPPING=300;Object.defineProperty(ba.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(ba.prototype,xa.prototype,{constructor:ba,isTexture:!0,clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=
-a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){if(void 0!==a.textures[this.uuid])return a.textures[this.uuid];var b={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,
-name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(void 0!==this.image){var c=this.image;void 0===c.uuid&&(c.uuid=Y.generateUUID());if(void 0===a.images[c.uuid]){var d=a.images,e=c.uuid,f=c.uuid,g;void 0!==c.toDataURL?g=c:(g=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),g.width=c.width,g.height=
-c.height,g.getContext("2d").drawImage(c,0,0,c.width,c.height));g=2048<g.width||2048<g.height?g.toDataURL("image/jpeg",.6):g.toDataURL("image/png");d[e]={uuid:f,url:g}}b.image=c.uuid}return a.textures[this.uuid]=b},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(a){if(300===this.mapping){a.multiply(this.repeat);a.add(this.offset);if(0>a.x||1<a.x)switch(this.wrapS){case 1E3:a.x-=Math.floor(a.x);break;case 1001:a.x=0>a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%
-2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1<a.y)switch(this.wrapT){case 1E3:a.y-=Math.floor(a.y);break;case 1001:a.y=0>a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y)}}});Object.assign(fa.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;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},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z,
-this.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors: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},addScaledVector:function(a,
-b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors: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},multiplyScalar:function(a){this.x*=
-a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/
-b);return this},setAxisAngleFromRotationMatrix:function(a){var b,c,d;a=a.elements;var e=a[0];d=a[4];var f=a[8],g=a[1],h=a[5],k=a[9];c=a[2];b=a[6];var m=a[10];if(.01>Math.abs(d-g)&&.01>Math.abs(f-c)&&.01>Math.abs(k-b)){if(.1>Math.abs(d+g)&&.1>Math.abs(f+c)&&.1>Math.abs(k+b)&&.1>Math.abs(e+h+m-3))return this.set(1,0,0,0),this;a=Math.PI;e=(e+1)/2;h=(h+1)/2;m=(m+1)/2;d=(d+g)/4;f=(f+c)/4;k=(k+b)/4;e>h&&e>m?.01>e?(b=0,d=c=.707106781):(b=Math.sqrt(e),c=d/b,d=f/b):h>m?.01>h?(b=.707106781,c=0,d=.707106781):
-(c=Math.sqrt(h),b=d/c,d=k/c):.01>m?(c=b=.707106781,d=0):(d=Math.sqrt(m),b=f/d,c=k/d);this.set(b,c,d,a);return this}a=Math.sqrt((b-k)*(b-k)+(f-c)*(f-c)+(g-d)*(g-d));.001>Math.abs(a)&&(a=1);this.x=(b-k)/a;this.y=(f-c)/a;this.z=(g-d)/a;this.w=Math.acos((e+h+m-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,
-a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,this.w));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new fa,b=new fa);a.set(c,c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,
-c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):
-Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+
-Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===
-b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}});Object.assign(Cb.prototype,xa.prototype,{isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==
-a||this.height!==b)this.width=a,this.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Db.prototype=Object.create(Cb.prototype);
-Db.prototype.constructor=Db;Db.prototype.isWebGLRenderTargetCube=!0;Object.assign(oa,{slerp:function(a,b,c,d){return c.copy(a).slerp(b,d)},slerpFlat:function(a,b,c,d,e,f,g){var h=c[d+0],k=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var q=e[f+1],l=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==q||m!==l){f=1-g;var p=h*d+k*q+m*l+c*e,r=0<=p?1:-1,n=1-p*p;n>Number.EPSILON&&(n=Math.sqrt(n),p=Math.atan2(n,p*r),f=Math.sin(f*p)/n,g=Math.sin(g*p)/n);r*=g;h=h*f+d*r;k=k*f+q*r;m=m*f+l*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+k*k+m*
-m+c*c),h*=g,k*=g,m*=g,c*=g)}a[b]=h;a[b+1]=k;a[b+2]=m;a[b+3]=c}});Object.defineProperties(oa.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=a;this.onChangeCallback()}}});Object.assign(oa.prototype,{set:function(a,b,c,d){this._x=
-a;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback();return this},setFromEuler:function(a,b){if(!a||!a.isEuler)throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var c=a._x,d=a._y,e=a._z,f=a.order,g=Math.cos,h=Math.sin,k=g(c/2),m=g(d/2),g=g(e/2),c=h(c/2),d=
-h(d/2),e=h(e/2);"XYZ"===f?(this._x=c*m*g+k*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g-c*d*e):"YXZ"===f?(this._x=c*m*g+k*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g+c*d*e):"ZXY"===f?(this._x=c*m*g-k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g-c*d*e):"ZYX"===f?(this._x=c*m*g-k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g+c*d*e):"YZX"===f?(this._x=c*m*g+k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g-c*d*e):"XZY"===f&&(this._x=c*m*g-
-k*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g+c*d*e);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);this._x=a.x*d;this._y=a.y*d;this._z=a.z*d;this._w=Math.cos(c);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],k=b[6],b=b[10],m=c+f+b;0<m?(c=.5/Math.sqrt(m+1),this._w=.25/c,this._x=(k-g)*c,this._y=(d-h)*c,this._z=(e-a)*c):c>f&&c>b?(c=2*Math.sqrt(1+
-c-f-b),this._w=(k-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y=.25*c,this._z=(g+k)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+k)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a=new n,b;return function(c,d){void 0===a&&(a=new n);b=c.dot(d)+1;1E-6>b?(b=0,Math.abs(c.x)>Math.abs(c.z)?a.set(-c.y,c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=
-a.y;this._z=a.z;this._w=b;return this.normalize()}}(),inverse:function(){return this.conjugate().normalize()},conjugate:function(){this._x*=-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},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=this.length();
-0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this.onChangeCallback();return this},multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z,f=a._w,g=b._x,h=b._y,
-k=b._z,m=b._w;this._x=c*m+f*g+d*k-e*h;this._y=d*m+f*h+e*g-c*k;this._z=e*m+f*k+c*h-d*g;this._w=f*m-c*g-d*h-e*k;this.onChangeCallback();return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;var h=Math.sqrt(1-g*g);if(.001>Math.abs(h))return this._w=.5*(f+this._w),
-this._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;var k=Math.atan2(h,g),g=Math.sin((1-b)*k)/h,h=Math.sin(b*k)/h;this._w=f*g+this._w*h;this._x=c*g+this._x*h;this._y=d*g+this._y*h;this._z=e*g+this._z*h;this.onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,
-b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(n.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;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},setComponent:function(a,b){switch(a){case 0:this.x=
-b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),
-this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;
-return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*
-b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a=new oa;return function(b){b&&b.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");return this.applyQuaternion(a.setFromEuler(b))}}(),applyAxisAngle:function(){var a=new oa;return function(b,c){return this.applyQuaternion(a.setFromAxisAngle(b,c))}}(),applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*
-b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,k=a*c+g*b-e*d,m=a*d+e*c-f*b,b=-e*b-f*c-g*d;this.x=h*a+b*-e+k*-g-m*-f;this.y=k*a+b*-f+m*-e-h*-g;this.z=m*a+b*
--g+h*-f-k*-e;return this},project:function(){var a=new K;return function(b){a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyMatrix4(a)}}(),unproject:function(){var a=new K;return function(b){a.multiplyMatrices(b.matrixWorld,a.getInverse(b.projectionMatrix));return this.applyMatrix4(a)}}(),transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},
-divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},
-clampScalar:function(){var a=new n,b=new n;return function(c,d){a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);
-this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},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.x*this.x+this.y*this.y+this.z*
-this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},cross:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),
-this.crossVectors(a,b);var c=this.x,d=this.y,e=this.z;this.x=d*a.z-e*a.y;this.y=e*a.x-c*a.z;this.z=c*a.y-d*a.x;return this},crossVectors:function(a,b){var c=a.x,d=a.y,e=a.z,f=b.x,g=b.y,h=b.z;this.x=d*h-e*g;this.y=e*f-c*h;this.z=c*g-d*f;return this},projectOnVector:function(a){var b=a.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a=new n;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=new n;return function(b){return this.sub(a.copy(b).multiplyScalar(2*
-this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*a.lengthSq());return Math.acos(Y.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){var b=Math.sin(a.phi)*a.radius;this.x=b*Math.sin(a.theta);this.y=Math.cos(a.phi)*
-a.radius;this.z=b*Math.cos(a.theta);return this},setFromCylindrical:function(a){this.x=a.radius*Math.sin(a.theta);this.y=a.y;this.z=a.radius*Math.cos(a.theta);return this},setFromMatrixPosition:function(a){a=a.elements;this.x=a[12];this.y=a[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,
-4*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}});Object.assign(K.prototype,
-{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,m,q,l,p,r,n,t){var y=this.elements;y[0]=a;y[4]=b;y[8]=c;y[12]=d;y[1]=e;y[5]=f;y[9]=g;y[13]=h;y[2]=k;y[6]=m;y[10]=q;y[14]=l;y[3]=p;y[7]=r;y[11]=n;y[15]=t;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new K).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];
-b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(){var a=new n;return function(b){var c=this.elements,d=b.elements,
-e=1/a.setFromMatrixColumn(b,0).length(),f=1/a.setFromMatrixColumn(b,1).length();b=1/a.setFromMatrixColumn(b,2).length();c[0]=d[0]*e;c[1]=d[1]*e;c[2]=d[2]*e;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*f;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;return this}}(),makeRotationFromEuler:function(a){a&&a.isEuler||console.error("THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c),c=Math.sin(c),g=Math.cos(d),d=Math.sin(d),
-h=Math.cos(e),e=Math.sin(e);if("XYZ"===a.order){a=f*h;var k=f*e,m=c*h,q=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=k+m*d;b[5]=a-q*d;b[9]=-c*g;b[2]=q-a*d;b[6]=m+k*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,k=g*e,m=d*h,q=d*e,b[0]=a+q*c,b[4]=m*c-k,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=k*c-m,b[6]=q+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,k=g*e,m=d*h,q=d*e,b[0]=a-q*c,b[4]=-f*e,b[8]=m+k*c,b[1]=k+m*c,b[5]=f*h,b[9]=q-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,k=f*e,m=c*h,q=c*e,b[0]=g*h,b[4]=m*d-k,b[8]=a*
-d+q,b[1]=g*e,b[5]=q*d+a,b[9]=k*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,k=f*d,m=c*g,q=c*d,b[0]=g*h,b[4]=q-a*e,b[8]=m*e+k,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=k*e+m,b[10]=a-q*e):"XZY"===a.order&&(a=f*g,k=f*d,m=c*g,q=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+q,b[5]=f*h,b[9]=k*e-m,b[2]=m*e-k,b[6]=c*h,b[10]=q*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){var b=this.elements,c=a._x,d=a._y,e=a._z,f=a._w,g=c+c,h=d+d,k=e+e;a=
-c*g;var m=c*h,c=c*k,q=d*h,d=d*k,e=e*k,g=f*g,h=f*h,f=f*k;b[0]=1-(q+e);b[4]=m-f;b[8]=c+h;b[1]=m+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+q);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},lookAt:function(){var a=new n,b=new n,c=new n;return function(d,e,f){var g=this.elements;c.subVectors(d,e);0===c.lengthSq()&&(c.z=1);c.normalize();a.crossVectors(f,c);0===a.lengthSq()&&(1===Math.abs(f.z)?c.x+=1E-4:c.z+=1E-4,c.normalize(),a.crossVectors(f,c));a.normalize();b.crossVectors(c,
-a);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],k=c[12],m=c[1],q=c[5],l=c[9],
-p=c[13],r=c[2],n=c[6],t=c[10],y=c[14],x=c[3],u=c[7],H=c[11],c=c[15],w=d[0],I=d[4],W=d[8],D=d[12],O=d[1],B=d[5],F=d[9],C=d[13],z=d[2],E=d[6],G=d[10],K=d[14],P=d[3],M=d[7],V=d[11],d=d[15];e[0]=f*w+g*O+h*z+k*P;e[4]=f*I+g*B+h*E+k*M;e[8]=f*W+g*F+h*G+k*V;e[12]=f*D+g*C+h*K+k*d;e[1]=m*w+q*O+l*z+p*P;e[5]=m*I+q*B+l*E+p*M;e[9]=m*W+q*F+l*G+p*V;e[13]=m*D+q*C+l*K+p*d;e[2]=r*w+n*O+t*z+y*P;e[6]=r*I+n*B+t*E+y*M;e[10]=r*W+n*F+t*G+y*V;e[14]=r*D+n*C+t*K+y*d;e[3]=x*w+u*O+H*z+c*P;e[7]=x*I+u*B+H*E+c*M;e[11]=x*W+u*F+H*G+
-c*V;e[15]=x*D+u*C+H*K+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},applyToBufferAttribute:function(){var a=new n;return function(b){for(var c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix4(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),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],k=a[13],m=a[2],q=a[6],l=a[10],p=a[14];return a[3]*(+e*h*q-d*k*q-e*g*l+c*k*l+d*g*p-c*h*p)+a[7]*(+b*h*p-b*k*l+e*f*l-d*f*p+d*k*m-e*h*m)+a[11]*(+b*k*q-b*g*p-e*f*q+c*f*p+e*g*m-c*k*m)+a[15]*(-d*g*m-b*h*q+b*g*l+d*f*q-c*f*l+c*h*m)},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},setPosition:function(a){var b=this.elements;b[12]=
-a.x;b[13]=a.y;b[14]=a.z;return this},getInverse:function(a,b){var c=this.elements,d=a.elements,e=d[0],f=d[1],g=d[2],h=d[3],k=d[4],m=d[5],q=d[6],l=d[7],p=d[8],r=d[9],n=d[10],t=d[11],y=d[12],x=d[13],u=d[14],d=d[15],H=r*u*l-x*n*l+x*q*t-m*u*t-r*q*d+m*n*d,w=y*n*l-p*u*l-y*q*t+k*u*t+p*q*d-k*n*d,I=p*x*l-y*r*l+y*m*t-k*x*t-p*m*d+k*r*d,W=y*r*q-p*x*q-y*m*n+k*x*n+p*m*u-k*r*u,D=e*H+f*w+g*I+h*W;if(0===D){if(!0===b)throw Error("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0");console.warn("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0");
-return this.identity()}D=1/D;c[0]=H*D;c[1]=(x*n*h-r*u*h-x*g*t+f*u*t+r*g*d-f*n*d)*D;c[2]=(m*u*h-x*q*h+x*g*l-f*u*l-m*g*d+f*q*d)*D;c[3]=(r*q*h-m*n*h-r*g*l+f*n*l+m*g*t-f*q*t)*D;c[4]=w*D;c[5]=(p*u*h-y*n*h+y*g*t-e*u*t-p*g*d+e*n*d)*D;c[6]=(y*q*h-k*u*h-y*g*l+e*u*l+k*g*d-e*q*d)*D;c[7]=(k*n*h-p*q*h+p*g*l-e*n*l-k*g*t+e*q*t)*D;c[8]=I*D;c[9]=(y*r*h-p*x*h-y*f*t+e*x*t+p*f*d-e*r*d)*D;c[10]=(k*x*h-y*m*h+y*f*l-e*x*l-k*f*d+e*m*d)*D;c[11]=(p*m*h-k*r*h-p*f*l+e*r*l+k*f*t-e*m*t)*D;c[12]=W*D;c[13]=(p*x*g-y*r*g+y*f*n-e*x*
-n-p*f*u+e*r*u)*D;c[14]=(y*m*g-k*x*g-y*f*q+e*x*q+k*f*u-e*m*u)*D;c[15]=(k*r*g-p*m*g+p*f*q-e*r*q-k*f*n+e*m*n)*D;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y;a=a.z;b[0]*=c;b[4]*=d;b[8]*=a;b[1]*=c;b[5]*=d;b[9]*=a;b[2]*=c;b[6]*=d;b[10]*=a;b[3]*=c;b[7]*=d;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],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},makeRotationX: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,k=e*f,m=e*g;this.set(k*f+c,k*
-g-d*h,k*h+d*g,0,k*g+d*h,m*g+c,m*h-d*f,0,k*h-d*g,m*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},makeShear:function(a,b,c){this.set(1,b,c,0,a,1,c,0,a,b,1,0,0,0,0,1);return this},compose:function(a,b,c){this.makeRotationFromQuaternion(b);this.scale(c);this.setPosition(a);return this},decompose:function(){var a=new n,b=new K;return function(c,d,e){var f=this.elements,g=a.set(f[0],f[1],f[2]).length(),h=a.set(f[4],f[5],f[6]).length(),
-k=a.set(f[8],f[9],f[10]).length();0>this.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.copy(this);c=1/g;var f=1/h,m=1/k;b.elements[0]*=c;b.elements[1]*=c;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*=f;b.elements[6]*=f;b.elements[8]*=m;b.elements[9]*=m;b.elements[10]*=m;d.setFromRotationMatrix(b);e.x=g;e.y=h;e.z=k;return this}}(),makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");
-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/(c-d);g[9]=(c+d)/(c-d);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},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),k=1/(c-d),m=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*k;g[9]=0;g[13]=-((c+d)*k);g[2]=0;g[6]=0;g[10]=-2*m;g[14]=-((f+e)*m);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements;
-a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);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}});db.prototype=Object.create(ba.prototype);
-db.prototype.constructor=db;db.prototype.isDataTexture=!0;Xa.prototype=Object.create(ba.prototype);Xa.prototype.constructor=Xa;Xa.prototype.isCubeTexture=!0;Object.defineProperty(Xa.prototype,"images",{get:function(){return this.image},set:function(a){this.image=a}});var Ce=new ba,De=new Xa,xe=[],ze=[],Be=new Float32Array(16),Ae=new Float32Array(9);He.prototype.setValue=function(a,b){for(var c=this.seq,d=0,e=c.length;d!==e;++d){var f=c[d];f.setValue(a,b[f.id])}};var Pd=/([\w\d_]+)(\])?(\[|\.)?/g;
-eb.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};eb.prototype.setOptional=function(a,b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};eb.upload=function(a,b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],h=c[g.id];!1!==h.needsUpdate&&g.setValue(a,h.value,d)}};eb.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in b&&c.push(f)}return c};var lg={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,
-beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,
-darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,
-khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,
-mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,
-peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,
-yellow:16776960,yellowgreen:10145074};Object.assign(G.prototype,{isColor:!0,r:1,g:1,b:1,set:function(a){a&&a.isColor?this.copy(a):"number"===typeof a?this.setHex(a):"string"===typeof a&&this.setStyle(a);return this},setScalar:function(a){this.b=this.g=this.r=a;return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(){function a(a,c,d){0>d&&(d+=1);1<d&&
---d;return d<1/6?a+6*(c-a)*d:.5>d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b,c,d){b=Y.euclideanModulo(b,1);c=Y.clamp(c,0,1);d=Y.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c=.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-1/3));return this}}(),setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=
-/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){var d=
-parseFloat(c[1])/360,e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^\#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0<a.length&&
-(c=lg[a],void 0!==c?this.setHex(c):console.warn("THREE.Color: Unknown color "+a));return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a,b){void 0===b&&(b=2);this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},copyLinearToGamma:function(a,b){void 0===b&&(b=2);var c=0<b?1/b:1;this.r=Math.pow(a.r,c);this.g=Math.pow(a.g,c);this.b=Math.pow(a.b,c);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);this.b=Math.sqrt(this.b);return this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(a){a=a||{h:0,s:0,l:0};var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),f=Math.min(b,c,d),g,h=(f+e)/2;if(f===
-e)f=g=0;else{var k=e-f,f=.5>=h?k/(e+f):k/(2-e-f);switch(e){case b:g=(c-d)/k+(c<d?6:0);break;case c:g=(d-b)/k+2;break;case d:g=(b-c)/k+4}g/=6}a.h=g;a.s=f;a.l=h;return a},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(a,b,c){var d=this.getHSL();d.h+=a;d.s+=b;d.l+=c;this.setHSL(d.h,d.s,d.l);return this},add:function(a){this.r+=a.r;this.g+=a.g;this.b+=a.b;return this},addColors:function(a,b){this.r=a.r+b.r;this.g=a.g+b.g;this.b=a.b+b.b;return this},
-addScalar:function(a){this.r+=a;this.g+=a;this.b+=a;return this},sub:function(a){this.r=Math.max(0,this.r-a.r);this.g=Math.max(0,this.g-a.g);this.b=Math.max(0,this.b-a.b);return this},multiply:function(a){this.r*=a.r;this.g*=a.g;this.b*=a.b;return this},multiplyScalar:function(a){this.r*=a;this.g*=a;this.b*=a;return this},lerp:function(a,b){this.r+=(a.r-this.r)*b;this.g+=(a.g-this.g)*b;this.b+=(a.b-this.b)*b;return this},equals:function(a){return a.r===this.r&&a.g===this.g&&a.b===this.b},fromArray:function(a,
-b){void 0===b&&(b=0);this.r=a[b];this.g=a[b+1];this.b=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.r;a[b+1]=this.g;a[b+2]=this.b;return a},toJSON:function(){return this.getHex()}});var R={common:{diffuse:{value:new G(15658734)},opacity:{value:1},map:{value:null},offsetRepeat:{value:new fa(0,0,1,1)},specularMap:{value:null},alphaMap:{value:null},envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},
-aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new C(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:2.5E-4},fogNear:{value:1},
-fogFar:{value:2E3},fogColor:{value:new G(16777215)}},lights:{ambientLightColor:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},
-pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new G(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},offsetRepeat:{value:new fa(0,0,1,1)}}},Ca={merge:function(a){for(var b=
-{},c=0;c<a.length;c++){var d=this.clone(a[c]),e;for(e in d)b[e]=d[e]}return b},clone:function(a){var b={},c;for(c in a){b[c]={};for(var d in a[c]){var e=a[c][d];e&&(e.isColor||e.isMatrix3||e.isMatrix4||e.isVector2||e.isVector3||e.isVector4||e.isTexture)?b[c][d]=e.clone():Array.isArray(e)?b[c][d]=e.slice():b[c][d]=e}}return b}},X={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n",
-alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n",
-aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"\nvec3 transformed = vec3( position );\n",beginnormal_vertex:"\nvec3 objectNormal = vec3( normal );\n",bsdfs:"float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE  = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS  = 0.5 / LUT_SIZE;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\n\tfloat b = 3.45068 + (4.18814 + y) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\n\treturn result;\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n",
-bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n",
-clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n",
-clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n",
-color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transpose( const in mat3 v ) {\n\tmat3 tmp;\n\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\n\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\n\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\n\treturn tmp;\n}\n",
-cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1  (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale =  bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n",
-defaultnormal_vertex:"vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n",
-emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n",encodings_fragment:"  gl_FragColor = linearToOutputTexel( gl_FragColor );\n",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M      = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM            = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D      = max( maxRange / maxRGB, 1.0 );\n\tD            = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value )  {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n",
-envmap_fragment:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = asin( flipNormal * reflectVec.y ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n",
-envmap_pars_fragment:"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n",
-envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n",envmap_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n",
-fog_vertex:"\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n  varying float fogDepth;\n#endif\n",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n",
-gradientmap_pars_fragment:"#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n",
-lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n",
-lights_pars:"uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight  ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltcMat;\tuniform sampler2D ltcMag;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n",
-lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n",
-lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n",
-lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3(   1,   0, t.y ),\n\t\t\tvec3(   0, t.z,   0 ),\n\t\t\tvec3( t.w,   0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n",
-lights_template:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n",
-logdepthbuf_fragment:"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n",
-map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n",map_particle_fragment:"#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n",
-metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n",
-morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n",
-normal_flip:"#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n",normal_fragment:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n",
-normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n",
-packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n",
-premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n",dithering_fragment:"#if defined( DITHERING )\n  gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n",dithering_pars_fragment:"#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n",
-roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n",
-shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n",
-shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n",
-shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n",
-skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n",
-skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix  = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n",
-specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n  gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n",tonemapping_pars_fragment:"#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n",
-uv_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n",
-uv_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif",
-uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n",
-cube_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n",
-depth_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n",
-distanceRGBA_frag:"uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include <common>\n#include <packing>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n",distanceRGBA_vert:"varying vec4 vWorldPosition;\n#include <common>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition;\n}\n",
-equirect_frag:"uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n",equirect_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n",
-linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n",
-meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-meshbasic_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}\n",
-meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",
-meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",
-meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",
-meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",
-meshphysical_frag:"#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",
-meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",
-normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n",
-normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n",
-points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",
-shadow_frag:"uniform float opacity;\n#include <common>\n#include <packing>\n#include <bsdfs>\n#include <lights_pars>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n",shadow_vert:"#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n"},$a={basic:{uniforms:Ca.merge([R.common,
-R.aomap,R.lightmap,R.fog]),vertexShader:X.meshbasic_vert,fragmentShader:X.meshbasic_frag},lambert:{uniforms:Ca.merge([R.common,R.aomap,R.lightmap,R.emissivemap,R.fog,R.lights,{emissive:{value:new G(0)}}]),vertexShader:X.meshlambert_vert,fragmentShader:X.meshlambert_frag},phong:{uniforms:Ca.merge([R.common,R.aomap,R.lightmap,R.emissivemap,R.bumpmap,R.normalmap,R.displacementmap,R.gradientmap,R.fog,R.lights,{emissive:{value:new G(0)},specular:{value:new G(1118481)},shininess:{value:30}}]),vertexShader:X.meshphong_vert,
-fragmentShader:X.meshphong_frag},standard:{uniforms:Ca.merge([R.common,R.aomap,R.lightmap,R.emissivemap,R.bumpmap,R.normalmap,R.displacementmap,R.roughnessmap,R.metalnessmap,R.fog,R.lights,{emissive:{value:new G(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:X.meshphysical_vert,fragmentShader:X.meshphysical_frag},points:{uniforms:Ca.merge([R.points,R.fog]),vertexShader:X.points_vert,fragmentShader:X.points_frag},dashed:{uniforms:Ca.merge([R.common,R.fog,{scale:{value:1},
-dashSize:{value:1},totalSize:{value:2}}]),vertexShader:X.linedashed_vert,fragmentShader:X.linedashed_frag},depth:{uniforms:Ca.merge([R.common,R.displacementmap]),vertexShader:X.depth_vert,fragmentShader:X.depth_frag},normal:{uniforms:Ca.merge([R.common,R.bumpmap,R.normalmap,R.displacementmap,{opacity:{value:1}}]),vertexShader:X.normal_vert,fragmentShader:X.normal_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:X.cube_vert,fragmentShader:X.cube_frag},equirect:{uniforms:{tEquirect:{value:null},
-tFlip:{value:-1}},vertexShader:X.equirect_vert,fragmentShader:X.equirect_frag},distanceRGBA:{uniforms:{lightPos:{value:new n}},vertexShader:X.distanceRGBA_vert,fragmentShader:X.distanceRGBA_frag}};$a.physical={uniforms:Ca.merge([$a.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:X.meshphysical_vert,fragmentShader:X.meshphysical_frag};Object.assign(fd.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();
-for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new C;return function(b,c){var d=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||
-this.max.y<this.min.y},getCenter:function(a){a=a||new C;return this.isEmpty()?a.set(0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=a||new C;return this.isEmpty()?a.set(0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},containsPoint:function(a){return a.x<
-this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y},getParameter:function(a,b){return(b||new C).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y?!1:!0},clampPoint:function(a,b){return(b||new C).copy(a).clamp(this.min,this.max)},
-distanceToPoint:function(){var a=new C;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});var Jf=0;Object.assign(U.prototype,xa.prototype,{isMaterial:!0,onBeforeCompile:function(){},
-setValues:function(a){if(void 0!==a)for(var b in a){var c=a[b];if(void 0===c)console.warn("THREE.Material: '"+b+"' parameter is undefined.");else{var d=this[b];void 0===d?console.warn("THREE."+this.type+": '"+b+"' is not a property of this material."):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]="overdraw"===b?Number(c):c}}},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c=void 0===a;c&&(a={textures:{},images:{}});
-var d={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};d.uuid=this.uuid;d.type=this.type;""!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());this.specular&&this.specular.isColor&&(d.specular=this.specular.getHex());void 0!==this.shininess&&(d.shininess=this.shininess);
-void 0!==this.clearCoat&&(d.clearCoat=this.clearCoat);void 0!==this.clearCoatRoughness&&(d.clearCoatRoughness=this.clearCoatRoughness);this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);this.alphaMap&&this.alphaMap.isTexture&&(d.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap&&this.lightMap.isTexture&&(d.lightMap=this.lightMap.toJSON(a).uuid);this.bumpMap&&this.bumpMap.isTexture&&(d.bumpMap=this.bumpMap.toJSON(a).uuid,d.bumpScale=this.bumpScale);this.normalMap&&this.normalMap.isTexture&&
-(d.normalMap=this.normalMap.toJSON(a).uuid,d.normalScale=this.normalScale.toArray());this.displacementMap&&this.displacementMap.isTexture&&(d.displacementMap=this.displacementMap.toJSON(a).uuid,d.displacementScale=this.displacementScale,d.displacementBias=this.displacementBias);this.roughnessMap&&this.roughnessMap.isTexture&&(d.roughnessMap=this.roughnessMap.toJSON(a).uuid);this.metalnessMap&&this.metalnessMap.isTexture&&(d.metalnessMap=this.metalnessMap.toJSON(a).uuid);this.emissiveMap&&this.emissiveMap.isTexture&&
-(d.emissiveMap=this.emissiveMap.toJSON(a).uuid);this.specularMap&&this.specularMap.isTexture&&(d.specularMap=this.specularMap.toJSON(a).uuid);this.envMap&&this.envMap.isTexture&&(d.envMap=this.envMap.toJSON(a).uuid,d.reflectivity=this.reflectivity);this.gradientMap&&this.gradientMap.isTexture&&(d.gradientMap=this.gradientMap.toJSON(a).uuid);void 0!==this.size&&(d.size=this.size);void 0!==this.sizeAttenuation&&(d.sizeAttenuation=this.sizeAttenuation);1!==this.blending&&(d.blending=this.blending);2!==
-this.shading&&(d.shading=this.shading);0!==this.side&&(d.side=this.side);0!==this.vertexColors&&(d.vertexColors=this.vertexColors);1>this.opacity&&(d.opacity=this.opacity);!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;0<this.alphaTest&&(d.alphaTest=this.alphaTest);!0===this.premultipliedAlpha&&(d.premultipliedAlpha=this.premultipliedAlpha);!0===this.wireframe&&(d.wireframe=this.wireframe);1<this.wireframeLinewidth&&
-(d.wireframeLinewidth=this.wireframeLinewidth);"round"!==this.wireframeLinecap&&(d.wireframeLinecap=this.wireframeLinecap);"round"!==this.wireframeLinejoin&&(d.wireframeLinejoin=this.wireframeLinejoin);d.skinning=this.skinning;d.morphTargets=this.morphTargets;d.dithering=this.dithering;c&&(c=b(a.textures),a=b(a.images),0<c.length&&(d.textures=c),0<a.length&&(d.images=a));return d},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.fog=a.fog;this.lights=
-a.lights;this.blending=a.blending;this.side=a.side;this.shading=a.shading;this.vertexColors=a.vertexColors;this.opacity=a.opacity;this.transparent=a.transparent;this.blendSrc=a.blendSrc;this.blendDst=a.blendDst;this.blendEquation=a.blendEquation;this.blendSrcAlpha=a.blendSrcAlpha;this.blendDstAlpha=a.blendDstAlpha;this.blendEquationAlpha=a.blendEquationAlpha;this.depthFunc=a.depthFunc;this.depthTest=a.depthTest;this.depthWrite=a.depthWrite;this.colorWrite=a.colorWrite;this.precision=a.precision;this.polygonOffset=
-a.polygonOffset;this.polygonOffsetFactor=a.polygonOffsetFactor;this.polygonOffsetUnits=a.polygonOffsetUnits;this.dithering=a.dithering;this.alphaTest=a.alphaTest;this.premultipliedAlpha=a.premultipliedAlpha;this.overdraw=a.overdraw;this.visible=a.visible;this.clipShadows=a.clipShadows;this.clipIntersection=a.clipIntersection;a=a.clippingPlanes;var b=null;if(null!==a)for(var c=a.length,b=Array(c),d=0;d!==c;++d)b[d]=a[d].clone();this.clippingPlanes=b;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});
-ra.prototype=Object.create(U.prototype);ra.prototype.constructor=ra;ra.prototype.isShaderMaterial=!0;ra.prototype.copy=function(a){U.prototype.copy.call(this,a);this.fragmentShader=a.fragmentShader;this.vertexShader=a.vertexShader;this.uniforms=Ca.clone(a.uniforms);this.defines=a.defines;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.lights=a.lights;this.clipping=a.clipping;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;this.extensions=
-a.extensions;return this};ra.prototype.toJSON=function(a){a=U.prototype.toJSON.call(this,a);a.uniforms=this.uniforms;a.vertexShader=this.vertexShader;a.fragmentShader=this.fragmentShader;return a};Za.prototype=Object.create(U.prototype);Za.prototype.constructor=Za;Za.prototype.isMeshDepthMaterial=!0;Za.prototype.copy=function(a){U.prototype.copy.call(this,a);this.depthPacking=a.depthPacking;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=
-a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;return this};Object.assign(Ra.prototype,{isBox3:!0,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromArray:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.length;h<k;h+=3){var m=a[h],q=a[h+1],l=a[h+2];m<b&&(b=m);q<c&&(c=q);l<d&&(d=l);m>e&&(e=m);q>f&&(f=q);
-l>g&&(g=l)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromBufferAttribute:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.count;h<k;h++){var m=a.getX(h),q=a.getY(h),l=a.getZ(h);m<b&&(b=m);q<c&&(c=q);l<d&&(d=l);m>e&&(e=m);q>f&&(f=q);l>g&&(g=l)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=
-new n;return function(b,c){var d=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),setFromObject:function(a){this.makeEmpty();return this.expandByObject(a)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<
-this.min.y||this.max.z<this.min.z},getCenter:function(a){a=a||new n;return this.isEmpty()?a.set(0,0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=a||new n;return this.isEmpty()?a.set(0,0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},expandByObject:function(){var a=
-new n;return function(b){var c=this;b.updateMatrixWorld(!0);b.traverse(function(b){var e,f;e=b.geometry;if(void 0!==e)if(e.isGeometry){var g=e.vertices;e=0;for(f=g.length;e<f;e++)a.copy(g[e]),a.applyMatrix4(b.matrixWorld),c.expandByPoint(a)}else if(e.isBufferGeometry&&(g=e.attributes.position,void 0!==g))for(e=0,f=g.count;e<f;e++)a.fromBufferAttribute(g,e).applyMatrix4(b.matrixWorld),c.expandByPoint(a)});return this}}(),containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||
-a.y>this.max.y||a.z<this.min.z||a.z>this.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z},getParameter:function(a,b){return(b||new n).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y||a.max.z<
-this.min.z||a.min.z>this.max.z?!1:!0},intersectsSphere:function(){var a=new n;return function(b){this.clampPoint(b.center,a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){var b,c;0<a.normal.x?(b=a.normal.x*this.min.x,c=a.normal.x*this.max.x):(b=a.normal.x*this.max.x,c=a.normal.x*this.min.x);0<a.normal.y?(b+=a.normal.y*this.min.y,c+=a.normal.y*this.max.y):(b+=a.normal.y*this.max.y,c+=a.normal.y*this.min.y);0<a.normal.z?(b+=a.normal.z*this.min.z,c+=a.normal.z*
-this.max.z):(b+=a.normal.z*this.max.z,c+=a.normal.z*this.min.z);return b<=a.constant&&c>=a.constant},clampPoint:function(a,b){return(b||new n).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new n;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new n;return function(b){b=b||new Ea;this.getCenter(b.center);b.radius=.5*this.getSize(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);
-this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a=[new n,new n,new n,new n,new n,new n,new n,new n];return function(b){if(this.isEmpty())return this;a[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,
-this.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(b);a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});Object.assign(Ea.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=
-new Ra;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e=0,f=0,g=b.length;f<g;f++)e=Math.max(e,d.distanceToSquared(b[f]));this.radius=Math.sqrt(e);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.center.copy(a.center);this.radius=a.radius;return this},empty:function(){return 0>=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-
-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(this.center.dot(a.normal)-a.constant)<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a),d=b||new n;d.copy(a);c>this.radius*this.radius&&(d.sub(this.center).normalize(),d.multiplyScalar(this.radius).add(this.center));return d},getBoundingBox:function(a){a=
-a||new Ra;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}});Object.assign(Ba.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,k){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=k;return this},identity:function(){this.set(1,
-0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},applyToBufferAttribute:function(){var a=new n;return function(b){for(var c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),
-a.applyMatrix3(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),multiply:function(a){return this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[3],h=c[6],k=c[1],m=c[4],q=c[7],l=c[2],p=c[5],c=c[8],r=d[0],n=d[3],t=d[6],y=d[1],x=d[4],u=d[7],H=d[2],w=d[5],d=d[8];e[0]=f*r+g*y+h*H;e[3]=f*n+g*x+h*w;e[6]=f*t+g*u+h*d;e[1]=k*r+m*y+q*H;e[4]=k*n+m*x+q*w;e[7]=k*t+m*u+q*d;e[2]=l*r+p*y+c*H;
-e[5]=l*n+p*x+c*w;e[8]=l*t+p*u+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;b[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],k=a[7],a=a[8];return b*f*a-b*g*k-c*e*a+c*g*h+d*e*k-d*f*h},getInverse:function(a,b){a&&a.isMatrix4&&console.error("THREE.Matrix3.getInverse no longer takes a Matrix4 argument.");var c=a.elements,d=this.elements,e=c[0],f=c[1],g=c[2],
-h=c[3],k=c[4],m=c[5],q=c[6],l=c[7],c=c[8],p=c*k-m*l,r=m*q-c*h,n=l*h-k*q,t=e*p+f*r+g*n;if(0===t){if(!0===b)throw Error("THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0");console.warn("THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0");return this.identity()}t=1/t;d[0]=p*t;d[1]=(g*l-c*f)*t;d[2]=(m*f-g*k)*t;d[3]=r*t;d[4]=(c*e-g*q)*t;d[5]=(g*h-m*e)*t;d[6]=n*t;d[7]=(f*q-l*e)*t;d[8]=(k*e-f*h)*t;return this},transpose: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},getNormalMatrix:function(a){return this.setFromMatrix4(a).getInverse(this).transpose()},transposeIntoArray:function(a){var b=this.elements;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},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;9>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},
-toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);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];return a}});Object.assign(Aa.prototype,{set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=
-new n,b=new n;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+
-this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){return this.orthoPoint(a,b).sub(a).negate()},orthoPoint:function(a,b){var c=this.distanceToPoint(a);return(b||new n).copy(this.normal).multiplyScalar(c)},intersectLine:function(){var a=new n;return function(b,c){var d=c||new n,e=b.delta(a),f=this.normal.dot(e);if(0===f){if(0===this.distanceToPoint(b.start))return d.copy(b.start)}else return f=-(b.start.dot(this.normal)+this.constant)/
-f,0>f||1<f?void 0:d.copy(e).multiplyScalar(f).add(b.start)}}(),intersectsLine:function(a){var b=this.distanceToPoint(a.start);a=this.distanceToPoint(a.end);return 0>b&&0<a||0>a&&0<b},intersectsBox:function(a){return a.intersectsPlane(this)},intersectsSphere:function(a){return a.intersectsPlane(this)},coplanarPoint:function(a){return(a||new n).copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var a=new n,b=new Ba;return function(c,d){var e=this.coplanarPoint(a).applyMatrix4(c),
-f=d||b.getNormalMatrix(c),f=this.normal.applyMatrix3(f).normalize();this.constant=-e.dot(f);return this}}(),translate:function(a){this.constant-=a.dot(this.normal);return this},equals:function(a){return a.normal.equals(this.normal)&&a.constant===this.constant}});Object.assign(gd.prototype,{set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){for(var b=
-this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],k=c[6],m=c[7],q=c[8],l=c[9],p=c[10],r=c[11],n=c[12],t=c[13],y=c[14],c=c[15];b[0].setComponents(f-a,m-g,r-q,c-n).normalize();b[1].setComponents(f+a,m+g,r+q,c+n).normalize();b[2].setComponents(f+d,m+h,r+l,c+t).normalize();b[3].setComponents(f-d,m-h,r-l,c-t).normalize();b[4].setComponents(f-e,m-k,r-p,c-y).normalize();b[5].setComponents(f+e,
-m+k,r+p,c+y).normalize();return this},intersectsObject:function(){var a=new Ea;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSprite:function(){var a=new Ea;return function(b){a.center.set(0,0,0);a.radius=.7071067811865476;a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=
-0;6>d;d++)if(b[d].distanceToPoint(c)<a)return!1;return!0},intersectsBox:function(){var a=new n,b=new n;return function(c){for(var d=this.planes,e=0;6>e;e++){var f=d[e];a.x=0<f.normal.x?c.min.x:c.max.x;b.x=0<f.normal.x?c.max.x:c.min.x;a.y=0<f.normal.y?c.min.y:c.max.y;b.y=0<f.normal.y?c.max.y:c.min.y;a.z=0<f.normal.z?c.min.z:c.max.z;b.z=0<f.normal.z?c.max.z:c.min.z;var g=f.distanceToPoint(a),f=f.distanceToPoint(b);if(0>g&&0>f)return!1}return!0}}(),containsPoint:function(a){for(var b=this.planes,c=0;6>
-c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});ab.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");ab.DefaultOrder="XYZ";Object.defineProperties(ab.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},order:{get:function(){return this._order},set:function(a){this._order=a;
-this.onChangeCallback()}}});Object.assign(ab.prototype,{isEuler:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=Y.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],k=e[5],m=e[9],q=e[2],l=e[6],
-e=e[10];b=b||this._order;"XYZ"===b?(this._y=Math.asin(d(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(-m,e),this._z=Math.atan2(-f,a)):(this._x=Math.atan2(l,k),this._z=0)):"YXZ"===b?(this._x=Math.asin(-d(m,-1,1)),.99999>Math.abs(m)?(this._y=Math.atan2(g,e),this._z=Math.atan2(h,k)):(this._y=Math.atan2(-q,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(l,-1,1)),.99999>Math.abs(l)?(this._y=Math.atan2(-q,e),this._z=Math.atan2(-f,k)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(q,
--1,1)),.99999>Math.abs(q)?(this._x=Math.atan2(l,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,k))):"YZX"===b?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-m,k),this._y=Math.atan2(-q,a)):(this._x=0,this._y=Math.atan2(g,e))):"XZY"===b?(this._z=Math.asin(-d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(l,k),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-m,e),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+b);this._order=
-b;if(!1!==c)this.onChangeCallback();return this},setFromQuaternion:function(){var a=new K;return function(b,c,d){a.makeRotationFromQuaternion(b);return this.setFromRotationMatrix(a,c,d)}}(),setFromVector3:function(a,b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(){var a=new oa;return function(b){a.setFromEuler(this);return this.setFromQuaternion(a,b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=
-a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,this._y,this._z):new n(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(Qd.prototype,{set:function(a){this.mask=1<<a|0},enable:function(a){this.mask=
-this.mask|1<<a|0},toggle:function(a){this.mask^=1<<a|0},disable:function(a){this.mask&=~(1<<a|0)},test:function(a){return 0!==(this.mask&a.mask)}});var Lf=0;z.DefaultUp=new n(0,1,0);z.DefaultMatrixAutoUpdate=!0;Object.assign(z.prototype,xa.prototype,{isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix:function(a){this.matrix.multiplyMatrices(a,this.matrix);this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(a){this.quaternion.premultiply(a);
-return this},setRotationFromAxisAngle:function(a,b){this.quaternion.setFromAxisAngle(a,b)},setRotationFromEuler:function(a){this.quaternion.setFromEuler(a,!0)},setRotationFromMatrix:function(a){this.quaternion.setFromRotationMatrix(a)},setRotationFromQuaternion:function(a){this.quaternion.copy(a)},rotateOnAxis:function(){var a=new oa;return function(b,c){a.setFromAxisAngle(b,c);this.quaternion.multiply(a);return this}}(),rotateX:function(){var a=new n(1,0,0);return function(b){return this.rotateOnAxis(a,
-b)}}(),rotateY:function(){var a=new n(0,1,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateZ:function(){var a=new n(0,0,1);return function(b){return this.rotateOnAxis(a,b)}}(),translateOnAxis:function(){var a=new n;return function(b,c){a.copy(b).applyQuaternion(this.quaternion);this.position.add(a.multiplyScalar(c));return this}}(),translateX:function(){var a=new n(1,0,0);return function(b){return this.translateOnAxis(a,b)}}(),translateY:function(){var a=new n(0,1,0);return function(b){return this.translateOnAxis(a,
-b)}}(),translateZ:function(){var a=new n(0,0,1);return function(b){return this.translateOnAxis(a,b)}}(),localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var a=new K;return function(b){return b.applyMatrix4(a.getInverse(this.matrixWorld))}}(),lookAt:function(){var a=new K;return function(b){this.isCamera?a.lookAt(this.position,b,this.up):a.lookAt(b,this.position,this.up);this.quaternion.setFromRotationMatrix(a)}}(),add:function(a){if(1<arguments.length){for(var b=
-0;b<arguments.length;b++)this.add(arguments[b]);return this}if(a===this)return console.error("THREE.Object3D.add: object can't be added as a child of itself.",a),this;a&&a.isObject3D?(null!==a.parent&&a.parent.remove(a),a.parent=this,a.dispatchEvent({type:"added"}),this.children.push(a)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",a);return this},remove:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.remove(arguments[b]);return this}b=this.children.indexOf(a);
--1!==b&&(a.parent=null,a.dispatchEvent({type:"removed"}),this.children.splice(b,1));return this},getObjectById:function(a){return this.getObjectByProperty("id",a)},getObjectByName:function(a){return this.getObjectByProperty("name",a)},getObjectByProperty:function(a,b){if(this[a]===b)return this;for(var c=0,d=this.children.length;c<d;c++){var e=this.children[c].getObjectByProperty(a,b);if(void 0!==e)return e}},getWorldPosition:function(a){a=a||new n;this.updateMatrixWorld(!0);return a.setFromMatrixPosition(this.matrixWorld)},
-getWorldQuaternion:function(){var a=new n,b=new n;return function(c){c=c||new oa;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,c,b);return c}}(),getWorldRotation:function(){var a=new oa;return function(b){b=b||new ab;this.getWorldQuaternion(a);return b.setFromQuaternion(a,this.rotation.order,!1)}}(),getWorldScale:function(){var a=new n,b=new oa;return function(c){c=c||new n;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,b,c);return c}}(),getWorldDirection:function(){var a=new oa;
-return function(b){b=b||new n;this.getWorldQuaternion(a);return b.set(0,0,1).applyQuaternion(a)}}(),raycast:function(){},traverse:function(a){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverse(a)},traverseVisible:function(a){if(!1!==this.visible){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverseVisible(a)}},traverseAncestors:function(a){var b=this.parent;null!==b&&(a(b),b.traverseAncestors(a))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,
-this.scale);this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a)null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,a=!0;for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].updateMatrixWorld(a)},toJSON:function(a){function b(b,c){void 0===b[c.uuid]&&(b[c.uuid]=c.toJSON(a));return c.uuid}function c(a){var b=[],
-c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var d=void 0===a||""===a,e={};d&&(a={geometries:{},materials:{},textures:{},images:{}},e.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});var f={};f.uuid=this.uuid;f.type=this.type;""!==this.name&&(f.name=this.name);"{}"!==JSON.stringify(this.userData)&&(f.userData=this.userData);!0===this.castShadow&&(f.castShadow=!0);!0===this.receiveShadow&&(f.receiveShadow=!0);!1===this.visible&&(f.visible=!1);f.matrix=this.matrix.toArray();
-void 0!==this.geometry&&(f.geometry=b(a.geometries,this.geometry));if(void 0!==this.material)if(Array.isArray(this.material)){for(var g=[],h=0,k=this.material.length;h<k;h++)g.push(b(a.materials,this.material[h]));f.material=g}else f.material=b(a.materials,this.material);if(0<this.children.length)for(f.children=[],h=0;h<this.children.length;h++)f.children.push(this.children[h].toJSON(a).object);d&&(d=c(a.geometries),g=c(a.materials),h=c(a.textures),k=c(a.images),0<d.length&&(e.geometries=d),0<g.length&&
-(e.materials=g),0<h.length&&(e.textures=h),0<k.length&&(e.images=k));e.object=f;return e},clone:function(a){return(new this.constructor).copy(this,a)},copy:function(a,b){void 0===b&&(b=!0);this.name=a.name;this.up.copy(a.up);this.position.copy(a.position);this.quaternion.copy(a.quaternion);this.scale.copy(a.scale);this.matrix.copy(a.matrix);this.matrixWorld.copy(a.matrixWorld);this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;this.layers.mask=a.layers.mask;
-this.visible=a.visible;this.castShadow=a.castShadow;this.receiveShadow=a.receiveShadow;this.frustumCulled=a.frustumCulled;this.renderOrder=a.renderOrder;this.userData=JSON.parse(JSON.stringify(a.userData));if(!0===b)for(var c=0;c<a.children.length;c++)this.add(a.children[c].clone());return this}});Na.prototype=Object.assign(Object.create(z.prototype),{constructor:Na,isCamera:!0,copy:function(a,b){z.prototype.copy.call(this,a,b);this.matrixWorldInverse.copy(a.matrixWorldInverse);this.projectionMatrix.copy(a.projectionMatrix);
-return this},getWorldDirection:function(){var a=new oa;return function(b){b=b||new n;this.getWorldQuaternion(a);return b.set(0,0,-1).applyQuaternion(a)}}(),updateMatrixWorld:function(a){z.prototype.updateMatrixWorld.call(this,a);this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}});Fb.prototype=Object.assign(Object.create(Na.prototype),{constructor:Fb,isOrthographicCamera:!0,copy:function(a,b){Na.prototype.copy.call(this,a,b);this.left=a.left;
-this.right=a.right;this.top=a.top;this.bottom=a.bottom;this.near=a.near;this.far=a.far;this.zoom=a.zoom;this.view=null===a.view?null:Object.assign({},a.view);return this},setViewOffset:function(a,b,c,d,e,f){this.view={fullWidth:a,fullHeight:b,offsetX:c,offsetY:d,width:e,height:f};this.updateProjectionMatrix()},clearViewOffset:function(){this.view=null;this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=(this.right-this.left)/(2*this.zoom),b=(this.top-this.bottom)/(2*this.zoom),
-c=(this.right+this.left)/2,d=(this.top+this.bottom)/2,e=c-a,c=c+a,a=d+b,b=d-b;if(null!==this.view)var c=this.zoom/(this.view.width/this.view.fullWidth),b=this.zoom/(this.view.height/this.view.fullHeight),f=(this.right-this.left)/this.view.width,d=(this.top-this.bottom)/this.view.height,e=e+this.view.offsetX/c*f,c=e+this.view.width/c*f,a=a-this.view.offsetY/b*d,b=a-this.view.height/b*d;this.projectionMatrix.makeOrthographic(e,c,a,b,this.near,this.far)},toJSON:function(a){a=z.prototype.toJSON.call(this,
-a);a.object.zoom=this.zoom;a.object.left=this.left;a.object.right=this.right;a.object.top=this.top;a.object.bottom=this.bottom;a.object.near=this.near;a.object.far=this.far;null!==this.view&&(a.object.view=Object.assign({},this.view));return a}});qa.prototype=Object.assign(Object.create(Na.prototype),{constructor:qa,isPerspectiveCamera:!0,copy:function(a,b){Na.prototype.copy.call(this,a,b);this.fov=a.fov;this.zoom=a.zoom;this.near=a.near;this.far=a.far;this.focus=a.focus;this.aspect=a.aspect;this.view=
-null===a.view?null:Object.assign({},a.view);this.filmGauge=a.filmGauge;this.filmOffset=a.filmOffset;return this},setFocalLength:function(a){a=.5*this.getFilmHeight()/a;this.fov=2*Y.RAD2DEG*Math.atan(a);this.updateProjectionMatrix()},getFocalLength:function(){var a=Math.tan(.5*Y.DEG2RAD*this.fov);return.5*this.getFilmHeight()/a},getEffectiveFOV:function(){return 2*Y.RAD2DEG*Math.atan(Math.tan(.5*Y.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},
-getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(a,b,c,d,e,f){this.aspect=a/b;this.view={fullWidth:a,fullHeight:b,offsetX:c,offsetY:d,width:e,height:f};this.updateProjectionMatrix()},clearViewOffset:function(){this.view=null;this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=this.near,b=a*Math.tan(.5*Y.DEG2RAD*this.fov)/this.zoom,c=2*b,d=this.aspect*c,e=-.5*d,f=this.view;if(null!==f)var g=f.fullWidth,h=f.fullHeight,e=e+f.offsetX*d/
-g,b=b-f.offsetY*c/h,d=f.width/g*d,c=f.height/h*c;f=this.filmOffset;0!==f&&(e+=a*f/this.getFilmWidth());this.projectionMatrix.makePerspective(e,e+d,b,b-c,a,this.far)},toJSON:function(a){a=z.prototype.toJSON.call(this,a);a.object.fov=this.fov;a.object.zoom=this.zoom;a.object.near=this.near;a.object.far=this.far;a.object.focus=this.focus;a.object.aspect=this.aspect;null!==this.view&&(a.object.view=Object.assign({},this.view));a.object.filmGauge=this.filmGauge;a.object.filmOffset=this.filmOffset;return a}});
-Object.assign(Sa.prototype,{clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a=a.a;this.b=a.b;this.c=a.c;this.normal.copy(a.normal);this.color.copy(a.color);this.materialIndex=a.materialIndex;for(var b=0,c=a.vertexNormals.length;b<c;b++)this.vertexNormals[b]=a.vertexNormals[b].clone();b=0;for(c=a.vertexColors.length;b<c;b++)this.vertexColors[b]=a.vertexColors[b].clone();return this}});var Rd=0;Object.assign(J.prototype,xa.prototype,{isGeometry:!0,applyMatrix:function(a){for(var b=
-(new Ba).getNormalMatrix(a),c=0,d=this.vertices.length;c<d;c++)this.vertices[c].applyMatrix4(a);c=0;for(d=this.faces.length;c<d;c++){a=this.faces[c];a.normal.applyMatrix3(b).normalize();for(var e=0,f=a.vertexNormals.length;e<f;e++)a.vertexNormals[e].applyMatrix3(b).normalize()}null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();this.normalsNeedUpdate=this.verticesNeedUpdate=!0;return this},rotateX:function(){var a=new K;return function(b){a.makeRotationX(b);
-this.applyMatrix(a);return this}}(),rotateY:function(){var a=new K;return function(b){a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a=new K;return function(b){a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a=new K;return function(b,c,d){a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a=new K;return function(b,c,d){a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a=new z;return function(b){a.lookAt(b);
-a.updateMatrix();this.applyMatrix(a.matrix)}}(),fromBufferGeometry:function(a){function b(a,b,d,e){var f=void 0!==g?[q[a].clone(),q[b].clone(),q[d].clone()]:[],r=void 0!==h?[c.colors[a].clone(),c.colors[b].clone(),c.colors[d].clone()]:[];e=new Sa(a,b,d,f,r,e);c.faces.push(e);void 0!==k&&c.faceVertexUvs[0].push([l[a].clone(),l[b].clone(),l[d].clone()]);void 0!==m&&c.faceVertexUvs[1].push([p[a].clone(),p[b].clone(),p[d].clone()])}var c=this,d=null!==a.index?a.index.array:void 0,e=a.attributes,f=e.position.array,
-g=void 0!==e.normal?e.normal.array:void 0,h=void 0!==e.color?e.color.array:void 0,k=void 0!==e.uv?e.uv.array:void 0,m=void 0!==e.uv2?e.uv2.array:void 0;void 0!==m&&(this.faceVertexUvs[1]=[]);for(var q=[],l=[],p=[],r=e=0;e<f.length;e+=3,r+=2)c.vertices.push(new n(f[e],f[e+1],f[e+2])),void 0!==g&&q.push(new n(g[e],g[e+1],g[e+2])),void 0!==h&&c.colors.push(new G(h[e],h[e+1],h[e+2])),void 0!==k&&l.push(new C(k[r],k[r+1])),void 0!==m&&p.push(new C(m[r],m[r+1]));var ca=a.groups;if(0<ca.length)for(e=0;e<
-ca.length;e++)for(var f=ca[e],t=f.start,y=f.count,r=t,t=t+y;r<t;r+=3)void 0!==d?b(d[r],d[r+1],d[r+2],f.materialIndex):b(r,r+1,r+2,f.materialIndex);else if(void 0!==d)for(e=0;e<d.length;e+=3)b(d[e],d[e+1],d[e+2]);else for(e=0;e<f.length/3;e+=3)b(e,e+1,e+2);this.computeFaceNormals();null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());return this},center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();
-this.translate(a.x,a.y,a.z);return a},normalize:function(){this.computeBoundingSphere();var a=this.boundingSphere.center,b=this.boundingSphere.radius,b=0===b?1:1/b,c=new K;c.set(b,0,0,-b*a.x,0,b,0,-b*a.y,0,0,b,-b*a.z,0,0,0,1);this.applyMatrix(c);return this},computeFaceNormals:function(){for(var a=new n,b=new n,c=0,d=this.faces.length;c<d;c++){var e=this.faces[c],f=this.vertices[e.a],g=this.vertices[e.b];a.subVectors(this.vertices[e.c],g);b.subVectors(f,g);a.cross(b);a.normalize();e.normal.copy(a)}},
-computeVertexNormals:function(a){void 0===a&&(a=!0);var b,c,d;d=Array(this.vertices.length);b=0;for(c=this.vertices.length;b<c;b++)d[b]=new n;if(a){var e,f,g,h=new n,k=new n;a=0;for(b=this.faces.length;a<b;a++)c=this.faces[a],e=this.vertices[c.a],f=this.vertices[c.b],g=this.vertices[c.c],h.subVectors(g,f),k.subVectors(e,f),h.cross(k),d[c.a].add(h),d[c.b].add(h),d[c.c].add(h)}else for(this.computeFaceNormals(),a=0,b=this.faces.length;a<b;a++)c=this.faces[a],d[c.a].add(c.normal),d[c.b].add(c.normal),
-d[c.c].add(c.normal);b=0;for(c=this.vertices.length;b<c;b++)d[b].normalize();a=0;for(b=this.faces.length;a<b;a++)c=this.faces[a],e=c.vertexNormals,3===e.length?(e[0].copy(d[c.a]),e[1].copy(d[c.b]),e[2].copy(d[c.c])):(e[0]=d[c.a].clone(),e[1]=d[c.b].clone(),e[2]=d[c.c].clone());0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var a,b,c;this.computeFaceNormals();a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];var d=c.vertexNormals;3===d.length?(d[0].copy(c.normal),
-d[1].copy(c.normal),d[2].copy(c.normal)):(d[0]=c.normal.clone(),d[1]=c.normal.clone(),d[2]=c.normal.clone())}0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var a,b,c,d,e;c=0;for(d=this.faces.length;c<d;c++)for(e=this.faces[c],e.__originalFaceNormal?e.__originalFaceNormal.copy(e.normal):e.__originalFaceNormal=e.normal.clone(),e.__originalVertexNormals||(e.__originalVertexNormals=[]),a=0,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 J;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=[];e=this.morphNormals[a].faceNormals;var g=this.morphNormals[a].vertexNormals,h,k;c=0;for(d=this.faces.length;c<d;c++)h=new n,k={a:new n,b:new n,c:new n},e.push(h),g.push(k)}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],h=g.faceNormals[c],k=g.vertexNormals[c],h.copy(e.normal),k.a.copy(e.vertexNormals[0]),k.b.copy(e.vertexNormals[1]),k.c.copy(e.vertexNormals[2])}c=0;for(d=this.faces.length;c<d;c++)e=this.faces[c],e.normal=e.__originalFaceNormal,e.vertexNormals=e.__originalVertexNormals},computeLineDistances:function(){for(var a=0,b=this.vertices,c=0,d=b.length;c<d;c++)0<c&&(a+=b[c].distanceTo(b[c-1])),this.lineDistances[c]=a},computeBoundingBox:function(){null===
-this.boundingBox&&(this.boundingBox=new Ra);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new Ea);this.boundingSphere.setFromPoints(this.vertices)},merge:function(a,b,c){if(a&&a.isGeometry){var d,e=this.vertices.length,f=this.vertices,g=a.vertices,h=this.faces,k=a.faces,m=this.faceVertexUvs[0],q=a.faceVertexUvs[0],l=this.colors,p=a.colors;void 0===c&&(c=0);void 0!==b&&(d=(new Ba).getNormalMatrix(b));a=0;for(var r=g.length;a<
-r;a++){var n=g[a].clone();void 0!==b&&n.applyMatrix4(b);f.push(n)}a=0;for(r=p.length;a<r;a++)l.push(p[a].clone());a=0;for(r=k.length;a<r;a++){var g=k[a],t=g.vertexNormals,p=g.vertexColors,l=new Sa(g.a+e,g.b+e,g.c+e);l.normal.copy(g.normal);void 0!==d&&l.normal.applyMatrix3(d).normalize();b=0;for(f=t.length;b<f;b++)n=t[b].clone(),void 0!==d&&n.applyMatrix3(d).normalize(),l.vertexNormals.push(n);l.color.copy(g.color);b=0;for(f=p.length;b<f;b++)n=p[b],l.vertexColors.push(n.clone());l.materialIndex=g.materialIndex+
-c;h.push(l)}a=0;for(r=q.length;a<r;a++)if(c=q[a],d=[],void 0!==c){b=0;for(f=c.length;b<f;b++)d.push(c[b].clone());m.push(d)}}else console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",a)},mergeMesh:function(a){a&&a.isMesh?(a.matrixAutoUpdate&&a.updateMatrix(),this.merge(a.geometry,a.matrix)):console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",a)},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,g;f=0;for(g=this.vertices.length;f<
-g;f++)d=this.vertices[f],d=Math.round(d.x*e)+"_"+Math.round(d.y*e)+"_"+Math.round(d.z*e),void 0===a[d]?(a[d]=f,b.push(this.vertices[f]),c[f]=b.length-1):c[f]=c[a[d]];a=[];f=0;for(g=this.faces.length;f<g;f++)for(e=this.faces[f],e.a=c[e.a],e.b=c[e.b],e.c=c[e.c],e=[e.a,e.b,e.c],d=0;3>d;d++)if(e[d]===e[(d+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(e=a[f],this.faces.splice(e,1),c=0,g=this.faceVertexUvs.length;c<g;c++)this.faceVertexUvs[c].splice(e,1);f=this.vertices.length-b.length;this.vertices=
-b;return f},sortFacesByMaterialIndex:function(){for(var a=this.faces,b=a.length,c=0;c<b;c++)a[c]._id=c;a.sort(function(a,b){return a.materialIndex-b.materialIndex});var d=this.faceVertexUvs[0],e=this.faceVertexUvs[1],f,g;d&&d.length===b&&(f=[]);e&&e.length===b&&(g=[]);for(c=0;c<b;c++){var h=a[c]._id;f&&f.push(d[h]);g&&g.push(e[h])}f&&(this.faceVertexUvs[0]=f);g&&(this.faceVertexUvs[1]=g)},toJSON:function(){function a(a,b,c){return c?a|1<<b:a&~(1<<b)}function b(a){var b=a.x.toString()+a.y.toString()+
-a.z.toString();if(void 0!==m[b])return m[b];m[b]=k.length/3;k.push(a.x,a.y,a.z);return m[b]}function c(a){var b=a.r.toString()+a.g.toString()+a.b.toString();if(void 0!==l[b])return l[b];l[b]=q.length;q.push(a.getHex());return l[b]}function d(a){var b=a.x.toString()+a.y.toString();if(void 0!==r[b])return r[b];r[b]=p.length/2;p.push(a.x,a.y);return r[b]}var e={metadata:{version:4.5,type:"Geometry",generator:"Geometry.toJSON"}};e.uuid=this.uuid;e.type=this.type;""!==this.name&&(e.name=this.name);if(void 0!==
-this.parameters){var f=this.parameters,g;for(g in f)void 0!==f[g]&&(e[g]=f[g]);return e}f=[];for(g=0;g<this.vertices.length;g++){var h=this.vertices[g];f.push(h.x,h.y,h.z)}var h=[],k=[],m={},q=[],l={},p=[],r={};for(g=0;g<this.faces.length;g++){var n=this.faces[g],t=void 0!==this.faceVertexUvs[0][g],y=0<n.normal.length(),x=0<n.vertexNormals.length,u=1!==n.color.r||1!==n.color.g||1!==n.color.b,H=0<n.vertexColors.length,w=0,w=a(w,0,0),w=a(w,1,!0),w=a(w,2,!1),w=a(w,3,t),w=a(w,4,y),w=a(w,5,x),w=a(w,6,
-u),w=a(w,7,H);h.push(w);h.push(n.a,n.b,n.c);h.push(n.materialIndex);t&&(t=this.faceVertexUvs[0][g],h.push(d(t[0]),d(t[1]),d(t[2])));y&&h.push(b(n.normal));x&&(y=n.vertexNormals,h.push(b(y[0]),b(y[1]),b(y[2])));u&&h.push(c(n.color));H&&(n=n.vertexColors,h.push(c(n[0]),c(n[1]),c(n[2])))}e.data={};e.data.vertices=f;e.data.normals=k;0<q.length&&(e.data.colors=q);0<p.length&&(e.data.uvs=[p]);e.data.faces=h;return e},clone:function(){return(new J).copy(this)},copy:function(a){var b,c,d,e,f,g;this.vertices=
-[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;d=a.vertices;b=0;for(c=d.length;b<c;b++)this.vertices.push(d[b].clone());d=a.colors;b=0;for(c=d.length;b<c;b++)this.colors.push(d[b].clone());d=a.faces;b=0;for(c=d.length;b<c;b++)this.faces.push(d[b].clone());b=0;for(c=a.faceVertexUvs.length;b<c;b++){var h=a.faceVertexUvs[b];void 0===
-this.faceVertexUvs[b]&&(this.faceVertexUvs[b]=[]);d=0;for(e=h.length;d<e;d++){var k=h[d],m=[];f=0;for(g=k.length;f<g;f++)m.push(k[f].clone());this.faceVertexUvs[b].push(m)}}f=a.morphTargets;b=0;for(c=f.length;b<c;b++){g={};g.name=f[b].name;if(void 0!==f[b].vertices)for(g.vertices=[],d=0,e=f[b].vertices.length;d<e;d++)g.vertices.push(f[b].vertices[d].clone());if(void 0!==f[b].normals)for(g.normals=[],d=0,e=f[b].normals.length;d<e;d++)g.normals.push(f[b].normals[d].clone());this.morphTargets.push(g)}f=
-a.morphNormals;b=0;for(c=f.length;b<c;b++){g={};if(void 0!==f[b].vertexNormals)for(g.vertexNormals=[],d=0,e=f[b].vertexNormals.length;d<e;d++)h=f[b].vertexNormals[d],k={},k.a=h.a.clone(),k.b=h.b.clone(),k.c=h.c.clone(),g.vertexNormals.push(k);if(void 0!==f[b].faceNormals)for(g.faceNormals=[],d=0,e=f[b].faceNormals.length;d<e;d++)g.faceNormals.push(f[b].faceNormals[d].clone());this.morphNormals.push(g)}d=a.skinWeights;b=0;for(c=d.length;b<c;b++)this.skinWeights.push(d[b].clone());d=a.skinIndices;b=
-0;for(c=d.length;b<c;b++)this.skinIndices.push(d[b].clone());d=a.lineDistances;b=0;for(c=d.length;b<c;b++)this.lineDistances.push(d[b]);b=a.boundingBox;null!==b&&(this.boundingBox=b.clone());b=a.boundingSphere;null!==b&&(this.boundingSphere=b.clone());this.elementsNeedUpdate=a.elementsNeedUpdate;this.verticesNeedUpdate=a.verticesNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.lineDistancesNeedUpdate=a.lineDistancesNeedUpdate;
-this.groupsNeedUpdate=a.groupsNeedUpdate;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Object.defineProperty(Z.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(Z.prototype,{isBufferAttribute:!0,setArray:function(a){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.count=void 0!==a?a.length/this.itemSize:0;this.array=a},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=
-new a.array.constructor(a.array);this.itemSize=a.itemSize;this.count=a.count;this.normalized=a.normalized;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.itemSize;c*=b.itemSize;for(var d=0,e=this.itemSize;d<e;d++)this.array[a+d]=b.array[c+d];return this},copyArray:function(a){this.array.set(a);return this},copyColorsArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",
-d),f=new G);b[c++]=f.r;b[c++]=f.g;b[c++]=f.b}return this},copyIndicesArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];b[c++]=f.a;b[c++]=f.b;b[c++]=f.c}return this},copyVector2sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",d),f=new C);b[c++]=f.x;b[c++]=f.y}return this},copyVector3sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=
-a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",d),f=new n);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z}return this},copyVector4sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",d),f=new fa);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z;b[c++]=f.w}return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},getX:function(a){return this.array[a*
-this.itemSize]},setX:function(a,b){this.array[a*this.itemSize]=b;return this},getY:function(a){return this.array[a*this.itemSize+1]},setY:function(a,b){this.array[a*this.itemSize+1]=b;return this},getZ:function(a){return this.array[a*this.itemSize+2]},setZ:function(a,b){this.array[a*this.itemSize+2]=b;return this},getW:function(a){return this.array[a*this.itemSize+3]},setW:function(a,b){this.array[a*this.itemSize+3]=b;return this},setXY:function(a,b,c){a*=this.itemSize;this.array[a+0]=b;this.array[a+
-1]=c;return this},setXYZ:function(a,b,c,d){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;this.array[a+3]=e;return this},onUpload:function(a){this.onUploadCallback=a;return this},clone:function(){return(new this.constructor(this.array,this.itemSize)).copy(this)}});pc.prototype=Object.create(Z.prototype);pc.prototype.constructor=pc;qc.prototype=Object.create(Z.prototype);
-qc.prototype.constructor=qc;rc.prototype=Object.create(Z.prototype);rc.prototype.constructor=rc;sc.prototype=Object.create(Z.prototype);sc.prototype.constructor=sc;gb.prototype=Object.create(Z.prototype);gb.prototype.constructor=gb;tc.prototype=Object.create(Z.prototype);tc.prototype.constructor=tc;hb.prototype=Object.create(Z.prototype);hb.prototype.constructor=hb;B.prototype=Object.create(Z.prototype);B.prototype.constructor=B;uc.prototype=Object.create(Z.prototype);uc.prototype.constructor=uc;
-Object.assign(Je.prototype,{computeGroups:function(a){var b,c=[],d=void 0;a=a.faces;for(var e=0;e<a.length;e++){var f=a[e];f.materialIndex!==d&&(d=f.materialIndex,void 0!==b&&(b.count=3*e-b.start,c.push(b)),b={start:3*e,materialIndex:d})}void 0!==b&&(b.count=3*e-b.start,c.push(b));this.groups=c},fromGeometry:function(a){var b=a.faces,c=a.vertices,d=a.faceVertexUvs,e=d[0]&&0<d[0].length,f=d[1]&&0<d[1].length,g=a.morphTargets,h=g.length,k;if(0<h){k=[];for(var m=0;m<h;m++)k[m]=[];this.morphTargets.position=
-k}var q=a.morphNormals,l=q.length,p;if(0<l){p=[];for(m=0;m<l;m++)p[m]=[];this.morphTargets.normal=p}for(var r=a.skinIndices,n=a.skinWeights,t=r.length===c.length,y=n.length===c.length,m=0;m<b.length;m++){var x=b[m];this.vertices.push(c[x.a],c[x.b],c[x.c]);var u=x.vertexNormals;3===u.length?this.normals.push(u[0],u[1],u[2]):(u=x.normal,this.normals.push(u,u,u));u=x.vertexColors;3===u.length?this.colors.push(u[0],u[1],u[2]):(u=x.color,this.colors.push(u,u,u));!0===e&&(u=d[0][m],void 0!==u?this.uvs.push(u[0],
-u[1],u[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",m),this.uvs.push(new C,new C,new C)));!0===f&&(u=d[1][m],void 0!==u?this.uvs2.push(u[0],u[1],u[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",m),this.uvs2.push(new C,new C,new C)));for(u=0;u<h;u++){var H=g[u].vertices;k[u].push(H[x.a],H[x.b],H[x.c])}for(u=0;u<l;u++)H=q[u].vertexNormals[m],p[u].push(H.a,H.b,H.c);t&&this.skinIndices.push(r[x.a],r[x.b],r[x.c]);y&&this.skinWeights.push(n[x.a],
-n[x.b],n[x.c])}this.computeGroups(a);this.verticesNeedUpdate=a.verticesNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this}});E.MaxIndex=65535;Object.assign(E.prototype,xa.prototype,{isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(a){Array.isArray(a)?this.index=new (65535<Sd(a)?hb:gb)(a,1):this.index=a},addAttribute:function(a,b,c){if(b&&b.isBufferAttribute||
-b&&b.isInterleavedBufferAttribute)if("index"===a)console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(b);else return this.attributes[a]=b,this;else console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.addAttribute(a,new Z(b,c))},getAttribute:function(a){return this.attributes[a]},removeAttribute:function(a){delete this.attributes[a];return this},addGroup:function(a,b,c){this.groups.push({start:a,count:b,materialIndex:void 0!==
-c?c:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(a,b){this.drawRange.start=a;this.drawRange.count=b},applyMatrix:function(a){var b=this.attributes.position;void 0!==b&&(a.applyToBufferAttribute(b),b.needsUpdate=!0);b=this.attributes.normal;void 0!==b&&((new Ba).getNormalMatrix(a).applyToBufferAttribute(b),b.needsUpdate=!0);null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();return this},rotateX:function(){var a=new K;return function(b){a.makeRotationX(b);
-this.applyMatrix(a);return this}}(),rotateY:function(){var a=new K;return function(b){a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a=new K;return function(b){a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a=new K;return function(b,c,d){a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a=new K;return function(b,c,d){a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a=new z;return function(b){a.lookAt(b);
-a.updateMatrix();this.applyMatrix(a.matrix)}}(),center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();this.translate(a.x,a.y,a.z);return a},setFromObject:function(a){var b=a.geometry;if(a.isPoints||a.isLine){a=new B(3*b.vertices.length,3);var c=new B(3*b.colors.length,3);this.addAttribute("position",a.copyVector3sArray(b.vertices));this.addAttribute("color",c.copyColorsArray(b.colors));b.lineDistances&&b.lineDistances.length===b.vertices.length&&(a=new B(b.lineDistances.length,
-1),this.addAttribute("lineDistance",a.copyArray(b.lineDistances)));null!==b.boundingSphere&&(this.boundingSphere=b.boundingSphere.clone());null!==b.boundingBox&&(this.boundingBox=b.boundingBox.clone())}else a.isMesh&&b&&b.isGeometry&&this.fromGeometry(b);return this},updateFromObject:function(a){var b=a.geometry;if(a.isMesh){var c=b.__directGeometry;!0===b.elementsNeedUpdate&&(c=void 0,b.elementsNeedUpdate=!1);if(void 0===c)return this.fromGeometry(b);c.verticesNeedUpdate=b.verticesNeedUpdate;c.normalsNeedUpdate=
-b.normalsNeedUpdate;c.colorsNeedUpdate=b.colorsNeedUpdate;c.uvsNeedUpdate=b.uvsNeedUpdate;c.groupsNeedUpdate=b.groupsNeedUpdate;b.verticesNeedUpdate=!1;b.normalsNeedUpdate=!1;b.colorsNeedUpdate=!1;b.uvsNeedUpdate=!1;b.groupsNeedUpdate=!1;b=c}!0===b.verticesNeedUpdate&&(c=this.attributes.position,void 0!==c&&(c.copyVector3sArray(b.vertices),c.needsUpdate=!0),b.verticesNeedUpdate=!1);!0===b.normalsNeedUpdate&&(c=this.attributes.normal,void 0!==c&&(c.copyVector3sArray(b.normals),c.needsUpdate=!0),b.normalsNeedUpdate=
-!1);!0===b.colorsNeedUpdate&&(c=this.attributes.color,void 0!==c&&(c.copyColorsArray(b.colors),c.needsUpdate=!0),b.colorsNeedUpdate=!1);b.uvsNeedUpdate&&(c=this.attributes.uv,void 0!==c&&(c.copyVector2sArray(b.uvs),c.needsUpdate=!0),b.uvsNeedUpdate=!1);b.lineDistancesNeedUpdate&&(c=this.attributes.lineDistance,void 0!==c&&(c.copyArray(b.lineDistances),c.needsUpdate=!0),b.lineDistancesNeedUpdate=!1);b.groupsNeedUpdate&&(b.computeGroups(a.geometry),this.groups=b.groups,b.groupsNeedUpdate=!1);return this},
-fromGeometry:function(a){a.__directGeometry=(new Je).fromGeometry(a);return this.fromDirectGeometry(a.__directGeometry)},fromDirectGeometry:function(a){var b=new Float32Array(3*a.vertices.length);this.addAttribute("position",(new Z(b,3)).copyVector3sArray(a.vertices));0<a.normals.length&&(b=new Float32Array(3*a.normals.length),this.addAttribute("normal",(new Z(b,3)).copyVector3sArray(a.normals)));0<a.colors.length&&(b=new Float32Array(3*a.colors.length),this.addAttribute("color",(new Z(b,3)).copyColorsArray(a.colors)));
-0<a.uvs.length&&(b=new Float32Array(2*a.uvs.length),this.addAttribute("uv",(new Z(b,2)).copyVector2sArray(a.uvs)));0<a.uvs2.length&&(b=new Float32Array(2*a.uvs2.length),this.addAttribute("uv2",(new Z(b,2)).copyVector2sArray(a.uvs2)));0<a.indices.length&&(b=new (65535<Sd(a.indices)?Uint32Array:Uint16Array)(3*a.indices.length),this.setIndex((new Z(b,1)).copyIndicesArray(a.indices)));this.groups=a.groups;for(var c in a.morphTargets){for(var b=[],d=a.morphTargets[c],e=0,f=d.length;e<f;e++){var g=d[e],
-h=new B(3*g.length,3);b.push(h.copyVector3sArray(g))}this.morphAttributes[c]=b}0<a.skinIndices.length&&(c=new B(4*a.skinIndices.length,4),this.addAttribute("skinIndex",c.copyVector4sArray(a.skinIndices)));0<a.skinWeights.length&&(c=new B(4*a.skinWeights.length,4),this.addAttribute("skinWeight",c.copyVector4sArray(a.skinWeights)));null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());return this},computeBoundingBox:function(){null===
-this.boundingBox&&(this.boundingBox=new Ra);var a=this.attributes.position;void 0!==a?this.boundingBox.setFromBufferAttribute(a):this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)},computeBoundingSphere:function(){var a=new Ra,b=new n;return function(){null===this.boundingSphere&&
-(this.boundingSphere=new Ea);var c=this.attributes.position;if(c){var d=this.boundingSphere.center;a.setFromBufferAttribute(c);a.getCenter(d);for(var e=0,f=0,g=c.count;f<g;f++)b.x=c.getX(f),b.y=c.getY(f),b.z=c.getZ(f),e=Math.max(e,d.distanceToSquared(b));this.boundingSphere.radius=Math.sqrt(e);isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}}}(),computeFaceNormals:function(){},
-computeVertexNormals:function(){var a=this.index,b=this.attributes,c=this.groups;if(b.position){var d=b.position.array;if(void 0===b.normal)this.addAttribute("normal",new Z(new Float32Array(d.length),3));else for(var e=b.normal.array,f=0,g=e.length;f<g;f++)e[f]=0;var e=b.normal.array,h,k,m,q=new n,l=new n,p=new n,r=new n,ca=new n;if(a){a=a.array;0===c.length&&this.addGroup(0,a.length);for(var t=0,y=c.length;t<y;++t)for(f=c[t],g=f.start,h=f.count,f=g,g+=h;f<g;f+=3)h=3*a[f+0],k=3*a[f+1],m=3*a[f+2],
-q.fromArray(d,h),l.fromArray(d,k),p.fromArray(d,m),r.subVectors(p,l),ca.subVectors(q,l),r.cross(ca),e[h]+=r.x,e[h+1]+=r.y,e[h+2]+=r.z,e[k]+=r.x,e[k+1]+=r.y,e[k+2]+=r.z,e[m]+=r.x,e[m+1]+=r.y,e[m+2]+=r.z}else for(f=0,g=d.length;f<g;f+=9)q.fromArray(d,f),l.fromArray(d,f+3),p.fromArray(d,f+6),r.subVectors(p,l),ca.subVectors(q,l),r.cross(ca),e[f]=r.x,e[f+1]=r.y,e[f+2]=r.z,e[f+3]=r.x,e[f+4]=r.y,e[f+5]=r.z,e[f+6]=r.x,e[f+7]=r.y,e[f+8]=r.z;this.normalizeNormals();b.normal.needsUpdate=!0}},merge:function(a,
-b){if(a&&a.isBufferGeometry){void 0===b&&(b=0);var c=this.attributes,d;for(d in c)if(void 0!==a.attributes[d])for(var e=c[d].array,f=a.attributes[d],g=f.array,h=0,f=f.itemSize*b;h<g.length;h++,f++)e[f]=g[h];return this}console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",a)},normalizeNormals:function(){for(var a=this.attributes.normal,b,c,d,e,f=0,g=a.count;f<g;f++)b=a.getX(f),c=a.getY(f),d=a.getZ(f),e=1/Math.sqrt(b*b+c*c+d*d),a.setXYZ(f,b*e,c*e,d*e)},toNonIndexed:function(){if(null===
-this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."),this;var a=new E,b=this.index.array,c=this.attributes,d;for(d in c){for(var e=c[d],f=e.array,e=e.itemSize,g=new f.constructor(b.length*e),h,k=0,m=0,q=b.length;m<q;m++){h=b[m]*e;for(var l=0;l<e;l++)g[k++]=f[h++]}a.addAttribute(d,new Z(g,e))}return a},toJSON:function(){var a={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};a.uuid=this.uuid;a.type=this.type;""!==this.name&&
-(a.name=this.name);if(void 0!==this.parameters){var b=this.parameters,c;for(c in b)void 0!==b[c]&&(a[c]=b[c]);return a}a.data={attributes:{}};var d=this.index;null!==d&&(b=Array.prototype.slice.call(d.array),a.data.index={type:d.array.constructor.name,array:b});d=this.attributes;for(c in d){var e=d[c],b=Array.prototype.slice.call(e.array);a.data.attributes[c]={itemSize:e.itemSize,type:e.array.constructor.name,array:b,normalized:e.normalized}}c=this.groups;0<c.length&&(a.data.groups=JSON.parse(JSON.stringify(c)));
-c=this.boundingSphere;null!==c&&(a.data.boundingSphere={center:c.center.toArray(),radius:c.radius});return a},clone:function(){return(new E).copy(this)},copy:function(a){var b,c,d;this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;c=a.index;null!==c&&this.setIndex(c.clone());c=a.attributes;for(b in c)this.addAttribute(b,c[b].clone());var e=a.morphAttributes;for(b in e){var f=[],g=e[b];c=0;for(d=g.length;c<d;c++)f.push(g[c].clone());
-this.morphAttributes[b]=f}b=a.groups;c=0;for(d=b.length;c<d;c++)e=b[c],this.addGroup(e.start,e.count,e.materialIndex);b=a.boundingBox;null!==b&&(this.boundingBox=b.clone());b=a.boundingSphere;null!==b&&(this.boundingSphere=b.clone());this.drawRange.start=a.drawRange.start;this.drawRange.count=a.drawRange.count;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Gb.prototype=Object.create(J.prototype);Gb.prototype.constructor=Gb;ib.prototype=Object.create(E.prototype);ib.prototype.constructor=
-ib;vc.prototype=Object.create(J.prototype);vc.prototype.constructor=vc;jb.prototype=Object.create(E.prototype);jb.prototype.constructor=jb;ya.prototype=Object.create(U.prototype);ya.prototype.constructor=ya;ya.prototype.isMeshBasicMaterial=!0;ya.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.specularMap=a.specularMap;this.alphaMap=
-a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;return this};Object.assign(kb.prototype,{set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},
-copy:function(a){this.origin.copy(a.origin);this.direction.copy(a.direction);return this},at:function(a,b){return(b||new n).copy(this.direction).multiplyScalar(a).add(this.origin)},lookAt:function(a){this.direction.copy(a).sub(this.origin).normalize();return this},recast:function(){var a=new n;return function(b){this.origin.copy(this.at(b,a));return this}}(),closestPointToPoint:function(a,b){var c=b||new n;c.subVectors(a,this.origin);var d=c.dot(this.direction);return 0>d?c.copy(this.origin):c.copy(this.direction).multiplyScalar(d).add(this.origin)},
-distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new n;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceToSquared(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceToSquared(b)}}(),distanceSqToSegment:function(){var a=new n,b=new n,c=new n;return function(d,e,f,g){a.copy(d).add(e).multiplyScalar(.5);b.copy(e).sub(d).normalize();c.copy(this.origin).sub(a);
-var h=.5*d.distanceTo(e),k=-this.direction.dot(b),m=c.dot(this.direction),q=-c.dot(b),l=c.lengthSq(),p=Math.abs(1-k*k),r;0<p?(d=k*q-m,e=k*m-q,r=h*p,0<=d?e>=-r?e<=r?(h=1/p,d*=h,e*=h,k=d*(d+k*e+2*m)+e*(k*d+e+2*q)+l):(e=h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*q)+l):(e=-h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*q)+l):e<=-r?(d=Math.max(0,-(-k*h+m)),e=0<d?-h:Math.min(Math.max(-h,-q),h),k=-d*d+e*(e+2*q)+l):e<=r?(d=0,e=Math.min(Math.max(-h,-q),h),k=e*(e+2*q)+l):(d=Math.max(0,-(k*h+m)),e=0<d?h:Math.min(Math.max(-h,
--q),h),k=-d*d+e*(e+2*q)+l)):(e=0<k?-h:h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*q)+l);f&&f.copy(this.direction).multiplyScalar(d).add(this.origin);g&&g.copy(b).multiplyScalar(e).add(a);return k}}(),intersectSphere:function(){var a=new n;return function(b,c){a.subVectors(b.center,this.origin);var d=a.dot(this.direction),e=a.dot(a)-d*d,f=b.radius*b.radius;if(e>f)return null;f=Math.sqrt(f-e);e=d-f;d+=f;return 0>e&&0>d?null:0>e?this.at(d,c):this.at(e,c)}}(),intersectsSphere:function(a){return this.distanceToPoint(a.center)<=
-a.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){var c=this.distanceToPlane(a);return null===c?null:this.at(c,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin);return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},intersectBox:function(a,b){var c,d,e,f,g;d=1/this.direction.x;f=1/this.direction.y;g=1/this.direction.z;
-var h=this.origin;0<=d?(c=(a.min.x-h.x)*d,d*=a.max.x-h.x):(c=(a.max.x-h.x)*d,d*=a.min.x-h.x);0<=f?(e=(a.min.y-h.y)*f,f*=a.max.y-h.y):(e=(a.max.y-h.y)*f,f*=a.min.y-h.y);if(c>f||e>d)return null;if(e>c||c!==c)c=e;if(f<d||d!==d)d=f;0<=g?(e=(a.min.z-h.z)*g,g*=a.max.z-h.z):(e=(a.max.z-h.z)*g,g*=a.min.z-h.z);if(c>g||e>d)return null;if(e>c||c!==c)c=e;if(g<d||d!==d)d=g;return 0>d?null:this.at(0<=c?c:d,b)},intersectsBox:function(){var a=new n;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a=
-new n,b=new n,c=new n,d=new n;return function(e,f,g,h,k){b.subVectors(f,e);c.subVectors(g,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0<f){if(h)return null;h=1}else if(0>f)h=-1,f=-f;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;g=h*this.direction.dot(b.cross(a));if(0>g||e+g>f)return null;e=-h*a.dot(d);return 0>e?null:this.at(e/f,k)}}(),applyMatrix4:function(a){this.origin.applyMatrix4(a);this.direction.transformDirection(a);return this},
-equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});Object.assign(Hb.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},getCenter:function(a){return(a||new n).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){return(a||new n).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},
-distance:function(){return this.start.distanceTo(this.end)},at:function(a,b){var c=b||new n;return this.delta(c).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new n,b=new n;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);var e=b.dot(b),e=b.dot(a)/e;d&&(e=Y.clamp(e,0,1));return e}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new n;return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);
-this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}});Object.assign(Ta,{normal:function(){var a=new n;return function(b,c,d,e){e=e||new n;e.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0<b?e.multiplyScalar(1/Math.sqrt(b)):e.set(0,0,0)}}(),barycoordFromPoint:function(){var a=new n,b=new n,c=new n;return function(d,e,f,g,h){a.subVectors(g,e);b.subVectors(f,e);c.subVectors(d,e);d=a.dot(a);e=a.dot(b);f=a.dot(c);var k=
-b.dot(b);g=b.dot(c);var m=d*k-e*e;h=h||new n;if(0===m)return h.set(-2,-1,-1);m=1/m;k=(k*f-e*g)*m;d=(d*g-e*f)*m;return h.set(1-k-d,d,k)}}(),containsPoint:function(){var a=new n;return function(b,c,d,e){b=Ta.barycoordFromPoint(b,c,d,e,a);return 0<=b.x&&0<=b.y&&1>=b.x+b.y}}()});Object.assign(Ta.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)},
-copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},area:function(){var a=new n,b=new n;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b);return.5*a.cross(b).length()}}(),midpoint:function(a){return(a||new n).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return Ta.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new Aa).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return Ta.barycoordFromPoint(a,
-this.a,this.b,this.c,b)},containsPoint:function(a){return Ta.containsPoint(a,this.a,this.b,this.c)},closestPointToPoint:function(){var a=new Aa,b=[new Hb,new Hb,new Hb],c=new n,d=new n;return function(e,f){var g=f||new n,h=Infinity;a.setFromCoplanarPoints(this.a,this.b,this.c);a.projectPoint(e,c);if(!0===this.containsPoint(c))g.copy(c);else{b[0].set(this.a,this.b);b[1].set(this.b,this.c);b[2].set(this.c,this.a);for(var k=0;k<b.length;k++){b[k].closestPointToPoint(c,!0,d);var m=c.distanceToSquared(d);
-m<h&&(h=m,g.copy(d))}}return g}}(),equals:function(a){return a.a.equals(this.a)&&a.b.equals(this.b)&&a.c.equals(this.c)}});la.prototype=Object.assign(Object.create(z.prototype),{constructor:la,isMesh:!0,setDrawMode:function(a){this.drawMode=a},copy:function(a){z.prototype.copy.call(this,a);this.drawMode=a.drawMode;return this},updateMorphTargets:function(){var a=this.geometry,b,c;if(a.isBufferGeometry){if(a=a.morphAttributes,b=Object.keys(a),0<b.length){var d=a[b[0]];if(void 0!==d)for(this.morphTargetInfluences=
-[],this.morphTargetDictionary={},a=0,b=d.length;a<b;a++)c=d[a].name||String(a),this.morphTargetInfluences.push(0),this.morphTargetDictionary[c]=a}}else if(d=a.morphTargets,void 0!==d&&0<d.length)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=d.length;a<b;a++)c=d[a].name||String(a),this.morphTargetInfluences.push(0),this.morphTargetDictionary[c]=a},raycast:function(){function a(a,b,c,d,e,f,g){Ta.barycoordFromPoint(a,b,c,d,t);e.multiplyScalar(t.x);f.multiplyScalar(t.y);g.multiplyScalar(t.z);
-e.add(f).add(g);return e.clone()}function b(a,b,c,d,e,f,g){var h=a.material;if(null===(1===h.side?c.intersectTriangle(f,e,d,!0,g):c.intersectTriangle(d,e,f,2!==h.side,g)))return null;x.copy(g);x.applyMatrix4(a.matrixWorld);c=b.ray.origin.distanceTo(x);return c<b.near||c>b.far?null:{distance:c,point:x.clone(),object:a}}function c(c,d,e,f,m,q,l,n){g.fromBufferAttribute(f,q);h.fromBufferAttribute(f,l);k.fromBufferAttribute(f,n);if(c=b(c,d,e,g,h,k,y))m&&(p.fromBufferAttribute(m,q),r.fromBufferAttribute(m,
-l),ca.fromBufferAttribute(m,n),c.uv=a(y,g,h,k,p,r,ca)),c.face=new Sa(q,l,n,Ta.normal(g,h,k)),c.faceIndex=q;return c}var d=new K,e=new kb,f=new Ea,g=new n,h=new n,k=new n,m=new n,q=new n,l=new n,p=new C,r=new C,ca=new C,t=new n,y=new n,x=new n;return function(n,t){var w=this.geometry,x=this.material,B=this.matrixWorld;if(void 0!==x&&(null===w.boundingSphere&&w.computeBoundingSphere(),f.copy(w.boundingSphere),f.applyMatrix4(B),!1!==n.ray.intersectsSphere(f)&&(d.getInverse(B),e.copy(n.ray).applyMatrix4(d),
-null===w.boundingBox||!1!==e.intersectsBox(w.boundingBox)))){var D;if(w.isBufferGeometry){var O,C,x=w.index,F=w.attributes.position,B=w.attributes.uv,z,T;if(null!==x)for(z=0,T=x.count;z<T;z+=3){if(w=x.getX(z),O=x.getX(z+1),C=x.getX(z+2),D=c(this,n,e,F,B,w,O,C))D.faceIndex=Math.floor(z/3),t.push(D)}else for(z=0,T=F.count;z<T;z+=3)if(w=z,O=z+1,C=z+2,D=c(this,n,e,F,B,w,O,C))D.index=w,t.push(D)}else if(w.isGeometry){var E,B=Array.isArray(x);z=w.vertices;T=w.faces;O=w.faceVertexUvs[0];0<O.length&&(F=O);
-for(var G=0,K=T.length;G<K;G++){var P=T[G];D=B?x[P.materialIndex]:x;if(void 0!==D){O=z[P.a];C=z[P.b];E=z[P.c];if(!0===D.morphTargets){D=w.morphTargets;var M=this.morphTargetInfluences;g.set(0,0,0);h.set(0,0,0);k.set(0,0,0);for(var V=0,pa=D.length;V<pa;V++){var S=M[V];if(0!==S){var N=D[V].vertices;g.addScaledVector(m.subVectors(N[P.a],O),S);h.addScaledVector(q.subVectors(N[P.b],C),S);k.addScaledVector(l.subVectors(N[P.c],E),S)}}g.add(O);h.add(C);k.add(E);O=g;C=h;E=k}if(D=b(this,n,e,O,C,E,y))F&&F[G]&&
-(M=F[G],p.copy(M[0]),r.copy(M[1]),ca.copy(M[2]),D.uv=a(y,O,C,E,p,r,ca)),D.face=P,D.faceIndex=G,t.push(D)}}}}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});var bg=0;kd.prototype=Object.assign(Object.create(qa.prototype),{constructor:kd,isArrayCamera:!0});Ib.prototype.isFogExp2=!0;Ib.prototype.clone=function(){return new Ib(this.color.getHex(),this.density)};Ib.prototype.toJSON=function(a){return{type:"FogExp2",color:this.color.getHex(),density:this.density}};
-Jb.prototype.isFog=!0;Jb.prototype.clone=function(){return new Jb(this.color.getHex(),this.near,this.far)};Jb.prototype.toJSON=function(a){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}};ld.prototype=Object.assign(Object.create(z.prototype),{constructor:ld,copy:function(a,b){z.prototype.copy.call(this,a,b);null!==a.background&&(this.background=a.background.clone());null!==a.fog&&(this.fog=a.fog.clone());null!==a.overrideMaterial&&(this.overrideMaterial=a.overrideMaterial.clone());
-this.autoUpdate=a.autoUpdate;this.matrixAutoUpdate=a.matrixAutoUpdate;return this},toJSON:function(a){var b=z.prototype.toJSON.call(this,a);null!==this.background&&(b.object.background=this.background.toJSON(a));null!==this.fog&&(b.object.fog=this.fog.toJSON());return b}});Yd.prototype=Object.assign(Object.create(z.prototype),{constructor:Yd,isLensFlare:!0,copy:function(a){z.prototype.copy.call(this,a);this.positionScreen.copy(a.positionScreen);this.customUpdateCallback=a.customUpdateCallback;for(var b=
-0,c=a.lensFlares.length;b<c;b++)this.lensFlares.push(a.lensFlares[b]);return this},add:function(a,b,c,d,e,f){void 0===b&&(b=-1);void 0===c&&(c=0);void 0===f&&(f=1);void 0===e&&(e=new G(16777215));void 0===d&&(d=1);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:0,opacity:f,color:e,blending:d})},updateLensFlares:function(){var a,b=this.lensFlares.length,c,d=2*-this.positionScreen.x,e=2*-this.positionScreen.y;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*.25,c.rotation+=.25*(c.wantedRotation-c.rotation)}});bb.prototype=Object.create(U.prototype);bb.prototype.constructor=bb;bb.prototype.isSpriteMaterial=!0;bb.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.rotation=a.rotation;return this};xc.prototype=Object.assign(Object.create(z.prototype),{constructor:xc,isSprite:!0,raycast:function(){var a=
-new n,b=new n,c=new n;return function(d,e){b.setFromMatrixPosition(this.matrixWorld);d.ray.closestPointToPoint(b,a);c.setFromMatrixScale(this.matrixWorld);var f=c.x*c.y/4;b.distanceToSquared(a)>f||(f=d.ray.origin.distanceTo(a),f<d.near||f>d.far||e.push({distance:f,point:a.clone(),face:null,object:this}))}}(),clone:function(){return(new this.constructor(this.material)).copy(this)}});yc.prototype=Object.assign(Object.create(z.prototype),{constructor:yc,copy:function(a){z.prototype.copy.call(this,a,
-!1);a=a.levels;for(var b=0,c=a.length;b<c;b++){var d=a[b];this.addLevel(d.object.clone(),d.distance)}return this},addLevel:function(a,b){void 0===b&&(b=0);b=Math.abs(b);for(var c=this.levels,d=0;d<c.length&&!(b<c[d].distance);d++);c.splice(d,0,{distance:b,object:a});this.add(a)},getObjectForDistance:function(a){for(var b=this.levels,c=1,d=b.length;c<d&&!(a<b[c].distance);c++);return b[c-1].object},raycast:function(){var a=new n;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=
-b.ray.origin.distanceTo(a);this.getObjectForDistance(d).raycast(b,c)}}(),update:function(){var a=new n,b=new n;return function(c){var d=this.levels;if(1<d.length){a.setFromMatrixPosition(c.matrixWorld);b.setFromMatrixPosition(this.matrixWorld);c=a.distanceTo(b);d[0].object.visible=!0;for(var e=1,f=d.length;e<f;e++)if(c>=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break;for(;e<f;e++)d[e].object.visible=!1}}}(),toJSON:function(a){a=z.prototype.toJSON.call(this,a);a.object.levels=
-[];for(var b=this.levels,c=0,d=b.length;c<d;c++){var e=b[c];a.object.levels.push({object:e.object.uuid,distance:e.distance})}return a}});Object.assign(zc.prototype,{calculateInverses:function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<b;a++){var c=new K;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);this.boneInverses.push(c)}},pose:function(){var a,b,c;b=0;for(c=this.bones.length;b<c;b++)(a=this.bones[b])&&a.matrixWorld.getInverse(this.boneInverses[b]);b=0;for(c=this.bones.length;b<
-c;b++)if(a=this.bones[b])a.parent&&a.parent.isBone?(a.matrix.getInverse(a.parent.matrixWorld),a.matrix.multiply(a.matrixWorld)):a.matrix.copy(a.matrixWorld),a.matrix.decompose(a.position,a.quaternion,a.scale)},update:function(){var a=new K,b=new K;return function(){for(var c=this.bones,d=this.boneInverses,e=this.boneMatrices,f=this.boneTexture,g=0,h=c.length;g<h;g++)a.multiplyMatrices(c[g]?c[g].matrixWorld:b,d[g]),a.toArray(e,16*g);void 0!==f&&(f.needsUpdate=!0)}}(),clone:function(){return new zc(this.bones,
-this.boneInverses)}});md.prototype=Object.assign(Object.create(z.prototype),{constructor:md,isBone:!0});nd.prototype=Object.assign(Object.create(la.prototype),{constructor:nd,isSkinnedMesh:!0,initBones:function(){var a=[],b,c,d,e;if(this.geometry&&void 0!==this.geometry.bones){d=0;for(e=this.geometry.bones.length;d<e;d++)c=this.geometry.bones[d],b=new md,a.push(b),b.name=c.name,b.position.fromArray(c.pos),b.quaternion.fromArray(c.rotq),void 0!==c.scl&&b.scale.fromArray(c.scl);d=0;for(e=this.geometry.bones.length;d<
-e;d++)c=this.geometry.bones[d],-1!==c.parent&&null!==c.parent&&void 0!==a[c.parent]?a[c.parent].add(a[d]):this.add(a[d])}this.updateMatrixWorld(!0);return a},bind:function(a,b){this.skeleton=a;void 0===b&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),b=this.matrixWorld);this.bindMatrix.copy(b);this.bindMatrixInverse.getInverse(b)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){var a,b;if(this.geometry&&this.geometry.isGeometry)for(b=0;b<this.geometry.skinWeights.length;b++){var c=
-this.geometry.skinWeights[b];a=1/c.lengthManhattan();Infinity!==a?c.multiplyScalar(a):c.set(1,0,0,0)}else if(this.geometry&&this.geometry.isBufferGeometry){var c=new fa,d=this.geometry.attributes.skinWeight;for(b=0;b<d.count;b++)c.x=d.getX(b),c.y=d.getY(b),c.z=d.getZ(b),c.w=d.getW(b),a=1/c.lengthManhattan(),Infinity!==a?c.multiplyScalar(a):c.set(1,0,0,0),d.setXYZW(b,c.x,c.y,c.z,c.w)}},updateMatrixWorld:function(a){la.prototype.updateMatrixWorld.call(this,a);"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):
-"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});ea.prototype=Object.create(U.prototype);ea.prototype.constructor=ea;ea.prototype.isLineBasicMaterial=!0;ea.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.linecap=a.linecap;this.linejoin=a.linejoin;
-return this};sa.prototype=Object.assign(Object.create(z.prototype),{constructor:sa,isLine:!0,raycast:function(){var a=new K,b=new kb,c=new Ea;return function(d,e){var f=d.linePrecision,f=f*f,g=this.geometry,h=this.matrixWorld;null===g.boundingSphere&&g.computeBoundingSphere();c.copy(g.boundingSphere);c.applyMatrix4(h);if(!1!==d.ray.intersectsSphere(c)){a.getInverse(h);b.copy(d.ray).applyMatrix4(a);var k=new n,m=new n,h=new n,q=new n,l=this&&this.isLineSegments?2:1;if(g.isBufferGeometry){var p=g.index,
-r=g.attributes.position.array;if(null!==p)for(var p=p.array,g=0,ca=p.length-1;g<ca;g+=l){var t=p[g+1];k.fromArray(r,3*p[g]);m.fromArray(r,3*t);t=b.distanceSqToSegment(k,m,q,h);t>f||(q.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(q),t<d.near||t>d.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else for(g=0,ca=r.length/3-1;g<ca;g+=l)k.fromArray(r,3*g),m.fromArray(r,3*g+3),t=b.distanceSqToSegment(k,m,q,h),t>f||(q.applyMatrix4(this.matrixWorld),
-t=d.ray.origin.distanceTo(q),t<d.near||t>d.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else if(g.isGeometry)for(k=g.vertices,m=k.length,g=0;g<m-1;g+=l)t=b.distanceSqToSegment(k[g],k[g+1],q,h),t>f||(q.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(q),t<d.near||t>d.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}}(),clone:function(){return(new this.constructor(this.geometry,
-this.material)).copy(this)}});Q.prototype=Object.assign(Object.create(sa.prototype),{constructor:Q,isLineSegments:!0});od.prototype=Object.assign(Object.create(sa.prototype),{constructor:od,isLineLoop:!0});Fa.prototype=Object.create(U.prototype);Fa.prototype.constructor=Fa;Fa.prototype.isPointsMaterial=!0;Fa.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;return this};Kb.prototype=Object.assign(Object.create(z.prototype),
-{constructor:Kb,isPoints:!0,raycast:function(){var a=new K,b=new kb,c=new Ea;return function(d,e){function f(a,c){var f=b.distanceSqToPoint(a);if(f<q){var h=b.closestPointToPoint(a);h.applyMatrix4(k);var m=d.ray.origin.distanceTo(h);m<d.near||m>d.far||e.push({distance:m,distanceToRay:Math.sqrt(f),point:h.clone(),index:c,face:null,object:g})}}var g=this,h=this.geometry,k=this.matrixWorld,m=d.params.Points.threshold;null===h.boundingSphere&&h.computeBoundingSphere();c.copy(h.boundingSphere);c.applyMatrix4(k);
-c.radius+=m;if(!1!==d.ray.intersectsSphere(c)){a.getInverse(k);b.copy(d.ray).applyMatrix4(a);var m=m/((this.scale.x+this.scale.y+this.scale.z)/3),q=m*m,m=new n;if(h.isBufferGeometry){var l=h.index,h=h.attributes.position.array;if(null!==l)for(var p=l.array,l=0,r=p.length;l<r;l++){var ca=p[l];m.fromArray(h,3*ca);f(m,ca)}else for(l=0,p=h.length/3;l<p;l++)m.fromArray(h,3*l),f(m,l)}else for(m=h.vertices,l=0,p=m.length;l<p;l++)f(m[l],l)}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});
-Ac.prototype=Object.assign(Object.create(z.prototype),{constructor:Ac});pd.prototype=Object.create(ba.prototype);pd.prototype.constructor=pd;Lb.prototype=Object.create(ba.prototype);Lb.prototype.constructor=Lb;Lb.prototype.isCompressedTexture=!0;qd.prototype=Object.create(ba.prototype);qd.prototype.constructor=qd;Bc.prototype=Object.create(ba.prototype);Bc.prototype.constructor=Bc;Bc.prototype.isDepthTexture=!0;Mb.prototype=Object.create(E.prototype);Mb.prototype.constructor=Mb;Cc.prototype=Object.create(J.prototype);
-Cc.prototype.constructor=Cc;Nb.prototype=Object.create(E.prototype);Nb.prototype.constructor=Nb;Dc.prototype=Object.create(J.prototype);Dc.prototype.constructor=Dc;za.prototype=Object.create(E.prototype);za.prototype.constructor=za;Ec.prototype=Object.create(J.prototype);Ec.prototype.constructor=Ec;Ob.prototype=Object.create(za.prototype);Ob.prototype.constructor=Ob;Fc.prototype=Object.create(J.prototype);Fc.prototype.constructor=Fc;lb.prototype=Object.create(za.prototype);lb.prototype.constructor=
-lb;Gc.prototype=Object.create(J.prototype);Gc.prototype.constructor=Gc;Pb.prototype=Object.create(za.prototype);Pb.prototype.constructor=Pb;Hc.prototype=Object.create(J.prototype);Hc.prototype.constructor=Hc;Qb.prototype=Object.create(za.prototype);Qb.prototype.constructor=Qb;Ic.prototype=Object.create(J.prototype);Ic.prototype.constructor=Ic;Rb.prototype=Object.create(E.prototype);Rb.prototype.constructor=Rb;Jc.prototype=Object.create(J.prototype);Jc.prototype.constructor=Jc;Sb.prototype=Object.create(E.prototype);
-Sb.prototype.constructor=Sb;Kc.prototype=Object.create(J.prototype);Kc.prototype.constructor=Kc;Tb.prototype=Object.create(E.prototype);Tb.prototype.constructor=Tb;var Ia={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;e<b;d=e++)c+=a[d].x*a[e].y-a[e].x*a[d].y;return.5*c},triangulate:function(){return function(a,b){var c=a.length;if(3>c)return null;var d=[],e=[],f=[],g,h,k;if(0<Ia.area(a))for(h=0;h<c;h++)e[h]=h;else for(h=0;h<c;h++)e[h]=c-1-h;var m=2*c;for(h=c-1;2<c;){if(0>=m--){console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()");
-break}g=h;c<=g&&(g=0);h=g+1;c<=h&&(h=0);k=h+1;c<=k&&(k=0);var q;a:{var l,p,r,n,t,y,x,u;l=a[e[g]].x;p=a[e[g]].y;r=a[e[h]].x;n=a[e[h]].y;t=a[e[k]].x;y=a[e[k]].y;if(0>=(r-l)*(y-p)-(n-p)*(t-l))q=!1;else{var H,w,I,z,D,O,B,C,E,G;H=t-r;w=y-n;I=l-t;z=p-y;D=r-l;O=n-p;for(q=0;q<c;q++)if(x=a[e[q]].x,u=a[e[q]].y,!(x===l&&u===p||x===r&&u===n||x===t&&u===y)&&(B=x-l,C=u-p,E=x-r,G=u-n,x-=t,u-=y,E=H*G-w*E,B=D*C-O*B,C=I*u-z*x,E>=-Number.EPSILON&&C>=-Number.EPSILON&&B>=-Number.EPSILON)){q=!1;break a}q=!0}}if(q){d.push([a[e[g]],
-a[e[h]],a[e[k]]]);f.push([e[g],e[h],e[k]]);g=h;for(k=h+1;k<c;g++,k++)e[g]=e[k];c--;m=2*c}}return b?f:d}}(),triangulateShape:function(a,b){function c(a){var b=a.length;2<b&&a[b-1].equals(a[0])&&a.pop()}function d(a,b,c){return a.x!==b.x?a.x<b.x?a.x<=c.x&&c.x<=b.x:b.x<=c.x&&c.x<=a.x:a.y<b.y?a.y<=c.y&&c.y<=b.y:b.y<=c.y&&c.y<=a.y}function e(a,b,c,e,f){var g=b.x-a.x,h=b.y-a.y,k=e.x-c.x,m=e.y-c.y,q=a.x-c.x,l=a.y-c.y,p=h*k-g*m,n=h*q-g*l;if(Math.abs(p)>Number.EPSILON){if(0<p){if(0>n||n>p)return[];k=m*q-k*
-l;if(0>k||k>p)return[]}else{if(0<n||n<p)return[];k=m*q-k*l;if(0<k||k<p)return[]}if(0===k)return!f||0!==n&&n!==p?[a]:[];if(k===p)return!f||0!==n&&n!==p?[b]:[];if(0===n)return[c];if(n===p)return[e];f=k/p;return[{x:a.x+f*g,y:a.y+f*h}]}if(0!==n||m*q!==k*l)return[];h=0===g&&0===h;k=0===k&&0===m;if(h&&k)return a.x!==c.x||a.y!==c.y?[]:[a];if(h)return d(c,e,a)?[a]:[];if(k)return d(a,b,c)?[c]:[];0!==g?(a.x<b.x?(g=a,k=a.x,h=b,a=b.x):(g=b,k=b.x,h=a,a=a.x),c.x<e.x?(b=c,p=c.x,m=e,c=e.x):(b=e,p=e.x,m=c,c=c.x)):
-(a.y<b.y?(g=a,k=a.y,h=b,a=b.y):(g=b,k=b.y,h=a,a=a.y),c.y<e.y?(b=c,p=c.y,m=e,c=e.y):(b=e,p=e.y,m=c,c=c.y));return k<=p?a<p?[]:a===p?f?[]:[b]:a<=c?[b,h]:[b,m]:k>c?[]:k===c?f?[]:[g]:a<=c?[g,h]:[g,m]}function f(a,b,c,d){var e=b.x-a.x,f=b.y-a.y;b=c.x-a.x;c=c.y-a.y;var g=d.x-a.x;d=d.y-a.y;a=e*c-f*b;e=e*d-f*g;return Math.abs(a)>Number.EPSILON?(b=g*c-d*b,0<a?0<=e&&0<=b:0<=e||0<=b):0<e}c(a);b.forEach(c);var g,h,k,m,q,l={};k=a.concat();g=0;for(h=b.length;g<h;g++)Array.prototype.push.apply(k,b[g]);g=0;for(h=
-k.length;g<h;g++)q=k[g].x+":"+k[g].y,void 0!==l[q]&&console.warn("THREE.ShapeUtils: Duplicate point",q,g),l[q]=g;g=function(a,b){function c(a,b){var d=h.length-1,e=a-1;0>e&&(e=d);var g=a+1;g>d&&(g=0);d=f(h[a],h[e],h[g],k[b]);if(!d)return!1;d=k.length-1;e=b-1;0>e&&(e=d);g=b+1;g>d&&(g=0);return(d=f(k[b],k[e],k[g],h[a]))?!0:!1}function d(a,b){var c,f;for(c=0;c<h.length;c++)if(f=c+1,f%=h.length,f=e(a,b,h[c],h[f],!0),0<f.length)return!0;return!1}function g(a,c){var d,f,h,k;for(d=0;d<m.length;d++)for(f=
-b[m[d]],h=0;h<f.length;h++)if(k=h+1,k%=f.length,k=e(a,c,f[h],f[k],!0),0<k.length)return!0;return!1}var h=a.concat(),k,m=[],q,l,p,n,v,B=[],C,z,E,G=0;for(q=b.length;G<q;G++)m.push(G);C=0;for(var K=2*m.length;0<m.length;){K--;if(0>K){console.log("Infinite Loop! Holes left:"+m.length+", Probably Hole outside Shape!");break}for(l=C;l<h.length;l++){p=h[l];q=-1;for(G=0;G<m.length;G++)if(n=m[G],v=p.x+":"+p.y+":"+n,void 0===B[v]){k=b[n];for(z=0;z<k.length;z++)if(n=k[z],c(l,z)&&!d(p,n)&&!g(p,n)){q=z;m.splice(G,
-1);C=h.slice(0,l+1);n=h.slice(l);z=k.slice(q);E=k.slice(0,q+1);h=C.concat(z).concat(E).concat(n);C=l;break}if(0<=q)break;B[v]=!0}if(0<=q)break}}return h}(a,b);var p=Ia.triangulate(g,!1);g=0;for(h=p.length;g<h;g++)for(m=p[g],k=0;3>k;k++)q=m[k].x+":"+m[k].y,q=l[q],void 0!==q&&(m[k]=q);return p.concat()},isClockWise:function(a){return 0>Ia.area(a)}};cb.prototype=Object.create(J.prototype);cb.prototype.constructor=cb;Ga.prototype=Object.create(E.prototype);Ga.prototype.constructor=Ga;Ga.prototype.getArrays=
-function(){var a=this.getAttribute("position"),a=a?Array.prototype.slice.call(a.array):[],b=this.getAttribute("uv"),b=b?Array.prototype.slice.call(b.array):[],c=this.index,c=c?Array.prototype.slice.call(c.array):[];return{position:a,uv:b,index:c}};Ga.prototype.addShapeList=function(a,b){var c=a.length;b.arrays=this.getArrays();for(var d=0;d<c;d++)this.addShape(a[d],b);this.setIndex(b.arrays.index);this.addAttribute("position",new B(b.arrays.position,3));this.addAttribute("uv",new B(b.arrays.uv,2))};
-Ga.prototype.addShape=function(a,b){function c(a,b,c){b||console.error("THREE.ExtrudeGeometry: vec does not exist");return b.clone().multiplyScalar(c).add(a)}function d(a,b,c){var d,e,f;e=a.x-b.x;f=a.y-b.y;d=c.x-a.x;var g=c.y-a.y,h=e*e+f*f;if(Math.abs(e*g-f*d)>Number.EPSILON){var k=Math.sqrt(h),m=Math.sqrt(d*d+g*g),h=b.x-f/k;b=b.y+e/k;g=((c.x-g/m-h)*g-(c.y+d/m-b)*d)/(e*g-f*d);d=h+e*g-a.x;e=b+f*g-a.y;f=d*d+e*e;if(2>=f)return new C(d,e);f=Math.sqrt(f/2)}else a=!1,e>Number.EPSILON?d>Number.EPSILON&&
-(a=!0):e<-Number.EPSILON?d<-Number.EPSILON&&(a=!0):Math.sign(f)===Math.sign(g)&&(a=!0),a?(d=-f,f=Math.sqrt(h)):(d=e,e=f,f=Math.sqrt(h/2));return new C(d/f,e/f)}function e(a,b){var c,d;for(L=a.length;0<=--L;){c=L;d=L-1;0>d&&(d=a.length-1);var e,f=H+2*y;for(e=0;e<f;e++){var g=ba*e,m=ba*(e+1),l=b+d+g,p=b+d+m,m=b+c+m;h(b+c+g);h(l);h(m);h(l);h(p);h(m);g=q.length/3;g=D.generateSideWallUV(Z,q,g-6,g-3,g-2,g-1);k(g[0]);k(g[1]);k(g[3]);k(g[1]);k(g[2]);k(g[3])}}}function f(a,b,c){r.push(a);r.push(b);r.push(c)}
-function g(a,b,c){h(a);h(b);h(c);a=q.length/3;a=D.generateTopUV(Z,q,a-3,a-2,a-1);k(a[0]);k(a[1]);k(a[2])}function h(a){l.push(q.length/3);q.push(r[3*a+0]);q.push(r[3*a+1]);q.push(r[3*a+2])}function k(a){p.push(a.x);p.push(a.y)}var m=b.arrays?b.arrays:this.getArrays(),q=m.position,l=m.index,p=m.uv,r=[],m=void 0!==b.amount?b.amount:100,z=void 0!==b.bevelThickness?b.bevelThickness:6,t=void 0!==b.bevelSize?b.bevelSize:z-2,y=void 0!==b.bevelSegments?b.bevelSegments:3,x=void 0!==b.bevelEnabled?b.bevelEnabled:
-!0,u=void 0!==b.curveSegments?b.curveSegments:12,H=void 0!==b.steps?b.steps:1,w=b.extrudePath,I,G=!1,D=void 0!==b.UVGenerator?b.UVGenerator:cb.WorldUVGenerator,O,E,F,K;w&&(I=w.getSpacedPoints(H),G=!0,x=!1,O=void 0!==b.frames?b.frames:w.computeFrenetFrames(H,!1),E=new n,F=new n,K=new n);x||(t=z=y=0);var T,J,U,Z=this,w=a.extractPoints(u),u=w.shape,P=w.holes;if(!Ia.isClockWise(u))for(u=u.reverse(),J=0,U=P.length;J<U;J++)T=P[J],Ia.isClockWise(T)&&(P[J]=T.reverse());var M=Ia.triangulateShape(u,P),V=u;
-J=0;for(U=P.length;J<U;J++)T=P[J],u=u.concat(T);var R,S,N,Y,Q,ba=u.length,X,fa=M.length,w=[],L=0;N=V.length;R=N-1;for(S=L+1;L<N;L++,R++,S++)R===N&&(R=0),S===N&&(S=0),w[L]=d(V[L],V[R],V[S]);var ha=[],ea,ia=w.concat();J=0;for(U=P.length;J<U;J++){T=P[J];ea=[];L=0;N=T.length;R=N-1;for(S=L+1;L<N;L++,R++,S++)R===N&&(R=0),S===N&&(S=0),ea[L]=d(T[L],T[R],T[S]);ha.push(ea);ia=ia.concat(ea)}for(R=0;R<y;R++){N=R/y;Y=z*Math.cos(N*Math.PI/2);S=t*Math.sin(N*Math.PI/2);L=0;for(N=V.length;L<N;L++)Q=c(V[L],w[L],S),
-f(Q.x,Q.y,-Y);J=0;for(U=P.length;J<U;J++)for(T=P[J],ea=ha[J],L=0,N=T.length;L<N;L++)Q=c(T[L],ea[L],S),f(Q.x,Q.y,-Y)}S=t;for(L=0;L<ba;L++)Q=x?c(u[L],ia[L],S):u[L],G?(F.copy(O.normals[0]).multiplyScalar(Q.x),E.copy(O.binormals[0]).multiplyScalar(Q.y),K.copy(I[0]).add(F).add(E),f(K.x,K.y,K.z)):f(Q.x,Q.y,0);for(N=1;N<=H;N++)for(L=0;L<ba;L++)Q=x?c(u[L],ia[L],S):u[L],G?(F.copy(O.normals[N]).multiplyScalar(Q.x),E.copy(O.binormals[N]).multiplyScalar(Q.y),K.copy(I[N]).add(F).add(E),f(K.x,K.y,K.z)):f(Q.x,Q.y,
-m/H*N);for(R=y-1;0<=R;R--){N=R/y;Y=z*Math.cos(N*Math.PI/2);S=t*Math.sin(N*Math.PI/2);L=0;for(N=V.length;L<N;L++)Q=c(V[L],w[L],S),f(Q.x,Q.y,m+Y);J=0;for(U=P.length;J<U;J++)for(T=P[J],ea=ha[J],L=0,N=T.length;L<N;L++)Q=c(T[L],ea[L],S),G?f(Q.x,Q.y+I[H-1].y,I[H-1].x+Y):f(Q.x,Q.y,m+Y)}(function(){var a=q.length/3;if(x){var c=0*ba;for(L=0;L<fa;L++)X=M[L],g(X[2]+c,X[1]+c,X[0]+c);c=ba*(H+2*y);for(L=0;L<fa;L++)X=M[L],g(X[0]+c,X[1]+c,X[2]+c)}else{for(L=0;L<fa;L++)X=M[L],g(X[2],X[1],X[0]);for(L=0;L<fa;L++)X=
-M[L],g(X[0]+ba*H,X[1]+ba*H,X[2]+ba*H)}Z.addGroup(a,q.length/3-a,void 0!==b.material?b.material:0)})();(function(){var a=q.length/3,c=0;e(V,c);c+=V.length;J=0;for(U=P.length;J<U;J++)T=P[J],e(T,c),c+=T.length;Z.addGroup(a,q.length/3-a,void 0!==b.extrudeMaterial?b.extrudeMaterial:1)})();b.arrays||(this.setIndex(l),this.addAttribute("position",new B(q,3)),this.addAttribute("uv",new B(b.arrays.uv,2)))};cb.WorldUVGenerator={generateTopUV:function(a,b,c,d,e){a=b[3*d];d=b[3*d+1];var f=b[3*e];e=b[3*e+1];return[new C(b[3*
-c],b[3*c+1]),new C(a,d),new C(f,e)]},generateSideWallUV:function(a,b,c,d,e,f){a=b[3*c];var g=b[3*c+1];c=b[3*c+2];var h=b[3*d],k=b[3*d+1];d=b[3*d+2];var m=b[3*e],l=b[3*e+1];e=b[3*e+2];var n=b[3*f],p=b[3*f+1];b=b[3*f+2];return.01>Math.abs(g-k)?[new C(a,1-c),new C(h,1-d),new C(m,1-e),new C(n,1-b)]:[new C(g,1-c),new C(k,1-d),new C(l,1-e),new C(p,1-b)]}};Lc.prototype=Object.create(J.prototype);Lc.prototype.constructor=Lc;Ub.prototype=Object.create(Ga.prototype);Ub.prototype.constructor=Ub;Mc.prototype=
-Object.create(J.prototype);Mc.prototype.constructor=Mc;mb.prototype=Object.create(E.prototype);mb.prototype.constructor=mb;Nc.prototype=Object.create(J.prototype);Nc.prototype.constructor=Nc;Vb.prototype=Object.create(E.prototype);Vb.prototype.constructor=Vb;Oc.prototype=Object.create(J.prototype);Oc.prototype.constructor=Oc;Wb.prototype=Object.create(E.prototype);Wb.prototype.constructor=Wb;Xb.prototype=Object.create(J.prototype);Xb.prototype.constructor=Xb;Yb.prototype=Object.create(E.prototype);
-Yb.prototype.constructor=Yb;Zb.prototype=Object.create(E.prototype);Zb.prototype.constructor=Zb;nb.prototype=Object.create(J.prototype);nb.prototype.constructor=nb;Ua.prototype=Object.create(E.prototype);Ua.prototype.constructor=Ua;Pc.prototype=Object.create(nb.prototype);Pc.prototype.constructor=Pc;Qc.prototype=Object.create(Ua.prototype);Qc.prototype.constructor=Qc;Rc.prototype=Object.create(J.prototype);Rc.prototype.constructor=Rc;$b.prototype=Object.create(E.prototype);$b.prototype.constructor=
-$b;var Ma=Object.freeze({WireframeGeometry:Mb,ParametricGeometry:Cc,ParametricBufferGeometry:Nb,TetrahedronGeometry:Ec,TetrahedronBufferGeometry:Ob,OctahedronGeometry:Fc,OctahedronBufferGeometry:lb,IcosahedronGeometry:Gc,IcosahedronBufferGeometry:Pb,DodecahedronGeometry:Hc,DodecahedronBufferGeometry:Qb,PolyhedronGeometry:Dc,PolyhedronBufferGeometry:za,TubeGeometry:Ic,TubeBufferGeometry:Rb,TorusKnotGeometry:Jc,TorusKnotBufferGeometry:Sb,TorusGeometry:Kc,TorusBufferGeometry:Tb,TextGeometry:Lc,TextBufferGeometry:Ub,
-SphereGeometry:Mc,SphereBufferGeometry:mb,RingGeometry:Nc,RingBufferGeometry:Vb,PlaneGeometry:vc,PlaneBufferGeometry:jb,LatheGeometry:Oc,LatheBufferGeometry:Wb,ShapeGeometry:Xb,ShapeBufferGeometry:Yb,ExtrudeGeometry:cb,ExtrudeBufferGeometry:Ga,EdgesGeometry:Zb,ConeGeometry:Pc,ConeBufferGeometry:Qc,CylinderGeometry:nb,CylinderBufferGeometry:Ua,CircleGeometry:Rc,CircleBufferGeometry:$b,BoxGeometry:Gb,BoxBufferGeometry:ib});ac.prototype=Object.create(ra.prototype);ac.prototype.constructor=ac;ac.prototype.isShadowMaterial=
-!0;bc.prototype=Object.create(ra.prototype);bc.prototype.constructor=bc;bc.prototype.isRawShaderMaterial=!0;Pa.prototype=Object.create(U.prototype);Pa.prototype.constructor=Pa;Pa.prototype.isMeshStandardMaterial=!0;Pa.prototype.copy=function(a){U.prototype.copy.call(this,a);this.defines={STANDARD:""};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=
-a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap;this.metalnessMap=a.metalnessMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.envMapIntensity=a.envMapIntensity;
-this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};ob.prototype=Object.create(Pa.prototype);ob.prototype.constructor=ob;ob.prototype.isMeshPhysicalMaterial=!0;ob.prototype.copy=function(a){Pa.prototype.copy.call(this,a);this.defines={PHYSICAL:""};this.reflectivity=
-a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};Ja.prototype=Object.create(U.prototype);Ja.prototype.constructor=Ja;Ja.prototype.isMeshPhongMaterial=!0;Ja.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);
-this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;
-this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};pb.prototype=Object.create(Ja.prototype);pb.prototype.constructor=pb;pb.prototype.isMeshToonMaterial=!0;pb.prototype.copy=function(a){Ja.prototype.copy.call(this,a);this.gradientMap=a.gradientMap;return this};qb.prototype=Object.create(U.prototype);qb.prototype.constructor=
-qb;qb.prototype.isMeshNormalMaterial=!0;qb.prototype.copy=function(a){U.prototype.copy.call(this,a);this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};
-rb.prototype=Object.create(U.prototype);rb.prototype.constructor=rb;rb.prototype.isMeshLambertMaterial=!0;rb.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=
-a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};sb.prototype=Object.create(U.prototype);sb.prototype.constructor=sb;sb.prototype.isLineDashedMaterial=!0;sb.prototype.copy=function(a){U.prototype.copy.call(this,
-a);this.color.copy(a.color);this.linewidth=a.linewidth;this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var mg=Object.freeze({ShadowMaterial:ac,SpriteMaterial:bb,RawShaderMaterial:bc,ShaderMaterial:ra,PointsMaterial:Fa,MeshPhysicalMaterial:ob,MeshStandardMaterial:Pa,MeshPhongMaterial:Ja,MeshToonMaterial:pb,MeshNormalMaterial:qb,MeshLambertMaterial:rb,MeshDepthMaterial:Za,MeshBasicMaterial:ya,LineDashedMaterial:sb,LineBasicMaterial:ea,Material:U}),ed={enabled:!1,files:{},
-add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}},va=new Zd;Object.assign(Ka.prototype,{load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);var e=this,f=ed.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){var h=g[1],k=!!g[2],g=
-g[3],g=window.decodeURIComponent(g);k&&(g=window.atob(g));try{var m,l=(this.responseType||"").toLowerCase();switch(l){case "arraybuffer":case "blob":m=new ArrayBuffer(g.length);for(var n=new Uint8Array(m),k=0;k<g.length;k++)n[k]=g.charCodeAt(k);"blob"===l&&(m=new Blob([m],{type:h}));break;case "document":m=(new DOMParser).parseFromString(g,h);break;case "json":m=JSON.parse(g);break;default:m=g}window.setTimeout(function(){b&&b(m);e.manager.itemEnd(a)},0)}catch(r){window.setTimeout(function(){d&&d(r);
-e.manager.itemEnd(a);e.manager.itemError(a)},0)}}else{var p=new XMLHttpRequest;p.open("GET",a,!0);p.addEventListener("load",function(c){var f=c.target.response;ed.add(a,f);200===this.status?(b&&b(f),e.manager.itemEnd(a)):0===this.status?(console.warn("THREE.FileLoader: HTTP Status 0 received."),b&&b(f),e.manager.itemEnd(a)):(d&&d(c),e.manager.itemEnd(a),e.manager.itemError(a))},!1);void 0!==c&&p.addEventListener("progress",function(a){c(a)},!1);p.addEventListener("error",function(b){d&&d(b);e.manager.itemEnd(a);
-e.manager.itemError(a)},!1);void 0!==this.responseType&&(p.responseType=this.responseType);void 0!==this.withCredentials&&(p.withCredentials=this.withCredentials);p.overrideMimeType&&p.overrideMimeType(void 0!==this.mimeType?this.mimeType:"text/plain");for(h in this.requestHeader)p.setRequestHeader(h,this.requestHeader[h]);p.send(null)}e.manager.itemStart(a);return p},setPath:function(a){this.path=a;return this},setResponseType:function(a){this.responseType=a;return this},setWithCredentials:function(a){this.withCredentials=
-a;return this},setMimeType:function(a){this.mimeType=a;return this},setRequestHeader:function(a){this.requestHeader=a;return this}});Object.assign(Oe.prototype,{load:function(a,b,c,d){function e(e){k.load(a[e],function(a){a=f._parser(a,!0);g[e]={width:a.width,height:a.height,format:a.format,mipmaps:a.mipmaps};m+=1;6===m&&(1===a.mipmapCount&&(h.minFilter=1006),h.format=a.format,h.needsUpdate=!0,b&&b(h))},c,d)}var f=this,g=[],h=new Lb;h.image=g;var k=new Ka(this.manager);k.setPath(this.path);k.setResponseType("arraybuffer");
-if(Array.isArray(a))for(var m=0,l=0,n=a.length;l<n;++l)e(l);else k.load(a,function(a){a=f._parser(a,!0);if(a.isCubemap)for(var c=a.mipmaps.length/a.mipmapCount,d=0;d<c;d++){g[d]={mipmaps:[]};for(var e=0;e<a.mipmapCount;e++)g[d].mipmaps.push(a.mipmaps[d*a.mipmapCount+e]),g[d].format=a.format,g[d].width=a.width,g[d].height=a.height}else h.image.width=a.width,h.image.height=a.height,h.mipmaps=a.mipmaps;1===a.mipmapCount&&(h.minFilter=1006);h.format=a.format;h.needsUpdate=!0;b&&b(h)},c,d);return h},setPath:function(a){this.path=
-a;return this}});Object.assign($d.prototype,{load:function(a,b,c,d){var e=this,f=new db,g=new Ka(this.manager);g.setResponseType("arraybuffer");g.load(a,function(a){if(a=e._parser(a))void 0!==a.image?f.image=a.image:void 0!==a.data&&(f.image.width=a.width,f.image.height=a.height,f.image.data=a.data),f.wrapS=void 0!==a.wrapS?a.wrapS:1001,f.wrapT=void 0!==a.wrapT?a.wrapT:1001,f.magFilter=void 0!==a.magFilter?a.magFilter:1006,f.minFilter=void 0!==a.minFilter?a.minFilter:1008,f.anisotropy=void 0!==a.anisotropy?
-a.anisotropy:1,void 0!==a.format&&(f.format=a.format),void 0!==a.type&&(f.type=a.type),void 0!==a.mipmaps&&(f.mipmaps=a.mipmaps),1===a.mipmapCount&&(f.minFilter=1006),f.needsUpdate=!0,b&&b(f,a)},c,d);return f}});Object.assign(Sc.prototype,{load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);var e=this,f=ed.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;c=document.createElementNS("http://www.w3.org/1999/xhtml","img");
-c.addEventListener("load",function(){ed.add(a,this);b&&b(this);e.manager.itemEnd(a)},!1);c.addEventListener("error",function(b){d&&d(b);e.manager.itemEnd(a);e.manager.itemError(a)},!1);"data:"!==a.substr(0,5)&&void 0!==this.crossOrigin&&(c.crossOrigin=this.crossOrigin);e.manager.itemStart(a);c.src=a;return c},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(ae.prototype,{load:function(a,b,c,d){function e(c){g.load(a[c],function(a){f.images[c]=
-a;h++;6===h&&(f.needsUpdate=!0,b&&b(f))},void 0,d)}var f=new Xa,g=new Sc(this.manager);g.setCrossOrigin(this.crossOrigin);g.setPath(this.path);var h=0;for(c=0;c<a.length;++c)e(c);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(rd.prototype,{load:function(a,b,c,d){var e=new Sc(this.manager);e.setCrossOrigin(this.crossOrigin);e.setPath(this.path);var f=new ba;f.image=e.load(a,function(){var c=0<a.search(/\.(jpg|jpeg)$/)||
-0===a.search(/^data\:image\/jpeg/);f.format=c?1022:1023;f.needsUpdate=!0;void 0!==b&&b(f)},c,d);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});na.prototype=Object.assign(Object.create(z.prototype),{constructor:na,isLight:!0,copy:function(a){z.prototype.copy.call(this,a);this.color.copy(a.color);this.intensity=a.intensity;return this},toJSON:function(a){a=z.prototype.toJSON.call(this,a);a.object.color=this.color.getHex();a.object.intensity=
-this.intensity;void 0!==this.groundColor&&(a.object.groundColor=this.groundColor.getHex());void 0!==this.distance&&(a.object.distance=this.distance);void 0!==this.angle&&(a.object.angle=this.angle);void 0!==this.decay&&(a.object.decay=this.decay);void 0!==this.penumbra&&(a.object.penumbra=this.penumbra);void 0!==this.shadow&&(a.object.shadow=this.shadow.toJSON());return a}});sd.prototype=Object.assign(Object.create(na.prototype),{constructor:sd,isHemisphereLight:!0,copy:function(a){na.prototype.copy.call(this,
-a);this.groundColor.copy(a.groundColor);return this}});Object.assign(tb.prototype,{copy:function(a){this.camera=a.camera.clone();this.bias=a.bias;this.radius=a.radius;this.mapSize.copy(a.mapSize);return this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var a={};0!==this.bias&&(a.bias=this.bias);1!==this.radius&&(a.radius=this.radius);if(512!==this.mapSize.x||512!==this.mapSize.y)a.mapSize=this.mapSize.toArray();a.camera=this.camera.toJSON(!1).object;delete a.camera.matrix;
-return a}});td.prototype=Object.assign(Object.create(tb.prototype),{constructor:td,isSpotLightShadow:!0,update:function(a){var b=this.camera,c=2*Y.RAD2DEG*a.angle,d=this.mapSize.width/this.mapSize.height;a=a.distance||b.far;if(c!==b.fov||d!==b.aspect||a!==b.far)b.fov=c,b.aspect=d,b.far=a,b.updateProjectionMatrix()}});ud.prototype=Object.assign(Object.create(na.prototype),{constructor:ud,isSpotLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.distance=a.distance;this.angle=a.angle;this.penumbra=
-a.penumbra;this.decay=a.decay;this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});vd.prototype=Object.assign(Object.create(na.prototype),{constructor:vd,isPointLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.distance=a.distance;this.decay=a.decay;this.shadow=a.shadow.clone();return this}});wd.prototype=Object.assign(Object.create(tb.prototype),{constructor:wd});xd.prototype=Object.assign(Object.create(na.prototype),{constructor:xd,isDirectionalLight:!0,copy:function(a){na.prototype.copy.call(this,
-a);this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});yd.prototype=Object.assign(Object.create(na.prototype),{constructor:yd,isAmbientLight:!0});zd.prototype=Object.assign(Object.create(na.prototype),{constructor:zd,isRectAreaLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.width=a.width;this.height=a.height;return this},toJSON:function(a){a=na.prototype.toJSON.call(this,a);a.object.width=this.width;a.object.height=this.height;return a}});var ia={arraySlice:function(a,
-b,c){return ia.isTypedArray(a)?new a.constructor(a.subarray(b,void 0!==c?c:a.length)):a.slice(b,c)},convertArray:function(a,b,c){return!a||!c&&a.constructor===b?a:"number"===typeof b.BYTES_PER_ELEMENT?new b(a):Array.prototype.slice.call(a)},isTypedArray:function(a){return ArrayBuffer.isView(a)&&!(a instanceof DataView)},getKeyframeOrder:function(a){for(var b=a.length,c=Array(b),d=0;d!==b;++d)c[d]=d;c.sort(function(b,c){return a[b]-a[c]});return c},sortedArray:function(a,b,c){for(var d=a.length,e=
-new a.constructor(d),f=0,g=0;g!==d;++f)for(var h=c[f]*b,k=0;k!==b;++k)e[g++]=a[h+k];return e},flattenJSON:function(a,b,c,d){for(var e=1,f=a[0];void 0!==f&&void 0===f[d];)f=a[e++];if(void 0!==f){var g=f[d];if(void 0!==g)if(Array.isArray(g)){do g=f[d],void 0!==g&&(b.push(f.time),c.push.apply(c,g)),f=a[e++];while(void 0!==f)}else if(void 0!==g.toArray){do g=f[d],void 0!==g&&(b.push(f.time),g.toArray(c,c.length)),f=a[e++];while(void 0!==f)}else{do g=f[d],void 0!==g&&(b.push(f.time),c.push(g)),f=a[e++];
-while(void 0!==f)}}}};Object.assign(wa.prototype,{evaluate:function(a){var b=this.parameterPositions,c=this._cachedIndex,d=b[c],e=b[c-1];a:{b:{c:{d:if(!(a<d)){for(var f=c+2;;){if(void 0===d){if(a<e)break d;this._cachedIndex=c=b.length;return this.afterEnd_(c-1,a,e)}if(c===f)break;e=d;d=b[++c];if(a<d)break b}d=b.length;break c}if(a>=e)break a;else{f=b[1];a<f&&(c=2,e=f);for(f=c-2;;){if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(c===f)break;d=e;e=b[--c-1];if(a>=e)break b}d=c;c=
-0}}for(;c<d;)e=c+d>>>1,a<b[e]?d=e:c=e+1;d=b[c];e=b[c-1];if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(void 0===d)return this._cachedIndex=c=b.length,this.afterEnd_(c-1,e,a)}this._cachedIndex=c;this.intervalChanged_(c,e,d)}return this.interpolate_(c,e,a,d)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||this.DefaultSettings_},copySampleValue_:function(a){var b=this.resultBuffer,c=this.sampleValues,d=this.valueSize;a*=d;for(var e=0;e!==d;++e)b[e]=
-c[a+e];return b},interpolate_:function(a,b,c,d){throw Error("call to abstract method");},intervalChanged_:function(a,b,c){}});Object.assign(wa.prototype,{beforeStart_:wa.prototype.copySampleValue_,afterEnd_:wa.prototype.copySampleValue_});Ad.prototype=Object.assign(Object.create(wa.prototype),{constructor:Ad,DefaultSettings_:{endingStart:2400,endingEnd:2400},intervalChanged_:function(a,b,c){var d=this.parameterPositions,e=a-2,f=a+1,g=d[e],h=d[f];if(void 0===g)switch(this.getSettings_().endingStart){case 2401:e=
-a;g=2*b-c;break;case 2402:e=d.length-2;g=b+d[e]-d[e+1];break;default:e=a,g=c}if(void 0===h)switch(this.getSettings_().endingEnd){case 2401:f=a;h=2*c-b;break;case 2402:f=1;h=c+d[1]-d[0];break;default:f=a-1,h=b}a=.5*(c-b);d=this.valueSize;this._weightPrev=a/(b-g);this._weightNext=a/(h-c);this._offsetPrev=e*d;this._offsetNext=f*d},interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g,k=this._offsetPrev,m=this._offsetNext,l=this._weightPrev,n=this._weightNext,
-p=(c-b)/(d-b);c=p*p;d=c*p;b=-l*d+2*l*c-l*p;l=(1+l)*d+(-1.5-2*l)*c+(-.5+l)*p+1;p=(-1-n)*d+(1.5+n)*c+.5*p;n=n*d-n*c;for(c=0;c!==g;++c)e[c]=b*f[k+c]+l*f[h+c]+p*f[a+c]+n*f[m+c];return e}});Tc.prototype=Object.assign(Object.create(wa.prototype),{constructor:Tc,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g;b=(c-b)/(d-b);c=1-b;for(d=0;d!==g;++d)e[d]=f[h+d]*c+f[a+d]*b;return e}});Bd.prototype=Object.assign(Object.create(wa.prototype),{constructor:Bd,
-interpolate_:function(a,b,c,d){return this.copySampleValue_(a-1)}});var Wa;Wa={TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(a){return new Bd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodLinear:function(a){return new Tc(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:function(a){return new Ad(this.times,this.values,this.getValueSize(),a)},setInterpolation:function(a){var b;
-switch(a){case 2300:b=this.InterpolantFactoryMethodDiscrete;break;case 2301:b=this.InterpolantFactoryMethodLinear;break;case 2302:b=this.InterpolantFactoryMethodSmooth}if(void 0===b){b="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant)if(a!==this.DefaultInterpolation)this.setInterpolation(this.DefaultInterpolation);else throw Error(b);console.warn("THREE.KeyframeTrackPrototype:",b)}else this.createInterpolant=b},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return 2300;
-case this.InterpolantFactoryMethodLinear:return 2301;case this.InterpolantFactoryMethodSmooth:return 2302}},getValueSize:function(){return this.values.length/this.times.length},shift:function(a){if(0!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]+=a;return this},scale:function(a){if(1!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]*=a;return this},trim:function(a,b){for(var c=this.times,d=c.length,e=0,f=d-1;e!==d&&c[e]<a;)++e;for(;-1!==f&&c[f]>b;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,
-1),e=f-1),d=this.getValueSize(),this.times=ia.arraySlice(c,e,f),this.values=ia.arraySlice(this.values,e*d,f*d);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error("THREE.KeyframeTrackPrototype: Invalid value size in track.",this),a=!1);var c=this.times,b=this.values,d=c.length;0===d&&(console.error("THREE.KeyframeTrackPrototype: Track is empty.",this),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if("number"===typeof g&&isNaN(g)){console.error("THREE.KeyframeTrackPrototype: Time is not a valid number.",
-this,f,g);a=!1;break}if(null!==e&&e>g){console.error("THREE.KeyframeTrackPrototype: Out of order keys.",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&ia.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error("THREE.KeyframeTrackPrototype: Value is not a valid number.",this,f,d);a=!1;break}return a},optimize:function(){for(var a=this.times,b=this.values,c=this.getValueSize(),d=2302===this.getInterpolation(),e=1,f=a.length-1,g=1;g<f;++g){var h=!1,k=a[g];if(k!==a[g+1]&&(1!==g||k!==
-k[0]))if(d)h=!0;else for(var m=g*c,l=m-c,n=m+c,k=0;k!==c;++k){var p=b[m+k];if(p!==b[l+k]||p!==b[n+k]){h=!0;break}}if(h){if(g!==e)for(a[e]=a[g],h=g*c,m=e*c,k=0;k!==c;++k)b[m+k]=b[h+k];++e}}if(0<f){a[e]=a[f];h=f*c;m=e*c;for(k=0;k!==c;++k)b[m+k]=b[h+k];++e}e!==a.length&&(this.times=ia.arraySlice(a,0,e),this.values=ia.arraySlice(b,0,e*c));return this}};cc.prototype=Object.assign(Object.create(Wa),{constructor:cc,ValueTypeName:"vector"});Cd.prototype=Object.assign(Object.create(wa.prototype),{constructor:Cd,
-interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;b=(c-b)/(d-b);for(c=a+g;a!==c;a+=4)oa.slerpFlat(e,0,f,a-g,f,a,b);return e}});Uc.prototype=Object.assign(Object.create(Wa),{constructor:Uc,ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(a){return new Cd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:void 0});dc.prototype=Object.assign(Object.create(Wa),{constructor:dc,ValueTypeName:"number"});
-Dd.prototype=Object.assign(Object.create(Wa),{constructor:Dd,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});Ed.prototype=Object.assign(Object.create(Wa),{constructor:Ed,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});Fd.prototype=Object.assign(Object.create(Wa),{constructor:Fd,ValueTypeName:"color"});
-vb.prototype=Wa;Wa.constructor=vb;Object.assign(vb,{parse:function(a){if(void 0===a.type)throw Error("track type undefined, can not parse");var b=vb._getTrackTypeForValueTypeName(a.type);if(void 0===a.times){var c=[],d=[];ia.flattenJSON(a.keys,c,d,"value");a.times=c;a.values=d}return void 0!==b.parse?b.parse(a):new b(a.name,a.times,a.values,a.interpolation)},toJSON:function(a){var b=a.constructor;if(void 0!==b.toJSON)b=b.toJSON(a);else{var b={name:a.name,times:ia.convertArray(a.times,Array),values:ia.convertArray(a.values,
-Array)},c=a.getInterpolation();c!==a.DefaultInterpolation&&(b.interpolation=c)}b.type=a.ValueTypeName;return b},_getTrackTypeForValueTypeName:function(a){switch(a.toLowerCase()){case "scalar":case "double":case "float":case "number":case "integer":return dc;case "vector":case "vector2":case "vector3":case "vector4":return cc;case "color":return Fd;case "quaternion":return Uc;case "bool":case "boolean":return Ed;case "string":return Dd}throw Error("Unsupported typeName: "+a);}});Object.assign(Da,{parse:function(a){for(var b=
-[],c=a.tracks,d=1/(a.fps||1),e=0,f=c.length;e!==f;++e)b.push(vb.parse(c[e]).scale(d));return new Da(a.name,a.duration,b)},toJSON:function(a){var b=[],c=a.tracks;a={name:a.name,duration:a.duration,tracks:b};for(var d=0,e=c.length;d!==e;++d)b.push(vb.toJSON(c[d]));return a},CreateFromMorphTargetSequence:function(a,b,c,d){for(var e=b.length,f=[],g=0;g<e;g++){var h=[],k=[];h.push((g+e-1)%e,g,(g+1)%e);k.push(0,1,0);var m=ia.getKeyframeOrder(h),h=ia.sortedArray(h,1,m),k=ia.sortedArray(k,1,m);d||0!==h[0]||
-(h.push(e),k.push(k[0]));f.push((new dc(".morphTargetInfluences["+b[g].name+"]",h,k)).scale(1/c))}return new Da(a,-1,f)},findByName:function(a,b){var c=a;Array.isArray(a)||(c=a.geometry&&a.geometry.animations||a.animations);for(var d=0;d<c.length;d++)if(c[d].name===b)return c[d];return null},CreateClipsFromMorphTargetSequences:function(a,b,c){for(var d={},e=/^([\w-]*?)([\d]+)$/,f=0,g=a.length;f<g;f++){var h=a[f],k=h.name.match(e);if(k&&1<k.length){var m=k[1];(k=d[m])||(d[m]=k=[]);k.push(h)}}a=[];
-for(m in d)a.push(Da.CreateFromMorphTargetSequence(m,d[m],b,c));return a},parseAnimation:function(a,b){if(!a)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;for(var c=function(a,b,c,d,e){if(0!==c.length){var f=[],g=[];ia.flattenJSON(c,f,g,d);0!==f.length&&e.push(new a(b,f,g))}},d=[],e=a.name||"default",f=a.length||-1,g=a.fps||30,h=a.hierarchy||[],k=0;k<h.length;k++){var m=h[k].keys;if(m&&0!==m.length)if(m[0].morphTargets){for(var f={},l=0;l<m.length;l++)if(m[l].morphTargets)for(var n=
-0;n<m[l].morphTargets.length;n++)f[m[l].morphTargets[n]]=-1;for(var p in f){for(var r=[],z=[],n=0;n!==m[l].morphTargets.length;++n){var t=m[l];r.push(t.time);z.push(t.morphTarget===p?1:0)}d.push(new dc(".morphTargetInfluence["+p+"]",r,z))}f=f.length*(g||1)}else l=".bones["+b[k].name+"]",c(cc,l+".position",m,"pos",d),c(Uc,l+".quaternion",m,"rot",d),c(cc,l+".scale",m,"scl",d)}return 0===d.length?null:new Da(e,f,d)}});Object.assign(Da.prototype,{resetDuration:function(){for(var a=0,b=0,c=this.tracks.length;b!==
-c;++b)var d=this.tracks[b],a=Math.max(a,d.times[d.times.length-1]);this.duration=a},trim:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].trim(0,this.duration);return this},optimize:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].optimize();return this}});Object.assign(Gd.prototype,{load:function(a,b,c,d){var e=this;(new Ka(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},setTextures:function(a){this.textures=a},parse:function(a){function b(a){void 0===
-c[a]&&console.warn("THREE.MaterialLoader: Undefined texture",a);return c[a]}var c=this.textures,d=new mg[a.type];void 0!==a.uuid&&(d.uuid=a.uuid);void 0!==a.name&&(d.name=a.name);void 0!==a.color&&d.color.setHex(a.color);void 0!==a.roughness&&(d.roughness=a.roughness);void 0!==a.metalness&&(d.metalness=a.metalness);void 0!==a.emissive&&d.emissive.setHex(a.emissive);void 0!==a.specular&&d.specular.setHex(a.specular);void 0!==a.shininess&&(d.shininess=a.shininess);void 0!==a.clearCoat&&(d.clearCoat=
-a.clearCoat);void 0!==a.clearCoatRoughness&&(d.clearCoatRoughness=a.clearCoatRoughness);void 0!==a.uniforms&&(d.uniforms=a.uniforms);void 0!==a.vertexShader&&(d.vertexShader=a.vertexShader);void 0!==a.fragmentShader&&(d.fragmentShader=a.fragmentShader);void 0!==a.vertexColors&&(d.vertexColors=a.vertexColors);void 0!==a.fog&&(d.fog=a.fog);void 0!==a.shading&&(d.shading=a.shading);void 0!==a.blending&&(d.blending=a.blending);void 0!==a.side&&(d.side=a.side);void 0!==a.opacity&&(d.opacity=a.opacity);
-void 0!==a.transparent&&(d.transparent=a.transparent);void 0!==a.alphaTest&&(d.alphaTest=a.alphaTest);void 0!==a.depthTest&&(d.depthTest=a.depthTest);void 0!==a.depthWrite&&(d.depthWrite=a.depthWrite);void 0!==a.colorWrite&&(d.colorWrite=a.colorWrite);void 0!==a.wireframe&&(d.wireframe=a.wireframe);void 0!==a.wireframeLinewidth&&(d.wireframeLinewidth=a.wireframeLinewidth);void 0!==a.wireframeLinecap&&(d.wireframeLinecap=a.wireframeLinecap);void 0!==a.wireframeLinejoin&&(d.wireframeLinejoin=a.wireframeLinejoin);
-void 0!==a.skinning&&(d.skinning=a.skinning);void 0!==a.morphTargets&&(d.morphTargets=a.morphTargets);void 0!==a.size&&(d.size=a.size);void 0!==a.sizeAttenuation&&(d.sizeAttenuation=a.sizeAttenuation);void 0!==a.map&&(d.map=b(a.map));void 0!==a.alphaMap&&(d.alphaMap=b(a.alphaMap),d.transparent=!0);void 0!==a.bumpMap&&(d.bumpMap=b(a.bumpMap));void 0!==a.bumpScale&&(d.bumpScale=a.bumpScale);void 0!==a.normalMap&&(d.normalMap=b(a.normalMap));if(void 0!==a.normalScale){var e=a.normalScale;!1===Array.isArray(e)&&
-(e=[e,e]);d.normalScale=(new C).fromArray(e)}void 0!==a.displacementMap&&(d.displacementMap=b(a.displacementMap));void 0!==a.displacementScale&&(d.displacementScale=a.displacementScale);void 0!==a.displacementBias&&(d.displacementBias=a.displacementBias);void 0!==a.roughnessMap&&(d.roughnessMap=b(a.roughnessMap));void 0!==a.metalnessMap&&(d.metalnessMap=b(a.metalnessMap));void 0!==a.emissiveMap&&(d.emissiveMap=b(a.emissiveMap));void 0!==a.emissiveIntensity&&(d.emissiveIntensity=a.emissiveIntensity);
-void 0!==a.specularMap&&(d.specularMap=b(a.specularMap));void 0!==a.envMap&&(d.envMap=b(a.envMap));void 0!==a.reflectivity&&(d.reflectivity=a.reflectivity);void 0!==a.lightMap&&(d.lightMap=b(a.lightMap));void 0!==a.lightMapIntensity&&(d.lightMapIntensity=a.lightMapIntensity);void 0!==a.aoMap&&(d.aoMap=b(a.aoMap));void 0!==a.aoMapIntensity&&(d.aoMapIntensity=a.aoMapIntensity);void 0!==a.gradientMap&&(d.gradientMap=b(a.gradientMap));return d}});Object.assign(be.prototype,{load:function(a,b,c,d){var e=
-this;(new Ka(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},parse:function(a){var b=new E,c=a.data.index;void 0!==c&&(c=new ef[c.type](c.array),b.setIndex(new Z(c,1)));var d=a.data.attributes,e;for(e in d){var f=d[e],c=new ef[f.type](f.array);b.addAttribute(e,new Z(c,f.itemSize,f.normalized))}e=a.data.groups||a.data.drawcalls||a.data.offsets;if(void 0!==e)for(c=0,d=e.length;c!==d;++c)f=e[c],b.addGroup(f.start,f.count,f.materialIndex);a=a.data.boundingSphere;void 0!==a&&(e=new n,void 0!==
-a.center&&e.fromArray(a.center),b.boundingSphere=new Ea(e,a.radius));return b}});var ef={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:"undefined"!==typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};ec.Handlers={handlers:[],add:function(a,b){this.handlers.push(a,b)},get:function(a){for(var b=this.handlers,c=0,d=b.length;c<d;c+=2){var e=
-b[c+1];if(b[c].test(a))return e}return null}};Object.assign(ec.prototype,{crossOrigin:void 0,extractUrlBase:function(a){a=a.split("/");if(1===a.length)return"./";a.pop();return a.join("/")+"/"},initMaterials:function(a,b,c){for(var d=[],e=0;e<a.length;++e)d[e]=this.createMaterial(a[e],b,c);return d},createMaterial:function(){var a={NoBlending:0,NormalBlending:1,AdditiveBlending:2,SubtractiveBlending:3,MultiplyBlending:4,CustomBlending:5},b=new G,c=new rd,d=new Gd;return function(e,f,g){function h(a,
-b,d,e,h){a=f+a;var m=ec.Handlers.get(a);null!==m?a=m.load(a):(c.setCrossOrigin(g),a=c.load(a));void 0!==b&&(a.repeat.fromArray(b),1!==b[0]&&(a.wrapS=1E3),1!==b[1]&&(a.wrapT=1E3));void 0!==d&&a.offset.fromArray(d);void 0!==e&&("repeat"===e[0]&&(a.wrapS=1E3),"mirror"===e[0]&&(a.wrapS=1002),"repeat"===e[1]&&(a.wrapT=1E3),"mirror"===e[1]&&(a.wrapT=1002));void 0!==h&&(a.anisotropy=h);b=Y.generateUUID();k[b]=a;return b}var k={},m={uuid:Y.generateUUID(),type:"MeshLambertMaterial"},l;for(l in e){var n=e[l];
-switch(l){case "DbgColor":case "DbgIndex":case "opticalDensity":case "illumination":break;case "DbgName":m.name=n;break;case "blending":m.blending=a[n];break;case "colorAmbient":case "mapAmbient":console.warn("THREE.Loader.createMaterial:",l,"is no longer supported.");break;case "colorDiffuse":m.color=b.fromArray(n).getHex();break;case "colorSpecular":m.specular=b.fromArray(n).getHex();break;case "colorEmissive":m.emissive=b.fromArray(n).getHex();break;case "specularCoef":m.shininess=n;break;case "shading":"basic"===
-n.toLowerCase()&&(m.type="MeshBasicMaterial");"phong"===n.toLowerCase()&&(m.type="MeshPhongMaterial");"standard"===n.toLowerCase()&&(m.type="MeshStandardMaterial");break;case "mapDiffuse":m.map=h(n,e.mapDiffuseRepeat,e.mapDiffuseOffset,e.mapDiffuseWrap,e.mapDiffuseAnisotropy);break;case "mapDiffuseRepeat":case "mapDiffuseOffset":case "mapDiffuseWrap":case "mapDiffuseAnisotropy":break;case "mapEmissive":m.emissiveMap=h(n,e.mapEmissiveRepeat,e.mapEmissiveOffset,e.mapEmissiveWrap,e.mapEmissiveAnisotropy);
-break;case "mapEmissiveRepeat":case "mapEmissiveOffset":case "mapEmissiveWrap":case "mapEmissiveAnisotropy":break;case "mapLight":m.lightMap=h(n,e.mapLightRepeat,e.mapLightOffset,e.mapLightWrap,e.mapLightAnisotropy);break;case "mapLightRepeat":case "mapLightOffset":case "mapLightWrap":case "mapLightAnisotropy":break;case "mapAO":m.aoMap=h(n,e.mapAORepeat,e.mapAOOffset,e.mapAOWrap,e.mapAOAnisotropy);break;case "mapAORepeat":case "mapAOOffset":case "mapAOWrap":case "mapAOAnisotropy":break;case "mapBump":m.bumpMap=
-h(n,e.mapBumpRepeat,e.mapBumpOffset,e.mapBumpWrap,e.mapBumpAnisotropy);break;case "mapBumpScale":m.bumpScale=n;break;case "mapBumpRepeat":case "mapBumpOffset":case "mapBumpWrap":case "mapBumpAnisotropy":break;case "mapNormal":m.normalMap=h(n,e.mapNormalRepeat,e.mapNormalOffset,e.mapNormalWrap,e.mapNormalAnisotropy);break;case "mapNormalFactor":m.normalScale=[n,n];break;case "mapNormalRepeat":case "mapNormalOffset":case "mapNormalWrap":case "mapNormalAnisotropy":break;case "mapSpecular":m.specularMap=
-h(n,e.mapSpecularRepeat,e.mapSpecularOffset,e.mapSpecularWrap,e.mapSpecularAnisotropy);break;case "mapSpecularRepeat":case "mapSpecularOffset":case "mapSpecularWrap":case "mapSpecularAnisotropy":break;case "mapMetalness":m.metalnessMap=h(n,e.mapMetalnessRepeat,e.mapMetalnessOffset,e.mapMetalnessWrap,e.mapMetalnessAnisotropy);break;case "mapMetalnessRepeat":case "mapMetalnessOffset":case "mapMetalnessWrap":case "mapMetalnessAnisotropy":break;case "mapRoughness":m.roughnessMap=h(n,e.mapRoughnessRepeat,
-e.mapRoughnessOffset,e.mapRoughnessWrap,e.mapRoughnessAnisotropy);break;case "mapRoughnessRepeat":case "mapRoughnessOffset":case "mapRoughnessWrap":case "mapRoughnessAnisotropy":break;case "mapAlpha":m.alphaMap=h(n,e.mapAlphaRepeat,e.mapAlphaOffset,e.mapAlphaWrap,e.mapAlphaAnisotropy);break;case "mapAlphaRepeat":case "mapAlphaOffset":case "mapAlphaWrap":case "mapAlphaAnisotropy":break;case "flipSided":m.side=1;break;case "doubleSided":m.side=2;break;case "transparency":console.warn("THREE.Loader.createMaterial: transparency has been renamed to opacity");
-m.opacity=n;break;case "depthTest":case "depthWrite":case "colorWrite":case "opacity":case "reflectivity":case "transparent":case "visible":case "wireframe":m[l]=n;break;case "vertexColors":!0===n&&(m.vertexColors=2);"face"===n&&(m.vertexColors=1);break;default:console.error("THREE.Loader.createMaterial: Unsupported",l,n)}}"MeshBasicMaterial"===m.type&&delete m.emissive;"MeshPhongMaterial"!==m.type&&delete m.specular;1>m.opacity&&(m.transparent=!0);d.setTextures(k);return d.parse(m)}}()});Object.assign(ce.prototype,
-{load:function(a,b,c,d){var e=this,f=this.texturePath&&"string"===typeof this.texturePath?this.texturePath:ec.prototype.extractUrlBase(a),g=new Ka(this.manager);g.setWithCredentials(this.withCredentials);g.load(a,function(c){c=JSON.parse(c);var d=c.metadata;if(void 0!==d&&(d=d.type,void 0!==d)){if("object"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.ObjectLoader instead.");return}if("scene"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.SceneLoader instead.");
-return}}c=e.parse(c,f);b(c.geometry,c.materials)},c,d)},setTexturePath:function(a){this.texturePath=a},parse:function(){return function(a,b){void 0!==a.data&&(a=a.data);a.scale=void 0!==a.scale?1/a.scale:1;var c=new J,d=a,e,f,g,h,k,m,l,v,p,r,z,t,y,x,u=d.faces;p=d.vertices;var B=d.normals,w=d.colors;m=d.scale;var I=0;if(void 0!==d.uvs){for(e=0;e<d.uvs.length;e++)d.uvs[e].length&&I++;for(e=0;e<I;e++)c.faceVertexUvs[e]=[]}h=0;for(k=p.length;h<k;)e=new n,e.x=p[h++]*m,e.y=p[h++]*m,e.z=p[h++]*m,c.vertices.push(e);
-h=0;for(k=u.length;h<k;)if(p=u[h++],r=p&1,g=p&2,e=p&8,l=p&16,z=p&32,m=p&64,p&=128,r){r=new Sa;r.a=u[h];r.b=u[h+1];r.c=u[h+3];t=new Sa;t.a=u[h+1];t.b=u[h+2];t.c=u[h+3];h+=4;g&&(g=u[h++],r.materialIndex=g,t.materialIndex=g);g=c.faces.length;if(e)for(e=0;e<I;e++)for(y=d.uvs[e],c.faceVertexUvs[e][g]=[],c.faceVertexUvs[e][g+1]=[],f=0;4>f;f++)v=u[h++],x=y[2*v],v=y[2*v+1],x=new C(x,v),2!==f&&c.faceVertexUvs[e][g].push(x),0!==f&&c.faceVertexUvs[e][g+1].push(x);l&&(l=3*u[h++],r.normal.set(B[l++],B[l++],B[l]),
-t.normal.copy(r.normal));if(z)for(e=0;4>e;e++)l=3*u[h++],z=new n(B[l++],B[l++],B[l]),2!==e&&r.vertexNormals.push(z),0!==e&&t.vertexNormals.push(z);m&&(m=u[h++],m=w[m],r.color.setHex(m),t.color.setHex(m));if(p)for(e=0;4>e;e++)m=u[h++],m=w[m],2!==e&&r.vertexColors.push(new G(m)),0!==e&&t.vertexColors.push(new G(m));c.faces.push(r);c.faces.push(t)}else{r=new Sa;r.a=u[h++];r.b=u[h++];r.c=u[h++];g&&(g=u[h++],r.materialIndex=g);g=c.faces.length;if(e)for(e=0;e<I;e++)for(y=d.uvs[e],c.faceVertexUvs[e][g]=
-[],f=0;3>f;f++)v=u[h++],x=y[2*v],v=y[2*v+1],x=new C(x,v),c.faceVertexUvs[e][g].push(x);l&&(l=3*u[h++],r.normal.set(B[l++],B[l++],B[l]));if(z)for(e=0;3>e;e++)l=3*u[h++],z=new n(B[l++],B[l++],B[l]),r.vertexNormals.push(z);m&&(m=u[h++],r.color.setHex(w[m]));if(p)for(e=0;3>e;e++)m=u[h++],r.vertexColors.push(new G(w[m]));c.faces.push(r)}d=a;h=void 0!==d.influencesPerVertex?d.influencesPerVertex:2;if(d.skinWeights)for(k=0,u=d.skinWeights.length;k<u;k+=h)c.skinWeights.push(new fa(d.skinWeights[k],1<h?d.skinWeights[k+
-1]:0,2<h?d.skinWeights[k+2]:0,3<h?d.skinWeights[k+3]:0));if(d.skinIndices)for(k=0,u=d.skinIndices.length;k<u;k+=h)c.skinIndices.push(new fa(d.skinIndices[k],1<h?d.skinIndices[k+1]:0,2<h?d.skinIndices[k+2]:0,3<h?d.skinIndices[k+3]:0));c.bones=d.bones;c.bones&&0<c.bones.length&&(c.skinWeights.length!==c.skinIndices.length||c.skinIndices.length!==c.vertices.length)&&console.warn("When skinning, number of vertices ("+c.vertices.length+"), skinIndices ("+c.skinIndices.length+"), and skinWeights ("+c.skinWeights.length+
-") should match.");k=a;u=k.scale;if(void 0!==k.morphTargets)for(d=0,h=k.morphTargets.length;d<h;d++)for(c.morphTargets[d]={},c.morphTargets[d].name=k.morphTargets[d].name,c.morphTargets[d].vertices=[],B=c.morphTargets[d].vertices,w=k.morphTargets[d].vertices,I=0,p=w.length;I<p;I+=3)m=new n,m.x=w[I]*u,m.y=w[I+1]*u,m.z=w[I+2]*u,B.push(m);if(void 0!==k.morphColors&&0<k.morphColors.length)for(console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.'),u=c.faces,k=k.morphColors[0].colors,
-d=0,h=u.length;d<h;d++)u[d].color.fromArray(k,3*d);k=a;d=[];h=[];void 0!==k.animation&&h.push(k.animation);void 0!==k.animations&&(k.animations.length?h=h.concat(k.animations):h.push(k.animations));for(k=0;k<h.length;k++)(u=Da.parseAnimation(h[k],c.bones))&&d.push(u);c.morphTargets&&(h=Da.CreateClipsFromMorphTargetSequences(c.morphTargets,10),d=d.concat(h));0<d.length&&(c.animations=d);c.computeFaceNormals();c.computeBoundingSphere();if(void 0===a.materials||0===a.materials.length)return{geometry:c};
-d=ec.prototype.initMaterials(a.materials,b,this.crossOrigin);return{geometry:c,materials:d}}}()});Object.assign(Pe.prototype,{load:function(a,b,c,d){""===this.texturePath&&(this.texturePath=a.substring(0,a.lastIndexOf("/")+1));var e=this;(new Ka(e.manager)).load(a,function(c){var g=null;try{g=JSON.parse(c)}catch(h){void 0!==d&&d(h);console.error("THREE:ObjectLoader: Can't parse "+a+".",h.message);return}c=g.metadata;void 0===c||void 0===c.type||"geometry"===c.type.toLowerCase()?console.error("THREE.ObjectLoader: Can't load "+
-a+". Use THREE.JSONLoader instead."):e.parse(g,b)},c,d)},setTexturePath:function(a){this.texturePath=a},setCrossOrigin:function(a){this.crossOrigin=a},parse:function(a,b){var c=this.parseGeometries(a.geometries),d=this.parseImages(a.images,function(){void 0!==b&&b(e)}),d=this.parseTextures(a.textures,d),d=this.parseMaterials(a.materials,d),e=this.parseObject(a.object,c,d);a.animations&&(e.animations=this.parseAnimations(a.animations));void 0!==a.images&&0!==a.images.length||void 0===b||b(e);return e},
-parseGeometries:function(a){var b={};if(void 0!==a)for(var c=new ce,d=new be,e=0,f=a.length;e<f;e++){var g,h=a[e];switch(h.type){case "PlaneGeometry":case "PlaneBufferGeometry":g=new Ma[h.type](h.width,h.height,h.widthSegments,h.heightSegments);break;case "BoxGeometry":case "BoxBufferGeometry":case "CubeGeometry":g=new Ma[h.type](h.width,h.height,h.depth,h.widthSegments,h.heightSegments,h.depthSegments);break;case "CircleGeometry":case "CircleBufferGeometry":g=new Ma[h.type](h.radius,h.segments,h.thetaStart,
-h.thetaLength);break;case "CylinderGeometry":case "CylinderBufferGeometry":g=new Ma[h.type](h.radiusTop,h.radiusBottom,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength);break;case "ConeGeometry":case "ConeBufferGeometry":g=new Ma[h.type](h.radius,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength);break;case "SphereGeometry":case "SphereBufferGeometry":g=new Ma[h.type](h.radius,h.widthSegments,h.heightSegments,h.phiStart,h.phiLength,
-h.thetaStart,h.thetaLength);break;case "DodecahedronGeometry":case "IcosahedronGeometry":case "OctahedronGeometry":case "TetrahedronGeometry":g=new Ma[h.type](h.radius,h.detail);break;case "RingGeometry":case "RingBufferGeometry":g=new Ma[h.type](h.innerRadius,h.outerRadius,h.thetaSegments,h.phiSegments,h.thetaStart,h.thetaLength);break;case "TorusGeometry":case "TorusBufferGeometry":g=new Ma[h.type](h.radius,h.tube,h.radialSegments,h.tubularSegments,h.arc);break;case "TorusKnotGeometry":case "TorusKnotBufferGeometry":g=
-new Ma[h.type](h.radius,h.tube,h.tubularSegments,h.radialSegments,h.p,h.q);break;case "LatheGeometry":case "LatheBufferGeometry":g=new Ma[h.type](h.points,h.segments,h.phiStart,h.phiLength);break;case "BufferGeometry":g=d.parse(h);break;case "Geometry":g=c.parse(h,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+h.type+'"');continue}g.uuid=h.uuid;void 0!==h.name&&(g.name=h.name);b[h.uuid]=g}return b},parseMaterials:function(a,b){var c={};if(void 0!==
-a){var d=new Gd;d.setTextures(b);for(var e=0,f=a.length;e<f;e++){var g=a[e];if("MultiMaterial"===g.type){for(var h=[],k=0;k<g.materials.length;k++)h.push(d.parse(g.materials[k]));c[g.uuid]=h}else c[g.uuid]=d.parse(g)}}return c},parseAnimations:function(a){for(var b=[],c=0;c<a.length;c++){var d=Da.parse(a[c]);b.push(d)}return b},parseImages:function(a,b){function c(a){d.manager.itemStart(a);return g.load(a,function(){d.manager.itemEnd(a)},void 0,function(){d.manager.itemEnd(a);d.manager.itemError(a)})}
-var d=this,e={};if(void 0!==a&&0<a.length){var f=new Zd(b),g=new Sc(f);g.setCrossOrigin(this.crossOrigin);for(var f=0,h=a.length;f<h;f++){var k=a[f],m=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(k.url)?k.url:d.texturePath+k.url;e[k.uuid]=c(m)}}return e},parseTextures:function(a,b){function c(a,b){if("number"===typeof a)return a;console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",a);return b[a]}var d={};if(void 0!==a)for(var e=0,f=a.length;e<f;e++){var g=a[e];void 0===g.image&&
-console.warn('THREE.ObjectLoader: No "image" specified for',g.uuid);void 0===b[g.image]&&console.warn("THREE.ObjectLoader: Undefined image",g.image);var h=new ba(b[g.image]);h.needsUpdate=!0;h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);void 0!==g.mapping&&(h.mapping=c(g.mapping,ng));void 0!==g.offset&&h.offset.fromArray(g.offset);void 0!==g.repeat&&h.repeat.fromArray(g.repeat);void 0!==g.wrap&&(h.wrapS=c(g.wrap[0],ff),h.wrapT=c(g.wrap[1],ff));void 0!==g.minFilter&&(h.minFilter=c(g.minFilter,gf));
-void 0!==g.magFilter&&(h.magFilter=c(g.magFilter,gf));void 0!==g.anisotropy&&(h.anisotropy=g.anisotropy);void 0!==g.flipY&&(h.flipY=g.flipY);d[g.uuid]=h}return d},parseObject:function(){var a=new K;return function(b,c,d){function e(a){void 0===c[a]&&console.warn("THREE.ObjectLoader: Undefined geometry",a);return c[a]}function f(a){if(void 0!==a){if(Array.isArray(a)){for(var b=[],c=0,e=a.length;c<e;c++){var f=a[c];void 0===d[f]&&console.warn("THREE.ObjectLoader: Undefined material",f);b.push(d[f])}return b}void 0===
-d[a]&&console.warn("THREE.ObjectLoader: Undefined material",a);return d[a]}}var g;switch(b.type){case "Scene":g=new ld;void 0!==b.background&&Number.isInteger(b.background)&&(g.background=new G(b.background));void 0!==b.fog&&("Fog"===b.fog.type?g.fog=new Jb(b.fog.color,b.fog.near,b.fog.far):"FogExp2"===b.fog.type&&(g.fog=new Ib(b.fog.color,b.fog.density)));break;case "PerspectiveCamera":g=new qa(b.fov,b.aspect,b.near,b.far);void 0!==b.focus&&(g.focus=b.focus);void 0!==b.zoom&&(g.zoom=b.zoom);void 0!==
-b.filmGauge&&(g.filmGauge=b.filmGauge);void 0!==b.filmOffset&&(g.filmOffset=b.filmOffset);void 0!==b.view&&(g.view=Object.assign({},b.view));break;case "OrthographicCamera":g=new Fb(b.left,b.right,b.top,b.bottom,b.near,b.far);break;case "AmbientLight":g=new yd(b.color,b.intensity);break;case "DirectionalLight":g=new xd(b.color,b.intensity);break;case "PointLight":g=new vd(b.color,b.intensity,b.distance,b.decay);break;case "RectAreaLight":g=new zd(b.color,b.intensity,b.width,b.height);break;case "SpotLight":g=
-new ud(b.color,b.intensity,b.distance,b.angle,b.penumbra,b.decay);break;case "HemisphereLight":g=new sd(b.color,b.groundColor,b.intensity);break;case "SkinnedMesh":console.warn("THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.");case "Mesh":g=e(b.geometry);var h=f(b.material);g=g.bones&&0<g.bones.length?new nd(g,h):new la(g,h);break;case "LOD":g=new yc;break;case "Line":g=new sa(e(b.geometry),f(b.material),b.mode);break;case "LineLoop":g=new od(e(b.geometry),f(b.material));break;
-case "LineSegments":g=new Q(e(b.geometry),f(b.material));break;case "PointCloud":case "Points":g=new Kb(e(b.geometry),f(b.material));break;case "Sprite":g=new xc(f(b.material));break;case "Group":g=new Ac;break;default:g=new z}g.uuid=b.uuid;void 0!==b.name&&(g.name=b.name);void 0!==b.matrix?(a.fromArray(b.matrix),a.decompose(g.position,g.quaternion,g.scale)):(void 0!==b.position&&g.position.fromArray(b.position),void 0!==b.rotation&&g.rotation.fromArray(b.rotation),void 0!==b.quaternion&&g.quaternion.fromArray(b.quaternion),
-void 0!==b.scale&&g.scale.fromArray(b.scale));void 0!==b.castShadow&&(g.castShadow=b.castShadow);void 0!==b.receiveShadow&&(g.receiveShadow=b.receiveShadow);b.shadow&&(void 0!==b.shadow.bias&&(g.shadow.bias=b.shadow.bias),void 0!==b.shadow.radius&&(g.shadow.radius=b.shadow.radius),void 0!==b.shadow.mapSize&&g.shadow.mapSize.fromArray(b.shadow.mapSize),void 0!==b.shadow.camera&&(g.shadow.camera=this.parseObject(b.shadow.camera)));void 0!==b.visible&&(g.visible=b.visible);void 0!==b.userData&&(g.userData=
-b.userData);if(void 0!==b.children)for(var k in b.children)g.add(this.parseObject(b.children[k],c,d));if("LOD"===b.type)for(b=b.levels,h=0;h<b.length;h++){var m=b[h];k=g.getObjectByProperty("uuid",m.object);void 0!==k&&g.addLevel(k,m.distance)}return g}}()});var ng={UVMapping:300,CubeReflectionMapping:301,CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},ff={RepeatWrapping:1E3,
-ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},gf={NearestFilter:1003,NearestMipMapNearestFilter:1004,NearestMipMapLinearFilter:1005,LinearFilter:1006,LinearMipMapNearestFilter:1007,LinearMipMapLinearFilter:1008};Object.assign(ua.prototype,{getPoint:function(){console.warn("THREE.Curve: .getPoint() not implemented.");return null},getPointAt:function(a){a=this.getUtoTmapping(a);return this.getPoint(a)},getPoints:function(a){void 0===a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/
-a));return b},getSpacedPoints:function(a){void 0===a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPointAt(c/a));return b},getLength:function(){var a=this.getLengths();return a[a.length-1]},getLengths:function(a){void 0===a&&(a=this.arcLengthDivisions);if(this.cacheArcLengths&&this.cacheArcLengths.length===a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;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+=c.distanceTo(d),b.push(f),d=c;return this.cacheArcLengths=
-b},updateArcLengths:function(){this.needsUpdate=!0;this.getLengths()},getUtoTmapping:function(a,b){var c=this.getLengths(),d,e=c.length,f;f=b?b:a*c[e-1];for(var g=0,h=e-1,k;g<=h;)if(d=Math.floor(g+(h-g)/2),k=c[d]-f,0>k)g=d+1;else if(0<k)h=d-1;else{h=d;break}d=h;if(c[d]===f)return d/(e-1);g=c[d];return(d+(f-g)/(c[d+1]-g))/(e-1)},getTangent:function(a){var b=a-1E-4;a+=1E-4;0>b&&(b=0);1<a&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().sub(b).normalize()},getTangentAt:function(a){a=this.getUtoTmapping(a);
-return this.getTangent(a)},computeFrenetFrames:function(a,b){var c=new n,d=[],e=[],f=[],g=new n,h=new K,k,m;for(k=0;k<=a;k++)m=k/a,d[k]=this.getTangentAt(m),d[k].normalize();e[0]=new n;f[0]=new n;k=Number.MAX_VALUE;m=Math.abs(d[0].x);var l=Math.abs(d[0].y),v=Math.abs(d[0].z);m<=k&&(k=m,c.set(1,0,0));l<=k&&(k=l,c.set(0,1,0));v<=k&&c.set(0,0,1);g.crossVectors(d[0],c).normalize();e[0].crossVectors(d[0],g);f[0].crossVectors(d[0],e[0]);for(k=1;k<=a;k++)e[k]=e[k-1].clone(),f[k]=f[k-1].clone(),g.crossVectors(d[k-
-1],d[k]),g.length()>Number.EPSILON&&(g.normalize(),c=Math.acos(Y.clamp(d[k-1].dot(d[k]),-1,1)),e[k].applyMatrix4(h.makeRotationAxis(g,c))),f[k].crossVectors(d[k],e[k]);if(!0===b)for(c=Math.acos(Y.clamp(e[0].dot(e[a]),-1,1)),c/=a,0<d[0].dot(g.crossVectors(e[0],e[a]))&&(c=-c),k=1;k<=a;k++)e[k].applyMatrix4(h.makeRotationAxis(d[k],c*k)),f[k].crossVectors(d[k],e[k]);return{tangents:d,normals:e,binormals:f}}});Qa.prototype=Object.create(ua.prototype);Qa.prototype.constructor=Qa;Qa.prototype.isLineCurve=
-!0;Qa.prototype.getPoint=function(a){if(1===a)return this.v2.clone();var b=this.v2.clone().sub(this.v1);b.multiplyScalar(a).add(this.v1);return b};Qa.prototype.getPointAt=function(a){return this.getPoint(a)};Qa.prototype.getTangent=function(a){return this.v2.clone().sub(this.v1).normalize()};Vc.prototype=Object.assign(Object.create(ua.prototype),{constructor:Vc,add:function(a){this.curves.push(a)},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 Qa(b,a))},getPoint:function(a){var b=a*this.getLength(),c=this.getCurveLengths();for(a=0;a<c.length;){if(c[a]>=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();return a[a.length-1]},updateArcLengths:function(){this.needsUpdate=!0;this.cacheLengths=null;this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;
-for(var a=[],b=0,c=0,d=this.curves.length;c<d;c++)b+=this.curves[c].getLength(),a.push(b);return this.cacheLengths=a},getSpacedPoints:function(a){void 0===a&&(a=40);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));this.autoClose&&b.push(b[0]);return b},getPoints:function(a){a=a||12;for(var b=[],c,d=0,e=this.curves;d<e.length;d++)for(var f=e[d],f=f.getPoints(f&&f.isEllipseCurve?2*a:f&&f.isLineCurve?1:f&&f.isSplineCurve?a*f.points.length:a),g=0;g<f.length;g++){var h=f[g];c&&c.equals(h)||(b.push(h),
-c=h)}this.autoClose&&1<b.length&&!b[b.length-1].equals(b[0])&&b.push(b[0]);return b},createPointsGeometry:function(a){a=this.getPoints(a);return this.createGeometry(a)},createSpacedPointsGeometry:function(a){a=this.getSpacedPoints(a);return this.createGeometry(a)},createGeometry:function(a){for(var b=new J,c=0,d=a.length;c<d;c++){var e=a[c];b.vertices.push(new n(e.x,e.y,e.z||0))}return b}});Va.prototype=Object.create(ua.prototype);Va.prototype.constructor=Va;Va.prototype.isEllipseCurve=!0;Va.prototype.getPoint=
-function(a){for(var b=2*Math.PI,c=this.aEndAngle-this.aStartAngle,d=Math.abs(c)<Number.EPSILON;0>c;)c+=b;for(;c>b;)c-=b;c<Number.EPSILON&&(c=d?0:b);!0!==this.aClockwise||d||(c=c===b?-b:c-b);b=this.aStartAngle+a*c;a=this.aX+this.xRadius*Math.cos(b);var e=this.aY+this.yRadius*Math.sin(b);0!==this.aRotation&&(b=Math.cos(this.aRotation),c=Math.sin(this.aRotation),d=a-this.aX,e-=this.aY,a=d*b-e*c+this.aX,e=d*c+e*b+this.aY);return new C(a,e)};yb.prototype=Object.create(ua.prototype);yb.prototype.constructor=
-yb;yb.prototype.isSplineCurve=!0;yb.prototype.getPoint=function(a){var b=this.points,c=(b.length-1)*a;a=Math.floor(c);var c=c-a,d=b[0===a?a:a-1],e=b[a],f=b[a>b.length-2?b.length-1:a+1],b=b[a>b.length-3?b.length-1:a+2];return new C(Qe(c,d.x,e.x,f.x,b.x),Qe(c,d.y,e.y,f.y,b.y))};fc.prototype=Object.create(ua.prototype);fc.prototype.constructor=fc;fc.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2,e=this.v3;return new C(xb(a,b.x,c.x,d.x,e.x),xb(a,b.y,c.y,d.y,e.y))};gc.prototype=Object.create(ua.prototype);
-gc.prototype.constructor=gc;gc.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2;return new C(wb(a,b.x,c.x,d.x),wb(a,b.y,c.y,d.y))};var te=Object.assign(Object.create(Vc.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)},moveTo:function(a,b){this.currentPoint.set(a,b)},lineTo:function(a,b){var c=new Qa(this.currentPoint.clone(),new C(a,b));this.curves.push(c);this.currentPoint.set(a,b)},quadraticCurveTo:function(a,
-b,c,d){a=new gc(this.currentPoint.clone(),new C(a,b),new C(c,d));this.curves.push(a);this.currentPoint.set(c,d)},bezierCurveTo:function(a,b,c,d,e,f){a=new fc(this.currentPoint.clone(),new C(a,b),new C(c,d),new C(e,f));this.curves.push(a);this.currentPoint.set(e,f)},splineThru:function(a){var b=[this.currentPoint.clone()].concat(a),b=new yb(b);this.curves.push(b);this.currentPoint.copy(a[a.length-1])},arc:function(a,b,c,d,e,f){this.absarc(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f)},absarc:function(a,
-b,c,d,e,f){this.absellipse(a,b,c,c,d,e,f)},ellipse:function(a,b,c,d,e,f,g,h){this.absellipse(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f,g,h)},absellipse:function(a,b,c,d,e,f,g,h){a=new Va(a,b,c,d,e,f,g,h);0<this.curves.length&&(b=a.getPoint(0),b.equals(this.currentPoint)||this.lineTo(b.x,b.y));this.curves.push(a);a=a.getPoint(1);this.currentPoint.copy(a)}});Wc.prototype=te;te.constructor=Wc;zb.prototype=Object.assign(Object.create(te),{constructor:zb,getPointsHoles:function(a){for(var b=
-[],c=0,d=this.holes.length;c<d;c++)b[c]=this.holes[c].getPoints(a);return b},extractAllPoints:function(a){return{shape:this.getPoints(a),holes:this.getPointsHoles(a)}},extractPoints:function(a){return this.extractAllPoints(a)}});Object.assign(de.prototype,{moveTo:function(a,b){this.currentPath=new Wc;this.subPaths.push(this.currentPath);this.currentPath.moveTo(a,b)},lineTo:function(a,b){this.currentPath.lineTo(a,b)},quadraticCurveTo:function(a,b,c,d){this.currentPath.quadraticCurveTo(a,b,c,d)},bezierCurveTo:function(a,
-b,c,d,e,f){this.currentPath.bezierCurveTo(a,b,c,d,e,f)},splineThru:function(a){this.currentPath.splineThru(a)},toShapes:function(a,b){function c(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c],f=new zb;f.curves=e.curves;b.push(f)}return b}function d(a,b){for(var c=b.length,d=!1,e=c-1,f=0;f<c;e=f++){var g=b[e],h=b[f],k=h.x-g.x,m=h.y-g.y;if(Math.abs(m)>Number.EPSILON){if(0>m&&(g=b[f],k=-k,h=b[e],m=-m),!(a.y<g.y||a.y>h.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=m*(a.x-g.x)-k*(a.y-g.y);if(0===e)return!0;
-0>e||(d=!d)}}else if(a.y===g.y&&(h.x<=a.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}var e=Ia.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);var g,h,k,m=[];if(1===f.length)return h=f[0],k=new zb,k.curves=h.curves,m.push(k),m;var l=!e(f[0].getPoints()),l=a?!l:l;k=[];var n=[],p=[],r=0,z;n[r]=void 0;p[r]=[];for(var t=0,y=f.length;t<y;t++)h=f[t],z=h.getPoints(),g=e(z),(g=a?!g:g)?(!l&&n[r]&&r++,n[r]={s:new zb,p:z},n[r].s.curves=h.curves,l&&r++,p[r]=[]):p[r].push({h:h,
-p:z[0]});if(!n[0])return c(f);if(1<n.length){t=!1;h=[];e=0;for(f=n.length;e<f;e++)k[e]=[];e=0;for(f=n.length;e<f;e++)for(g=p[e],l=0;l<g.length;l++){r=g[l];z=!0;for(y=0;y<n.length;y++)d(r.p,n[y].p)&&(e!==y&&h.push({froms:e,tos:y,hole:l}),z?(z=!1,k[y].push(r)):t=!0);z&&k[e].push(r)}0<h.length&&(t||(p=k))}t=0;for(e=n.length;t<e;t++)for(k=n[t].s,m.push(k),h=p[t],f=0,g=h.length;f<g;f++)k.holes.push(h[f].h);return m}});Object.assign(ee.prototype,{isFont:!0,generateShapes:function(a,b,c){void 0===b&&(b=
-100);void 0===c&&(c=4);var d=this.data;a=String(a).split("");var e=b/d.resolution,f=(d.boundingBox.yMax-d.boundingBox.yMin+d.underlineThickness)*e,g=0,h=0;b=[];for(var k=0;k<a.length;k++){var m=a[k];if("\n"===m)g=0,h-=f;else{var l;l=e;var n=g,p=h;if(m=d.glyphs[m]||d.glyphs["?"]){var r=new de,z=[],t,y,x,u,B,w,C,G;if(m.o)for(var D=m._cachedOutline||(m._cachedOutline=m.o.split(" ")),E=0,J=D.length;E<J;)switch(D[E++]){case "m":t=D[E++]*l+n;y=D[E++]*l+p;r.moveTo(t,y);break;case "l":t=D[E++]*l+n;y=D[E++]*
-l+p;r.lineTo(t,y);break;case "q":t=D[E++]*l+n;y=D[E++]*l+p;B=D[E++]*l+n;w=D[E++]*l+p;r.quadraticCurveTo(B,w,t,y);if(u=z[z.length-1]){x=u.x;u=u.y;for(var F=1;F<=c;F++){var K=F/c;wb(K,x,B,t);wb(K,u,w,y)}}break;case "b":if(t=D[E++]*l+n,y=D[E++]*l+p,B=D[E++]*l+n,w=D[E++]*l+p,C=D[E++]*l+n,G=D[E++]*l+p,r.bezierCurveTo(B,w,C,G,t,y),u=z[z.length-1])for(x=u.x,u=u.y,F=1;F<=c;F++)K=F/c,xb(K,x,B,C,t),xb(K,u,w,G,y)}l={offsetX:m.ha*l,path:r}}else l=void 0;g+=l.offsetX;b.push(l.path)}}c=[];d=0;for(a=b.length;d<
-a;d++)Array.prototype.push.apply(c,b[d].toShapes());return c}});Object.assign(Re.prototype,{load:function(a,b,c,d){var e=this;(new Ka(this.manager)).load(a,function(a){var c;try{c=JSON.parse(a)}catch(d){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),c=JSON.parse(a.substring(65,a.length-2))}a=e.parse(c);b&&b(a)},c,d)},parse:function(a){return new ee(a)}});var Nd,he={getContext:function(){void 0===Nd&&(Nd=new (window.AudioContext||window.webkitAudioContext));
-return Nd},setContext:function(a){Nd=a}};Object.assign(fe.prototype,{load:function(a,b,c,d){var e=new Ka(this.manager);e.setResponseType("arraybuffer");e.load(a,function(a){he.getContext().decodeAudioData(a,function(a){b(a)})},c,d)}});Object.assign(Se.prototype,{update:function(){var a,b,c,d,e,f,g,h,k=new K,m=new K;return function(l){if(a!==this||b!==l.focus||c!==l.fov||d!==l.aspect*this.aspect||e!==l.near||f!==l.far||g!==l.zoom||h!==this.eyeSep){a=this;b=l.focus;c=l.fov;d=l.aspect*this.aspect;e=
-l.near;f=l.far;g=l.zoom;var n=l.projectionMatrix.clone();h=this.eyeSep/2;var p=h*e/b,r=e*Math.tan(Y.DEG2RAD*c*.5)/g,z,t;m.elements[12]=-h;k.elements[12]=h;z=-r*d+p;t=r*d+p;n.elements[0]=2*e/(t-z);n.elements[8]=(t+z)/(t-z);this.cameraL.projectionMatrix.copy(n);z=-r*d-p;t=r*d-p;n.elements[0]=2*e/(t-z);n.elements[8]=(t+z)/(t-z);this.cameraR.projectionMatrix.copy(n)}this.cameraL.matrixWorld.copy(l.matrixWorld).multiply(m);this.cameraR.matrixWorld.copy(l.matrixWorld).multiply(k)}}()});Hd.prototype=Object.create(z.prototype);
-Hd.prototype.constructor=Hd;ge.prototype=Object.assign(Object.create(z.prototype),{constructor:ge,getInput:function(){return this.gain},removeFilter:function(){null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null)},getFilter:function(){return this.filter},setFilter:function(a){null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination);
-this.filter=a;this.gain.connect(this.filter);this.filter.connect(this.context.destination)},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(a){this.gain.gain.value=a},updateMatrixWorld:function(){var a=new n,b=new oa,c=new n,d=new n;return function(e){z.prototype.updateMatrixWorld.call(this,e);e=this.context.listener;var f=this.up;this.matrixWorld.decompose(a,b,c);d.set(0,0,-1).applyQuaternion(b);e.positionX?(e.positionX.setValueAtTime(a.x,this.context.currentTime),
-e.positionY.setValueAtTime(a.y,this.context.currentTime),e.positionZ.setValueAtTime(a.z,this.context.currentTime),e.forwardX.setValueAtTime(d.x,this.context.currentTime),e.forwardY.setValueAtTime(d.y,this.context.currentTime),e.forwardZ.setValueAtTime(d.z,this.context.currentTime),e.upX.setValueAtTime(f.x,this.context.currentTime),e.upY.setValueAtTime(f.y,this.context.currentTime),e.upZ.setValueAtTime(f.z,this.context.currentTime)):(e.setPosition(a.x,a.y,a.z),e.setOrientation(d.x,d.y,d.z,f.x,f.y,
-f.z))}}()});hc.prototype=Object.assign(Object.create(z.prototype),{constructor:hc,getOutput:function(){return this.gain},setNodeSource:function(a){this.hasPlaybackControl=!1;this.sourceType="audioNode";this.source=a;this.connect();return this},setBuffer:function(a){this.buffer=a;this.sourceType="buffer";this.autoplay&&this.play();return this},play:function(){if(!0===this.isPlaying)console.warn("THREE.Audio: Audio is already playing.");else if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
-else{var a=this.context.createBufferSource();a.buffer=this.buffer;a.loop=this.loop;a.onended=this.onEnded.bind(this);a.playbackRate.setValueAtTime(this.playbackRate,this.startTime);a.start(0,this.startTime);this.isPlaying=!0;this.source=a;return this.connect()}},pause:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.source.stop(),this.startTime=this.context.currentTime,this.isPlaying=!1,this},stop:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
-else return this.source.stop(),this.startTime=0,this.isPlaying=!1,this},connect:function(){if(0<this.filters.length){this.source.connect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].connect(this.filters[a]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this},disconnect:function(){if(0<this.filters.length){this.source.disconnect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-
-1].disconnect(this.filters[a]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},getFilters:function(){return this.filters},setFilters:function(a){a||(a=[]);!0===this.isPlaying?(this.disconnect(),this.filters=a,this.connect()):this.filters=a;return this},getFilter:function(){return this.getFilters()[0]},setFilter:function(a){return this.setFilters(a?[a]:[])},setPlaybackRate:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
-else return this.playbackRate=a,!0===this.isPlaying&&this.source.playbackRate.setValueAtTime(this.playbackRate,this.context.currentTime),this},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying=!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop},setLoop:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.loop=
-a,!0===this.isPlaying&&(this.source.loop=this.loop),this},getVolume:function(){return this.gain.gain.value},setVolume:function(a){this.gain.gain.value=a;return this}});ie.prototype=Object.assign(Object.create(hc.prototype),{constructor:ie,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(a){this.panner.refDistance=a},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(a){this.panner.rolloffFactor=
-a},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(a){this.panner.distanceModel=a},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(a){this.panner.maxDistance=a},updateMatrixWorld:function(){var a=new n;return function(b){z.prototype.updateMatrixWorld.call(this,b);a.setFromMatrixPosition(this.matrixWorld);this.panner.setPosition(a.x,a.y,a.z)}}()});Object.assign(je.prototype,{getFrequencyData:function(){this.analyser.getByteFrequencyData(this.data);
-return this.data},getAverageFrequency:function(){for(var a=0,b=this.getFrequencyData(),c=0;c<b.length;c++)a+=b[c];return a/b.length}});Object.assign(ke.prototype,{accumulate:function(a,b){var c=this.buffer,d=this.valueSize,e=a*d+d,f=this.cumulativeWeight;if(0===f){for(f=0;f!==d;++f)c[e+f]=c[f];f=b}else f+=b,this._mixBufferRegion(c,e,0,b/f,d);this.cumulativeWeight=f},apply:function(a){var b=this.valueSize,c=this.buffer;a=a*b+b;var d=this.cumulativeWeight,e=this.binding;this.cumulativeWeight=0;1>d&&
-this._mixBufferRegion(c,a,3*b,1-d,b);for(var d=b,f=b+b;d!==f;++d)if(c[d]!==c[d+b]){e.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=3*b;this.binding.getValue(a,c);for(var d=b;d!==c;++d)a[d]=a[c+d%b];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_select:function(a,b,c,d,e){if(.5<=d)for(d=0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d){oa.slerpFlat(a,b,a,b,a,c,d)},_lerp:function(a,b,c,d,e){for(var f=
-1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}}});Object.assign(Te.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,
-c=a.length;b!==c;++b)a[b].unbind()}});Object.assign(ha,{Composite:Te,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new ha.Composite(a,b,c):new ha(a,b,c)},sanitizeNodeName:function(a){return a.replace(/\s/g,"_").replace(/[^\w-]/g,"")},parseTrackName:function(){var a=new RegExp("^"+/((?:[\w-]+[\/:])*)/.source+/([\w-\.]+)?/.source+/(?:\.([\w-]+)(?:\[(.+)\])?)?/.source+/\.([\w-]+)(?:\[(.+)\])?/.source+"$"),b=["material","materials","bones"];return function(c){var d=a.exec(c);if(!d)throw Error("PropertyBinding: Cannot parse trackName: "+
-c);var d={nodeName:d[2],objectName:d[3],objectIndex:d[4],propertyName:d[5],propertyIndex:d[6]},e=d.nodeName&&d.nodeName.lastIndexOf(".");if(void 0!==e&&-1!==e){var f=d.nodeName.substring(e+1);-1!==b.indexOf(f)&&(d.nodeName=d.nodeName.substring(0,e),d.objectName=f)}if(null===d.propertyName||0===d.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+c);return d}}(),findNode:function(a,b){if(!b||""===b||"root"===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;
-if(a.skeleton){var c=function(a){for(var c=0;c<a.bones.length;c++){var d=a.bones[c];if(d.name===b)return d}return null}(a.skeleton);if(c)return c}if(a.children){var d=function(a){for(var c=0;c<a.length;c++){var g=a[c];if(g.name===b||g.uuid===b||(g=d(g.children)))return g}return null};if(c=d(a.children))return c}return null}});Object.assign(ha.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,
-NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(a,b){a[b]=this.node[this.propertyName]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)a[b++]=c[d]},function(a,b){a[b]=this.resolvedProperty[this.propertyIndex]},function(a,b){this.resolvedProperty.toArray(a,b)}],SetterByBindingTypeAndVersioning:[[function(a,b){this.node[this.propertyName]=a[b]},function(a,b){this.node[this.propertyName]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.node[this.propertyName]=
-a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.needsUpdate=!0},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty[this.propertyIndex]=a[b]},function(a,b){this.resolvedProperty[this.propertyIndex]=
-a[b];this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty.fromArray(a,b)},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.matrixWorldNeedsUpdate=!0}]],getValue:function(a,b){this.bind();this.getValue(a,b)},setValue:function(a,b){this.bind();this.setValue(a,b)},bind:function(){var a=
-this.node,b=this.parsedPath,c=b.objectName,d=b.propertyName,e=b.propertyIndex;a||(this.node=a=ha.findNode(this.rootNode,b.nodeName)||this.rootNode);this.getValue=this._getValue_unavailable;this.setValue=this._setValue_unavailable;if(a){if(c){var f=b.objectIndex;switch(c){case "materials":if(!a.material){console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);return}if(!a.material.materials){console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",
-this);return}a=a.material.materials;break;case "bones":if(!a.skeleton){console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);return}a=a.skeleton.bones;for(c=0;c<a.length;c++)if(a[c].name===f){f=c;break}break;default:if(void 0===a[c]){console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);return}a=a[c]}if(void 0!==f){if(void 0===a[f]){console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",
-this,a);return}a=a[f]}}f=a[d];if(void 0===f)console.error("THREE.PropertyBinding: Trying to update property for track: "+b.nodeName+"."+d+" but it wasn't found.",a);else{b=this.Versioning.None;void 0!==a.needsUpdate?(b=this.Versioning.NeedsUpdate,this.targetObject=a):void 0!==a.matrixWorldNeedsUpdate&&(b=this.Versioning.MatrixWorldNeedsUpdate,this.targetObject=a);c=this.BindingType.Direct;if(void 0!==e){if("morphTargetInfluences"===d){if(!a.geometry){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",
-this);return}if(a.geometry.isBufferGeometry){if(!a.geometry.morphAttributes){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);return}for(c=0;c<this.node.geometry.morphAttributes.position.length;c++)if(a.geometry.morphAttributes.position[c].name===e){e=c;break}}else{if(!a.geometry.morphTargets){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.",
-this);return}for(c=0;c<this.node.geometry.morphTargets.length;c++)if(a.geometry.morphTargets[c].name===e){e=c;break}}}c=this.BindingType.ArrayElement;this.resolvedProperty=f;this.propertyIndex=e}else void 0!==f.fromArray&&void 0!==f.toArray?(c=this.BindingType.HasFromToArray,this.resolvedProperty=f):Array.isArray(f)?(c=this.BindingType.EntireArray,this.resolvedProperty=f):this.propertyName=d;this.getValue=this.GetterByBindingType[c];this.setValue=this.SetterByBindingTypeAndVersioning[c][b]}}else console.error("THREE.PropertyBinding: Trying to update node for track: "+
-this.path+" but it wasn't found.")},unbind:function(){this.node=null;this.getValue=this._getValue_unbound;this.setValue=this._setValue_unbound}});Object.assign(ha.prototype,{_getValue_unbound:ha.prototype.getValue,_setValue_unbound:ha.prototype.setValue});Object.assign(Ue.prototype,{isAnimationObjectGroup:!0,add:function(a){for(var b=this._objects,c=b.length,d=this.nCachedObjects_,e=this._indicesByUUID,f=this._paths,g=this._parsedPaths,h=this._bindings,k=h.length,m=0,l=arguments.length;m!==l;++m){var n=
-arguments[m],p=n.uuid,r=e[p];if(void 0===r){r=c++;e[p]=r;b.push(n);for(var p=0,z=k;p!==z;++p)h[p].push(new ha(n,f[p],g[p]))}else if(r<d){var t=--d,z=b[t];e[z.uuid]=r;b[r]=z;e[p]=t;b[t]=n;p=0;for(z=k;p!==z;++p){var y=h[p],x=y[r];y[r]=y[t];void 0===x&&(x=new ha(n,f[p],g[p]));y[t]=x}}else void 0!==b[r]&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_=d},remove:function(a){for(var b=
-this._objects,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._bindings,f=e.length,g=0,h=arguments.length;g!==h;++g){var k=arguments[g],m=k.uuid,l=d[m];if(void 0!==l&&l>=c){var n=c++,p=b[n];d[p.uuid]=l;b[l]=p;d[m]=n;b[n]=k;k=0;for(m=f;k!==m;++k){var p=e[k],r=p[l];p[l]=p[n];p[n]=r}}}this.nCachedObjects_=c},uncache:function(a){for(var b=this._objects,c=b.length,d=this.nCachedObjects_,e=this._indicesByUUID,f=this._bindings,g=f.length,h=0,k=arguments.length;h!==k;++h){var l=arguments[h].uuid,n=e[l];
-if(void 0!==n)if(delete e[l],n<d){var l=--d,v=b[l],p=--c,r=b[p];e[v.uuid]=n;b[n]=v;e[r.uuid]=l;b[l]=r;b.pop();v=0;for(r=g;v!==r;++v){var z=f[v],t=z[p];z[n]=z[l];z[l]=t;z.pop()}}else for(p=--c,r=b[p],e[r.uuid]=n,b[n]=r,b.pop(),v=0,r=g;v!==r;++v)z=f[v],z[n]=z[p],z.pop()}this.nCachedObjects_=d},subscribe_:function(a,b){var c=this._bindingsIndicesByPath,d=c[a],e=this._bindings;if(void 0!==d)return e[d];var f=this._paths,g=this._parsedPaths,h=this._objects,k=this.nCachedObjects_,l=Array(h.length),d=e.length;
-c[a]=d;f.push(a);g.push(b);e.push(l);c=k;for(d=h.length;c!==d;++c)l[c]=new ha(h[c],a,b);return l},unsubscribe_:function(a){var b=this._bindingsIndicesByPath,c=b[a];if(void 0!==c){var d=this._paths,e=this._parsedPaths,f=this._bindings,g=f.length-1,h=f[g];b[a[g]]=c;f[c]=h;f.pop();e[c]=e[g];e.pop();d[c]=d[g];d.pop()}}});Object.assign(Ve.prototype,{play:function(){this._mixer._activateAction(this);return this},stop:function(){this._mixer._deactivateAction(this);return this.reset()},reset:function(){this.paused=
-!1;this.enabled=!0;this.time=0;this._loopCount=-1;this._startTime=null;return this.stopFading().stopWarping()},isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},isScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(a){this._startTime=a;return this},setLoop:function(a,b){this.loop=a;this.repetitions=b;return this},setEffectiveWeight:function(a){this.weight=a;this._effectiveWeight=this.enabled?
-a:0;return this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(a){return this._scheduleFading(a,0,1)},fadeOut:function(a){return this._scheduleFading(a,1,0)},crossFadeFrom:function(a,b,c){a.fadeOut(b);this.fadeIn(b);if(c){c=this._clip.duration;var d=a._clip.duration,e=c/d;a.warp(1,d/c,b);this.warp(e,1,b)}return this},crossFadeTo:function(a,b,c){return a.crossFadeFrom(this,b,c)},stopFading:function(){var a=this._weightInterpolant;null!==a&&(this._weightInterpolant=
-null,this._mixer._takeBackControlInterpolant(a));return this},setEffectiveTimeScale:function(a){this.timeScale=a;this._effectiveTimeScale=this.paused?0:a;return this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},setDuration:function(a){this.timeScale=this._clip.duration/a;return this.stopWarping()},syncWith:function(a){this.time=a.time;this.timeScale=a.timeScale;return this.stopWarping()},halt:function(a){return this.warp(this._effectiveTimeScale,0,a)},warp:function(a,
-b,c){var d=this._mixer,e=d.time,f=this._timeScaleInterpolant,g=this.timeScale;null===f&&(this._timeScaleInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;d[1]=e+c;f[0]=a/g;f[1]=b/g;return this},stopWarping:function(){var a=this._timeScaleInterpolant;null!==a&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot||
-this._mixer._root},_update:function(a,b,c,d){if(this.enabled){var e=this._startTime;if(null!==e){b=(a-e)*c;if(0>b||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0<a){b=this._interpolants;for(var e=this._propertyBindings,f=0,g=b.length;f!==g;++f)b[f].evaluate(c),e[f].accumulate(d,a)}}else this._updateWeight(a)},_updateWeight:function(a){var b=0;if(this.enabled){var b=this.weight,c=this._weightInterpolant;if(null!==c){var d=c.evaluate(a)[0],
-b=b*d;a>c.parameterPositions[1]&&(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){var b=this.timeScale,c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0],b=b*d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a;if(0===a)return b;var c=this._clip.duration,d=this.loop,e=this._loopCount;if(2200===
-d)a:{if(-1===e&&(this._loopCount=0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;this._mixer.dispatchEvent({type:"finished",action:this,direction:0>a?-1:1})}else{d=2202===d;-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,d)):this._setEndings(0===this.repetitions,!0,d));if(b>=c||0>b){var f=Math.floor(b/c),b=b-c*f,e=e+Math.abs(f),g=this.repetitions-e;0>g?(this.clampWhenFinished?this.paused=!0:this.enabled=!1,b=0<a?
-c:0,this._mixer.dispatchEvent({type:"finished",action:this,direction:0<a?1:-1})):(0===g?(a=0>a,this._setEndings(a,!a,d)):this._setEndings(!1,!1,d),this._loopCount=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:f}))}if(d&&1===(e&1))return this.time=b,c-b}return this.time=b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(a,
-b,c){var d=this._mixer,e=d.time,f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}});Object.assign(We.prototype,xa.prototype,{_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings,g=a._interpolants,h=c.uuid,k=this._bindingsByRootAndName,l=k[h];void 0===l&&(l={},k[h]=l);for(k=0;k!==e;++k){var n=d[k],v=n.name,p=l[v];if(void 0===
-p){p=f[k];if(void 0!==p){null===p._cacheIndex&&(++p.referenceCount,this._addInactiveBinding(p,h,v));continue}p=new ke(ha.create(c,v,b&&b._propertyBindings[k].binding.parsedPath),n.ValueTypeName,n.getValueSize());++p.referenceCount;this._addInactiveBinding(p,h,v)}f[k]=p;g[k].resultBuffer=p.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,d=this._actionsByClip[c];this._bindAction(a,d&&d.knownActions[0]);this._addInactiveAction(a,
-c,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}},_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b=a._propertyBindings,c=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=[];this._nActiveActions=0;this._actionsByClip={};this._bindings=[];this._nActiveBindings=
-0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length},get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length},get inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},_isActiveAction:function(a){a=a._cacheIndex;return null!==a&&a<this._nActiveActions},
-_addInactiveAction:function(a,b,c){var d=this._actions,e=this._actionsByClip,f=e[b];void 0===f?(f={knownActions:[a],actionByRoot:{}},a._byClipCacheIndex=0,e[b]=f):(b=f.knownActions,a._byClipCacheIndex=b.length,b.push(a));a._cacheIndex=d.length;d.push(a);f.actionByRoot[c]=a},_removeInactiveAction:function(a){var b=this._actions,c=b[b.length-1],d=a._cacheIndex;c._cacheIndex=d;b[d]=c;b.pop();a._cacheIndex=null;var b=a._clip.uuid,c=this._actionsByClip,d=c[b],e=d.knownActions,f=e[e.length-1],g=a._byClipCacheIndex;
-f._byClipCacheIndex=g;e[g]=f;e.pop();a._byClipCacheIndex=null;delete d.actionByRoot[(a._localRoot||this._root).uuid];0===e.length&&delete c[b];this._removeInactiveBindingsForAction(a)},_removeInactiveBindingsForAction:function(a){a=a._propertyBindings;for(var b=0,c=a.length;b!==c;++b){var d=a[b];0===--d.referenceCount&&this._removeInactiveBinding(d)}},_lendAction:function(a){var b=this._actions,c=a._cacheIndex,d=this._nActiveActions++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackAction:function(a){var b=
-this._actions,c=a._cacheIndex,d=--this._nActiveActions,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_addInactiveBinding:function(a,b,c){var d=this._bindingsByRootAndName,e=d[b],f=this._bindings;void 0===e&&(e={},d[b]=e);e[c]=a;a._cacheIndex=f.length;f.push(a)},_removeInactiveBinding:function(a){var b=this._bindings,c=a.binding,d=c.rootNode.uuid,c=c.path,e=this._bindingsByRootAndName,f=e[d],g=b[b.length-1];a=a._cacheIndex;g._cacheIndex=a;b[a]=g;b.pop();delete f[c];a:{for(var h in f)break a;
-delete e[d]}},_lendBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=this._nActiveBindings++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=--this._nActiveBindings,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_lendControlInterpolant:function(){var a=this._controlInterpolants,b=this._nActiveControlInterpolants++,c=a[b];void 0===c&&(c=new Tc(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),
-c.__cacheIndex=b,a[b]=c);return c},_takeBackControlInterpolant:function(a){var b=this._controlInterpolants,c=a.__cacheIndex,d=--this._nActiveControlInterpolants,e=b[d];a.__cacheIndex=d;b[d]=a;e.__cacheIndex=c;b[c]=e},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(a,b){var c=b||this._root,d=c.uuid,e="string"===typeof a?Da.findByName(c,a):a,c=null!==e?e.uuid:a,f=this._actionsByClip[c],g=null;if(void 0!==f){g=f.actionByRoot[d];if(void 0!==g)return g;g=f.knownActions[0];null===
-e&&(e=g._clip)}if(null===e)return null;e=new Ve(this,e,b);this._bindAction(e,g);this._addInactiveAction(e,c,d);return e},existingAction:function(a,b){var c=b||this._root,d=c.uuid,c="string"===typeof a?Da.findByName(c,a):a,c=this._actionsByClip[c?c.uuid:a];return void 0!==c?c.actionByRoot[d]||null:null},stopAllAction:function(){for(var a=this._actions,b=this._nActiveActions,c=this._bindings,d=this._nActiveBindings,e=this._nActiveBindings=this._nActiveActions=0;e!==b;++e)a[e].reset();for(e=0;e!==d;++e)c[e].useCount=
-0;return this},update:function(a){a*=this.timeScale;for(var b=this._actions,c=this._nActiveActions,d=this.time+=a,e=Math.sign(a),f=this._accuIndex^=1,g=0;g!==c;++g)b[g]._update(d,a,e,f);a=this._bindings;b=this._nActiveBindings;for(g=0;g!==b;++g)a[g].apply(f);return this},getRoot:function(){return this._root},uncacheClip:function(a){var b=this._actions;a=a.uuid;var c=this._actionsByClip,d=c[a];if(void 0!==d){for(var d=d.knownActions,e=0,f=d.length;e!==f;++e){var g=d[e];this._deactivateAction(g);var h=
-g._cacheIndex,k=b[b.length-1];g._cacheIndex=null;g._byClipCacheIndex=null;k._cacheIndex=h;b[h]=k;b.pop();this._removeInactiveBindingsForAction(g)}delete c[a]}},uncacheRoot:function(a){a=a.uuid;var b=this._actionsByClip,c;for(c in b){var d=b[c].actionByRoot[a];void 0!==d&&(this._deactivateAction(d),this._removeInactiveAction(d))}c=this._bindingsByRootAndName[a];if(void 0!==c)for(var e in c)a=c[e],a.restoreOriginalState(),this._removeInactiveBinding(a)},uncacheAction:function(a,b){var c=this.existingAction(a,
-b);null!==c&&(this._deactivateAction(c),this._removeInactiveAction(c))}});Id.prototype.clone=function(){return new Id(void 0===this.value.clone?this.value:this.value.clone())};le.prototype=Object.assign(Object.create(E.prototype),{constructor:le,isInstancedBufferGeometry:!0,addGroup:function(a,b,c){this.groups.push({start:a,count:b,materialIndex:c})},copy:function(a){var b=a.index;null!==b&&this.setIndex(b.clone());var b=a.attributes,c;for(c in b)this.addAttribute(c,b[c].clone());a=a.groups;c=0;for(b=
-a.length;c<b;c++){var d=a[c];this.addGroup(d.start,d.count,d.materialIndex)}return this}});Object.defineProperties(me.prototype,{count:{get:function(){return this.data.count}},array:{get:function(){return this.data.array}}});Object.assign(me.prototype,{isInterleavedBufferAttribute:!0,setX:function(a,b){this.data.array[a*this.data.stride+this.offset]=b;return this},setY:function(a,b){this.data.array[a*this.data.stride+this.offset+1]=b;return this},setZ:function(a,b){this.data.array[a*this.data.stride+
-this.offset+2]=b;return this},setW:function(a,b){this.data.array[a*this.data.stride+this.offset+3]=b;return this},getX:function(a){return this.data.array[a*this.data.stride+this.offset]},getY:function(a){return this.data.array[a*this.data.stride+this.offset+1]},getZ:function(a){return this.data.array[a*this.data.stride+this.offset+2]},getW:function(a){return this.data.array[a*this.data.stride+this.offset+3]},setXY:function(a,b,c){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+
-1]=c;return this},setXYZ:function(a,b,c,d){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;this.data.array[a+3]=e;return this}});Object.defineProperty(ic.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(ic.prototype,{isInterleavedBuffer:!0,setArray:function(a){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");
-this.count=void 0!==a?a.length/this.stride:0;this.array=a},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.count=a.count;this.stride=a.stride;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.stride;c*=b.stride;for(var d=0,e=this.stride;d<e;d++)this.array[a+d]=b.array[c+d];return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},clone:function(){return(new this.constructor).copy(this)},onUpload:function(a){this.onUploadCallback=
-a;return this}});ne.prototype=Object.assign(Object.create(ic.prototype),{constructor:ne,isInstancedInterleavedBuffer:!0,copy:function(a){ic.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this}});oe.prototype=Object.assign(Object.create(Z.prototype),{constructor:oe,isInstancedBufferAttribute:!0,copy:function(a){Z.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this}});Object.assign(Xe.prototype,{linePrecision:1,set:function(a,b){this.ray.set(a,
-b)},setFromCamera:function(a,b){b&&b.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(b.matrixWorld),this.ray.direction.set(a.x,a.y,.5).unproject(b).sub(this.ray.origin).normalize()):b&&b.isOrthographicCamera?(this.ray.origin.set(a.x,a.y,(b.near+b.far)/(b.near-b.far)).unproject(b),this.ray.direction.set(0,0,-1).transformDirection(b.matrixWorld)):console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(a,b){var c=[];pe(a,this,c,b);c.sort(Ye);return c},intersectObjects:function(a,
-b){var c=[];if(!1===Array.isArray(a))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),c;for(var d=0,e=a.length;d<e;d++)pe(a[d],this,c,b);c.sort(Ye);return c}});Object.assign(Ze.prototype,{start:function(){this.oldTime=this.startTime=("undefined"===typeof performance?Date:performance).now();this.elapsedTime=0;this.running=!0},stop:function(){this.getElapsedTime();this.autoStart=this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=
-0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var b=("undefined"===typeof performance?Date:performance).now(),a=(b-this.oldTime)/1E3;this.oldTime=b;this.elapsedTime+=a}return a}});Object.assign($e.prototype,{set:function(a,b,c){this.radius=a;this.phi=b;this.theta=c;return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.phi=a.phi;this.theta=a.theta;return this},makeSafe:function(){this.phi=Math.max(1E-6,Math.min(Math.PI-
-1E-6,this.phi));return this},setFromVector3:function(a){this.radius=a.length();0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(a.x,a.z),this.phi=Math.acos(Y.clamp(a.y/this.radius,-1,1)));return this}});Object.assign(af.prototype,{set:function(a,b,c){this.radius=a;this.theta=b;this.y=c;return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.theta=a.theta;this.y=a.y;return this},setFromVector3:function(a){this.radius=Math.sqrt(a.x*
-a.x+a.z*a.z);this.theta=Math.atan2(a.x,a.z);this.y=a.y;return this}});ta.prototype=Object.create(la.prototype);ta.prototype.constructor=ta;ta.prototype.createAnimation=function(a,b,c,d){b={start:b,end:c,length:c-b+1,fps:d,duration:(c-b)/d,lastFrame:0,currentFrame:0,active:!1,time:0,direction:1,weight:1,directionBackwards:!1,mirroredLoop:!1};this.animationsMap[a]=b;this.animationsList.push(b)};ta.prototype.autoCreateAnimations=function(a){for(var b=/([a-z]+)_?(\d+)/i,c,d={},e=this.geometry,f=0,g=e.morphTargets.length;f<
-g;f++){var h=e.morphTargets[f].name.match(b);if(h&&1<h.length){var k=h[1];d[k]||(d[k]={start:Infinity,end:-Infinity});h=d[k];f<h.start&&(h.start=f);f>h.end&&(h.end=f);c||(c=k)}}for(k in d)h=d[k],this.createAnimation(k,h.start,h.end,a);this.firstAnimation=c};ta.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a])a.direction=1,a.directionBackwards=!1};ta.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a])a.direction=-1,a.directionBackwards=!0};ta.prototype.setAnimationFPS=
-function(a,b){var c=this.animationsMap[a];c&&(c.fps=b,c.duration=(c.end-c.start)/c.fps)};ta.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];c&&(c.duration=b,c.fps=(c.end-c.start)/c.duration)};ta.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];c&&(c.weight=b)};ta.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];c&&(c.time=b)};ta.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};ta.prototype.getAnimationDuration=
-function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};ta.prototype.playAnimation=function(a){var b=this.animationsMap[a];b?(b.time=0,b.active=!0):console.warn("THREE.MorphBlendMesh: animation["+a+"] undefined in .playAnimation()")};ta.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=!1};ta.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.direction*a;if(d.mirroredLoop){if(d.time>
-d.duration||0>d.time)d.direction*=-1,d.time>d.duration&&(d.time=d.duration,d.directionBackwards=!0),0>d.time&&(d.time=0,d.directionBackwards=!1)}else d.time%=d.duration,0>d.time&&(d.time+=d.duration);var f=d.start+Y.clamp(Math.floor(d.time/e),0,d.length-1),g=d.weight;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);d.currentFrame!==
-d.lastFrame?(this.morphTargetInfluences[d.currentFrame]=e*g,this.morphTargetInfluences[d.lastFrame]=(1-e)*g):this.morphTargetInfluences[d.currentFrame]=g}}};Xc.prototype=Object.create(z.prototype);Xc.prototype.constructor=Xc;Xc.prototype.isImmediateRenderObject=!0;Yc.prototype=Object.create(Q.prototype);Yc.prototype.constructor=Yc;Yc.prototype.update=function(){var a=new n,b=new n,c=new Ba;return function(){var d=["a","b","c"];this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);
-var e=this.object.matrixWorld,f=this.geometry.attributes.position,g=this.object.geometry;if(g&&g.isGeometry)for(var h=g.vertices,k=g.faces,l=g=0,n=k.length;l<n;l++)for(var v=k[l],p=0,r=v.vertexNormals.length;p<r;p++){var z=v.vertexNormals[p];a.copy(h[v[d[p]]]).applyMatrix4(e);b.copy(z).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);f.setXYZ(g,a.x,a.y,a.z);g+=1;f.setXYZ(g,b.x,b.y,b.z);g+=1}else if(g&&g.isBufferGeometry)for(d=g.attributes.position,h=g.attributes.normal,p=g=0,r=d.count;p<
-r;p++)a.set(d.getX(p),d.getY(p),d.getZ(p)).applyMatrix4(e),b.set(h.getX(p),h.getY(p),h.getZ(p)),b.applyMatrix3(c).normalize().multiplyScalar(this.size).add(a),f.setXYZ(g,a.x,a.y,a.z),g+=1,f.setXYZ(g,b.x,b.y,b.z),g+=1;f.needsUpdate=!0}}();jc.prototype=Object.create(z.prototype);jc.prototype.constructor=jc;jc.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};jc.prototype.update=function(){var a=new n,b=new n;return function(){this.light.updateMatrixWorld();var c=
-this.light.distance?this.light.distance:1E3,d=c*Math.tan(this.light.angle);this.cone.scale.set(d,d,c);a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(b.sub(a));this.cone.material.color.copy(this.light.color)}}();kc.prototype=Object.create(Q.prototype);kc.prototype.constructor=kc;kc.prototype.onBeforeRender=function(){var a=new n,b=new K,c=new K;return function(){var d=this.bones,e=this.geometry,f=e.getAttribute("position");c.getInverse(this.root.matrixWorld);
-for(var g=0,h=0;g<d.length;g++){var k=d[g];k.parent&&k.parent.isBone&&(b.multiplyMatrices(c,k.matrixWorld),a.setFromMatrixPosition(b),f.setXYZ(h,a.x,a.y,a.z),b.multiplyMatrices(c,k.parent.matrixWorld),a.setFromMatrixPosition(b),f.setXYZ(h+1,a.x,a.y,a.z),h+=2)}e.getAttribute("position").needsUpdate=!0}}();lc.prototype=Object.create(la.prototype);lc.prototype.constructor=lc;lc.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};lc.prototype.update=function(){this.material.color.copy(this.light.color)};
-mc.prototype=Object.create(z.prototype);mc.prototype.constructor=mc;mc.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};mc.prototype.update=function(){var a=this.children[0];a.material.color.copy(this.light.color);var b=.5*this.light.width,c=.5*this.light.height,a=a.geometry.attributes.position,d=a.array;d[0]=b;d[1]=-c;d[2]=0;d[3]=b;d[4]=c;d[5]=0;d[6]=-b;d[7]=c;d[8]=0;d[9]=-b;d[10]=-c;d[11]=0;d[12]=b;d[13]=-c;d[14]=0;a.needsUpdate=!0};nc.prototype=
-Object.create(z.prototype);nc.prototype.constructor=nc;nc.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};nc.prototype.update=function(){var a=new n,b=new G,c=new G;return function(){var d=this.children[0],e=d.geometry.getAttribute("color");b.copy(this.light.color);c.copy(this.light.groundColor);for(var f=0,g=e.count;f<g;f++){var h=f<g/2?b:c;e.setXYZ(f,h.r,h.g,h.b)}d.lookAt(a.setFromMatrixPosition(this.light.matrixWorld).negate());e.needsUpdate=
-!0}}();Zc.prototype=Object.create(Q.prototype);Zc.prototype.constructor=Zc;Jd.prototype=Object.create(Q.prototype);Jd.prototype.constructor=Jd;$c.prototype=Object.create(Q.prototype);$c.prototype.constructor=$c;$c.prototype.update=function(){var a=new n,b=new n,c=new Ba;return function(){this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);for(var d=this.object.matrixWorld,e=this.geometry.attributes.position,f=this.object.geometry,g=f.vertices,f=f.faces,h=0,k=0,l=f.length;k<
-l;k++){var n=f[k],v=n.normal;a.copy(g[n.a]).add(g[n.b]).add(g[n.c]).divideScalar(3).applyMatrix4(d);b.copy(v).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);e.setXYZ(h,a.x,a.y,a.z);h+=1;e.setXYZ(h,b.x,b.y,b.z);h+=1}e.needsUpdate=!0}}();oc.prototype=Object.create(z.prototype);oc.prototype.constructor=oc;oc.prototype.dispose=function(){var a=this.children[0],b=this.children[1];a.geometry.dispose();a.material.dispose();b.geometry.dispose();b.material.dispose()};oc.prototype.update=function(){var a=
-new n,b=new n,c=new n;return function(){a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);c.subVectors(b,a);var d=this.children[0],e=this.children[1];d.lookAt(c);d.material.color.copy(this.light.color);e.lookAt(c);e.scale.z=c.length()}}();ad.prototype=Object.create(Q.prototype);ad.prototype.constructor=ad;ad.prototype.update=function(){function a(a,g,h,k){d.set(g,h,k).unproject(e);a=c[a];if(void 0!==a)for(g=b.getAttribute("position"),h=0,k=a.length;h<
-k;h++)g.setXYZ(a[h],d.x,d.y,d.z)}var b,c,d=new n,e=new Na;return function(){b=this.geometry;c=this.pointMap;e.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,1);a("f2",1,-1,1);a("f3",-1,1,1);a("f4",1,1,1);a("u1",.7,1.1,-1);a("u2",-.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);b.getAttribute("position").needsUpdate=
-!0}}();Ab.prototype=Object.create(Q.prototype);Ab.prototype.constructor=Ab;Ab.prototype.update=function(){var a=new Ra;return function(b){void 0!==b&&console.warn("THREE.BoxHelper: .update() has no longer arguments.");void 0!==this.object&&a.setFromObject(this.object);if(!a.isEmpty()){b=a.min;var c=a.max,d=this.geometry.attributes.position,e=d.array;e[0]=c.x;e[1]=c.y;e[2]=c.z;e[3]=b.x;e[4]=c.y;e[5]=c.z;e[6]=b.x;e[7]=b.y;e[8]=c.z;e[9]=c.x;e[10]=b.y;e[11]=c.z;e[12]=c.x;e[13]=c.y;e[14]=b.z;e[15]=b.x;
-e[16]=c.y;e[17]=b.z;e[18]=b.x;e[19]=b.y;e[20]=b.z;e[21]=c.x;e[22]=b.y;e[23]=b.z;d.needsUpdate=!0;this.geometry.computeBoundingSphere()}}}();Ab.prototype.setFromObject=function(a){this.object=a;this.update();return this};var Kd,qe;Bb.prototype=Object.create(z.prototype);Bb.prototype.constructor=Bb;Bb.prototype.setDirection=function(){var a=new n,b;return function(c){.99999<c.y?this.quaternion.set(0,0,0,1):-.99999>c.y?this.quaternion.set(1,0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,
-b))}}();Bb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(0,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};Bb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)};Ld.prototype=Object.create(Q.prototype);Ld.prototype.constructor=Ld;var Od=new n,ue=new re,ve=new re,we=new re;La.prototype=Object.create(ua.prototype);La.prototype.constructor=
-La;La.prototype.getPoint=function(a){var b=this.points,c=b.length;a*=c-(this.closed?0:1);var d=Math.floor(a);a-=d;this.closed?d+=0<d?0:(Math.floor(Math.abs(d)/b.length)+1)*b.length:0===a&&d===c-1&&(d=c-2,a=1);var e,f,g;this.closed||0<d?e=b[(d-1)%c]:(Od.subVectors(b[0],b[1]).add(b[0]),e=Od);f=b[d%c];g=b[(d+1)%c];this.closed||d+2<c?b=b[(d+2)%c]:(Od.subVectors(b[c-1],b[c-2]).add(b[c-1]),b=Od);if(void 0===this.type||"centripetal"===this.type||"chordal"===this.type){var h="chordal"===this.type?.5:.25,
-c=Math.pow(e.distanceToSquared(f),h),d=Math.pow(f.distanceToSquared(g),h),h=Math.pow(g.distanceToSquared(b),h);1E-4>d&&(d=1);1E-4>c&&(c=d);1E-4>h&&(h=d);ue.initNonuniformCatmullRom(e.x,f.x,g.x,b.x,c,d,h);ve.initNonuniformCatmullRom(e.y,f.y,g.y,b.y,c,d,h);we.initNonuniformCatmullRom(e.z,f.z,g.z,b.z,c,d,h)}else"catmullrom"===this.type&&(c=void 0!==this.tension?this.tension:.5,ue.initCatmullRom(e.x,f.x,g.x,b.x,c),ve.initCatmullRom(e.y,f.y,g.y,b.y,c),we.initCatmullRom(e.z,f.z,g.z,b.z,c));return new n(ue.calc(a),
-ve.calc(a),we.calc(a))};bd.prototype=Object.create(ua.prototype);bd.prototype.constructor=bd;bd.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2,e=this.v3;return new n(xb(a,b.x,c.x,d.x,e.x),xb(a,b.y,c.y,d.y,e.y),xb(a,b.z,c.z,d.z,e.z))};cd.prototype=Object.create(ua.prototype);cd.prototype.constructor=cd;cd.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2;return new n(wb(a,b.x,c.x,d.x),wb(a,b.y,c.y,d.y),wb(a,b.z,c.z,d.z))};dd.prototype=Object.create(ua.prototype);dd.prototype.constructor=
-dd;dd.prototype.getPoint=function(a){if(1===a)return this.v2.clone();var b=new n;b.subVectors(this.v2,this.v1);b.multiplyScalar(a);b.add(this.v1);return b};Md.prototype=Object.create(Va.prototype);Md.prototype.constructor=Md;ua.create=function(a,b){console.log("THREE.Curve.create() has been deprecated");a.prototype=Object.create(ua.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};cf.prototype=Object.create(La.prototype);df.prototype=Object.create(La.prototype);se.prototype=Object.create(La.prototype);
-Object.assign(se.prototype,{initFromArray:function(a){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(a){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},reparametrizeByArcLength:function(a){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}});Zc.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};kc.prototype.update=
-function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")};Object.assign(fd.prototype,{center:function(a){console.warn("THREE.Box2: .center() has been renamed to .getCenter().");return this.getCenter(a)},empty:function(){console.warn("THREE.Box2: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},size:function(a){console.warn("THREE.Box2: .size() has been renamed to .getSize().");
-return this.getSize(a)}});Object.assign(Ra.prototype,{center:function(a){console.warn("THREE.Box3: .center() has been renamed to .getCenter().");return this.getCenter(a)},empty:function(){console.warn("THREE.Box3: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().");
-return this.intersectsSphere(a)},size:function(a){console.warn("THREE.Box3: .size() has been renamed to .getSize().");return this.getSize(a)}});Hb.prototype.center=function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");return this.getCenter(a)};Y.random16=function(){console.warn("THREE.Math.random16() has been deprecated. Use Math.random() instead.");return Math.random()};Object.assign(Ba.prototype,{flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");
-return this.toArray(a,b)},multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},multiplyVector3Array:function(a){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBuffer:function(a,b,c){console.warn("THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");return this.applyToBufferAttribute(a)},applyToVector3Array:function(a,
-b,c){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}});Object.assign(K.prototype,{extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");return this.copyPosition(a)},flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},getPosition:function(){var a;return function(){void 0===a&&(a=new n);console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");
-return a.setFromMatrixColumn(this,3)}}(),setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().");return this.makeRotationFromQuaternion(a)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector4:function(a){console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");
-return a.applyMatrix4(this)},multiplyVector3Array:function(a){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},rotateAxis:function(a){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");a.transformDirection(this)},crossVector:function(a){console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},
-rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBuffer:function(a,b,c){console.warn("THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");return this.applyToBufferAttribute(a)},
-applyToVector3Array:function(a,b,c){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},makeFrustum:function(a,b,c,d,e,f){console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.");return this.makePerspective(a,b,d,c,e,f)}});Aa.prototype.isIntersectionLine=function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");return this.intersectsLine(a)};oa.prototype.multiplyVector3=
-function(a){console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return a.applyQuaternion(this)};Object.assign(kb.prototype,{isIntersectionBox:function(a){console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionPlane:function(a){console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().");return this.intersectsPlane(a)},isIntersectionSphere:function(a){console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().");
-return this.intersectsSphere(a)}});Object.assign(zb.prototype,{extrude:function(a){console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");return new cb(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new Xb(this,a)}});Object.assign(C.prototype,{fromAttribute:function(a,b,c){console.error("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,
-b,c)}});Object.assign(n.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(a){console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().");return this.setFromMatrixPosition(a)},
-getScaleFromMatrix:function(a){console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().");return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,b){console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().");return this.setFromMatrixColumn(b,a)},applyProjection:function(a){console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.");return this.applyMatrix4(a)},fromAttribute:function(a,
-b,c){console.error("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)}});Object.assign(fa.prototype,{fromAttribute:function(a,b,c){console.error("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)}});J.prototype.computeTangents=function(){console.warn("THREE.Geometry: .computeTangents() has been removed.")};Object.assign(z.prototype,{getChildByName:function(a){console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().");
-return this.getObjectByName(a)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(a,b){console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.");return this.translateOnAxis(b,a)}});Object.defineProperties(z.prototype,{eulerOrder:{get:function(){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");return this.rotation.order},set:function(a){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");
-this.rotation.order=a}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}});Object.defineProperties(yc.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");return this.levels}}});Object.defineProperty(zc.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},
-set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}});Object.defineProperty(ua.prototype,"__arcLengthDivisions",{get:function(){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");return this.arcLengthDivisions},set:function(a){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");this.arcLengthDivisions=a}});qa.prototype.setLens=function(a,b){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.");
-void 0!==b&&(this.filmGauge=b);this.setFocalLength(a)};Object.defineProperties(na.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(a){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov.");this.shadow.camera.fov=a}},shadowCameraLeft:{set:function(a){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left.");this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right.");
-this.shadow.camera.right=a}},shadowCameraTop:{set:function(a){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top.");this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.");this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near.");this.shadow.camera.near=a}},shadowCameraFar:{set:function(a){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far.");
-this.shadow.camera.far=a}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(a){console.warn("THREE.Light: .shadowBias is now .shadow.bias.");this.shadow.bias=a}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(a){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.");
-this.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.");this.shadow.mapSize.height=a}}});Object.defineProperties(Z.prototype,{length:{get:function(){console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead.");return this.array.length}}});Object.assign(E.prototype,{addIndex:function(a){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");this.setIndex(a)},addDrawCall:function(a,
-b,c){void 0!==c&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.");console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup().");this.addGroup(a,b)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().");this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")}});
-Object.defineProperties(E.prototype,{drawcalls:{get:function(){console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups.");return this.groups}},offsets:{get:function(){console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups.");return this.groups}}});Object.defineProperties(Id.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.");
-return this}}});Object.defineProperties(U.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},wrapRGB:{get:function(){console.warn("THREE.Material: .wrapRGB has been removed.");return new G}}});Object.defineProperties(Ja.prototype,{metal:{get:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.");return!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}});
-Object.defineProperties(ra.prototype,{derivatives:{get:function(){console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");return this.extensions.derivatives},set:function(a){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");this.extensions.derivatives=a}}});Object.assign(Xd.prototype,{getCurrentRenderTarget:function(){console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().");return this.getRenderTarget()},
-supportsFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' ).");return this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).");return this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' ).");
-return this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' ).");return this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).");return this.extensions.get("WEBGL_compressed_texture_pvrtc")},
-supportsBlendMinMax:function(){console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).");return this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.");return this.capabilities.vertexTextures},supportsInstancedArrays:function(){console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' ).");
-return this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(a){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().");this.setScissorTest(a)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")}});
-Object.defineProperties(Xd.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.");this.shadowMap.type=a}},shadowMapCullFace:{get:function(){return this.shadowMap.cullFace},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.");
-this.shadowMap.cullFace=a}}});Object.defineProperties(Ie.prototype,{cullFace:{get:function(){return this.renderReverseSided?2:1},set:function(a){a=1!==a;console.warn("WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to "+a+".");this.renderReverseSided=a}}});Object.defineProperties(Cb.prototype,{wrapS:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");return this.texture.wrapS},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");
-this.texture.wrapS=a}},wrapT:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");return this.texture.wrapT},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");this.texture.wrapT=a}},magFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");return this.texture.magFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");this.texture.magFilter=
-a}},minFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");return this.texture.minFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");this.texture.minFilter=a}},anisotropy:{get:function(){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");return this.texture.anisotropy},set:function(a){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");this.texture.anisotropy=
-a}},offset:{get:function(){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");return this.texture.offset},set:function(a){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");this.texture.offset=a}},repeat:{get:function(){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");return this.texture.repeat},set:function(a){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");this.texture.repeat=a}},format:{get:function(){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");
-return this.texture.format},set:function(a){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");this.texture.format=a}},type:{get:function(){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");return this.texture.type},set:function(a){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");this.texture.type=a}},generateMipmaps:{get:function(){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");return this.texture.generateMipmaps},
-set:function(a){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");this.texture.generateMipmaps=a}}});hc.prototype.load=function(a){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var b=this;(new fe).load(a,function(a){b.setBuffer(a)});return this};je.prototype.getData=function(){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");return this.getFrequencyData()};l.WebGLRenderTargetCube=Db;l.WebGLRenderTarget=
-Cb;l.WebGLRenderer=Xd;l.ShaderLib=$a;l.UniformsLib=R;l.UniformsUtils=Ca;l.ShaderChunk=X;l.FogExp2=Ib;l.Fog=Jb;l.Scene=ld;l.LensFlare=Yd;l.Sprite=xc;l.LOD=yc;l.SkinnedMesh=nd;l.Skeleton=zc;l.Bone=md;l.Mesh=la;l.LineSegments=Q;l.LineLoop=od;l.Line=sa;l.Points=Kb;l.Group=Ac;l.VideoTexture=pd;l.DataTexture=db;l.CompressedTexture=Lb;l.CubeTexture=Xa;l.CanvasTexture=qd;l.DepthTexture=Bc;l.Texture=ba;l.CompressedTextureLoader=Oe;l.DataTextureLoader=$d;l.CubeTextureLoader=ae;l.TextureLoader=rd;l.ObjectLoader=
-Pe;l.MaterialLoader=Gd;l.BufferGeometryLoader=be;l.DefaultLoadingManager=va;l.LoadingManager=Zd;l.JSONLoader=ce;l.ImageLoader=Sc;l.FontLoader=Re;l.FileLoader=Ka;l.Loader=ec;l.Cache=ed;l.AudioLoader=fe;l.SpotLightShadow=td;l.SpotLight=ud;l.PointLight=vd;l.RectAreaLight=zd;l.HemisphereLight=sd;l.DirectionalLightShadow=wd;l.DirectionalLight=xd;l.AmbientLight=yd;l.LightShadow=tb;l.Light=na;l.StereoCamera=Se;l.PerspectiveCamera=qa;l.OrthographicCamera=Fb;l.CubeCamera=Hd;l.ArrayCamera=kd;l.Camera=Na;l.AudioListener=
-ge;l.PositionalAudio=ie;l.AudioContext=he;l.AudioAnalyser=je;l.Audio=hc;l.VectorKeyframeTrack=cc;l.StringKeyframeTrack=Dd;l.QuaternionKeyframeTrack=Uc;l.NumberKeyframeTrack=dc;l.ColorKeyframeTrack=Fd;l.BooleanKeyframeTrack=Ed;l.PropertyMixer=ke;l.PropertyBinding=ha;l.KeyframeTrack=vb;l.AnimationUtils=ia;l.AnimationObjectGroup=Ue;l.AnimationMixer=We;l.AnimationClip=Da;l.Uniform=Id;l.InstancedBufferGeometry=le;l.BufferGeometry=E;l.GeometryIdCount=function(){return Rd++};l.Geometry=J;l.InterleavedBufferAttribute=
-me;l.InstancedInterleavedBuffer=ne;l.InterleavedBuffer=ic;l.InstancedBufferAttribute=oe;l.Face3=Sa;l.Object3D=z;l.Raycaster=Xe;l.Layers=Qd;l.EventDispatcher=xa;l.Clock=Ze;l.QuaternionLinearInterpolant=Cd;l.LinearInterpolant=Tc;l.DiscreteInterpolant=Bd;l.CubicInterpolant=Ad;l.Interpolant=wa;l.Triangle=Ta;l.Math=Y;l.Spherical=$e;l.Cylindrical=af;l.Plane=Aa;l.Frustum=gd;l.Sphere=Ea;l.Ray=kb;l.Matrix4=K;l.Matrix3=Ba;l.Box3=Ra;l.Box2=fd;l.Line3=Hb;l.Euler=ab;l.Vector4=fa;l.Vector3=n;l.Vector2=C;l.Quaternion=
-oa;l.Color=G;l.MorphBlendMesh=ta;l.ImmediateRenderObject=Xc;l.VertexNormalsHelper=Yc;l.SpotLightHelper=jc;l.SkeletonHelper=kc;l.PointLightHelper=lc;l.RectAreaLightHelper=mc;l.HemisphereLightHelper=nc;l.GridHelper=Zc;l.PolarGridHelper=Jd;l.FaceNormalsHelper=$c;l.DirectionalLightHelper=oc;l.CameraHelper=ad;l.BoxHelper=Ab;l.ArrowHelper=Bb;l.AxisHelper=Ld;l.CatmullRomCurve3=La;l.CubicBezierCurve3=bd;l.QuadraticBezierCurve3=cd;l.LineCurve3=dd;l.ArcCurve=Md;l.EllipseCurve=Va;l.SplineCurve=yb;l.CubicBezierCurve=
-fc;l.QuadraticBezierCurve=gc;l.LineCurve=Qa;l.Shape=zb;l.Path=Wc;l.ShapePath=de;l.Font=ee;l.CurvePath=Vc;l.Curve=ua;l.ShapeUtils=Ia;l.SceneUtils={createMultiMaterialObject:function(a,b){for(var c=new Ac,d=0,e=b.length;d<e;d++)c.add(new la(a,b[d]));return c},detach:function(a,b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){a.applyMatrix((new K).getInverse(c.matrixWorld));b.remove(a);c.add(a)}};l.WireframeGeometry=Mb;l.ParametricGeometry=Cc;l.ParametricBufferGeometry=
-Nb;l.TetrahedronGeometry=Ec;l.TetrahedronBufferGeometry=Ob;l.OctahedronGeometry=Fc;l.OctahedronBufferGeometry=lb;l.IcosahedronGeometry=Gc;l.IcosahedronBufferGeometry=Pb;l.DodecahedronGeometry=Hc;l.DodecahedronBufferGeometry=Qb;l.PolyhedronGeometry=Dc;l.PolyhedronBufferGeometry=za;l.TubeGeometry=Ic;l.TubeBufferGeometry=Rb;l.TorusKnotGeometry=Jc;l.TorusKnotBufferGeometry=Sb;l.TorusGeometry=Kc;l.TorusBufferGeometry=Tb;l.TextGeometry=Lc;l.TextBufferGeometry=Ub;l.SphereGeometry=Mc;l.SphereBufferGeometry=
-mb;l.RingGeometry=Nc;l.RingBufferGeometry=Vb;l.PlaneGeometry=vc;l.PlaneBufferGeometry=jb;l.LatheGeometry=Oc;l.LatheBufferGeometry=Wb;l.ShapeGeometry=Xb;l.ShapeBufferGeometry=Yb;l.ExtrudeGeometry=cb;l.ExtrudeBufferGeometry=Ga;l.EdgesGeometry=Zb;l.ConeGeometry=Pc;l.ConeBufferGeometry=Qc;l.CylinderGeometry=nb;l.CylinderBufferGeometry=Ua;l.CircleGeometry=Rc;l.CircleBufferGeometry=$b;l.BoxGeometry=Gb;l.BoxBufferGeometry=ib;l.ShadowMaterial=ac;l.SpriteMaterial=bb;l.RawShaderMaterial=bc;l.ShaderMaterial=
-ra;l.PointsMaterial=Fa;l.MeshPhysicalMaterial=ob;l.MeshStandardMaterial=Pa;l.MeshPhongMaterial=Ja;l.MeshToonMaterial=pb;l.MeshNormalMaterial=qb;l.MeshLambertMaterial=rb;l.MeshDepthMaterial=Za;l.MeshBasicMaterial=ya;l.LineDashedMaterial=sb;l.LineBasicMaterial=ea;l.Material=U;l.Float64BufferAttribute=uc;l.Float32BufferAttribute=B;l.Uint32BufferAttribute=hb;l.Int32BufferAttribute=tc;l.Uint16BufferAttribute=gb;l.Int16BufferAttribute=sc;l.Uint8ClampedBufferAttribute=rc;l.Uint8BufferAttribute=qc;l.Int8BufferAttribute=
-pc;l.BufferAttribute=Z;l.REVISION="86";l.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2};l.CullFaceNone=0;l.CullFaceBack=1;l.CullFaceFront=2;l.CullFaceFrontBack=3;l.FrontFaceDirectionCW=0;l.FrontFaceDirectionCCW=1;l.BasicShadowMap=0;l.PCFShadowMap=1;l.PCFSoftShadowMap=2;l.FrontSide=0;l.BackSide=1;l.DoubleSide=2;l.FlatShading=1;l.SmoothShading=2;l.NoColors=0;l.FaceColors=1;l.VertexColors=2;l.NoBlending=0;l.NormalBlending=1;l.AdditiveBlending=2;l.SubtractiveBlending=3;l.MultiplyBlending=4;l.CustomBlending=5;l.AddEquation=
-100;l.SubtractEquation=101;l.ReverseSubtractEquation=102;l.MinEquation=103;l.MaxEquation=104;l.ZeroFactor=200;l.OneFactor=201;l.SrcColorFactor=202;l.OneMinusSrcColorFactor=203;l.SrcAlphaFactor=204;l.OneMinusSrcAlphaFactor=205;l.DstAlphaFactor=206;l.OneMinusDstAlphaFactor=207;l.DstColorFactor=208;l.OneMinusDstColorFactor=209;l.SrcAlphaSaturateFactor=210;l.NeverDepth=0;l.AlwaysDepth=1;l.LessDepth=2;l.LessEqualDepth=3;l.EqualDepth=4;l.GreaterEqualDepth=5;l.GreaterDepth=6;l.NotEqualDepth=7;l.MultiplyOperation=
-0;l.MixOperation=1;l.AddOperation=2;l.NoToneMapping=0;l.LinearToneMapping=1;l.ReinhardToneMapping=2;l.Uncharted2ToneMapping=3;l.CineonToneMapping=4;l.UVMapping=300;l.CubeReflectionMapping=301;l.CubeRefractionMapping=302;l.EquirectangularReflectionMapping=303;l.EquirectangularRefractionMapping=304;l.SphericalReflectionMapping=305;l.CubeUVReflectionMapping=306;l.CubeUVRefractionMapping=307;l.RepeatWrapping=1E3;l.ClampToEdgeWrapping=1001;l.MirroredRepeatWrapping=1002;l.NearestFilter=1003;l.NearestMipMapNearestFilter=
-1004;l.NearestMipMapLinearFilter=1005;l.LinearFilter=1006;l.LinearMipMapNearestFilter=1007;l.LinearMipMapLinearFilter=1008;l.UnsignedByteType=1009;l.ByteType=1010;l.ShortType=1011;l.UnsignedShortType=1012;l.IntType=1013;l.UnsignedIntType=1014;l.FloatType=1015;l.HalfFloatType=1016;l.UnsignedShort4444Type=1017;l.UnsignedShort5551Type=1018;l.UnsignedShort565Type=1019;l.UnsignedInt248Type=1020;l.AlphaFormat=1021;l.RGBFormat=1022;l.RGBAFormat=1023;l.LuminanceFormat=1024;l.LuminanceAlphaFormat=1025;l.RGBEFormat=
-1023;l.DepthFormat=1026;l.DepthStencilFormat=1027;l.RGB_S3TC_DXT1_Format=2001;l.RGBA_S3TC_DXT1_Format=2002;l.RGBA_S3TC_DXT3_Format=2003;l.RGBA_S3TC_DXT5_Format=2004;l.RGB_PVRTC_4BPPV1_Format=2100;l.RGB_PVRTC_2BPPV1_Format=2101;l.RGBA_PVRTC_4BPPV1_Format=2102;l.RGBA_PVRTC_2BPPV1_Format=2103;l.RGB_ETC1_Format=2151;l.LoopOnce=2200;l.LoopRepeat=2201;l.LoopPingPong=2202;l.InterpolateDiscrete=2300;l.InterpolateLinear=2301;l.InterpolateSmooth=2302;l.ZeroCurvatureEnding=2400;l.ZeroSlopeEnding=2401;l.WrapAroundEnding=
-2402;l.TrianglesDrawMode=0;l.TriangleStripDrawMode=1;l.TriangleFanDrawMode=2;l.LinearEncoding=3E3;l.sRGBEncoding=3001;l.GammaEncoding=3007;l.RGBEEncoding=3002;l.LogLuvEncoding=3003;l.RGBM7Encoding=3004;l.RGBM16Encoding=3005;l.RGBDEncoding=3006;l.BasicDepthPacking=3200;l.RGBADepthPacking=3201;l.CubeGeometry=Gb;l.Face4=function(a,b,c,d,e,f,g){console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead.");return new Sa(a,b,c,e,f,g)};l.LineStrip=0;l.LinePieces=1;l.MeshFaceMaterial=
-function(a){console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead.");return a};l.MultiMaterial=function(a){void 0===a&&(a=[]);console.warn("THREE.MultiMaterial has been removed. Use an Array instead.");a.isMultiMaterial=!0;a.materials=a;a.clone=function(){return a.slice()};return a};l.PointCloud=function(a,b){console.warn("THREE.PointCloud has been renamed to THREE.Points.");return new Kb(a,b)};l.Particle=function(a){console.warn("THREE.Particle has been renamed to THREE.Sprite.");
-return new xc(a)};l.ParticleSystem=function(a,b){console.warn("THREE.ParticleSystem has been renamed to THREE.Points.");return new Kb(a,b)};l.PointCloudMaterial=function(a){console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.");return new Fa(a)};l.ParticleBasicMaterial=function(a){console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.");return new Fa(a)};l.ParticleSystemMaterial=function(a){console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.");
-return new Fa(a)};l.Vertex=function(a,b,c){console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead.");return new n(a,b,c)};l.DynamicBufferAttribute=function(a,b){console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.");return(new Z(a,b)).setDynamic(!0)};l.Int8Attribute=function(a,b){console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.");return new pc(a,b)};l.Uint8Attribute=
-function(a,b){console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.");return new qc(a,b)};l.Uint8ClampedAttribute=function(a,b){console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.");return new rc(a,b)};l.Int16Attribute=function(a,b){console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.");return new sc(a,b)};l.Uint16Attribute=function(a,b){console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.");
-return new gb(a,b)};l.Int32Attribute=function(a,b){console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.");return new tc(a,b)};l.Uint32Attribute=function(a,b){console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.");return new hb(a,b)};l.Float32Attribute=function(a,b){console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.");return new B(a,b)};l.Float64Attribute=
-function(a,b){console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.");return new uc(a,b)};l.ClosedSplineCurve3=cf;l.SplineCurve3=df;l.Spline=se;l.BoundingBoxHelper=function(a,b){console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.");return new Ab(a,b)};l.EdgesHelper=function(a,b){console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.");return new Q(new Zb(a.geometry),new ea({color:void 0!==
-b?b:16777215}))};l.WireframeHelper=function(a,b){console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.");return new Q(new Mb(a.geometry),new ea({color:void 0!==b?b:16777215}))};l.XHRLoader=function(a){console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader.");return new Ka(a)};l.BinaryTextureLoader=function(a){console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.");return new $d(a)};l.GeometryUtils={merge:function(a,b,
-c){console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.");var d;b.isMesh&&(b.matrixAutoUpdate&&b.updateMatrix(),d=b.matrix,b=b.geometry);a.merge(b,d,c)},center:function(a){console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.");return a.center()}};l.ImageUtils={crossOrigin:void 0,loadTexture:function(a,b,c,d){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");
-var e=new rd;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},loadTextureCube:function(a,b,c,d){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");var e=new ae;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},loadCompressedTexture:function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},loadCompressedTextureCube:function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")}};
-l.Projector=function(){console.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js.");this.projectVector=function(a,b){console.warn("THREE.Projector: .projectVector() is now vector.project().");a.project(b)};this.unprojectVector=function(a,b){console.warn("THREE.Projector: .unprojectVector() is now vector.unproject().");a.unproject(b)};this.pickingRay=function(){console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")}};l.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js");
-this.domElement=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");this.clear=function(){};this.render=function(){};this.setClearColor=function(){};this.setSize=function(){}};Object.defineProperty(l,"__esModule",{value:!0})});
-
-},{}],177:[function(require,module,exports){
-'use strict';
-
-module.exports = TinyQueue;
-
-function TinyQueue(data, compare) {
-    if (!(this instanceof TinyQueue)) return new TinyQueue(data, compare);
-
-    this.data = data || [];
-    this.length = this.data.length;
-    this.compare = compare || defaultCompare;
-
-    if (this.length > 0) {
-        for (var i = (this.length >> 1); i >= 0; i--) this._down(i);
-    }
-}
-
-function defaultCompare(a, b) {
-    return a < b ? -1 : a > b ? 1 : 0;
-}
-
-TinyQueue.prototype = {
-
-    push: function (item) {
-        this.data.push(item);
-        this.length++;
-        this._up(this.length - 1);
     },
 
-    pop: function () {
-        if (this.length === 0) return undefined;
-        var top = this.data[0];
-        this.length--;
-        if (this.length > 0) {
-            this.data[0] = this.data[this.length];
-            this._down(0);
-        }
-        this.data.pop();
-        return top;
+    finish: function() {
+        this.length = this.pos;
+        this.pos = 0;
+        return this.buf.subarray(0, this.length);
     },
 
-    peek: function () {
-        return this.data[0];
+    writeFixed32: function(val) {
+        this.realloc(4);
+        writeInt32(this.buf, val, this.pos);
+        this.pos += 4;
     },
 
-    _up: function (pos) {
-        var data = this.data;
-        var compare = this.compare;
-        var item = data[pos];
-
-        while (pos > 0) {
-            var parent = (pos - 1) >> 1;
-            var current = data[parent];
-            if (compare(item, current) >= 0) break;
-            data[pos] = current;
-            pos = parent;
-        }
-
-        data[pos] = item;
+    writeSFixed32: function(val) {
+        this.realloc(4);
+        writeInt32(this.buf, val, this.pos);
+        this.pos += 4;
     },
 
-    _down: function (pos) {
-        var data = this.data;
-        var compare = this.compare;
-        var len = this.length;
-        var halfLen = len >> 1;
-        var item = data[pos];
+    writeFixed64: function(val) {
+        this.realloc(8);
+        writeInt32(this.buf, val & -1, this.pos);
+        writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
+        this.pos += 8;
+    },
 
-        while (pos < halfLen) {
-            var left = (pos << 1) + 1;
-            var right = left + 1;
-            var best = data[left];
+    writeSFixed64: function(val) {
+        this.realloc(8);
+        writeInt32(this.buf, val & -1, this.pos);
+        writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
+        this.pos += 8;
+    },
 
-            if (right < len && compare(data[right], best) < 0) {
-                left = right;
-                best = data[right];
-            }
-            if (compare(best, item) >= 0) break;
+    writeVarint: function(val) {
+        val = +val || 0;
 
-            data[pos] = best;
-            pos = left;
+        if (val > 0xfffffff || val < 0) {
+            writeBigVarint(val, this);
+            return;
         }
 
-        data[pos] = item;
-    }
-};
+        this.realloc(4);
 
-},{}],178:[function(require,module,exports){
-//     Underscore.js 1.8.3
-//     http://underscorejs.org
-//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
-//     Underscore may be freely distributed under the MIT license.
-
-(function() {
-
-  // Baseline setup
-  // --------------
-
-  // Establish the root object, `window` in the browser, or `exports` on the server.
-  var root = this;
-
-  // Save the previous value of the `_` variable.
-  var previousUnderscore = root._;
-
-  // Save bytes in the minified (but not gzipped) version:
-  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
-
-  // Create quick reference variables for speed access to core prototypes.
-  var
-    push             = ArrayProto.push,
-    slice            = ArrayProto.slice,
-    toString         = ObjProto.toString,
-    hasOwnProperty   = ObjProto.hasOwnProperty;
-
-  // All **ECMAScript 5** native function implementations that we hope to use
-  // are declared here.
-  var
-    nativeIsArray      = Array.isArray,
-    nativeKeys         = Object.keys,
-    nativeBind         = FuncProto.bind,
-    nativeCreate       = Object.create;
-
-  // Naked function reference for surrogate-prototype-swapping.
-  var Ctor = function(){};
-
-  // Create a safe reference to the Underscore object for use below.
-  var _ = function(obj) {
-    if (obj instanceof _) return obj;
-    if (!(this instanceof _)) return new _(obj);
-    this._wrapped = obj;
-  };
+        this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
+        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
+        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
+        this.buf[this.pos++] =   (val >>> 7) & 0x7f;
+    },
 
-  // Export the Underscore object for **Node.js**, with
-  // backwards-compatibility for the old `require()` API. If we're in
-  // the browser, add `_` as a global object.
-  if (typeof exports !== 'undefined') {
-    if (typeof module !== 'undefined' && module.exports) {
-      exports = module.exports = _;
-    }
-    exports._ = _;
-  } else {
-    root._ = _;
-  }
+    writeSVarint: function(val) {
+        this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
+    },
 
-  // Current version.
-  _.VERSION = '1.8.3';
+    writeBoolean: function(val) {
+        this.writeVarint(Boolean(val));
+    },
 
-  // Internal function that returns an efficient (for current engines) version
-  // of the passed-in callback, to be repeatedly applied in other Underscore
-  // functions.
-  var optimizeCb = function(func, context, argCount) {
-    if (context === void 0) return func;
-    switch (argCount == null ? 3 : argCount) {
-      case 1: return function(value) {
-        return func.call(context, value);
-      };
-      case 2: return function(value, other) {
-        return func.call(context, value, other);
-      };
-      case 3: return function(value, index, collection) {
-        return func.call(context, value, index, collection);
-      };
-      case 4: return function(accumulator, value, index, collection) {
-        return func.call(context, accumulator, value, index, collection);
-      };
-    }
-    return function() {
-      return func.apply(context, arguments);
-    };
-  };
+    writeString: function(str) {
+        str = String(str);
+        this.realloc(str.length * 4);
 
-  // A mostly-internal function to generate callbacks that can be applied
-  // to each element in a collection, returning the desired result — either
-  // identity, an arbitrary callback, a property matcher, or a property accessor.
-  var cb = function(value, context, argCount) {
-    if (value == null) return _.identity;
-    if (_.isFunction(value)) return optimizeCb(value, context, argCount);
-    if (_.isObject(value)) return _.matcher(value);
-    return _.property(value);
-  };
-  _.iteratee = function(value, context) {
-    return cb(value, context, Infinity);
-  };
+        this.pos++; // reserve 1 byte for short string length
 
-  // An internal function for creating assigner functions.
-  var createAssigner = function(keysFunc, undefinedOnly) {
-    return function(obj) {
-      var length = arguments.length;
-      if (length < 2 || obj == null) return obj;
-      for (var index = 1; index < length; index++) {
-        var source = arguments[index],
-            keys = keysFunc(source),
-            l = keys.length;
-        for (var i = 0; i < l; i++) {
-          var key = keys[i];
-          if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
-        }
-      }
-      return obj;
-    };
-  };
+        var startPos = this.pos;
+        // write the string directly to the buffer and see how much was written
+        this.pos = writeUtf8(this.buf, str, this.pos);
+        var len = this.pos - startPos;
 
-  // An internal function for creating a new object that inherits from another.
-  var baseCreate = function(prototype) {
-    if (!_.isObject(prototype)) return {};
-    if (nativeCreate) return nativeCreate(prototype);
-    Ctor.prototype = prototype;
-    var result = new Ctor;
-    Ctor.prototype = null;
-    return result;
-  };
+        if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
 
-  var property = function(key) {
-    return function(obj) {
-      return obj == null ? void 0 : obj[key];
-    };
-  };
+        // finally, write the message length in the reserved place and restore the position
+        this.pos = startPos - 1;
+        this.writeVarint(len);
+        this.pos += len;
+    },
 
-  // Helper for collection methods to determine whether a collection
-  // should be iterated as an array or as an object
-  // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
-  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
-  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
-  var getLength = property('length');
-  var isArrayLike = function(collection) {
-    var length = getLength(collection);
-    return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
-  };
+    writeFloat: function(val) {
+        this.realloc(4);
+        ieee754.write(this.buf, val, this.pos, true, 23, 4);
+        this.pos += 4;
+    },
 
-  // Collection Functions
-  // --------------------
-
-  // The cornerstone, an `each` implementation, aka `forEach`.
-  // Handles raw objects in addition to array-likes. Treats all
-  // sparse array-likes as if they were dense.
-  _.each = _.forEach = function(obj, iteratee, context) {
-    iteratee = optimizeCb(iteratee, context);
-    var i, length;
-    if (isArrayLike(obj)) {
-      for (i = 0, length = obj.length; i < length; i++) {
-        iteratee(obj[i], i, obj);
-      }
-    } else {
-      var keys = _.keys(obj);
-      for (i = 0, length = keys.length; i < length; i++) {
-        iteratee(obj[keys[i]], keys[i], obj);
-      }
-    }
-    return obj;
-  };
+    writeDouble: function(val) {
+        this.realloc(8);
+        ieee754.write(this.buf, val, this.pos, true, 52, 8);
+        this.pos += 8;
+    },
 
-  // Return the results of applying the iteratee to each element.
-  _.map = _.collect = function(obj, iteratee, context) {
-    iteratee = cb(iteratee, context);
-    var keys = !isArrayLike(obj) && _.keys(obj),
-        length = (keys || obj).length,
-        results = Array(length);
-    for (var index = 0; index < length; index++) {
-      var currentKey = keys ? keys[index] : index;
-      results[index] = iteratee(obj[currentKey], currentKey, obj);
-    }
-    return results;
-  };
+    writeBytes: function(buffer) {
+        var len = buffer.length;
+        this.writeVarint(len);
+        this.realloc(len);
+        for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
+    },
 
-  // Create a reducing function iterating left or right.
-  function createReduce(dir) {
-    // Optimized iterator function as using arguments.length
-    // in the main function will deoptimize the, see #1991.
-    function iterator(obj, iteratee, memo, keys, index, length) {
-      for (; index >= 0 && index < length; index += dir) {
-        var currentKey = keys ? keys[index] : index;
-        memo = iteratee(memo, obj[currentKey], currentKey, obj);
-      }
-      return memo;
-    }
-
-    return function(obj, iteratee, memo, context) {
-      iteratee = optimizeCb(iteratee, context, 4);
-      var keys = !isArrayLike(obj) && _.keys(obj),
-          length = (keys || obj).length,
-          index = dir > 0 ? 0 : length - 1;
-      // Determine the initial value if none is provided.
-      if (arguments.length < 3) {
-        memo = obj[keys ? keys[index] : index];
-        index += dir;
-      }
-      return iterator(obj, iteratee, memo, keys, index, length);
-    };
-  }
+    writeRawMessage: function(fn, obj) {
+        this.pos++; // reserve 1 byte for short message length
 
-  // **Reduce** builds up a single result from a list of values, aka `inject`,
-  // or `foldl`.
-  _.reduce = _.foldl = _.inject = createReduce(1);
+        // write the message directly to the buffer and see how much was written
+        var startPos = this.pos;
+        fn(obj, this);
+        var len = this.pos - startPos;
 
-  // The right-associative version of reduce, also known as `foldr`.
-  _.reduceRight = _.foldr = createReduce(-1);
+        if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
 
-  // Return the first value which passes a truth test. Aliased as `detect`.
-  _.find = _.detect = function(obj, predicate, context) {
-    var key;
-    if (isArrayLike(obj)) {
-      key = _.findIndex(obj, predicate, context);
-    } else {
-      key = _.findKey(obj, predicate, context);
-    }
-    if (key !== void 0 && key !== -1) return obj[key];
-  };
+        // finally, write the message length in the reserved place and restore the position
+        this.pos = startPos - 1;
+        this.writeVarint(len);
+        this.pos += len;
+    },
 
-  // Return all the elements that pass a truth test.
-  // Aliased as `select`.
-  _.filter = _.select = function(obj, predicate, context) {
-    var results = [];
-    predicate = cb(predicate, context);
-    _.each(obj, function(value, index, list) {
-      if (predicate(value, index, list)) results.push(value);
-    });
-    return results;
-  };
+    writeMessage: function(tag, fn, obj) {
+        this.writeTag(tag, Pbf.Bytes);
+        this.writeRawMessage(fn, obj);
+    },
 
-  // Return all the elements for which a truth test fails.
-  _.reject = function(obj, predicate, context) {
-    return _.filter(obj, _.negate(cb(predicate)), context);
-  };
+    writePackedVarint:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedVarint, arr);   },
+    writePackedSVarint:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSVarint, arr);  },
+    writePackedBoolean:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedBoolean, arr);  },
+    writePackedFloat:    function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFloat, arr);    },
+    writePackedDouble:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedDouble, arr);   },
+    writePackedFixed32:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed32, arr);  },
+    writePackedSFixed32: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed32, arr); },
+    writePackedFixed64:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed64, arr);  },
+    writePackedSFixed64: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed64, arr); },
 
-  // Determine whether all of the elements match a truth test.
-  // Aliased as `all`.
-  _.every = _.all = function(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var keys = !isArrayLike(obj) && _.keys(obj),
-        length = (keys || obj).length;
-    for (var index = 0; index < length; index++) {
-      var currentKey = keys ? keys[index] : index;
-      if (!predicate(obj[currentKey], currentKey, obj)) return false;
+    writeBytesField: function(tag, buffer) {
+        this.writeTag(tag, Pbf.Bytes);
+        this.writeBytes(buffer);
+    },
+    writeFixed32Field: function(tag, val) {
+        this.writeTag(tag, Pbf.Fixed32);
+        this.writeFixed32(val);
+    },
+    writeSFixed32Field: function(tag, val) {
+        this.writeTag(tag, Pbf.Fixed32);
+        this.writeSFixed32(val);
+    },
+    writeFixed64Field: function(tag, val) {
+        this.writeTag(tag, Pbf.Fixed64);
+        this.writeFixed64(val);
+    },
+    writeSFixed64Field: function(tag, val) {
+        this.writeTag(tag, Pbf.Fixed64);
+        this.writeSFixed64(val);
+    },
+    writeVarintField: function(tag, val) {
+        this.writeTag(tag, Pbf.Varint);
+        this.writeVarint(val);
+    },
+    writeSVarintField: function(tag, val) {
+        this.writeTag(tag, Pbf.Varint);
+        this.writeSVarint(val);
+    },
+    writeStringField: function(tag, str) {
+        this.writeTag(tag, Pbf.Bytes);
+        this.writeString(str);
+    },
+    writeFloatField: function(tag, val) {
+        this.writeTag(tag, Pbf.Fixed32);
+        this.writeFloat(val);
+    },
+    writeDoubleField: function(tag, val) {
+        this.writeTag(tag, Pbf.Fixed64);
+        this.writeDouble(val);
+    },
+    writeBooleanField: function(tag, val) {
+        this.writeVarintField(tag, Boolean(val));
     }
-    return true;
-  };
+};
 
-  // Determine if at least one element in the object matches a truth test.
-  // Aliased as `any`.
-  _.some = _.any = function(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var keys = !isArrayLike(obj) && _.keys(obj),
-        length = (keys || obj).length;
-    for (var index = 0; index < length; index++) {
-      var currentKey = keys ? keys[index] : index;
-      if (predicate(obj[currentKey], currentKey, obj)) return true;
-    }
-    return false;
-  };
+function readVarintRemainder(l, s, p) {
+    var buf = p.buf,
+        h, b;
 
-  // Determine if the array or object contains a given item (using `===`).
-  // Aliased as `includes` and `include`.
-  _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
-    if (!isArrayLike(obj)) obj = _.values(obj);
-    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
-    return _.indexOf(obj, item, fromIndex) >= 0;
-  };
+    b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
+    b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
+    b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
+    b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
+    b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
+    b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
 
-  // Invoke a method (with arguments) on every item in a collection.
-  _.invoke = function(obj, method) {
-    var args = slice.call(arguments, 2);
-    var isFunc = _.isFunction(method);
-    return _.map(obj, function(value) {
-      var func = isFunc ? method : value[method];
-      return func == null ? func : func.apply(value, args);
-    });
-  };
+    throw new Error('Expected varint not more than 10 bytes');
+}
 
-  // Convenience version of a common use case of `map`: fetching a property.
-  _.pluck = function(obj, key) {
-    return _.map(obj, _.property(key));
-  };
+function readPackedEnd(pbf) {
+    return pbf.type === Pbf.Bytes ?
+        pbf.readVarint() + pbf.pos : pbf.pos + 1;
+}
 
-  // Convenience version of a common use case of `filter`: selecting only objects
-  // containing specific `key:value` pairs.
-  _.where = function(obj, attrs) {
-    return _.filter(obj, _.matcher(attrs));
-  };
+function toNum(low, high, isSigned) {
+    if (isSigned) {
+        return high * 0x100000000 + (low >>> 0);
+    }
 
-  // Convenience version of a common use case of `find`: getting the first object
-  // containing specific `key:value` pairs.
-  _.findWhere = function(obj, attrs) {
-    return _.find(obj, _.matcher(attrs));
-  };
+    return ((high >>> 0) * 0x100000000) + (low >>> 0);
+}
 
-  // Return the maximum element (or element-based computation).
-  _.max = function(obj, iteratee, context) {
-    var result = -Infinity, lastComputed = -Infinity,
-        value, computed;
-    if (iteratee == null && obj != null) {
-      obj = isArrayLike(obj) ? obj : _.values(obj);
-      for (var i = 0, length = obj.length; i < length; i++) {
-        value = obj[i];
-        if (value > result) {
-          result = value;
-        }
-      }
-    } else {
-      iteratee = cb(iteratee, context);
-      _.each(obj, function(value, index, list) {
-        computed = iteratee(value, index, list);
-        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
-          result = value;
-          lastComputed = computed;
-        }
-      });
-    }
-    return result;
-  };
+function writeBigVarint(val, pbf) {
+    var low, high;
 
-  // Return the minimum element (or element-based computation).
-  _.min = function(obj, iteratee, context) {
-    var result = Infinity, lastComputed = Infinity,
-        value, computed;
-    if (iteratee == null && obj != null) {
-      obj = isArrayLike(obj) ? obj : _.values(obj);
-      for (var i = 0, length = obj.length; i < length; i++) {
-        value = obj[i];
-        if (value < result) {
-          result = value;
-        }
-      }
+    if (val >= 0) {
+        low  = (val % 0x100000000) | 0;
+        high = (val / 0x100000000) | 0;
     } else {
-      iteratee = cb(iteratee, context);
-      _.each(obj, function(value, index, list) {
-        computed = iteratee(value, index, list);
-        if (computed < lastComputed || computed === Infinity && result === Infinity) {
-          result = value;
-          lastComputed = computed;
+        low  = ~(-val % 0x100000000);
+        high = ~(-val / 0x100000000);
+
+        if (low ^ 0xffffffff) {
+            low = (low + 1) | 0;
+        } else {
+            low = 0;
+            high = (high + 1) | 0;
         }
-      });
     }
-    return result;
-  };
-
-  // Shuffle a collection, using the modern version of the
-  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
-  _.shuffle = function(obj) {
-    var set = isArrayLike(obj) ? obj : _.values(obj);
-    var length = set.length;
-    var shuffled = Array(length);
-    for (var index = 0, rand; index < length; index++) {
-      rand = _.random(0, index);
-      if (rand !== index) shuffled[index] = shuffled[rand];
-      shuffled[rand] = set[index];
-    }
-    return shuffled;
-  };
 
-  // Sample **n** random values from a collection.
-  // If **n** is not specified, returns a single random element.
-  // The internal `guard` argument allows it to work with `map`.
-  _.sample = function(obj, n, guard) {
-    if (n == null || guard) {
-      if (!isArrayLike(obj)) obj = _.values(obj);
-      return obj[_.random(obj.length - 1)];
+    if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
+        throw new Error('Given varint doesn\'t fit into 10 bytes');
     }
-    return _.shuffle(obj).slice(0, Math.max(0, n));
-  };
 
-  // Sort the object's values by a criterion produced by an iteratee.
-  _.sortBy = function(obj, iteratee, context) {
-    iteratee = cb(iteratee, context);
-    return _.pluck(_.map(obj, function(value, index, list) {
-      return {
-        value: value,
-        index: index,
-        criteria: iteratee(value, index, list)
-      };
-    }).sort(function(left, right) {
-      var a = left.criteria;
-      var b = right.criteria;
-      if (a !== b) {
-        if (a > b || a === void 0) return 1;
-        if (a < b || b === void 0) return -1;
-      }
-      return left.index - right.index;
-    }), 'value');
-  };
+    pbf.realloc(10);
 
-  // An internal function used for aggregate "group by" operations.
-  var group = function(behavior) {
-    return function(obj, iteratee, context) {
-      var result = {};
-      iteratee = cb(iteratee, context);
-      _.each(obj, function(value, index) {
-        var key = iteratee(value, index, obj);
-        behavior(result, value, key);
-      });
-      return result;
-    };
-  };
+    writeBigVarintLow(low, high, pbf);
+    writeBigVarintHigh(high, pbf);
+}
 
-  // Groups the object's values by a criterion. Pass either a string attribute
-  // to group by, or a function that returns the criterion.
-  _.groupBy = group(function(result, value, key) {
-    if (_.has(result, key)) result[key].push(value); else result[key] = [value];
-  });
+function writeBigVarintLow(low, high, pbf) {
+    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
+    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
+    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
+    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
+    pbf.buf[pbf.pos]   = low & 0x7f;
+}
 
-  // Indexes the object's values by a criterion, similar to `groupBy`, but for
-  // when you know that your index values will be unique.
-  _.indexBy = group(function(result, value, key) {
-    result[key] = value;
-  });
+function writeBigVarintHigh(high, pbf) {
+    var lsb = (high & 0x07) << 4;
 
-  // Counts instances of an object that group by a certain criterion. Pass
-  // either a string attribute to count by, or a function that returns the
-  // criterion.
-  _.countBy = group(function(result, value, key) {
-    if (_.has(result, key)) result[key]++; else result[key] = 1;
-  });
+    pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
+    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
+    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
+    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
+    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
+    pbf.buf[pbf.pos++]  = high & 0x7f;
+}
 
-  // Safely create a real, live array from anything iterable.
-  _.toArray = function(obj) {
-    if (!obj) return [];
-    if (_.isArray(obj)) return slice.call(obj);
-    if (isArrayLike(obj)) return _.map(obj, _.identity);
-    return _.values(obj);
-  };
+function makeRoomForExtraLength(startPos, len, pbf) {
+    var extraLen =
+        len <= 0x3fff ? 1 :
+        len <= 0x1fffff ? 2 :
+        len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7));
 
-  // Return the number of elements in an object.
-  _.size = function(obj) {
-    if (obj == null) return 0;
-    return isArrayLike(obj) ? obj.length : _.keys(obj).length;
-  };
+    // if 1 byte isn't enough for encoding message length, shift the data to the right
+    pbf.realloc(extraLen);
+    for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
+}
 
-  // Split a collection into two arrays: one whose elements all satisfy the given
-  // predicate, and one whose elements all do not satisfy the predicate.
-  _.partition = function(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var pass = [], fail = [];
-    _.each(obj, function(value, key, obj) {
-      (predicate(value, key, obj) ? pass : fail).push(value);
-    });
-    return [pass, fail];
-  };
-
-  // Array Functions
-  // ---------------
-
-  // Get the first element of an array. Passing **n** will return the first N
-  // values in the array. Aliased as `head` and `take`. The **guard** check
-  // allows it to work with `_.map`.
-  _.first = _.head = _.take = function(array, n, guard) {
-    if (array == null) return void 0;
-    if (n == null || guard) return array[0];
-    return _.initial(array, array.length - n);
-  };
-
-  // Returns everything but the last entry of the array. Especially useful on
-  // the arguments object. Passing **n** will return all the values in
-  // the array, excluding the last N.
-  _.initial = function(array, n, guard) {
-    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
-  };
-
-  // Get the last element of an array. Passing **n** will return the last N
-  // values in the array.
-  _.last = function(array, n, guard) {
-    if (array == null) return void 0;
-    if (n == null || guard) return array[array.length - 1];
-    return _.rest(array, Math.max(0, array.length - n));
-  };
+function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
+function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
+function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
+function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
+function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
+function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
+function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
+function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
+function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
 
-  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
-  // Especially useful on the arguments object. Passing an **n** will return
-  // the rest N values in the array.
-  _.rest = _.tail = _.drop = function(array, n, guard) {
-    return slice.call(array, n == null || guard ? 1 : n);
-  };
+// Buffer code below from https://github.com/feross/buffer, MIT-licensed
 
-  // Trim out all falsy values from an array.
-  _.compact = function(array) {
-    return _.filter(array, _.identity);
-  };
+function readUInt32(buf, pos) {
+    return ((buf[pos]) |
+        (buf[pos + 1] << 8) |
+        (buf[pos + 2] << 16)) +
+        (buf[pos + 3] * 0x1000000);
+}
 
-  // Internal implementation of a recursive `flatten` function.
-  var flatten = function(input, shallow, strict, startIndex) {
-    var output = [], idx = 0;
-    for (var i = startIndex || 0, length = getLength(input); i < length; i++) {
-      var value = input[i];
-      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
-        //flatten current level of array or arguments object
-        if (!shallow) value = flatten(value, shallow, strict);
-        var j = 0, len = value.length;
-        output.length += len;
-        while (j < len) {
-          output[idx++] = value[j++];
-        }
-      } else if (!strict) {
-        output[idx++] = value;
-      }
-    }
-    return output;
-  };
+function writeInt32(buf, val, pos) {
+    buf[pos] = val;
+    buf[pos + 1] = (val >>> 8);
+    buf[pos + 2] = (val >>> 16);
+    buf[pos + 3] = (val >>> 24);
+}
 
-  // Flatten out an array, either recursively (by default), or just one level.
-  _.flatten = function(array, shallow) {
-    return flatten(array, shallow, false);
-  };
+function readInt32(buf, pos) {
+    return ((buf[pos]) |
+        (buf[pos + 1] << 8) |
+        (buf[pos + 2] << 16)) +
+        (buf[pos + 3] << 24);
+}
 
-  // Return a version of the array that does not contain the specified value(s).
-  _.without = function(array) {
-    return _.difference(array, slice.call(arguments, 1));
-  };
+function readUtf8(buf, pos, end) {
+    var str = '';
+    var i = pos;
 
-  // Produce a duplicate-free version of the array. If the array has already
-  // been sorted, you have the option of using a faster algorithm.
-  // Aliased as `unique`.
-  _.uniq = _.unique = function(array, isSorted, iteratee, context) {
-    if (!_.isBoolean(isSorted)) {
-      context = iteratee;
-      iteratee = isSorted;
-      isSorted = false;
-    }
-    if (iteratee != null) iteratee = cb(iteratee, context);
-    var result = [];
-    var seen = [];
-    for (var i = 0, length = getLength(array); i < length; i++) {
-      var value = array[i],
-          computed = iteratee ? iteratee(value, i, array) : value;
-      if (isSorted) {
-        if (!i || seen !== computed) result.push(value);
-        seen = computed;
-      } else if (iteratee) {
-        if (!_.contains(seen, computed)) {
-          seen.push(computed);
-          result.push(value);
-        }
-      } else if (!_.contains(result, value)) {
-        result.push(value);
-      }
-    }
-    return result;
-  };
+    while (i < end) {
+        var b0 = buf[i];
+        var c = null; // codepoint
+        var bytesPerSequence =
+            b0 > 0xEF ? 4 :
+            b0 > 0xDF ? 3 :
+            b0 > 0xBF ? 2 : 1;
 
-  // Produce an array that contains the union: each distinct element from all of
-  // the passed-in arrays.
-  _.union = function() {
-    return _.uniq(flatten(arguments, true, true));
-  };
+        if (i + bytesPerSequence > end) break;
 
-  // Produce an array that contains every item shared between all the
-  // passed-in arrays.
-  _.intersection = function(array) {
-    var result = [];
-    var argsLength = arguments.length;
-    for (var i = 0, length = getLength(array); i < length; i++) {
-      var item = array[i];
-      if (_.contains(result, item)) continue;
-      for (var j = 1; j < argsLength; j++) {
-        if (!_.contains(arguments[j], item)) break;
-      }
-      if (j === argsLength) result.push(item);
-    }
-    return result;
-  };
+        var b1, b2, b3;
 
-  // Take the difference between one array and a number of other arrays.
-  // Only the elements present in just the first array will remain.
-  _.difference = function(array) {
-    var rest = flatten(arguments, true, true, 1);
-    return _.filter(array, function(value){
-      return !_.contains(rest, value);
-    });
-  };
+        if (bytesPerSequence === 1) {
+            if (b0 < 0x80) {
+                c = b0;
+            }
+        } else if (bytesPerSequence === 2) {
+            b1 = buf[i + 1];
+            if ((b1 & 0xC0) === 0x80) {
+                c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
+                if (c <= 0x7F) {
+                    c = null;
+                }
+            }
+        } else if (bytesPerSequence === 3) {
+            b1 = buf[i + 1];
+            b2 = buf[i + 2];
+            if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
+                c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
+                if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
+                    c = null;
+                }
+            }
+        } else if (bytesPerSequence === 4) {
+            b1 = buf[i + 1];
+            b2 = buf[i + 2];
+            b3 = buf[i + 3];
+            if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
+                c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
+                if (c <= 0xFFFF || c >= 0x110000) {
+                    c = null;
+                }
+            }
+        }
 
-  // Zip together multiple lists into a single array -- elements that share
-  // an index go together.
-  _.zip = function() {
-    return _.unzip(arguments);
-  };
+        if (c === null) {
+            c = 0xFFFD;
+            bytesPerSequence = 1;
 
-  // Complement of _.zip. Unzip accepts an array of arrays and groups
-  // each array's elements on shared indices
-  _.unzip = function(array) {
-    var length = array && _.max(array, getLength).length || 0;
-    var result = Array(length);
+        } else if (c > 0xFFFF) {
+            c -= 0x10000;
+            str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
+            c = 0xDC00 | c & 0x3FF;
+        }
 
-    for (var index = 0; index < length; index++) {
-      result[index] = _.pluck(array, index);
+        str += String.fromCharCode(c);
+        i += bytesPerSequence;
     }
-    return result;
-  };
 
-  // Converts lists into objects. Pass either a single array of `[key, value]`
-  // pairs, or two parallel arrays of the same length -- one of keys, and one of
-  // the corresponding values.
-  _.object = function(list, values) {
-    var result = {};
-    for (var i = 0, length = getLength(list); i < length; i++) {
-      if (values) {
-        result[list[i]] = values[i];
-      } else {
-        result[list[i][0]] = list[i][1];
-      }
-    }
-    return result;
-  };
+    return str;
+}
 
-  // Generator function to create the findIndex and findLastIndex functions
-  function createPredicateIndexFinder(dir) {
-    return function(array, predicate, context) {
-      predicate = cb(predicate, context);
-      var length = getLength(array);
-      var index = dir > 0 ? 0 : length - 1;
-      for (; index >= 0 && index < length; index += dir) {
-        if (predicate(array[index], index, array)) return index;
-      }
-      return -1;
-    };
-  }
+function readUtf8TextDecoder(buf, pos, end) {
+    return utf8TextDecoder.decode(buf.subarray(pos, end));
+}
 
-  // Returns the first index on an array-like that passes a predicate test
-  _.findIndex = createPredicateIndexFinder(1);
-  _.findLastIndex = createPredicateIndexFinder(-1);
+function writeUtf8(buf, str, pos) {
+    for (var i = 0, c, lead; i < str.length; i++) {
+        c = str.charCodeAt(i); // code point
 
-  // Use a comparator function to figure out the smallest index at which
-  // an object should be inserted so as to maintain order. Uses binary search.
-  _.sortedIndex = function(array, obj, iteratee, context) {
-    iteratee = cb(iteratee, context, 1);
-    var value = iteratee(obj);
-    var low = 0, high = getLength(array);
-    while (low < high) {
-      var mid = Math.floor((low + high) / 2);
-      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
-    }
-    return low;
-  };
+        if (c > 0xD7FF && c < 0xE000) {
+            if (lead) {
+                if (c < 0xDC00) {
+                    buf[pos++] = 0xEF;
+                    buf[pos++] = 0xBF;
+                    buf[pos++] = 0xBD;
+                    lead = c;
+                    continue;
+                } else {
+                    c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
+                    lead = null;
+                }
+            } else {
+                if (c > 0xDBFF || (i + 1 === str.length)) {
+                    buf[pos++] = 0xEF;
+                    buf[pos++] = 0xBF;
+                    buf[pos++] = 0xBD;
+                } else {
+                    lead = c;
+                }
+                continue;
+            }
+        } else if (lead) {
+            buf[pos++] = 0xEF;
+            buf[pos++] = 0xBF;
+            buf[pos++] = 0xBD;
+            lead = null;
+        }
 
-  // Generator function to create the indexOf and lastIndexOf functions
-  function createIndexFinder(dir, predicateFind, sortedIndex) {
-    return function(array, item, idx) {
-      var i = 0, length = getLength(array);
-      if (typeof idx == 'number') {
-        if (dir > 0) {
-            i = idx >= 0 ? idx : Math.max(idx + length, i);
+        if (c < 0x80) {
+            buf[pos++] = c;
         } else {
-            length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
+            if (c < 0x800) {
+                buf[pos++] = c >> 0x6 | 0xC0;
+            } else {
+                if (c < 0x10000) {
+                    buf[pos++] = c >> 0xC | 0xE0;
+                } else {
+                    buf[pos++] = c >> 0x12 | 0xF0;
+                    buf[pos++] = c >> 0xC & 0x3F | 0x80;
+                }
+                buf[pos++] = c >> 0x6 & 0x3F | 0x80;
+            }
+            buf[pos++] = c & 0x3F | 0x80;
         }
-      } else if (sortedIndex && idx && length) {
-        idx = sortedIndex(array, item);
-        return array[idx] === item ? idx : -1;
-      }
-      if (item !== item) {
-        idx = predicateFind(slice.call(array, i, length), _.isNaN);
-        return idx >= 0 ? idx + i : -1;
-      }
-      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
-        if (array[idx] === item) return idx;
-      }
-      return -1;
-    };
-  }
-
-  // Return the position of the first occurrence of an item in an array,
-  // or -1 if the item is not included in the array.
-  // If the array is large and already in sort order, pass `true`
-  // for **isSorted** to use binary search.
-  _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
-  _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);
-
-  // Generate an integer Array containing an arithmetic progression. A port of
-  // the native Python `range()` function. See
-  // [the Python documentation](http://docs.python.org/library/functions.html#range).
-  _.range = function(start, stop, step) {
-    if (stop == null) {
-      stop = start || 0;
-      start = 0;
-    }
-    step = step || 1;
-
-    var length = Math.max(Math.ceil((stop - start) / step), 0);
-    var range = Array(length);
-
-    for (var idx = 0; idx < length; idx++, start += step) {
-      range[idx] = start;
     }
+    return pos;
+}
 
-    return range;
-  };
-
-  // Function (ahem) Functions
-  // ------------------
-
-  // Determines whether to execute a function as a constructor
-  // or a normal function with the provided arguments
-  var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
-    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
-    var self = baseCreate(sourceFunc.prototype);
-    var result = sourceFunc.apply(self, args);
-    if (_.isObject(result)) return result;
-    return self;
-  };
-
-  // Create a function bound to a given object (assigning `this`, and arguments,
-  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
-  // available.
-  _.bind = function(func, context) {
-    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
-    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
-    var args = slice.call(arguments, 2);
-    var bound = function() {
-      return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
-    };
-    return bound;
-  };
-
-  // Partially apply a function by creating a version that has had some of its
-  // arguments pre-filled, without changing its dynamic `this` context. _ acts
-  // as a placeholder, allowing any combination of arguments to be pre-filled.
-  _.partial = function(func) {
-    var boundArgs = slice.call(arguments, 1);
-    var bound = function() {
-      var position = 0, length = boundArgs.length;
-      var args = Array(length);
-      for (var i = 0; i < length; i++) {
-        args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];
-      }
-      while (position < arguments.length) args.push(arguments[position++]);
-      return executeBound(func, bound, this, this, args);
-    };
-    return bound;
-  };
-
-  // Bind a number of an object's methods to that object. Remaining arguments
-  // are the method names to be bound. Useful for ensuring that all callbacks
-  // defined on an object belong to it.
-  _.bindAll = function(obj) {
-    var i, length = arguments.length, key;
-    if (length <= 1) throw new Error('bindAll must be passed function names');
-    for (i = 1; i < length; i++) {
-      key = arguments[i];
-      obj[key] = _.bind(obj[key], obj);
-    }
-    return obj;
-  };
-
-  // Memoize an expensive function by storing its results.
-  _.memoize = function(func, hasher) {
-    var memoize = function(key) {
-      var cache = memoize.cache;
-      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
-      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
-      return cache[address];
-    };
-    memoize.cache = {};
-    return memoize;
-  };
-
-  // Delays a function for the given number of milliseconds, and then calls
-  // it with the arguments supplied.
-  _.delay = function(func, wait) {
-    var args = slice.call(arguments, 2);
-    return setTimeout(function(){
-      return func.apply(null, args);
-    }, wait);
-  };
-
-  // Defers a function, scheduling it to run after the current call stack has
-  // cleared.
-  _.defer = _.partial(_.delay, _, 1);
-
-  // Returns a function, that, when invoked, will only be triggered at most once
-  // during a given window of time. Normally, the throttled function will run
-  // as much as it can, without ever going more than once per `wait` duration;
-  // but if you'd like to disable the execution on the leading edge, pass
-  // `{leading: false}`. To disable execution on the trailing edge, ditto.
-  _.throttle = function(func, wait, options) {
-    var context, args, result;
-    var timeout = null;
-    var previous = 0;
-    if (!options) options = {};
-    var later = function() {
-      previous = options.leading === false ? 0 : _.now();
-      timeout = null;
-      result = func.apply(context, args);
-      if (!timeout) context = args = null;
-    };
-    return function() {
-      var now = _.now();
-      if (!previous && options.leading === false) previous = now;
-      var remaining = wait - (now - previous);
-      context = this;
-      args = arguments;
-      if (remaining <= 0 || remaining > wait) {
-        if (timeout) {
-          clearTimeout(timeout);
-          timeout = null;
-        }
-        previous = now;
-        result = func.apply(context, args);
-        if (!timeout) context = args = null;
-      } else if (!timeout && options.trailing !== false) {
-        timeout = setTimeout(later, remaining);
-      }
-      return result;
-    };
-  };
-
-  // Returns a function, that, as long as it continues to be invoked, will not
-  // be triggered. The function will be called after it stops being called for
-  // N milliseconds. If `immediate` is passed, trigger the function on the
-  // leading edge, instead of the trailing.
-  _.debounce = function(func, wait, immediate) {
-    var timeout, args, context, timestamp, result;
-
-    var later = function() {
-      var last = _.now() - timestamp;
-
-      if (last < wait && last >= 0) {
-        timeout = setTimeout(later, wait - last);
-      } else {
-        timeout = null;
-        if (!immediate) {
-          result = func.apply(context, args);
-          if (!timeout) context = args = null;
-        }
-      }
-    };
-
-    return function() {
-      context = this;
-      args = arguments;
-      timestamp = _.now();
-      var callNow = immediate && !timeout;
-      if (!timeout) timeout = setTimeout(later, wait);
-      if (callNow) {
-        result = func.apply(context, args);
-        context = args = null;
-      }
-
-      return result;
-    };
-  };
-
-  // Returns the first function passed as an argument to the second,
-  // allowing you to adjust arguments, run code before and after, and
-  // conditionally execute the original function.
-  _.wrap = function(func, wrapper) {
-    return _.partial(wrapper, func);
-  };
-
-  // Returns a negated version of the passed-in predicate.
-  _.negate = function(predicate) {
-    return function() {
-      return !predicate.apply(this, arguments);
-    };
-  };
-
-  // Returns a function that is the composition of a list of functions, each
-  // consuming the return value of the function that follows.
-  _.compose = function() {
-    var args = arguments;
-    var start = args.length - 1;
-    return function() {
-      var i = start;
-      var result = args[start].apply(this, arguments);
-      while (i--) result = args[i].call(this, result);
-      return result;
-    };
-  };
-
-  // Returns a function that will only be executed on and after the Nth call.
-  _.after = function(times, func) {
-    return function() {
-      if (--times < 1) {
-        return func.apply(this, arguments);
-      }
-    };
-  };
-
-  // Returns a function that will only be executed up to (but not including) the Nth call.
-  _.before = function(times, func) {
-    var memo;
-    return function() {
-      if (--times > 0) {
-        memo = func.apply(this, arguments);
-      }
-      if (times <= 1) func = null;
-      return memo;
-    };
-  };
-
-  // Returns a function that will be executed at most one time, no matter how
-  // often you call it. Useful for lazy initialization.
-  _.once = _.partial(_.before, 2);
-
-  // Object Functions
-  // ----------------
+},{"ieee754":41}],41:[function(require,module,exports){
+exports.read = function (buffer, offset, isLE, mLen, nBytes) {
+  var e, m
+  var eLen = (nBytes * 8) - mLen - 1
+  var eMax = (1 << eLen) - 1
+  var eBias = eMax >> 1
+  var nBits = -7
+  var i = isLE ? (nBytes - 1) : 0
+  var d = isLE ? -1 : 1
+  var s = buffer[offset + i]
 
-  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
-  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
-  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
-                      'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
+  i += d
 
-  function collectNonEnumProps(obj, keys) {
-    var nonEnumIdx = nonEnumerableProps.length;
-    var constructor = obj.constructor;
-    var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;
+  e = s & ((1 << (-nBits)) - 1)
+  s >>= (-nBits)
+  nBits += eLen
+  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
 
-    // Constructor is a special case.
-    var prop = 'constructor';
-    if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);
+  m = e & ((1 << (-nBits)) - 1)
+  e >>= (-nBits)
+  nBits += mLen
+  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
 
-    while (nonEnumIdx--) {
-      prop = nonEnumerableProps[nonEnumIdx];
-      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
-        keys.push(prop);
-      }
-    }
+  if (e === 0) {
+    e = 1 - eBias
+  } else if (e === eMax) {
+    return m ? NaN : ((s ? -1 : 1) * Infinity)
+  } else {
+    m = m + Math.pow(2, mLen)
+    e = e - eBias
   }
+  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
+}
 
-  // Retrieve the names of an object's own properties.
-  // Delegates to **ECMAScript 5**'s native `Object.keys`
-  _.keys = function(obj) {
-    if (!_.isObject(obj)) return [];
-    if (nativeKeys) return nativeKeys(obj);
-    var keys = [];
-    for (var key in obj) if (_.has(obj, key)) keys.push(key);
-    // Ahem, IE < 9.
-    if (hasEnumBug) collectNonEnumProps(obj, keys);
-    return keys;
-  };
-
-  // Retrieve all the property names of an object.
-  _.allKeys = function(obj) {
-    if (!_.isObject(obj)) return [];
-    var keys = [];
-    for (var key in obj) keys.push(key);
-    // Ahem, IE < 9.
-    if (hasEnumBug) collectNonEnumProps(obj, keys);
-    return keys;
-  };
-
-  // Retrieve the values of an object's properties.
-  _.values = function(obj) {
-    var keys = _.keys(obj);
-    var length = keys.length;
-    var values = Array(length);
-    for (var i = 0; i < length; i++) {
-      values[i] = obj[keys[i]];
-    }
-    return values;
-  };
-
-  // Returns the results of applying the iteratee to each element of the object
-  // In contrast to _.map it returns an object
-  _.mapObject = function(obj, iteratee, context) {
-    iteratee = cb(iteratee, context);
-    var keys =  _.keys(obj),
-          length = keys.length,
-          results = {},
-          currentKey;
-      for (var index = 0; index < length; index++) {
-        currentKey = keys[index];
-        results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
-      }
-      return results;
-  };
-
-  // Convert an object into a list of `[key, value]` pairs.
-  _.pairs = function(obj) {
-    var keys = _.keys(obj);
-    var length = keys.length;
-    var pairs = Array(length);
-    for (var i = 0; i < length; i++) {
-      pairs[i] = [keys[i], obj[keys[i]]];
-    }
-    return pairs;
-  };
-
-  // Invert the keys and values of an object. The values must be serializable.
-  _.invert = function(obj) {
-    var result = {};
-    var keys = _.keys(obj);
-    for (var i = 0, length = keys.length; i < length; i++) {
-      result[obj[keys[i]]] = keys[i];
-    }
-    return result;
-  };
-
-  // Return a sorted list of the function names available on the object.
-  // Aliased as `methods`
-  _.functions = _.methods = function(obj) {
-    var names = [];
-    for (var key in obj) {
-      if (_.isFunction(obj[key])) names.push(key);
-    }
-    return names.sort();
-  };
-
-  // Extend a given object with all the properties in passed-in object(s).
-  _.extend = createAssigner(_.allKeys);
+exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
+  var e, m, c
+  var eLen = (nBytes * 8) - mLen - 1
+  var eMax = (1 << eLen) - 1
+  var eBias = eMax >> 1
+  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
+  var i = isLE ? 0 : (nBytes - 1)
+  var d = isLE ? 1 : -1
+  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
 
-  // Assigns a given object with all the own properties in the passed-in object(s)
-  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
-  _.extendOwn = _.assign = createAssigner(_.keys);
+  value = Math.abs(value)
 
-  // Returns the first key on an object that passes a predicate test
-  _.findKey = function(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var keys = _.keys(obj), key;
-    for (var i = 0, length = keys.length; i < length; i++) {
-      key = keys[i];
-      if (predicate(obj[key], key, obj)) return key;
+  if (isNaN(value) || value === Infinity) {
+    m = isNaN(value) ? 1 : 0
+    e = eMax
+  } else {
+    e = Math.floor(Math.log(value) / Math.LN2)
+    if (value * (c = Math.pow(2, -e)) < 1) {
+      e--
+      c *= 2
     }
-  };
-
-  // Return a copy of the object only containing the whitelisted properties.
-  _.pick = function(object, oiteratee, context) {
-    var result = {}, obj = object, iteratee, keys;
-    if (obj == null) return result;
-    if (_.isFunction(oiteratee)) {
-      keys = _.allKeys(obj);
-      iteratee = optimizeCb(oiteratee, context);
+    if (e + eBias >= 1) {
+      value += rt / c
     } else {
-      keys = flatten(arguments, false, false, 1);
-      iteratee = function(value, key, obj) { return key in obj; };
-      obj = Object(obj);
+      value += rt * Math.pow(2, 1 - eBias)
     }
-    for (var i = 0, length = keys.length; i < length; i++) {
-      var key = keys[i];
-      var value = obj[key];
-      if (iteratee(value, key, obj)) result[key] = value;
+    if (value * c >= 2) {
+      e++
+      c /= 2
     }
-    return result;
-  };
 
-   // Return a copy of the object without the blacklisted properties.
-  _.omit = function(obj, iteratee, context) {
-    if (_.isFunction(iteratee)) {
-      iteratee = _.negate(iteratee);
+    if (e + eBias >= eMax) {
+      m = 0
+      e = eMax
+    } else if (e + eBias >= 1) {
+      m = ((value * c) - 1) * Math.pow(2, mLen)
+      e = e + eBias
     } else {
-      var keys = _.map(flatten(arguments, false, false, 1), String);
-      iteratee = function(value, key) {
-        return !_.contains(keys, key);
-      };
+      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
+      e = 0
     }
-    return _.pick(obj, iteratee, context);
-  };
-
-  // Fill in a given object with default properties.
-  _.defaults = createAssigner(_.allKeys, true);
-
-  // Creates an object that inherits from the given prototype object.
-  // If additional properties are provided then they will be added to the
-  // created object.
-  _.create = function(prototype, props) {
-    var result = baseCreate(prototype);
-    if (props) _.extendOwn(result, props);
-    return result;
-  };
+  }
 
-  // Create a (shallow-cloned) duplicate of an object.
-  _.clone = function(obj) {
-    if (!_.isObject(obj)) return obj;
-    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
-  };
+  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
 
-  // Invokes interceptor with the obj, and then returns obj.
-  // The primary purpose of this method is to "tap into" a method chain, in
-  // order to perform operations on intermediate results within the chain.
-  _.tap = function(obj, interceptor) {
-    interceptor(obj);
-    return obj;
-  };
+  e = (e << mLen) | m
+  eLen += mLen
+  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
 
-  // Returns whether an object has a given set of `key:value` pairs.
-  _.isMatch = function(object, attrs) {
-    var keys = _.keys(attrs), length = keys.length;
-    if (object == null) return !length;
-    var obj = Object(object);
-    for (var i = 0; i < length; i++) {
-      var key = keys[i];
-      if (attrs[key] !== obj[key] || !(key in obj)) return false;
-    }
-    return true;
-  };
+  buffer[offset + i - d] |= s * 128
+}
 
+},{}],42:[function(require,module,exports){
+!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?module.exports=i():"function"==typeof define&&define.amd?define(i):(t=t||self).RBush=i()}(this,function(){"use strict";function t(t,r,e,a,h){!function t(n,r,e,a,h){for(;a>e;){if(a-e>600){var o=a-e+1,s=r-e+1,l=Math.log(o),f=.5*Math.exp(2*l/3),u=.5*Math.sqrt(l*f*(o-f)/o)*(s-o/2<0?-1:1),m=Math.max(e,Math.floor(r-s*f/o+u)),c=Math.min(a,Math.floor(r+(o-s)*f/o+u));t(n,r,m,c,h)}var p=n[r],d=e,x=a;for(i(n,e,r),h(n[a],p)>0&&i(n,e,a);d<x;){for(i(n,d,x),d++,x--;h(n[d],p)<0;)d++;for(;h(n[x],p)>0;)x--}0===h(n[e],p)?i(n,e,x):i(n,++x,a),x<=r&&(e=x+1),r<=x&&(a=x-1)}}(t,r,e||0,a||t.length-1,h||n)}function i(t,i,n){var r=t[i];t[i]=t[n],t[n]=r}function n(t,i){return t<i?-1:t>i?1:0}var r=function(t){void 0===t&&(t=9),this._maxEntries=Math.max(4,t),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()};function e(t,i,n){if(!n)return i.indexOf(t);for(var r=0;r<i.length;r++)if(n(t,i[r]))return r;return-1}function a(t,i){h(t,0,t.children.length,i,t)}function h(t,i,n,r,e){e||(e=p(null)),e.minX=1/0,e.minY=1/0,e.maxX=-1/0,e.maxY=-1/0;for(var a=i;a<n;a++){var h=t.children[a];o(e,t.leaf?r(h):h)}return e}function o(t,i){return t.minX=Math.min(t.minX,i.minX),t.minY=Math.min(t.minY,i.minY),t.maxX=Math.max(t.maxX,i.maxX),t.maxY=Math.max(t.maxY,i.maxY),t}function s(t,i){return t.minX-i.minX}function l(t,i){return t.minY-i.minY}function f(t){return(t.maxX-t.minX)*(t.maxY-t.minY)}function u(t){return t.maxX-t.minX+(t.maxY-t.minY)}function m(t,i){return t.minX<=i.minX&&t.minY<=i.minY&&i.maxX<=t.maxX&&i.maxY<=t.maxY}function c(t,i){return i.minX<=t.maxX&&i.minY<=t.maxY&&i.maxX>=t.minX&&i.maxY>=t.minY}function p(t){return{children:t,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function d(i,n,r,e,a){for(var h=[n,r];h.length;)if(!((r=h.pop())-(n=h.pop())<=e)){var o=n+Math.ceil((r-n)/e/2)*e;t(i,o,n,r,a),h.push(n,o,o,r)}}return r.prototype.all=function(){return this._all(this.data,[])},r.prototype.search=function(t){var i=this.data,n=[];if(!c(t,i))return n;for(var r=this.toBBox,e=[];i;){for(var a=0;a<i.children.length;a++){var h=i.children[a],o=i.leaf?r(h):h;c(t,o)&&(i.leaf?n.push(h):m(t,o)?this._all(h,n):e.push(h))}i=e.pop()}return n},r.prototype.collides=function(t){var i=this.data;if(!c(t,i))return!1;for(var n=[];i;){for(var r=0;r<i.children.length;r++){var e=i.children[r],a=i.leaf?this.toBBox(e):e;if(c(t,a)){if(i.leaf||m(t,a))return!0;n.push(e)}}i=n.pop()}return!1},r.prototype.load=function(t){if(!t||!t.length)return this;if(t.length<this._minEntries){for(var i=0;i<t.length;i++)this.insert(t[i]);return this}var n=this._build(t.slice(),0,t.length-1,0);if(this.data.children.length)if(this.data.height===n.height)this._splitRoot(this.data,n);else{if(this.data.height<n.height){var r=this.data;this.data=n,n=r}this._insert(n,this.data.height-n.height-1,!0)}else this.data=n;return this},r.prototype.insert=function(t){return t&&this._insert(t,this.data.height-1),this},r.prototype.clear=function(){return this.data=p([]),this},r.prototype.remove=function(t,i){if(!t)return this;for(var n,r,a,h=this.data,o=this.toBBox(t),s=[],l=[];h||s.length;){if(h||(h=s.pop(),r=s[s.length-1],n=l.pop(),a=!0),h.leaf){var f=e(t,h.children,i);if(-1!==f)return h.children.splice(f,1),s.push(h),this._condense(s),this}a||h.leaf||!m(h,o)?r?(n++,h=r.children[n],a=!1):h=null:(s.push(h),l.push(n),n=0,r=h,h=h.children[0])}return this},r.prototype.toBBox=function(t){return t},r.prototype.compareMinX=function(t,i){return t.minX-i.minX},r.prototype.compareMinY=function(t,i){return t.minY-i.minY},r.prototype.toJSON=function(){return this.data},r.prototype.fromJSON=function(t){return this.data=t,this},r.prototype._all=function(t,i){for(var n=[];t;)t.leaf?i.push.apply(i,t.children):n.push.apply(n,t.children),t=n.pop();return i},r.prototype._build=function(t,i,n,r){var e,h=n-i+1,o=this._maxEntries;if(h<=o)return a(e=p(t.slice(i,n+1)),this.toBBox),e;r||(r=Math.ceil(Math.log(h)/Math.log(o)),o=Math.ceil(h/Math.pow(o,r-1))),(e=p([])).leaf=!1,e.height=r;var s=Math.ceil(h/o),l=s*Math.ceil(Math.sqrt(o));d(t,i,n,l,this.compareMinX);for(var f=i;f<=n;f+=l){var u=Math.min(f+l-1,n);d(t,f,u,s,this.compareMinY);for(var m=f;m<=u;m+=s){var c=Math.min(m+s-1,u);e.children.push(this._build(t,m,c,r-1))}}return a(e,this.toBBox),e},r.prototype._chooseSubtree=function(t,i,n,r){for(;r.push(i),!i.leaf&&r.length-1!==n;){for(var e=1/0,a=1/0,h=void 0,o=0;o<i.children.length;o++){var s=i.children[o],l=f(s),u=(m=t,c=s,(Math.max(c.maxX,m.maxX)-Math.min(c.minX,m.minX))*(Math.max(c.maxY,m.maxY)-Math.min(c.minY,m.minY))-l);u<a?(a=u,e=l<e?l:e,h=s):u===a&&l<e&&(e=l,h=s)}i=h||i.children[0]}var m,c;return i},r.prototype._insert=function(t,i,n){var r=n?t:this.toBBox(t),e=[],a=this._chooseSubtree(r,this.data,i,e);for(a.children.push(t),o(a,r);i>=0&&e[i].children.length>this._maxEntries;)this._split(e,i),i--;this._adjustParentBBoxes(r,e,i)},r.prototype._split=function(t,i){var n=t[i],r=n.children.length,e=this._minEntries;this._chooseSplitAxis(n,e,r);var h=this._chooseSplitIndex(n,e,r),o=p(n.children.splice(h,n.children.length-h));o.height=n.height,o.leaf=n.leaf,a(n,this.toBBox),a(o,this.toBBox),i?t[i-1].children.push(o):this._splitRoot(n,o)},r.prototype._splitRoot=function(t,i){this.data=p([t,i]),this.data.height=t.height+1,this.data.leaf=!1,a(this.data,this.toBBox)},r.prototype._chooseSplitIndex=function(t,i,n){for(var r,e,a,o,s,l,u,m=1/0,c=1/0,p=i;p<=n-i;p++){var d=h(t,0,p,this.toBBox),x=h(t,p,n,this.toBBox),v=(e=d,a=x,o=void 0,s=void 0,l=void 0,u=void 0,o=Math.max(e.minX,a.minX),s=Math.max(e.minY,a.minY),l=Math.min(e.maxX,a.maxX),u=Math.min(e.maxY,a.maxY),Math.max(0,l-o)*Math.max(0,u-s)),M=f(d)+f(x);v<m?(m=v,r=p,c=M<c?M:c):v===m&&M<c&&(c=M,r=p)}return r||n-i},r.prototype._chooseSplitAxis=function(t,i,n){var r=t.leaf?this.compareMinX:s,e=t.leaf?this.compareMinY:l;this._allDistMargin(t,i,n,r)<this._allDistMargin(t,i,n,e)&&t.children.sort(r)},r.prototype._allDistMargin=function(t,i,n,r){t.children.sort(r);for(var e=this.toBBox,a=h(t,0,i,e),s=h(t,n-i,n,e),l=u(a)+u(s),f=i;f<n-i;f++){var m=t.children[f];o(a,t.leaf?e(m):m),l+=u(a)}for(var c=n-i-1;c>=i;c--){var p=t.children[c];o(s,t.leaf?e(p):p),l+=u(s)}return l},r.prototype._adjustParentBBoxes=function(t,i,n){for(var r=n;r>=0;r--)o(i[r],t)},r.prototype._condense=function(t){for(var i=t.length-1,n=void 0;i>=0;i--)0===t[i].children.length?i>0?(n=t[i-1].children).splice(n.indexOf(t[i]),1):this.clear():a(t[i],this.toBBox)},r});
 
-  // Internal recursive comparison function for `isEqual`.
-  var eq = function(a, b, aStack, bStack) {
-    // Identical objects are equal. `0 === -0`, but they aren't identical.
-    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
-    if (a === b) return a !== 0 || 1 / a === 1 / b;
-    // A strict comparison is necessary because `null == undefined`.
-    if (a == null || b == null) return a === b;
-    // Unwrap any wrapped objects.
-    if (a instanceof _) a = a._wrapped;
-    if (b instanceof _) b = b._wrapped;
-    // Compare `[[Class]]` names.
-    var className = toString.call(a);
-    if (className !== toString.call(b)) return false;
-    switch (className) {
-      // Strings, numbers, regular expressions, dates, and booleans are compared by value.
-      case '[object RegExp]':
-      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
-      case '[object String]':
-        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
-        // equivalent to `new String("5")`.
-        return '' + a === '' + b;
-      case '[object Number]':
-        // `NaN`s are equivalent, but non-reflexive.
-        // Object(NaN) is equivalent to NaN
-        if (+a !== +a) return +b !== +b;
-        // An `egal` comparison is performed for other numeric values.
-        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
-      case '[object Date]':
-      case '[object Boolean]':
-        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
-        // millisecond representations. Note that invalid dates with millisecond representations
-        // of `NaN` are not equivalent.
-        return +a === +b;
-    }
-
-    var areArrays = className === '[object Array]';
-    if (!areArrays) {
-      if (typeof a != 'object' || typeof b != 'object') return false;
-
-      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
-      // from different frames are.
-      var aCtor = a.constructor, bCtor = b.constructor;
-      if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
-                               _.isFunction(bCtor) && bCtor instanceof bCtor)
-                          && ('constructor' in a && 'constructor' in b)) {
-        return false;
-      }
-    }
-    // Assume equality for cyclic structures. The algorithm for detecting cyclic
-    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
-
-    // Initializing stack of traversed objects.
-    // It's done here since we only need them for objects and arrays comparison.
-    aStack = aStack || [];
-    bStack = bStack || [];
-    var length = aStack.length;
-    while (length--) {
-      // Linear search. Performance is inversely proportional to the number of
-      // unique nested structures.
-      if (aStack[length] === a) return bStack[length] === b;
-    }
-
-    // Add the first object to the stack of traversed objects.
-    aStack.push(a);
-    bStack.push(b);
-
-    // Recursively compare objects and arrays.
-    if (areArrays) {
-      // Compare array lengths to determine if a deep comparison is necessary.
-      length = a.length;
-      if (length !== b.length) return false;
-      // Deep compare the contents, ignoring non-numeric properties.
-      while (length--) {
-        if (!eq(a[length], b[length], aStack, bStack)) return false;
-      }
-    } else {
-      // Deep compare objects.
-      var keys = _.keys(a), key;
-      length = keys.length;
-      // Ensure that both objects contain the same number of properties before comparing deep equality.
-      if (_.keys(b).length !== length) return false;
-      while (length--) {
-        // Deep compare each member
-        key = keys[length];
-        if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
-      }
+},{}],43:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("./internal/Observable");
+exports.Observable = Observable_1.Observable;
+var ConnectableObservable_1 = require("./internal/observable/ConnectableObservable");
+exports.ConnectableObservable = ConnectableObservable_1.ConnectableObservable;
+var groupBy_1 = require("./internal/operators/groupBy");
+exports.GroupedObservable = groupBy_1.GroupedObservable;
+var observable_1 = require("./internal/symbol/observable");
+exports.observable = observable_1.observable;
+var Subject_1 = require("./internal/Subject");
+exports.Subject = Subject_1.Subject;
+var BehaviorSubject_1 = require("./internal/BehaviorSubject");
+exports.BehaviorSubject = BehaviorSubject_1.BehaviorSubject;
+var ReplaySubject_1 = require("./internal/ReplaySubject");
+exports.ReplaySubject = ReplaySubject_1.ReplaySubject;
+var AsyncSubject_1 = require("./internal/AsyncSubject");
+exports.AsyncSubject = AsyncSubject_1.AsyncSubject;
+var asap_1 = require("./internal/scheduler/asap");
+exports.asapScheduler = asap_1.asap;
+var async_1 = require("./internal/scheduler/async");
+exports.asyncScheduler = async_1.async;
+var queue_1 = require("./internal/scheduler/queue");
+exports.queueScheduler = queue_1.queue;
+var animationFrame_1 = require("./internal/scheduler/animationFrame");
+exports.animationFrameScheduler = animationFrame_1.animationFrame;
+var VirtualTimeScheduler_1 = require("./internal/scheduler/VirtualTimeScheduler");
+exports.VirtualTimeScheduler = VirtualTimeScheduler_1.VirtualTimeScheduler;
+exports.VirtualAction = VirtualTimeScheduler_1.VirtualAction;
+var Scheduler_1 = require("./internal/Scheduler");
+exports.Scheduler = Scheduler_1.Scheduler;
+var Subscription_1 = require("./internal/Subscription");
+exports.Subscription = Subscription_1.Subscription;
+var Subscriber_1 = require("./internal/Subscriber");
+exports.Subscriber = Subscriber_1.Subscriber;
+var Notification_1 = require("./internal/Notification");
+exports.Notification = Notification_1.Notification;
+exports.NotificationKind = Notification_1.NotificationKind;
+var pipe_1 = require("./internal/util/pipe");
+exports.pipe = pipe_1.pipe;
+var noop_1 = require("./internal/util/noop");
+exports.noop = noop_1.noop;
+var identity_1 = require("./internal/util/identity");
+exports.identity = identity_1.identity;
+var isObservable_1 = require("./internal/util/isObservable");
+exports.isObservable = isObservable_1.isObservable;
+var ArgumentOutOfRangeError_1 = require("./internal/util/ArgumentOutOfRangeError");
+exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
+var EmptyError_1 = require("./internal/util/EmptyError");
+exports.EmptyError = EmptyError_1.EmptyError;
+var ObjectUnsubscribedError_1 = require("./internal/util/ObjectUnsubscribedError");
+exports.ObjectUnsubscribedError = ObjectUnsubscribedError_1.ObjectUnsubscribedError;
+var UnsubscriptionError_1 = require("./internal/util/UnsubscriptionError");
+exports.UnsubscriptionError = UnsubscriptionError_1.UnsubscriptionError;
+var TimeoutError_1 = require("./internal/util/TimeoutError");
+exports.TimeoutError = TimeoutError_1.TimeoutError;
+var bindCallback_1 = require("./internal/observable/bindCallback");
+exports.bindCallback = bindCallback_1.bindCallback;
+var bindNodeCallback_1 = require("./internal/observable/bindNodeCallback");
+exports.bindNodeCallback = bindNodeCallback_1.bindNodeCallback;
+var combineLatest_1 = require("./internal/observable/combineLatest");
+exports.combineLatest = combineLatest_1.combineLatest;
+var concat_1 = require("./internal/observable/concat");
+exports.concat = concat_1.concat;
+var defer_1 = require("./internal/observable/defer");
+exports.defer = defer_1.defer;
+var empty_1 = require("./internal/observable/empty");
+exports.empty = empty_1.empty;
+var forkJoin_1 = require("./internal/observable/forkJoin");
+exports.forkJoin = forkJoin_1.forkJoin;
+var from_1 = require("./internal/observable/from");
+exports.from = from_1.from;
+var fromEvent_1 = require("./internal/observable/fromEvent");
+exports.fromEvent = fromEvent_1.fromEvent;
+var fromEventPattern_1 = require("./internal/observable/fromEventPattern");
+exports.fromEventPattern = fromEventPattern_1.fromEventPattern;
+var generate_1 = require("./internal/observable/generate");
+exports.generate = generate_1.generate;
+var iif_1 = require("./internal/observable/iif");
+exports.iif = iif_1.iif;
+var interval_1 = require("./internal/observable/interval");
+exports.interval = interval_1.interval;
+var merge_1 = require("./internal/observable/merge");
+exports.merge = merge_1.merge;
+var never_1 = require("./internal/observable/never");
+exports.never = never_1.never;
+var of_1 = require("./internal/observable/of");
+exports.of = of_1.of;
+var onErrorResumeNext_1 = require("./internal/observable/onErrorResumeNext");
+exports.onErrorResumeNext = onErrorResumeNext_1.onErrorResumeNext;
+var pairs_1 = require("./internal/observable/pairs");
+exports.pairs = pairs_1.pairs;
+var partition_1 = require("./internal/observable/partition");
+exports.partition = partition_1.partition;
+var race_1 = require("./internal/observable/race");
+exports.race = race_1.race;
+var range_1 = require("./internal/observable/range");
+exports.range = range_1.range;
+var throwError_1 = require("./internal/observable/throwError");
+exports.throwError = throwError_1.throwError;
+var timer_1 = require("./internal/observable/timer");
+exports.timer = timer_1.timer;
+var using_1 = require("./internal/observable/using");
+exports.using = using_1.using;
+var zip_1 = require("./internal/observable/zip");
+exports.zip = zip_1.zip;
+var scheduled_1 = require("./internal/scheduled/scheduled");
+exports.scheduled = scheduled_1.scheduled;
+var empty_2 = require("./internal/observable/empty");
+exports.EMPTY = empty_2.EMPTY;
+var never_2 = require("./internal/observable/never");
+exports.NEVER = never_2.NEVER;
+var config_1 = require("./internal/config");
+exports.config = config_1.config;
+
+},{"./internal/AsyncSubject":44,"./internal/BehaviorSubject":45,"./internal/Notification":47,"./internal/Observable":48,"./internal/ReplaySubject":51,"./internal/Scheduler":52,"./internal/Subject":53,"./internal/Subscriber":55,"./internal/Subscription":56,"./internal/config":57,"./internal/observable/ConnectableObservable":58,"./internal/observable/bindCallback":60,"./internal/observable/bindNodeCallback":61,"./internal/observable/combineLatest":62,"./internal/observable/concat":63,"./internal/observable/defer":64,"./internal/observable/empty":65,"./internal/observable/forkJoin":66,"./internal/observable/from":67,"./internal/observable/fromEvent":69,"./internal/observable/fromEventPattern":70,"./internal/observable/generate":71,"./internal/observable/iif":72,"./internal/observable/interval":73,"./internal/observable/merge":74,"./internal/observable/never":75,"./internal/observable/of":76,"./internal/observable/onErrorResumeNext":77,"./internal/observable/pairs":78,"./internal/observable/partition":79,"./internal/observable/race":80,"./internal/observable/range":81,"./internal/observable/throwError":82,"./internal/observable/timer":83,"./internal/observable/using":84,"./internal/observable/zip":85,"./internal/operators/groupBy":121,"./internal/scheduled/scheduled":193,"./internal/scheduler/VirtualTimeScheduler":203,"./internal/scheduler/animationFrame":204,"./internal/scheduler/asap":205,"./internal/scheduler/async":206,"./internal/scheduler/queue":207,"./internal/symbol/observable":209,"./internal/util/ArgumentOutOfRangeError":211,"./internal/util/EmptyError":212,"./internal/util/ObjectUnsubscribedError":214,"./internal/util/TimeoutError":215,"./internal/util/UnsubscriptionError":216,"./internal/util/identity":219,"./internal/util/isObservable":228,"./internal/util/noop":231,"./internal/util/pipe":233}],44:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     }
-    // Remove the first object from the stack of traversed objects.
-    aStack.pop();
-    bStack.pop();
-    return true;
-  };
-
-  // Perform a deep comparison to check if two objects are equal.
-  _.isEqual = function(a, b) {
-    return eq(a, b);
-  };
-
-  // Is a given array, string, or object empty?
-  // An "empty" object has no enumerable own-properties.
-  _.isEmpty = function(obj) {
-    if (obj == null) return true;
-    if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
-    return _.keys(obj).length === 0;
-  };
-
-  // Is a given value a DOM element?
-  _.isElement = function(obj) {
-    return !!(obj && obj.nodeType === 1);
-  };
-
-  // Is a given value an array?
-  // Delegates to ECMA5's native Array.isArray
-  _.isArray = nativeIsArray || function(obj) {
-    return toString.call(obj) === '[object Array]';
-  };
-
-  // Is a given variable an object?
-  _.isObject = function(obj) {
-    var type = typeof obj;
-    return type === 'function' || type === 'object' && !!obj;
-  };
-
-  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
-  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
-    _['is' + name] = function(obj) {
-      return toString.call(obj) === '[object ' + name + ']';
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-  });
-
-  // Define a fallback version of the method in browsers (ahem, IE < 9), where
-  // there isn't any inspectable "Arguments" type.
-  if (!_.isArguments(arguments)) {
-    _.isArguments = function(obj) {
-      return _.has(obj, 'callee');
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("./Subject");
+var Subscription_1 = require("./Subscription");
+var AsyncSubject = (function (_super) {
+    __extends(AsyncSubject, _super);
+    function AsyncSubject() {
+        var _this = _super !== null && _super.apply(this, arguments) || this;
+        _this.value = null;
+        _this.hasNext = false;
+        _this.hasCompleted = false;
+        return _this;
+    }
+    AsyncSubject.prototype._subscribe = function (subscriber) {
+        if (this.hasError) {
+            subscriber.error(this.thrownError);
+            return Subscription_1.Subscription.EMPTY;
+        }
+        else if (this.hasCompleted && this.hasNext) {
+            subscriber.next(this.value);
+            subscriber.complete();
+            return Subscription_1.Subscription.EMPTY;
+        }
+        return _super.prototype._subscribe.call(this, subscriber);
     };
-  }
-
-  // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
-  // IE 11 (#1621), and in Safari 8 (#1929).
-  if (typeof /./ != 'function' && typeof Int8Array != 'object') {
-    _.isFunction = function(obj) {
-      return typeof obj == 'function' || false;
+    AsyncSubject.prototype.next = function (value) {
+        if (!this.hasCompleted) {
+            this.value = value;
+            this.hasNext = true;
+        }
     };
-  }
-
-  // Is a given object a finite number?
-  _.isFinite = function(obj) {
-    return isFinite(obj) && !isNaN(parseFloat(obj));
-  };
-
-  // Is the given value `NaN`? (NaN is the only number which does not equal itself).
-  _.isNaN = function(obj) {
-    return _.isNumber(obj) && obj !== +obj;
-  };
-
-  // Is a given value a boolean?
-  _.isBoolean = function(obj) {
-    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
-  };
-
-  // Is a given value equal to null?
-  _.isNull = function(obj) {
-    return obj === null;
-  };
-
-  // Is a given variable undefined?
-  _.isUndefined = function(obj) {
-    return obj === void 0;
-  };
-
-  // Shortcut function for checking if an object has a given property directly
-  // on itself (in other words, not on a prototype).
-  _.has = function(obj, key) {
-    return obj != null && hasOwnProperty.call(obj, key);
-  };
-
-  // Utility Functions
-  // -----------------
-
-  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
-  // previous owner. Returns a reference to the Underscore object.
-  _.noConflict = function() {
-    root._ = previousUnderscore;
-    return this;
-  };
-
-  // Keep the identity function around for default iteratees.
-  _.identity = function(value) {
-    return value;
-  };
-
-  // Predicate-generating functions. Often useful outside of Underscore.
-  _.constant = function(value) {
-    return function() {
-      return value;
+    AsyncSubject.prototype.error = function (error) {
+        if (!this.hasCompleted) {
+            _super.prototype.error.call(this, error);
+        }
     };
-  };
-
-  _.noop = function(){};
-
-  _.property = property;
-
-  // Generates a function for a given object that returns a given property.
-  _.propertyOf = function(obj) {
-    return obj == null ? function(){} : function(key) {
-      return obj[key];
+    AsyncSubject.prototype.complete = function () {
+        this.hasCompleted = true;
+        if (this.hasNext) {
+            _super.prototype.next.call(this, this.value);
+        }
+        _super.prototype.complete.call(this);
     };
-  };
+    return AsyncSubject;
+}(Subject_1.Subject));
+exports.AsyncSubject = AsyncSubject;
 
-  // Returns a predicate for checking whether an object has a given set of
-  // `key:value` pairs.
-  _.matcher = _.matches = function(attrs) {
-    attrs = _.extendOwn({}, attrs);
-    return function(obj) {
-      return _.isMatch(obj, attrs);
+},{"./Subject":53,"./Subscription":56}],45:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-  };
-
-  // Run a function **n** times.
-  _.times = function(n, iteratee, context) {
-    var accum = Array(Math.max(0, n));
-    iteratee = optimizeCb(iteratee, context, 1);
-    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
-    return accum;
-  };
-
-  // Return a random integer between min and max (inclusive).
-  _.random = function(min, max) {
-    if (max == null) {
-      max = min;
-      min = 0;
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("./Subject");
+var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
+var BehaviorSubject = (function (_super) {
+    __extends(BehaviorSubject, _super);
+    function BehaviorSubject(_value) {
+        var _this = _super.call(this) || this;
+        _this._value = _value;
+        return _this;
     }
-    return min + Math.floor(Math.random() * (max - min + 1));
-  };
-
-  // A (possibly faster) way to get the current timestamp as an integer.
-  _.now = Date.now || function() {
-    return new Date().getTime();
-  };
-
-   // List of HTML entities for escaping.
-  var escapeMap = {
-    '&': '&amp;',
-    '<': '&lt;',
-    '>': '&gt;',
-    '"': '&quot;',
-    "'": '&#x27;',
-    '`': '&#x60;'
-  };
-  var unescapeMap = _.invert(escapeMap);
-
-  // Functions for escaping and unescaping strings to/from HTML interpolation.
-  var createEscaper = function(map) {
-    var escaper = function(match) {
-      return map[match];
+    Object.defineProperty(BehaviorSubject.prototype, "value", {
+        get: function () {
+            return this.getValue();
+        },
+        enumerable: true,
+        configurable: true
+    });
+    BehaviorSubject.prototype._subscribe = function (subscriber) {
+        var subscription = _super.prototype._subscribe.call(this, subscriber);
+        if (subscription && !subscription.closed) {
+            subscriber.next(this._value);
+        }
+        return subscription;
+    };
+    BehaviorSubject.prototype.getValue = function () {
+        if (this.hasError) {
+            throw this.thrownError;
+        }
+        else if (this.closed) {
+            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
+        }
+        else {
+            return this._value;
+        }
     };
-    // Regexes for identifying a key that needs to be escaped
-    var source = '(?:' + _.keys(map).join('|') + ')';
-    var testRegexp = RegExp(source);
-    var replaceRegexp = RegExp(source, 'g');
-    return function(string) {
-      string = string == null ? '' : '' + string;
-      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
+    BehaviorSubject.prototype.next = function (value) {
+        _super.prototype.next.call(this, this._value = value);
     };
-  };
-  _.escape = createEscaper(escapeMap);
-  _.unescape = createEscaper(unescapeMap);
+    return BehaviorSubject;
+}(Subject_1.Subject));
+exports.BehaviorSubject = BehaviorSubject;
 
-  // If the value of the named `property` is a function then invoke it with the
-  // `object` as context; otherwise, return it.
-  _.result = function(object, property, fallback) {
-    var value = object == null ? void 0 : object[property];
-    if (value === void 0) {
-      value = fallback;
+},{"./Subject":53,"./util/ObjectUnsubscribedError":214}],46:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     }
-    return _.isFunction(value) ? value.call(object) : value;
-  };
-
-  // Generate a unique integer id (unique within the entire client session).
-  // Useful for temporary DOM ids.
-  var idCounter = 0;
-  _.uniqueId = function(prefix) {
-    var id = ++idCounter + '';
-    return prefix ? prefix + id : id;
-  };
-
-  // By default, Underscore uses ERB-style template delimiters, change the
-  // following template settings to use alternative delimiters.
-  _.templateSettings = {
-    evaluate    : /<%([\s\S]+?)%>/g,
-    interpolate : /<%=([\s\S]+?)%>/g,
-    escape      : /<%-([\s\S]+?)%>/g
-  };
-
-  // When customizing `templateSettings`, if you don't want to define an
-  // interpolation, evaluation or escaping regex, we need one that is
-  // guaranteed not to match.
-  var noMatch = /(.)^/;
-
-  // Certain characters need to be escaped so that they can be put into a
-  // string literal.
-  var escapes = {
-    "'":      "'",
-    '\\':     '\\',
-    '\r':     'r',
-    '\n':     'n',
-    '\u2028': 'u2028',
-    '\u2029': 'u2029'
-  };
-
-  var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
-
-  var escapeChar = function(match) {
-    return '\\' + escapes[match];
-  };
-
-  // JavaScript micro-templating, similar to John Resig's implementation.
-  // Underscore templating handles arbitrary delimiters, preserves whitespace,
-  // and correctly escapes quotes within interpolated code.
-  // NB: `oldSettings` only exists for backwards compatibility.
-  _.template = function(text, settings, oldSettings) {
-    if (!settings && oldSettings) settings = oldSettings;
-    settings = _.defaults({}, settings, _.templateSettings);
-
-    // Combine delimiters into one regular expression via alternation.
-    var matcher = RegExp([
-      (settings.escape || noMatch).source,
-      (settings.interpolate || noMatch).source,
-      (settings.evaluate || noMatch).source
-    ].join('|') + '|$', 'g');
-
-    // Compile the template source, escaping string literals appropriately.
-    var index = 0;
-    var source = "__p+='";
-    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
-      source += text.slice(index, offset).replace(escaper, escapeChar);
-      index = offset + match.length;
-
-      if (escape) {
-        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
-      } else if (interpolate) {
-        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
-      } else if (evaluate) {
-        source += "';\n" + evaluate + "\n__p+='";
-      }
-
-      // Adobe VMs need the match returned to produce the correct offest.
-      return match;
-    });
-    source += "';\n";
-
-    // If a variable is not specified, place data values in local scope.
-    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
-
-    source = "var __t,__p='',__j=Array.prototype.join," +
-      "print=function(){__p+=__j.call(arguments,'');};\n" +
-      source + 'return __p;\n';
-
-    try {
-      var render = new Function(settings.variable || 'obj', '_', source);
-    } catch (e) {
-      e.source = source;
-      throw e;
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("./Subscriber");
+var InnerSubscriber = (function (_super) {
+    __extends(InnerSubscriber, _super);
+    function InnerSubscriber(parent, outerValue, outerIndex) {
+        var _this = _super.call(this) || this;
+        _this.parent = parent;
+        _this.outerValue = outerValue;
+        _this.outerIndex = outerIndex;
+        _this.index = 0;
+        return _this;
     }
-
-    var template = function(data) {
-      return render.call(this, data, _);
+    InnerSubscriber.prototype._next = function (value) {
+        this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);
     };
+    InnerSubscriber.prototype._error = function (error) {
+        this.parent.notifyError(error, this);
+        this.unsubscribe();
+    };
+    InnerSubscriber.prototype._complete = function () {
+        this.parent.notifyComplete(this);
+        this.unsubscribe();
+    };
+    return InnerSubscriber;
+}(Subscriber_1.Subscriber));
+exports.InnerSubscriber = InnerSubscriber;
 
-    // Provide the compiled source as a convenience for precompilation.
-    var argument = settings.variable || 'obj';
-    template.source = 'function(' + argument + '){\n' + source + '}';
-
-    return template;
-  };
-
-  // Add a "chain" function. Start chaining a wrapped Underscore object.
-  _.chain = function(obj) {
-    var instance = _(obj);
-    instance._chain = true;
-    return instance;
-  };
-
-  // OOP
-  // ---------------
-  // If Underscore is called as a function, it returns a wrapped object that
-  // can be used OO-style. This wrapper holds altered versions of all the
-  // underscore functions. Wrapped objects may be chained.
-
-  // Helper function to continue chaining intermediate results.
-  var result = function(instance, obj) {
-    return instance._chain ? _(obj).chain() : obj;
-  };
-
-  // Add your own custom functions to the Underscore object.
-  _.mixin = function(obj) {
-    _.each(_.functions(obj), function(name) {
-      var func = _[name] = obj[name];
-      _.prototype[name] = function() {
-        var args = [this._wrapped];
-        push.apply(args, arguments);
-        return result(this, func.apply(_, args));
-      };
-    });
-  };
-
-  // Add all of the Underscore functions to the wrapper object.
-  _.mixin(_);
-
-  // Add all mutator Array functions to the wrapper.
-  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
-    var method = ArrayProto[name];
-    _.prototype[name] = function() {
-      var obj = this._wrapped;
-      method.apply(obj, arguments);
-      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
-      return result(this, obj);
+},{"./Subscriber":55}],47:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var empty_1 = require("./observable/empty");
+var of_1 = require("./observable/of");
+var throwError_1 = require("./observable/throwError");
+var NotificationKind;
+(function (NotificationKind) {
+    NotificationKind["NEXT"] = "N";
+    NotificationKind["ERROR"] = "E";
+    NotificationKind["COMPLETE"] = "C";
+})(NotificationKind = exports.NotificationKind || (exports.NotificationKind = {}));
+var Notification = (function () {
+    function Notification(kind, value, error) {
+        this.kind = kind;
+        this.value = value;
+        this.error = error;
+        this.hasValue = kind === 'N';
+    }
+    Notification.prototype.observe = function (observer) {
+        switch (this.kind) {
+            case 'N':
+                return observer.next && observer.next(this.value);
+            case 'E':
+                return observer.error && observer.error(this.error);
+            case 'C':
+                return observer.complete && observer.complete();
+        }
     };
-  });
-
-  // Add all accessor Array functions to the wrapper.
-  _.each(['concat', 'join', 'slice'], function(name) {
-    var method = ArrayProto[name];
-    _.prototype[name] = function() {
-      return result(this, method.apply(this._wrapped, arguments));
+    Notification.prototype.do = function (next, error, complete) {
+        var kind = this.kind;
+        switch (kind) {
+            case 'N':
+                return next && next(this.value);
+            case 'E':
+                return error && error(this.error);
+            case 'C':
+                return complete && complete();
+        }
     };
-  });
-
-  // Extracts the result from a wrapped and chained object.
-  _.prototype.value = function() {
-    return this._wrapped;
-  };
-
-  // Provide unwrapping proxy for some methods used in engine operations
-  // such as arithmetic and JSON stringification.
-  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
-
-  _.prototype.toString = function() {
-    return '' + this._wrapped;
-  };
-
-  // AMD registration happens at the end for compatibility with AMD loaders
-  // that may not enforce next-turn semantics on modules. Even though general
-  // practice for AMD registration is to be anonymous, underscore registers
-  // as a named module because, like jQuery, it is a base library that is
-  // popular enough to be bundled in a third party lib, but not be part of
-  // an AMD load request. Those cases could generate an error when an
-  // anonymous define() is called outside of a loader request.
-  if (typeof define === 'function' && define.amd) {
-    define('underscore', [], function() {
-      return _;
-    });
-  }
-}.call(this));
-
-},{}],179:[function(require,module,exports){
-var createElement = require("./vdom/create-element.js")
-
-module.exports = createElement
-
-},{"./vdom/create-element.js":185}],180:[function(require,module,exports){
-var diff = require("./vtree/diff.js")
-
-module.exports = diff
-
-},{"./vtree/diff.js":205}],181:[function(require,module,exports){
-var h = require("./virtual-hyperscript/index.js")
-
-module.exports = h
-
-},{"./virtual-hyperscript/index.js":192}],182:[function(require,module,exports){
-var diff = require("./diff.js")
-var patch = require("./patch.js")
-var h = require("./h.js")
-var create = require("./create-element.js")
-var VNode = require('./vnode/vnode.js')
-var VText = require('./vnode/vtext.js')
-
-module.exports = {
-    diff: diff,
-    patch: patch,
-    h: h,
-    create: create,
-    VNode: VNode,
-    VText: VText
-}
-
-},{"./create-element.js":179,"./diff.js":180,"./h.js":181,"./patch.js":183,"./vnode/vnode.js":201,"./vnode/vtext.js":203}],183:[function(require,module,exports){
-var patch = require("./vdom/patch.js")
-
-module.exports = patch
-
-},{"./vdom/patch.js":188}],184:[function(require,module,exports){
-var isObject = require("is-object")
-var isHook = require("../vnode/is-vhook.js")
-
-module.exports = applyProperties
-
-function applyProperties(node, props, previous) {
-    for (var propName in props) {
-        var propValue = props[propName]
+    Notification.prototype.accept = function (nextOrObserver, error, complete) {
+        if (nextOrObserver && typeof nextOrObserver.next === 'function') {
+            return this.observe(nextOrObserver);
+        }
+        else {
+            return this.do(nextOrObserver, error, complete);
+        }
+    };
+    Notification.prototype.toObservable = function () {
+        var kind = this.kind;
+        switch (kind) {
+            case 'N':
+                return of_1.of(this.value);
+            case 'E':
+                return throwError_1.throwError(this.error);
+            case 'C':
+                return empty_1.empty();
+        }
+        throw new Error('unexpected notification kind value');
+    };
+    Notification.createNext = function (value) {
+        if (typeof value !== 'undefined') {
+            return new Notification('N', value);
+        }
+        return Notification.undefinedValueNotification;
+    };
+    Notification.createError = function (err) {
+        return new Notification('E', undefined, err);
+    };
+    Notification.createComplete = function () {
+        return Notification.completeNotification;
+    };
+    Notification.completeNotification = new Notification('C');
+    Notification.undefinedValueNotification = new Notification('N', undefined);
+    return Notification;
+}());
+exports.Notification = Notification;
 
-        if (propValue === undefined) {
-            removeProperty(node, propName, propValue, previous);
-        } else if (isHook(propValue)) {
-            removeProperty(node, propName, propValue, previous)
-            if (propValue.hook) {
-                propValue.hook(node,
-                    propName,
-                    previous ? previous[propName] : undefined)
+},{"./observable/empty":65,"./observable/of":76,"./observable/throwError":82}],48:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var canReportError_1 = require("./util/canReportError");
+var toSubscriber_1 = require("./util/toSubscriber");
+var observable_1 = require("./symbol/observable");
+var pipe_1 = require("./util/pipe");
+var config_1 = require("./config");
+var Observable = (function () {
+    function Observable(subscribe) {
+        this._isScalar = false;
+        if (subscribe) {
+            this._subscribe = subscribe;
+        }
+    }
+    Observable.prototype.lift = function (operator) {
+        var observable = new Observable();
+        observable.source = this;
+        observable.operator = operator;
+        return observable;
+    };
+    Observable.prototype.subscribe = function (observerOrNext, error, complete) {
+        var operator = this.operator;
+        var sink = toSubscriber_1.toSubscriber(observerOrNext, error, complete);
+        if (operator) {
+            sink.add(operator.call(sink, this.source));
+        }
+        else {
+            sink.add(this.source || (config_1.config.useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ?
+                this._subscribe(sink) :
+                this._trySubscribe(sink));
+        }
+        if (config_1.config.useDeprecatedSynchronousErrorHandling) {
+            if (sink.syncErrorThrowable) {
+                sink.syncErrorThrowable = false;
+                if (sink.syncErrorThrown) {
+                    throw sink.syncErrorValue;
+                }
             }
-        } else {
-            if (isObject(propValue)) {
-                patchObject(node, props, previous, propName, propValue);
-            } else {
-                node[propName] = propValue
+        }
+        return sink;
+    };
+    Observable.prototype._trySubscribe = function (sink) {
+        try {
+            return this._subscribe(sink);
+        }
+        catch (err) {
+            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
+                sink.syncErrorThrown = true;
+                sink.syncErrorValue = err;
+            }
+            if (canReportError_1.canReportError(sink)) {
+                sink.error(err);
+            }
+            else {
+                console.warn(err);
             }
         }
-    }
-}
-
-function removeProperty(node, propName, propValue, previous) {
-    if (previous) {
-        var previousValue = previous[propName]
-
-        if (!isHook(previousValue)) {
-            if (propName === "attributes") {
-                for (var attrName in previousValue) {
-                    node.removeAttribute(attrName)
+    };
+    Observable.prototype.forEach = function (next, promiseCtor) {
+        var _this = this;
+        promiseCtor = getPromiseCtor(promiseCtor);
+        return new promiseCtor(function (resolve, reject) {
+            var subscription;
+            subscription = _this.subscribe(function (value) {
+                try {
+                    next(value);
                 }
-            } else if (propName === "style") {
-                for (var i in previousValue) {
-                    node.style[i] = ""
+                catch (err) {
+                    reject(err);
+                    if (subscription) {
+                        subscription.unsubscribe();
+                    }
                 }
-            } else if (typeof previousValue === "string") {
-                node[propName] = ""
-            } else {
-                node[propName] = null
-            }
-        } else if (previousValue.unhook) {
-            previousValue.unhook(node, propName, propValue)
+            }, reject, resolve);
+        });
+    };
+    Observable.prototype._subscribe = function (subscriber) {
+        var source = this.source;
+        return source && source.subscribe(subscriber);
+    };
+    Observable.prototype[observable_1.observable] = function () {
+        return this;
+    };
+    Observable.prototype.pipe = function () {
+        var operations = [];
+        for (var _i = 0; _i < arguments.length; _i++) {
+            operations[_i] = arguments[_i];
         }
+        if (operations.length === 0) {
+            return this;
+        }
+        return pipe_1.pipeFromArray(operations)(this);
+    };
+    Observable.prototype.toPromise = function (promiseCtor) {
+        var _this = this;
+        promiseCtor = getPromiseCtor(promiseCtor);
+        return new promiseCtor(function (resolve, reject) {
+            var value;
+            _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); });
+        });
+    };
+    Observable.create = function (subscribe) {
+        return new Observable(subscribe);
+    };
+    return Observable;
+}());
+exports.Observable = Observable;
+function getPromiseCtor(promiseCtor) {
+    if (!promiseCtor) {
+        promiseCtor = config_1.config.Promise || Promise;
     }
+    if (!promiseCtor) {
+        throw new Error('no Promise impl found');
+    }
+    return promiseCtor;
 }
 
-function patchObject(node, props, previous, propName, propValue) {
-    var previousValue = previous ? previous[propName] : undefined
-
-    // Set attributes
-    if (propName === "attributes") {
-        for (var attrName in propValue) {
-            var attrValue = propValue[attrName]
-
-            if (attrValue === undefined) {
-                node.removeAttribute(attrName)
-            } else {
-                node.setAttribute(attrName, attrValue)
-            }
+},{"./config":57,"./symbol/observable":209,"./util/canReportError":217,"./util/pipe":233,"./util/toSubscriber":240}],49:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var config_1 = require("./config");
+var hostReportError_1 = require("./util/hostReportError");
+exports.empty = {
+    closed: true,
+    next: function (value) { },
+    error: function (err) {
+        if (config_1.config.useDeprecatedSynchronousErrorHandling) {
+            throw err;
         }
+        else {
+            hostReportError_1.hostReportError(err);
+        }
+    },
+    complete: function () { }
+};
 
-        return
-    }
-
-    if(previousValue && isObject(previousValue) &&
-        getPrototype(previousValue) !== getPrototype(propValue)) {
-        node[propName] = propValue
-        return
-    }
-
-    if (!isObject(node[propName])) {
-        node[propName] = {}
+},{"./config":57,"./util/hostReportError":218}],50:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     }
-
-    var replacer = propName === "style" ? "" : undefined
-
-    for (var k in propValue) {
-        var value = propValue[k]
-        node[propName][k] = (value === undefined) ? replacer : value
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("./Subscriber");
+var OuterSubscriber = (function (_super) {
+    __extends(OuterSubscriber, _super);
+    function OuterSubscriber() {
+        return _super !== null && _super.apply(this, arguments) || this;
     }
-}
+    OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.destination.next(innerValue);
+    };
+    OuterSubscriber.prototype.notifyError = function (error, innerSub) {
+        this.destination.error(error);
+    };
+    OuterSubscriber.prototype.notifyComplete = function (innerSub) {
+        this.destination.complete();
+    };
+    return OuterSubscriber;
+}(Subscriber_1.Subscriber));
+exports.OuterSubscriber = OuterSubscriber;
 
-function getPrototype(value) {
-    if (Object.getPrototypeOf) {
-        return Object.getPrototypeOf(value)
-    } else if (value.__proto__) {
-        return value.__proto__
-    } else if (value.constructor) {
-        return value.constructor.prototype
+},{"./Subscriber":55}],51:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     }
-}
-
-},{"../vnode/is-vhook.js":196,"is-object":20}],185:[function(require,module,exports){
-var document = require("global/document")
-
-var applyProperties = require("./apply-properties")
-
-var isVNode = require("../vnode/is-vnode.js")
-var isVText = require("../vnode/is-vtext.js")
-var isWidget = require("../vnode/is-widget.js")
-var handleThunk = require("../vnode/handle-thunk.js")
-
-module.exports = createElement
-
-function createElement(vnode, opts) {
-    var doc = opts ? opts.document || document : document
-    var warn = opts ? opts.warn : null
-
-    vnode = handleThunk(vnode).a
-
-    if (isWidget(vnode)) {
-        return vnode.init()
-    } else if (isVText(vnode)) {
-        return doc.createTextNode(vnode.text)
-    } else if (!isVNode(vnode)) {
-        if (warn) {
-            warn("Item is not a valid virtual dom node", vnode)
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("./Subject");
+var queue_1 = require("./scheduler/queue");
+var Subscription_1 = require("./Subscription");
+var observeOn_1 = require("./operators/observeOn");
+var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
+var SubjectSubscription_1 = require("./SubjectSubscription");
+var ReplaySubject = (function (_super) {
+    __extends(ReplaySubject, _super);
+    function ReplaySubject(bufferSize, windowTime, scheduler) {
+        if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }
+        if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }
+        var _this = _super.call(this) || this;
+        _this.scheduler = scheduler;
+        _this._events = [];
+        _this._infiniteTimeWindow = false;
+        _this._bufferSize = bufferSize < 1 ? 1 : bufferSize;
+        _this._windowTime = windowTime < 1 ? 1 : windowTime;
+        if (windowTime === Number.POSITIVE_INFINITY) {
+            _this._infiniteTimeWindow = true;
+            _this.next = _this.nextInfiniteTimeWindow;
         }
-        return null
-    }
-
-    var node = (vnode.namespace === null) ?
-        doc.createElement(vnode.tagName) :
-        doc.createElementNS(vnode.namespace, vnode.tagName)
-
-    var props = vnode.properties
-    applyProperties(node, props)
-
-    var children = vnode.children
-
-    for (var i = 0; i < children.length; i++) {
-        var childNode = createElement(children[i], opts)
-        if (childNode) {
-            node.appendChild(childNode)
+        else {
+            _this.next = _this.nextTimeWindow;
         }
+        return _this;
     }
-
-    return node
-}
-
-},{"../vnode/handle-thunk.js":194,"../vnode/is-vnode.js":197,"../vnode/is-vtext.js":198,"../vnode/is-widget.js":199,"./apply-properties":184,"global/document":16}],186:[function(require,module,exports){
-// Maps a virtual DOM tree onto a real DOM tree in an efficient manner.
-// We don't want to read all of the DOM nodes in the tree so we use
-// the in-order tree indexing to eliminate recursion down certain branches.
-// We only recurse into a DOM node if we know that it contains a child of
-// interest.
-
-var noChild = {}
-
-module.exports = domIndex
-
-function domIndex(rootNode, tree, indices, nodes) {
-    if (!indices || indices.length === 0) {
-        return {}
-    } else {
-        indices.sort(ascending)
-        return recurse(rootNode, tree, indices, nodes, 0)
-    }
-}
-
-function recurse(rootNode, tree, indices, nodes, rootIndex) {
-    nodes = nodes || {}
-
-
-    if (rootNode) {
-        if (indexInRange(indices, rootIndex, rootIndex)) {
-            nodes[rootIndex] = rootNode
+    ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) {
+        var _events = this._events;
+        _events.push(value);
+        if (_events.length > this._bufferSize) {
+            _events.shift();
         }
-
-        var vChildren = tree.children
-
-        if (vChildren) {
-
-            var childNodes = rootNode.childNodes
-
-            for (var i = 0; i < tree.children.length; i++) {
-                rootIndex += 1
-
-                var vChild = vChildren[i] || noChild
-                var nextIndex = rootIndex + (vChild.count || 0)
-
-                // skip recursion down the tree if there are no nodes down here
-                if (indexInRange(indices, rootIndex, nextIndex)) {
-                    recurse(childNodes[i], vChild, indices, nodes, rootIndex)
-                }
-
-                rootIndex = nextIndex
+        _super.prototype.next.call(this, value);
+    };
+    ReplaySubject.prototype.nextTimeWindow = function (value) {
+        this._events.push(new ReplayEvent(this._getNow(), value));
+        this._trimBufferThenGetEvents();
+        _super.prototype.next.call(this, value);
+    };
+    ReplaySubject.prototype._subscribe = function (subscriber) {
+        var _infiniteTimeWindow = this._infiniteTimeWindow;
+        var _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents();
+        var scheduler = this.scheduler;
+        var len = _events.length;
+        var subscription;
+        if (this.closed) {
+            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
+        }
+        else if (this.isStopped || this.hasError) {
+            subscription = Subscription_1.Subscription.EMPTY;
+        }
+        else {
+            this.observers.push(subscriber);
+            subscription = new SubjectSubscription_1.SubjectSubscription(this, subscriber);
+        }
+        if (scheduler) {
+            subscriber.add(subscriber = new observeOn_1.ObserveOnSubscriber(subscriber, scheduler));
+        }
+        if (_infiniteTimeWindow) {
+            for (var i = 0; i < len && !subscriber.closed; i++) {
+                subscriber.next(_events[i]);
+            }
+        }
+        else {
+            for (var i = 0; i < len && !subscriber.closed; i++) {
+                subscriber.next(_events[i].value);
+            }
+        }
+        if (this.hasError) {
+            subscriber.error(this.thrownError);
+        }
+        else if (this.isStopped) {
+            subscriber.complete();
+        }
+        return subscription;
+    };
+    ReplaySubject.prototype._getNow = function () {
+        return (this.scheduler || queue_1.queue).now();
+    };
+    ReplaySubject.prototype._trimBufferThenGetEvents = function () {
+        var now = this._getNow();
+        var _bufferSize = this._bufferSize;
+        var _windowTime = this._windowTime;
+        var _events = this._events;
+        var eventsCount = _events.length;
+        var spliceCount = 0;
+        while (spliceCount < eventsCount) {
+            if ((now - _events[spliceCount].time) < _windowTime) {
+                break;
             }
+            spliceCount++;
+        }
+        if (eventsCount > _bufferSize) {
+            spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);
+        }
+        if (spliceCount > 0) {
+            _events.splice(0, spliceCount);
         }
+        return _events;
+    };
+    return ReplaySubject;
+}(Subject_1.Subject));
+exports.ReplaySubject = ReplaySubject;
+var ReplayEvent = (function () {
+    function ReplayEvent(time, value) {
+        this.time = time;
+        this.value = value;
     }
+    return ReplayEvent;
+}());
 
-    return nodes
-}
-
-// Binary search for an index in the interval [left, right]
-function indexInRange(indices, left, right) {
-    if (indices.length === 0) {
-        return false
+},{"./Subject":53,"./SubjectSubscription":54,"./Subscription":56,"./operators/observeOn":136,"./scheduler/queue":207,"./util/ObjectUnsubscribedError":214}],52:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Scheduler = (function () {
+    function Scheduler(SchedulerAction, now) {
+        if (now === void 0) { now = Scheduler.now; }
+        this.SchedulerAction = SchedulerAction;
+        this.now = now;
     }
+    Scheduler.prototype.schedule = function (work, delay, state) {
+        if (delay === void 0) { delay = 0; }
+        return new this.SchedulerAction(this, work).schedule(state, delay);
+    };
+    Scheduler.now = function () { return Date.now(); };
+    return Scheduler;
+}());
+exports.Scheduler = Scheduler;
 
-    var minIndex = 0
-    var maxIndex = indices.length - 1
-    var currentIndex
-    var currentItem
-
-    while (minIndex <= maxIndex) {
-        currentIndex = ((maxIndex + minIndex) / 2) >> 0
-        currentItem = indices[currentIndex]
-
-        if (minIndex === maxIndex) {
-            return currentItem >= left && currentItem <= right
-        } else if (currentItem < left) {
-            minIndex = currentIndex + 1
-        } else  if (currentItem > right) {
-            maxIndex = currentIndex - 1
-        } else {
-            return true
-        }
+},{}],53:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     }
-
-    return false;
-}
-
-function ascending(a, b) {
-    return a > b ? 1 : -1
-}
-
-},{}],187:[function(require,module,exports){
-var applyProperties = require("./apply-properties")
-
-var isWidget = require("../vnode/is-widget.js")
-var VPatch = require("../vnode/vpatch.js")
-
-var updateWidget = require("./update-widget")
-
-module.exports = applyPatch
-
-function applyPatch(vpatch, domNode, renderOptions) {
-    var type = vpatch.type
-    var vNode = vpatch.vNode
-    var patch = vpatch.patch
-
-    switch (type) {
-        case VPatch.REMOVE:
-            return removeNode(domNode, vNode)
-        case VPatch.INSERT:
-            return insertNode(domNode, patch, renderOptions)
-        case VPatch.VTEXT:
-            return stringPatch(domNode, vNode, patch, renderOptions)
-        case VPatch.WIDGET:
-            return widgetPatch(domNode, vNode, patch, renderOptions)
-        case VPatch.VNODE:
-            return vNodePatch(domNode, vNode, patch, renderOptions)
-        case VPatch.ORDER:
-            reorderChildren(domNode, patch)
-            return domNode
-        case VPatch.PROPS:
-            applyProperties(domNode, patch, vNode.properties)
-            return domNode
-        case VPatch.THUNK:
-            return replaceRoot(domNode,
-                renderOptions.patch(domNode, patch, renderOptions))
-        default:
-            return domNode
-    }
-}
-
-function removeNode(domNode, vNode) {
-    var parentNode = domNode.parentNode
-
-    if (parentNode) {
-        parentNode.removeChild(domNode)
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("./Observable");
+var Subscriber_1 = require("./Subscriber");
+var Subscription_1 = require("./Subscription");
+var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
+var SubjectSubscription_1 = require("./SubjectSubscription");
+var rxSubscriber_1 = require("../internal/symbol/rxSubscriber");
+var SubjectSubscriber = (function (_super) {
+    __extends(SubjectSubscriber, _super);
+    function SubjectSubscriber(destination) {
+        var _this = _super.call(this, destination) || this;
+        _this.destination = destination;
+        return _this;
     }
-
-    destroyWidget(domNode, vNode);
-
-    return null
-}
-
-function insertNode(parentNode, vNode, renderOptions) {
-    var newNode = renderOptions.render(vNode, renderOptions)
-
-    if (parentNode) {
-        parentNode.appendChild(newNode)
+    return SubjectSubscriber;
+}(Subscriber_1.Subscriber));
+exports.SubjectSubscriber = SubjectSubscriber;
+var Subject = (function (_super) {
+    __extends(Subject, _super);
+    function Subject() {
+        var _this = _super.call(this) || this;
+        _this.observers = [];
+        _this.closed = false;
+        _this.isStopped = false;
+        _this.hasError = false;
+        _this.thrownError = null;
+        return _this;
     }
-
-    return parentNode
-}
-
-function stringPatch(domNode, leftVNode, vText, renderOptions) {
-    var newNode
-
-    if (domNode.nodeType === 3) {
-        domNode.replaceData(0, domNode.length, vText.text)
-        newNode = domNode
-    } else {
-        var parentNode = domNode.parentNode
-        newNode = renderOptions.render(vText, renderOptions)
-
-        if (parentNode && newNode !== domNode) {
-            parentNode.replaceChild(newNode, domNode)
+    Subject.prototype[rxSubscriber_1.rxSubscriber] = function () {
+        return new SubjectSubscriber(this);
+    };
+    Subject.prototype.lift = function (operator) {
+        var subject = new AnonymousSubject(this, this);
+        subject.operator = operator;
+        return subject;
+    };
+    Subject.prototype.next = function (value) {
+        if (this.closed) {
+            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
         }
-    }
-
-    return newNode
-}
-
-function widgetPatch(domNode, leftVNode, widget, renderOptions) {
-    var updating = updateWidget(leftVNode, widget)
-    var newNode
-
-    if (updating) {
-        newNode = widget.update(leftVNode, domNode) || domNode
-    } else {
-        newNode = renderOptions.render(widget, renderOptions)
-    }
-
-    var parentNode = domNode.parentNode
-
-    if (parentNode && newNode !== domNode) {
-        parentNode.replaceChild(newNode, domNode)
-    }
-
-    if (!updating) {
-        destroyWidget(domNode, leftVNode)
-    }
-
-    return newNode
-}
-
-function vNodePatch(domNode, leftVNode, vNode, renderOptions) {
-    var parentNode = domNode.parentNode
-    var newNode = renderOptions.render(vNode, renderOptions)
-
-    if (parentNode && newNode !== domNode) {
-        parentNode.replaceChild(newNode, domNode)
-    }
-
-    return newNode
-}
-
-function destroyWidget(domNode, w) {
-    if (typeof w.destroy === "function" && isWidget(w)) {
-        w.destroy(domNode)
-    }
-}
-
-function reorderChildren(domNode, moves) {
-    var childNodes = domNode.childNodes
-    var keyMap = {}
-    var node
-    var remove
-    var insert
-
-    for (var i = 0; i < moves.removes.length; i++) {
-        remove = moves.removes[i]
-        node = childNodes[remove.from]
-        if (remove.key) {
-            keyMap[remove.key] = node
+        if (!this.isStopped) {
+            var observers = this.observers;
+            var len = observers.length;
+            var copy = observers.slice();
+            for (var i = 0; i < len; i++) {
+                copy[i].next(value);
+            }
         }
-        domNode.removeChild(node)
-    }
-
-    var length = childNodes.length
-    for (var j = 0; j < moves.inserts.length; j++) {
-        insert = moves.inserts[j]
-        node = keyMap[insert.key]
-        // this is the weirdest bug i've ever seen in webkit
-        domNode.insertBefore(node, insert.to >= length++ ? null : childNodes[insert.to])
-    }
-}
-
-function replaceRoot(oldRoot, newRoot) {
-    if (oldRoot && newRoot && oldRoot !== newRoot && oldRoot.parentNode) {
-        oldRoot.parentNode.replaceChild(newRoot, oldRoot)
+    };
+    Subject.prototype.error = function (err) {
+        if (this.closed) {
+            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
+        }
+        this.hasError = true;
+        this.thrownError = err;
+        this.isStopped = true;
+        var observers = this.observers;
+        var len = observers.length;
+        var copy = observers.slice();
+        for (var i = 0; i < len; i++) {
+            copy[i].error(err);
+        }
+        this.observers.length = 0;
+    };
+    Subject.prototype.complete = function () {
+        if (this.closed) {
+            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
+        }
+        this.isStopped = true;
+        var observers = this.observers;
+        var len = observers.length;
+        var copy = observers.slice();
+        for (var i = 0; i < len; i++) {
+            copy[i].complete();
+        }
+        this.observers.length = 0;
+    };
+    Subject.prototype.unsubscribe = function () {
+        this.isStopped = true;
+        this.closed = true;
+        this.observers = null;
+    };
+    Subject.prototype._trySubscribe = function (subscriber) {
+        if (this.closed) {
+            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
+        }
+        else {
+            return _super.prototype._trySubscribe.call(this, subscriber);
+        }
+    };
+    Subject.prototype._subscribe = function (subscriber) {
+        if (this.closed) {
+            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
+        }
+        else if (this.hasError) {
+            subscriber.error(this.thrownError);
+            return Subscription_1.Subscription.EMPTY;
+        }
+        else if (this.isStopped) {
+            subscriber.complete();
+            return Subscription_1.Subscription.EMPTY;
+        }
+        else {
+            this.observers.push(subscriber);
+            return new SubjectSubscription_1.SubjectSubscription(this, subscriber);
+        }
+    };
+    Subject.prototype.asObservable = function () {
+        var observable = new Observable_1.Observable();
+        observable.source = this;
+        return observable;
+    };
+    Subject.create = function (destination, source) {
+        return new AnonymousSubject(destination, source);
+    };
+    return Subject;
+}(Observable_1.Observable));
+exports.Subject = Subject;
+var AnonymousSubject = (function (_super) {
+    __extends(AnonymousSubject, _super);
+    function AnonymousSubject(destination, source) {
+        var _this = _super.call(this) || this;
+        _this.destination = destination;
+        _this.source = source;
+        return _this;
     }
+    AnonymousSubject.prototype.next = function (value) {
+        var destination = this.destination;
+        if (destination && destination.next) {
+            destination.next(value);
+        }
+    };
+    AnonymousSubject.prototype.error = function (err) {
+        var destination = this.destination;
+        if (destination && destination.error) {
+            this.destination.error(err);
+        }
+    };
+    AnonymousSubject.prototype.complete = function () {
+        var destination = this.destination;
+        if (destination && destination.complete) {
+            this.destination.complete();
+        }
+    };
+    AnonymousSubject.prototype._subscribe = function (subscriber) {
+        var source = this.source;
+        if (source) {
+            return this.source.subscribe(subscriber);
+        }
+        else {
+            return Subscription_1.Subscription.EMPTY;
+        }
+    };
+    return AnonymousSubject;
+}(Subject));
+exports.AnonymousSubject = AnonymousSubject;
 
-    return newRoot;
-}
-
-},{"../vnode/is-widget.js":199,"../vnode/vpatch.js":202,"./apply-properties":184,"./update-widget":189}],188:[function(require,module,exports){
-var document = require("global/document")
-var isArray = require("x-is-array")
-
-var render = require("./create-element")
-var domIndex = require("./dom-index")
-var patchOp = require("./patch-op")
-module.exports = patch
-
-function patch(rootNode, patches, renderOptions) {
-    renderOptions = renderOptions || {}
-    renderOptions.patch = renderOptions.patch && renderOptions.patch !== patch
-        ? renderOptions.patch
-        : patchRecursive
-    renderOptions.render = renderOptions.render || render
-
-    return renderOptions.patch(rootNode, patches, renderOptions)
-}
-
-function patchRecursive(rootNode, patches, renderOptions) {
-    var indices = patchIndices(patches)
-
-    if (indices.length === 0) {
-        return rootNode
+},{"../internal/symbol/rxSubscriber":210,"./Observable":48,"./SubjectSubscription":54,"./Subscriber":55,"./Subscription":56,"./util/ObjectUnsubscribedError":214}],54:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     }
-
-    var index = domIndex(rootNode, patches.a, indices)
-    var ownerDocument = rootNode.ownerDocument
-
-    if (!renderOptions.document && ownerDocument !== document) {
-        renderOptions.document = ownerDocument
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscription_1 = require("./Subscription");
+var SubjectSubscription = (function (_super) {
+    __extends(SubjectSubscription, _super);
+    function SubjectSubscription(subject, subscriber) {
+        var _this = _super.call(this) || this;
+        _this.subject = subject;
+        _this.subscriber = subscriber;
+        _this.closed = false;
+        return _this;
     }
+    SubjectSubscription.prototype.unsubscribe = function () {
+        if (this.closed) {
+            return;
+        }
+        this.closed = true;
+        var subject = this.subject;
+        var observers = subject.observers;
+        this.subject = null;
+        if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {
+            return;
+        }
+        var subscriberIndex = observers.indexOf(this.subscriber);
+        if (subscriberIndex !== -1) {
+            observers.splice(subscriberIndex, 1);
+        }
+    };
+    return SubjectSubscription;
+}(Subscription_1.Subscription));
+exports.SubjectSubscription = SubjectSubscription;
 
-    for (var i = 0; i < indices.length; i++) {
-        var nodeIndex = indices[i]
-        rootNode = applyPatch(rootNode,
-            index[nodeIndex],
-            patches[nodeIndex],
-            renderOptions)
+},{"./Subscription":56}],55:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     }
-
-    return rootNode
-}
-
-function applyPatch(rootNode, domNode, patchList, renderOptions) {
-    if (!domNode) {
-        return rootNode
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var isFunction_1 = require("./util/isFunction");
+var Observer_1 = require("./Observer");
+var Subscription_1 = require("./Subscription");
+var rxSubscriber_1 = require("../internal/symbol/rxSubscriber");
+var config_1 = require("./config");
+var hostReportError_1 = require("./util/hostReportError");
+var Subscriber = (function (_super) {
+    __extends(Subscriber, _super);
+    function Subscriber(destinationOrNext, error, complete) {
+        var _this = _super.call(this) || this;
+        _this.syncErrorValue = null;
+        _this.syncErrorThrown = false;
+        _this.syncErrorThrowable = false;
+        _this.isStopped = false;
+        switch (arguments.length) {
+            case 0:
+                _this.destination = Observer_1.empty;
+                break;
+            case 1:
+                if (!destinationOrNext) {
+                    _this.destination = Observer_1.empty;
+                    break;
+                }
+                if (typeof destinationOrNext === 'object') {
+                    if (destinationOrNext instanceof Subscriber) {
+                        _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable;
+                        _this.destination = destinationOrNext;
+                        destinationOrNext.add(_this);
+                    }
+                    else {
+                        _this.syncErrorThrowable = true;
+                        _this.destination = new SafeSubscriber(_this, destinationOrNext);
+                    }
+                    break;
+                }
+            default:
+                _this.syncErrorThrowable = true;
+                _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete);
+                break;
+        }
+        return _this;
     }
-
-    var newNode
-
-    if (isArray(patchList)) {
-        for (var i = 0; i < patchList.length; i++) {
-            newNode = patchOp(patchList[i], domNode, renderOptions)
-
-            if (domNode === rootNode) {
-                rootNode = newNode
-            }
+    Subscriber.prototype[rxSubscriber_1.rxSubscriber] = function () { return this; };
+    Subscriber.create = function (next, error, complete) {
+        var subscriber = new Subscriber(next, error, complete);
+        subscriber.syncErrorThrowable = false;
+        return subscriber;
+    };
+    Subscriber.prototype.next = function (value) {
+        if (!this.isStopped) {
+            this._next(value);
         }
-    } else {
-        newNode = patchOp(patchList, domNode, renderOptions)
-
-        if (domNode === rootNode) {
-            rootNode = newNode
+    };
+    Subscriber.prototype.error = function (err) {
+        if (!this.isStopped) {
+            this.isStopped = true;
+            this._error(err);
         }
-    }
-
-    return rootNode
-}
-
-function patchIndices(patches) {
-    var indices = []
-
-    for (var key in patches) {
-        if (key !== "a") {
-            indices.push(Number(key))
+    };
+    Subscriber.prototype.complete = function () {
+        if (!this.isStopped) {
+            this.isStopped = true;
+            this._complete();
         }
-    }
-
-    return indices
-}
-
-},{"./create-element":185,"./dom-index":186,"./patch-op":187,"global/document":16,"x-is-array":224}],189:[function(require,module,exports){
-var isWidget = require("../vnode/is-widget.js")
-
-module.exports = updateWidget
-
-function updateWidget(a, b) {
-    if (isWidget(a) && isWidget(b)) {
-        if ("name" in a && "name" in b) {
-            return a.id === b.id
-        } else {
-            return a.init === b.init
+    };
+    Subscriber.prototype.unsubscribe = function () {
+        if (this.closed) {
+            return;
+        }
+        this.isStopped = true;
+        _super.prototype.unsubscribe.call(this);
+    };
+    Subscriber.prototype._next = function (value) {
+        this.destination.next(value);
+    };
+    Subscriber.prototype._error = function (err) {
+        this.destination.error(err);
+        this.unsubscribe();
+    };
+    Subscriber.prototype._complete = function () {
+        this.destination.complete();
+        this.unsubscribe();
+    };
+    Subscriber.prototype._unsubscribeAndRecycle = function () {
+        var _parentOrParents = this._parentOrParents;
+        this._parentOrParents = null;
+        this.unsubscribe();
+        this.closed = false;
+        this.isStopped = false;
+        this._parentOrParents = _parentOrParents;
+        return this;
+    };
+    return Subscriber;
+}(Subscription_1.Subscription));
+exports.Subscriber = Subscriber;
+var SafeSubscriber = (function (_super) {
+    __extends(SafeSubscriber, _super);
+    function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) {
+        var _this = _super.call(this) || this;
+        _this._parentSubscriber = _parentSubscriber;
+        var next;
+        var context = _this;
+        if (isFunction_1.isFunction(observerOrNext)) {
+            next = observerOrNext;
+        }
+        else if (observerOrNext) {
+            next = observerOrNext.next;
+            error = observerOrNext.error;
+            complete = observerOrNext.complete;
+            if (observerOrNext !== Observer_1.empty) {
+                context = Object.create(observerOrNext);
+                if (isFunction_1.isFunction(context.unsubscribe)) {
+                    _this.add(context.unsubscribe.bind(context));
+                }
+                context.unsubscribe = _this.unsubscribe.bind(_this);
+            }
         }
+        _this._context = context;
+        _this._next = next;
+        _this._error = error;
+        _this._complete = complete;
+        return _this;
     }
+    SafeSubscriber.prototype.next = function (value) {
+        if (!this.isStopped && this._next) {
+            var _parentSubscriber = this._parentSubscriber;
+            if (!config_1.config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
+                this.__tryOrUnsub(this._next, value);
+            }
+            else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {
+                this.unsubscribe();
+            }
+        }
+    };
+    SafeSubscriber.prototype.error = function (err) {
+        if (!this.isStopped) {
+            var _parentSubscriber = this._parentSubscriber;
+            var useDeprecatedSynchronousErrorHandling = config_1.config.useDeprecatedSynchronousErrorHandling;
+            if (this._error) {
+                if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
+                    this.__tryOrUnsub(this._error, err);
+                    this.unsubscribe();
+                }
+                else {
+                    this.__tryOrSetError(_parentSubscriber, this._error, err);
+                    this.unsubscribe();
+                }
+            }
+            else if (!_parentSubscriber.syncErrorThrowable) {
+                this.unsubscribe();
+                if (useDeprecatedSynchronousErrorHandling) {
+                    throw err;
+                }
+                hostReportError_1.hostReportError(err);
+            }
+            else {
+                if (useDeprecatedSynchronousErrorHandling) {
+                    _parentSubscriber.syncErrorValue = err;
+                    _parentSubscriber.syncErrorThrown = true;
+                }
+                else {
+                    hostReportError_1.hostReportError(err);
+                }
+                this.unsubscribe();
+            }
+        }
+    };
+    SafeSubscriber.prototype.complete = function () {
+        var _this = this;
+        if (!this.isStopped) {
+            var _parentSubscriber = this._parentSubscriber;
+            if (this._complete) {
+                var wrappedComplete = function () { return _this._complete.call(_this._context); };
+                if (!config_1.config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
+                    this.__tryOrUnsub(wrappedComplete);
+                    this.unsubscribe();
+                }
+                else {
+                    this.__tryOrSetError(_parentSubscriber, wrappedComplete);
+                    this.unsubscribe();
+                }
+            }
+            else {
+                this.unsubscribe();
+            }
+        }
+    };
+    SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {
+        try {
+            fn.call(this._context, value);
+        }
+        catch (err) {
+            this.unsubscribe();
+            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
+                throw err;
+            }
+            else {
+                hostReportError_1.hostReportError(err);
+            }
+        }
+    };
+    SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {
+        if (!config_1.config.useDeprecatedSynchronousErrorHandling) {
+            throw new Error('bad call');
+        }
+        try {
+            fn.call(this._context, value);
+        }
+        catch (err) {
+            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
+                parent.syncErrorValue = err;
+                parent.syncErrorThrown = true;
+                return true;
+            }
+            else {
+                hostReportError_1.hostReportError(err);
+                return true;
+            }
+        }
+        return false;
+    };
+    SafeSubscriber.prototype._unsubscribe = function () {
+        var _parentSubscriber = this._parentSubscriber;
+        this._context = null;
+        this._parentSubscriber = null;
+        _parentSubscriber.unsubscribe();
+    };
+    return SafeSubscriber;
+}(Subscriber));
+exports.SafeSubscriber = SafeSubscriber;
 
-    return false
-}
-
-},{"../vnode/is-widget.js":199}],190:[function(require,module,exports){
-'use strict';
-
-var EvStore = require('ev-store');
-
-module.exports = EvHook;
-
-function EvHook(value) {
-    if (!(this instanceof EvHook)) {
-        return new EvHook(value);
+},{"../internal/symbol/rxSubscriber":210,"./Observer":49,"./Subscription":56,"./config":57,"./util/hostReportError":218,"./util/isFunction":223}],56:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var isArray_1 = require("./util/isArray");
+var isObject_1 = require("./util/isObject");
+var isFunction_1 = require("./util/isFunction");
+var UnsubscriptionError_1 = require("./util/UnsubscriptionError");
+var Subscription = (function () {
+    function Subscription(unsubscribe) {
+        this.closed = false;
+        this._parentOrParents = null;
+        this._subscriptions = null;
+        if (unsubscribe) {
+            this._unsubscribe = unsubscribe;
+        }
     }
-
-    this.value = value;
+    Subscription.prototype.unsubscribe = function () {
+        var errors;
+        if (this.closed) {
+            return;
+        }
+        var _a = this, _parentOrParents = _a._parentOrParents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions;
+        this.closed = true;
+        this._parentOrParents = null;
+        this._subscriptions = null;
+        if (_parentOrParents instanceof Subscription) {
+            _parentOrParents.remove(this);
+        }
+        else if (_parentOrParents !== null) {
+            for (var index = 0; index < _parentOrParents.length; ++index) {
+                var parent_1 = _parentOrParents[index];
+                parent_1.remove(this);
+            }
+        }
+        if (isFunction_1.isFunction(_unsubscribe)) {
+            try {
+                _unsubscribe.call(this);
+            }
+            catch (e) {
+                errors = e instanceof UnsubscriptionError_1.UnsubscriptionError ? flattenUnsubscriptionErrors(e.errors) : [e];
+            }
+        }
+        if (isArray_1.isArray(_subscriptions)) {
+            var index = -1;
+            var len = _subscriptions.length;
+            while (++index < len) {
+                var sub = _subscriptions[index];
+                if (isObject_1.isObject(sub)) {
+                    try {
+                        sub.unsubscribe();
+                    }
+                    catch (e) {
+                        errors = errors || [];
+                        if (e instanceof UnsubscriptionError_1.UnsubscriptionError) {
+                            errors = errors.concat(flattenUnsubscriptionErrors(e.errors));
+                        }
+                        else {
+                            errors.push(e);
+                        }
+                    }
+                }
+            }
+        }
+        if (errors) {
+            throw new UnsubscriptionError_1.UnsubscriptionError(errors);
+        }
+    };
+    Subscription.prototype.add = function (teardown) {
+        var subscription = teardown;
+        if (!teardown) {
+            return Subscription.EMPTY;
+        }
+        switch (typeof teardown) {
+            case 'function':
+                subscription = new Subscription(teardown);
+            case 'object':
+                if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') {
+                    return subscription;
+                }
+                else if (this.closed) {
+                    subscription.unsubscribe();
+                    return subscription;
+                }
+                else if (!(subscription instanceof Subscription)) {
+                    var tmp = subscription;
+                    subscription = new Subscription();
+                    subscription._subscriptions = [tmp];
+                }
+                break;
+            default: {
+                throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');
+            }
+        }
+        var _parentOrParents = subscription._parentOrParents;
+        if (_parentOrParents === null) {
+            subscription._parentOrParents = this;
+        }
+        else if (_parentOrParents instanceof Subscription) {
+            if (_parentOrParents === this) {
+                return subscription;
+            }
+            subscription._parentOrParents = [_parentOrParents, this];
+        }
+        else if (_parentOrParents.indexOf(this) === -1) {
+            _parentOrParents.push(this);
+        }
+        else {
+            return subscription;
+        }
+        var subscriptions = this._subscriptions;
+        if (subscriptions === null) {
+            this._subscriptions = [subscription];
+        }
+        else {
+            subscriptions.push(subscription);
+        }
+        return subscription;
+    };
+    Subscription.prototype.remove = function (subscription) {
+        var subscriptions = this._subscriptions;
+        if (subscriptions) {
+            var subscriptionIndex = subscriptions.indexOf(subscription);
+            if (subscriptionIndex !== -1) {
+                subscriptions.splice(subscriptionIndex, 1);
+            }
+        }
+    };
+    Subscription.EMPTY = (function (empty) {
+        empty.closed = true;
+        return empty;
+    }(new Subscription()));
+    return Subscription;
+}());
+exports.Subscription = Subscription;
+function flattenUnsubscriptionErrors(errors) {
+    return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError_1.UnsubscriptionError) ? err.errors : err); }, []);
 }
 
-EvHook.prototype.hook = function (node, propertyName) {
-    var es = EvStore(node);
-    var propName = propertyName.substr(3);
-
-    es[propName] = this.value;
-};
-
-EvHook.prototype.unhook = function(node, propertyName) {
-    var es = EvStore(node);
-    var propName = propertyName.substr(3);
-
-    es[propName] = undefined;
+},{"./util/UnsubscriptionError":216,"./util/isArray":220,"./util/isFunction":223,"./util/isObject":227}],57:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var _enable_super_gross_mode_that_will_cause_bad_things = false;
+exports.config = {
+    Promise: undefined,
+    set useDeprecatedSynchronousErrorHandling(value) {
+        if (value) {
+            var error = new Error();
+            console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n' + error.stack);
+        }
+        else if (_enable_super_gross_mode_that_will_cause_bad_things) {
+            console.log('RxJS: Back to a better error behavior. Thank you. <3');
+        }
+        _enable_super_gross_mode_that_will_cause_bad_things = value;
+    },
+    get useDeprecatedSynchronousErrorHandling() {
+        return _enable_super_gross_mode_that_will_cause_bad_things;
+    },
 };
 
-},{"ev-store":9}],191:[function(require,module,exports){
-'use strict';
-
-module.exports = SoftSetHook;
-
-function SoftSetHook(value) {
-    if (!(this instanceof SoftSetHook)) {
-        return new SoftSetHook(value);
+},{}],58:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     }
-
-    this.value = value;
-}
-
-SoftSetHook.prototype.hook = function (node, propertyName) {
-    if (node[propertyName] !== this.value) {
-        node[propertyName] = this.value;
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("../Subject");
+var Observable_1 = require("../Observable");
+var Subscriber_1 = require("../Subscriber");
+var Subscription_1 = require("../Subscription");
+var refCount_1 = require("../operators/refCount");
+var ConnectableObservable = (function (_super) {
+    __extends(ConnectableObservable, _super);
+    function ConnectableObservable(source, subjectFactory) {
+        var _this = _super.call(this) || this;
+        _this.source = source;
+        _this.subjectFactory = subjectFactory;
+        _this._refCount = 0;
+        _this._isComplete = false;
+        return _this;
     }
-};
-
-},{}],192:[function(require,module,exports){
-'use strict';
-
-var isArray = require('x-is-array');
-
-var VNode = require('../vnode/vnode.js');
-var VText = require('../vnode/vtext.js');
-var isVNode = require('../vnode/is-vnode');
-var isVText = require('../vnode/is-vtext');
-var isWidget = require('../vnode/is-widget');
-var isHook = require('../vnode/is-vhook');
-var isVThunk = require('../vnode/is-thunk');
-
-var parseTag = require('./parse-tag.js');
-var softSetHook = require('./hooks/soft-set-hook.js');
-var evHook = require('./hooks/ev-hook.js');
-
-module.exports = h;
-
-function h(tagName, properties, children) {
-    var childNodes = [];
-    var tag, props, key, namespace;
-
-    if (!children && isChildren(properties)) {
-        children = properties;
-        props = {};
+    ConnectableObservable.prototype._subscribe = function (subscriber) {
+        return this.getSubject().subscribe(subscriber);
+    };
+    ConnectableObservable.prototype.getSubject = function () {
+        var subject = this._subject;
+        if (!subject || subject.isStopped) {
+            this._subject = this.subjectFactory();
+        }
+        return this._subject;
+    };
+    ConnectableObservable.prototype.connect = function () {
+        var connection = this._connection;
+        if (!connection) {
+            this._isComplete = false;
+            connection = this._connection = new Subscription_1.Subscription();
+            connection.add(this.source
+                .subscribe(new ConnectableSubscriber(this.getSubject(), this)));
+            if (connection.closed) {
+                this._connection = null;
+                connection = Subscription_1.Subscription.EMPTY;
+            }
+        }
+        return connection;
+    };
+    ConnectableObservable.prototype.refCount = function () {
+        return refCount_1.refCount()(this);
+    };
+    return ConnectableObservable;
+}(Observable_1.Observable));
+exports.ConnectableObservable = ConnectableObservable;
+exports.connectableObservableDescriptor = (function () {
+    var connectableProto = ConnectableObservable.prototype;
+    return {
+        operator: { value: null },
+        _refCount: { value: 0, writable: true },
+        _subject: { value: null, writable: true },
+        _connection: { value: null, writable: true },
+        _subscribe: { value: connectableProto._subscribe },
+        _isComplete: { value: connectableProto._isComplete, writable: true },
+        getSubject: { value: connectableProto.getSubject },
+        connect: { value: connectableProto.connect },
+        refCount: { value: connectableProto.refCount }
+    };
+})();
+var ConnectableSubscriber = (function (_super) {
+    __extends(ConnectableSubscriber, _super);
+    function ConnectableSubscriber(destination, connectable) {
+        var _this = _super.call(this, destination) || this;
+        _this.connectable = connectable;
+        return _this;
     }
-
-    props = props || properties || {};
-    tag = parseTag(tagName, props);
-
-    // support keys
-    if (props.hasOwnProperty('key')) {
-        key = props.key;
-        props.key = undefined;
+    ConnectableSubscriber.prototype._error = function (err) {
+        this._unsubscribe();
+        _super.prototype._error.call(this, err);
+    };
+    ConnectableSubscriber.prototype._complete = function () {
+        this.connectable._isComplete = true;
+        this._unsubscribe();
+        _super.prototype._complete.call(this);
+    };
+    ConnectableSubscriber.prototype._unsubscribe = function () {
+        var connectable = this.connectable;
+        if (connectable) {
+            this.connectable = null;
+            var connection = connectable._connection;
+            connectable._refCount = 0;
+            connectable._subject = null;
+            connectable._connection = null;
+            if (connection) {
+                connection.unsubscribe();
+            }
+        }
+    };
+    return ConnectableSubscriber;
+}(Subject_1.SubjectSubscriber));
+var RefCountOperator = (function () {
+    function RefCountOperator(connectable) {
+        this.connectable = connectable;
     }
-
-    // support namespace
-    if (props.hasOwnProperty('namespace')) {
-        namespace = props.namespace;
-        props.namespace = undefined;
+    RefCountOperator.prototype.call = function (subscriber, source) {
+        var connectable = this.connectable;
+        connectable._refCount++;
+        var refCounter = new RefCountSubscriber(subscriber, connectable);
+        var subscription = source.subscribe(refCounter);
+        if (!refCounter.closed) {
+            refCounter.connection = connectable.connect();
+        }
+        return subscription;
+    };
+    return RefCountOperator;
+}());
+var RefCountSubscriber = (function (_super) {
+    __extends(RefCountSubscriber, _super);
+    function RefCountSubscriber(destination, connectable) {
+        var _this = _super.call(this, destination) || this;
+        _this.connectable = connectable;
+        return _this;
     }
+    RefCountSubscriber.prototype._unsubscribe = function () {
+        var connectable = this.connectable;
+        if (!connectable) {
+            this.connection = null;
+            return;
+        }
+        this.connectable = null;
+        var refCount = connectable._refCount;
+        if (refCount <= 0) {
+            this.connection = null;
+            return;
+        }
+        connectable._refCount = refCount - 1;
+        if (refCount > 1) {
+            this.connection = null;
+            return;
+        }
+        var connection = this.connection;
+        var sharedConnection = connectable._connection;
+        this.connection = null;
+        if (sharedConnection && (!connection || sharedConnection === connection)) {
+            sharedConnection.unsubscribe();
+        }
+    };
+    return RefCountSubscriber;
+}(Subscriber_1.Subscriber));
 
-    // fix cursor bug
-    if (tag === 'INPUT' &&
-        !namespace &&
-        props.hasOwnProperty('value') &&
-        props.value !== undefined &&
-        !isHook(props.value)
-    ) {
-        props.value = softSetHook(props.value);
+},{"../Observable":48,"../Subject":53,"../Subscriber":55,"../Subscription":56,"../operators/refCount":147}],59:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     }
-
-    transformProperties(props);
-
-    if (children !== undefined && children !== null) {
-        addChild(children, childNodes, tag, props);
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var asap_1 = require("../scheduler/asap");
+var isNumeric_1 = require("../util/isNumeric");
+var SubscribeOnObservable = (function (_super) {
+    __extends(SubscribeOnObservable, _super);
+    function SubscribeOnObservable(source, delayTime, scheduler) {
+        if (delayTime === void 0) { delayTime = 0; }
+        if (scheduler === void 0) { scheduler = asap_1.asap; }
+        var _this = _super.call(this) || this;
+        _this.source = source;
+        _this.delayTime = delayTime;
+        _this.scheduler = scheduler;
+        if (!isNumeric_1.isNumeric(delayTime) || delayTime < 0) {
+            _this.delayTime = 0;
+        }
+        if (!scheduler || typeof scheduler.schedule !== 'function') {
+            _this.scheduler = asap_1.asap;
+        }
+        return _this;
     }
+    SubscribeOnObservable.create = function (source, delay, scheduler) {
+        if (delay === void 0) { delay = 0; }
+        if (scheduler === void 0) { scheduler = asap_1.asap; }
+        return new SubscribeOnObservable(source, delay, scheduler);
+    };
+    SubscribeOnObservable.dispatch = function (arg) {
+        var source = arg.source, subscriber = arg.subscriber;
+        return this.add(source.subscribe(subscriber));
+    };
+    SubscribeOnObservable.prototype._subscribe = function (subscriber) {
+        var delay = this.delayTime;
+        var source = this.source;
+        var scheduler = this.scheduler;
+        return scheduler.schedule(SubscribeOnObservable.dispatch, delay, {
+            source: source, subscriber: subscriber
+        });
+    };
+    return SubscribeOnObservable;
+}(Observable_1.Observable));
+exports.SubscribeOnObservable = SubscribeOnObservable;
 
-
-    return new VNode(tag, props, childNodes, key, namespace);
-}
-
-function addChild(c, childNodes, tag, props) {
-    if (typeof c === 'string') {
-        childNodes.push(new VText(c));
-    } else if (typeof c === 'number') {
-        childNodes.push(new VText(String(c)));
-    } else if (isChild(c)) {
-        childNodes.push(c);
-    } else if (isArray(c)) {
-        for (var i = 0; i < c.length; i++) {
-            addChild(c[i], childNodes, tag, props);
+},{"../Observable":48,"../scheduler/asap":205,"../util/isNumeric":226}],60:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var AsyncSubject_1 = require("../AsyncSubject");
+var map_1 = require("../operators/map");
+var canReportError_1 = require("../util/canReportError");
+var isArray_1 = require("../util/isArray");
+var isScheduler_1 = require("../util/isScheduler");
+function bindCallback(callbackFunc, resultSelector, scheduler) {
+    if (resultSelector) {
+        if (isScheduler_1.isScheduler(resultSelector)) {
+            scheduler = resultSelector;
         }
-    } else if (c === null || c === undefined) {
-        return;
-    } else {
-        throw UnexpectedVirtualElement({
-            foreignObject: c,
-            parentVnode: {
-                tagName: tag,
-                properties: props
+        else {
+            return function () {
+                var args = [];
+                for (var _i = 0; _i < arguments.length; _i++) {
+                    args[_i] = arguments[_i];
+                }
+                return bindCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
+            };
+        }
+    }
+    return function () {
+        var args = [];
+        for (var _i = 0; _i < arguments.length; _i++) {
+            args[_i] = arguments[_i];
+        }
+        var context = this;
+        var subject;
+        var params = {
+            context: context,
+            subject: subject,
+            callbackFunc: callbackFunc,
+            scheduler: scheduler,
+        };
+        return new Observable_1.Observable(function (subscriber) {
+            if (!scheduler) {
+                if (!subject) {
+                    subject = new AsyncSubject_1.AsyncSubject();
+                    var handler = function () {
+                        var innerArgs = [];
+                        for (var _i = 0; _i < arguments.length; _i++) {
+                            innerArgs[_i] = arguments[_i];
+                        }
+                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
+                        subject.complete();
+                    };
+                    try {
+                        callbackFunc.apply(context, args.concat([handler]));
+                    }
+                    catch (err) {
+                        if (canReportError_1.canReportError(subject)) {
+                            subject.error(err);
+                        }
+                        else {
+                            console.warn(err);
+                        }
+                    }
+                }
+                return subject.subscribe(subscriber);
+            }
+            else {
+                var state = {
+                    args: args, subscriber: subscriber, params: params,
+                };
+                return scheduler.schedule(dispatch, 0, state);
             }
         });
-    }
+    };
 }
-
-function transformProperties(props) {
-    for (var propName in props) {
-        if (props.hasOwnProperty(propName)) {
-            var value = props[propName];
-
-            if (isHook(value)) {
-                continue;
-            }
-
-            if (propName.substr(0, 3) === 'ev-') {
-                // add ev-foo support
-                props[propName] = evHook(value);
+exports.bindCallback = bindCallback;
+function dispatch(state) {
+    var _this = this;
+    var self = this;
+    var args = state.args, subscriber = state.subscriber, params = state.params;
+    var callbackFunc = params.callbackFunc, context = params.context, scheduler = params.scheduler;
+    var subject = params.subject;
+    if (!subject) {
+        subject = params.subject = new AsyncSubject_1.AsyncSubject();
+        var handler = function () {
+            var innerArgs = [];
+            for (var _i = 0; _i < arguments.length; _i++) {
+                innerArgs[_i] = arguments[_i];
             }
+            var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
+            _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));
+        };
+        try {
+            callbackFunc.apply(context, args.concat([handler]));
+        }
+        catch (err) {
+            subject.error(err);
         }
     }
+    this.add(subject.subscribe(subscriber));
 }
-
-function isChild(x) {
-    return isVNode(x) || isVText(x) || isWidget(x) || isVThunk(x);
-}
-
-function isChildren(x) {
-    return typeof x === 'string' || isArray(x) || isChild(x);
-}
-
-function UnexpectedVirtualElement(data) {
-    var err = new Error();
-
-    err.type = 'virtual-hyperscript.unexpected.virtual-element';
-    err.message = 'Unexpected virtual child passed to h().\n' +
-        'Expected a VNode / Vthunk / VWidget / string but:\n' +
-        'got:\n' +
-        errorString(data.foreignObject) +
-        '.\n' +
-        'The parent vnode is:\n' +
-        errorString(data.parentVnode)
-        '\n' +
-        'Suggested fix: change your `h(..., [ ... ])` callsite.';
-    err.foreignObject = data.foreignObject;
-    err.parentVnode = data.parentVnode;
-
-    return err;
+function dispatchNext(state) {
+    var value = state.value, subject = state.subject;
+    subject.next(value);
+    subject.complete();
 }
-
-function errorString(obj) {
-    try {
-        return JSON.stringify(obj, null, '    ');
-    } catch (e) {
-        return String(obj);
-    }
+function dispatchError(state) {
+    var err = state.err, subject = state.subject;
+    subject.error(err);
 }
 
-},{"../vnode/is-thunk":195,"../vnode/is-vhook":196,"../vnode/is-vnode":197,"../vnode/is-vtext":198,"../vnode/is-widget":199,"../vnode/vnode.js":201,"../vnode/vtext.js":203,"./hooks/ev-hook.js":190,"./hooks/soft-set-hook.js":191,"./parse-tag.js":193,"x-is-array":224}],193:[function(require,module,exports){
-'use strict';
-
-var split = require('browser-split');
-
-var classIdSplit = /([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/;
-var notClassId = /^\.|#/;
-
-module.exports = parseTag;
-
-function parseTag(tag, props) {
-    if (!tag) {
-        return 'DIV';
-    }
-
-    var noId = !(props.hasOwnProperty('id'));
-
-    var tagParts = split(tag, classIdSplit);
-    var tagName = null;
-
-    if (notClassId.test(tagParts[1])) {
-        tagName = 'DIV';
-    }
-
-    var classes, part, type, i;
-
-    for (i = 0; i < tagParts.length; i++) {
-        part = tagParts[i];
-
-        if (!part) {
-            continue;
+},{"../AsyncSubject":44,"../Observable":48,"../operators/map":125,"../util/canReportError":217,"../util/isArray":220,"../util/isScheduler":230}],61:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var AsyncSubject_1 = require("../AsyncSubject");
+var map_1 = require("../operators/map");
+var canReportError_1 = require("../util/canReportError");
+var isScheduler_1 = require("../util/isScheduler");
+var isArray_1 = require("../util/isArray");
+function bindNodeCallback(callbackFunc, resultSelector, scheduler) {
+    if (resultSelector) {
+        if (isScheduler_1.isScheduler(resultSelector)) {
+            scheduler = resultSelector;
         }
-
-        type = part.charAt(0);
-
-        if (!tagName) {
-            tagName = part;
-        } else if (type === '.') {
-            classes = classes || [];
-            classes.push(part.substring(1, part.length));
-        } else if (type === '#' && noId) {
-            props.id = part.substring(1, part.length);
+        else {
+            return function () {
+                var args = [];
+                for (var _i = 0; _i < arguments.length; _i++) {
+                    args[_i] = arguments[_i];
+                }
+                return bindNodeCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
+            };
         }
     }
-
-    if (classes) {
-        if (props.className) {
-            classes.push(props.className);
+    return function () {
+        var args = [];
+        for (var _i = 0; _i < arguments.length; _i++) {
+            args[_i] = arguments[_i];
+        }
+        var params = {
+            subject: undefined,
+            args: args,
+            callbackFunc: callbackFunc,
+            scheduler: scheduler,
+            context: this,
+        };
+        return new Observable_1.Observable(function (subscriber) {
+            var context = params.context;
+            var subject = params.subject;
+            if (!scheduler) {
+                if (!subject) {
+                    subject = params.subject = new AsyncSubject_1.AsyncSubject();
+                    var handler = function () {
+                        var innerArgs = [];
+                        for (var _i = 0; _i < arguments.length; _i++) {
+                            innerArgs[_i] = arguments[_i];
+                        }
+                        var err = innerArgs.shift();
+                        if (err) {
+                            subject.error(err);
+                            return;
+                        }
+                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
+                        subject.complete();
+                    };
+                    try {
+                        callbackFunc.apply(context, args.concat([handler]));
+                    }
+                    catch (err) {
+                        if (canReportError_1.canReportError(subject)) {
+                            subject.error(err);
+                        }
+                        else {
+                            console.warn(err);
+                        }
+                    }
+                }
+                return subject.subscribe(subscriber);
+            }
+            else {
+                return scheduler.schedule(dispatch, 0, { params: params, subscriber: subscriber, context: context });
+            }
+        });
+    };
+}
+exports.bindNodeCallback = bindNodeCallback;
+function dispatch(state) {
+    var _this = this;
+    var params = state.params, subscriber = state.subscriber, context = state.context;
+    var callbackFunc = params.callbackFunc, args = params.args, scheduler = params.scheduler;
+    var subject = params.subject;
+    if (!subject) {
+        subject = params.subject = new AsyncSubject_1.AsyncSubject();
+        var handler = function () {
+            var innerArgs = [];
+            for (var _i = 0; _i < arguments.length; _i++) {
+                innerArgs[_i] = arguments[_i];
+            }
+            var err = innerArgs.shift();
+            if (err) {
+                _this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));
+            }
+            else {
+                var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
+                _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));
+            }
+        };
+        try {
+            callbackFunc.apply(context, args.concat([handler]));
+        }
+        catch (err) {
+            this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));
         }
-
-        props.className = classes.join(' ');
     }
-
-    return props.namespace ? tagName : tagName.toUpperCase();
+    this.add(subject.subscribe(subscriber));
+}
+function dispatchNext(arg) {
+    var value = arg.value, subject = arg.subject;
+    subject.next(value);
+    subject.complete();
+}
+function dispatchError(arg) {
+    var err = arg.err, subject = arg.subject;
+    subject.error(err);
 }
 
-},{"browser-split":5}],194:[function(require,module,exports){
-var isVNode = require("./is-vnode")
-var isVText = require("./is-vtext")
-var isWidget = require("./is-widget")
-var isThunk = require("./is-thunk")
-
-module.exports = handleThunk
-
-function handleThunk(a, b) {
-    var renderedA = a
-    var renderedB = b
-
-    if (isThunk(b)) {
-        renderedB = renderThunk(b, a)
+},{"../AsyncSubject":44,"../Observable":48,"../operators/map":125,"../util/canReportError":217,"../util/isArray":220,"../util/isScheduler":230}],62:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     }
-
-    if (isThunk(a)) {
-        renderedA = renderThunk(a, null)
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var isScheduler_1 = require("../util/isScheduler");
+var isArray_1 = require("../util/isArray");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+var fromArray_1 = require("./fromArray");
+var NONE = {};
+function combineLatest() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
     }
-
-    return {
-        a: renderedA,
-        b: renderedB
+    var resultSelector = null;
+    var scheduler = null;
+    if (isScheduler_1.isScheduler(observables[observables.length - 1])) {
+        scheduler = observables.pop();
     }
-}
-
-function renderThunk(thunk, previous) {
-    var renderedThunk = thunk.vnode
-
-    if (!renderedThunk) {
-        renderedThunk = thunk.vnode = thunk.render(previous)
+    if (typeof observables[observables.length - 1] === 'function') {
+        resultSelector = observables.pop();
     }
-
-    if (!(isVNode(renderedThunk) ||
-            isVText(renderedThunk) ||
-            isWidget(renderedThunk))) {
-        throw new Error("thunk did not return a valid node");
+    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
+        observables = observables[0];
     }
-
-    return renderedThunk
+    return fromArray_1.fromArray(observables, scheduler).lift(new CombineLatestOperator(resultSelector));
 }
+exports.combineLatest = combineLatest;
+var CombineLatestOperator = (function () {
+    function CombineLatestOperator(resultSelector) {
+        this.resultSelector = resultSelector;
+    }
+    CombineLatestOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector));
+    };
+    return CombineLatestOperator;
+}());
+exports.CombineLatestOperator = CombineLatestOperator;
+var CombineLatestSubscriber = (function (_super) {
+    __extends(CombineLatestSubscriber, _super);
+    function CombineLatestSubscriber(destination, resultSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.resultSelector = resultSelector;
+        _this.active = 0;
+        _this.values = [];
+        _this.observables = [];
+        return _this;
+    }
+    CombineLatestSubscriber.prototype._next = function (observable) {
+        this.values.push(NONE);
+        this.observables.push(observable);
+    };
+    CombineLatestSubscriber.prototype._complete = function () {
+        var observables = this.observables;
+        var len = observables.length;
+        if (len === 0) {
+            this.destination.complete();
+        }
+        else {
+            this.active = len;
+            this.toRespond = len;
+            for (var i = 0; i < len; i++) {
+                var observable = observables[i];
+                this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));
+            }
+        }
+    };
+    CombineLatestSubscriber.prototype.notifyComplete = function (unused) {
+        if ((this.active -= 1) === 0) {
+            this.destination.complete();
+        }
+    };
+    CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        var values = this.values;
+        var oldVal = values[outerIndex];
+        var toRespond = !this.toRespond
+            ? 0
+            : oldVal === NONE ? --this.toRespond : this.toRespond;
+        values[outerIndex] = innerValue;
+        if (toRespond === 0) {
+            if (this.resultSelector) {
+                this._tryResultSelector(values);
+            }
+            else {
+                this.destination.next(values.slice());
+            }
+        }
+    };
+    CombineLatestSubscriber.prototype._tryResultSelector = function (values) {
+        var result;
+        try {
+            result = this.resultSelector.apply(this, values);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        this.destination.next(result);
+    };
+    return CombineLatestSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+exports.CombineLatestSubscriber = CombineLatestSubscriber;
 
-},{"./is-thunk":195,"./is-vnode":197,"./is-vtext":198,"./is-widget":199}],195:[function(require,module,exports){
-module.exports = isThunk
-
-function isThunk(t) {
-    return t && t.type === "Thunk"
+},{"../OuterSubscriber":50,"../util/isArray":220,"../util/isScheduler":230,"../util/subscribeToResult":239,"./fromArray":68}],63:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var of_1 = require("./of");
+var concatAll_1 = require("../operators/concatAll");
+function concat() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
+    }
+    return concatAll_1.concatAll()(of_1.of.apply(void 0, observables));
 }
+exports.concat = concat;
 
-},{}],196:[function(require,module,exports){
-module.exports = isHook
-
-function isHook(hook) {
-    return hook &&
-      (typeof hook.hook === "function" && !hook.hasOwnProperty("hook") ||
-       typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook"))
+},{"../operators/concatAll":97,"./of":76}],64:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var from_1 = require("./from");
+var empty_1 = require("./empty");
+function defer(observableFactory) {
+    return new Observable_1.Observable(function (subscriber) {
+        var input;
+        try {
+            input = observableFactory();
+        }
+        catch (err) {
+            subscriber.error(err);
+            return undefined;
+        }
+        var source = input ? from_1.from(input) : empty_1.empty();
+        return source.subscribe(subscriber);
+    });
 }
+exports.defer = defer;
 
-},{}],197:[function(require,module,exports){
-var version = require("./version")
-
-module.exports = isVirtualNode
-
-function isVirtualNode(x) {
-    return x && x.type === "VirtualNode" && x.version === version
+},{"../Observable":48,"./empty":65,"./from":67}],65:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+exports.EMPTY = new Observable_1.Observable(function (subscriber) { return subscriber.complete(); });
+function empty(scheduler) {
+    return scheduler ? emptyScheduled(scheduler) : exports.EMPTY;
 }
-
-},{"./version":200}],198:[function(require,module,exports){
-var version = require("./version")
-
-module.exports = isVirtualText
-
-function isVirtualText(x) {
-    return x && x.type === "VirtualText" && x.version === version
+exports.empty = empty;
+function emptyScheduled(scheduler) {
+    return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });
 }
 
-},{"./version":200}],199:[function(require,module,exports){
-module.exports = isWidget
-
-function isWidget(w) {
-    return w && w.type === "Widget"
+},{"../Observable":48}],66:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var isArray_1 = require("../util/isArray");
+var map_1 = require("../operators/map");
+var isObject_1 = require("../util/isObject");
+var from_1 = require("./from");
+function forkJoin() {
+    var sources = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        sources[_i] = arguments[_i];
+    }
+    if (sources.length === 1) {
+        var first_1 = sources[0];
+        if (isArray_1.isArray(first_1)) {
+            return forkJoinInternal(first_1, null);
+        }
+        if (isObject_1.isObject(first_1) && Object.getPrototypeOf(first_1) === Object.prototype) {
+            var keys = Object.keys(first_1);
+            return forkJoinInternal(keys.map(function (key) { return first_1[key]; }), keys);
+        }
+    }
+    if (typeof sources[sources.length - 1] === 'function') {
+        var resultSelector_1 = sources.pop();
+        sources = (sources.length === 1 && isArray_1.isArray(sources[0])) ? sources[0] : sources;
+        return forkJoinInternal(sources, null).pipe(map_1.map(function (args) { return resultSelector_1.apply(void 0, args); }));
+    }
+    return forkJoinInternal(sources, null);
 }
-
-},{}],200:[function(require,module,exports){
-module.exports = "2"
-
-},{}],201:[function(require,module,exports){
-var version = require("./version")
-var isVNode = require("./is-vnode")
-var isWidget = require("./is-widget")
-var isThunk = require("./is-thunk")
-var isVHook = require("./is-vhook")
-
-module.exports = VirtualNode
-
-var noProperties = {}
-var noChildren = []
-
-function VirtualNode(tagName, properties, children, key, namespace) {
-    this.tagName = tagName
-    this.properties = properties || noProperties
-    this.children = children || noChildren
-    this.key = key != null ? String(key) : undefined
-    this.namespace = (typeof namespace === "string") ? namespace : null
-
-    var count = (children && children.length) || 0
-    var descendants = 0
-    var hasWidgets = false
-    var hasThunks = false
-    var descendantHooks = false
-    var hooks
-
-    for (var propName in properties) {
-        if (properties.hasOwnProperty(propName)) {
-            var property = properties[propName]
-            if (isVHook(property) && property.unhook) {
-                if (!hooks) {
-                    hooks = {}
+exports.forkJoin = forkJoin;
+function forkJoinInternal(sources, keys) {
+    return new Observable_1.Observable(function (subscriber) {
+        var len = sources.length;
+        if (len === 0) {
+            subscriber.complete();
+            return;
+        }
+        var values = new Array(len);
+        var completed = 0;
+        var emitted = 0;
+        var _loop_1 = function (i) {
+            var source = from_1.from(sources[i]);
+            var hasValue = false;
+            subscriber.add(source.subscribe({
+                next: function (value) {
+                    if (!hasValue) {
+                        hasValue = true;
+                        emitted++;
+                    }
+                    values[i] = value;
+                },
+                error: function (err) { return subscriber.error(err); },
+                complete: function () {
+                    completed++;
+                    if (completed === len || !hasValue) {
+                        if (emitted === len) {
+                            subscriber.next(keys ?
+                                keys.reduce(function (result, key, i) { return (result[key] = values[i], result); }, {}) :
+                                values);
+                        }
+                        subscriber.complete();
+                    }
                 }
+            }));
+        };
+        for (var i = 0; i < len; i++) {
+            _loop_1(i);
+        }
+    });
+}
 
-                hooks[propName] = property
-            }
+},{"../Observable":48,"../operators/map":125,"../util/isArray":220,"../util/isObject":227,"./from":67}],67:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var subscribeTo_1 = require("../util/subscribeTo");
+var scheduled_1 = require("../scheduled/scheduled");
+function from(input, scheduler) {
+    if (!scheduler) {
+        if (input instanceof Observable_1.Observable) {
+            return input;
         }
+        return new Observable_1.Observable(subscribeTo_1.subscribeTo(input));
     }
+    else {
+        return scheduled_1.scheduled(input, scheduler);
+    }
+}
+exports.from = from;
 
-    for (var i = 0; i < count; i++) {
-        var child = children[i]
-        if (isVNode(child)) {
-            descendants += child.count || 0
-
-            if (!hasWidgets && child.hasWidgets) {
-                hasWidgets = true
-            }
-
-            if (!hasThunks && child.hasThunks) {
-                hasThunks = true
-            }
+},{"../Observable":48,"../scheduled/scheduled":193,"../util/subscribeTo":234}],68:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var subscribeToArray_1 = require("../util/subscribeToArray");
+var scheduleArray_1 = require("../scheduled/scheduleArray");
+function fromArray(input, scheduler) {
+    if (!scheduler) {
+        return new Observable_1.Observable(subscribeToArray_1.subscribeToArray(input));
+    }
+    else {
+        return scheduleArray_1.scheduleArray(input, scheduler);
+    }
+}
+exports.fromArray = fromArray;
 
-            if (!descendantHooks && (child.hooks || child.descendantHooks)) {
-                descendantHooks = true
+},{"../Observable":48,"../scheduled/scheduleArray":189,"../util/subscribeToArray":235}],69:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var isArray_1 = require("../util/isArray");
+var isFunction_1 = require("../util/isFunction");
+var map_1 = require("../operators/map");
+var toString = (function () { return Object.prototype.toString; })();
+function fromEvent(target, eventName, options, resultSelector) {
+    if (isFunction_1.isFunction(options)) {
+        resultSelector = options;
+        options = undefined;
+    }
+    if (resultSelector) {
+        return fromEvent(target, eventName, options).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
+    }
+    return new Observable_1.Observable(function (subscriber) {
+        function handler(e) {
+            if (arguments.length > 1) {
+                subscriber.next(Array.prototype.slice.call(arguments));
             }
-        } else if (!hasWidgets && isWidget(child)) {
-            if (typeof child.destroy === "function") {
-                hasWidgets = true
+            else {
+                subscriber.next(e);
             }
-        } else if (!hasThunks && isThunk(child)) {
-            hasThunks = true;
+        }
+        setupSubscription(target, eventName, handler, subscriber, options);
+    });
+}
+exports.fromEvent = fromEvent;
+function setupSubscription(sourceObj, eventName, handler, subscriber, options) {
+    var unsubscribe;
+    if (isEventTarget(sourceObj)) {
+        var source_1 = sourceObj;
+        sourceObj.addEventListener(eventName, handler, options);
+        unsubscribe = function () { return source_1.removeEventListener(eventName, handler, options); };
+    }
+    else if (isJQueryStyleEventEmitter(sourceObj)) {
+        var source_2 = sourceObj;
+        sourceObj.on(eventName, handler);
+        unsubscribe = function () { return source_2.off(eventName, handler); };
+    }
+    else if (isNodeStyleEventEmitter(sourceObj)) {
+        var source_3 = sourceObj;
+        sourceObj.addListener(eventName, handler);
+        unsubscribe = function () { return source_3.removeListener(eventName, handler); };
+    }
+    else if (sourceObj && sourceObj.length) {
+        for (var i = 0, len = sourceObj.length; i < len; i++) {
+            setupSubscription(sourceObj[i], eventName, handler, subscriber, options);
         }
     }
-
-    this.count = count + descendants
-    this.hasWidgets = hasWidgets
-    this.hasThunks = hasThunks
-    this.hooks = hooks
-    this.descendantHooks = descendantHooks
+    else {
+        throw new TypeError('Invalid event target');
+    }
+    subscriber.add(unsubscribe);
 }
-
-VirtualNode.prototype.version = version
-VirtualNode.prototype.type = "VirtualNode"
-
-},{"./is-thunk":195,"./is-vhook":196,"./is-vnode":197,"./is-widget":199,"./version":200}],202:[function(require,module,exports){
-var version = require("./version")
-
-VirtualPatch.NONE = 0
-VirtualPatch.VTEXT = 1
-VirtualPatch.VNODE = 2
-VirtualPatch.WIDGET = 3
-VirtualPatch.PROPS = 4
-VirtualPatch.ORDER = 5
-VirtualPatch.INSERT = 6
-VirtualPatch.REMOVE = 7
-VirtualPatch.THUNK = 8
-
-module.exports = VirtualPatch
-
-function VirtualPatch(type, vNode, patch) {
-    this.type = Number(type)
-    this.vNode = vNode
-    this.patch = patch
+function isNodeStyleEventEmitter(sourceObj) {
+    return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';
 }
-
-VirtualPatch.prototype.version = version
-VirtualPatch.prototype.type = "VirtualPatch"
-
-},{"./version":200}],203:[function(require,module,exports){
-var version = require("./version")
-
-module.exports = VirtualText
-
-function VirtualText(text) {
-    this.text = String(text)
+function isJQueryStyleEventEmitter(sourceObj) {
+    return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';
+}
+function isEventTarget(sourceObj) {
+    return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';
 }
 
-VirtualText.prototype.version = version
-VirtualText.prototype.type = "VirtualText"
-
-},{"./version":200}],204:[function(require,module,exports){
-var isObject = require("is-object")
-var isHook = require("../vnode/is-vhook")
-
-module.exports = diffProps
-
-function diffProps(a, b) {
-    var diff
-
-    for (var aKey in a) {
-        if (!(aKey in b)) {
-            diff = diff || {}
-            diff[aKey] = undefined
+},{"../Observable":48,"../operators/map":125,"../util/isArray":220,"../util/isFunction":223}],70:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var isArray_1 = require("../util/isArray");
+var isFunction_1 = require("../util/isFunction");
+var map_1 = require("../operators/map");
+function fromEventPattern(addHandler, removeHandler, resultSelector) {
+    if (resultSelector) {
+        return fromEventPattern(addHandler, removeHandler).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
+    }
+    return new Observable_1.Observable(function (subscriber) {
+        var handler = function () {
+            var e = [];
+            for (var _i = 0; _i < arguments.length; _i++) {
+                e[_i] = arguments[_i];
+            }
+            return subscriber.next(e.length === 1 ? e[0] : e);
+        };
+        var retValue;
+        try {
+            retValue = addHandler(handler);
         }
+        catch (err) {
+            subscriber.error(err);
+            return undefined;
+        }
+        if (!isFunction_1.isFunction(removeHandler)) {
+            return undefined;
+        }
+        return function () { return removeHandler(handler, retValue); };
+    });
+}
+exports.fromEventPattern = fromEventPattern;
 
-        var aValue = a[aKey]
-        var bValue = b[aKey]
-
-        if (aValue === bValue) {
-            continue
-        } else if (isObject(aValue) && isObject(bValue)) {
-            if (getPrototype(bValue) !== getPrototype(aValue)) {
-                diff = diff || {}
-                diff[aKey] = bValue
-            } else if (isHook(bValue)) {
-                 diff = diff || {}
-                 diff[aKey] = bValue
-            } else {
-                var objectDiff = diffProps(aValue, bValue)
-                if (objectDiff) {
-                    diff = diff || {}
-                    diff[aKey] = objectDiff
+},{"../Observable":48,"../operators/map":125,"../util/isArray":220,"../util/isFunction":223}],71:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var identity_1 = require("../util/identity");
+var isScheduler_1 = require("../util/isScheduler");
+function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) {
+    var resultSelector;
+    var initialState;
+    if (arguments.length == 1) {
+        var options = initialStateOrOptions;
+        initialState = options.initialState;
+        condition = options.condition;
+        iterate = options.iterate;
+        resultSelector = options.resultSelector || identity_1.identity;
+        scheduler = options.scheduler;
+    }
+    else if (resultSelectorOrObservable === undefined || isScheduler_1.isScheduler(resultSelectorOrObservable)) {
+        initialState = initialStateOrOptions;
+        resultSelector = identity_1.identity;
+        scheduler = resultSelectorOrObservable;
+    }
+    else {
+        initialState = initialStateOrOptions;
+        resultSelector = resultSelectorOrObservable;
+    }
+    return new Observable_1.Observable(function (subscriber) {
+        var state = initialState;
+        if (scheduler) {
+            return scheduler.schedule(dispatch, 0, {
+                subscriber: subscriber,
+                iterate: iterate,
+                condition: condition,
+                resultSelector: resultSelector,
+                state: state
+            });
+        }
+        do {
+            if (condition) {
+                var conditionResult = void 0;
+                try {
+                    conditionResult = condition(state);
+                }
+                catch (err) {
+                    subscriber.error(err);
+                    return undefined;
+                }
+                if (!conditionResult) {
+                    subscriber.complete();
+                    break;
                 }
             }
-        } else {
-            diff = diff || {}
-            diff[aKey] = bValue
+            var value = void 0;
+            try {
+                value = resultSelector(state);
+            }
+            catch (err) {
+                subscriber.error(err);
+                return undefined;
+            }
+            subscriber.next(value);
+            if (subscriber.closed) {
+                break;
+            }
+            try {
+                state = iterate(state);
+            }
+            catch (err) {
+                subscriber.error(err);
+                return undefined;
+            }
+        } while (true);
+        return undefined;
+    });
+}
+exports.generate = generate;
+function dispatch(state) {
+    var subscriber = state.subscriber, condition = state.condition;
+    if (subscriber.closed) {
+        return undefined;
+    }
+    if (state.needIterate) {
+        try {
+            state.state = state.iterate(state.state);
+        }
+        catch (err) {
+            subscriber.error(err);
+            return undefined;
         }
     }
-
-    for (var bKey in b) {
-        if (!(bKey in a)) {
-            diff = diff || {}
-            diff[bKey] = b[bKey]
+    else {
+        state.needIterate = true;
+    }
+    if (condition) {
+        var conditionResult = void 0;
+        try {
+            conditionResult = condition(state.state);
+        }
+        catch (err) {
+            subscriber.error(err);
+            return undefined;
+        }
+        if (!conditionResult) {
+            subscriber.complete();
+            return undefined;
+        }
+        if (subscriber.closed) {
+            return undefined;
         }
     }
-
-    return diff
+    var value;
+    try {
+        value = state.resultSelector(state.state);
+    }
+    catch (err) {
+        subscriber.error(err);
+        return undefined;
+    }
+    if (subscriber.closed) {
+        return undefined;
+    }
+    subscriber.next(value);
+    if (subscriber.closed) {
+        return undefined;
+    }
+    return this.schedule(state);
 }
 
-function getPrototype(value) {
-  if (Object.getPrototypeOf) {
-    return Object.getPrototypeOf(value)
-  } else if (value.__proto__) {
-    return value.__proto__
-  } else if (value.constructor) {
-    return value.constructor.prototype
-  }
+},{"../Observable":48,"../util/identity":219,"../util/isScheduler":230}],72:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var defer_1 = require("./defer");
+var empty_1 = require("./empty");
+function iif(condition, trueResult, falseResult) {
+    if (trueResult === void 0) { trueResult = empty_1.EMPTY; }
+    if (falseResult === void 0) { falseResult = empty_1.EMPTY; }
+    return defer_1.defer(function () { return condition() ? trueResult : falseResult; });
 }
+exports.iif = iif;
 
-},{"../vnode/is-vhook":196,"is-object":20}],205:[function(require,module,exports){
-var isArray = require("x-is-array")
+},{"./defer":64,"./empty":65}],73:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var async_1 = require("../scheduler/async");
+var isNumeric_1 = require("../util/isNumeric");
+function interval(period, scheduler) {
+    if (period === void 0) { period = 0; }
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    if (!isNumeric_1.isNumeric(period) || period < 0) {
+        period = 0;
+    }
+    if (!scheduler || typeof scheduler.schedule !== 'function') {
+        scheduler = async_1.async;
+    }
+    return new Observable_1.Observable(function (subscriber) {
+        subscriber.add(scheduler.schedule(dispatch, period, { subscriber: subscriber, counter: 0, period: period }));
+        return subscriber;
+    });
+}
+exports.interval = interval;
+function dispatch(state) {
+    var subscriber = state.subscriber, counter = state.counter, period = state.period;
+    subscriber.next(counter);
+    this.schedule({ subscriber: subscriber, counter: counter + 1, period: period }, period);
+}
 
-var VPatch = require("../vnode/vpatch")
-var isVNode = require("../vnode/is-vnode")
-var isVText = require("../vnode/is-vtext")
-var isWidget = require("../vnode/is-widget")
-var isThunk = require("../vnode/is-thunk")
-var handleThunk = require("../vnode/handle-thunk")
-
-var diffProps = require("./diff-props")
-
-module.exports = diff
-
-function diff(a, b) {
-    var patch = { a: a }
-    walk(a, b, patch, 0)
-    return patch
-}
-
-function walk(a, b, patch, index) {
-    if (a === b) {
-        return
+},{"../Observable":48,"../scheduler/async":206,"../util/isNumeric":226}],74:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var isScheduler_1 = require("../util/isScheduler");
+var mergeAll_1 = require("../operators/mergeAll");
+var fromArray_1 = require("./fromArray");
+function merge() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
     }
-
-    var apply = patch[index]
-    var applyClear = false
-
-    if (isThunk(a) || isThunk(b)) {
-        thunks(a, b, patch, index)
-    } else if (b == null) {
-
-        // If a is a widget we will add a remove patch for it
-        // Otherwise any child widgets/hooks must be destroyed.
-        // This prevents adding two remove patches for a widget.
-        if (!isWidget(a)) {
-            clearState(a, patch, index)
-            apply = patch[index]
-        }
-
-        apply = appendPatch(apply, new VPatch(VPatch.REMOVE, a, b))
-    } else if (isVNode(b)) {
-        if (isVNode(a)) {
-            if (a.tagName === b.tagName &&
-                a.namespace === b.namespace &&
-                a.key === b.key) {
-                var propsPatch = diffProps(a.properties, b.properties)
-                if (propsPatch) {
-                    apply = appendPatch(apply,
-                        new VPatch(VPatch.PROPS, a, propsPatch))
-                }
-                apply = diffChildren(a, b, patch, apply, index)
-            } else {
-                apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b))
-                applyClear = true
-            }
-        } else {
-            apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b))
-            applyClear = true
-        }
-    } else if (isVText(b)) {
-        if (!isVText(a)) {
-            apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b))
-            applyClear = true
-        } else if (a.text !== b.text) {
-            apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b))
-        }
-    } else if (isWidget(b)) {
-        if (!isWidget(a)) {
-            applyClear = true
+    var concurrent = Number.POSITIVE_INFINITY;
+    var scheduler = null;
+    var last = observables[observables.length - 1];
+    if (isScheduler_1.isScheduler(last)) {
+        scheduler = observables.pop();
+        if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {
+            concurrent = observables.pop();
         }
-
-        apply = appendPatch(apply, new VPatch(VPatch.WIDGET, a, b))
     }
-
-    if (apply) {
-        patch[index] = apply
+    else if (typeof last === 'number') {
+        concurrent = observables.pop();
     }
-
-    if (applyClear) {
-        clearState(a, patch, index)
+    if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) {
+        return observables[0];
     }
+    return mergeAll_1.mergeAll(concurrent)(fromArray_1.fromArray(observables, scheduler));
 }
+exports.merge = merge;
 
-function diffChildren(a, b, patch, apply, index) {
-    var aChildren = a.children
-    var orderedSet = reorder(aChildren, b.children)
-    var bChildren = orderedSet.children
-
-    var aLen = aChildren.length
-    var bLen = bChildren.length
-    var len = aLen > bLen ? aLen : bLen
-
-    for (var i = 0; i < len; i++) {
-        var leftNode = aChildren[i]
-        var rightNode = bChildren[i]
-        index += 1
-
-        if (!leftNode) {
-            if (rightNode) {
-                // Excess nodes in b need to be added
-                apply = appendPatch(apply,
-                    new VPatch(VPatch.INSERT, null, rightNode))
-            }
-        } else {
-            walk(leftNode, rightNode, patch, index)
-        }
+},{"../Observable":48,"../operators/mergeAll":130,"../util/isScheduler":230,"./fromArray":68}],75:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var noop_1 = require("../util/noop");
+exports.NEVER = new Observable_1.Observable(noop_1.noop);
+function never() {
+    return exports.NEVER;
+}
+exports.never = never;
 
-        if (isVNode(leftNode) && leftNode.count) {
-            index += leftNode.count
-        }
+},{"../Observable":48,"../util/noop":231}],76:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var isScheduler_1 = require("../util/isScheduler");
+var fromArray_1 = require("./fromArray");
+var scheduleArray_1 = require("../scheduled/scheduleArray");
+function of() {
+    var args = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        args[_i] = arguments[_i];
     }
-
-    if (orderedSet.moves) {
-        // Reorder nodes last
-        apply = appendPatch(apply, new VPatch(
-            VPatch.ORDER,
-            a,
-            orderedSet.moves
-        ))
+    var scheduler = args[args.length - 1];
+    if (isScheduler_1.isScheduler(scheduler)) {
+        args.pop();
+        return scheduleArray_1.scheduleArray(args, scheduler);
+    }
+    else {
+        return fromArray_1.fromArray(args);
     }
-
-    return apply
 }
+exports.of = of;
 
-function clearState(vNode, patch, index) {
-    // TODO: Make this a single walk, not two
-    unhook(vNode, patch, index)
-    destroyWidgets(vNode, patch, index)
+},{"../scheduled/scheduleArray":189,"../util/isScheduler":230,"./fromArray":68}],77:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var from_1 = require("./from");
+var isArray_1 = require("../util/isArray");
+var empty_1 = require("./empty");
+function onErrorResumeNext() {
+    var sources = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        sources[_i] = arguments[_i];
+    }
+    if (sources.length === 0) {
+        return empty_1.EMPTY;
+    }
+    var first = sources[0], remainder = sources.slice(1);
+    if (sources.length === 1 && isArray_1.isArray(first)) {
+        return onErrorResumeNext.apply(void 0, first);
+    }
+    return new Observable_1.Observable(function (subscriber) {
+        var subNext = function () { return subscriber.add(onErrorResumeNext.apply(void 0, remainder).subscribe(subscriber)); };
+        return from_1.from(first).subscribe({
+            next: function (value) { subscriber.next(value); },
+            error: subNext,
+            complete: subNext,
+        });
+    });
 }
+exports.onErrorResumeNext = onErrorResumeNext;
 
-// Patch records for all destroyed widgets must be added because we need
-// a DOM node reference for the destroy function
-function destroyWidgets(vNode, patch, index) {
-    if (isWidget(vNode)) {
-        if (typeof vNode.destroy === "function") {
-            patch[index] = appendPatch(
-                patch[index],
-                new VPatch(VPatch.REMOVE, vNode, null)
-            )
-        }
-    } else if (isVNode(vNode) && (vNode.hasWidgets || vNode.hasThunks)) {
-        var children = vNode.children
-        var len = children.length
-        for (var i = 0; i < len; i++) {
-            var child = children[i]
-            index += 1
-
-            destroyWidgets(child, patch, index)
-
-            if (isVNode(child) && child.count) {
-                index += child.count
+},{"../Observable":48,"../util/isArray":220,"./empty":65,"./from":67}],78:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var Subscription_1 = require("../Subscription");
+function pairs(obj, scheduler) {
+    if (!scheduler) {
+        return new Observable_1.Observable(function (subscriber) {
+            var keys = Object.keys(obj);
+            for (var i = 0; i < keys.length && !subscriber.closed; i++) {
+                var key = keys[i];
+                if (obj.hasOwnProperty(key)) {
+                    subscriber.next([key, obj[key]]);
+                }
             }
-        }
-    } else if (isThunk(vNode)) {
-        thunks(vNode, null, patch, index)
+            subscriber.complete();
+        });
     }
-}
-
-// Create a sub-patch for thunks
-function thunks(a, b, patch, index) {
-    var nodes = handleThunk(a, b)
-    var thunkPatch = diff(nodes.a, nodes.b)
-    if (hasPatches(thunkPatch)) {
-        patch[index] = new VPatch(VPatch.THUNK, null, thunkPatch)
+    else {
+        return new Observable_1.Observable(function (subscriber) {
+            var keys = Object.keys(obj);
+            var subscription = new Subscription_1.Subscription();
+            subscription.add(scheduler.schedule(dispatch, 0, { keys: keys, index: 0, subscriber: subscriber, subscription: subscription, obj: obj }));
+            return subscription;
+        });
     }
 }
-
-function hasPatches(patch) {
-    for (var index in patch) {
-        if (index !== "a") {
-            return true
+exports.pairs = pairs;
+function dispatch(state) {
+    var keys = state.keys, index = state.index, subscriber = state.subscriber, subscription = state.subscription, obj = state.obj;
+    if (!subscriber.closed) {
+        if (index < keys.length) {
+            var key = keys[index];
+            subscriber.next([key, obj[key]]);
+            subscription.add(this.schedule({ keys: keys, index: index + 1, subscriber: subscriber, subscription: subscription, obj: obj }));
+        }
+        else {
+            subscriber.complete();
         }
     }
+}
+exports.dispatch = dispatch;
 
-    return false
+},{"../Observable":48,"../Subscription":56}],79:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var not_1 = require("../util/not");
+var subscribeTo_1 = require("../util/subscribeTo");
+var filter_1 = require("../operators/filter");
+var Observable_1 = require("../Observable");
+function partition(source, predicate, thisArg) {
+    return [
+        filter_1.filter(predicate, thisArg)(new Observable_1.Observable(subscribeTo_1.subscribeTo(source))),
+        filter_1.filter(not_1.not(predicate, thisArg))(new Observable_1.Observable(subscribeTo_1.subscribeTo(source)))
+    ];
 }
+exports.partition = partition;
 
-// Execute hooks when two nodes are identical
-function unhook(vNode, patch, index) {
-    if (isVNode(vNode)) {
-        if (vNode.hooks) {
-            patch[index] = appendPatch(
-                patch[index],
-                new VPatch(
-                    VPatch.PROPS,
-                    vNode,
-                    undefinedKeys(vNode.hooks)
-                )
-            )
+},{"../Observable":48,"../operators/filter":116,"../util/not":232,"../util/subscribeTo":234}],80:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var isArray_1 = require("../util/isArray");
+var fromArray_1 = require("./fromArray");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function race() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
+    }
+    if (observables.length === 1) {
+        if (isArray_1.isArray(observables[0])) {
+            observables = observables[0];
         }
-
-        if (vNode.descendantHooks || vNode.hasThunks) {
-            var children = vNode.children
-            var len = children.length
-            for (var i = 0; i < len; i++) {
-                var child = children[i]
-                index += 1
-
-                unhook(child, patch, index)
-
-                if (isVNode(child) && child.count) {
-                    index += child.count
-                }
-            }
+        else {
+            return observables[0];
         }
-    } else if (isThunk(vNode)) {
-        thunks(vNode, null, patch, index)
     }
+    return fromArray_1.fromArray(observables, undefined).lift(new RaceOperator());
 }
-
-function undefinedKeys(obj) {
-    var result = {}
-
-    for (var key in obj) {
-        result[key] = undefined
+exports.race = race;
+var RaceOperator = (function () {
+    function RaceOperator() {
     }
-
-    return result
-}
-
-// List diff, naive left to right reordering
-function reorder(aChildren, bChildren) {
-    // O(M) time, O(M) memory
-    var bChildIndex = keyIndex(bChildren)
-    var bKeys = bChildIndex.keys
-    var bFree = bChildIndex.free
-
-    if (bFree.length === bChildren.length) {
-        return {
-            children: bChildren,
-            moves: null
-        }
+    RaceOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new RaceSubscriber(subscriber));
+    };
+    return RaceOperator;
+}());
+exports.RaceOperator = RaceOperator;
+var RaceSubscriber = (function (_super) {
+    __extends(RaceSubscriber, _super);
+    function RaceSubscriber(destination) {
+        var _this = _super.call(this, destination) || this;
+        _this.hasFirst = false;
+        _this.observables = [];
+        _this.subscriptions = [];
+        return _this;
     }
-
-    // O(N) time, O(N) memory
-    var aChildIndex = keyIndex(aChildren)
-    var aKeys = aChildIndex.keys
-    var aFree = aChildIndex.free
-
-    if (aFree.length === aChildren.length) {
-        return {
-            children: bChildren,
-            moves: null
+    RaceSubscriber.prototype._next = function (observable) {
+        this.observables.push(observable);
+    };
+    RaceSubscriber.prototype._complete = function () {
+        var observables = this.observables;
+        var len = observables.length;
+        if (len === 0) {
+            this.destination.complete();
         }
-    }
-
-    // O(MAX(N, M)) memory
-    var newChildren = []
-
-    var freeIndex = 0
-    var freeCount = bFree.length
-    var deletedItems = 0
-
-    // Iterate through a and match a node in b
-    // O(N) time,
-    for (var i = 0 ; i < aChildren.length; i++) {
-        var aItem = aChildren[i]
-        var itemIndex
-
-        if (aItem.key) {
-            if (bKeys.hasOwnProperty(aItem.key)) {
-                // Match up the old keys
-                itemIndex = bKeys[aItem.key]
-                newChildren.push(bChildren[itemIndex])
-
-            } else {
-                // Remove old keyed items
-                itemIndex = i - deletedItems++
-                newChildren.push(null)
-            }
-        } else {
-            // Match the item in a with the next free item in b
-            if (freeIndex < freeCount) {
-                itemIndex = bFree[freeIndex++]
-                newChildren.push(bChildren[itemIndex])
-            } else {
-                // There are no free items in b to match with
-                // the free items in a, so the extra free nodes
-                // are deleted.
-                itemIndex = i - deletedItems++
-                newChildren.push(null)
+        else {
+            for (var i = 0; i < len && !this.hasFirst; i++) {
+                var observable = observables[i];
+                var subscription = subscribeToResult_1.subscribeToResult(this, observable, observable, i);
+                if (this.subscriptions) {
+                    this.subscriptions.push(subscription);
+                }
+                this.add(subscription);
             }
+            this.observables = null;
         }
-    }
-
-    var lastFreeIndex = freeIndex >= bFree.length ?
-        bChildren.length :
-        bFree[freeIndex]
-
-    // Iterate through b and append any new keys
-    // O(M) time
-    for (var j = 0; j < bChildren.length; j++) {
-        var newItem = bChildren[j]
-
-        if (newItem.key) {
-            if (!aKeys.hasOwnProperty(newItem.key)) {
-                // Add any new keyed items
-                // We are adding new items to the end and then sorting them
-                // in place. In future we should insert new items in place.
-                newChildren.push(newItem)
+    };
+    RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        if (!this.hasFirst) {
+            this.hasFirst = true;
+            for (var i = 0; i < this.subscriptions.length; i++) {
+                if (i !== outerIndex) {
+                    var subscription = this.subscriptions[i];
+                    subscription.unsubscribe();
+                    this.remove(subscription);
+                }
             }
-        } else if (j >= lastFreeIndex) {
-            // Add any leftover non-keyed items
-            newChildren.push(newItem)
+            this.subscriptions = null;
         }
-    }
-
-    var simulate = newChildren.slice()
-    var simulateIndex = 0
-    var removes = []
-    var inserts = []
-    var simulateItem
-
-    for (var k = 0; k < bChildren.length;) {
-        var wantedItem = bChildren[k]
-        simulateItem = simulate[simulateIndex]
+        this.destination.next(innerValue);
+    };
+    return RaceSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+exports.RaceSubscriber = RaceSubscriber;
 
-        // remove items
-        while (simulateItem === null && simulate.length) {
-            removes.push(remove(simulate, simulateIndex, null))
-            simulateItem = simulate[simulateIndex]
+},{"../OuterSubscriber":50,"../util/isArray":220,"../util/subscribeToResult":239,"./fromArray":68}],81:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+function range(start, count, scheduler) {
+    if (start === void 0) { start = 0; }
+    return new Observable_1.Observable(function (subscriber) {
+        if (count === undefined) {
+            count = start;
+            start = 0;
         }
-
-        if (!simulateItem || simulateItem.key !== wantedItem.key) {
-            // if we need a key in this position...
-            if (wantedItem.key) {
-                if (simulateItem && simulateItem.key) {
-                    // if an insert doesn't put this key in place, it needs to move
-                    if (bKeys[simulateItem.key] !== k + 1) {
-                        removes.push(remove(simulate, simulateIndex, simulateItem.key))
-                        simulateItem = simulate[simulateIndex]
-                        // if the remove didn't put the wanted item in place, we need to insert it
-                        if (!simulateItem || simulateItem.key !== wantedItem.key) {
-                            inserts.push({key: wantedItem.key, to: k})
-                        }
-                        // items are matching, so skip ahead
-                        else {
-                            simulateIndex++
-                        }
-                    }
-                    else {
-                        inserts.push({key: wantedItem.key, to: k})
-                    }
-                }
-                else {
-                    inserts.push({key: wantedItem.key, to: k})
-                }
-                k++
-            }
-            // a key in simulate has no matching wanted key, remove it
-            else if (simulateItem && simulateItem.key) {
-                removes.push(remove(simulate, simulateIndex, simulateItem.key))
-            }
+        var index = 0;
+        var current = start;
+        if (scheduler) {
+            return scheduler.schedule(dispatch, 0, {
+                index: index, count: count, start: start, subscriber: subscriber
+            });
         }
         else {
-            simulateIndex++
-            k++
+            do {
+                if (index++ >= count) {
+                    subscriber.complete();
+                    break;
+                }
+                subscriber.next(current++);
+                if (subscriber.closed) {
+                    break;
+                }
+            } while (true);
         }
+        return undefined;
+    });
+}
+exports.range = range;
+function dispatch(state) {
+    var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber;
+    if (index >= count) {
+        subscriber.complete();
+        return;
     }
-
-    // remove all the remaining nodes from simulate
-    while(simulateIndex < simulate.length) {
-        simulateItem = simulate[simulateIndex]
-        removes.push(remove(simulate, simulateIndex, simulateItem && simulateItem.key))
+    subscriber.next(start);
+    if (subscriber.closed) {
+        return;
     }
+    state.index = index + 1;
+    state.start = start + 1;
+    this.schedule(state);
+}
+exports.dispatch = dispatch;
 
-    // If the only moves we have are deletes then we can just
-    // let the delete patch remove these items.
-    if (removes.length === deletedItems && !inserts.length) {
-        return {
-            children: newChildren,
-            moves: null
-        }
+},{"../Observable":48}],82:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+function throwError(error, scheduler) {
+    if (!scheduler) {
+        return new Observable_1.Observable(function (subscriber) { return subscriber.error(error); });
     }
-
-    return {
-        children: newChildren,
-        moves: {
-            removes: removes,
-            inserts: inserts
-        }
+    else {
+        return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); });
     }
 }
-
-function remove(arr, index, key) {
-    arr.splice(index, 1)
-
-    return {
-        from: index,
-        key: key
-    }
+exports.throwError = throwError;
+function dispatch(_a) {
+    var error = _a.error, subscriber = _a.subscriber;
+    subscriber.error(error);
 }
 
-function keyIndex(children) {
-    var keys = {}
-    var free = []
-    var length = children.length
-
-    for (var i = 0; i < length; i++) {
-        var child = children[i]
-
-        if (child.key) {
-            keys[child.key] = i
-        } else {
-            free.push(i)
-        }
+},{"../Observable":48}],83:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var async_1 = require("../scheduler/async");
+var isNumeric_1 = require("../util/isNumeric");
+var isScheduler_1 = require("../util/isScheduler");
+function timer(dueTime, periodOrScheduler, scheduler) {
+    if (dueTime === void 0) { dueTime = 0; }
+    var period = -1;
+    if (isNumeric_1.isNumeric(periodOrScheduler)) {
+        period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler);
+    }
+    else if (isScheduler_1.isScheduler(periodOrScheduler)) {
+        scheduler = periodOrScheduler;
+    }
+    if (!isScheduler_1.isScheduler(scheduler)) {
+        scheduler = async_1.async;
+    }
+    return new Observable_1.Observable(function (subscriber) {
+        var due = isNumeric_1.isNumeric(dueTime)
+            ? dueTime
+            : (+dueTime - scheduler.now());
+        return scheduler.schedule(dispatch, due, {
+            index: 0, period: period, subscriber: subscriber
+        });
+    });
+}
+exports.timer = timer;
+function dispatch(state) {
+    var index = state.index, period = state.period, subscriber = state.subscriber;
+    subscriber.next(index);
+    if (subscriber.closed) {
+        return;
     }
-
-    return {
-        keys: keys,     // A hash of key name to index
-        free: free      // An array of unkeyed item indices
+    else if (period === -1) {
+        return subscriber.complete();
     }
+    state.index = index + 1;
+    this.schedule(state, period);
 }
 
-function appendPatch(apply, patch) {
-    if (apply) {
-        if (isArray(apply)) {
-            apply.push(patch)
-        } else {
-            apply = [apply, patch]
+},{"../Observable":48,"../scheduler/async":206,"../util/isNumeric":226,"../util/isScheduler":230}],84:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var from_1 = require("./from");
+var empty_1 = require("./empty");
+function using(resourceFactory, observableFactory) {
+    return new Observable_1.Observable(function (subscriber) {
+        var resource;
+        try {
+            resource = resourceFactory();
+        }
+        catch (err) {
+            subscriber.error(err);
+            return undefined;
+        }
+        var result;
+        try {
+            result = observableFactory(resource);
+        }
+        catch (err) {
+            subscriber.error(err);
+            return undefined;
         }
+        var source = result ? from_1.from(result) : empty_1.EMPTY;
+        var subscription = source.subscribe(subscriber);
+        return function () {
+            subscription.unsubscribe();
+            if (resource) {
+                resource.unsubscribe();
+            }
+        };
+    });
+}
+exports.using = using;
 
-        return apply
-    } else {
-        return patch
+},{"../Observable":48,"./empty":65,"./from":67}],85:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var fromArray_1 = require("./fromArray");
+var isArray_1 = require("../util/isArray");
+var Subscriber_1 = require("../Subscriber");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+var iterator_1 = require("../../internal/symbol/iterator");
+function zip() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
+    }
+    var resultSelector = observables[observables.length - 1];
+    if (typeof resultSelector === 'function') {
+        observables.pop();
     }
+    return fromArray_1.fromArray(observables, undefined).lift(new ZipOperator(resultSelector));
 }
-
-},{"../vnode/handle-thunk":194,"../vnode/is-thunk":195,"../vnode/is-vnode":197,"../vnode/is-vtext":198,"../vnode/is-widget":199,"../vnode/vpatch":202,"./diff-props":204,"x-is-array":224}],206:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
+exports.zip = zip;
+var ZipOperator = (function () {
+    function ZipOperator(resultSelector) {
+        this.resultSelector = resultSelector;
+    }
+    ZipOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector));
+    };
+    return ZipOperator;
+}());
+exports.ZipOperator = ZipOperator;
+var ZipSubscriber = (function (_super) {
+    __extends(ZipSubscriber, _super);
+    function ZipSubscriber(destination, resultSelector, values) {
+        if (values === void 0) { values = Object.create(null); }
+        var _this = _super.call(this, destination) || this;
+        _this.iterators = [];
+        _this.active = 0;
+        _this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null;
+        _this.values = values;
+        return _this;
+    }
+    ZipSubscriber.prototype._next = function (value) {
+        var iterators = this.iterators;
+        if (isArray_1.isArray(value)) {
+            iterators.push(new StaticArrayIterator(value));
+        }
+        else if (typeof value[iterator_1.iterator] === 'function') {
+            iterators.push(new StaticIterator(value[iterator_1.iterator]()));
+        }
+        else {
+            iterators.push(new ZipBufferIterator(this.destination, this, value));
+        }
+    };
+    ZipSubscriber.prototype._complete = function () {
+        var iterators = this.iterators;
+        var len = iterators.length;
+        this.unsubscribe();
+        if (len === 0) {
+            this.destination.complete();
+            return;
+        }
+        this.active = len;
+        for (var i = 0; i < len; i++) {
+            var iterator = iterators[i];
+            if (iterator.stillUnsubscribed) {
+                var destination = this.destination;
+                destination.add(iterator.subscribe(iterator, i));
+            }
+            else {
+                this.active--;
+            }
+        }
+    };
+    ZipSubscriber.prototype.notifyInactive = function () {
+        this.active--;
+        if (this.active === 0) {
+            this.destination.complete();
+        }
+    };
+    ZipSubscriber.prototype.checkIterators = function () {
+        var iterators = this.iterators;
+        var len = iterators.length;
+        var destination = this.destination;
+        for (var i = 0; i < len; i++) {
+            var iterator = iterators[i];
+            if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {
+                return;
+            }
+        }
+        var shouldComplete = false;
+        var args = [];
+        for (var i = 0; i < len; i++) {
+            var iterator = iterators[i];
+            var result = iterator.next();
+            if (iterator.hasCompleted()) {
+                shouldComplete = true;
+            }
+            if (result.done) {
+                destination.complete();
+                return;
+            }
+            args.push(result.value);
+        }
+        if (this.resultSelector) {
+            this._tryresultSelector(args);
+        }
+        else {
+            destination.next(args);
+        }
+        if (shouldComplete) {
+            destination.complete();
+        }
+    };
+    ZipSubscriber.prototype._tryresultSelector = function (args) {
+        var result;
+        try {
+            result = this.resultSelector.apply(this, args);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        this.destination.next(result);
+    };
+    return ZipSubscriber;
+}(Subscriber_1.Subscriber));
+exports.ZipSubscriber = ZipSubscriber;
+var StaticIterator = (function () {
+    function StaticIterator(iterator) {
+        this.iterator = iterator;
+        this.nextResult = iterator.next();
+    }
+    StaticIterator.prototype.hasValue = function () {
+        return true;
+    };
+    StaticIterator.prototype.next = function () {
+        var result = this.nextResult;
+        this.nextResult = this.iterator.next();
+        return result;
+    };
+    StaticIterator.prototype.hasCompleted = function () {
+        var nextResult = this.nextResult;
+        return nextResult && nextResult.done;
+    };
+    return StaticIterator;
+}());
+var StaticArrayIterator = (function () {
+    function StaticArrayIterator(array) {
+        this.array = array;
+        this.index = 0;
+        this.length = 0;
+        this.length = array.length;
+    }
+    StaticArrayIterator.prototype[iterator_1.iterator] = function () {
+        return this;
+    };
+    StaticArrayIterator.prototype.next = function (value) {
+        var i = this.index++;
+        var array = this.array;
+        return i < this.length ? { value: array[i], done: false } : { value: null, done: true };
+    };
+    StaticArrayIterator.prototype.hasValue = function () {
+        return this.array.length > this.index;
+    };
+    StaticArrayIterator.prototype.hasCompleted = function () {
+        return this.array.length === this.index;
+    };
+    return StaticArrayIterator;
+}());
+var ZipBufferIterator = (function (_super) {
+    __extends(ZipBufferIterator, _super);
+    function ZipBufferIterator(destination, parent, observable) {
+        var _this = _super.call(this, destination) || this;
+        _this.parent = parent;
+        _this.observable = observable;
+        _this.stillUnsubscribed = true;
+        _this.buffer = [];
+        _this.isComplete = false;
+        return _this;
+    }
+    ZipBufferIterator.prototype[iterator_1.iterator] = function () {
+        return this;
+    };
+    ZipBufferIterator.prototype.next = function () {
+        var buffer = this.buffer;
+        if (buffer.length === 0 && this.isComplete) {
+            return { value: null, done: true };
+        }
+        else {
+            return { value: buffer.shift(), done: false };
+        }
+    };
+    ZipBufferIterator.prototype.hasValue = function () {
+        return this.buffer.length > 0;
+    };
+    ZipBufferIterator.prototype.hasCompleted = function () {
+        return this.buffer.length === 0 && this.isComplete;
+    };
+    ZipBufferIterator.prototype.notifyComplete = function () {
+        if (this.buffer.length > 0) {
+            this.isComplete = true;
+            this.parent.notifyInactive();
+        }
+        else {
+            this.destination.complete();
+        }
+    };
+    ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.buffer.push(innerValue);
+        this.parent.checkIterators();
+    };
+    ZipBufferIterator.prototype.subscribe = function (value, index) {
+        return subscribeToResult_1.subscribeToResult(this, this.observable, this, index);
+    };
+    return ZipBufferIterator;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../../internal/symbol/iterator":208,"../OuterSubscriber":50,"../Subscriber":55,"../util/isArray":220,"../util/subscribeToResult":239,"./fromArray":68}],86:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function audit(durationSelector) {
+    return function auditOperatorFunction(source) {
+        return source.lift(new AuditOperator(durationSelector));
+    };
+}
+exports.audit = audit;
+var AuditOperator = (function () {
+    function AuditOperator(durationSelector) {
+        this.durationSelector = durationSelector;
+    }
+    AuditOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector));
+    };
+    return AuditOperator;
+}());
+var AuditSubscriber = (function (_super) {
+    __extends(AuditSubscriber, _super);
+    function AuditSubscriber(destination, durationSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.durationSelector = durationSelector;
+        _this.hasValue = false;
+        return _this;
+    }
+    AuditSubscriber.prototype._next = function (value) {
+        this.value = value;
+        this.hasValue = true;
+        if (!this.throttled) {
+            var duration = void 0;
+            try {
+                var durationSelector = this.durationSelector;
+                duration = durationSelector(value);
+            }
+            catch (err) {
+                return this.destination.error(err);
+            }
+            var innerSubscription = subscribeToResult_1.subscribeToResult(this, duration);
+            if (!innerSubscription || innerSubscription.closed) {
+                this.clearThrottle();
+            }
+            else {
+                this.add(this.throttled = innerSubscription);
+            }
+        }
+    };
+    AuditSubscriber.prototype.clearThrottle = function () {
+        var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled;
+        if (throttled) {
+            this.remove(throttled);
+            this.throttled = null;
+            throttled.unsubscribe();
+        }
+        if (hasValue) {
+            this.value = null;
+            this.hasValue = false;
+            this.destination.next(value);
+        }
+    };
+    AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) {
+        this.clearThrottle();
+    };
+    AuditSubscriber.prototype.notifyComplete = function () {
+        this.clearThrottle();
+    };
+    return AuditSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],87:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var async_1 = require("../scheduler/async");
+var audit_1 = require("./audit");
+var timer_1 = require("../observable/timer");
+function auditTime(duration, scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return audit_1.audit(function () { return timer_1.timer(duration, scheduler); });
+}
+exports.auditTime = auditTime;
+
+},{"../observable/timer":83,"../scheduler/async":206,"./audit":86}],88:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function buffer(closingNotifier) {
+    return function bufferOperatorFunction(source) {
+        return source.lift(new BufferOperator(closingNotifier));
+    };
+}
+exports.buffer = buffer;
+var BufferOperator = (function () {
+    function BufferOperator(closingNotifier) {
+        this.closingNotifier = closingNotifier;
+    }
+    BufferOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));
+    };
+    return BufferOperator;
+}());
+var BufferSubscriber = (function (_super) {
+    __extends(BufferSubscriber, _super);
+    function BufferSubscriber(destination, closingNotifier) {
+        var _this = _super.call(this, destination) || this;
+        _this.buffer = [];
+        _this.add(subscribeToResult_1.subscribeToResult(_this, closingNotifier));
+        return _this;
+    }
+    BufferSubscriber.prototype._next = function (value) {
+        this.buffer.push(value);
+    };
+    BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        var buffer = this.buffer;
+        this.buffer = [];
+        this.destination.next(buffer);
+    };
+    return BufferSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],89:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function bufferCount(bufferSize, startBufferEvery) {
+    if (startBufferEvery === void 0) { startBufferEvery = null; }
+    return function bufferCountOperatorFunction(source) {
+        return source.lift(new BufferCountOperator(bufferSize, startBufferEvery));
+    };
+}
+exports.bufferCount = bufferCount;
+var BufferCountOperator = (function () {
+    function BufferCountOperator(bufferSize, startBufferEvery) {
+        this.bufferSize = bufferSize;
+        this.startBufferEvery = startBufferEvery;
+        if (!startBufferEvery || bufferSize === startBufferEvery) {
+            this.subscriberClass = BufferCountSubscriber;
+        }
+        else {
+            this.subscriberClass = BufferSkipCountSubscriber;
+        }
+    }
+    BufferCountOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));
+    };
+    return BufferCountOperator;
+}());
+var BufferCountSubscriber = (function (_super) {
+    __extends(BufferCountSubscriber, _super);
+    function BufferCountSubscriber(destination, bufferSize) {
+        var _this = _super.call(this, destination) || this;
+        _this.bufferSize = bufferSize;
+        _this.buffer = [];
+        return _this;
+    }
+    BufferCountSubscriber.prototype._next = function (value) {
+        var buffer = this.buffer;
+        buffer.push(value);
+        if (buffer.length == this.bufferSize) {
+            this.destination.next(buffer);
+            this.buffer = [];
+        }
+    };
+    BufferCountSubscriber.prototype._complete = function () {
+        var buffer = this.buffer;
+        if (buffer.length > 0) {
+            this.destination.next(buffer);
+        }
+        _super.prototype._complete.call(this);
+    };
+    return BufferCountSubscriber;
+}(Subscriber_1.Subscriber));
+var BufferSkipCountSubscriber = (function (_super) {
+    __extends(BufferSkipCountSubscriber, _super);
+    function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) {
+        var _this = _super.call(this, destination) || this;
+        _this.bufferSize = bufferSize;
+        _this.startBufferEvery = startBufferEvery;
+        _this.buffers = [];
+        _this.count = 0;
+        return _this;
+    }
+    BufferSkipCountSubscriber.prototype._next = function (value) {
+        var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count;
+        this.count++;
+        if (count % startBufferEvery === 0) {
+            buffers.push([]);
+        }
+        for (var i = buffers.length; i--;) {
+            var buffer = buffers[i];
+            buffer.push(value);
+            if (buffer.length === bufferSize) {
+                buffers.splice(i, 1);
+                this.destination.next(buffer);
+            }
+        }
+    };
+    BufferSkipCountSubscriber.prototype._complete = function () {
+        var _a = this, buffers = _a.buffers, destination = _a.destination;
+        while (buffers.length > 0) {
+            var buffer = buffers.shift();
+            if (buffer.length > 0) {
+                destination.next(buffer);
+            }
+        }
+        _super.prototype._complete.call(this);
+    };
+    return BufferSkipCountSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],90:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var async_1 = require("../scheduler/async");
+var Subscriber_1 = require("../Subscriber");
+var isScheduler_1 = require("../util/isScheduler");
+function bufferTime(bufferTimeSpan) {
+    var length = arguments.length;
+    var scheduler = async_1.async;
+    if (isScheduler_1.isScheduler(arguments[arguments.length - 1])) {
+        scheduler = arguments[arguments.length - 1];
+        length--;
+    }
+    var bufferCreationInterval = null;
+    if (length >= 2) {
+        bufferCreationInterval = arguments[1];
+    }
+    var maxBufferSize = Number.POSITIVE_INFINITY;
+    if (length >= 3) {
+        maxBufferSize = arguments[2];
+    }
+    return function bufferTimeOperatorFunction(source) {
+        return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler));
+    };
+}
+exports.bufferTime = bufferTime;
+var BufferTimeOperator = (function () {
+    function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
+        this.bufferTimeSpan = bufferTimeSpan;
+        this.bufferCreationInterval = bufferCreationInterval;
+        this.maxBufferSize = maxBufferSize;
+        this.scheduler = scheduler;
+    }
+    BufferTimeOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler));
+    };
+    return BufferTimeOperator;
+}());
+var Context = (function () {
+    function Context() {
+        this.buffer = [];
+    }
+    return Context;
+}());
+var BufferTimeSubscriber = (function (_super) {
+    __extends(BufferTimeSubscriber, _super);
+    function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
+        var _this = _super.call(this, destination) || this;
+        _this.bufferTimeSpan = bufferTimeSpan;
+        _this.bufferCreationInterval = bufferCreationInterval;
+        _this.maxBufferSize = maxBufferSize;
+        _this.scheduler = scheduler;
+        _this.contexts = [];
+        var context = _this.openContext();
+        _this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0;
+        if (_this.timespanOnly) {
+            var timeSpanOnlyState = { subscriber: _this, context: context, bufferTimeSpan: bufferTimeSpan };
+            _this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
+        }
+        else {
+            var closeState = { subscriber: _this, context: context };
+            var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: _this, scheduler: scheduler };
+            _this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState));
+            _this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState));
+        }
+        return _this;
+    }
+    BufferTimeSubscriber.prototype._next = function (value) {
+        var contexts = this.contexts;
+        var len = contexts.length;
+        var filledBufferContext;
+        for (var i = 0; i < len; i++) {
+            var context_1 = contexts[i];
+            var buffer = context_1.buffer;
+            buffer.push(value);
+            if (buffer.length == this.maxBufferSize) {
+                filledBufferContext = context_1;
+            }
+        }
+        if (filledBufferContext) {
+            this.onBufferFull(filledBufferContext);
+        }
+    };
+    BufferTimeSubscriber.prototype._error = function (err) {
+        this.contexts.length = 0;
+        _super.prototype._error.call(this, err);
+    };
+    BufferTimeSubscriber.prototype._complete = function () {
+        var _a = this, contexts = _a.contexts, destination = _a.destination;
+        while (contexts.length > 0) {
+            var context_2 = contexts.shift();
+            destination.next(context_2.buffer);
+        }
+        _super.prototype._complete.call(this);
+    };
+    BufferTimeSubscriber.prototype._unsubscribe = function () {
+        this.contexts = null;
+    };
+    BufferTimeSubscriber.prototype.onBufferFull = function (context) {
+        this.closeContext(context);
+        var closeAction = context.closeAction;
+        closeAction.unsubscribe();
+        this.remove(closeAction);
+        if (!this.closed && this.timespanOnly) {
+            context = this.openContext();
+            var bufferTimeSpan = this.bufferTimeSpan;
+            var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan };
+            this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
+        }
+    };
+    BufferTimeSubscriber.prototype.openContext = function () {
+        var context = new Context();
+        this.contexts.push(context);
+        return context;
+    };
+    BufferTimeSubscriber.prototype.closeContext = function (context) {
+        this.destination.next(context.buffer);
+        var contexts = this.contexts;
+        var spliceIndex = contexts ? contexts.indexOf(context) : -1;
+        if (spliceIndex >= 0) {
+            contexts.splice(contexts.indexOf(context), 1);
+        }
+    };
+    return BufferTimeSubscriber;
+}(Subscriber_1.Subscriber));
+function dispatchBufferTimeSpanOnly(state) {
+    var subscriber = state.subscriber;
+    var prevContext = state.context;
+    if (prevContext) {
+        subscriber.closeContext(prevContext);
+    }
+    if (!subscriber.closed) {
+        state.context = subscriber.openContext();
+        state.context.closeAction = this.schedule(state, state.bufferTimeSpan);
+    }
+}
+function dispatchBufferCreation(state) {
+    var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler;
+    var context = subscriber.openContext();
+    var action = this;
+    if (!subscriber.closed) {
+        subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context }));
+        action.schedule(state, bufferCreationInterval);
+    }
+}
+function dispatchBufferClose(arg) {
+    var subscriber = arg.subscriber, context = arg.context;
+    subscriber.closeContext(context);
+}
+
+},{"../Subscriber":55,"../scheduler/async":206,"../util/isScheduler":230}],91:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscription_1 = require("../Subscription");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+function bufferToggle(openings, closingSelector) {
+    return function bufferToggleOperatorFunction(source) {
+        return source.lift(new BufferToggleOperator(openings, closingSelector));
+    };
+}
+exports.bufferToggle = bufferToggle;
+var BufferToggleOperator = (function () {
+    function BufferToggleOperator(openings, closingSelector) {
+        this.openings = openings;
+        this.closingSelector = closingSelector;
+    }
+    BufferToggleOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector));
+    };
+    return BufferToggleOperator;
+}());
+var BufferToggleSubscriber = (function (_super) {
+    __extends(BufferToggleSubscriber, _super);
+    function BufferToggleSubscriber(destination, openings, closingSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.openings = openings;
+        _this.closingSelector = closingSelector;
+        _this.contexts = [];
+        _this.add(subscribeToResult_1.subscribeToResult(_this, openings));
+        return _this;
+    }
+    BufferToggleSubscriber.prototype._next = function (value) {
+        var contexts = this.contexts;
+        var len = contexts.length;
+        for (var i = 0; i < len; i++) {
+            contexts[i].buffer.push(value);
+        }
+    };
+    BufferToggleSubscriber.prototype._error = function (err) {
+        var contexts = this.contexts;
+        while (contexts.length > 0) {
+            var context_1 = contexts.shift();
+            context_1.subscription.unsubscribe();
+            context_1.buffer = null;
+            context_1.subscription = null;
+        }
+        this.contexts = null;
+        _super.prototype._error.call(this, err);
+    };
+    BufferToggleSubscriber.prototype._complete = function () {
+        var contexts = this.contexts;
+        while (contexts.length > 0) {
+            var context_2 = contexts.shift();
+            this.destination.next(context_2.buffer);
+            context_2.subscription.unsubscribe();
+            context_2.buffer = null;
+            context_2.subscription = null;
+        }
+        this.contexts = null;
+        _super.prototype._complete.call(this);
+    };
+    BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue);
+    };
+    BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) {
+        this.closeBuffer(innerSub.context);
+    };
+    BufferToggleSubscriber.prototype.openBuffer = function (value) {
+        try {
+            var closingSelector = this.closingSelector;
+            var closingNotifier = closingSelector.call(this, value);
+            if (closingNotifier) {
+                this.trySubscribe(closingNotifier);
+            }
+        }
+        catch (err) {
+            this._error(err);
+        }
+    };
+    BufferToggleSubscriber.prototype.closeBuffer = function (context) {
+        var contexts = this.contexts;
+        if (contexts && context) {
+            var buffer = context.buffer, subscription = context.subscription;
+            this.destination.next(buffer);
+            contexts.splice(contexts.indexOf(context), 1);
+            this.remove(subscription);
+            subscription.unsubscribe();
+        }
+    };
+    BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) {
+        var contexts = this.contexts;
+        var buffer = [];
+        var subscription = new Subscription_1.Subscription();
+        var context = { buffer: buffer, subscription: subscription };
+        contexts.push(context);
+        var innerSubscription = subscribeToResult_1.subscribeToResult(this, closingNotifier, context);
+        if (!innerSubscription || innerSubscription.closed) {
+            this.closeBuffer(context);
+        }
+        else {
+            innerSubscription.context = context;
+            this.add(innerSubscription);
+            subscription.add(innerSubscription);
+        }
+    };
+    return BufferToggleSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":50,"../Subscription":56,"../util/subscribeToResult":239}],92:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscription_1 = require("../Subscription");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function bufferWhen(closingSelector) {
+    return function (source) {
+        return source.lift(new BufferWhenOperator(closingSelector));
+    };
+}
+exports.bufferWhen = bufferWhen;
+var BufferWhenOperator = (function () {
+    function BufferWhenOperator(closingSelector) {
+        this.closingSelector = closingSelector;
+    }
+    BufferWhenOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector));
+    };
+    return BufferWhenOperator;
+}());
+var BufferWhenSubscriber = (function (_super) {
+    __extends(BufferWhenSubscriber, _super);
+    function BufferWhenSubscriber(destination, closingSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.closingSelector = closingSelector;
+        _this.subscribing = false;
+        _this.openBuffer();
+        return _this;
+    }
+    BufferWhenSubscriber.prototype._next = function (value) {
+        this.buffer.push(value);
+    };
+    BufferWhenSubscriber.prototype._complete = function () {
+        var buffer = this.buffer;
+        if (buffer) {
+            this.destination.next(buffer);
+        }
+        _super.prototype._complete.call(this);
+    };
+    BufferWhenSubscriber.prototype._unsubscribe = function () {
+        this.buffer = null;
+        this.subscribing = false;
+    };
+    BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.openBuffer();
+    };
+    BufferWhenSubscriber.prototype.notifyComplete = function () {
+        if (this.subscribing) {
+            this.complete();
+        }
+        else {
+            this.openBuffer();
+        }
+    };
+    BufferWhenSubscriber.prototype.openBuffer = function () {
+        var closingSubscription = this.closingSubscription;
+        if (closingSubscription) {
+            this.remove(closingSubscription);
+            closingSubscription.unsubscribe();
+        }
+        var buffer = this.buffer;
+        if (this.buffer) {
+            this.destination.next(buffer);
+        }
+        this.buffer = [];
+        var closingNotifier;
+        try {
+            var closingSelector = this.closingSelector;
+            closingNotifier = closingSelector();
+        }
+        catch (err) {
+            return this.error(err);
+        }
+        closingSubscription = new Subscription_1.Subscription();
+        this.closingSubscription = closingSubscription;
+        this.add(closingSubscription);
+        this.subscribing = true;
+        closingSubscription.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));
+        this.subscribing = false;
+    };
+    return BufferWhenSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":50,"../Subscription":56,"../util/subscribeToResult":239}],93:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var InnerSubscriber_1 = require("../InnerSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function catchError(selector) {
+    return function catchErrorOperatorFunction(source) {
+        var operator = new CatchOperator(selector);
+        var caught = source.lift(operator);
+        return (operator.caught = caught);
+    };
+}
+exports.catchError = catchError;
+var CatchOperator = (function () {
+    function CatchOperator(selector) {
+        this.selector = selector;
+    }
+    CatchOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));
+    };
+    return CatchOperator;
+}());
+var CatchSubscriber = (function (_super) {
+    __extends(CatchSubscriber, _super);
+    function CatchSubscriber(destination, selector, caught) {
+        var _this = _super.call(this, destination) || this;
+        _this.selector = selector;
+        _this.caught = caught;
+        return _this;
+    }
+    CatchSubscriber.prototype.error = function (err) {
+        if (!this.isStopped) {
+            var result = void 0;
+            try {
+                result = this.selector(err, this.caught);
+            }
+            catch (err2) {
+                _super.prototype.error.call(this, err2);
+                return;
+            }
+            this._unsubscribeAndRecycle();
+            var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined);
+            this.add(innerSubscriber);
+            var innerSubscription = subscribeToResult_1.subscribeToResult(this, result, undefined, undefined, innerSubscriber);
+            if (innerSubscription !== innerSubscriber) {
+                this.add(innerSubscription);
+            }
+        }
+    };
+    return CatchSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../util/subscribeToResult":239}],94:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var combineLatest_1 = require("../observable/combineLatest");
+function combineAll(project) {
+    return function (source) { return source.lift(new combineLatest_1.CombineLatestOperator(project)); };
+}
+exports.combineAll = combineAll;
+
+},{"../observable/combineLatest":62}],95:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var isArray_1 = require("../util/isArray");
+var combineLatest_1 = require("../observable/combineLatest");
+var from_1 = require("../observable/from");
+var none = {};
+function combineLatest() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
+    }
+    var project = null;
+    if (typeof observables[observables.length - 1] === 'function') {
+        project = observables.pop();
+    }
+    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
+        observables = observables[0].slice();
+    }
+    return function (source) { return source.lift.call(from_1.from([source].concat(observables)), new combineLatest_1.CombineLatestOperator(project)); };
+}
+exports.combineLatest = combineLatest;
+
+},{"../observable/combineLatest":62,"../observable/from":67,"../util/isArray":220}],96:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var concat_1 = require("../observable/concat");
+function concat() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
+    }
+    return function (source) { return source.lift.call(concat_1.concat.apply(void 0, [source].concat(observables))); };
+}
+exports.concat = concat;
+
+},{"../observable/concat":63}],97:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var mergeAll_1 = require("./mergeAll");
+function concatAll() {
+    return mergeAll_1.mergeAll(1);
+}
+exports.concatAll = concatAll;
+
+},{"./mergeAll":130}],98:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var mergeMap_1 = require("./mergeMap");
+function concatMap(project, resultSelector) {
+    return mergeMap_1.mergeMap(project, resultSelector, 1);
+}
+exports.concatMap = concatMap;
+
+},{"./mergeMap":131}],99:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var concatMap_1 = require("./concatMap");
+function concatMapTo(innerObservable, resultSelector) {
+    return concatMap_1.concatMap(function () { return innerObservable; }, resultSelector);
+}
+exports.concatMapTo = concatMapTo;
+
+},{"./concatMap":98}],100:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function count(predicate) {
+    return function (source) { return source.lift(new CountOperator(predicate, source)); };
+}
+exports.count = count;
+var CountOperator = (function () {
+    function CountOperator(predicate, source) {
+        this.predicate = predicate;
+        this.source = source;
+    }
+    CountOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source));
+    };
+    return CountOperator;
+}());
+var CountSubscriber = (function (_super) {
+    __extends(CountSubscriber, _super);
+    function CountSubscriber(destination, predicate, source) {
+        var _this = _super.call(this, destination) || this;
+        _this.predicate = predicate;
+        _this.source = source;
+        _this.count = 0;
+        _this.index = 0;
+        return _this;
+    }
+    CountSubscriber.prototype._next = function (value) {
+        if (this.predicate) {
+            this._tryPredicate(value);
+        }
+        else {
+            this.count++;
+        }
+    };
+    CountSubscriber.prototype._tryPredicate = function (value) {
+        var result;
+        try {
+            result = this.predicate(value, this.index++, this.source);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        if (result) {
+            this.count++;
+        }
+    };
+    CountSubscriber.prototype._complete = function () {
+        this.destination.next(this.count);
+        this.destination.complete();
+    };
+    return CountSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],101:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function debounce(durationSelector) {
+    return function (source) { return source.lift(new DebounceOperator(durationSelector)); };
+}
+exports.debounce = debounce;
+var DebounceOperator = (function () {
+    function DebounceOperator(durationSelector) {
+        this.durationSelector = durationSelector;
+    }
+    DebounceOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector));
+    };
+    return DebounceOperator;
+}());
+var DebounceSubscriber = (function (_super) {
+    __extends(DebounceSubscriber, _super);
+    function DebounceSubscriber(destination, durationSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.durationSelector = durationSelector;
+        _this.hasValue = false;
+        _this.durationSubscription = null;
+        return _this;
+    }
+    DebounceSubscriber.prototype._next = function (value) {
+        try {
+            var result = this.durationSelector.call(this, value);
+            if (result) {
+                this._tryNext(value, result);
+            }
+        }
+        catch (err) {
+            this.destination.error(err);
+        }
+    };
+    DebounceSubscriber.prototype._complete = function () {
+        this.emitValue();
+        this.destination.complete();
+    };
+    DebounceSubscriber.prototype._tryNext = function (value, duration) {
+        var subscription = this.durationSubscription;
+        this.value = value;
+        this.hasValue = true;
+        if (subscription) {
+            subscription.unsubscribe();
+            this.remove(subscription);
+        }
+        subscription = subscribeToResult_1.subscribeToResult(this, duration);
+        if (subscription && !subscription.closed) {
+            this.add(this.durationSubscription = subscription);
+        }
+    };
+    DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.emitValue();
+    };
+    DebounceSubscriber.prototype.notifyComplete = function () {
+        this.emitValue();
+    };
+    DebounceSubscriber.prototype.emitValue = function () {
+        if (this.hasValue) {
+            var value = this.value;
+            var subscription = this.durationSubscription;
+            if (subscription) {
+                this.durationSubscription = null;
+                subscription.unsubscribe();
+                this.remove(subscription);
+            }
+            this.value = null;
+            this.hasValue = false;
+            _super.prototype._next.call(this, value);
+        }
+    };
+    return DebounceSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],102:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var async_1 = require("../scheduler/async");
+function debounceTime(dueTime, scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); };
+}
+exports.debounceTime = debounceTime;
+var DebounceTimeOperator = (function () {
+    function DebounceTimeOperator(dueTime, scheduler) {
+        this.dueTime = dueTime;
+        this.scheduler = scheduler;
+    }
+    DebounceTimeOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));
+    };
+    return DebounceTimeOperator;
+}());
+var DebounceTimeSubscriber = (function (_super) {
+    __extends(DebounceTimeSubscriber, _super);
+    function DebounceTimeSubscriber(destination, dueTime, scheduler) {
+        var _this = _super.call(this, destination) || this;
+        _this.dueTime = dueTime;
+        _this.scheduler = scheduler;
+        _this.debouncedSubscription = null;
+        _this.lastValue = null;
+        _this.hasValue = false;
+        return _this;
+    }
+    DebounceTimeSubscriber.prototype._next = function (value) {
+        this.clearDebounce();
+        this.lastValue = value;
+        this.hasValue = true;
+        this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));
+    };
+    DebounceTimeSubscriber.prototype._complete = function () {
+        this.debouncedNext();
+        this.destination.complete();
+    };
+    DebounceTimeSubscriber.prototype.debouncedNext = function () {
+        this.clearDebounce();
+        if (this.hasValue) {
+            var lastValue = this.lastValue;
+            this.lastValue = null;
+            this.hasValue = false;
+            this.destination.next(lastValue);
+        }
+    };
+    DebounceTimeSubscriber.prototype.clearDebounce = function () {
+        var debouncedSubscription = this.debouncedSubscription;
+        if (debouncedSubscription !== null) {
+            this.remove(debouncedSubscription);
+            debouncedSubscription.unsubscribe();
+            this.debouncedSubscription = null;
+        }
+    };
+    return DebounceTimeSubscriber;
+}(Subscriber_1.Subscriber));
+function dispatchNext(subscriber) {
+    subscriber.debouncedNext();
+}
+
+},{"../Subscriber":55,"../scheduler/async":206}],103:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function defaultIfEmpty(defaultValue) {
+    if (defaultValue === void 0) { defaultValue = null; }
+    return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); };
+}
+exports.defaultIfEmpty = defaultIfEmpty;
+var DefaultIfEmptyOperator = (function () {
+    function DefaultIfEmptyOperator(defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+    DefaultIfEmptyOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue));
+    };
+    return DefaultIfEmptyOperator;
+}());
+var DefaultIfEmptySubscriber = (function (_super) {
+    __extends(DefaultIfEmptySubscriber, _super);
+    function DefaultIfEmptySubscriber(destination, defaultValue) {
+        var _this = _super.call(this, destination) || this;
+        _this.defaultValue = defaultValue;
+        _this.isEmpty = true;
+        return _this;
+    }
+    DefaultIfEmptySubscriber.prototype._next = function (value) {
+        this.isEmpty = false;
+        this.destination.next(value);
+    };
+    DefaultIfEmptySubscriber.prototype._complete = function () {
+        if (this.isEmpty) {
+            this.destination.next(this.defaultValue);
+        }
+        this.destination.complete();
+    };
+    return DefaultIfEmptySubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],104:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var async_1 = require("../scheduler/async");
+var isDate_1 = require("../util/isDate");
+var Subscriber_1 = require("../Subscriber");
+var Notification_1 = require("../Notification");
+function delay(delay, scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    var absoluteDelay = isDate_1.isDate(delay);
+    var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);
+    return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); };
+}
+exports.delay = delay;
+var DelayOperator = (function () {
+    function DelayOperator(delay, scheduler) {
+        this.delay = delay;
+        this.scheduler = scheduler;
+    }
+    DelayOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));
+    };
+    return DelayOperator;
+}());
+var DelaySubscriber = (function (_super) {
+    __extends(DelaySubscriber, _super);
+    function DelaySubscriber(destination, delay, scheduler) {
+        var _this = _super.call(this, destination) || this;
+        _this.delay = delay;
+        _this.scheduler = scheduler;
+        _this.queue = [];
+        _this.active = false;
+        _this.errored = false;
+        return _this;
+    }
+    DelaySubscriber.dispatch = function (state) {
+        var source = state.source;
+        var queue = source.queue;
+        var scheduler = state.scheduler;
+        var destination = state.destination;
+        while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {
+            queue.shift().notification.observe(destination);
+        }
+        if (queue.length > 0) {
+            var delay_1 = Math.max(0, queue[0].time - scheduler.now());
+            this.schedule(state, delay_1);
+        }
+        else {
+            this.unsubscribe();
+            source.active = false;
+        }
+    };
+    DelaySubscriber.prototype._schedule = function (scheduler) {
+        this.active = true;
+        var destination = this.destination;
+        destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {
+            source: this, destination: this.destination, scheduler: scheduler
+        }));
+    };
+    DelaySubscriber.prototype.scheduleNotification = function (notification) {
+        if (this.errored === true) {
+            return;
+        }
+        var scheduler = this.scheduler;
+        var message = new DelayMessage(scheduler.now() + this.delay, notification);
+        this.queue.push(message);
+        if (this.active === false) {
+            this._schedule(scheduler);
+        }
+    };
+    DelaySubscriber.prototype._next = function (value) {
+        this.scheduleNotification(Notification_1.Notification.createNext(value));
+    };
+    DelaySubscriber.prototype._error = function (err) {
+        this.errored = true;
+        this.queue = [];
+        this.destination.error(err);
+        this.unsubscribe();
+    };
+    DelaySubscriber.prototype._complete = function () {
+        this.scheduleNotification(Notification_1.Notification.createComplete());
+        this.unsubscribe();
+    };
+    return DelaySubscriber;
+}(Subscriber_1.Subscriber));
+var DelayMessage = (function () {
+    function DelayMessage(time, notification) {
+        this.time = time;
+        this.notification = notification;
+    }
+    return DelayMessage;
+}());
+
+},{"../Notification":47,"../Subscriber":55,"../scheduler/async":206,"../util/isDate":222}],105:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var Observable_1 = require("../Observable");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function delayWhen(delayDurationSelector, subscriptionDelay) {
+    if (subscriptionDelay) {
+        return function (source) {
+            return new SubscriptionDelayObservable(source, subscriptionDelay)
+                .lift(new DelayWhenOperator(delayDurationSelector));
+        };
+    }
+    return function (source) { return source.lift(new DelayWhenOperator(delayDurationSelector)); };
+}
+exports.delayWhen = delayWhen;
+var DelayWhenOperator = (function () {
+    function DelayWhenOperator(delayDurationSelector) {
+        this.delayDurationSelector = delayDurationSelector;
+    }
+    DelayWhenOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector));
+    };
+    return DelayWhenOperator;
+}());
+var DelayWhenSubscriber = (function (_super) {
+    __extends(DelayWhenSubscriber, _super);
+    function DelayWhenSubscriber(destination, delayDurationSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.delayDurationSelector = delayDurationSelector;
+        _this.completed = false;
+        _this.delayNotifierSubscriptions = [];
+        _this.index = 0;
+        return _this;
+    }
+    DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.destination.next(outerValue);
+        this.removeSubscription(innerSub);
+        this.tryComplete();
+    };
+    DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) {
+        this._error(error);
+    };
+    DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) {
+        var value = this.removeSubscription(innerSub);
+        if (value) {
+            this.destination.next(value);
+        }
+        this.tryComplete();
+    };
+    DelayWhenSubscriber.prototype._next = function (value) {
+        var index = this.index++;
+        try {
+            var delayNotifier = this.delayDurationSelector(value, index);
+            if (delayNotifier) {
+                this.tryDelay(delayNotifier, value);
+            }
+        }
+        catch (err) {
+            this.destination.error(err);
+        }
+    };
+    DelayWhenSubscriber.prototype._complete = function () {
+        this.completed = true;
+        this.tryComplete();
+        this.unsubscribe();
+    };
+    DelayWhenSubscriber.prototype.removeSubscription = function (subscription) {
+        subscription.unsubscribe();
+        var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription);
+        if (subscriptionIdx !== -1) {
+            this.delayNotifierSubscriptions.splice(subscriptionIdx, 1);
+        }
+        return subscription.outerValue;
+    };
+    DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) {
+        var notifierSubscription = subscribeToResult_1.subscribeToResult(this, delayNotifier, value);
+        if (notifierSubscription && !notifierSubscription.closed) {
+            var destination = this.destination;
+            destination.add(notifierSubscription);
+            this.delayNotifierSubscriptions.push(notifierSubscription);
+        }
+    };
+    DelayWhenSubscriber.prototype.tryComplete = function () {
+        if (this.completed && this.delayNotifierSubscriptions.length === 0) {
+            this.destination.complete();
+        }
+    };
+    return DelayWhenSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+var SubscriptionDelayObservable = (function (_super) {
+    __extends(SubscriptionDelayObservable, _super);
+    function SubscriptionDelayObservable(source, subscriptionDelay) {
+        var _this = _super.call(this) || this;
+        _this.source = source;
+        _this.subscriptionDelay = subscriptionDelay;
+        return _this;
+    }
+    SubscriptionDelayObservable.prototype._subscribe = function (subscriber) {
+        this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source));
+    };
+    return SubscriptionDelayObservable;
+}(Observable_1.Observable));
+var SubscriptionDelaySubscriber = (function (_super) {
+    __extends(SubscriptionDelaySubscriber, _super);
+    function SubscriptionDelaySubscriber(parent, source) {
+        var _this = _super.call(this) || this;
+        _this.parent = parent;
+        _this.source = source;
+        _this.sourceSubscribed = false;
+        return _this;
+    }
+    SubscriptionDelaySubscriber.prototype._next = function (unused) {
+        this.subscribeToSource();
+    };
+    SubscriptionDelaySubscriber.prototype._error = function (err) {
+        this.unsubscribe();
+        this.parent.error(err);
+    };
+    SubscriptionDelaySubscriber.prototype._complete = function () {
+        this.unsubscribe();
+        this.subscribeToSource();
+    };
+    SubscriptionDelaySubscriber.prototype.subscribeToSource = function () {
+        if (!this.sourceSubscribed) {
+            this.sourceSubscribed = true;
+            this.unsubscribe();
+            this.source.subscribe(this.parent);
+        }
+    };
+    return SubscriptionDelaySubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Observable":48,"../OuterSubscriber":50,"../Subscriber":55,"../util/subscribeToResult":239}],106:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function dematerialize() {
+    return function dematerializeOperatorFunction(source) {
+        return source.lift(new DeMaterializeOperator());
+    };
+}
+exports.dematerialize = dematerialize;
+var DeMaterializeOperator = (function () {
+    function DeMaterializeOperator() {
+    }
+    DeMaterializeOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DeMaterializeSubscriber(subscriber));
+    };
+    return DeMaterializeOperator;
+}());
+var DeMaterializeSubscriber = (function (_super) {
+    __extends(DeMaterializeSubscriber, _super);
+    function DeMaterializeSubscriber(destination) {
+        return _super.call(this, destination) || this;
+    }
+    DeMaterializeSubscriber.prototype._next = function (value) {
+        value.observe(this.destination);
+    };
+    return DeMaterializeSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],107:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function distinct(keySelector, flushes) {
+    return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); };
+}
+exports.distinct = distinct;
+var DistinctOperator = (function () {
+    function DistinctOperator(keySelector, flushes) {
+        this.keySelector = keySelector;
+        this.flushes = flushes;
+    }
+    DistinctOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));
+    };
+    return DistinctOperator;
+}());
+var DistinctSubscriber = (function (_super) {
+    __extends(DistinctSubscriber, _super);
+    function DistinctSubscriber(destination, keySelector, flushes) {
+        var _this = _super.call(this, destination) || this;
+        _this.keySelector = keySelector;
+        _this.values = new Set();
+        if (flushes) {
+            _this.add(subscribeToResult_1.subscribeToResult(_this, flushes));
+        }
+        return _this;
+    }
+    DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.values.clear();
+    };
+    DistinctSubscriber.prototype.notifyError = function (error, innerSub) {
+        this._error(error);
+    };
+    DistinctSubscriber.prototype._next = function (value) {
+        if (this.keySelector) {
+            this._useKeySelector(value);
+        }
+        else {
+            this._finalizeNext(value, value);
+        }
+    };
+    DistinctSubscriber.prototype._useKeySelector = function (value) {
+        var key;
+        var destination = this.destination;
+        try {
+            key = this.keySelector(value);
+        }
+        catch (err) {
+            destination.error(err);
+            return;
+        }
+        this._finalizeNext(key, value);
+    };
+    DistinctSubscriber.prototype._finalizeNext = function (key, value) {
+        var values = this.values;
+        if (!values.has(key)) {
+            values.add(key);
+            this.destination.next(value);
+        }
+    };
+    return DistinctSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+exports.DistinctSubscriber = DistinctSubscriber;
+
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],108:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function distinctUntilChanged(compare, keySelector) {
+    return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); };
+}
+exports.distinctUntilChanged = distinctUntilChanged;
+var DistinctUntilChangedOperator = (function () {
+    function DistinctUntilChangedOperator(compare, keySelector) {
+        this.compare = compare;
+        this.keySelector = keySelector;
+    }
+    DistinctUntilChangedOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));
+    };
+    return DistinctUntilChangedOperator;
+}());
+var DistinctUntilChangedSubscriber = (function (_super) {
+    __extends(DistinctUntilChangedSubscriber, _super);
+    function DistinctUntilChangedSubscriber(destination, compare, keySelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.keySelector = keySelector;
+        _this.hasKey = false;
+        if (typeof compare === 'function') {
+            _this.compare = compare;
+        }
+        return _this;
+    }
+    DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {
+        return x === y;
+    };
+    DistinctUntilChangedSubscriber.prototype._next = function (value) {
+        var key;
+        try {
+            var keySelector = this.keySelector;
+            key = keySelector ? keySelector(value) : value;
+        }
+        catch (err) {
+            return this.destination.error(err);
+        }
+        var result = false;
+        if (this.hasKey) {
+            try {
+                var compare = this.compare;
+                result = compare(this.key, key);
+            }
+            catch (err) {
+                return this.destination.error(err);
+            }
+        }
+        else {
+            this.hasKey = true;
+        }
+        if (!result) {
+            this.key = key;
+            this.destination.next(value);
+        }
+    };
+    return DistinctUntilChangedSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],109:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var distinctUntilChanged_1 = require("./distinctUntilChanged");
+function distinctUntilKeyChanged(key, compare) {
+    return distinctUntilChanged_1.distinctUntilChanged(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; });
+}
+exports.distinctUntilKeyChanged = distinctUntilKeyChanged;
+
+},{"./distinctUntilChanged":108}],110:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
+var filter_1 = require("./filter");
+var throwIfEmpty_1 = require("./throwIfEmpty");
+var defaultIfEmpty_1 = require("./defaultIfEmpty");
+var take_1 = require("./take");
+function elementAt(index, defaultValue) {
+    if (index < 0) {
+        throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError();
+    }
+    var hasDefaultValue = arguments.length >= 2;
+    return function (source) { return source.pipe(filter_1.filter(function (v, i) { return i === index; }), take_1.take(1), hasDefaultValue
+        ? defaultIfEmpty_1.defaultIfEmpty(defaultValue)
+        : throwIfEmpty_1.throwIfEmpty(function () { return new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError(); })); };
+}
+exports.elementAt = elementAt;
+
+},{"../util/ArgumentOutOfRangeError":211,"./defaultIfEmpty":103,"./filter":116,"./take":168,"./throwIfEmpty":175}],111:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var concat_1 = require("../observable/concat");
+var of_1 = require("../observable/of");
+function endWith() {
+    var array = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        array[_i] = arguments[_i];
+    }
+    return function (source) { return concat_1.concat(source, of_1.of.apply(void 0, array)); };
+}
+exports.endWith = endWith;
+
+},{"../observable/concat":63,"../observable/of":76}],112:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function every(predicate, thisArg) {
+    return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); };
+}
+exports.every = every;
+var EveryOperator = (function () {
+    function EveryOperator(predicate, thisArg, source) {
+        this.predicate = predicate;
+        this.thisArg = thisArg;
+        this.source = source;
+    }
+    EveryOperator.prototype.call = function (observer, source) {
+        return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source));
+    };
+    return EveryOperator;
+}());
+var EverySubscriber = (function (_super) {
+    __extends(EverySubscriber, _super);
+    function EverySubscriber(destination, predicate, thisArg, source) {
+        var _this = _super.call(this, destination) || this;
+        _this.predicate = predicate;
+        _this.thisArg = thisArg;
+        _this.source = source;
+        _this.index = 0;
+        _this.thisArg = thisArg || _this;
+        return _this;
+    }
+    EverySubscriber.prototype.notifyComplete = function (everyValueMatch) {
+        this.destination.next(everyValueMatch);
+        this.destination.complete();
+    };
+    EverySubscriber.prototype._next = function (value) {
+        var result = false;
+        try {
+            result = this.predicate.call(this.thisArg, value, this.index++, this.source);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        if (!result) {
+            this.notifyComplete(false);
+        }
+    };
+    EverySubscriber.prototype._complete = function () {
+        this.notifyComplete(true);
+    };
+    return EverySubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],113:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function exhaust() {
+    return function (source) { return source.lift(new SwitchFirstOperator()); };
+}
+exports.exhaust = exhaust;
+var SwitchFirstOperator = (function () {
+    function SwitchFirstOperator() {
+    }
+    SwitchFirstOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new SwitchFirstSubscriber(subscriber));
+    };
+    return SwitchFirstOperator;
+}());
+var SwitchFirstSubscriber = (function (_super) {
+    __extends(SwitchFirstSubscriber, _super);
+    function SwitchFirstSubscriber(destination) {
+        var _this = _super.call(this, destination) || this;
+        _this.hasCompleted = false;
+        _this.hasSubscription = false;
+        return _this;
+    }
+    SwitchFirstSubscriber.prototype._next = function (value) {
+        if (!this.hasSubscription) {
+            this.hasSubscription = true;
+            this.add(subscribeToResult_1.subscribeToResult(this, value));
+        }
+    };
+    SwitchFirstSubscriber.prototype._complete = function () {
+        this.hasCompleted = true;
+        if (!this.hasSubscription) {
+            this.destination.complete();
+        }
+    };
+    SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) {
+        this.remove(innerSub);
+        this.hasSubscription = false;
+        if (this.hasCompleted) {
+            this.destination.complete();
+        }
+    };
+    return SwitchFirstSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],114:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var InnerSubscriber_1 = require("../InnerSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+var map_1 = require("./map");
+var from_1 = require("../observable/from");
+function exhaustMap(project, resultSelector) {
+    if (resultSelector) {
+        return function (source) { return source.pipe(exhaustMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };
+    }
+    return function (source) {
+        return source.lift(new ExhaustMapOperator(project));
+    };
+}
+exports.exhaustMap = exhaustMap;
+var ExhaustMapOperator = (function () {
+    function ExhaustMapOperator(project) {
+        this.project = project;
+    }
+    ExhaustMapOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project));
+    };
+    return ExhaustMapOperator;
+}());
+var ExhaustMapSubscriber = (function (_super) {
+    __extends(ExhaustMapSubscriber, _super);
+    function ExhaustMapSubscriber(destination, project) {
+        var _this = _super.call(this, destination) || this;
+        _this.project = project;
+        _this.hasSubscription = false;
+        _this.hasCompleted = false;
+        _this.index = 0;
+        return _this;
+    }
+    ExhaustMapSubscriber.prototype._next = function (value) {
+        if (!this.hasSubscription) {
+            this.tryNext(value);
+        }
+    };
+    ExhaustMapSubscriber.prototype.tryNext = function (value) {
+        var result;
+        var index = this.index++;
+        try {
+            result = this.project(value, index);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        this.hasSubscription = true;
+        this._innerSub(result, value, index);
+    };
+    ExhaustMapSubscriber.prototype._innerSub = function (result, value, index) {
+        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, value, index);
+        var destination = this.destination;
+        destination.add(innerSubscriber);
+        var innerSubscription = subscribeToResult_1.subscribeToResult(this, result, undefined, undefined, innerSubscriber);
+        if (innerSubscription !== innerSubscriber) {
+            destination.add(innerSubscription);
+        }
+    };
+    ExhaustMapSubscriber.prototype._complete = function () {
+        this.hasCompleted = true;
+        if (!this.hasSubscription) {
+            this.destination.complete();
+        }
+        this.unsubscribe();
+    };
+    ExhaustMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.destination.next(innerValue);
+    };
+    ExhaustMapSubscriber.prototype.notifyError = function (err) {
+        this.destination.error(err);
+    };
+    ExhaustMapSubscriber.prototype.notifyComplete = function (innerSub) {
+        var destination = this.destination;
+        destination.remove(innerSub);
+        this.hasSubscription = false;
+        if (this.hasCompleted) {
+            this.destination.complete();
+        }
+    };
+    return ExhaustMapSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../observable/from":67,"../util/subscribeToResult":239,"./map":125}],115:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function expand(project, concurrent, scheduler) {
+    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+    if (scheduler === void 0) { scheduler = undefined; }
+    concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;
+    return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); };
+}
+exports.expand = expand;
+var ExpandOperator = (function () {
+    function ExpandOperator(project, concurrent, scheduler) {
+        this.project = project;
+        this.concurrent = concurrent;
+        this.scheduler = scheduler;
+    }
+    ExpandOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));
+    };
+    return ExpandOperator;
+}());
+exports.ExpandOperator = ExpandOperator;
+var ExpandSubscriber = (function (_super) {
+    __extends(ExpandSubscriber, _super);
+    function ExpandSubscriber(destination, project, concurrent, scheduler) {
+        var _this = _super.call(this, destination) || this;
+        _this.project = project;
+        _this.concurrent = concurrent;
+        _this.scheduler = scheduler;
+        _this.index = 0;
+        _this.active = 0;
+        _this.hasCompleted = false;
+        if (concurrent < Number.POSITIVE_INFINITY) {
+            _this.buffer = [];
+        }
+        return _this;
+    }
+    ExpandSubscriber.dispatch = function (arg) {
+        var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index;
+        subscriber.subscribeToProjection(result, value, index);
+    };
+    ExpandSubscriber.prototype._next = function (value) {
+        var destination = this.destination;
+        if (destination.closed) {
+            this._complete();
+            return;
+        }
+        var index = this.index++;
+        if (this.active < this.concurrent) {
+            destination.next(value);
+            try {
+                var project = this.project;
+                var result = project(value, index);
+                if (!this.scheduler) {
+                    this.subscribeToProjection(result, value, index);
+                }
+                else {
+                    var state = { subscriber: this, result: result, value: value, index: index };
+                    var destination_1 = this.destination;
+                    destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));
+                }
+            }
+            catch (e) {
+                destination.error(e);
+            }
+        }
+        else {
+            this.buffer.push(value);
+        }
+    };
+    ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) {
+        this.active++;
+        var destination = this.destination;
+        destination.add(subscribeToResult_1.subscribeToResult(this, result, value, index));
+    };
+    ExpandSubscriber.prototype._complete = function () {
+        this.hasCompleted = true;
+        if (this.hasCompleted && this.active === 0) {
+            this.destination.complete();
+        }
+        this.unsubscribe();
+    };
+    ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this._next(innerValue);
+    };
+    ExpandSubscriber.prototype.notifyComplete = function (innerSub) {
+        var buffer = this.buffer;
+        var destination = this.destination;
+        destination.remove(innerSub);
+        this.active--;
+        if (buffer && buffer.length > 0) {
+            this._next(buffer.shift());
+        }
+        if (this.hasCompleted && this.active === 0) {
+            this.destination.complete();
+        }
+    };
+    return ExpandSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+exports.ExpandSubscriber = ExpandSubscriber;
+
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],116:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function filter(predicate, thisArg) {
+    return function filterOperatorFunction(source) {
+        return source.lift(new FilterOperator(predicate, thisArg));
+    };
+}
+exports.filter = filter;
+var FilterOperator = (function () {
+    function FilterOperator(predicate, thisArg) {
+        this.predicate = predicate;
+        this.thisArg = thisArg;
+    }
+    FilterOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));
+    };
+    return FilterOperator;
+}());
+var FilterSubscriber = (function (_super) {
+    __extends(FilterSubscriber, _super);
+    function FilterSubscriber(destination, predicate, thisArg) {
+        var _this = _super.call(this, destination) || this;
+        _this.predicate = predicate;
+        _this.thisArg = thisArg;
+        _this.count = 0;
+        return _this;
+    }
+    FilterSubscriber.prototype._next = function (value) {
+        var result;
+        try {
+            result = this.predicate.call(this.thisArg, value, this.count++);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        if (result) {
+            this.destination.next(value);
+        }
+    };
+    return FilterSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],117:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var Subscription_1 = require("../Subscription");
+function finalize(callback) {
+    return function (source) { return source.lift(new FinallyOperator(callback)); };
+}
+exports.finalize = finalize;
+var FinallyOperator = (function () {
+    function FinallyOperator(callback) {
+        this.callback = callback;
+    }
+    FinallyOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new FinallySubscriber(subscriber, this.callback));
+    };
+    return FinallyOperator;
+}());
+var FinallySubscriber = (function (_super) {
+    __extends(FinallySubscriber, _super);
+    function FinallySubscriber(destination, callback) {
+        var _this = _super.call(this, destination) || this;
+        _this.add(new Subscription_1.Subscription(callback));
+        return _this;
+    }
+    return FinallySubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55,"../Subscription":56}],118:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function find(predicate, thisArg) {
+    if (typeof predicate !== 'function') {
+        throw new TypeError('predicate is not a function');
+    }
+    return function (source) { return source.lift(new FindValueOperator(predicate, source, false, thisArg)); };
+}
+exports.find = find;
+var FindValueOperator = (function () {
+    function FindValueOperator(predicate, source, yieldIndex, thisArg) {
+        this.predicate = predicate;
+        this.source = source;
+        this.yieldIndex = yieldIndex;
+        this.thisArg = thisArg;
+    }
+    FindValueOperator.prototype.call = function (observer, source) {
+        return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg));
+    };
+    return FindValueOperator;
+}());
+exports.FindValueOperator = FindValueOperator;
+var FindValueSubscriber = (function (_super) {
+    __extends(FindValueSubscriber, _super);
+    function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) {
+        var _this = _super.call(this, destination) || this;
+        _this.predicate = predicate;
+        _this.source = source;
+        _this.yieldIndex = yieldIndex;
+        _this.thisArg = thisArg;
+        _this.index = 0;
+        return _this;
+    }
+    FindValueSubscriber.prototype.notifyComplete = function (value) {
+        var destination = this.destination;
+        destination.next(value);
+        destination.complete();
+        this.unsubscribe();
+    };
+    FindValueSubscriber.prototype._next = function (value) {
+        var _a = this, predicate = _a.predicate, thisArg = _a.thisArg;
+        var index = this.index++;
+        try {
+            var result = predicate.call(thisArg || this, value, index, this.source);
+            if (result) {
+                this.notifyComplete(this.yieldIndex ? index : value);
+            }
+        }
+        catch (err) {
+            this.destination.error(err);
+        }
+    };
+    FindValueSubscriber.prototype._complete = function () {
+        this.notifyComplete(this.yieldIndex ? -1 : undefined);
+    };
+    return FindValueSubscriber;
+}(Subscriber_1.Subscriber));
+exports.FindValueSubscriber = FindValueSubscriber;
+
+},{"../Subscriber":55}],119:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var find_1 = require("../operators/find");
+function findIndex(predicate, thisArg) {
+    return function (source) { return source.lift(new find_1.FindValueOperator(predicate, source, true, thisArg)); };
+}
+exports.findIndex = findIndex;
+
+},{"../operators/find":118}],120:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var EmptyError_1 = require("../util/EmptyError");
+var filter_1 = require("./filter");
+var take_1 = require("./take");
+var defaultIfEmpty_1 = require("./defaultIfEmpty");
+var throwIfEmpty_1 = require("./throwIfEmpty");
+var identity_1 = require("../util/identity");
+function first(predicate, defaultValue) {
+    var hasDefaultValue = arguments.length >= 2;
+    return function (source) { return source.pipe(predicate ? filter_1.filter(function (v, i) { return predicate(v, i, source); }) : identity_1.identity, take_1.take(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new EmptyError_1.EmptyError(); })); };
+}
+exports.first = first;
+
+},{"../util/EmptyError":212,"../util/identity":219,"./defaultIfEmpty":103,"./filter":116,"./take":168,"./throwIfEmpty":175}],121:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var Subscription_1 = require("../Subscription");
+var Observable_1 = require("../Observable");
+var Subject_1 = require("../Subject");
+function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) {
+    return function (source) {
+        return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector));
+    };
+}
+exports.groupBy = groupBy;
+var GroupByOperator = (function () {
+    function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) {
+        this.keySelector = keySelector;
+        this.elementSelector = elementSelector;
+        this.durationSelector = durationSelector;
+        this.subjectSelector = subjectSelector;
+    }
+    GroupByOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector));
+    };
+    return GroupByOperator;
+}());
+var GroupBySubscriber = (function (_super) {
+    __extends(GroupBySubscriber, _super);
+    function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.keySelector = keySelector;
+        _this.elementSelector = elementSelector;
+        _this.durationSelector = durationSelector;
+        _this.subjectSelector = subjectSelector;
+        _this.groups = null;
+        _this.attemptedToUnsubscribe = false;
+        _this.count = 0;
+        return _this;
+    }
+    GroupBySubscriber.prototype._next = function (value) {
+        var key;
+        try {
+            key = this.keySelector(value);
+        }
+        catch (err) {
+            this.error(err);
+            return;
+        }
+        this._group(value, key);
+    };
+    GroupBySubscriber.prototype._group = function (value, key) {
+        var groups = this.groups;
+        if (!groups) {
+            groups = this.groups = new Map();
+        }
+        var group = groups.get(key);
+        var element;
+        if (this.elementSelector) {
+            try {
+                element = this.elementSelector(value);
+            }
+            catch (err) {
+                this.error(err);
+            }
+        }
+        else {
+            element = value;
+        }
+        if (!group) {
+            group = (this.subjectSelector ? this.subjectSelector() : new Subject_1.Subject());
+            groups.set(key, group);
+            var groupedObservable = new GroupedObservable(key, group, this);
+            this.destination.next(groupedObservable);
+            if (this.durationSelector) {
+                var duration = void 0;
+                try {
+                    duration = this.durationSelector(new GroupedObservable(key, group));
+                }
+                catch (err) {
+                    this.error(err);
+                    return;
+                }
+                this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this)));
+            }
+        }
+        if (!group.closed) {
+            group.next(element);
+        }
+    };
+    GroupBySubscriber.prototype._error = function (err) {
+        var groups = this.groups;
+        if (groups) {
+            groups.forEach(function (group, key) {
+                group.error(err);
+            });
+            groups.clear();
+        }
+        this.destination.error(err);
+    };
+    GroupBySubscriber.prototype._complete = function () {
+        var groups = this.groups;
+        if (groups) {
+            groups.forEach(function (group, key) {
+                group.complete();
+            });
+            groups.clear();
+        }
+        this.destination.complete();
+    };
+    GroupBySubscriber.prototype.removeGroup = function (key) {
+        this.groups.delete(key);
+    };
+    GroupBySubscriber.prototype.unsubscribe = function () {
+        if (!this.closed) {
+            this.attemptedToUnsubscribe = true;
+            if (this.count === 0) {
+                _super.prototype.unsubscribe.call(this);
+            }
+        }
+    };
+    return GroupBySubscriber;
+}(Subscriber_1.Subscriber));
+var GroupDurationSubscriber = (function (_super) {
+    __extends(GroupDurationSubscriber, _super);
+    function GroupDurationSubscriber(key, group, parent) {
+        var _this = _super.call(this, group) || this;
+        _this.key = key;
+        _this.group = group;
+        _this.parent = parent;
+        return _this;
+    }
+    GroupDurationSubscriber.prototype._next = function (value) {
+        this.complete();
+    };
+    GroupDurationSubscriber.prototype._unsubscribe = function () {
+        var _a = this, parent = _a.parent, key = _a.key;
+        this.key = this.parent = null;
+        if (parent) {
+            parent.removeGroup(key);
+        }
+    };
+    return GroupDurationSubscriber;
+}(Subscriber_1.Subscriber));
+var GroupedObservable = (function (_super) {
+    __extends(GroupedObservable, _super);
+    function GroupedObservable(key, groupSubject, refCountSubscription) {
+        var _this = _super.call(this) || this;
+        _this.key = key;
+        _this.groupSubject = groupSubject;
+        _this.refCountSubscription = refCountSubscription;
+        return _this;
+    }
+    GroupedObservable.prototype._subscribe = function (subscriber) {
+        var subscription = new Subscription_1.Subscription();
+        var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject;
+        if (refCountSubscription && !refCountSubscription.closed) {
+            subscription.add(new InnerRefCountSubscription(refCountSubscription));
+        }
+        subscription.add(groupSubject.subscribe(subscriber));
+        return subscription;
+    };
+    return GroupedObservable;
+}(Observable_1.Observable));
+exports.GroupedObservable = GroupedObservable;
+var InnerRefCountSubscription = (function (_super) {
+    __extends(InnerRefCountSubscription, _super);
+    function InnerRefCountSubscription(parent) {
+        var _this = _super.call(this) || this;
+        _this.parent = parent;
+        parent.count++;
+        return _this;
+    }
+    InnerRefCountSubscription.prototype.unsubscribe = function () {
+        var parent = this.parent;
+        if (!parent.closed && !this.closed) {
+            _super.prototype.unsubscribe.call(this);
+            parent.count -= 1;
+            if (parent.count === 0 && parent.attemptedToUnsubscribe) {
+                parent.unsubscribe();
+            }
+        }
+    };
+    return InnerRefCountSubscription;
+}(Subscription_1.Subscription));
+
+},{"../Observable":48,"../Subject":53,"../Subscriber":55,"../Subscription":56}],122:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function ignoreElements() {
+    return function ignoreElementsOperatorFunction(source) {
+        return source.lift(new IgnoreElementsOperator());
+    };
+}
+exports.ignoreElements = ignoreElements;
+var IgnoreElementsOperator = (function () {
+    function IgnoreElementsOperator() {
+    }
+    IgnoreElementsOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new IgnoreElementsSubscriber(subscriber));
+    };
+    return IgnoreElementsOperator;
+}());
+var IgnoreElementsSubscriber = (function (_super) {
+    __extends(IgnoreElementsSubscriber, _super);
+    function IgnoreElementsSubscriber() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    IgnoreElementsSubscriber.prototype._next = function (unused) {
+    };
+    return IgnoreElementsSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],123:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function isEmpty() {
+    return function (source) { return source.lift(new IsEmptyOperator()); };
+}
+exports.isEmpty = isEmpty;
+var IsEmptyOperator = (function () {
+    function IsEmptyOperator() {
+    }
+    IsEmptyOperator.prototype.call = function (observer, source) {
+        return source.subscribe(new IsEmptySubscriber(observer));
+    };
+    return IsEmptyOperator;
+}());
+var IsEmptySubscriber = (function (_super) {
+    __extends(IsEmptySubscriber, _super);
+    function IsEmptySubscriber(destination) {
+        return _super.call(this, destination) || this;
+    }
+    IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) {
+        var destination = this.destination;
+        destination.next(isEmpty);
+        destination.complete();
+    };
+    IsEmptySubscriber.prototype._next = function (value) {
+        this.notifyComplete(false);
+    };
+    IsEmptySubscriber.prototype._complete = function () {
+        this.notifyComplete(true);
+    };
+    return IsEmptySubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],124:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var EmptyError_1 = require("../util/EmptyError");
+var filter_1 = require("./filter");
+var takeLast_1 = require("./takeLast");
+var throwIfEmpty_1 = require("./throwIfEmpty");
+var defaultIfEmpty_1 = require("./defaultIfEmpty");
+var identity_1 = require("../util/identity");
+function last(predicate, defaultValue) {
+    var hasDefaultValue = arguments.length >= 2;
+    return function (source) { return source.pipe(predicate ? filter_1.filter(function (v, i) { return predicate(v, i, source); }) : identity_1.identity, takeLast_1.takeLast(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new EmptyError_1.EmptyError(); })); };
+}
+exports.last = last;
+
+},{"../util/EmptyError":212,"../util/identity":219,"./defaultIfEmpty":103,"./filter":116,"./takeLast":169,"./throwIfEmpty":175}],125:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function map(project, thisArg) {
+    return function mapOperation(source) {
+        if (typeof project !== 'function') {
+            throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
+        }
+        return source.lift(new MapOperator(project, thisArg));
+    };
+}
+exports.map = map;
+var MapOperator = (function () {
+    function MapOperator(project, thisArg) {
+        this.project = project;
+        this.thisArg = thisArg;
+    }
+    MapOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));
+    };
+    return MapOperator;
+}());
+exports.MapOperator = MapOperator;
+var MapSubscriber = (function (_super) {
+    __extends(MapSubscriber, _super);
+    function MapSubscriber(destination, project, thisArg) {
+        var _this = _super.call(this, destination) || this;
+        _this.project = project;
+        _this.count = 0;
+        _this.thisArg = thisArg || _this;
+        return _this;
+    }
+    MapSubscriber.prototype._next = function (value) {
+        var result;
+        try {
+            result = this.project.call(this.thisArg, value, this.count++);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        this.destination.next(result);
+    };
+    return MapSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],126:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function mapTo(value) {
+    return function (source) { return source.lift(new MapToOperator(value)); };
+}
+exports.mapTo = mapTo;
+var MapToOperator = (function () {
+    function MapToOperator(value) {
+        this.value = value;
+    }
+    MapToOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new MapToSubscriber(subscriber, this.value));
+    };
+    return MapToOperator;
+}());
+var MapToSubscriber = (function (_super) {
+    __extends(MapToSubscriber, _super);
+    function MapToSubscriber(destination, value) {
+        var _this = _super.call(this, destination) || this;
+        _this.value = value;
+        return _this;
+    }
+    MapToSubscriber.prototype._next = function (x) {
+        this.destination.next(this.value);
+    };
+    return MapToSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],127:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var Notification_1 = require("../Notification");
+function materialize() {
+    return function materializeOperatorFunction(source) {
+        return source.lift(new MaterializeOperator());
+    };
+}
+exports.materialize = materialize;
+var MaterializeOperator = (function () {
+    function MaterializeOperator() {
+    }
+    MaterializeOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new MaterializeSubscriber(subscriber));
+    };
+    return MaterializeOperator;
+}());
+var MaterializeSubscriber = (function (_super) {
+    __extends(MaterializeSubscriber, _super);
+    function MaterializeSubscriber(destination) {
+        return _super.call(this, destination) || this;
+    }
+    MaterializeSubscriber.prototype._next = function (value) {
+        this.destination.next(Notification_1.Notification.createNext(value));
+    };
+    MaterializeSubscriber.prototype._error = function (err) {
+        var destination = this.destination;
+        destination.next(Notification_1.Notification.createError(err));
+        destination.complete();
+    };
+    MaterializeSubscriber.prototype._complete = function () {
+        var destination = this.destination;
+        destination.next(Notification_1.Notification.createComplete());
+        destination.complete();
+    };
+    return MaterializeSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Notification":47,"../Subscriber":55}],128:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var reduce_1 = require("./reduce");
+function max(comparer) {
+    var max = (typeof comparer === 'function')
+        ? function (x, y) { return comparer(x, y) > 0 ? x : y; }
+        : function (x, y) { return x > y ? x : y; };
+    return reduce_1.reduce(max);
+}
+exports.max = max;
+
+},{"./reduce":146}],129:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var merge_1 = require("../observable/merge");
+function merge() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
+    }
+    return function (source) { return source.lift.call(merge_1.merge.apply(void 0, [source].concat(observables))); };
+}
+exports.merge = merge;
+
+},{"../observable/merge":74}],130:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var mergeMap_1 = require("./mergeMap");
+var identity_1 = require("../util/identity");
+function mergeAll(concurrent) {
+    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+    return mergeMap_1.mergeMap(identity_1.identity, concurrent);
+}
+exports.mergeAll = mergeAll;
+
+},{"../util/identity":219,"./mergeMap":131}],131:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var subscribeToResult_1 = require("../util/subscribeToResult");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var InnerSubscriber_1 = require("../InnerSubscriber");
+var map_1 = require("./map");
+var from_1 = require("../observable/from");
+function mergeMap(project, resultSelector, concurrent) {
+    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+    if (typeof resultSelector === 'function') {
+        return function (source) { return source.pipe(mergeMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); }, concurrent)); };
+    }
+    else if (typeof resultSelector === 'number') {
+        concurrent = resultSelector;
+    }
+    return function (source) { return source.lift(new MergeMapOperator(project, concurrent)); };
+}
+exports.mergeMap = mergeMap;
+var MergeMapOperator = (function () {
+    function MergeMapOperator(project, concurrent) {
+        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+        this.project = project;
+        this.concurrent = concurrent;
+    }
+    MergeMapOperator.prototype.call = function (observer, source) {
+        return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent));
+    };
+    return MergeMapOperator;
+}());
+exports.MergeMapOperator = MergeMapOperator;
+var MergeMapSubscriber = (function (_super) {
+    __extends(MergeMapSubscriber, _super);
+    function MergeMapSubscriber(destination, project, concurrent) {
+        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+        var _this = _super.call(this, destination) || this;
+        _this.project = project;
+        _this.concurrent = concurrent;
+        _this.hasCompleted = false;
+        _this.buffer = [];
+        _this.active = 0;
+        _this.index = 0;
+        return _this;
+    }
+    MergeMapSubscriber.prototype._next = function (value) {
+        if (this.active < this.concurrent) {
+            this._tryNext(value);
+        }
+        else {
+            this.buffer.push(value);
+        }
+    };
+    MergeMapSubscriber.prototype._tryNext = function (value) {
+        var result;
+        var index = this.index++;
+        try {
+            result = this.project(value, index);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        this.active++;
+        this._innerSub(result, value, index);
+    };
+    MergeMapSubscriber.prototype._innerSub = function (ish, value, index) {
+        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, value, index);
+        var destination = this.destination;
+        destination.add(innerSubscriber);
+        var innerSubscription = subscribeToResult_1.subscribeToResult(this, ish, undefined, undefined, innerSubscriber);
+        if (innerSubscription !== innerSubscriber) {
+            destination.add(innerSubscription);
+        }
+    };
+    MergeMapSubscriber.prototype._complete = function () {
+        this.hasCompleted = true;
+        if (this.active === 0 && this.buffer.length === 0) {
+            this.destination.complete();
+        }
+        this.unsubscribe();
+    };
+    MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.destination.next(innerValue);
+    };
+    MergeMapSubscriber.prototype.notifyComplete = function (innerSub) {
+        var buffer = this.buffer;
+        this.remove(innerSub);
+        this.active--;
+        if (buffer.length > 0) {
+            this._next(buffer.shift());
+        }
+        else if (this.active === 0 && this.hasCompleted) {
+            this.destination.complete();
+        }
+    };
+    return MergeMapSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+exports.MergeMapSubscriber = MergeMapSubscriber;
+
+},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../observable/from":67,"../util/subscribeToResult":239,"./map":125}],132:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var mergeMap_1 = require("./mergeMap");
+function mergeMapTo(innerObservable, resultSelector, concurrent) {
+    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+    if (typeof resultSelector === 'function') {
+        return mergeMap_1.mergeMap(function () { return innerObservable; }, resultSelector, concurrent);
+    }
+    if (typeof resultSelector === 'number') {
+        concurrent = resultSelector;
+    }
+    return mergeMap_1.mergeMap(function () { return innerObservable; }, concurrent);
+}
+exports.mergeMapTo = mergeMapTo;
+
+},{"./mergeMap":131}],133:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var subscribeToResult_1 = require("../util/subscribeToResult");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var InnerSubscriber_1 = require("../InnerSubscriber");
+function mergeScan(accumulator, seed, concurrent) {
+    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
+    return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); };
+}
+exports.mergeScan = mergeScan;
+var MergeScanOperator = (function () {
+    function MergeScanOperator(accumulator, seed, concurrent) {
+        this.accumulator = accumulator;
+        this.seed = seed;
+        this.concurrent = concurrent;
+    }
+    MergeScanOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent));
+    };
+    return MergeScanOperator;
+}());
+exports.MergeScanOperator = MergeScanOperator;
+var MergeScanSubscriber = (function (_super) {
+    __extends(MergeScanSubscriber, _super);
+    function MergeScanSubscriber(destination, accumulator, acc, concurrent) {
+        var _this = _super.call(this, destination) || this;
+        _this.accumulator = accumulator;
+        _this.acc = acc;
+        _this.concurrent = concurrent;
+        _this.hasValue = false;
+        _this.hasCompleted = false;
+        _this.buffer = [];
+        _this.active = 0;
+        _this.index = 0;
+        return _this;
+    }
+    MergeScanSubscriber.prototype._next = function (value) {
+        if (this.active < this.concurrent) {
+            var index = this.index++;
+            var destination = this.destination;
+            var ish = void 0;
+            try {
+                var accumulator = this.accumulator;
+                ish = accumulator(this.acc, value, index);
+            }
+            catch (e) {
+                return destination.error(e);
+            }
+            this.active++;
+            this._innerSub(ish, value, index);
+        }
+        else {
+            this.buffer.push(value);
+        }
+    };
+    MergeScanSubscriber.prototype._innerSub = function (ish, value, index) {
+        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, value, index);
+        var destination = this.destination;
+        destination.add(innerSubscriber);
+        var innerSubscription = subscribeToResult_1.subscribeToResult(this, ish, undefined, undefined, innerSubscriber);
+        if (innerSubscription !== innerSubscriber) {
+            destination.add(innerSubscription);
+        }
+    };
+    MergeScanSubscriber.prototype._complete = function () {
+        this.hasCompleted = true;
+        if (this.active === 0 && this.buffer.length === 0) {
+            if (this.hasValue === false) {
+                this.destination.next(this.acc);
+            }
+            this.destination.complete();
+        }
+        this.unsubscribe();
+    };
+    MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        var destination = this.destination;
+        this.acc = innerValue;
+        this.hasValue = true;
+        destination.next(innerValue);
+    };
+    MergeScanSubscriber.prototype.notifyComplete = function (innerSub) {
+        var buffer = this.buffer;
+        var destination = this.destination;
+        destination.remove(innerSub);
+        this.active--;
+        if (buffer.length > 0) {
+            this._next(buffer.shift());
+        }
+        else if (this.active === 0 && this.hasCompleted) {
+            if (this.hasValue === false) {
+                this.destination.next(this.acc);
+            }
+            this.destination.complete();
+        }
+    };
+    return MergeScanSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+exports.MergeScanSubscriber = MergeScanSubscriber;
+
+},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../util/subscribeToResult":239}],134:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var reduce_1 = require("./reduce");
+function min(comparer) {
+    var min = (typeof comparer === 'function')
+        ? function (x, y) { return comparer(x, y) < 0 ? x : y; }
+        : function (x, y) { return x < y ? x : y; };
+    return reduce_1.reduce(min);
+}
+exports.min = min;
+
+},{"./reduce":146}],135:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var ConnectableObservable_1 = require("../observable/ConnectableObservable");
+function multicast(subjectOrSubjectFactory, selector) {
+    return function multicastOperatorFunction(source) {
+        var subjectFactory;
+        if (typeof subjectOrSubjectFactory === 'function') {
+            subjectFactory = subjectOrSubjectFactory;
+        }
+        else {
+            subjectFactory = function subjectFactory() {
+                return subjectOrSubjectFactory;
+            };
+        }
+        if (typeof selector === 'function') {
+            return source.lift(new MulticastOperator(subjectFactory, selector));
+        }
+        var connectable = Object.create(source, ConnectableObservable_1.connectableObservableDescriptor);
+        connectable.source = source;
+        connectable.subjectFactory = subjectFactory;
+        return connectable;
+    };
+}
+exports.multicast = multicast;
+var MulticastOperator = (function () {
+    function MulticastOperator(subjectFactory, selector) {
+        this.subjectFactory = subjectFactory;
+        this.selector = selector;
+    }
+    MulticastOperator.prototype.call = function (subscriber, source) {
+        var selector = this.selector;
+        var subject = this.subjectFactory();
+        var subscription = selector(subject).subscribe(subscriber);
+        subscription.add(source.subscribe(subject));
+        return subscription;
+    };
+    return MulticastOperator;
+}());
+exports.MulticastOperator = MulticastOperator;
+
+},{"../observable/ConnectableObservable":58}],136:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var Notification_1 = require("../Notification");
+function observeOn(scheduler, delay) {
+    if (delay === void 0) { delay = 0; }
+    return function observeOnOperatorFunction(source) {
+        return source.lift(new ObserveOnOperator(scheduler, delay));
+    };
+}
+exports.observeOn = observeOn;
+var ObserveOnOperator = (function () {
+    function ObserveOnOperator(scheduler, delay) {
+        if (delay === void 0) { delay = 0; }
+        this.scheduler = scheduler;
+        this.delay = delay;
+    }
+    ObserveOnOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));
+    };
+    return ObserveOnOperator;
+}());
+exports.ObserveOnOperator = ObserveOnOperator;
+var ObserveOnSubscriber = (function (_super) {
+    __extends(ObserveOnSubscriber, _super);
+    function ObserveOnSubscriber(destination, scheduler, delay) {
+        if (delay === void 0) { delay = 0; }
+        var _this = _super.call(this, destination) || this;
+        _this.scheduler = scheduler;
+        _this.delay = delay;
+        return _this;
+    }
+    ObserveOnSubscriber.dispatch = function (arg) {
+        var notification = arg.notification, destination = arg.destination;
+        notification.observe(destination);
+        this.unsubscribe();
+    };
+    ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {
+        var destination = this.destination;
+        destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));
+    };
+    ObserveOnSubscriber.prototype._next = function (value) {
+        this.scheduleMessage(Notification_1.Notification.createNext(value));
+    };
+    ObserveOnSubscriber.prototype._error = function (err) {
+        this.scheduleMessage(Notification_1.Notification.createError(err));
+        this.unsubscribe();
+    };
+    ObserveOnSubscriber.prototype._complete = function () {
+        this.scheduleMessage(Notification_1.Notification.createComplete());
+        this.unsubscribe();
+    };
+    return ObserveOnSubscriber;
+}(Subscriber_1.Subscriber));
+exports.ObserveOnSubscriber = ObserveOnSubscriber;
+var ObserveOnMessage = (function () {
+    function ObserveOnMessage(notification, destination) {
+        this.notification = notification;
+        this.destination = destination;
+    }
+    return ObserveOnMessage;
+}());
+exports.ObserveOnMessage = ObserveOnMessage;
+
+},{"../Notification":47,"../Subscriber":55}],137:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var from_1 = require("../observable/from");
+var isArray_1 = require("../util/isArray");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var InnerSubscriber_1 = require("../InnerSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function onErrorResumeNext() {
+    var nextSources = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        nextSources[_i] = arguments[_i];
+    }
+    if (nextSources.length === 1 && isArray_1.isArray(nextSources[0])) {
+        nextSources = nextSources[0];
+    }
+    return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); };
+}
+exports.onErrorResumeNext = onErrorResumeNext;
+function onErrorResumeNextStatic() {
+    var nextSources = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        nextSources[_i] = arguments[_i];
+    }
+    var source = null;
+    if (nextSources.length === 1 && isArray_1.isArray(nextSources[0])) {
+        nextSources = nextSources[0];
+    }
+    source = nextSources.shift();
+    return from_1.from(source, null).lift(new OnErrorResumeNextOperator(nextSources));
+}
+exports.onErrorResumeNextStatic = onErrorResumeNextStatic;
+var OnErrorResumeNextOperator = (function () {
+    function OnErrorResumeNextOperator(nextSources) {
+        this.nextSources = nextSources;
+    }
+    OnErrorResumeNextOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources));
+    };
+    return OnErrorResumeNextOperator;
+}());
+var OnErrorResumeNextSubscriber = (function (_super) {
+    __extends(OnErrorResumeNextSubscriber, _super);
+    function OnErrorResumeNextSubscriber(destination, nextSources) {
+        var _this = _super.call(this, destination) || this;
+        _this.destination = destination;
+        _this.nextSources = nextSources;
+        return _this;
+    }
+    OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) {
+        this.subscribeToNextSource();
+    };
+    OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) {
+        this.subscribeToNextSource();
+    };
+    OnErrorResumeNextSubscriber.prototype._error = function (err) {
+        this.subscribeToNextSource();
+        this.unsubscribe();
+    };
+    OnErrorResumeNextSubscriber.prototype._complete = function () {
+        this.subscribeToNextSource();
+        this.unsubscribe();
+    };
+    OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () {
+        var next = this.nextSources.shift();
+        if (!!next) {
+            var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined);
+            var destination = this.destination;
+            destination.add(innerSubscriber);
+            var innerSubscription = subscribeToResult_1.subscribeToResult(this, next, undefined, undefined, innerSubscriber);
+            if (innerSubscription !== innerSubscriber) {
+                destination.add(innerSubscription);
+            }
+        }
+        else {
+            this.destination.complete();
+        }
+    };
+    return OnErrorResumeNextSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../observable/from":67,"../util/isArray":220,"../util/subscribeToResult":239}],138:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function pairwise() {
+    return function (source) { return source.lift(new PairwiseOperator()); };
+}
+exports.pairwise = pairwise;
+var PairwiseOperator = (function () {
+    function PairwiseOperator() {
+    }
+    PairwiseOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new PairwiseSubscriber(subscriber));
+    };
+    return PairwiseOperator;
+}());
+var PairwiseSubscriber = (function (_super) {
+    __extends(PairwiseSubscriber, _super);
+    function PairwiseSubscriber(destination) {
+        var _this = _super.call(this, destination) || this;
+        _this.hasPrev = false;
+        return _this;
+    }
+    PairwiseSubscriber.prototype._next = function (value) {
+        var pair;
+        if (this.hasPrev) {
+            pair = [this.prev, value];
+        }
+        else {
+            this.hasPrev = true;
+        }
+        this.prev = value;
+        if (pair) {
+            this.destination.next(pair);
+        }
+    };
+    return PairwiseSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],139:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var not_1 = require("../util/not");
+var filter_1 = require("./filter");
+function partition(predicate, thisArg) {
+    return function (source) { return [
+        filter_1.filter(predicate, thisArg)(source),
+        filter_1.filter(not_1.not(predicate, thisArg))(source)
+    ]; };
+}
+exports.partition = partition;
+
+},{"../util/not":232,"./filter":116}],140:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var map_1 = require("./map");
+function pluck() {
+    var properties = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        properties[_i] = arguments[_i];
+    }
+    var length = properties.length;
+    if (length === 0) {
+        throw new Error('list of properties cannot be empty.');
+    }
+    return function (source) { return map_1.map(plucker(properties, length))(source); };
+}
+exports.pluck = pluck;
+function plucker(props, length) {
+    var mapper = function (x) {
+        var currentProp = x;
+        for (var i = 0; i < length; i++) {
+            var p = currentProp[props[i]];
+            if (typeof p !== 'undefined') {
+                currentProp = p;
+            }
+            else {
+                return undefined;
+            }
+        }
+        return currentProp;
+    };
+    return mapper;
+}
+
+},{"./map":125}],141:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("../Subject");
+var multicast_1 = require("./multicast");
+function publish(selector) {
+    return selector ?
+        multicast_1.multicast(function () { return new Subject_1.Subject(); }, selector) :
+        multicast_1.multicast(new Subject_1.Subject());
+}
+exports.publish = publish;
+
+},{"../Subject":53,"./multicast":135}],142:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var BehaviorSubject_1 = require("../BehaviorSubject");
+var multicast_1 = require("./multicast");
+function publishBehavior(value) {
+    return function (source) { return multicast_1.multicast(new BehaviorSubject_1.BehaviorSubject(value))(source); };
+}
+exports.publishBehavior = publishBehavior;
+
+},{"../BehaviorSubject":45,"./multicast":135}],143:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsyncSubject_1 = require("../AsyncSubject");
+var multicast_1 = require("./multicast");
+function publishLast() {
+    return function (source) { return multicast_1.multicast(new AsyncSubject_1.AsyncSubject())(source); };
+}
+exports.publishLast = publishLast;
+
+},{"../AsyncSubject":44,"./multicast":135}],144:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var ReplaySubject_1 = require("../ReplaySubject");
+var multicast_1 = require("./multicast");
+function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) {
+    if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') {
+        scheduler = selectorOrScheduler;
+    }
+    var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined;
+    var subject = new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler);
+    return function (source) { return multicast_1.multicast(function () { return subject; }, selector)(source); };
+}
+exports.publishReplay = publishReplay;
+
+},{"../ReplaySubject":51,"./multicast":135}],145:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var isArray_1 = require("../util/isArray");
+var race_1 = require("../observable/race");
+function race() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
+    }
+    return function raceOperatorFunction(source) {
+        if (observables.length === 1 && isArray_1.isArray(observables[0])) {
+            observables = observables[0];
+        }
+        return source.lift.call(race_1.race.apply(void 0, [source].concat(observables)));
+    };
+}
+exports.race = race;
+
+},{"../observable/race":80,"../util/isArray":220}],146:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var scan_1 = require("./scan");
+var takeLast_1 = require("./takeLast");
+var defaultIfEmpty_1 = require("./defaultIfEmpty");
+var pipe_1 = require("../util/pipe");
+function reduce(accumulator, seed) {
+    if (arguments.length >= 2) {
+        return function reduceOperatorFunctionWithSeed(source) {
+            return pipe_1.pipe(scan_1.scan(accumulator, seed), takeLast_1.takeLast(1), defaultIfEmpty_1.defaultIfEmpty(seed))(source);
+        };
+    }
+    return function reduceOperatorFunction(source) {
+        return pipe_1.pipe(scan_1.scan(function (acc, value, index) { return accumulator(acc, value, index + 1); }), takeLast_1.takeLast(1))(source);
+    };
+}
+exports.reduce = reduce;
+
+},{"../util/pipe":233,"./defaultIfEmpty":103,"./scan":154,"./takeLast":169}],147:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function refCount() {
+    return function refCountOperatorFunction(source) {
+        return source.lift(new RefCountOperator(source));
+    };
+}
+exports.refCount = refCount;
+var RefCountOperator = (function () {
+    function RefCountOperator(connectable) {
+        this.connectable = connectable;
+    }
+    RefCountOperator.prototype.call = function (subscriber, source) {
+        var connectable = this.connectable;
+        connectable._refCount++;
+        var refCounter = new RefCountSubscriber(subscriber, connectable);
+        var subscription = source.subscribe(refCounter);
+        if (!refCounter.closed) {
+            refCounter.connection = connectable.connect();
+        }
+        return subscription;
+    };
+    return RefCountOperator;
+}());
+var RefCountSubscriber = (function (_super) {
+    __extends(RefCountSubscriber, _super);
+    function RefCountSubscriber(destination, connectable) {
+        var _this = _super.call(this, destination) || this;
+        _this.connectable = connectable;
+        return _this;
+    }
+    RefCountSubscriber.prototype._unsubscribe = function () {
+        var connectable = this.connectable;
+        if (!connectable) {
+            this.connection = null;
+            return;
+        }
+        this.connectable = null;
+        var refCount = connectable._refCount;
+        if (refCount <= 0) {
+            this.connection = null;
+            return;
+        }
+        connectable._refCount = refCount - 1;
+        if (refCount > 1) {
+            this.connection = null;
+            return;
+        }
+        var connection = this.connection;
+        var sharedConnection = connectable._connection;
+        this.connection = null;
+        if (sharedConnection && (!connection || sharedConnection === connection)) {
+            sharedConnection.unsubscribe();
+        }
+    };
+    return RefCountSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],148:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var empty_1 = require("../observable/empty");
+function repeat(count) {
+    if (count === void 0) { count = -1; }
+    return function (source) {
+        if (count === 0) {
+            return empty_1.empty();
+        }
+        else if (count < 0) {
+            return source.lift(new RepeatOperator(-1, source));
+        }
+        else {
+            return source.lift(new RepeatOperator(count - 1, source));
+        }
+    };
+}
+exports.repeat = repeat;
+var RepeatOperator = (function () {
+    function RepeatOperator(count, source) {
+        this.count = count;
+        this.source = source;
+    }
+    RepeatOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source));
+    };
+    return RepeatOperator;
+}());
+var RepeatSubscriber = (function (_super) {
+    __extends(RepeatSubscriber, _super);
+    function RepeatSubscriber(destination, count, source) {
+        var _this = _super.call(this, destination) || this;
+        _this.count = count;
+        _this.source = source;
+        return _this;
+    }
+    RepeatSubscriber.prototype.complete = function () {
+        if (!this.isStopped) {
+            var _a = this, source = _a.source, count = _a.count;
+            if (count === 0) {
+                return _super.prototype.complete.call(this);
+            }
+            else if (count > -1) {
+                this.count = count - 1;
+            }
+            source.subscribe(this._unsubscribeAndRecycle());
+        }
+    };
+    return RepeatSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55,"../observable/empty":65}],149:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("../Subject");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function repeatWhen(notifier) {
+    return function (source) { return source.lift(new RepeatWhenOperator(notifier)); };
+}
+exports.repeatWhen = repeatWhen;
+var RepeatWhenOperator = (function () {
+    function RepeatWhenOperator(notifier) {
+        this.notifier = notifier;
+    }
+    RepeatWhenOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source));
+    };
+    return RepeatWhenOperator;
+}());
+var RepeatWhenSubscriber = (function (_super) {
+    __extends(RepeatWhenSubscriber, _super);
+    function RepeatWhenSubscriber(destination, notifier, source) {
+        var _this = _super.call(this, destination) || this;
+        _this.notifier = notifier;
+        _this.source = source;
+        _this.sourceIsBeingSubscribedTo = true;
+        return _this;
+    }
+    RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.sourceIsBeingSubscribedTo = true;
+        this.source.subscribe(this);
+    };
+    RepeatWhenSubscriber.prototype.notifyComplete = function (innerSub) {
+        if (this.sourceIsBeingSubscribedTo === false) {
+            return _super.prototype.complete.call(this);
+        }
+    };
+    RepeatWhenSubscriber.prototype.complete = function () {
+        this.sourceIsBeingSubscribedTo = false;
+        if (!this.isStopped) {
+            if (!this.retries) {
+                this.subscribeToRetries();
+            }
+            if (!this.retriesSubscription || this.retriesSubscription.closed) {
+                return _super.prototype.complete.call(this);
+            }
+            this._unsubscribeAndRecycle();
+            this.notifications.next();
+        }
+    };
+    RepeatWhenSubscriber.prototype._unsubscribe = function () {
+        var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription;
+        if (notifications) {
+            notifications.unsubscribe();
+            this.notifications = null;
+        }
+        if (retriesSubscription) {
+            retriesSubscription.unsubscribe();
+            this.retriesSubscription = null;
+        }
+        this.retries = null;
+    };
+    RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () {
+        var _unsubscribe = this._unsubscribe;
+        this._unsubscribe = null;
+        _super.prototype._unsubscribeAndRecycle.call(this);
+        this._unsubscribe = _unsubscribe;
+        return this;
+    };
+    RepeatWhenSubscriber.prototype.subscribeToRetries = function () {
+        this.notifications = new Subject_1.Subject();
+        var retries;
+        try {
+            var notifier = this.notifier;
+            retries = notifier(this.notifications);
+        }
+        catch (e) {
+            return _super.prototype.complete.call(this);
+        }
+        this.retries = retries;
+        this.retriesSubscription = subscribeToResult_1.subscribeToResult(this, retries);
+    };
+    return RepeatWhenSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":50,"../Subject":53,"../util/subscribeToResult":239}],150:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function retry(count) {
+    if (count === void 0) { count = -1; }
+    return function (source) { return source.lift(new RetryOperator(count, source)); };
+}
+exports.retry = retry;
+var RetryOperator = (function () {
+    function RetryOperator(count, source) {
+        this.count = count;
+        this.source = source;
+    }
+    RetryOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source));
+    };
+    return RetryOperator;
+}());
+var RetrySubscriber = (function (_super) {
+    __extends(RetrySubscriber, _super);
+    function RetrySubscriber(destination, count, source) {
+        var _this = _super.call(this, destination) || this;
+        _this.count = count;
+        _this.source = source;
+        return _this;
+    }
+    RetrySubscriber.prototype.error = function (err) {
+        if (!this.isStopped) {
+            var _a = this, source = _a.source, count = _a.count;
+            if (count === 0) {
+                return _super.prototype.error.call(this, err);
+            }
+            else if (count > -1) {
+                this.count = count - 1;
+            }
+            source.subscribe(this._unsubscribeAndRecycle());
+        }
+    };
+    return RetrySubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],151:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("../Subject");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function retryWhen(notifier) {
+    return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); };
+}
+exports.retryWhen = retryWhen;
+var RetryWhenOperator = (function () {
+    function RetryWhenOperator(notifier, source) {
+        this.notifier = notifier;
+        this.source = source;
+    }
+    RetryWhenOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source));
+    };
+    return RetryWhenOperator;
+}());
+var RetryWhenSubscriber = (function (_super) {
+    __extends(RetryWhenSubscriber, _super);
+    function RetryWhenSubscriber(destination, notifier, source) {
+        var _this = _super.call(this, destination) || this;
+        _this.notifier = notifier;
+        _this.source = source;
+        return _this;
+    }
+    RetryWhenSubscriber.prototype.error = function (err) {
+        if (!this.isStopped) {
+            var errors = this.errors;
+            var retries = this.retries;
+            var retriesSubscription = this.retriesSubscription;
+            if (!retries) {
+                errors = new Subject_1.Subject();
+                try {
+                    var notifier = this.notifier;
+                    retries = notifier(errors);
+                }
+                catch (e) {
+                    return _super.prototype.error.call(this, e);
+                }
+                retriesSubscription = subscribeToResult_1.subscribeToResult(this, retries);
+            }
+            else {
+                this.errors = null;
+                this.retriesSubscription = null;
+            }
+            this._unsubscribeAndRecycle();
+            this.errors = errors;
+            this.retries = retries;
+            this.retriesSubscription = retriesSubscription;
+            errors.next(err);
+        }
+    };
+    RetryWhenSubscriber.prototype._unsubscribe = function () {
+        var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription;
+        if (errors) {
+            errors.unsubscribe();
+            this.errors = null;
+        }
+        if (retriesSubscription) {
+            retriesSubscription.unsubscribe();
+            this.retriesSubscription = null;
+        }
+        this.retries = null;
+    };
+    RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        var _unsubscribe = this._unsubscribe;
+        this._unsubscribe = null;
+        this._unsubscribeAndRecycle();
+        this._unsubscribe = _unsubscribe;
+        this.source.subscribe(this);
+    };
+    return RetryWhenSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":50,"../Subject":53,"../util/subscribeToResult":239}],152:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function sample(notifier) {
+    return function (source) { return source.lift(new SampleOperator(notifier)); };
+}
+exports.sample = sample;
+var SampleOperator = (function () {
+    function SampleOperator(notifier) {
+        this.notifier = notifier;
+    }
+    SampleOperator.prototype.call = function (subscriber, source) {
+        var sampleSubscriber = new SampleSubscriber(subscriber);
+        var subscription = source.subscribe(sampleSubscriber);
+        subscription.add(subscribeToResult_1.subscribeToResult(sampleSubscriber, this.notifier));
+        return subscription;
+    };
+    return SampleOperator;
+}());
+var SampleSubscriber = (function (_super) {
+    __extends(SampleSubscriber, _super);
+    function SampleSubscriber() {
+        var _this = _super !== null && _super.apply(this, arguments) || this;
+        _this.hasValue = false;
+        return _this;
+    }
+    SampleSubscriber.prototype._next = function (value) {
+        this.value = value;
+        this.hasValue = true;
+    };
+    SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.emitValue();
+    };
+    SampleSubscriber.prototype.notifyComplete = function () {
+        this.emitValue();
+    };
+    SampleSubscriber.prototype.emitValue = function () {
+        if (this.hasValue) {
+            this.hasValue = false;
+            this.destination.next(this.value);
+        }
+    };
+    return SampleSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],153:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var async_1 = require("../scheduler/async");
+function sampleTime(period, scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); };
+}
+exports.sampleTime = sampleTime;
+var SampleTimeOperator = (function () {
+    function SampleTimeOperator(period, scheduler) {
+        this.period = period;
+        this.scheduler = scheduler;
+    }
+    SampleTimeOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler));
+    };
+    return SampleTimeOperator;
+}());
+var SampleTimeSubscriber = (function (_super) {
+    __extends(SampleTimeSubscriber, _super);
+    function SampleTimeSubscriber(destination, period, scheduler) {
+        var _this = _super.call(this, destination) || this;
+        _this.period = period;
+        _this.scheduler = scheduler;
+        _this.hasValue = false;
+        _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period }));
+        return _this;
+    }
+    SampleTimeSubscriber.prototype._next = function (value) {
+        this.lastValue = value;
+        this.hasValue = true;
+    };
+    SampleTimeSubscriber.prototype.notifyNext = function () {
+        if (this.hasValue) {
+            this.hasValue = false;
+            this.destination.next(this.lastValue);
+        }
+    };
+    return SampleTimeSubscriber;
+}(Subscriber_1.Subscriber));
+function dispatchNotification(state) {
+    var subscriber = state.subscriber, period = state.period;
+    subscriber.notifyNext();
+    this.schedule(state, period);
+}
+
+},{"../Subscriber":55,"../scheduler/async":206}],154:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function scan(accumulator, seed) {
+    var hasSeed = false;
+    if (arguments.length >= 2) {
+        hasSeed = true;
+    }
+    return function scanOperatorFunction(source) {
+        return source.lift(new ScanOperator(accumulator, seed, hasSeed));
+    };
+}
+exports.scan = scan;
+var ScanOperator = (function () {
+    function ScanOperator(accumulator, seed, hasSeed) {
+        if (hasSeed === void 0) { hasSeed = false; }
+        this.accumulator = accumulator;
+        this.seed = seed;
+        this.hasSeed = hasSeed;
+    }
+    ScanOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));
+    };
+    return ScanOperator;
+}());
+var ScanSubscriber = (function (_super) {
+    __extends(ScanSubscriber, _super);
+    function ScanSubscriber(destination, accumulator, _seed, hasSeed) {
+        var _this = _super.call(this, destination) || this;
+        _this.accumulator = accumulator;
+        _this._seed = _seed;
+        _this.hasSeed = hasSeed;
+        _this.index = 0;
+        return _this;
+    }
+    Object.defineProperty(ScanSubscriber.prototype, "seed", {
+        get: function () {
+            return this._seed;
+        },
+        set: function (value) {
+            this.hasSeed = true;
+            this._seed = value;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    ScanSubscriber.prototype._next = function (value) {
+        if (!this.hasSeed) {
+            this.seed = value;
+            this.destination.next(value);
+        }
+        else {
+            return this._tryNext(value);
+        }
+    };
+    ScanSubscriber.prototype._tryNext = function (value) {
+        var index = this.index++;
+        var result;
+        try {
+            result = this.accumulator(this.seed, value, index);
+        }
+        catch (err) {
+            this.destination.error(err);
+        }
+        this.seed = result;
+        this.destination.next(result);
+    };
+    return ScanSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],155:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function sequenceEqual(compareTo, comparator) {
+    return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparator)); };
+}
+exports.sequenceEqual = sequenceEqual;
+var SequenceEqualOperator = (function () {
+    function SequenceEqualOperator(compareTo, comparator) {
+        this.compareTo = compareTo;
+        this.comparator = comparator;
+    }
+    SequenceEqualOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator));
+    };
+    return SequenceEqualOperator;
+}());
+exports.SequenceEqualOperator = SequenceEqualOperator;
+var SequenceEqualSubscriber = (function (_super) {
+    __extends(SequenceEqualSubscriber, _super);
+    function SequenceEqualSubscriber(destination, compareTo, comparator) {
+        var _this = _super.call(this, destination) || this;
+        _this.compareTo = compareTo;
+        _this.comparator = comparator;
+        _this._a = [];
+        _this._b = [];
+        _this._oneComplete = false;
+        _this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, _this)));
+        return _this;
+    }
+    SequenceEqualSubscriber.prototype._next = function (value) {
+        if (this._oneComplete && this._b.length === 0) {
+            this.emit(false);
+        }
+        else {
+            this._a.push(value);
+            this.checkValues();
+        }
+    };
+    SequenceEqualSubscriber.prototype._complete = function () {
+        if (this._oneComplete) {
+            this.emit(this._a.length === 0 && this._b.length === 0);
+        }
+        else {
+            this._oneComplete = true;
+        }
+        this.unsubscribe();
+    };
+    SequenceEqualSubscriber.prototype.checkValues = function () {
+        var _c = this, _a = _c._a, _b = _c._b, comparator = _c.comparator;
+        while (_a.length > 0 && _b.length > 0) {
+            var a = _a.shift();
+            var b = _b.shift();
+            var areEqual = false;
+            try {
+                areEqual = comparator ? comparator(a, b) : a === b;
+            }
+            catch (e) {
+                this.destination.error(e);
+            }
+            if (!areEqual) {
+                this.emit(false);
+            }
+        }
+    };
+    SequenceEqualSubscriber.prototype.emit = function (value) {
+        var destination = this.destination;
+        destination.next(value);
+        destination.complete();
+    };
+    SequenceEqualSubscriber.prototype.nextB = function (value) {
+        if (this._oneComplete && this._a.length === 0) {
+            this.emit(false);
+        }
+        else {
+            this._b.push(value);
+            this.checkValues();
+        }
+    };
+    SequenceEqualSubscriber.prototype.completeB = function () {
+        if (this._oneComplete) {
+            this.emit(this._a.length === 0 && this._b.length === 0);
+        }
+        else {
+            this._oneComplete = true;
+        }
+    };
+    return SequenceEqualSubscriber;
+}(Subscriber_1.Subscriber));
+exports.SequenceEqualSubscriber = SequenceEqualSubscriber;
+var SequenceEqualCompareToSubscriber = (function (_super) {
+    __extends(SequenceEqualCompareToSubscriber, _super);
+    function SequenceEqualCompareToSubscriber(destination, parent) {
+        var _this = _super.call(this, destination) || this;
+        _this.parent = parent;
+        return _this;
+    }
+    SequenceEqualCompareToSubscriber.prototype._next = function (value) {
+        this.parent.nextB(value);
+    };
+    SequenceEqualCompareToSubscriber.prototype._error = function (err) {
+        this.parent.error(err);
+        this.unsubscribe();
+    };
+    SequenceEqualCompareToSubscriber.prototype._complete = function () {
+        this.parent.completeB();
+        this.unsubscribe();
+    };
+    return SequenceEqualCompareToSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],156:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var multicast_1 = require("./multicast");
+var refCount_1 = require("./refCount");
+var Subject_1 = require("../Subject");
+function shareSubjectFactory() {
+    return new Subject_1.Subject();
+}
+function share() {
+    return function (source) { return refCount_1.refCount()(multicast_1.multicast(shareSubjectFactory)(source)); };
+}
+exports.share = share;
+
+},{"../Subject":53,"./multicast":135,"./refCount":147}],157:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var ReplaySubject_1 = require("../ReplaySubject");
+function shareReplay(configOrBufferSize, windowTime, scheduler) {
+    var config;
+    if (configOrBufferSize && typeof configOrBufferSize === 'object') {
+        config = configOrBufferSize;
+    }
+    else {
+        config = {
+            bufferSize: configOrBufferSize,
+            windowTime: windowTime,
+            refCount: false,
+            scheduler: scheduler
+        };
+    }
+    return function (source) { return source.lift(shareReplayOperator(config)); };
+}
+exports.shareReplay = shareReplay;
+function shareReplayOperator(_a) {
+    var _b = _a.bufferSize, bufferSize = _b === void 0 ? Number.POSITIVE_INFINITY : _b, _c = _a.windowTime, windowTime = _c === void 0 ? Number.POSITIVE_INFINITY : _c, useRefCount = _a.refCount, scheduler = _a.scheduler;
+    var subject;
+    var refCount = 0;
+    var subscription;
+    var hasError = false;
+    var isComplete = false;
+    return function shareReplayOperation(source) {
+        refCount++;
+        if (!subject || hasError) {
+            hasError = false;
+            subject = new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler);
+            subscription = source.subscribe({
+                next: function (value) { subject.next(value); },
+                error: function (err) {
+                    hasError = true;
+                    subject.error(err);
+                },
+                complete: function () {
+                    isComplete = true;
+                    subscription = undefined;
+                    subject.complete();
+                },
+            });
+        }
+        var innerSub = subject.subscribe(this);
+        this.add(function () {
+            refCount--;
+            innerSub.unsubscribe();
+            if (subscription && !isComplete && useRefCount && refCount === 0) {
+                subscription.unsubscribe();
+                subscription = undefined;
+                subject = undefined;
+            }
+        });
+    };
+}
+
+},{"../ReplaySubject":51}],158:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var EmptyError_1 = require("../util/EmptyError");
+function single(predicate) {
+    return function (source) { return source.lift(new SingleOperator(predicate, source)); };
+}
+exports.single = single;
+var SingleOperator = (function () {
+    function SingleOperator(predicate, source) {
+        this.predicate = predicate;
+        this.source = source;
+    }
+    SingleOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source));
+    };
+    return SingleOperator;
+}());
+var SingleSubscriber = (function (_super) {
+    __extends(SingleSubscriber, _super);
+    function SingleSubscriber(destination, predicate, source) {
+        var _this = _super.call(this, destination) || this;
+        _this.predicate = predicate;
+        _this.source = source;
+        _this.seenValue = false;
+        _this.index = 0;
+        return _this;
+    }
+    SingleSubscriber.prototype.applySingleValue = function (value) {
+        if (this.seenValue) {
+            this.destination.error('Sequence contains more than one element');
+        }
+        else {
+            this.seenValue = true;
+            this.singleValue = value;
+        }
+    };
+    SingleSubscriber.prototype._next = function (value) {
+        var index = this.index++;
+        if (this.predicate) {
+            this.tryNext(value, index);
+        }
+        else {
+            this.applySingleValue(value);
+        }
+    };
+    SingleSubscriber.prototype.tryNext = function (value, index) {
+        try {
+            if (this.predicate(value, index, this.source)) {
+                this.applySingleValue(value);
+            }
+        }
+        catch (err) {
+            this.destination.error(err);
+        }
+    };
+    SingleSubscriber.prototype._complete = function () {
+        var destination = this.destination;
+        if (this.index > 0) {
+            destination.next(this.seenValue ? this.singleValue : undefined);
+            destination.complete();
+        }
+        else {
+            destination.error(new EmptyError_1.EmptyError);
+        }
+    };
+    return SingleSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55,"../util/EmptyError":212}],159:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function skip(count) {
+    return function (source) { return source.lift(new SkipOperator(count)); };
+}
+exports.skip = skip;
+var SkipOperator = (function () {
+    function SkipOperator(total) {
+        this.total = total;
+    }
+    SkipOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new SkipSubscriber(subscriber, this.total));
+    };
+    return SkipOperator;
+}());
+var SkipSubscriber = (function (_super) {
+    __extends(SkipSubscriber, _super);
+    function SkipSubscriber(destination, total) {
+        var _this = _super.call(this, destination) || this;
+        _this.total = total;
+        _this.count = 0;
+        return _this;
+    }
+    SkipSubscriber.prototype._next = function (x) {
+        if (++this.count > this.total) {
+            this.destination.next(x);
+        }
+    };
+    return SkipSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],160:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
+function skipLast(count) {
+    return function (source) { return source.lift(new SkipLastOperator(count)); };
+}
+exports.skipLast = skipLast;
+var SkipLastOperator = (function () {
+    function SkipLastOperator(_skipCount) {
+        this._skipCount = _skipCount;
+        if (this._skipCount < 0) {
+            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
+        }
+    }
+    SkipLastOperator.prototype.call = function (subscriber, source) {
+        if (this._skipCount === 0) {
+            return source.subscribe(new Subscriber_1.Subscriber(subscriber));
+        }
+        else {
+            return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount));
+        }
+    };
+    return SkipLastOperator;
+}());
+var SkipLastSubscriber = (function (_super) {
+    __extends(SkipLastSubscriber, _super);
+    function SkipLastSubscriber(destination, _skipCount) {
+        var _this = _super.call(this, destination) || this;
+        _this._skipCount = _skipCount;
+        _this._count = 0;
+        _this._ring = new Array(_skipCount);
+        return _this;
+    }
+    SkipLastSubscriber.prototype._next = function (value) {
+        var skipCount = this._skipCount;
+        var count = this._count++;
+        if (count < skipCount) {
+            this._ring[count] = value;
+        }
+        else {
+            var currentIndex = count % skipCount;
+            var ring = this._ring;
+            var oldValue = ring[currentIndex];
+            ring[currentIndex] = value;
+            this.destination.next(oldValue);
+        }
+    };
+    return SkipLastSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55,"../util/ArgumentOutOfRangeError":211}],161:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var InnerSubscriber_1 = require("../InnerSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function skipUntil(notifier) {
+    return function (source) { return source.lift(new SkipUntilOperator(notifier)); };
+}
+exports.skipUntil = skipUntil;
+var SkipUntilOperator = (function () {
+    function SkipUntilOperator(notifier) {
+        this.notifier = notifier;
+    }
+    SkipUntilOperator.prototype.call = function (destination, source) {
+        return source.subscribe(new SkipUntilSubscriber(destination, this.notifier));
+    };
+    return SkipUntilOperator;
+}());
+var SkipUntilSubscriber = (function (_super) {
+    __extends(SkipUntilSubscriber, _super);
+    function SkipUntilSubscriber(destination, notifier) {
+        var _this = _super.call(this, destination) || this;
+        _this.hasValue = false;
+        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(_this, undefined, undefined);
+        _this.add(innerSubscriber);
+        _this.innerSubscription = innerSubscriber;
+        var innerSubscription = subscribeToResult_1.subscribeToResult(_this, notifier, undefined, undefined, innerSubscriber);
+        if (innerSubscription !== innerSubscriber) {
+            _this.add(innerSubscription);
+            _this.innerSubscription = innerSubscription;
+        }
+        return _this;
+    }
+    SkipUntilSubscriber.prototype._next = function (value) {
+        if (this.hasValue) {
+            _super.prototype._next.call(this, value);
+        }
+    };
+    SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.hasValue = true;
+        if (this.innerSubscription) {
+            this.innerSubscription.unsubscribe();
+        }
+    };
+    SkipUntilSubscriber.prototype.notifyComplete = function () {
+    };
+    return SkipUntilSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../util/subscribeToResult":239}],162:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function skipWhile(predicate) {
+    return function (source) { return source.lift(new SkipWhileOperator(predicate)); };
+}
+exports.skipWhile = skipWhile;
+var SkipWhileOperator = (function () {
+    function SkipWhileOperator(predicate) {
+        this.predicate = predicate;
+    }
+    SkipWhileOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));
+    };
+    return SkipWhileOperator;
+}());
+var SkipWhileSubscriber = (function (_super) {
+    __extends(SkipWhileSubscriber, _super);
+    function SkipWhileSubscriber(destination, predicate) {
+        var _this = _super.call(this, destination) || this;
+        _this.predicate = predicate;
+        _this.skipping = true;
+        _this.index = 0;
+        return _this;
+    }
+    SkipWhileSubscriber.prototype._next = function (value) {
+        var destination = this.destination;
+        if (this.skipping) {
+            this.tryCallPredicate(value);
+        }
+        if (!this.skipping) {
+            destination.next(value);
+        }
+    };
+    SkipWhileSubscriber.prototype.tryCallPredicate = function (value) {
+        try {
+            var result = this.predicate(value, this.index++);
+            this.skipping = Boolean(result);
+        }
+        catch (err) {
+            this.destination.error(err);
+        }
+    };
+    return SkipWhileSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],163:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var concat_1 = require("../observable/concat");
+var isScheduler_1 = require("../util/isScheduler");
+function startWith() {
+    var array = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        array[_i] = arguments[_i];
+    }
+    var scheduler = array[array.length - 1];
+    if (isScheduler_1.isScheduler(scheduler)) {
+        array.pop();
+        return function (source) { return concat_1.concat(array, source, scheduler); };
+    }
+    else {
+        return function (source) { return concat_1.concat(array, source); };
+    }
+}
+exports.startWith = startWith;
+
+},{"../observable/concat":63,"../util/isScheduler":230}],164:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var SubscribeOnObservable_1 = require("../observable/SubscribeOnObservable");
+function subscribeOn(scheduler, delay) {
+    if (delay === void 0) { delay = 0; }
+    return function subscribeOnOperatorFunction(source) {
+        return source.lift(new SubscribeOnOperator(scheduler, delay));
+    };
+}
+exports.subscribeOn = subscribeOn;
+var SubscribeOnOperator = (function () {
+    function SubscribeOnOperator(scheduler, delay) {
+        this.scheduler = scheduler;
+        this.delay = delay;
+    }
+    SubscribeOnOperator.prototype.call = function (subscriber, source) {
+        return new SubscribeOnObservable_1.SubscribeOnObservable(source, this.delay, this.scheduler).subscribe(subscriber);
+    };
+    return SubscribeOnOperator;
+}());
+
+},{"../observable/SubscribeOnObservable":59}],165:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var switchMap_1 = require("./switchMap");
+var identity_1 = require("../util/identity");
+function switchAll() {
+    return switchMap_1.switchMap(identity_1.identity);
+}
+exports.switchAll = switchAll;
+
+},{"../util/identity":219,"./switchMap":166}],166:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var InnerSubscriber_1 = require("../InnerSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+var map_1 = require("./map");
+var from_1 = require("../observable/from");
+function switchMap(project, resultSelector) {
+    if (typeof resultSelector === 'function') {
+        return function (source) { return source.pipe(switchMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };
+    }
+    return function (source) { return source.lift(new SwitchMapOperator(project)); };
+}
+exports.switchMap = switchMap;
+var SwitchMapOperator = (function () {
+    function SwitchMapOperator(project) {
+        this.project = project;
+    }
+    SwitchMapOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new SwitchMapSubscriber(subscriber, this.project));
+    };
+    return SwitchMapOperator;
+}());
+var SwitchMapSubscriber = (function (_super) {
+    __extends(SwitchMapSubscriber, _super);
+    function SwitchMapSubscriber(destination, project) {
+        var _this = _super.call(this, destination) || this;
+        _this.project = project;
+        _this.index = 0;
+        return _this;
+    }
+    SwitchMapSubscriber.prototype._next = function (value) {
+        var result;
+        var index = this.index++;
+        try {
+            result = this.project(value, index);
+        }
+        catch (error) {
+            this.destination.error(error);
+            return;
+        }
+        this._innerSub(result, value, index);
+    };
+    SwitchMapSubscriber.prototype._innerSub = function (result, value, index) {
+        var innerSubscription = this.innerSubscription;
+        if (innerSubscription) {
+            innerSubscription.unsubscribe();
+        }
+        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, value, index);
+        var destination = this.destination;
+        destination.add(innerSubscriber);
+        this.innerSubscription = subscribeToResult_1.subscribeToResult(this, result, undefined, undefined, innerSubscriber);
+        if (this.innerSubscription !== innerSubscriber) {
+            destination.add(this.innerSubscription);
+        }
+    };
+    SwitchMapSubscriber.prototype._complete = function () {
+        var innerSubscription = this.innerSubscription;
+        if (!innerSubscription || innerSubscription.closed) {
+            _super.prototype._complete.call(this);
+        }
+        this.unsubscribe();
+    };
+    SwitchMapSubscriber.prototype._unsubscribe = function () {
+        this.innerSubscription = null;
+    };
+    SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) {
+        var destination = this.destination;
+        destination.remove(innerSub);
+        this.innerSubscription = null;
+        if (this.isStopped) {
+            _super.prototype._complete.call(this);
+        }
+    };
+    SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.destination.next(innerValue);
+    };
+    return SwitchMapSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../observable/from":67,"../util/subscribeToResult":239,"./map":125}],167:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var switchMap_1 = require("./switchMap");
+function switchMapTo(innerObservable, resultSelector) {
+    return resultSelector ? switchMap_1.switchMap(function () { return innerObservable; }, resultSelector) : switchMap_1.switchMap(function () { return innerObservable; });
+}
+exports.switchMapTo = switchMapTo;
+
+},{"./switchMap":166}],168:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
+var empty_1 = require("../observable/empty");
+function take(count) {
+    return function (source) {
+        if (count === 0) {
+            return empty_1.empty();
+        }
+        else {
+            return source.lift(new TakeOperator(count));
+        }
+    };
+}
+exports.take = take;
+var TakeOperator = (function () {
+    function TakeOperator(total) {
+        this.total = total;
+        if (this.total < 0) {
+            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
+        }
+    }
+    TakeOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new TakeSubscriber(subscriber, this.total));
+    };
+    return TakeOperator;
+}());
+var TakeSubscriber = (function (_super) {
+    __extends(TakeSubscriber, _super);
+    function TakeSubscriber(destination, total) {
+        var _this = _super.call(this, destination) || this;
+        _this.total = total;
+        _this.count = 0;
+        return _this;
+    }
+    TakeSubscriber.prototype._next = function (value) {
+        var total = this.total;
+        var count = ++this.count;
+        if (count <= total) {
+            this.destination.next(value);
+            if (count === total) {
+                this.destination.complete();
+                this.unsubscribe();
+            }
+        }
+    };
+    return TakeSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55,"../observable/empty":65,"../util/ArgumentOutOfRangeError":211}],169:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
+var empty_1 = require("../observable/empty");
+function takeLast(count) {
+    return function takeLastOperatorFunction(source) {
+        if (count === 0) {
+            return empty_1.empty();
+        }
+        else {
+            return source.lift(new TakeLastOperator(count));
+        }
+    };
+}
+exports.takeLast = takeLast;
+var TakeLastOperator = (function () {
+    function TakeLastOperator(total) {
+        this.total = total;
+        if (this.total < 0) {
+            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
+        }
+    }
+    TakeLastOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new TakeLastSubscriber(subscriber, this.total));
+    };
+    return TakeLastOperator;
+}());
+var TakeLastSubscriber = (function (_super) {
+    __extends(TakeLastSubscriber, _super);
+    function TakeLastSubscriber(destination, total) {
+        var _this = _super.call(this, destination) || this;
+        _this.total = total;
+        _this.ring = new Array();
+        _this.count = 0;
+        return _this;
+    }
+    TakeLastSubscriber.prototype._next = function (value) {
+        var ring = this.ring;
+        var total = this.total;
+        var count = this.count++;
+        if (ring.length < total) {
+            ring.push(value);
+        }
+        else {
+            var index = count % total;
+            ring[index] = value;
+        }
+    };
+    TakeLastSubscriber.prototype._complete = function () {
+        var destination = this.destination;
+        var count = this.count;
+        if (count > 0) {
+            var total = this.count >= this.total ? this.total : this.count;
+            var ring = this.ring;
+            for (var i = 0; i < total; i++) {
+                var idx = (count++) % total;
+                destination.next(ring[idx]);
+            }
+        }
+        destination.complete();
+    };
+    return TakeLastSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55,"../observable/empty":65,"../util/ArgumentOutOfRangeError":211}],170:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function takeUntil(notifier) {
+    return function (source) { return source.lift(new TakeUntilOperator(notifier)); };
+}
+exports.takeUntil = takeUntil;
+var TakeUntilOperator = (function () {
+    function TakeUntilOperator(notifier) {
+        this.notifier = notifier;
+    }
+    TakeUntilOperator.prototype.call = function (subscriber, source) {
+        var takeUntilSubscriber = new TakeUntilSubscriber(subscriber);
+        var notifierSubscription = subscribeToResult_1.subscribeToResult(takeUntilSubscriber, this.notifier);
+        if (notifierSubscription && !takeUntilSubscriber.seenValue) {
+            takeUntilSubscriber.add(notifierSubscription);
+            return source.subscribe(takeUntilSubscriber);
+        }
+        return takeUntilSubscriber;
+    };
+    return TakeUntilOperator;
+}());
+var TakeUntilSubscriber = (function (_super) {
+    __extends(TakeUntilSubscriber, _super);
+    function TakeUntilSubscriber(destination) {
+        var _this = _super.call(this, destination) || this;
+        _this.seenValue = false;
+        return _this;
+    }
+    TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.seenValue = true;
+        this.complete();
+    };
+    TakeUntilSubscriber.prototype.notifyComplete = function () {
+    };
+    return TakeUntilSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],171:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function takeWhile(predicate, inclusive) {
+    if (inclusive === void 0) { inclusive = false; }
+    return function (source) {
+        return source.lift(new TakeWhileOperator(predicate, inclusive));
+    };
+}
+exports.takeWhile = takeWhile;
+var TakeWhileOperator = (function () {
+    function TakeWhileOperator(predicate, inclusive) {
+        this.predicate = predicate;
+        this.inclusive = inclusive;
+    }
+    TakeWhileOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive));
+    };
+    return TakeWhileOperator;
+}());
+var TakeWhileSubscriber = (function (_super) {
+    __extends(TakeWhileSubscriber, _super);
+    function TakeWhileSubscriber(destination, predicate, inclusive) {
+        var _this = _super.call(this, destination) || this;
+        _this.predicate = predicate;
+        _this.inclusive = inclusive;
+        _this.index = 0;
+        return _this;
+    }
+    TakeWhileSubscriber.prototype._next = function (value) {
+        var destination = this.destination;
+        var result;
+        try {
+            result = this.predicate(value, this.index++);
+        }
+        catch (err) {
+            destination.error(err);
+            return;
+        }
+        this.nextOrComplete(value, result);
+    };
+    TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) {
+        var destination = this.destination;
+        if (Boolean(predicateResult)) {
+            destination.next(value);
+        }
+        else {
+            if (this.inclusive) {
+                destination.next(value);
+            }
+            destination.complete();
+        }
+    };
+    return TakeWhileSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55}],172:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var noop_1 = require("../util/noop");
+var isFunction_1 = require("../util/isFunction");
+function tap(nextOrObserver, error, complete) {
+    return function tapOperatorFunction(source) {
+        return source.lift(new DoOperator(nextOrObserver, error, complete));
+    };
+}
+exports.tap = tap;
+var DoOperator = (function () {
+    function DoOperator(nextOrObserver, error, complete) {
+        this.nextOrObserver = nextOrObserver;
+        this.error = error;
+        this.complete = complete;
+    }
+    DoOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));
+    };
+    return DoOperator;
+}());
+var TapSubscriber = (function (_super) {
+    __extends(TapSubscriber, _super);
+    function TapSubscriber(destination, observerOrNext, error, complete) {
+        var _this = _super.call(this, destination) || this;
+        _this._tapNext = noop_1.noop;
+        _this._tapError = noop_1.noop;
+        _this._tapComplete = noop_1.noop;
+        _this._tapError = error || noop_1.noop;
+        _this._tapComplete = complete || noop_1.noop;
+        if (isFunction_1.isFunction(observerOrNext)) {
+            _this._context = _this;
+            _this._tapNext = observerOrNext;
+        }
+        else if (observerOrNext) {
+            _this._context = observerOrNext;
+            _this._tapNext = observerOrNext.next || noop_1.noop;
+            _this._tapError = observerOrNext.error || noop_1.noop;
+            _this._tapComplete = observerOrNext.complete || noop_1.noop;
+        }
+        return _this;
+    }
+    TapSubscriber.prototype._next = function (value) {
+        try {
+            this._tapNext.call(this._context, value);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        this.destination.next(value);
+    };
+    TapSubscriber.prototype._error = function (err) {
+        try {
+            this._tapError.call(this._context, err);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        this.destination.error(err);
+    };
+    TapSubscriber.prototype._complete = function () {
+        try {
+            this._tapComplete.call(this._context);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        return this.destination.complete();
+    };
+    return TapSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subscriber":55,"../util/isFunction":223,"../util/noop":231}],173:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+exports.defaultThrottleConfig = {
+    leading: true,
+    trailing: false
+};
+function throttle(durationSelector, config) {
+    if (config === void 0) { config = exports.defaultThrottleConfig; }
+    return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); };
+}
+exports.throttle = throttle;
+var ThrottleOperator = (function () {
+    function ThrottleOperator(durationSelector, leading, trailing) {
+        this.durationSelector = durationSelector;
+        this.leading = leading;
+        this.trailing = trailing;
+    }
+    ThrottleOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing));
+    };
+    return ThrottleOperator;
+}());
+var ThrottleSubscriber = (function (_super) {
+    __extends(ThrottleSubscriber, _super);
+    function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) {
+        var _this = _super.call(this, destination) || this;
+        _this.destination = destination;
+        _this.durationSelector = durationSelector;
+        _this._leading = _leading;
+        _this._trailing = _trailing;
+        _this._hasValue = false;
+        return _this;
+    }
+    ThrottleSubscriber.prototype._next = function (value) {
+        this._hasValue = true;
+        this._sendValue = value;
+        if (!this._throttled) {
+            if (this._leading) {
+                this.send();
+            }
+            else {
+                this.throttle(value);
+            }
+        }
+    };
+    ThrottleSubscriber.prototype.send = function () {
+        var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue;
+        if (_hasValue) {
+            this.destination.next(_sendValue);
+            this.throttle(_sendValue);
+        }
+        this._hasValue = false;
+        this._sendValue = null;
+    };
+    ThrottleSubscriber.prototype.throttle = function (value) {
+        var duration = this.tryDurationSelector(value);
+        if (!!duration) {
+            this.add(this._throttled = subscribeToResult_1.subscribeToResult(this, duration));
+        }
+    };
+    ThrottleSubscriber.prototype.tryDurationSelector = function (value) {
+        try {
+            return this.durationSelector(value);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return null;
+        }
+    };
+    ThrottleSubscriber.prototype.throttlingDone = function () {
+        var _a = this, _throttled = _a._throttled, _trailing = _a._trailing;
+        if (_throttled) {
+            _throttled.unsubscribe();
+        }
+        this._throttled = null;
+        if (_trailing) {
+            this.send();
+        }
+    };
+    ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.throttlingDone();
+    };
+    ThrottleSubscriber.prototype.notifyComplete = function () {
+        this.throttlingDone();
+    };
+    return ThrottleSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],174:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var async_1 = require("../scheduler/async");
+var throttle_1 = require("./throttle");
+function throttleTime(duration, scheduler, config) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    if (config === void 0) { config = throttle_1.defaultThrottleConfig; }
+    return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); };
+}
+exports.throttleTime = throttleTime;
+var ThrottleTimeOperator = (function () {
+    function ThrottleTimeOperator(duration, scheduler, leading, trailing) {
+        this.duration = duration;
+        this.scheduler = scheduler;
+        this.leading = leading;
+        this.trailing = trailing;
+    }
+    ThrottleTimeOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing));
+    };
+    return ThrottleTimeOperator;
+}());
+var ThrottleTimeSubscriber = (function (_super) {
+    __extends(ThrottleTimeSubscriber, _super);
+    function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) {
+        var _this = _super.call(this, destination) || this;
+        _this.duration = duration;
+        _this.scheduler = scheduler;
+        _this.leading = leading;
+        _this.trailing = trailing;
+        _this._hasTrailingValue = false;
+        _this._trailingValue = null;
+        return _this;
+    }
+    ThrottleTimeSubscriber.prototype._next = function (value) {
+        if (this.throttled) {
+            if (this.trailing) {
+                this._trailingValue = value;
+                this._hasTrailingValue = true;
+            }
+        }
+        else {
+            this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));
+            if (this.leading) {
+                this.destination.next(value);
+            }
+            else if (this.trailing) {
+                this._trailingValue = value;
+                this._hasTrailingValue = true;
+            }
+        }
+    };
+    ThrottleTimeSubscriber.prototype._complete = function () {
+        if (this._hasTrailingValue) {
+            this.destination.next(this._trailingValue);
+            this.destination.complete();
+        }
+        else {
+            this.destination.complete();
+        }
+    };
+    ThrottleTimeSubscriber.prototype.clearThrottle = function () {
+        var throttled = this.throttled;
+        if (throttled) {
+            if (this.trailing && this._hasTrailingValue) {
+                this.destination.next(this._trailingValue);
+                this._trailingValue = null;
+                this._hasTrailingValue = false;
+            }
+            throttled.unsubscribe();
+            this.remove(throttled);
+            this.throttled = null;
+        }
+    };
+    return ThrottleTimeSubscriber;
+}(Subscriber_1.Subscriber));
+function dispatchNext(arg) {
+    var subscriber = arg.subscriber;
+    subscriber.clearThrottle();
+}
+
+},{"../Subscriber":55,"../scheduler/async":206,"./throttle":173}],175:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var EmptyError_1 = require("../util/EmptyError");
+var Subscriber_1 = require("../Subscriber");
+function throwIfEmpty(errorFactory) {
+    if (errorFactory === void 0) { errorFactory = defaultErrorFactory; }
+    return function (source) {
+        return source.lift(new ThrowIfEmptyOperator(errorFactory));
+    };
+}
+exports.throwIfEmpty = throwIfEmpty;
+var ThrowIfEmptyOperator = (function () {
+    function ThrowIfEmptyOperator(errorFactory) {
+        this.errorFactory = errorFactory;
+    }
+    ThrowIfEmptyOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory));
+    };
+    return ThrowIfEmptyOperator;
+}());
+var ThrowIfEmptySubscriber = (function (_super) {
+    __extends(ThrowIfEmptySubscriber, _super);
+    function ThrowIfEmptySubscriber(destination, errorFactory) {
+        var _this = _super.call(this, destination) || this;
+        _this.errorFactory = errorFactory;
+        _this.hasValue = false;
+        return _this;
+    }
+    ThrowIfEmptySubscriber.prototype._next = function (value) {
+        this.hasValue = true;
+        this.destination.next(value);
+    };
+    ThrowIfEmptySubscriber.prototype._complete = function () {
+        if (!this.hasValue) {
+            var err = void 0;
+            try {
+                err = this.errorFactory();
+            }
+            catch (e) {
+                err = e;
+            }
+            this.destination.error(err);
+        }
+        else {
+            return this.destination.complete();
+        }
+    };
+    return ThrowIfEmptySubscriber;
+}(Subscriber_1.Subscriber));
+function defaultErrorFactory() {
+    return new EmptyError_1.EmptyError();
+}
+
+},{"../Subscriber":55,"../util/EmptyError":212}],176:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var async_1 = require("../scheduler/async");
+var scan_1 = require("./scan");
+var defer_1 = require("../observable/defer");
+var map_1 = require("./map");
+function timeInterval(scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return function (source) { return defer_1.defer(function () {
+        return source.pipe(scan_1.scan(function (_a, value) {
+            var current = _a.current;
+            return ({ value: value, current: scheduler.now(), last: current });
+        }, { current: scheduler.now(), value: undefined, last: undefined }), map_1.map(function (_a) {
+            var current = _a.current, last = _a.last, value = _a.value;
+            return new TimeInterval(value, current - last);
+        }));
+    }); };
+}
+exports.timeInterval = timeInterval;
+var TimeInterval = (function () {
+    function TimeInterval(value, interval) {
+        this.value = value;
+        this.interval = interval;
+    }
+    return TimeInterval;
+}());
+exports.TimeInterval = TimeInterval;
+
+},{"../observable/defer":64,"../scheduler/async":206,"./map":125,"./scan":154}],177:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var async_1 = require("../scheduler/async");
+var TimeoutError_1 = require("../util/TimeoutError");
+var timeoutWith_1 = require("./timeoutWith");
+var throwError_1 = require("../observable/throwError");
+function timeout(due, scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return timeoutWith_1.timeoutWith(due, throwError_1.throwError(new TimeoutError_1.TimeoutError()), scheduler);
+}
+exports.timeout = timeout;
+
+},{"../observable/throwError":82,"../scheduler/async":206,"../util/TimeoutError":215,"./timeoutWith":178}],178:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var async_1 = require("../scheduler/async");
+var isDate_1 = require("../util/isDate");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function timeoutWith(due, withObservable, scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return function (source) {
+        var absoluteTimeout = isDate_1.isDate(due);
+        var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due);
+        return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler));
+    };
+}
+exports.timeoutWith = timeoutWith;
+var TimeoutWithOperator = (function () {
+    function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) {
+        this.waitFor = waitFor;
+        this.absoluteTimeout = absoluteTimeout;
+        this.withObservable = withObservable;
+        this.scheduler = scheduler;
+    }
+    TimeoutWithOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler));
+    };
+    return TimeoutWithOperator;
+}());
+var TimeoutWithSubscriber = (function (_super) {
+    __extends(TimeoutWithSubscriber, _super);
+    function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) {
+        var _this = _super.call(this, destination) || this;
+        _this.absoluteTimeout = absoluteTimeout;
+        _this.waitFor = waitFor;
+        _this.withObservable = withObservable;
+        _this.scheduler = scheduler;
+        _this.action = null;
+        _this.scheduleTimeout();
+        return _this;
+    }
+    TimeoutWithSubscriber.dispatchTimeout = function (subscriber) {
+        var withObservable = subscriber.withObservable;
+        subscriber._unsubscribeAndRecycle();
+        subscriber.add(subscribeToResult_1.subscribeToResult(subscriber, withObservable));
+    };
+    TimeoutWithSubscriber.prototype.scheduleTimeout = function () {
+        var action = this.action;
+        if (action) {
+            this.action = action.schedule(this, this.waitFor);
+        }
+        else {
+            this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this));
+        }
+    };
+    TimeoutWithSubscriber.prototype._next = function (value) {
+        if (!this.absoluteTimeout) {
+            this.scheduleTimeout();
+        }
+        _super.prototype._next.call(this, value);
+    };
+    TimeoutWithSubscriber.prototype._unsubscribe = function () {
+        this.action = null;
+        this.scheduler = null;
+        this.withObservable = null;
+    };
+    return TimeoutWithSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":50,"../scheduler/async":206,"../util/isDate":222,"../util/subscribeToResult":239}],179:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var async_1 = require("../scheduler/async");
+var map_1 = require("./map");
+function timestamp(scheduler) {
+    if (scheduler === void 0) { scheduler = async_1.async; }
+    return map_1.map(function (value) { return new Timestamp(value, scheduler.now()); });
+}
+exports.timestamp = timestamp;
+var Timestamp = (function () {
+    function Timestamp(value, timestamp) {
+        this.value = value;
+        this.timestamp = timestamp;
+    }
+    return Timestamp;
+}());
+exports.Timestamp = Timestamp;
+
+},{"../scheduler/async":206,"./map":125}],180:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var reduce_1 = require("./reduce");
+function toArrayReducer(arr, item, index) {
+    if (index === 0) {
+        return [item];
+    }
+    arr.push(item);
+    return arr;
+}
+function toArray() {
+    return reduce_1.reduce(toArrayReducer, []);
+}
+exports.toArray = toArray;
+
+},{"./reduce":146}],181:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("../Subject");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function window(windowBoundaries) {
+    return function windowOperatorFunction(source) {
+        return source.lift(new WindowOperator(windowBoundaries));
+    };
+}
+exports.window = window;
+var WindowOperator = (function () {
+    function WindowOperator(windowBoundaries) {
+        this.windowBoundaries = windowBoundaries;
+    }
+    WindowOperator.prototype.call = function (subscriber, source) {
+        var windowSubscriber = new WindowSubscriber(subscriber);
+        var sourceSubscription = source.subscribe(windowSubscriber);
+        if (!sourceSubscription.closed) {
+            windowSubscriber.add(subscribeToResult_1.subscribeToResult(windowSubscriber, this.windowBoundaries));
+        }
+        return sourceSubscription;
+    };
+    return WindowOperator;
+}());
+var WindowSubscriber = (function (_super) {
+    __extends(WindowSubscriber, _super);
+    function WindowSubscriber(destination) {
+        var _this = _super.call(this, destination) || this;
+        _this.window = new Subject_1.Subject();
+        destination.next(_this.window);
+        return _this;
+    }
+    WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.openWindow();
+    };
+    WindowSubscriber.prototype.notifyError = function (error, innerSub) {
+        this._error(error);
+    };
+    WindowSubscriber.prototype.notifyComplete = function (innerSub) {
+        this._complete();
+    };
+    WindowSubscriber.prototype._next = function (value) {
+        this.window.next(value);
+    };
+    WindowSubscriber.prototype._error = function (err) {
+        this.window.error(err);
+        this.destination.error(err);
+    };
+    WindowSubscriber.prototype._complete = function () {
+        this.window.complete();
+        this.destination.complete();
+    };
+    WindowSubscriber.prototype._unsubscribe = function () {
+        this.window = null;
+    };
+    WindowSubscriber.prototype.openWindow = function () {
+        var prevWindow = this.window;
+        if (prevWindow) {
+            prevWindow.complete();
+        }
+        var destination = this.destination;
+        var newWindow = this.window = new Subject_1.Subject();
+        destination.next(newWindow);
+    };
+    return WindowSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":50,"../Subject":53,"../util/subscribeToResult":239}],182:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var Subject_1 = require("../Subject");
+function windowCount(windowSize, startWindowEvery) {
+    if (startWindowEvery === void 0) { startWindowEvery = 0; }
+    return function windowCountOperatorFunction(source) {
+        return source.lift(new WindowCountOperator(windowSize, startWindowEvery));
+    };
+}
+exports.windowCount = windowCount;
+var WindowCountOperator = (function () {
+    function WindowCountOperator(windowSize, startWindowEvery) {
+        this.windowSize = windowSize;
+        this.startWindowEvery = startWindowEvery;
+    }
+    WindowCountOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery));
+    };
+    return WindowCountOperator;
+}());
+var WindowCountSubscriber = (function (_super) {
+    __extends(WindowCountSubscriber, _super);
+    function WindowCountSubscriber(destination, windowSize, startWindowEvery) {
+        var _this = _super.call(this, destination) || this;
+        _this.destination = destination;
+        _this.windowSize = windowSize;
+        _this.startWindowEvery = startWindowEvery;
+        _this.windows = [new Subject_1.Subject()];
+        _this.count = 0;
+        destination.next(_this.windows[0]);
+        return _this;
+    }
+    WindowCountSubscriber.prototype._next = function (value) {
+        var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize;
+        var destination = this.destination;
+        var windowSize = this.windowSize;
+        var windows = this.windows;
+        var len = windows.length;
+        for (var i = 0; i < len && !this.closed; i++) {
+            windows[i].next(value);
+        }
+        var c = this.count - windowSize + 1;
+        if (c >= 0 && c % startWindowEvery === 0 && !this.closed) {
+            windows.shift().complete();
+        }
+        if (++this.count % startWindowEvery === 0 && !this.closed) {
+            var window_1 = new Subject_1.Subject();
+            windows.push(window_1);
+            destination.next(window_1);
+        }
+    };
+    WindowCountSubscriber.prototype._error = function (err) {
+        var windows = this.windows;
+        if (windows) {
+            while (windows.length > 0 && !this.closed) {
+                windows.shift().error(err);
+            }
+        }
+        this.destination.error(err);
+    };
+    WindowCountSubscriber.prototype._complete = function () {
+        var windows = this.windows;
+        if (windows) {
+            while (windows.length > 0 && !this.closed) {
+                windows.shift().complete();
+            }
+        }
+        this.destination.complete();
+    };
+    WindowCountSubscriber.prototype._unsubscribe = function () {
+        this.count = 0;
+        this.windows = null;
+    };
+    return WindowCountSubscriber;
+}(Subscriber_1.Subscriber));
+
+},{"../Subject":53,"../Subscriber":55}],183:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("../Subject");
+var async_1 = require("../scheduler/async");
+var Subscriber_1 = require("../Subscriber");
+var isNumeric_1 = require("../util/isNumeric");
+var isScheduler_1 = require("../util/isScheduler");
+function windowTime(windowTimeSpan) {
+    var scheduler = async_1.async;
+    var windowCreationInterval = null;
+    var maxWindowSize = Number.POSITIVE_INFINITY;
+    if (isScheduler_1.isScheduler(arguments[3])) {
+        scheduler = arguments[3];
+    }
+    if (isScheduler_1.isScheduler(arguments[2])) {
+        scheduler = arguments[2];
+    }
+    else if (isNumeric_1.isNumeric(arguments[2])) {
+        maxWindowSize = arguments[2];
+    }
+    if (isScheduler_1.isScheduler(arguments[1])) {
+        scheduler = arguments[1];
+    }
+    else if (isNumeric_1.isNumeric(arguments[1])) {
+        windowCreationInterval = arguments[1];
+    }
+    return function windowTimeOperatorFunction(source) {
+        return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler));
+    };
+}
+exports.windowTime = windowTime;
+var WindowTimeOperator = (function () {
+    function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
+        this.windowTimeSpan = windowTimeSpan;
+        this.windowCreationInterval = windowCreationInterval;
+        this.maxWindowSize = maxWindowSize;
+        this.scheduler = scheduler;
+    }
+    WindowTimeOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler));
+    };
+    return WindowTimeOperator;
+}());
+var CountedSubject = (function (_super) {
+    __extends(CountedSubject, _super);
+    function CountedSubject() {
+        var _this = _super !== null && _super.apply(this, arguments) || this;
+        _this._numberOfNextedValues = 0;
+        return _this;
+    }
+    CountedSubject.prototype.next = function (value) {
+        this._numberOfNextedValues++;
+        _super.prototype.next.call(this, value);
+    };
+    Object.defineProperty(CountedSubject.prototype, "numberOfNextedValues", {
+        get: function () {
+            return this._numberOfNextedValues;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    return CountedSubject;
+}(Subject_1.Subject));
+var WindowTimeSubscriber = (function (_super) {
+    __extends(WindowTimeSubscriber, _super);
+    function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
+        var _this = _super.call(this, destination) || this;
+        _this.destination = destination;
+        _this.windowTimeSpan = windowTimeSpan;
+        _this.windowCreationInterval = windowCreationInterval;
+        _this.maxWindowSize = maxWindowSize;
+        _this.scheduler = scheduler;
+        _this.windows = [];
+        var window = _this.openWindow();
+        if (windowCreationInterval !== null && windowCreationInterval >= 0) {
+            var closeState = { subscriber: _this, window: window, context: null };
+            var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: _this, scheduler: scheduler };
+            _this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState));
+            _this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState));
+        }
+        else {
+            var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan };
+            _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState));
+        }
+        return _this;
+    }
+    WindowTimeSubscriber.prototype._next = function (value) {
+        var windows = this.windows;
+        var len = windows.length;
+        for (var i = 0; i < len; i++) {
+            var window_1 = windows[i];
+            if (!window_1.closed) {
+                window_1.next(value);
+                if (window_1.numberOfNextedValues >= this.maxWindowSize) {
+                    this.closeWindow(window_1);
+                }
+            }
+        }
+    };
+    WindowTimeSubscriber.prototype._error = function (err) {
+        var windows = this.windows;
+        while (windows.length > 0) {
+            windows.shift().error(err);
+        }
+        this.destination.error(err);
+    };
+    WindowTimeSubscriber.prototype._complete = function () {
+        var windows = this.windows;
+        while (windows.length > 0) {
+            var window_2 = windows.shift();
+            if (!window_2.closed) {
+                window_2.complete();
+            }
+        }
+        this.destination.complete();
+    };
+    WindowTimeSubscriber.prototype.openWindow = function () {
+        var window = new CountedSubject();
+        this.windows.push(window);
+        var destination = this.destination;
+        destination.next(window);
+        return window;
+    };
+    WindowTimeSubscriber.prototype.closeWindow = function (window) {
+        window.complete();
+        var windows = this.windows;
+        windows.splice(windows.indexOf(window), 1);
+    };
+    return WindowTimeSubscriber;
+}(Subscriber_1.Subscriber));
+function dispatchWindowTimeSpanOnly(state) {
+    var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window;
+    if (window) {
+        subscriber.closeWindow(window);
+    }
+    state.window = subscriber.openWindow();
+    this.schedule(state, windowTimeSpan);
+}
+function dispatchWindowCreation(state) {
+    var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval;
+    var window = subscriber.openWindow();
+    var action = this;
+    var context = { action: action, subscription: null };
+    var timeSpanState = { subscriber: subscriber, window: window, context: context };
+    context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState);
+    action.add(context.subscription);
+    action.schedule(state, windowCreationInterval);
+}
+function dispatchWindowClose(state) {
+    var subscriber = state.subscriber, window = state.window, context = state.context;
+    if (context && context.action && context.subscription) {
+        context.action.remove(context.subscription);
+    }
+    subscriber.closeWindow(window);
+}
+
+},{"../Subject":53,"../Subscriber":55,"../scheduler/async":206,"../util/isNumeric":226,"../util/isScheduler":230}],184:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("../Subject");
+var Subscription_1 = require("../Subscription");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function windowToggle(openings, closingSelector) {
+    return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); };
+}
+exports.windowToggle = windowToggle;
+var WindowToggleOperator = (function () {
+    function WindowToggleOperator(openings, closingSelector) {
+        this.openings = openings;
+        this.closingSelector = closingSelector;
+    }
+    WindowToggleOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector));
+    };
+    return WindowToggleOperator;
+}());
+var WindowToggleSubscriber = (function (_super) {
+    __extends(WindowToggleSubscriber, _super);
+    function WindowToggleSubscriber(destination, openings, closingSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.openings = openings;
+        _this.closingSelector = closingSelector;
+        _this.contexts = [];
+        _this.add(_this.openSubscription = subscribeToResult_1.subscribeToResult(_this, openings, openings));
+        return _this;
+    }
+    WindowToggleSubscriber.prototype._next = function (value) {
+        var contexts = this.contexts;
+        if (contexts) {
+            var len = contexts.length;
+            for (var i = 0; i < len; i++) {
+                contexts[i].window.next(value);
+            }
+        }
+    };
+    WindowToggleSubscriber.prototype._error = function (err) {
+        var contexts = this.contexts;
+        this.contexts = null;
+        if (contexts) {
+            var len = contexts.length;
+            var index = -1;
+            while (++index < len) {
+                var context_1 = contexts[index];
+                context_1.window.error(err);
+                context_1.subscription.unsubscribe();
+            }
+        }
+        _super.prototype._error.call(this, err);
+    };
+    WindowToggleSubscriber.prototype._complete = function () {
+        var contexts = this.contexts;
+        this.contexts = null;
+        if (contexts) {
+            var len = contexts.length;
+            var index = -1;
+            while (++index < len) {
+                var context_2 = contexts[index];
+                context_2.window.complete();
+                context_2.subscription.unsubscribe();
+            }
+        }
+        _super.prototype._complete.call(this);
+    };
+    WindowToggleSubscriber.prototype._unsubscribe = function () {
+        var contexts = this.contexts;
+        this.contexts = null;
+        if (contexts) {
+            var len = contexts.length;
+            var index = -1;
+            while (++index < len) {
+                var context_3 = contexts[index];
+                context_3.window.unsubscribe();
+                context_3.subscription.unsubscribe();
+            }
+        }
+    };
+    WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        if (outerValue === this.openings) {
+            var closingNotifier = void 0;
+            try {
+                var closingSelector = this.closingSelector;
+                closingNotifier = closingSelector(innerValue);
+            }
+            catch (e) {
+                return this.error(e);
+            }
+            var window_1 = new Subject_1.Subject();
+            var subscription = new Subscription_1.Subscription();
+            var context_4 = { window: window_1, subscription: subscription };
+            this.contexts.push(context_4);
+            var innerSubscription = subscribeToResult_1.subscribeToResult(this, closingNotifier, context_4);
+            if (innerSubscription.closed) {
+                this.closeWindow(this.contexts.length - 1);
+            }
+            else {
+                innerSubscription.context = context_4;
+                subscription.add(innerSubscription);
+            }
+            this.destination.next(window_1);
+        }
+        else {
+            this.closeWindow(this.contexts.indexOf(outerValue));
+        }
+    };
+    WindowToggleSubscriber.prototype.notifyError = function (err) {
+        this.error(err);
+    };
+    WindowToggleSubscriber.prototype.notifyComplete = function (inner) {
+        if (inner !== this.openSubscription) {
+            this.closeWindow(this.contexts.indexOf(inner.context));
+        }
+    };
+    WindowToggleSubscriber.prototype.closeWindow = function (index) {
+        if (index === -1) {
+            return;
+        }
+        var contexts = this.contexts;
+        var context = contexts[index];
+        var window = context.window, subscription = context.subscription;
+        contexts.splice(index, 1);
+        window.complete();
+        subscription.unsubscribe();
+    };
+    return WindowToggleSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":50,"../Subject":53,"../Subscription":56,"../util/subscribeToResult":239}],185:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subject_1 = require("../Subject");
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function windowWhen(closingSelector) {
+    return function windowWhenOperatorFunction(source) {
+        return source.lift(new WindowOperator(closingSelector));
+    };
+}
+exports.windowWhen = windowWhen;
+var WindowOperator = (function () {
+    function WindowOperator(closingSelector) {
+        this.closingSelector = closingSelector;
+    }
+    WindowOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector));
+    };
+    return WindowOperator;
+}());
+var WindowSubscriber = (function (_super) {
+    __extends(WindowSubscriber, _super);
+    function WindowSubscriber(destination, closingSelector) {
+        var _this = _super.call(this, destination) || this;
+        _this.destination = destination;
+        _this.closingSelector = closingSelector;
+        _this.openWindow();
+        return _this;
+    }
+    WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.openWindow(innerSub);
+    };
+    WindowSubscriber.prototype.notifyError = function (error, innerSub) {
+        this._error(error);
+    };
+    WindowSubscriber.prototype.notifyComplete = function (innerSub) {
+        this.openWindow(innerSub);
+    };
+    WindowSubscriber.prototype._next = function (value) {
+        this.window.next(value);
+    };
+    WindowSubscriber.prototype._error = function (err) {
+        this.window.error(err);
+        this.destination.error(err);
+        this.unsubscribeClosingNotification();
+    };
+    WindowSubscriber.prototype._complete = function () {
+        this.window.complete();
+        this.destination.complete();
+        this.unsubscribeClosingNotification();
+    };
+    WindowSubscriber.prototype.unsubscribeClosingNotification = function () {
+        if (this.closingNotification) {
+            this.closingNotification.unsubscribe();
+        }
+    };
+    WindowSubscriber.prototype.openWindow = function (innerSub) {
+        if (innerSub === void 0) { innerSub = null; }
+        if (innerSub) {
+            this.remove(innerSub);
+            innerSub.unsubscribe();
+        }
+        var prevWindow = this.window;
+        if (prevWindow) {
+            prevWindow.complete();
+        }
+        var window = this.window = new Subject_1.Subject();
+        this.destination.next(window);
+        var closingNotifier;
+        try {
+            var closingSelector = this.closingSelector;
+            closingNotifier = closingSelector();
+        }
+        catch (e) {
+            this.destination.error(e);
+            this.window.error(e);
+            return;
+        }
+        this.add(this.closingNotification = subscribeToResult_1.subscribeToResult(this, closingNotifier));
+    };
+    return WindowSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":50,"../Subject":53,"../util/subscribeToResult":239}],186:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var OuterSubscriber_1 = require("../OuterSubscriber");
+var subscribeToResult_1 = require("../util/subscribeToResult");
+function withLatestFrom() {
+    var args = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        args[_i] = arguments[_i];
+    }
+    return function (source) {
+        var project;
+        if (typeof args[args.length - 1] === 'function') {
+            project = args.pop();
+        }
+        var observables = args;
+        return source.lift(new WithLatestFromOperator(observables, project));
+    };
+}
+exports.withLatestFrom = withLatestFrom;
+var WithLatestFromOperator = (function () {
+    function WithLatestFromOperator(observables, project) {
+        this.observables = observables;
+        this.project = project;
+    }
+    WithLatestFromOperator.prototype.call = function (subscriber, source) {
+        return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));
+    };
+    return WithLatestFromOperator;
+}());
+var WithLatestFromSubscriber = (function (_super) {
+    __extends(WithLatestFromSubscriber, _super);
+    function WithLatestFromSubscriber(destination, observables, project) {
+        var _this = _super.call(this, destination) || this;
+        _this.observables = observables;
+        _this.project = project;
+        _this.toRespond = [];
+        var len = observables.length;
+        _this.values = new Array(len);
+        for (var i = 0; i < len; i++) {
+            _this.toRespond.push(i);
+        }
+        for (var i = 0; i < len; i++) {
+            var observable = observables[i];
+            _this.add(subscribeToResult_1.subscribeToResult(_this, observable, observable, i));
+        }
+        return _this;
+    }
+    WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
+        this.values[outerIndex] = innerValue;
+        var toRespond = this.toRespond;
+        if (toRespond.length > 0) {
+            var found = toRespond.indexOf(outerIndex);
+            if (found !== -1) {
+                toRespond.splice(found, 1);
+            }
+        }
+    };
+    WithLatestFromSubscriber.prototype.notifyComplete = function () {
+    };
+    WithLatestFromSubscriber.prototype._next = function (value) {
+        if (this.toRespond.length === 0) {
+            var args = [value].concat(this.values);
+            if (this.project) {
+                this._tryProject(args);
+            }
+            else {
+                this.destination.next(args);
+            }
+        }
+    };
+    WithLatestFromSubscriber.prototype._tryProject = function (args) {
+        var result;
+        try {
+            result = this.project.apply(this, args);
+        }
+        catch (err) {
+            this.destination.error(err);
+            return;
+        }
+        this.destination.next(result);
+    };
+    return WithLatestFromSubscriber;
+}(OuterSubscriber_1.OuterSubscriber));
+
+},{"../OuterSubscriber":50,"../util/subscribeToResult":239}],187:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var zip_1 = require("../observable/zip");
+function zip() {
+    var observables = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        observables[_i] = arguments[_i];
+    }
+    return function zipOperatorFunction(source) {
+        return source.lift.call(zip_1.zip.apply(void 0, [source].concat(observables)));
+    };
+}
+exports.zip = zip;
+
+},{"../observable/zip":85}],188:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var zip_1 = require("../observable/zip");
+function zipAll(project) {
+    return function (source) { return source.lift(new zip_1.ZipOperator(project)); };
+}
+exports.zipAll = zipAll;
+
+},{"../observable/zip":85}],189:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var Subscription_1 = require("../Subscription");
+function scheduleArray(input, scheduler) {
+    return new Observable_1.Observable(function (subscriber) {
+        var sub = new Subscription_1.Subscription();
+        var i = 0;
+        sub.add(scheduler.schedule(function () {
+            if (i === input.length) {
+                subscriber.complete();
+                return;
+            }
+            subscriber.next(input[i++]);
+            if (!subscriber.closed) {
+                sub.add(this.schedule());
+            }
+        }));
+        return sub;
+    });
+}
+exports.scheduleArray = scheduleArray;
+
+},{"../Observable":48,"../Subscription":56}],190:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var Subscription_1 = require("../Subscription");
+var iterator_1 = require("../symbol/iterator");
+function scheduleIterable(input, scheduler) {
+    if (!input) {
+        throw new Error('Iterable cannot be null');
+    }
+    return new Observable_1.Observable(function (subscriber) {
+        var sub = new Subscription_1.Subscription();
+        var iterator;
+        sub.add(function () {
+            if (iterator && typeof iterator.return === 'function') {
+                iterator.return();
+            }
+        });
+        sub.add(scheduler.schedule(function () {
+            iterator = input[iterator_1.iterator]();
+            sub.add(scheduler.schedule(function () {
+                if (subscriber.closed) {
+                    return;
+                }
+                var value;
+                var done;
+                try {
+                    var result = iterator.next();
+                    value = result.value;
+                    done = result.done;
+                }
+                catch (err) {
+                    subscriber.error(err);
+                    return;
+                }
+                if (done) {
+                    subscriber.complete();
+                }
+                else {
+                    subscriber.next(value);
+                    this.schedule();
+                }
+            }));
+        }));
+        return sub;
+    });
+}
+exports.scheduleIterable = scheduleIterable;
+
+},{"../Observable":48,"../Subscription":56,"../symbol/iterator":208}],191:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var Subscription_1 = require("../Subscription");
+var observable_1 = require("../symbol/observable");
+function scheduleObservable(input, scheduler) {
+    return new Observable_1.Observable(function (subscriber) {
+        var sub = new Subscription_1.Subscription();
+        sub.add(scheduler.schedule(function () {
+            var observable = input[observable_1.observable]();
+            sub.add(observable.subscribe({
+                next: function (value) { sub.add(scheduler.schedule(function () { return subscriber.next(value); })); },
+                error: function (err) { sub.add(scheduler.schedule(function () { return subscriber.error(err); })); },
+                complete: function () { sub.add(scheduler.schedule(function () { return subscriber.complete(); })); },
+            }));
+        }));
+        return sub;
+    });
+}
+exports.scheduleObservable = scheduleObservable;
+
+},{"../Observable":48,"../Subscription":56,"../symbol/observable":209}],192:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+var Subscription_1 = require("../Subscription");
+function schedulePromise(input, scheduler) {
+    return new Observable_1.Observable(function (subscriber) {
+        var sub = new Subscription_1.Subscription();
+        sub.add(scheduler.schedule(function () { return input.then(function (value) {
+            sub.add(scheduler.schedule(function () {
+                subscriber.next(value);
+                sub.add(scheduler.schedule(function () { return subscriber.complete(); }));
+            }));
+        }, function (err) {
+            sub.add(scheduler.schedule(function () { return subscriber.error(err); }));
+        }); }));
+        return sub;
+    });
+}
+exports.schedulePromise = schedulePromise;
+
+},{"../Observable":48,"../Subscription":56}],193:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var scheduleObservable_1 = require("./scheduleObservable");
+var schedulePromise_1 = require("./schedulePromise");
+var scheduleArray_1 = require("./scheduleArray");
+var scheduleIterable_1 = require("./scheduleIterable");
+var isInteropObservable_1 = require("../util/isInteropObservable");
+var isPromise_1 = require("../util/isPromise");
+var isArrayLike_1 = require("../util/isArrayLike");
+var isIterable_1 = require("../util/isIterable");
+function scheduled(input, scheduler) {
+    if (input != null) {
+        if (isInteropObservable_1.isInteropObservable(input)) {
+            return scheduleObservable_1.scheduleObservable(input, scheduler);
+        }
+        else if (isPromise_1.isPromise(input)) {
+            return schedulePromise_1.schedulePromise(input, scheduler);
+        }
+        else if (isArrayLike_1.isArrayLike(input)) {
+            return scheduleArray_1.scheduleArray(input, scheduler);
+        }
+        else if (isIterable_1.isIterable(input) || typeof input === 'string') {
+            return scheduleIterable_1.scheduleIterable(input, scheduler);
+        }
+    }
+    throw new TypeError((input !== null && typeof input || input) + ' is not observable');
+}
+exports.scheduled = scheduled;
+
+},{"../util/isArrayLike":221,"../util/isInteropObservable":224,"../util/isIterable":225,"../util/isPromise":229,"./scheduleArray":189,"./scheduleIterable":190,"./scheduleObservable":191,"./schedulePromise":192}],194:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscription_1 = require("../Subscription");
+var Action = (function (_super) {
+    __extends(Action, _super);
+    function Action(scheduler, work) {
+        return _super.call(this) || this;
+    }
+    Action.prototype.schedule = function (state, delay) {
+        if (delay === void 0) { delay = 0; }
+        return this;
+    };
+    return Action;
+}(Subscription_1.Subscription));
+exports.Action = Action;
+
+},{"../Subscription":56}],195:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsyncAction_1 = require("./AsyncAction");
+var AnimationFrameAction = (function (_super) {
+    __extends(AnimationFrameAction, _super);
+    function AnimationFrameAction(scheduler, work) {
+        var _this = _super.call(this, scheduler, work) || this;
+        _this.scheduler = scheduler;
+        _this.work = work;
+        return _this;
+    }
+    AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        if (delay !== null && delay > 0) {
+            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
+        }
+        scheduler.actions.push(this);
+        return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(function () { return scheduler.flush(null); }));
+    };
+    AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
+            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
+        }
+        if (scheduler.actions.length === 0) {
+            cancelAnimationFrame(id);
+            scheduler.scheduled = undefined;
+        }
+        return undefined;
+    };
+    return AnimationFrameAction;
+}(AsyncAction_1.AsyncAction));
+exports.AnimationFrameAction = AnimationFrameAction;
+
+},{"./AsyncAction":199}],196:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsyncScheduler_1 = require("./AsyncScheduler");
+var AnimationFrameScheduler = (function (_super) {
+    __extends(AnimationFrameScheduler, _super);
+    function AnimationFrameScheduler() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    AnimationFrameScheduler.prototype.flush = function (action) {
+        this.active = true;
+        this.scheduled = undefined;
+        var actions = this.actions;
+        var error;
+        var index = -1;
+        var count = actions.length;
+        action = action || actions.shift();
+        do {
+            if (error = action.execute(action.state, action.delay)) {
+                break;
+            }
+        } while (++index < count && (action = actions.shift()));
+        this.active = false;
+        if (error) {
+            while (++index < count && (action = actions.shift())) {
+                action.unsubscribe();
+            }
+            throw error;
+        }
+    };
+    return AnimationFrameScheduler;
+}(AsyncScheduler_1.AsyncScheduler));
+exports.AnimationFrameScheduler = AnimationFrameScheduler;
+
+},{"./AsyncScheduler":200}],197:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Immediate_1 = require("../util/Immediate");
+var AsyncAction_1 = require("./AsyncAction");
+var AsapAction = (function (_super) {
+    __extends(AsapAction, _super);
+    function AsapAction(scheduler, work) {
+        var _this = _super.call(this, scheduler, work) || this;
+        _this.scheduler = scheduler;
+        _this.work = work;
+        return _this;
+    }
+    AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        if (delay !== null && delay > 0) {
+            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
+        }
+        scheduler.actions.push(this);
+        return scheduler.scheduled || (scheduler.scheduled = Immediate_1.Immediate.setImmediate(scheduler.flush.bind(scheduler, null)));
+    };
+    AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
+            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
+        }
+        if (scheduler.actions.length === 0) {
+            Immediate_1.Immediate.clearImmediate(id);
+            scheduler.scheduled = undefined;
+        }
+        return undefined;
+    };
+    return AsapAction;
+}(AsyncAction_1.AsyncAction));
+exports.AsapAction = AsapAction;
+
+},{"../util/Immediate":213,"./AsyncAction":199}],198:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsyncScheduler_1 = require("./AsyncScheduler");
+var AsapScheduler = (function (_super) {
+    __extends(AsapScheduler, _super);
+    function AsapScheduler() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    AsapScheduler.prototype.flush = function (action) {
+        this.active = true;
+        this.scheduled = undefined;
+        var actions = this.actions;
+        var error;
+        var index = -1;
+        var count = actions.length;
+        action = action || actions.shift();
+        do {
+            if (error = action.execute(action.state, action.delay)) {
+                break;
+            }
+        } while (++index < count && (action = actions.shift()));
+        this.active = false;
+        if (error) {
+            while (++index < count && (action = actions.shift())) {
+                action.unsubscribe();
+            }
+            throw error;
+        }
+    };
+    return AsapScheduler;
+}(AsyncScheduler_1.AsyncScheduler));
+exports.AsapScheduler = AsapScheduler;
+
+},{"./AsyncScheduler":200}],199:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Action_1 = require("./Action");
+var AsyncAction = (function (_super) {
+    __extends(AsyncAction, _super);
+    function AsyncAction(scheduler, work) {
+        var _this = _super.call(this, scheduler, work) || this;
+        _this.scheduler = scheduler;
+        _this.work = work;
+        _this.pending = false;
+        return _this;
+    }
+    AsyncAction.prototype.schedule = function (state, delay) {
+        if (delay === void 0) { delay = 0; }
+        if (this.closed) {
+            return this;
+        }
+        this.state = state;
+        var id = this.id;
+        var scheduler = this.scheduler;
+        if (id != null) {
+            this.id = this.recycleAsyncId(scheduler, id, delay);
+        }
+        this.pending = true;
+        this.delay = delay;
+        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
+        return this;
+    };
+    AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        return setInterval(scheduler.flush.bind(scheduler, this), delay);
+    };
+    AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        if (delay !== null && this.delay === delay && this.pending === false) {
+            return id;
+        }
+        clearInterval(id);
+        return undefined;
+    };
+    AsyncAction.prototype.execute = function (state, delay) {
+        if (this.closed) {
+            return new Error('executing a cancelled action');
+        }
+        this.pending = false;
+        var error = this._execute(state, delay);
+        if (error) {
+            return error;
+        }
+        else if (this.pending === false && this.id != null) {
+            this.id = this.recycleAsyncId(this.scheduler, this.id, null);
+        }
+    };
+    AsyncAction.prototype._execute = function (state, delay) {
+        var errored = false;
+        var errorValue = undefined;
+        try {
+            this.work(state);
+        }
+        catch (e) {
+            errored = true;
+            errorValue = !!e && e || new Error(e);
+        }
+        if (errored) {
+            this.unsubscribe();
+            return errorValue;
+        }
+    };
+    AsyncAction.prototype._unsubscribe = function () {
+        var id = this.id;
+        var scheduler = this.scheduler;
+        var actions = scheduler.actions;
+        var index = actions.indexOf(this);
+        this.work = null;
+        this.state = null;
+        this.pending = false;
+        this.scheduler = null;
+        if (index !== -1) {
+            actions.splice(index, 1);
+        }
+        if (id != null) {
+            this.id = this.recycleAsyncId(scheduler, id, null);
+        }
+        this.delay = null;
+    };
+    return AsyncAction;
+}(Action_1.Action));
+exports.AsyncAction = AsyncAction;
+
+},{"./Action":194}],200:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var Scheduler_1 = require("../Scheduler");
+var AsyncScheduler = (function (_super) {
+    __extends(AsyncScheduler, _super);
+    function AsyncScheduler(SchedulerAction, now) {
+        if (now === void 0) { now = Scheduler_1.Scheduler.now; }
+        var _this = _super.call(this, SchedulerAction, function () {
+            if (AsyncScheduler.delegate && AsyncScheduler.delegate !== _this) {
+                return AsyncScheduler.delegate.now();
+            }
+            else {
+                return now();
+            }
+        }) || this;
+        _this.actions = [];
+        _this.active = false;
+        _this.scheduled = undefined;
+        return _this;
+    }
+    AsyncScheduler.prototype.schedule = function (work, delay, state) {
+        if (delay === void 0) { delay = 0; }
+        if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {
+            return AsyncScheduler.delegate.schedule(work, delay, state);
+        }
+        else {
+            return _super.prototype.schedule.call(this, work, delay, state);
+        }
+    };
+    AsyncScheduler.prototype.flush = function (action) {
+        var actions = this.actions;
+        if (this.active) {
+            actions.push(action);
+            return;
+        }
+        var error;
+        this.active = true;
+        do {
+            if (error = action.execute(action.state, action.delay)) {
+                break;
+            }
+        } while (action = actions.shift());
+        this.active = false;
+        if (error) {
+            while (action = actions.shift()) {
+                action.unsubscribe();
+            }
+            throw error;
+        }
+    };
+    return AsyncScheduler;
+}(Scheduler_1.Scheduler));
+exports.AsyncScheduler = AsyncScheduler;
+
+},{"../Scheduler":52}],201:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsyncAction_1 = require("./AsyncAction");
+var QueueAction = (function (_super) {
+    __extends(QueueAction, _super);
+    function QueueAction(scheduler, work) {
+        var _this = _super.call(this, scheduler, work) || this;
+        _this.scheduler = scheduler;
+        _this.work = work;
+        return _this;
+    }
+    QueueAction.prototype.schedule = function (state, delay) {
+        if (delay === void 0) { delay = 0; }
+        if (delay > 0) {
+            return _super.prototype.schedule.call(this, state, delay);
+        }
+        this.delay = delay;
+        this.state = state;
+        this.scheduler.flush(this);
+        return this;
+    };
+    QueueAction.prototype.execute = function (state, delay) {
+        return (delay > 0 || this.closed) ?
+            _super.prototype.execute.call(this, state, delay) :
+            this._execute(state, delay);
+    };
+    QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
+            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
+        }
+        return scheduler.flush(this);
+    };
+    return QueueAction;
+}(AsyncAction_1.AsyncAction));
+exports.QueueAction = QueueAction;
+
+},{"./AsyncAction":199}],202:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsyncScheduler_1 = require("./AsyncScheduler");
+var QueueScheduler = (function (_super) {
+    __extends(QueueScheduler, _super);
+    function QueueScheduler() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    return QueueScheduler;
+}(AsyncScheduler_1.AsyncScheduler));
+exports.QueueScheduler = QueueScheduler;
+
+},{"./AsyncScheduler":200}],203:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    }
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsyncAction_1 = require("./AsyncAction");
+var AsyncScheduler_1 = require("./AsyncScheduler");
+var VirtualTimeScheduler = (function (_super) {
+    __extends(VirtualTimeScheduler, _super);
+    function VirtualTimeScheduler(SchedulerAction, maxFrames) {
+        if (SchedulerAction === void 0) { SchedulerAction = VirtualAction; }
+        if (maxFrames === void 0) { maxFrames = Number.POSITIVE_INFINITY; }
+        var _this = _super.call(this, SchedulerAction, function () { return _this.frame; }) || this;
+        _this.maxFrames = maxFrames;
+        _this.frame = 0;
+        _this.index = -1;
+        return _this;
+    }
+    VirtualTimeScheduler.prototype.flush = function () {
+        var _a = this, actions = _a.actions, maxFrames = _a.maxFrames;
+        var error, action;
+        while ((action = actions[0]) && action.delay <= maxFrames) {
+            actions.shift();
+            this.frame = action.delay;
+            if (error = action.execute(action.state, action.delay)) {
+                break;
+            }
+        }
+        if (error) {
+            while (action = actions.shift()) {
+                action.unsubscribe();
+            }
+            throw error;
+        }
+    };
+    VirtualTimeScheduler.frameTimeFactor = 10;
+    return VirtualTimeScheduler;
+}(AsyncScheduler_1.AsyncScheduler));
+exports.VirtualTimeScheduler = VirtualTimeScheduler;
+var VirtualAction = (function (_super) {
+    __extends(VirtualAction, _super);
+    function VirtualAction(scheduler, work, index) {
+        if (index === void 0) { index = scheduler.index += 1; }
+        var _this = _super.call(this, scheduler, work) || this;
+        _this.scheduler = scheduler;
+        _this.work = work;
+        _this.index = index;
+        _this.active = true;
+        _this.index = scheduler.index = index;
+        return _this;
+    }
+    VirtualAction.prototype.schedule = function (state, delay) {
+        if (delay === void 0) { delay = 0; }
+        if (!this.id) {
+            return _super.prototype.schedule.call(this, state, delay);
+        }
+        this.active = false;
+        var action = new VirtualAction(this.scheduler, this.work);
+        this.add(action);
+        return action.schedule(state, delay);
+    };
+    VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        this.delay = scheduler.frame + delay;
+        var actions = scheduler.actions;
+        actions.push(this);
+        actions.sort(VirtualAction.sortActions);
+        return true;
+    };
+    VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
+        if (delay === void 0) { delay = 0; }
+        return undefined;
+    };
+    VirtualAction.prototype._execute = function (state, delay) {
+        if (this.active === true) {
+            return _super.prototype._execute.call(this, state, delay);
+        }
+    };
+    VirtualAction.sortActions = function (a, b) {
+        if (a.delay === b.delay) {
+            if (a.index === b.index) {
+                return 0;
+            }
+            else if (a.index > b.index) {
+                return 1;
+            }
+            else {
+                return -1;
+            }
+        }
+        else if (a.delay > b.delay) {
+            return 1;
+        }
+        else {
+            return -1;
+        }
+    };
+    return VirtualAction;
+}(AsyncAction_1.AsyncAction));
+exports.VirtualAction = VirtualAction;
+
+},{"./AsyncAction":199,"./AsyncScheduler":200}],204:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var AnimationFrameAction_1 = require("./AnimationFrameAction");
+var AnimationFrameScheduler_1 = require("./AnimationFrameScheduler");
+exports.animationFrame = new AnimationFrameScheduler_1.AnimationFrameScheduler(AnimationFrameAction_1.AnimationFrameAction);
+
+},{"./AnimationFrameAction":195,"./AnimationFrameScheduler":196}],205:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsapAction_1 = require("./AsapAction");
+var AsapScheduler_1 = require("./AsapScheduler");
+exports.asap = new AsapScheduler_1.AsapScheduler(AsapAction_1.AsapAction);
+
+},{"./AsapAction":197,"./AsapScheduler":198}],206:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var AsyncAction_1 = require("./AsyncAction");
+var AsyncScheduler_1 = require("./AsyncScheduler");
+exports.async = new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction);
+
+},{"./AsyncAction":199,"./AsyncScheduler":200}],207:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var QueueAction_1 = require("./QueueAction");
+var QueueScheduler_1 = require("./QueueScheduler");
+exports.queue = new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction);
+
+},{"./QueueAction":201,"./QueueScheduler":202}],208:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function getSymbolIterator() {
+    if (typeof Symbol !== 'function' || !Symbol.iterator) {
+        return '@@iterator';
+    }
+    return Symbol.iterator;
+}
+exports.getSymbolIterator = getSymbolIterator;
+exports.iterator = getSymbolIterator();
+exports.$$iterator = exports.iterator;
+
+},{}],209:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.observable = (function () { return typeof Symbol === 'function' && Symbol.observable || '@@observable'; })();
+
+},{}],210:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.rxSubscriber = (function () {
+    return typeof Symbol === 'function'
+        ? Symbol('rxSubscriber')
+        : '@@rxSubscriber_' + Math.random();
+})();
+exports.$$rxSubscriber = exports.rxSubscriber;
+
+},{}],211:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var ArgumentOutOfRangeErrorImpl = (function () {
+    function ArgumentOutOfRangeErrorImpl() {
+        Error.call(this);
+        this.message = 'argument out of range';
+        this.name = 'ArgumentOutOfRangeError';
+        return this;
+    }
+    ArgumentOutOfRangeErrorImpl.prototype = Object.create(Error.prototype);
+    return ArgumentOutOfRangeErrorImpl;
+})();
+exports.ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl;
+
+},{}],212:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var EmptyErrorImpl = (function () {
+    function EmptyErrorImpl() {
+        Error.call(this);
+        this.message = 'no elements in sequence';
+        this.name = 'EmptyError';
+        return this;
+    }
+    EmptyErrorImpl.prototype = Object.create(Error.prototype);
+    return EmptyErrorImpl;
+})();
+exports.EmptyError = EmptyErrorImpl;
+
+},{}],213:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var nextHandle = 1;
+var RESOLVED = (function () { return Promise.resolve(); })();
+var activeHandles = {};
+function findAndClearHandle(handle) {
+    if (handle in activeHandles) {
+        delete activeHandles[handle];
+        return true;
+    }
+    return false;
+}
+exports.Immediate = {
+    setImmediate: function (cb) {
+        var handle = nextHandle++;
+        activeHandles[handle] = true;
+        RESOLVED.then(function () { return findAndClearHandle(handle) && cb(); });
+        return handle;
+    },
+    clearImmediate: function (handle) {
+        findAndClearHandle(handle);
+    },
+};
+exports.TestTools = {
+    pending: function () {
+        return Object.keys(activeHandles).length;
+    }
+};
+
+},{}],214:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var ObjectUnsubscribedErrorImpl = (function () {
+    function ObjectUnsubscribedErrorImpl() {
+        Error.call(this);
+        this.message = 'object unsubscribed';
+        this.name = 'ObjectUnsubscribedError';
+        return this;
+    }
+    ObjectUnsubscribedErrorImpl.prototype = Object.create(Error.prototype);
+    return ObjectUnsubscribedErrorImpl;
+})();
+exports.ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl;
+
+},{}],215:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var TimeoutErrorImpl = (function () {
+    function TimeoutErrorImpl() {
+        Error.call(this);
+        this.message = 'Timeout has occurred';
+        this.name = 'TimeoutError';
+        return this;
+    }
+    TimeoutErrorImpl.prototype = Object.create(Error.prototype);
+    return TimeoutErrorImpl;
+})();
+exports.TimeoutError = TimeoutErrorImpl;
+
+},{}],216:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var UnsubscriptionErrorImpl = (function () {
+    function UnsubscriptionErrorImpl(errors) {
+        Error.call(this);
+        this.message = errors ?
+            errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return i + 1 + ") " + err.toString(); }).join('\n  ') : '';
+        this.name = 'UnsubscriptionError';
+        this.errors = errors;
+        return this;
+    }
+    UnsubscriptionErrorImpl.prototype = Object.create(Error.prototype);
+    return UnsubscriptionErrorImpl;
+})();
+exports.UnsubscriptionError = UnsubscriptionErrorImpl;
+
+},{}],217:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+function canReportError(observer) {
+    while (observer) {
+        var _a = observer, closed_1 = _a.closed, destination = _a.destination, isStopped = _a.isStopped;
+        if (closed_1 || isStopped) {
+            return false;
+        }
+        else if (destination && destination instanceof Subscriber_1.Subscriber) {
+            observer = destination;
+        }
+        else {
+            observer = null;
+        }
+    }
+    return true;
+}
+exports.canReportError = canReportError;
+
+},{"../Subscriber":55}],218:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function hostReportError(err) {
+    setTimeout(function () { throw err; }, 0);
+}
+exports.hostReportError = hostReportError;
+
+},{}],219:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function identity(x) {
+    return x;
+}
+exports.identity = identity;
+
+},{}],220:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isArray = (function () { return Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); })();
+
+},{}],221:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });
+
+},{}],222:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function isDate(value) {
+    return value instanceof Date && !isNaN(+value);
+}
+exports.isDate = isDate;
+
+},{}],223:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function isFunction(x) {
+    return typeof x === 'function';
+}
+exports.isFunction = isFunction;
+
+},{}],224:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var observable_1 = require("../symbol/observable");
+function isInteropObservable(input) {
+    return input && typeof input[observable_1.observable] === 'function';
+}
+exports.isInteropObservable = isInteropObservable;
+
+},{"../symbol/observable":209}],225:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var iterator_1 = require("../symbol/iterator");
+function isIterable(input) {
+    return input && typeof input[iterator_1.iterator] === 'function';
+}
+exports.isIterable = isIterable;
+
+},{"../symbol/iterator":208}],226:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var isArray_1 = require("./isArray");
+function isNumeric(val) {
+    return !isArray_1.isArray(val) && (val - parseFloat(val) + 1) >= 0;
+}
+exports.isNumeric = isNumeric;
+
+},{"./isArray":220}],227:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function isObject(x) {
+    return x !== null && typeof x === 'object';
+}
+exports.isObject = isObject;
+
+},{}],228:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Observable_1 = require("../Observable");
+function isObservable(obj) {
+    return !!obj && (obj instanceof Observable_1.Observable || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function'));
+}
+exports.isObservable = isObservable;
+
+},{"../Observable":48}],229:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function isPromise(value) {
+    return !!value && typeof value.subscribe !== 'function' && typeof value.then === 'function';
+}
+exports.isPromise = isPromise;
+
+},{}],230:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function isScheduler(value) {
+    return value && typeof value.schedule === 'function';
+}
+exports.isScheduler = isScheduler;
+
+},{}],231:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function noop() { }
+exports.noop = noop;
+
+},{}],232:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function not(pred, thisArg) {
+    function notPred() {
+        return !(notPred.pred.apply(notPred.thisArg, arguments));
+    }
+    notPred.pred = pred;
+    notPred.thisArg = thisArg;
+    return notPred;
+}
+exports.not = not;
+
+},{}],233:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var identity_1 = require("./identity");
+function pipe() {
+    var fns = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+        fns[_i] = arguments[_i];
+    }
+    return pipeFromArray(fns);
+}
+exports.pipe = pipe;
+function pipeFromArray(fns) {
+    if (fns.length === 0) {
+        return identity_1.identity;
+    }
+    if (fns.length === 1) {
+        return fns[0];
+    }
+    return function piped(input) {
+        return fns.reduce(function (prev, fn) { return fn(prev); }, input);
+    };
+}
+exports.pipeFromArray = pipeFromArray;
+
+},{"./identity":219}],234:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var subscribeToArray_1 = require("./subscribeToArray");
+var subscribeToPromise_1 = require("./subscribeToPromise");
+var subscribeToIterable_1 = require("./subscribeToIterable");
+var subscribeToObservable_1 = require("./subscribeToObservable");
+var isArrayLike_1 = require("./isArrayLike");
+var isPromise_1 = require("./isPromise");
+var isObject_1 = require("./isObject");
+var iterator_1 = require("../symbol/iterator");
+var observable_1 = require("../symbol/observable");
+exports.subscribeTo = function (result) {
+    if (!!result && typeof result[observable_1.observable] === 'function') {
+        return subscribeToObservable_1.subscribeToObservable(result);
+    }
+    else if (isArrayLike_1.isArrayLike(result)) {
+        return subscribeToArray_1.subscribeToArray(result);
+    }
+    else if (isPromise_1.isPromise(result)) {
+        return subscribeToPromise_1.subscribeToPromise(result);
+    }
+    else if (!!result && typeof result[iterator_1.iterator] === 'function') {
+        return subscribeToIterable_1.subscribeToIterable(result);
+    }
+    else {
+        var value = isObject_1.isObject(result) ? 'an invalid object' : "'" + result + "'";
+        var msg = "You provided " + value + " where a stream was expected."
+            + ' You can provide an Observable, Promise, Array, or Iterable.';
+        throw new TypeError(msg);
+    }
+};
+
+},{"../symbol/iterator":208,"../symbol/observable":209,"./isArrayLike":221,"./isObject":227,"./isPromise":229,"./subscribeToArray":235,"./subscribeToIterable":236,"./subscribeToObservable":237,"./subscribeToPromise":238}],235:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.subscribeToArray = function (array) { return function (subscriber) {
+    for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) {
+        subscriber.next(array[i]);
+    }
+    subscriber.complete();
+}; };
+
+},{}],236:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var iterator_1 = require("../symbol/iterator");
+exports.subscribeToIterable = function (iterable) { return function (subscriber) {
+    var iterator = iterable[iterator_1.iterator]();
+    do {
+        var item = iterator.next();
+        if (item.done) {
+            subscriber.complete();
+            break;
+        }
+        subscriber.next(item.value);
+        if (subscriber.closed) {
+            break;
+        }
+    } while (true);
+    if (typeof iterator.return === 'function') {
+        subscriber.add(function () {
+            if (iterator.return) {
+                iterator.return();
+            }
+        });
+    }
+    return subscriber;
+}; };
+
+},{"../symbol/iterator":208}],237:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var observable_1 = require("../symbol/observable");
+exports.subscribeToObservable = function (obj) { return function (subscriber) {
+    var obs = obj[observable_1.observable]();
+    if (typeof obs.subscribe !== 'function') {
+        throw new TypeError('Provided object does not correctly implement Symbol.observable');
+    }
+    else {
+        return obs.subscribe(subscriber);
+    }
+}; };
+
+},{"../symbol/observable":209}],238:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var hostReportError_1 = require("./hostReportError");
+exports.subscribeToPromise = function (promise) { return function (subscriber) {
+    promise.then(function (value) {
+        if (!subscriber.closed) {
+            subscriber.next(value);
+            subscriber.complete();
+        }
+    }, function (err) { return subscriber.error(err); })
+        .then(null, hostReportError_1.hostReportError);
+    return subscriber;
+}; };
+
+},{"./hostReportError":218}],239:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var InnerSubscriber_1 = require("../InnerSubscriber");
+var subscribeTo_1 = require("./subscribeTo");
+var Observable_1 = require("../Observable");
+function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, innerSubscriber) {
+    if (innerSubscriber === void 0) { innerSubscriber = new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex); }
+    if (innerSubscriber.closed) {
+        return undefined;
+    }
+    if (result instanceof Observable_1.Observable) {
+        return result.subscribe(innerSubscriber);
+    }
+    return subscribeTo_1.subscribeTo(result)(innerSubscriber);
+}
+exports.subscribeToResult = subscribeToResult;
+
+},{"../InnerSubscriber":46,"../Observable":48,"./subscribeTo":234}],240:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Subscriber_1 = require("../Subscriber");
+var rxSubscriber_1 = require("../symbol/rxSubscriber");
+var Observer_1 = require("../Observer");
+function toSubscriber(nextOrObserver, error, complete) {
+    if (nextOrObserver) {
+        if (nextOrObserver instanceof Subscriber_1.Subscriber) {
+            return nextOrObserver;
+        }
+        if (nextOrObserver[rxSubscriber_1.rxSubscriber]) {
+            return nextOrObserver[rxSubscriber_1.rxSubscriber]();
+        }
+    }
+    if (!nextOrObserver && !error && !complete) {
+        return new Subscriber_1.Subscriber(Observer_1.empty);
+    }
+    return new Subscriber_1.Subscriber(nextOrObserver, error, complete);
+}
+exports.toSubscriber = toSubscriber;
+
+},{"../Observer":49,"../Subscriber":55,"../symbol/rxSubscriber":210}],241:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var audit_1 = require("../internal/operators/audit");
+exports.audit = audit_1.audit;
+var auditTime_1 = require("../internal/operators/auditTime");
+exports.auditTime = auditTime_1.auditTime;
+var buffer_1 = require("../internal/operators/buffer");
+exports.buffer = buffer_1.buffer;
+var bufferCount_1 = require("../internal/operators/bufferCount");
+exports.bufferCount = bufferCount_1.bufferCount;
+var bufferTime_1 = require("../internal/operators/bufferTime");
+exports.bufferTime = bufferTime_1.bufferTime;
+var bufferToggle_1 = require("../internal/operators/bufferToggle");
+exports.bufferToggle = bufferToggle_1.bufferToggle;
+var bufferWhen_1 = require("../internal/operators/bufferWhen");
+exports.bufferWhen = bufferWhen_1.bufferWhen;
+var catchError_1 = require("../internal/operators/catchError");
+exports.catchError = catchError_1.catchError;
+var combineAll_1 = require("../internal/operators/combineAll");
+exports.combineAll = combineAll_1.combineAll;
+var combineLatest_1 = require("../internal/operators/combineLatest");
+exports.combineLatest = combineLatest_1.combineLatest;
+var concat_1 = require("../internal/operators/concat");
+exports.concat = concat_1.concat;
+var concatAll_1 = require("../internal/operators/concatAll");
+exports.concatAll = concatAll_1.concatAll;
+var concatMap_1 = require("../internal/operators/concatMap");
+exports.concatMap = concatMap_1.concatMap;
+var concatMapTo_1 = require("../internal/operators/concatMapTo");
+exports.concatMapTo = concatMapTo_1.concatMapTo;
+var count_1 = require("../internal/operators/count");
+exports.count = count_1.count;
+var debounce_1 = require("../internal/operators/debounce");
+exports.debounce = debounce_1.debounce;
+var debounceTime_1 = require("../internal/operators/debounceTime");
+exports.debounceTime = debounceTime_1.debounceTime;
+var defaultIfEmpty_1 = require("../internal/operators/defaultIfEmpty");
+exports.defaultIfEmpty = defaultIfEmpty_1.defaultIfEmpty;
+var delay_1 = require("../internal/operators/delay");
+exports.delay = delay_1.delay;
+var delayWhen_1 = require("../internal/operators/delayWhen");
+exports.delayWhen = delayWhen_1.delayWhen;
+var dematerialize_1 = require("../internal/operators/dematerialize");
+exports.dematerialize = dematerialize_1.dematerialize;
+var distinct_1 = require("../internal/operators/distinct");
+exports.distinct = distinct_1.distinct;
+var distinctUntilChanged_1 = require("../internal/operators/distinctUntilChanged");
+exports.distinctUntilChanged = distinctUntilChanged_1.distinctUntilChanged;
+var distinctUntilKeyChanged_1 = require("../internal/operators/distinctUntilKeyChanged");
+exports.distinctUntilKeyChanged = distinctUntilKeyChanged_1.distinctUntilKeyChanged;
+var elementAt_1 = require("../internal/operators/elementAt");
+exports.elementAt = elementAt_1.elementAt;
+var endWith_1 = require("../internal/operators/endWith");
+exports.endWith = endWith_1.endWith;
+var every_1 = require("../internal/operators/every");
+exports.every = every_1.every;
+var exhaust_1 = require("../internal/operators/exhaust");
+exports.exhaust = exhaust_1.exhaust;
+var exhaustMap_1 = require("../internal/operators/exhaustMap");
+exports.exhaustMap = exhaustMap_1.exhaustMap;
+var expand_1 = require("../internal/operators/expand");
+exports.expand = expand_1.expand;
+var filter_1 = require("../internal/operators/filter");
+exports.filter = filter_1.filter;
+var finalize_1 = require("../internal/operators/finalize");
+exports.finalize = finalize_1.finalize;
+var find_1 = require("../internal/operators/find");
+exports.find = find_1.find;
+var findIndex_1 = require("../internal/operators/findIndex");
+exports.findIndex = findIndex_1.findIndex;
+var first_1 = require("../internal/operators/first");
+exports.first = first_1.first;
+var groupBy_1 = require("../internal/operators/groupBy");
+exports.groupBy = groupBy_1.groupBy;
+var ignoreElements_1 = require("../internal/operators/ignoreElements");
+exports.ignoreElements = ignoreElements_1.ignoreElements;
+var isEmpty_1 = require("../internal/operators/isEmpty");
+exports.isEmpty = isEmpty_1.isEmpty;
+var last_1 = require("../internal/operators/last");
+exports.last = last_1.last;
+var map_1 = require("../internal/operators/map");
+exports.map = map_1.map;
+var mapTo_1 = require("../internal/operators/mapTo");
+exports.mapTo = mapTo_1.mapTo;
+var materialize_1 = require("../internal/operators/materialize");
+exports.materialize = materialize_1.materialize;
+var max_1 = require("../internal/operators/max");
+exports.max = max_1.max;
+var merge_1 = require("../internal/operators/merge");
+exports.merge = merge_1.merge;
+var mergeAll_1 = require("../internal/operators/mergeAll");
+exports.mergeAll = mergeAll_1.mergeAll;
+var mergeMap_1 = require("../internal/operators/mergeMap");
+exports.mergeMap = mergeMap_1.mergeMap;
+var mergeMap_2 = require("../internal/operators/mergeMap");
+exports.flatMap = mergeMap_2.mergeMap;
+var mergeMapTo_1 = require("../internal/operators/mergeMapTo");
+exports.mergeMapTo = mergeMapTo_1.mergeMapTo;
+var mergeScan_1 = require("../internal/operators/mergeScan");
+exports.mergeScan = mergeScan_1.mergeScan;
+var min_1 = require("../internal/operators/min");
+exports.min = min_1.min;
+var multicast_1 = require("../internal/operators/multicast");
+exports.multicast = multicast_1.multicast;
+var observeOn_1 = require("../internal/operators/observeOn");
+exports.observeOn = observeOn_1.observeOn;
+var onErrorResumeNext_1 = require("../internal/operators/onErrorResumeNext");
+exports.onErrorResumeNext = onErrorResumeNext_1.onErrorResumeNext;
+var pairwise_1 = require("../internal/operators/pairwise");
+exports.pairwise = pairwise_1.pairwise;
+var partition_1 = require("../internal/operators/partition");
+exports.partition = partition_1.partition;
+var pluck_1 = require("../internal/operators/pluck");
+exports.pluck = pluck_1.pluck;
+var publish_1 = require("../internal/operators/publish");
+exports.publish = publish_1.publish;
+var publishBehavior_1 = require("../internal/operators/publishBehavior");
+exports.publishBehavior = publishBehavior_1.publishBehavior;
+var publishLast_1 = require("../internal/operators/publishLast");
+exports.publishLast = publishLast_1.publishLast;
+var publishReplay_1 = require("../internal/operators/publishReplay");
+exports.publishReplay = publishReplay_1.publishReplay;
+var race_1 = require("../internal/operators/race");
+exports.race = race_1.race;
+var reduce_1 = require("../internal/operators/reduce");
+exports.reduce = reduce_1.reduce;
+var repeat_1 = require("../internal/operators/repeat");
+exports.repeat = repeat_1.repeat;
+var repeatWhen_1 = require("../internal/operators/repeatWhen");
+exports.repeatWhen = repeatWhen_1.repeatWhen;
+var retry_1 = require("../internal/operators/retry");
+exports.retry = retry_1.retry;
+var retryWhen_1 = require("../internal/operators/retryWhen");
+exports.retryWhen = retryWhen_1.retryWhen;
+var refCount_1 = require("../internal/operators/refCount");
+exports.refCount = refCount_1.refCount;
+var sample_1 = require("../internal/operators/sample");
+exports.sample = sample_1.sample;
+var sampleTime_1 = require("../internal/operators/sampleTime");
+exports.sampleTime = sampleTime_1.sampleTime;
+var scan_1 = require("../internal/operators/scan");
+exports.scan = scan_1.scan;
+var sequenceEqual_1 = require("../internal/operators/sequenceEqual");
+exports.sequenceEqual = sequenceEqual_1.sequenceEqual;
+var share_1 = require("../internal/operators/share");
+exports.share = share_1.share;
+var shareReplay_1 = require("../internal/operators/shareReplay");
+exports.shareReplay = shareReplay_1.shareReplay;
+var single_1 = require("../internal/operators/single");
+exports.single = single_1.single;
+var skip_1 = require("../internal/operators/skip");
+exports.skip = skip_1.skip;
+var skipLast_1 = require("../internal/operators/skipLast");
+exports.skipLast = skipLast_1.skipLast;
+var skipUntil_1 = require("../internal/operators/skipUntil");
+exports.skipUntil = skipUntil_1.skipUntil;
+var skipWhile_1 = require("../internal/operators/skipWhile");
+exports.skipWhile = skipWhile_1.skipWhile;
+var startWith_1 = require("../internal/operators/startWith");
+exports.startWith = startWith_1.startWith;
+var subscribeOn_1 = require("../internal/operators/subscribeOn");
+exports.subscribeOn = subscribeOn_1.subscribeOn;
+var switchAll_1 = require("../internal/operators/switchAll");
+exports.switchAll = switchAll_1.switchAll;
+var switchMap_1 = require("../internal/operators/switchMap");
+exports.switchMap = switchMap_1.switchMap;
+var switchMapTo_1 = require("../internal/operators/switchMapTo");
+exports.switchMapTo = switchMapTo_1.switchMapTo;
+var take_1 = require("../internal/operators/take");
+exports.take = take_1.take;
+var takeLast_1 = require("../internal/operators/takeLast");
+exports.takeLast = takeLast_1.takeLast;
+var takeUntil_1 = require("../internal/operators/takeUntil");
+exports.takeUntil = takeUntil_1.takeUntil;
+var takeWhile_1 = require("../internal/operators/takeWhile");
+exports.takeWhile = takeWhile_1.takeWhile;
+var tap_1 = require("../internal/operators/tap");
+exports.tap = tap_1.tap;
+var throttle_1 = require("../internal/operators/throttle");
+exports.throttle = throttle_1.throttle;
+var throttleTime_1 = require("../internal/operators/throttleTime");
+exports.throttleTime = throttleTime_1.throttleTime;
+var throwIfEmpty_1 = require("../internal/operators/throwIfEmpty");
+exports.throwIfEmpty = throwIfEmpty_1.throwIfEmpty;
+var timeInterval_1 = require("../internal/operators/timeInterval");
+exports.timeInterval = timeInterval_1.timeInterval;
+var timeout_1 = require("../internal/operators/timeout");
+exports.timeout = timeout_1.timeout;
+var timeoutWith_1 = require("../internal/operators/timeoutWith");
+exports.timeoutWith = timeoutWith_1.timeoutWith;
+var timestamp_1 = require("../internal/operators/timestamp");
+exports.timestamp = timestamp_1.timestamp;
+var toArray_1 = require("../internal/operators/toArray");
+exports.toArray = toArray_1.toArray;
+var window_1 = require("../internal/operators/window");
+exports.window = window_1.window;
+var windowCount_1 = require("../internal/operators/windowCount");
+exports.windowCount = windowCount_1.windowCount;
+var windowTime_1 = require("../internal/operators/windowTime");
+exports.windowTime = windowTime_1.windowTime;
+var windowToggle_1 = require("../internal/operators/windowToggle");
+exports.windowToggle = windowToggle_1.windowToggle;
+var windowWhen_1 = require("../internal/operators/windowWhen");
+exports.windowWhen = windowWhen_1.windowWhen;
+var withLatestFrom_1 = require("../internal/operators/withLatestFrom");
+exports.withLatestFrom = withLatestFrom_1.withLatestFrom;
+var zip_1 = require("../internal/operators/zip");
+exports.zip = zip_1.zip;
+var zipAll_1 = require("../internal/operators/zipAll");
+exports.zipAll = zipAll_1.zipAll;
+
+},{"../internal/operators/audit":86,"../internal/operators/auditTime":87,"../internal/operators/buffer":88,"../internal/operators/bufferCount":89,"../internal/operators/bufferTime":90,"../internal/operators/bufferToggle":91,"../internal/operators/bufferWhen":92,"../internal/operators/catchError":93,"../internal/operators/combineAll":94,"../internal/operators/combineLatest":95,"../internal/operators/concat":96,"../internal/operators/concatAll":97,"../internal/operators/concatMap":98,"../internal/operators/concatMapTo":99,"../internal/operators/count":100,"../internal/operators/debounce":101,"../internal/operators/debounceTime":102,"../internal/operators/defaultIfEmpty":103,"../internal/operators/delay":104,"../internal/operators/delayWhen":105,"../internal/operators/dematerialize":106,"../internal/operators/distinct":107,"../internal/operators/distinctUntilChanged":108,"../internal/operators/distinctUntilKeyChanged":109,"../internal/operators/elementAt":110,"../internal/operators/endWith":111,"../internal/operators/every":112,"../internal/operators/exhaust":113,"../internal/operators/exhaustMap":114,"../internal/operators/expand":115,"../internal/operators/filter":116,"../internal/operators/finalize":117,"../internal/operators/find":118,"../internal/operators/findIndex":119,"../internal/operators/first":120,"../internal/operators/groupBy":121,"../internal/operators/ignoreElements":122,"../internal/operators/isEmpty":123,"../internal/operators/last":124,"../internal/operators/map":125,"../internal/operators/mapTo":126,"../internal/operators/materialize":127,"../internal/operators/max":128,"../internal/operators/merge":129,"../internal/operators/mergeAll":130,"../internal/operators/mergeMap":131,"../internal/operators/mergeMapTo":132,"../internal/operators/mergeScan":133,"../internal/operators/min":134,"../internal/operators/multicast":135,"../internal/operators/observeOn":136,"../internal/operators/onErrorResumeNext":137,"../internal/operators/pairwise":138,"../internal/operators/partition":139,"../internal/operators/pluck":140,"../internal/operators/publish":141,"../internal/operators/publishBehavior":142,"../internal/operators/publishLast":143,"../internal/operators/publishReplay":144,"../internal/operators/race":145,"../internal/operators/reduce":146,"../internal/operators/refCount":147,"../internal/operators/repeat":148,"../internal/operators/repeatWhen":149,"../internal/operators/retry":150,"../internal/operators/retryWhen":151,"../internal/operators/sample":152,"../internal/operators/sampleTime":153,"../internal/operators/scan":154,"../internal/operators/sequenceEqual":155,"../internal/operators/share":156,"../internal/operators/shareReplay":157,"../internal/operators/single":158,"../internal/operators/skip":159,"../internal/operators/skipLast":160,"../internal/operators/skipUntil":161,"../internal/operators/skipWhile":162,"../internal/operators/startWith":163,"../internal/operators/subscribeOn":164,"../internal/operators/switchAll":165,"../internal/operators/switchMap":166,"../internal/operators/switchMapTo":167,"../internal/operators/take":168,"../internal/operators/takeLast":169,"../internal/operators/takeUntil":170,"../internal/operators/takeWhile":171,"../internal/operators/tap":172,"../internal/operators/throttle":173,"../internal/operators/throttleTime":174,"../internal/operators/throwIfEmpty":175,"../internal/operators/timeInterval":176,"../internal/operators/timeout":177,"../internal/operators/timeoutWith":178,"../internal/operators/timestamp":179,"../internal/operators/toArray":180,"../internal/operators/window":181,"../internal/operators/windowCount":182,"../internal/operators/windowTime":183,"../internal/operators/windowToggle":184,"../internal/operators/windowWhen":185,"../internal/operators/withLatestFrom":186,"../internal/operators/zip":187,"../internal/operators/zipAll":188}],242:[function(require,module,exports){
+// threejs.org/license
+(function(k,ua){"object"===typeof exports&&"undefined"!==typeof module?ua(exports):"function"===typeof define&&define.amd?define(["exports"],ua):(k=k||self,ua(k.THREE={}))})(this,function(k){function ua(){}function v(a,b){this.x=a||0;this.y=b||0}function ya(){this.elements=[1,0,0,0,1,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}function W(a,b,c,d,e,f,g,h,l,m){Object.defineProperty(this,"id",{value:ej++});this.uuid=O.generateUUID();
+this.name="";this.image=void 0!==a?a:W.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:W.DEFAULT_MAPPING;this.wrapS=void 0!==c?c:1001;this.wrapT=void 0!==d?d:1001;this.magFilter=void 0!==e?e:1006;this.minFilter=void 0!==f?f:1008;this.anisotropy=void 0!==l?l:1;this.format=void 0!==g?g:1023;this.internalFormat=null;this.type=void 0!==h?h:1009;this.offset=new v(0,0);this.repeat=new v(1,1);this.center=new v(0,0);this.rotation=0;this.matrixAutoUpdate=!0;this.matrix=new ya;this.generateMipmaps=
+!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.encoding=void 0!==m?m:3E3;this.version=0;this.onUpdate=null}function R(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function Ba(a,b,c){this.width=a;this.height=b;this.scissor=new R(0,0,a,b);this.scissorTest=!1;this.viewport=new R(0,0,a,b);c=c||{};this.texture=new W(void 0,c.mapping,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,c.encoding);this.texture.image={};this.texture.image.width=
+a;this.texture.image.height=b;this.texture.generateMipmaps=void 0!==c.generateMipmaps?c.generateMipmaps:!1;this.texture.minFilter=void 0!==c.minFilter?c.minFilter:1006;this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.depthTexture=void 0!==c.depthTexture?c.depthTexture:null}function Xf(a,b,c){Ba.call(this,a,b,c);this.samples=4}function va(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function p(a,b,
+c){this.x=a||0;this.y=b||0;this.z=c||0}function N(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}function Ub(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||Ub.DefaultOrder}function De(){this.mask=1}function y(){Object.defineProperty(this,"id",{value:fj++});this.uuid=O.generateUUID();this.name="";this.type="Object3D";this.parent=null;this.children=[];this.up=y.DefaultUp.clone();
+var a=new p,b=new Ub,c=new va,d=new p(1,1,1);b._onChange(function(){c.setFromEuler(b,!1)});c._onChange(function(){b.setFromQuaternion(c,void 0,!1)});Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:a},rotation:{configurable:!0,enumerable:!0,value:b},quaternion:{configurable:!0,enumerable:!0,value:c},scale:{configurable:!0,enumerable:!0,value:d},modelViewMatrix:{value:new N},normalMatrix:{value:new ya}});this.matrix=new N;this.matrixWorld=new N;this.matrixAutoUpdate=y.DefaultMatrixAutoUpdate;
+this.matrixWorldNeedsUpdate=!1;this.layers=new De;this.visible=!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.renderOrder=0;this.userData={}}function zc(){y.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.environment=this.background=null;this.autoUpdate=!0;"undefined"!==typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}function Va(a,b){this.min=void 0!==a?a:new p(Infinity,Infinity,Infinity);this.max=void 0!==
+b?b:new p(-Infinity,-Infinity,-Infinity)}function Yf(a,b,c,d,e){var f;var g=0;for(f=a.length-3;g<=f;g+=3){Vb.fromArray(a,g);var h=e.x*Math.abs(Vb.x)+e.y*Math.abs(Vb.y)+e.z*Math.abs(Vb.z),l=b.dot(Vb),m=c.dot(Vb),z=d.dot(Vb);if(Math.max(-Math.max(l,m,z),Math.min(l,m,z))>h)return!1}return!0}function eb(a,b){this.center=void 0!==a?a:new p;this.radius=void 0!==b?b:-1}function Wb(a,b){this.origin=void 0!==a?a:new p;this.direction=void 0!==b?b:new p(0,0,-1)}function Wa(a,b){this.normal=void 0!==a?a:new p(1,
+0,0);this.constant=void 0!==b?b:0}function pa(a,b,c){this.a=void 0!==a?a:new p;this.b=void 0!==b?b:new p;this.c=void 0!==c?c:new p}function D(a,b,c){return void 0===b&&void 0===c?this.set(a):this.setRGB(a,b,c)}function Zf(a,b,c){0>c&&(c+=1);1<c&&--c;return c<1/6?a+6*(b-a)*c:.5>c?b:c<2/3?a+6*(b-a)*(2/3-c):a}function $f(a){return.04045>a?.0773993808*a:Math.pow(.9478672986*a+.0521327014,2.4)}function ag(a){return.0031308>a?12.92*a:1.055*Math.pow(a,.41666)-.055}function Ac(a,b,c,d,e,f){this.a=a;this.b=
+b;this.c=c;this.normal=d&&d.isVector3?d:new p;this.vertexNormals=Array.isArray(d)?d:[];this.color=e&&e.isColor?e:new D;this.vertexColors=Array.isArray(e)?e:[];this.materialIndex=void 0!==f?f:0}function K(){Object.defineProperty(this,"id",{value:gj++});this.uuid=O.generateUUID();this.name="";this.type="Material";this.fog=!0;this.blending=1;this.side=0;this.vertexColors=this.flatShading=!1;this.opacity=1;this.transparent=!1;this.blendSrc=204;this.blendDst=205;this.blendEquation=100;this.blendEquationAlpha=
+this.blendDstAlpha=this.blendSrcAlpha=null;this.depthFunc=3;this.depthWrite=this.depthTest=!0;this.stencilWriteMask=255;this.stencilFunc=519;this.stencilRef=0;this.stencilFuncMask=255;this.stencilZPass=this.stencilZFail=this.stencilFail=7680;this.stencilWrite=!1;this.clippingPlanes=null;this.clipShadows=this.clipIntersection=!1;this.shadowSide=null;this.colorWrite=!0;this.precision=null;this.polygonOffset=!1;this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.dithering=!1;this.alphaTest=0;this.premultipliedAlpha=
+!1;this.toneMapped=this.visible=!0;this.userData={};this.version=0}function Pa(a){K.call(this);this.type="MeshBasicMaterial";this.color=new D(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphTargets=this.skinning=!1;this.setValues(a)}
+function G(a,b,c){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.name="";this.array=a;this.itemSize=b;this.count=void 0!==a?a.length/b:0;this.normalized=!0===c;this.usage=35044;this.updateRange={offset:0,count:-1};this.version=0}function yd(a,b,c){G.call(this,new Int8Array(a),b,c)}function zd(a,b,c){G.call(this,new Uint8Array(a),b,c)}function Ad(a,b,c){G.call(this,new Uint8ClampedArray(a),b,c)}function Bd(a,b,c){G.call(this,new Int16Array(a),
+b,c)}function Xb(a,b,c){G.call(this,new Uint16Array(a),b,c)}function Cd(a,b,c){G.call(this,new Int32Array(a),b,c)}function Yb(a,b,c){G.call(this,new Uint32Array(a),b,c)}function B(a,b,c){G.call(this,new Float32Array(a),b,c)}function Dd(a,b,c){G.call(this,new Float64Array(a),b,c)}function rh(){this.vertices=[];this.normals=[];this.colors=[];this.uvs=[];this.uvs2=[];this.groups=[];this.morphTargets={};this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=
+this.uvsNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.verticesNeedUpdate=!1}function sh(a){if(0===a.length)return-Infinity;for(var b=a[0],c=1,d=a.length;c<d;++c)a[c]>b&&(b=a[c]);return b}function F(){Object.defineProperty(this,"id",{value:hj+=2});this.uuid=O.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.morphTargetsRelative=!1;this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity};
+this.userData={}}function ea(a,b){y.call(this);this.type="Mesh";this.geometry=void 0!==a?a:new F;this.material=void 0!==b?b:new Pa;this.updateMorphTargets()}function th(a,b,c,d,e,f,g,h){if(null===(1===b.side?d.intersectTriangle(g,f,e,!0,h):d.intersectTriangle(e,f,g,2!==b.side,h)))return null;Ee.copy(h);Ee.applyMatrix4(a.matrixWorld);b=c.ray.origin.distanceTo(Ee);return b<c.near||b>c.far?null:{distance:b,point:Ee.clone(),object:a}}function Fe(a,b,c,d,e,f,g,h,l,m,z,n){Db.fromBufferAttribute(e,m);Eb.fromBufferAttribute(e,
+z);Fb.fromBufferAttribute(e,n);e=a.morphTargetInfluences;if(b.morphTargets&&f&&e){Ge.set(0,0,0);He.set(0,0,0);Ie.set(0,0,0);for(var t=0,r=f.length;t<r;t++){var k=e[t],u=f[t];0!==k&&(bg.fromBufferAttribute(u,m),cg.fromBufferAttribute(u,z),dg.fromBufferAttribute(u,n),g?(Ge.addScaledVector(bg,k),He.addScaledVector(cg,k),Ie.addScaledVector(dg,k)):(Ge.addScaledVector(bg.sub(Db),k),He.addScaledVector(cg.sub(Eb),k),Ie.addScaledVector(dg.sub(Fb),k)))}Db.add(Ge);Eb.add(He);Fb.add(Ie)}a.isSkinnedMesh&&(a.boneTransform(m,
+Db),a.boneTransform(z,Eb),a.boneTransform(n,Fb));if(a=th(a,b,c,d,Db,Eb,Fb,Ed))h&&(Bc.fromBufferAttribute(h,m),Cc.fromBufferAttribute(h,z),Dc.fromBufferAttribute(h,n),a.uv=pa.getUV(Ed,Db,Eb,Fb,Bc,Cc,Dc,new v)),l&&(Bc.fromBufferAttribute(l,m),Cc.fromBufferAttribute(l,z),Dc.fromBufferAttribute(l,n),a.uv2=pa.getUV(Ed,Db,Eb,Fb,Bc,Cc,Dc,new v)),h=new Ac(m,z,n),pa.getNormal(Db,Eb,Fb,h.normal),a.face=h;return a}function L(){Object.defineProperty(this,"id",{value:ij+=2});this.uuid=O.generateUUID();this.name=
+"";this.type="Geometry";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function Ec(a){var b={},c;for(c in a){b[c]={};for(var d in a[c]){var e=a[c][d];e&&(e.isColor||e.isMatrix3||
+e.isMatrix4||e.isVector2||e.isVector3||e.isVector4||e.isTexture)?b[c][d]=e.clone():Array.isArray(e)?b[c][d]=e.slice():b[c][d]=e}}return b}function wa(a){for(var b={},c=0;c<a.length;c++){var d=Ec(a[c]),e;for(e in d)b[e]=d[e]}return b}function Ca(a){K.call(this);this.type="ShaderMaterial";this.defines={};this.uniforms={};this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}";this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}";
+this.linewidth=1;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.clipping=this.lights=this.fog=!1;this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1};this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]};this.index0AttributeName=void 0;this.uniformsNeedUpdate=!1;void 0!==a&&(void 0!==a.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(a))}
+function fb(){y.call(this);this.type="Camera";this.matrixWorldInverse=new N;this.projectionMatrix=new N;this.projectionMatrixInverse=new N}function P(a,b,c,d){fb.call(this);this.type="PerspectiveCamera";this.fov=void 0!==a?a:50;this.zoom=1;this.near=void 0!==c?c:.1;this.far=void 0!==d?d:2E3;this.focus=10;this.aspect=void 0!==b?b:1;this.view=null;this.filmGauge=35;this.filmOffset=0;this.updateProjectionMatrix()}function Fc(a,b,c){y.call(this);this.type="CubeCamera";if(!0!==c.isWebGLCubeRenderTarget)console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.");
+else{this.renderTarget=c;var d=new P(90,1,a,b);d.layers=this.layers;d.up.set(0,-1,0);d.lookAt(new p(1,0,0));this.add(d);var e=new P(90,1,a,b);e.layers=this.layers;e.up.set(0,-1,0);e.lookAt(new p(-1,0,0));this.add(e);var f=new P(90,1,a,b);f.layers=this.layers;f.up.set(0,0,1);f.lookAt(new p(0,1,0));this.add(f);var g=new P(90,1,a,b);g.layers=this.layers;g.up.set(0,0,-1);g.lookAt(new p(0,-1,0));this.add(g);var h=new P(90,1,a,b);h.layers=this.layers;h.up.set(0,-1,0);h.lookAt(new p(0,0,1));this.add(h);
+var l=new P(90,1,a,b);l.layers=this.layers;l.up.set(0,-1,0);l.lookAt(new p(0,0,-1));this.add(l);this.update=function(a,b){null===this.parent&&this.updateMatrixWorld();var m=a.xr.enabled,z=a.getRenderTarget();a.xr.enabled=!1;var r=c.texture.generateMipmaps;c.texture.generateMipmaps=!1;a.setRenderTarget(c,0);a.render(b,d);a.setRenderTarget(c,1);a.render(b,e);a.setRenderTarget(c,2);a.render(b,f);a.setRenderTarget(c,3);a.render(b,g);a.setRenderTarget(c,4);a.render(b,h);c.texture.generateMipmaps=r;a.setRenderTarget(c,
+5);a.render(b,l);a.setRenderTarget(z);a.xr.enabled=m};this.clear=function(a,b,d,e){for(var f=a.getRenderTarget(),g=0;6>g;g++)a.setRenderTarget(c,g),a.clear(b,d,e);a.setRenderTarget(f)}}}function Zb(a,b,c){Number.isInteger(b)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),b=c);Ba.call(this,a,a,b)}function $b(a,b,c,d,e,f,g,h,l,m,z,n){W.call(this,null,f,g,h,l,m,d,e,z,n);this.image={data:a||null,width:b||1,height:c||1};this.magFilter=
+void 0!==l?l:1003;this.minFilter=void 0!==m?m:1003;this.flipY=this.generateMipmaps=!1;this.unpackAlignment=1;this.needsUpdate=!0}function Gc(a,b,c,d,e,f){this.planes=[void 0!==a?a:new Wa,void 0!==b?b:new Wa,void 0!==c?c:new Wa,void 0!==d?d:new Wa,void 0!==e?e:new Wa,void 0!==f?f:new Wa]}function uh(){function a(e,f){!1!==c&&(d(e,f),b.requestAnimationFrame(a))}var b=null,c=!1,d=null;return{start:function(){!0!==c&&null!==d&&(b.requestAnimationFrame(a),c=!0)},stop:function(){c=!1},setAnimationLoop:function(a){d=
+a},setContext:function(a){b=a}}}function jj(a,b){function c(b,c){var d=b.array,e=b.usage,f=a.createBuffer();a.bindBuffer(c,f);a.bufferData(c,d,e);b.onUploadCallback();c=5126;d instanceof Float32Array?c=5126:d instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):d instanceof Uint16Array?c=5123:d instanceof Int16Array?c=5122:d instanceof Uint32Array?c=5125:d instanceof Int32Array?c=5124:d instanceof Int8Array?c=5120:d instanceof Uint8Array&&(c=
+5121);return{buffer:f,type:c,bytesPerElement:d.BYTES_PER_ELEMENT,version:b.version}}var d=b.isWebGL2,e=new WeakMap;return{get:function(a){a.isInterleavedBufferAttribute&&(a=a.data);return e.get(a)},remove:function(b){b.isInterleavedBufferAttribute&&(b=b.data);var c=e.get(b);c&&(a.deleteBuffer(c.buffer),e.delete(b))},update:function(b,g){b.isInterleavedBufferAttribute&&(b=b.data);var f=e.get(b);if(void 0===f)e.set(b,c(b,g));else if(f.version<b.version){var l=b.array,m=b.updateRange;a.bindBuffer(g,
+f.buffer);-1===m.count?a.bufferSubData(g,0,l):(d?a.bufferSubData(g,m.offset*l.BYTES_PER_ELEMENT,l,m.offset,m.count):a.bufferSubData(g,m.offset*l.BYTES_PER_ELEMENT,l.subarray(m.offset,m.offset+m.count)),m.count=-1);f.version=b.version}}}}function Fd(a,b,c,d){L.call(this);this.type="PlaneGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};this.fromBufferGeometry(new ac(a,b,c,d));this.mergeVertices()}function ac(a,b,c,d){F.call(this);this.type="PlaneBufferGeometry";this.parameters=
+{width:a,height:b,widthSegments:c,heightSegments:d};a=a||1;b=b||1;var e=a/2,f=b/2;c=Math.floor(c)||1;d=Math.floor(d)||1;var g=c+1,h=d+1,l=a/c,m=b/d,z=[],n=[],t=[],r=[];for(a=0;a<h;a++){var k=a*m-f;for(b=0;b<g;b++)n.push(b*l-e,-k,0),t.push(0,0,1),r.push(b/c),r.push(1-a/d)}for(a=0;a<d;a++)for(b=0;b<c;b++)e=b+g*(a+1),f=b+1+g*(a+1),h=b+1+g*a,z.push(b+g*a,e,h),z.push(e,f,h);this.setIndex(z);this.setAttribute("position",new B(n,3));this.setAttribute("normal",new B(t,3));this.setAttribute("uv",new B(r,2))}
+function kj(a,b,c,d){function e(a,c){b.buffers.color.setClear(a.r,a.g,a.b,c,d)}var f=new D(0),g=0,h,l,m=null,z=0,n=null;return{getClearColor:function(){return f},setClearColor:function(a,b){f.set(a);g=void 0!==b?b:1;e(f,g)},getClearAlpha:function(){return g},setClearAlpha:function(a){g=a;e(f,g)},render:function(b,d,k,u){d=d.background;k=a.xr;(k=k.getSession&&k.getSession())&&"additive"===k.environmentBlendMode&&(d=null);null===d?e(f,g):d&&d.isColor&&(e(d,1),u=!0);(a.autoClear||u)&&a.clear(a.autoClearColor,
+a.autoClearDepth,a.autoClearStencil);if(d&&(d.isCubeTexture||d.isWebGLCubeRenderTarget||306===d.mapping)){void 0===l&&(l=new ea(new Gd(1,1,1),new Ca({type:"BackgroundCubeMaterial",uniforms:Ec(gb.cube.uniforms),vertexShader:gb.cube.vertexShader,fragmentShader:gb.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})),l.geometry.deleteAttribute("normal"),l.geometry.deleteAttribute("uv"),l.onBeforeRender=function(a,b,c){this.matrixWorld.copyPosition(c.matrixWorld)},Object.defineProperty(l.material,
+"envMap",{get:function(){return this.uniforms.envMap.value}}),c.update(l));u=d.isWebGLCubeRenderTarget?d.texture:d;l.material.uniforms.envMap.value=u;l.material.uniforms.flipEnvMap.value=u.isCubeTexture?-1:1;if(m!==d||z!==u.version||n!==a.toneMapping)l.material.needsUpdate=!0,m=d,z=u.version,n=a.toneMapping;b.unshift(l,l.geometry,l.material,0,0,null)}else if(d&&d.isTexture){void 0===h&&(h=new ea(new ac(2,2),new Ca({type:"BackgroundMaterial",uniforms:Ec(gb.background.uniforms),vertexShader:gb.background.vertexShader,
+fragmentShader:gb.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1})),h.geometry.deleteAttribute("normal"),Object.defineProperty(h.material,"map",{get:function(){return this.uniforms.t2D.value}}),c.update(h));h.material.uniforms.t2D.value=d;!0===d.matrixAutoUpdate&&d.updateMatrix();h.material.uniforms.uvTransform.value.copy(d.matrix);if(m!==d||z!==d.version||n!==a.toneMapping)h.material.needsUpdate=!0,m=d,z=d.version,n=a.toneMapping;b.unshift(h,h.geometry,h.material,0,0,null)}}}}
+function lj(a,b,c,d){var e=d.isWebGL2,f;this.setMode=function(a){f=a};this.render=function(b,d){a.drawArrays(f,b,d);c.update(d,f)};this.renderInstances=function(d,h,l,m){if(0!==m){if(e){d=a;var g="drawArraysInstanced"}else if(d=b.get("ANGLE_instanced_arrays"),g="drawArraysInstancedANGLE",null===d){console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");return}d[g](f,h,l,m);c.update(l,f,m)}}}function mj(a,b,c){function d(b){if("highp"===
+b){if(0<a.getShaderPrecisionFormat(35633,36338).precision&&0<a.getShaderPrecisionFormat(35632,36338).precision)return"highp";b="mediump"}return"mediump"===b&&0<a.getShaderPrecisionFormat(35633,36337).precision&&0<a.getShaderPrecisionFormat(35632,36337).precision?"mediump":"lowp"}var e,f="undefined"!==typeof WebGL2RenderingContext&&a instanceof WebGL2RenderingContext||"undefined"!==typeof WebGL2ComputeRenderingContext&&a instanceof WebGL2ComputeRenderingContext,g=void 0!==c.precision?c.precision:"highp",
+h=d(g);h!==g&&(console.warn("THREE.WebGLRenderer:",g,"not supported, using",h,"instead."),g=h);c=!0===c.logarithmicDepthBuffer;h=a.getParameter(34930);var l=a.getParameter(35660),m=a.getParameter(3379),z=a.getParameter(34076),n=a.getParameter(34921),k=a.getParameter(36347),r=a.getParameter(36348),q=a.getParameter(36349),u=0<l,p=f||!!b.get("OES_texture_float"),x=u&&p,w=f?a.getParameter(36183):0;return{isWebGL2:f,getMaxAnisotropy:function(){if(void 0!==e)return e;var c=b.get("EXT_texture_filter_anisotropic");
+return e=null!==c?a.getParameter(c.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:d,precision:g,logarithmicDepthBuffer:c,maxTextures:h,maxVertexTextures:l,maxTextureSize:m,maxCubemapSize:z,maxAttributes:n,maxVertexUniforms:k,maxVaryings:r,maxFragmentUniforms:q,vertexTextures:u,floatFragmentTextures:p,floatVertexTextures:x,maxSamples:w}}function nj(){function a(){m.value!==d&&(m.value=d,m.needsUpdate=0<e);c.numPlanes=e;c.numIntersection=0}function b(a,b,d,e){var f=null!==a?a.length:0,g=null;if(0!==
+f){g=m.value;if(!0!==e||null===g){e=d+4*f;b=b.matrixWorldInverse;l.getNormalMatrix(b);if(null===g||g.length<e)g=new Float32Array(e);for(e=0;e!==f;++e,d+=4)h.copy(a[e]).applyMatrix4(b,l),h.normal.toArray(g,d),g[d+3]=h.constant}m.value=g;m.needsUpdate=!0}c.numPlanes=f;c.numIntersection=0;return g}var c=this,d=null,e=0,f=!1,g=!1,h=new Wa,l=new ya,m={value:null,needsUpdate:!1};this.uniform=m;this.numIntersection=this.numPlanes=0;this.init=function(a,c,g){var h=0!==a.length||c||0!==e||f;f=c;d=b(a,g,0);
+e=a.length;return h};this.beginShadows=function(){g=!0;b(null)};this.endShadows=function(){g=!1;a()};this.setState=function(c,h,l,k,q,u){if(!f||null===c||0===c.length||g&&!l)g?b(null):a();else{l=g?0:e;var n=4*l,z=q.clippingState||null;m.value=z;z=b(c,k,n,u);for(c=0;c!==n;++c)z[c]=d[c];q.clippingState=z;this.numIntersection=h?this.numPlanes:0;this.numPlanes+=l}}}function oj(a){var b={};return{get:function(c){if(void 0!==b[c])return b[c];switch(c){case "WEBGL_depth_texture":var d=a.getExtension("WEBGL_depth_texture")||
+a.getExtension("MOZ_WEBGL_depth_texture")||a.getExtension("WEBKIT_WEBGL_depth_texture");break;case "EXT_texture_filter_anisotropic":d=a.getExtension("EXT_texture_filter_anisotropic")||a.getExtension("MOZ_EXT_texture_filter_anisotropic")||a.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case "WEBGL_compressed_texture_s3tc":d=a.getExtension("WEBGL_compressed_texture_s3tc")||a.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;
+case "WEBGL_compressed_texture_pvrtc":d=a.getExtension("WEBGL_compressed_texture_pvrtc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:d=a.getExtension(c)}null===d&&console.warn("THREE.WebGLRenderer: "+c+" extension not supported.");return b[c]=d}}}function pj(a,b,c){function d(a){var e=a.target;a=f.get(e);null!==a.index&&b.remove(a.index);for(var h in a.attributes)b.remove(a.attributes[h]);e.removeEventListener("dispose",d);f.delete(e);if(h=g.get(a))b.remove(h),g.delete(a);
+c.memory.geometries--}function e(a){var c=[],d=a.index,e=a.attributes.position;if(null!==d){var f=d.array;d=d.version;e=0;for(var h=f.length;e<h;e+=3){var k=f[e+0],q=f[e+1],u=f[e+2];c.push(k,q,q,u,u,k)}}else for(f=e.array,d=e.version,e=0,h=f.length/3-1;e<h;e+=3)k=e+0,q=e+1,u=e+2,c.push(k,q,q,u,u,k);c=new (65535<sh(c)?Yb:Xb)(c,1);c.version=d;b.update(c,34963);(f=g.get(a))&&b.remove(f);g.set(a,c)}var f=new WeakMap,g=new WeakMap;return{get:function(a,b){var e=f.get(b);if(e)return e;b.addEventListener("dispose",
+d);b.isBufferGeometry?e=b:b.isGeometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new F).setFromObject(a)),e=b._bufferGeometry);f.set(b,e);c.memory.geometries++;return e},update:function(a){var c=a.index,d=a.attributes;null!==c&&b.update(c,34963);for(var e in d)b.update(d[e],34962);a=a.morphAttributes;for(e in a){c=a[e];d=0;for(var f=c.length;d<f;d++)b.update(c[d],34962)}},getWireframeAttribute:function(a){var b=g.get(a);if(b){var c=a.index;null!==c&&b.version<c.version&&e(a)}else e(a);return g.get(a)}}}
+function qj(a,b,c,d){var e=d.isWebGL2,f,g,h;this.setMode=function(a){f=a};this.setIndex=function(a){g=a.type;h=a.bytesPerElement};this.render=function(b,d){a.drawElements(f,d,g,b*h);c.update(d,f)};this.renderInstances=function(d,m,z,n){if(0!==n){if(e){d=a;var l="drawElementsInstanced"}else if(d=b.get("ANGLE_instanced_arrays"),l="drawElementsInstancedANGLE",null===d){console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");
+return}d[l](f,z,g,m*h,n);c.update(z,f,n)}}}function rj(a){var b={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:b,programs:null,autoReset:!0,reset:function(){b.frame++;b.calls=0;b.triangles=0;b.points=0;b.lines=0},update:function(a,d,e){e=e||1;b.calls++;switch(d){case 4:b.triangles+=a/3*e;break;case 1:b.lines+=a/2*e;break;case 3:b.lines+=e*(a-1);break;case 2:b.lines+=e*a;break;case 0:b.points+=e*a;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",
+d)}}}}function sj(a,b){return Math.abs(b[1])-Math.abs(a[1])}function tj(a){var b={},c=new Float32Array(8);return{update:function(d,e,f,g){var h=d.morphTargetInfluences,l=void 0===h?0:h.length;d=b[e.id];if(void 0===d){d=[];for(var m=0;m<l;m++)d[m]=[m,0];b[e.id]=d}var z=f.morphTargets&&e.morphAttributes.position;f=f.morphNormals&&e.morphAttributes.normal;for(m=0;m<l;m++){var n=d[m];0!==n[1]&&(z&&e.deleteAttribute("morphTarget"+m),f&&e.deleteAttribute("morphNormal"+m))}for(m=0;m<l;m++)n=d[m],n[0]=m,
+n[1]=h[m];d.sort(sj);for(m=h=0;8>m;m++){if(n=d[m])if(l=n[0],n=n[1]){z&&e.setAttribute("morphTarget"+m,z[l]);f&&e.setAttribute("morphNormal"+m,f[l]);c[m]=n;h+=n;continue}c[m]=0}e=e.morphTargetsRelative?1:1-h;g.getUniforms().setValue(a,"morphTargetBaseInfluence",e);g.getUniforms().setValue(a,"morphTargetInfluences",c)}}}function uj(a,b,c,d){var e=new WeakMap;return{update:function(a){var f=d.render.frame,h=a.geometry,l=b.get(a,h);e.get(l)!==f&&(h.isGeometry&&l.updateFromObject(a),b.update(l),e.set(l,
+f));a.isInstancedMesh&&c.update(a.instanceMatrix,34962);return l},dispose:function(){e=new WeakMap}}}function qb(a,b,c,d,e,f,g,h,l,m){a=void 0!==a?a:[];W.call(this,a,void 0!==b?b:301,c,d,e,f,void 0!==g?g:1022,h,l,m);this.flipY=!1}function Hc(a,b,c,d){W.call(this,null);this.image={data:a||null,width:b||1,height:c||1,depth:d||1};this.minFilter=this.magFilter=1003;this.wrapR=1001;this.flipY=this.generateMipmaps=!1;this.needsUpdate=!0}function Ic(a,b,c,d){W.call(this,null);this.image={data:a||null,width:b||
+1,height:c||1,depth:d||1};this.minFilter=this.magFilter=1003;this.wrapR=1001;this.flipY=this.generateMipmaps=!1;this.needsUpdate=!0}function Jc(a,b,c){var d=a[0];if(0>=d||0<d)return a;var e=b*c,f=vh[e];void 0===f&&(f=new Float32Array(e),vh[e]=f);if(0!==b)for(d.toArray(f,0),d=1,e=0;d!==b;++d)e+=c,a[d].toArray(f,e);return f}function Qa(a,b){if(a.length!==b.length)return!1;for(var c=0,d=a.length;c<d;c++)if(a[c]!==b[c])return!1;return!0}function Ja(a,b){for(var c=0,d=b.length;c<d;c++)a[c]=b[c]}function wh(a,
+b){var c=xh[b];void 0===c&&(c=new Int32Array(b),xh[b]=c);for(var d=0;d!==b;++d)c[d]=a.allocateTextureUnit();return c}function vj(a,b){var c=this.cache;c[0]!==b&&(a.uniform1f(this.addr,b),c[0]=b)}function wj(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==b.x||c[1]!==b.y)a.uniform2f(this.addr,b.x,b.y),c[0]=b.x,c[1]=b.y}else Qa(c,b)||(a.uniform2fv(this.addr,b),Ja(c,b))}function xj(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==b.x||c[1]!==b.y||c[2]!==b.z)a.uniform3f(this.addr,b.x,b.y,b.z),c[0]=b.x,
+c[1]=b.y,c[2]=b.z}else if(void 0!==b.r){if(c[0]!==b.r||c[1]!==b.g||c[2]!==b.b)a.uniform3f(this.addr,b.r,b.g,b.b),c[0]=b.r,c[1]=b.g,c[2]=b.b}else Qa(c,b)||(a.uniform3fv(this.addr,b),Ja(c,b))}function yj(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==b.x||c[1]!==b.y||c[2]!==b.z||c[3]!==b.w)a.uniform4f(this.addr,b.x,b.y,b.z,b.w),c[0]=b.x,c[1]=b.y,c[2]=b.z,c[3]=b.w}else Qa(c,b)||(a.uniform4fv(this.addr,b),Ja(c,b))}function zj(a,b){var c=this.cache,d=b.elements;void 0===d?Qa(c,b)||(a.uniformMatrix2fv(this.addr,
+!1,b),Ja(c,b)):Qa(c,d)||(yh.set(d),a.uniformMatrix2fv(this.addr,!1,yh),Ja(c,d))}function Aj(a,b){var c=this.cache,d=b.elements;void 0===d?Qa(c,b)||(a.uniformMatrix3fv(this.addr,!1,b),Ja(c,b)):Qa(c,d)||(zh.set(d),a.uniformMatrix3fv(this.addr,!1,zh),Ja(c,d))}function Bj(a,b){var c=this.cache,d=b.elements;void 0===d?Qa(c,b)||(a.uniformMatrix4fv(this.addr,!1,b),Ja(c,b)):Qa(c,d)||(Ah.set(d),a.uniformMatrix4fv(this.addr,!1,Ah),Ja(c,d))}function Cj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==
+e&&(a.uniform1i(this.addr,e),d[0]=e);c.safeSetTexture2D(b||Bh,e)}function Dj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.setTexture2DArray(b||Ej,e)}function Fj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.setTexture3D(b||Gj,e)}function Hj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.safeSetTextureCube(b||Ch,e)}function Ij(a,b){var c=this.cache;c[0]!==
+b&&(a.uniform1i(this.addr,b),c[0]=b)}function Jj(a,b){var c=this.cache;Qa(c,b)||(a.uniform2iv(this.addr,b),Ja(c,b))}function Kj(a,b){var c=this.cache;Qa(c,b)||(a.uniform3iv(this.addr,b),Ja(c,b))}function Lj(a,b){var c=this.cache;Qa(c,b)||(a.uniform4iv(this.addr,b),Ja(c,b))}function Mj(a,b){var c=this.cache;c[0]!==b&&(a.uniform1ui(this.addr,b),c[0]=b)}function Nj(a){switch(a){case 5126:return vj;case 35664:return wj;case 35665:return xj;case 35666:return yj;case 35674:return zj;case 35675:return Aj;
+case 35676:return Bj;case 5124:case 35670:return Ij;case 35667:case 35671:return Jj;case 35668:case 35672:return Kj;case 35669:case 35673:return Lj;case 5125:return Mj;case 35678:case 36198:case 36298:case 36306:case 35682:return Cj;case 35679:case 36299:case 36307:return Fj;case 35680:case 36300:case 36308:case 36293:return Hj;case 36289:case 36303:case 36311:case 36292:return Dj}}function Oj(a,b){a.uniform1fv(this.addr,b)}function Pj(a,b){a.uniform1iv(this.addr,b)}function Qj(a,b){a.uniform2iv(this.addr,
+b)}function Rj(a,b){a.uniform3iv(this.addr,b)}function Sj(a,b){a.uniform4iv(this.addr,b)}function Tj(a,b){b=Jc(b,this.size,2);a.uniform2fv(this.addr,b)}function Uj(a,b){b=Jc(b,this.size,3);a.uniform3fv(this.addr,b)}function Vj(a,b){b=Jc(b,this.size,4);a.uniform4fv(this.addr,b)}function Wj(a,b){b=Jc(b,this.size,4);a.uniformMatrix2fv(this.addr,!1,b)}function Xj(a,b){b=Jc(b,this.size,9);a.uniformMatrix3fv(this.addr,!1,b)}function Yj(a,b){b=Jc(b,this.size,16);a.uniformMatrix4fv(this.addr,!1,b)}function Zj(a,
+b,c){var d=b.length,e=wh(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.safeSetTexture2D(b[a]||Bh,e[a])}function ak(a,b,c){var d=b.length,e=wh(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.safeSetTextureCube(b[a]||Ch,e[a])}function bk(a){switch(a){case 5126:return Oj;case 35664:return Tj;case 35665:return Uj;case 35666:return Vj;case 35674:return Wj;case 35675:return Xj;case 35676:return Yj;case 5124:case 35670:return Pj;case 35667:case 35671:return Qj;case 35668:case 35672:return Rj;case 35669:case 35673:return Sj;
+case 35678:case 36198:case 36298:case 36306:case 35682:return Zj;case 35680:case 36300:case 36308:case 36293:return ak}}function ck(a,b,c){this.id=a;this.addr=c;this.cache=[];this.setValue=Nj(b.type)}function Dh(a,b,c){this.id=a;this.addr=c;this.cache=[];this.size=b.size;this.setValue=bk(b.type)}function Eh(a){this.id=a;this.seq=[];this.map={}}function Gb(a,b){this.seq=[];this.map={};for(var c=a.getProgramParameter(b,35718),d=0;d<c;++d){var e=a.getActiveUniform(b,d),f=a.getUniformLocation(b,e.name),
+g=this,h=e.name,l=h.length;for(eg.lastIndex=0;;){var m=eg.exec(h),z=eg.lastIndex,n=m[1],k=m[3];"]"===m[2]&&(n|=0);if(void 0===k||"["===k&&z+2===l){h=g;e=void 0===k?new ck(n,e,f):new Dh(n,e,f);h.seq.push(e);h.map[e.id]=e;break}else k=g.map[n],void 0===k&&(k=new Eh(n),n=g,g=k,n.seq.push(g),n.map[g.id]=g),g=k}}}function Fh(a,b,c){b=a.createShader(b);a.shaderSource(b,c);a.compileShader(b);return b}function Gh(a){switch(a){case 3E3:return["Linear","( value )"];case 3001:return["sRGB","( value )"];case 3002:return["RGBE",
+"( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD","( value, 256.0 )"];case 3007:return["Gamma","( value, float( GAMMA_FACTOR ) )"];case 3003:return["LogLuv","( value )"];default:throw Error("unsupported encoding: "+a);}}function Hh(a,b,c){var d=a.getShaderParameter(b,35713),e=a.getShaderInfoLog(b).trim();if(d&&""===e)return"";a=a.getShaderSource(b).split("\n");for(b=0;b<a.length;b++)a[b]=b+1+": "+a[b];a=a.join("\n");return"THREE.WebGLShader: gl.getShaderInfoLog() "+
+c+"\n"+e+a}function Hd(a,b){b=Gh(b);return"vec4 "+a+"( vec4 value ) { return "+b[0]+"ToLinear"+b[1]+"; }"}function dk(a,b){b=Gh(b);return"vec4 "+a+"( vec4 value ) { return LinearTo"+b[0]+b[1]+"; }"}function ek(a,b){switch(b){case 1:b="Linear";break;case 2:b="Reinhard";break;case 3:b="Uncharted2";break;case 4:b="OptimizedCineon";break;case 5:b="ACESFilmic";break;default:throw Error("unsupported toneMapping: "+b);}return"vec3 "+a+"( vec3 color ) { return "+b+"ToneMapping( color ); }"}function fk(a){var b=
+[],c;for(c in a){var d=a[c];!1!==d&&b.push("#define "+c+" "+d)}return b.join("\n")}function Id(a){return""!==a}function Ih(a,b){return a.replace(/NUM_DIR_LIGHTS/g,b.numDirLights).replace(/NUM_SPOT_LIGHTS/g,b.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,b.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,b.numPointLights).replace(/NUM_HEMI_LIGHTS/g,b.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,b.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS/g,b.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,
+b.numPointLightShadows)}function Jh(a,b){return a.replace(/NUM_CLIPPING_PLANES/g,b.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,b.numClippingPlanes-b.numClipIntersection)}function fg(a,b){a=M[b];if(void 0===a)throw Error("Can not resolve #include <"+b+">");return a.replace(gg,fg)}function Kh(a,b,c,d){console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead.");return hg(a,b,c,d)}function hg(a,b,c,d){a="";for(b=parseInt(b);b<
+parseInt(c);b++)a+=d.replace(/\[ i \]/g,"[ "+b+" ]").replace(/UNROLLED_LOOP_INDEX/g,b);return a}function Lh(a){var b="precision "+a.precision+" float;\nprecision "+a.precision+" int;";"highp"===a.precision?b+="\n#define HIGH_PRECISION":"mediump"===a.precision?b+="\n#define MEDIUM_PRECISION":"lowp"===a.precision&&(b+="\n#define LOW_PRECISION");return b}function gk(a){var b="SHADOWMAP_TYPE_BASIC";1===a.shadowMapType?b="SHADOWMAP_TYPE_PCF":2===a.shadowMapType?b="SHADOWMAP_TYPE_PCF_SOFT":3===a.shadowMapType&&
+(b="SHADOWMAP_TYPE_VSM");return b}function hk(a){var b="ENVMAP_TYPE_CUBE";if(a.envMap)switch(a.envMapMode){case 301:case 302:b="ENVMAP_TYPE_CUBE";break;case 306:case 307:b="ENVMAP_TYPE_CUBE_UV";break;case 303:case 304:b="ENVMAP_TYPE_EQUIREC";break;case 305:b="ENVMAP_TYPE_SPHERE"}return b}function ik(a){var b="ENVMAP_MODE_REFLECTION";if(a.envMap)switch(a.envMapMode){case 302:case 304:b="ENVMAP_MODE_REFRACTION"}return b}function jk(a){var b="ENVMAP_BLENDING_NONE";if(a.envMap)switch(a.combine){case 0:b=
+"ENVMAP_BLENDING_MULTIPLY";break;case 1:b="ENVMAP_BLENDING_MIX";break;case 2:b="ENVMAP_BLENDING_ADD"}return b}function kk(a,b,c){var d=a.getContext(),e=c.defines,f=c.vertexShader,g=c.fragmentShader,h=gk(c),l=hk(c),m=ik(c),z=jk(c),n=0<a.gammaFactor?a.gammaFactor:1,k=c.isWebGL2?"":[c.extensionDerivatives||c.envMapCubeUV||c.bumpMap||c.tangentSpaceNormalMap||c.clearcoatNormalMap||c.flatShading||"physical"===c.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(c.extensionFragDepth||c.logarithmicDepthBuffer)&&
+c.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",c.extensionDrawBuffers&&c.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(c.extensionShaderTextureLOD||c.envMap)&&c.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(Id).join("\n"),r=fk(e),q=d.createProgram();c.isRawShaderMaterial?(e=[r].filter(Id).join("\n"),0<e.length&&(e+="\n"),h=[k,r].filter(Id).join("\n"),0<h.length&&(h+="\n")):(e=[Lh(c),"#define SHADER_NAME "+
+c.shaderName,r,c.instancing?"#define USE_INSTANCING":"",c.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+n,"#define MAX_BONES "+c.maxBones,c.useFog&&c.fog?"#define USE_FOG":"",c.useFog&&c.fogExp2?"#define FOG_EXP2":"",c.map?"#define USE_MAP":"",c.envMap?"#define USE_ENVMAP":"",c.envMap?"#define "+m:"",c.lightMap?"#define USE_LIGHTMAP":"",c.aoMap?"#define USE_AOMAP":"",c.emissiveMap?"#define USE_EMISSIVEMAP":"",c.bumpMap?"#define USE_BUMPMAP":"",c.normalMap?"#define USE_NORMALMAP":
+"",c.normalMap&&c.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",c.normalMap&&c.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",c.clearcoatMap?"#define USE_CLEARCOATMAP":"",c.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",c.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",c.displacementMap&&c.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",c.specularMap?"#define USE_SPECULARMAP":"",c.roughnessMap?"#define USE_ROUGHNESSMAP":"",c.metalnessMap?"#define USE_METALNESSMAP":
+"",c.alphaMap?"#define USE_ALPHAMAP":"",c.vertexTangents?"#define USE_TANGENT":"",c.vertexColors?"#define USE_COLOR":"",c.vertexUvs?"#define USE_UV":"",c.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",c.flatShading?"#define FLAT_SHADED":"",c.skinning?"#define USE_SKINNING":"",c.useVertexTexture?"#define BONE_TEXTURE":"",c.morphTargets?"#define USE_MORPHTARGETS":"",c.morphNormals&&!1===c.flatShading?"#define USE_MORPHNORMALS":"",c.doubleSided?"#define DOUBLE_SIDED":"",c.flipSided?"#define FLIP_SIDED":
+"",c.shadowMapEnabled?"#define USE_SHADOWMAP":"",c.shadowMapEnabled?"#define "+h:"",c.sizeAttenuation?"#define USE_SIZEATTENUATION":"",c.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",c.logarithmicDepthBuffer&&c.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING",
+" attribute mat4 instanceMatrix;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;",
+"\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Id).join("\n"),h=[k,Lh(c),"#define SHADER_NAME "+c.shaderName,r,c.alphaTest?"#define ALPHATEST "+c.alphaTest+(c.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+n,c.useFog&&c.fog?"#define USE_FOG":
+"",c.useFog&&c.fogExp2?"#define FOG_EXP2":"",c.map?"#define USE_MAP":"",c.matcap?"#define USE_MATCAP":"",c.envMap?"#define USE_ENVMAP":"",c.envMap?"#define "+l:"",c.envMap?"#define "+m:"",c.envMap?"#define "+z:"",c.lightMap?"#define USE_LIGHTMAP":"",c.aoMap?"#define USE_AOMAP":"",c.emissiveMap?"#define USE_EMISSIVEMAP":"",c.bumpMap?"#define USE_BUMPMAP":"",c.normalMap?"#define USE_NORMALMAP":"",c.normalMap&&c.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",c.normalMap&&c.tangentSpaceNormalMap?
+"#define TANGENTSPACE_NORMALMAP":"",c.clearcoatMap?"#define USE_CLEARCOATMAP":"",c.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",c.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",c.specularMap?"#define USE_SPECULARMAP":"",c.roughnessMap?"#define USE_ROUGHNESSMAP":"",c.metalnessMap?"#define USE_METALNESSMAP":"",c.alphaMap?"#define USE_ALPHAMAP":"",c.sheen?"#define USE_SHEEN":"",c.vertexTangents?"#define USE_TANGENT":"",c.vertexColors?"#define USE_COLOR":"",c.vertexUvs?"#define USE_UV":
+"",c.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",c.gradientMap?"#define USE_GRADIENTMAP":"",c.flatShading?"#define FLAT_SHADED":"",c.doubleSided?"#define DOUBLE_SIDED":"",c.flipSided?"#define FLIP_SIDED":"",c.shadowMapEnabled?"#define USE_SHADOWMAP":"",c.shadowMapEnabled?"#define "+h:"",c.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",c.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",c.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",c.logarithmicDepthBuffer&&c.rendererExtensionFragDepth?
+"#define USE_LOGDEPTHBUF_EXT":"",(c.extensionShaderTextureLOD||c.envMap)&&c.rendererExtensionShaderTextureLod?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==c.toneMapping?"#define TONE_MAPPING":"",0!==c.toneMapping?M.tonemapping_pars_fragment:"",0!==c.toneMapping?ek("toneMapping",c.toneMapping):"",c.dithering?"#define DITHERING":"",c.outputEncoding||c.mapEncoding||c.matcapEncoding||c.envMapEncoding||c.emissiveMapEncoding||
+c.lightMapEncoding?M.encodings_pars_fragment:"",c.mapEncoding?Hd("mapTexelToLinear",c.mapEncoding):"",c.matcapEncoding?Hd("matcapTexelToLinear",c.matcapEncoding):"",c.envMapEncoding?Hd("envMapTexelToLinear",c.envMapEncoding):"",c.emissiveMapEncoding?Hd("emissiveMapTexelToLinear",c.emissiveMapEncoding):"",c.lightMapEncoding?Hd("lightMapTexelToLinear",c.lightMapEncoding):"",c.outputEncoding?dk("linearToOutputTexel",c.outputEncoding):"",c.depthPacking?"#define DEPTH_PACKING "+c.depthPacking:"","\n"].filter(Id).join("\n"));
+f=f.replace(gg,fg);f=Ih(f,c);f=Jh(f,c);g=g.replace(gg,fg);g=Ih(g,c);g=Jh(g,c);f=f.replace(Mh,hg).replace(Nh,Kh);g=g.replace(Mh,hg).replace(Nh,Kh);c.isWebGL2&&!c.isRawShaderMaterial&&(l=!1,m=/^\s*#version\s+300\s+es\s*\n/,c.isShaderMaterial&&null!==f.match(m)&&null!==g.match(m)&&(l=!0,f=f.replace(m,""),g=g.replace(m,"")),e="#version 300 es\n\n#define attribute in\n#define varying out\n#define texture2D texture\n"+e,h=["#version 300 es\n\n#define varying in",l?"":"out highp vec4 pc_fragColor;",l?"":
+"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+h);g=h+g;f=Fh(d,35633,e+f);g=Fh(d,35632,g);d.attachShader(q,f);d.attachShader(q,
+g);void 0!==c.index0AttributeName?d.bindAttribLocation(q,0,c.index0AttributeName):!0===c.morphTargets&&d.bindAttribLocation(q,0,"position");d.linkProgram(q);if(a.debug.checkShaderErrors){a=d.getProgramInfoLog(q).trim();l=d.getShaderInfoLog(f).trim();m=d.getShaderInfoLog(g).trim();n=z=!0;if(!1===d.getProgramParameter(q,35714))z=!1,k=Hh(d,f,"vertex"),r=Hh(d,g,"fragment"),console.error("THREE.WebGLProgram: shader error: ",d.getError(),"35715",d.getProgramParameter(q,35715),"gl.getProgramInfoLog",a,k,
+r);else if(""!==a)console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",a);else if(""===l||""===m)n=!1;n&&(this.diagnostics={runnable:z,programLog:a,vertexShader:{log:l,prefix:e},fragmentShader:{log:m,prefix:h}})}d.deleteShader(f);d.deleteShader(g);var u;this.getUniforms=function(){void 0===u&&(u=new Gb(d,q));return u};var p;this.getAttributes=function(){if(void 0===p){for(var a={},b=d.getProgramParameter(q,35721),c=0;c<b;c++){var e=d.getActiveAttrib(q,c).name;a[e]=d.getAttribLocation(q,e)}p=
+a}return p};this.destroy=function(){d.deleteProgram(q);this.program=void 0};this.name=c.shaderName;this.id=lk++;this.cacheKey=b;this.usedTimes=1;this.program=q;this.vertexShader=f;this.fragmentShader=g;return this}function mk(a,b,c){function d(a){if(a)a.isTexture?b=a.encoding:a.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),b=a.texture.encoding);else var b=3E3;return b}var e=[],f=c.isWebGL2,
+g=c.logarithmicDepthBuffer,h=c.floatVertexTextures,l=c.precision,m=c.maxVertexUniforms,z=c.vertexTextures,n={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"},
+k="precision isWebGL2 supportsVertexTextures outputEncoding instancing map mapEncoding matcap matcapEncoding envMap envMapMode envMapEncoding envMapCubeUV lightMap lightMapEncoding aoMap emissiveMap emissiveMapEncoding bumpMap normalMap objectSpaceNormalMap tangentSpaceNormalMap clearcoatMap clearcoatRoughnessMap clearcoatNormalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors vertexTangents vertexUvs uvsVertexOnly fog useFog fogExp2 flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights numDirLightShadows numPointLightShadows numSpotLightShadows shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking dithering sheen".split(" ");
+this.getParameters=function(e,k,t,p,x,w,ja){var q=p.fog;p=e.isMeshStandardMaterial?p.environment:null;p=e.envMap||p;var r=n[e.type];if(ja.isSkinnedMesh){var u=ja.skeleton.bones;if(h)u=1024;else{var E=Math.min(Math.floor((m-20)/4),u.length);E<u.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+u.length+" bones. This GPU supports "+E+"."),u=0):u=E}}else u=0;null!==e.precision&&(l=c.getMaxPrecision(e.precision),l!==e.precision&&console.warn("THREE.WebGLProgram.getParameters:",e.precision,"not supported, using",
+l,"instead."));r?(E=gb[r],E={name:e.type,uniforms:Oh.clone(E.uniforms),vertexShader:E.vertexShader,fragmentShader:E.fragmentShader}):E={name:e.type,uniforms:e.uniforms,vertexShader:e.vertexShader,fragmentShader:e.fragmentShader};e.onBeforeCompile(E,a);var v=a.getRenderTarget();return{isWebGL2:f,shaderID:r,shaderName:E.name,uniforms:E.uniforms,vertexShader:E.vertexShader,fragmentShader:E.fragmentShader,defines:e.defines,isRawShaderMaterial:e.isRawShaderMaterial,isShaderMaterial:e.isShaderMaterial,
+precision:l,instancing:!0===ja.isInstancedMesh,supportsVertexTextures:z,outputEncoding:null!==v?d(v.texture):a.outputEncoding,map:!!e.map,mapEncoding:d(e.map),matcap:!!e.matcap,matcapEncoding:d(e.matcap),envMap:!!p,envMapMode:p&&p.mapping,envMapEncoding:d(p),envMapCubeUV:!!p&&(306===p.mapping||307===p.mapping),lightMap:!!e.lightMap,lightMapEncoding:d(e.lightMap),aoMap:!!e.aoMap,emissiveMap:!!e.emissiveMap,emissiveMapEncoding:d(e.emissiveMap),bumpMap:!!e.bumpMap,normalMap:!!e.normalMap,objectSpaceNormalMap:1===
+e.normalMapType,tangentSpaceNormalMap:0===e.normalMapType,clearcoatMap:!!e.clearcoatMap,clearcoatRoughnessMap:!!e.clearcoatRoughnessMap,clearcoatNormalMap:!!e.clearcoatNormalMap,displacementMap:!!e.displacementMap,roughnessMap:!!e.roughnessMap,metalnessMap:!!e.metalnessMap,specularMap:!!e.specularMap,alphaMap:!!e.alphaMap,gradientMap:!!e.gradientMap,sheen:!!e.sheen,combine:e.combine,vertexTangents:e.normalMap&&e.vertexTangents,vertexColors:e.vertexColors,vertexUvs:!!e.map||!!e.bumpMap||!!e.normalMap||
+!!e.specularMap||!!e.alphaMap||!!e.emissiveMap||!!e.roughnessMap||!!e.metalnessMap||!!e.clearcoatMap||!!e.clearcoatRoughnessMap||!!e.clearcoatNormalMap||!!e.displacementMap,uvsVertexOnly:!(e.map||e.bumpMap||e.normalMap||e.specularMap||e.alphaMap||e.emissiveMap||e.roughnessMap||e.metalnessMap||e.clearcoatNormalMap)&&!!e.displacementMap,fog:!!q,useFog:e.fog,fogExp2:q&&q.isFogExp2,flatShading:e.flatShading,sizeAttenuation:e.sizeAttenuation,logarithmicDepthBuffer:g,skinning:e.skinning&&0<u,maxBones:u,
+useVertexTexture:h,morphTargets:e.morphTargets,morphNormals:e.morphNormals,maxMorphTargets:a.maxMorphTargets,maxMorphNormals:a.maxMorphNormals,numDirLights:k.directional.length,numPointLights:k.point.length,numSpotLights:k.spot.length,numRectAreaLights:k.rectArea.length,numHemiLights:k.hemi.length,numDirLightShadows:k.directionalShadowMap.length,numPointLightShadows:k.pointShadowMap.length,numSpotLightShadows:k.spotShadowMap.length,numClippingPlanes:x,numClipIntersection:w,dithering:e.dithering,shadowMapEnabled:a.shadowMap.enabled&&
+0<t.length,shadowMapType:a.shadowMap.type,toneMapping:e.toneMapped?a.toneMapping:0,physicallyCorrectLights:a.physicallyCorrectLights,premultipliedAlpha:e.premultipliedAlpha,alphaTest:e.alphaTest,doubleSided:2===e.side,flipSided:1===e.side,depthPacking:void 0!==e.depthPacking?e.depthPacking:!1,index0AttributeName:e.index0AttributeName,extensionDerivatives:e.extensions&&e.extensions.derivatives,extensionFragDepth:e.extensions&&e.extensions.fragDepth,extensionDrawBuffers:e.extensions&&e.extensions.drawBuffers,
+extensionShaderTextureLOD:e.extensions&&e.extensions.shaderTextureLOD,rendererExtensionFragDepth:f||null!==b.get("EXT_frag_depth"),rendererExtensionDrawBuffers:f||null!==b.get("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:f||null!==b.get("EXT_shader_texture_lod"),onBeforeCompile:e.onBeforeCompile}};this.getProgramCacheKey=function(b){var c=[];b.shaderID?c.push(b.shaderID):(c.push(b.fragmentShader),c.push(b.vertexShader));if(void 0!==b.defines)for(var d in b.defines)c.push(d),c.push(b.defines[d]);
+if(void 0===b.isRawShaderMaterial){for(d=0;d<k.length;d++)c.push(b[k[d]]);c.push(a.outputEncoding);c.push(a.gammaFactor)}c.push(b.onBeforeCompile.toString());return c.join()};this.acquireProgram=function(b,c){for(var d,f=0,g=e.length;f<g;f++){var h=e[f];if(h.cacheKey===c){d=h;++d.usedTimes;break}}void 0===d&&(d=new kk(a,c,b),e.push(d));return d};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=e.indexOf(a);e[b]=e[e.length-1];e.pop();a.destroy()}};this.programs=e}function nk(){var a=new WeakMap;
+return{get:function(b){var c=a.get(b);void 0===c&&(c={},a.set(b,c));return c},remove:function(b){a.delete(b)},update:function(b,c,d){a.get(b)[c]=d},dispose:function(){a=new WeakMap}}}function ok(a,b){return a.groupOrder!==b.groupOrder?a.groupOrder-b.groupOrder:a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.program!==b.program?a.program.id-b.program.id:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function pk(a,b){return a.groupOrder!==b.groupOrder?
+a.groupOrder-b.groupOrder:a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function Ph(){function a(a,d,e,m,z,n){var g=b[c];void 0===g?(g={id:a.id,object:a,geometry:d,material:e,program:e.program||f,groupOrder:m,renderOrder:a.renderOrder,z:z,group:n},b[c]=g):(g.id=a.id,g.object=a,g.geometry=d,g.material=e,g.program=e.program||f,g.groupOrder=m,g.renderOrder=a.renderOrder,g.z=z,g.group=n);c++;return g}var b=[],c=0,d=[],e=[],f={id:-1};return{opaque:d,transparent:e,
+init:function(){c=0;d.length=0;e.length=0},push:function(b,c,f,m,z,n){b=a(b,c,f,m,z,n);(!0===f.transparent?e:d).push(b)},unshift:function(b,c,f,m,z,n){b=a(b,c,f,m,z,n);(!0===f.transparent?e:d).unshift(b)},finish:function(){for(var a=c,d=b.length;a<d;a++){var e=b[a];if(null===e.id)break;e.id=null;e.object=null;e.geometry=null;e.material=null;e.program=null;e.group=null}},sort:function(a,b){1<d.length&&d.sort(a||ok);1<e.length&&e.sort(b||pk)}}}function qk(){function a(c){c=c.target;c.removeEventListener("dispose",
+a);b.delete(c)}var b=new WeakMap;return{get:function(c,d){var e=b.get(c);if(void 0===e){var f=new Ph;b.set(c,new WeakMap);b.get(c).set(d,f);c.addEventListener("dispose",a)}else f=e.get(d),void 0===f&&(f=new Ph,e.set(d,f));return f},dispose:function(){b=new WeakMap}}}function rk(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];switch(b.type){case "DirectionalLight":var c={direction:new p,color:new D};break;case "SpotLight":c={position:new p,direction:new p,color:new D,distance:0,
+coneCos:0,penumbraCos:0,decay:0};break;case "PointLight":c={position:new p,color:new D,distance:0,decay:0};break;case "HemisphereLight":c={direction:new p,skyColor:new D,groundColor:new D};break;case "RectAreaLight":c={color:new D,position:new p,halfWidth:new p,halfHeight:new p}}return a[b.id]=c}}}function sk(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];switch(b.type){case "DirectionalLight":var c={shadowBias:0,shadowRadius:1,shadowMapSize:new v};break;case "SpotLight":c={shadowBias:0,
+shadowRadius:1,shadowMapSize:new v};break;case "PointLight":c={shadowBias:0,shadowRadius:1,shadowMapSize:new v,shadowCameraNear:1,shadowCameraFar:1E3}}return a[b.id]=c}}}function tk(a,b){return(b.castShadow?1:0)-(a.castShadow?1:0)}function uk(){for(var a=new rk,b=sk(),c={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],
+directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]},d=0;9>d;d++)c.probe.push(new p);var e=new p,f=new N,g=new N;return{setup:function(d,l,m){for(var h=0,n=0,k=0,r=0;9>r;r++)c.probe[r].set(0,0,0);var q=l=0,u=0,p=0,x=0,w=0,ja=0,T=0;m=m.matrixWorldInverse;d.sort(tk);r=0;for(var Z=d.length;r<Z;r++){var C=d[r],v=C.color,Q=C.intensity,Da=C.distance,Ka=C.shadow&&C.shadow.map?C.shadow.map.texture:
+null;if(C.isAmbientLight)h+=v.r*Q,n+=v.g*Q,k+=v.b*Q;else if(C.isLightProbe)for(Ka=0;9>Ka;Ka++)c.probe[Ka].addScaledVector(C.sh.coefficients[Ka],Q);else if(C.isDirectionalLight){var U=a.get(C);U.color.copy(C.color).multiplyScalar(C.intensity);U.direction.setFromMatrixPosition(C.matrixWorld);e.setFromMatrixPosition(C.target.matrixWorld);U.direction.sub(e);U.direction.transformDirection(m);C.castShadow&&(Q=C.shadow,v=b.get(C),v.shadowBias=Q.bias,v.shadowRadius=Q.radius,v.shadowMapSize=Q.mapSize,c.directionalShadow[l]=
+v,c.directionalShadowMap[l]=Ka,c.directionalShadowMatrix[l]=C.shadow.matrix,w++);c.directional[l]=U;l++}else C.isSpotLight?(U=a.get(C),U.position.setFromMatrixPosition(C.matrixWorld),U.position.applyMatrix4(m),U.color.copy(v).multiplyScalar(Q),U.distance=Da,U.direction.setFromMatrixPosition(C.matrixWorld),e.setFromMatrixPosition(C.target.matrixWorld),U.direction.sub(e),U.direction.transformDirection(m),U.coneCos=Math.cos(C.angle),U.penumbraCos=Math.cos(C.angle*(1-C.penumbra)),U.decay=C.decay,C.castShadow&&
+(Q=C.shadow,v=b.get(C),v.shadowBias=Q.bias,v.shadowRadius=Q.radius,v.shadowMapSize=Q.mapSize,c.spotShadow[u]=v,c.spotShadowMap[u]=Ka,c.spotShadowMatrix[u]=C.shadow.matrix,T++),c.spot[u]=U,u++):C.isRectAreaLight?(U=a.get(C),U.color.copy(v).multiplyScalar(Q),U.position.setFromMatrixPosition(C.matrixWorld),U.position.applyMatrix4(m),g.identity(),f.copy(C.matrixWorld),f.premultiply(m),g.extractRotation(f),U.halfWidth.set(.5*C.width,0,0),U.halfHeight.set(0,.5*C.height,0),U.halfWidth.applyMatrix4(g),U.halfHeight.applyMatrix4(g),
+c.rectArea[p]=U,p++):C.isPointLight?(U=a.get(C),U.position.setFromMatrixPosition(C.matrixWorld),U.position.applyMatrix4(m),U.color.copy(C.color).multiplyScalar(C.intensity),U.distance=C.distance,U.decay=C.decay,C.castShadow&&(Q=C.shadow,v=b.get(C),v.shadowBias=Q.bias,v.shadowRadius=Q.radius,v.shadowMapSize=Q.mapSize,v.shadowCameraNear=Q.camera.near,v.shadowCameraFar=Q.camera.far,c.pointShadow[q]=v,c.pointShadowMap[q]=Ka,c.pointShadowMatrix[q]=C.shadow.matrix,ja++),c.point[q]=U,q++):C.isHemisphereLight&&
+(U=a.get(C),U.direction.setFromMatrixPosition(C.matrixWorld),U.direction.transformDirection(m),U.direction.normalize(),U.skyColor.copy(C.color).multiplyScalar(Q),U.groundColor.copy(C.groundColor).multiplyScalar(Q),c.hemi[x]=U,x++)}c.ambient[0]=h;c.ambient[1]=n;c.ambient[2]=k;d=c.hash;if(d.directionalLength!==l||d.pointLength!==q||d.spotLength!==u||d.rectAreaLength!==p||d.hemiLength!==x||d.numDirectionalShadows!==w||d.numPointShadows!==ja||d.numSpotShadows!==T)c.directional.length=l,c.spot.length=
+u,c.rectArea.length=p,c.point.length=q,c.hemi.length=x,c.directionalShadow.length=w,c.directionalShadowMap.length=w,c.pointShadow.length=ja,c.pointShadowMap.length=ja,c.spotShadow.length=T,c.spotShadowMap.length=T,c.directionalShadowMatrix.length=w,c.pointShadowMatrix.length=ja,c.spotShadowMatrix.length=T,d.directionalLength=l,d.pointLength=q,d.spotLength=u,d.rectAreaLength=p,d.hemiLength=x,d.numDirectionalShadows=w,d.numPointShadows=ja,d.numSpotShadows=T,c.version=vk++},state:c}}function Qh(){var a=
+new uk,b=[],c=[];return{init:function(){b.length=0;c.length=0},state:{lightsArray:b,shadowsArray:c,lights:a},setupLights:function(d){a.setup(b,c,d)},pushLight:function(a){b.push(a)},pushShadow:function(a){c.push(a)}}}function wk(){function a(c){c=c.target;c.removeEventListener("dispose",a);b.delete(c)}var b=new WeakMap;return{get:function(c,d){if(!1===b.has(c)){var e=new Qh;b.set(c,new WeakMap);b.get(c).set(d,e);c.addEventListener("dispose",a)}else!1===b.get(c).has(d)?(e=new Qh,b.get(c).set(d,e)):
+e=b.get(c).get(d);return e},dispose:function(){b=new WeakMap}}}function Hb(a){K.call(this);this.type="MeshDepthMaterial";this.depthPacking=3200;this.morphTargets=this.skinning=!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.fog=!1;this.setValues(a)}function Ib(a){K.call(this);this.type="MeshDistanceMaterial";this.referencePosition=new p;this.nearDistance=1;this.farDistance=1E3;this.morphTargets=this.skinning=
+!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.fog=!1;this.setValues(a)}function Rh(a,b,c){function d(a,b,c){c=a<<0|b<<1|c<<2;var d=n[c];void 0===d&&(d=new Hb({depthPacking:3201,morphTargets:a,skinning:b}),n[c]=d);return d}function e(a,b,c){c=a<<0|b<<1|c<<2;var d=k[c];void 0===d&&(d=new Ib({morphTargets:a,skinning:b}),k[c]=d);return d}function f(b,c,f,g,h,l,m){var n=d,k=b.customDepthMaterial;!0===g.isPointLight&&(n=e,k=b.customDistanceMaterial);
+void 0===k?(k=!1,!0===f.morphTargets&&(k=c.morphAttributes&&c.morphAttributes.position&&0<c.morphAttributes.position.length),c=!1,!0===b.isSkinnedMesh&&(!0===f.skinning?c=!0:console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",b)),b=n(k,c,!0===b.isInstancedMesh)):b=k;a.localClippingEnabled&&!0===f.clipShadows&&0!==f.clippingPlanes.length&&(k=b.uuid,n=f.uuid,c=r[k],void 0===c&&(c={},r[k]=c),k=c[n],void 0===k&&(k=b.clone(),c[n]=k),b=k);b.visible=f.visible;b.wireframe=
+f.wireframe;b.side=3===m?null!==f.shadowSide?f.shadowSide:f.side:null!==f.shadowSide?f.shadowSide:q[f.side];b.clipShadows=f.clipShadows;b.clippingPlanes=f.clippingPlanes;b.clipIntersection=f.clipIntersection;b.wireframeLinewidth=f.wireframeLinewidth;b.linewidth=f.linewidth;!0===g.isPointLight&&!0===b.isMeshDistanceMaterial&&(b.referencePosition.setFromMatrixPosition(g.matrixWorld),b.nearDistance=h,b.farDistance=l);return b}function g(c,d,e,l,m){if(!1!==c.visible){if(c.layers.test(d.layers)&&(c.isMesh||
+c.isLine||c.isPoints)&&(c.castShadow||c.receiveShadow&&3===m)&&(!c.frustumCulled||h.intersectsObject(c))){c.modelViewMatrix.multiplyMatrices(e.matrixWorldInverse,c.matrixWorld);var n=b.update(c),k=c.material;if(Array.isArray(k))for(var z=n.groups,t=0,q=z.length;t<q;t++){var r=z[t],u=k[r.materialIndex];u&&u.visible&&(u=f(c,n,u,l,e.near,e.far,m),a.renderBufferDirect(e,null,n,u,c,r))}else k.visible&&(u=f(c,n,k,l,e.near,e.far,m),a.renderBufferDirect(e,null,n,u,c,null))}c=c.children;n=0;for(k=c.length;n<
+k;n++)g(c[n],d,e,l,m)}}var h=new Gc,l=new v,m=new v,z=new R,n=[],k=[],r={},q={0:1,1:0,2:2},u=new Ca({defines:{SAMPLE_RATE:.25,HALF_SAMPLE_RATE:.125},uniforms:{shadow_pass:{value:null},resolution:{value:new v},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include <packing>\nvoid main() {\n  float mean = 0.0;\n  float squared_mean = 0.0;\n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy  ) / resolution ) );\n  for ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n    #ifdef HORIZONAL_PASS\n      vec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n      mean += distribution.x;\n      squared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n    #else\n      float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0,  i )  * radius ) / resolution ) );\n      mean += depth;\n      squared_mean += depth * depth;\n    #endif\n  }\n  mean = mean * HALF_SAMPLE_RATE;\n  squared_mean = squared_mean * HALF_SAMPLE_RATE;\n  float std_dev = sqrt( squared_mean - mean * mean );\n  gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),
+p=u.clone();p.defines.HORIZONAL_PASS=1;var x=new F;x.setAttribute("position",new G(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));var w=new ea(x,u),ja=this;this.enabled=!1;this.autoUpdate=!0;this.needsUpdate=!1;this.type=1;this.render=function(d,e,f){if(!1!==ja.enabled&&(!1!==ja.autoUpdate||!1!==ja.needsUpdate)&&0!==d.length){var n=a.getRenderTarget(),k=a.getActiveCubeFace(),t=a.getActiveMipmapLevel(),q=a.state;q.setBlending(0);q.buffers.color.setClear(1,1,1,1);q.buffers.depth.setTest(!0);q.setScissorTest(!1);
+for(var r=0,E=d.length;r<E;r++){var x=d[r],C=x.shadow;if(void 0===C)console.warn("THREE.WebGLShadowMap:",x,"has no shadow.");else{l.copy(C.mapSize);var v=C.getFrameExtents();l.multiply(v);m.copy(C.mapSize);if(l.x>c||l.y>c)l.x>c&&(m.x=Math.floor(c/v.x),l.x=m.x*v.x,C.mapSize.x=m.x),l.y>c&&(m.y=Math.floor(c/v.y),l.y=m.y*v.y,C.mapSize.y=m.y);null!==C.map||C.isPointLightShadow||3!==this.type||(v={minFilter:1006,magFilter:1006,format:1023},C.map=new Ba(l.x,l.y,v),C.map.texture.name=x.name+".shadowMap",
+C.mapPass=new Ba(l.x,l.y,v),C.camera.updateProjectionMatrix());null===C.map&&(v={minFilter:1003,magFilter:1003,format:1023},C.map=new Ba(l.x,l.y,v),C.map.texture.name=x.name+".shadowMap",C.camera.updateProjectionMatrix());a.setRenderTarget(C.map);a.clear();v=C.getViewportCount();for(var Z=0;Z<v;Z++){var T=C.getViewport(Z);z.set(m.x*T.x,m.y*T.y,m.x*T.z,m.y*T.w);q.viewport(z);C.updateMatrices(x,Z);h=C.getFrustum();g(e,f,C.camera,x,this.type)}C.isPointLightShadow||3!==this.type||(x=C,C=f,v=b.update(w),
+u.uniforms.shadow_pass.value=x.map.texture,u.uniforms.resolution.value=x.mapSize,u.uniforms.radius.value=x.radius,a.setRenderTarget(x.mapPass),a.clear(),a.renderBufferDirect(C,null,v,u,w,null),p.uniforms.shadow_pass.value=x.mapPass.texture,p.uniforms.resolution.value=x.mapSize,p.uniforms.radius.value=x.radius,a.setRenderTarget(x.map),a.clear(),a.renderBufferDirect(C,null,v,p,w,null))}}ja.needsUpdate=!1;a.setRenderTarget(n,k,t)}}}function xk(a,b,c){function d(b,c,d){var e=new Uint8Array(4),f=a.createTexture();
+a.bindTexture(b,f);a.texParameteri(b,10241,9728);a.texParameteri(b,10240,9728);for(b=0;b<d;b++)a.texImage2D(c+b,0,6408,1,1,0,6408,5121,e);return f}function e(c,d){p[c]=1;0===x[c]&&(a.enableVertexAttribArray(c),x[c]=1);w[c]!==d&&((t?a:b.get("ANGLE_instanced_arrays"))[t?"vertexAttribDivisor":"vertexAttribDivisorANGLE"](c,d),w[c]=d)}function f(b){!0!==v[b]&&(a.enable(b),v[b]=!0)}function g(b){!1!==v[b]&&(a.disable(b),v[b]=!1)}function h(b,c,d,e,h,l,m,n){if(0===b)Z&&(g(3042),Z=!1);else if(Z||(f(3042),
+Z=!0),5!==b){if(b!==C||n!==y){if(100!==B||100!==Ka)a.blendEquation(32774),Ka=B=100;if(n)switch(b){case 1:a.blendFuncSeparate(1,771,1,771);break;case 2:a.blendFunc(1,1);break;case 3:a.blendFuncSeparate(0,0,769,771);break;case 4:a.blendFuncSeparate(0,768,0,770);break;default:console.error("THREE.WebGLState: Invalid blending: ",b)}else switch(b){case 1:a.blendFuncSeparate(770,771,1,771);break;case 2:a.blendFunc(770,1);break;case 3:a.blendFunc(0,769);break;case 4:a.blendFunc(0,768);break;default:console.error("THREE.WebGLState: Invalid blending: ",
+b)}A=U=Da=Q=null;C=b;y=n}}else{h=h||c;l=l||d;m=m||e;if(c!==B||h!==Ka)a.blendEquationSeparate(xa[c],xa[h]),B=c,Ka=h;if(d!==Q||e!==Da||l!==U||m!==A)a.blendFuncSeparate(J[d],J[e],J[l],J[m]),Q=d,Da=e,U=l,A=m;C=b;y=null}}function l(b){D!==b&&(b?a.frontFace(2304):a.frontFace(2305),D=b)}function m(b){0!==b?(f(2884),b!==F&&(1===b?a.cullFace(1029):2===b?a.cullFace(1028):a.cullFace(1032))):g(2884);F=b}function k(b,c,d){if(b){if(f(32823),G!==c||K!==d)a.polygonOffset(c,d),G=c,K=d}else g(32823)}function n(b){void 0===
+b&&(b=33984+L-1);N!==b&&(a.activeTexture(b),N=b)}var t=c.isWebGL2,r=new function(){var b=!1,c=new R,d=null,e=new R(0,0,0,0);return{setMask:function(c){d===c||b||(a.colorMask(c,c,c,c),d=c)},setLocked:function(a){b=a},setClear:function(b,d,f,g,h){!0===h&&(b*=g,d*=g,f*=g);c.set(b,d,f,g);!1===e.equals(c)&&(a.clearColor(b,d,f,g),e.copy(c))},reset:function(){b=!1;d=null;e.set(-1,0,0,0)}}},q=new function(){var b=!1,c=null,d=null,e=null;return{setTest:function(a){a?f(2929):g(2929)},setMask:function(d){c===
+d||b||(a.depthMask(d),c=d)},setFunc:function(b){if(d!==b){if(b)switch(b){case 0:a.depthFunc(512);break;case 1:a.depthFunc(519);break;case 2:a.depthFunc(513);break;case 3:a.depthFunc(515);break;case 4:a.depthFunc(514);break;case 5:a.depthFunc(518);break;case 6:a.depthFunc(516);break;case 7:a.depthFunc(517);break;default:a.depthFunc(515)}else a.depthFunc(515);d=b}},setLocked:function(a){b=a},setClear:function(b){e!==b&&(a.clearDepth(b),e=b)},reset:function(){b=!1;e=d=c=null}}},u=new function(){var b=
+!1,c=null,d=null,e=null,h=null,l=null,m=null,n=null,k=null;return{setTest:function(a){b||(a?f(2960):g(2960))},setMask:function(d){c===d||b||(a.stencilMask(d),c=d)},setFunc:function(b,c,f){if(d!==b||e!==c||h!==f)a.stencilFunc(b,c,f),d=b,e=c,h=f},setOp:function(b,c,d){if(l!==b||m!==c||n!==d)a.stencilOp(b,c,d),l=b,m=c,n=d},setLocked:function(a){b=a},setClear:function(b){k!==b&&(a.clearStencil(b),k=b)},reset:function(){b=!1;k=n=m=l=h=e=d=c=null}}};c=a.getParameter(34921);var p=new Uint8Array(c),x=new Uint8Array(c),
+w=new Uint8Array(c),v={},T=null,Z=null,C=null,B=null,Q=null,Da=null,Ka=null,U=null,A=null,y=!1,D=null,F=null,H=null,G=null,K=null,L=a.getParameter(35661),O=!1;c=0;c=a.getParameter(7938);-1!==c.indexOf("WebGL")?(c=parseFloat(/^WebGL ([0-9])/.exec(c)[1]),O=1<=c):-1!==c.indexOf("OpenGL ES")&&(c=parseFloat(/^OpenGL ES ([0-9])/.exec(c)[1]),O=2<=c);var N=null,Jd={},aa=new R,Sh=new R,Ra={};Ra[3553]=d(3553,3553,1);Ra[34067]=d(34067,34069,6);r.setClear(0,0,0,1);q.setClear(1);u.setClear(0);f(2929);q.setFunc(3);
+l(!1);m(1);f(2884);h(0);var xa={100:32774,101:32778,102:32779};t?(xa[103]=32775,xa[104]=32776):(c=b.get("EXT_blend_minmax"),null!==c&&(xa[103]=c.MIN_EXT,xa[104]=c.MAX_EXT));var J={200:0,201:1,202:768,204:770,210:776,208:774,206:772,203:769,205:771,209:775,207:773};return{buffers:{color:r,depth:q,stencil:u},initAttributes:function(){for(var a=0,b=p.length;a<b;a++)p[a]=0},enableAttribute:function(a){e(a,0)},enableAttributeAndDivisor:e,disableUnusedAttributes:function(){for(var b=0,c=x.length;b!==c;++b)x[b]!==
+p[b]&&(a.disableVertexAttribArray(b),x[b]=0)},vertexAttribPointer:function(b,c,d,e,f,g){!0!==t||5124!==d&&5125!==d?a.vertexAttribPointer(b,c,d,e,f,g):a.vertexAttribIPointer(b,c,d,e,f,g)},enable:f,disable:g,useProgram:function(b){return T!==b?(a.useProgram(b),T=b,!0):!1},setBlending:h,setMaterial:function(a,b){2===a.side?g(2884):f(2884);var c=1===a.side;b&&(c=!c);l(c);1===a.blending&&!1===a.transparent?h(0):h(a.blending,a.blendEquation,a.blendSrc,a.blendDst,a.blendEquationAlpha,a.blendSrcAlpha,a.blendDstAlpha,
+a.premultipliedAlpha);q.setFunc(a.depthFunc);q.setTest(a.depthTest);q.setMask(a.depthWrite);r.setMask(a.colorWrite);b=a.stencilWrite;u.setTest(b);b&&(u.setMask(a.stencilWriteMask),u.setFunc(a.stencilFunc,a.stencilRef,a.stencilFuncMask),u.setOp(a.stencilFail,a.stencilZFail,a.stencilZPass));k(a.polygonOffset,a.polygonOffsetFactor,a.polygonOffsetUnits)},setFlipSided:l,setCullFace:m,setLineWidth:function(b){b!==H&&(O&&a.lineWidth(b),H=b)},setPolygonOffset:k,setScissorTest:function(a){a?f(3089):g(3089)},
+activeTexture:n,bindTexture:function(b,c){null===N&&n();var d=Jd[N];void 0===d&&(d={type:void 0,texture:void 0},Jd[N]=d);if(d.type!==b||d.texture!==c)a.bindTexture(b,c||Ra[b]),d.type=b,d.texture=c},unbindTexture:function(){var b=Jd[N];void 0!==b&&void 0!==b.type&&(a.bindTexture(b.type,null),b.type=void 0,b.texture=void 0)},compressedTexImage2D:function(){try{a.compressedTexImage2D.apply(a,arguments)}catch(ca){console.error("THREE.WebGLState:",ca)}},texImage2D:function(){try{a.texImage2D.apply(a,arguments)}catch(ca){console.error("THREE.WebGLState:",
+ca)}},texImage3D:function(){try{a.texImage3D.apply(a,arguments)}catch(ca){console.error("THREE.WebGLState:",ca)}},scissor:function(b){!1===aa.equals(b)&&(a.scissor(b.x,b.y,b.z,b.w),aa.copy(b))},viewport:function(b){!1===Sh.equals(b)&&(a.viewport(b.x,b.y,b.z,b.w),Sh.copy(b))},reset:function(){for(var b=0;b<x.length;b++)1===x[b]&&(a.disableVertexAttribArray(b),x[b]=0);v={};N=null;Jd={};F=D=C=T=null;r.reset();q.reset();u.reset()}}}function yk(a,b,c,d,e,f,g){function h(a,b){return G?new OffscreenCanvas(a,
+b):document.createElementNS("http://www.w3.org/1999/xhtml","canvas")}function l(a,b,c,d){var e=1;if(a.width>d||a.height>d)e=d/Math.max(a.width,a.height);if(1>e||!0===b){if("undefined"!==typeof HTMLImageElement&&a instanceof HTMLImageElement||"undefined"!==typeof HTMLCanvasElement&&a instanceof HTMLCanvasElement||"undefined"!==typeof ImageBitmap&&a instanceof ImageBitmap)return d=b?O.floorPowerOfTwo:Math.floor,b=d(e*a.width),e=d(e*a.height),void 0===H&&(H=h(b,e)),c=c?h(b,e):H,c.width=b,c.height=e,
+c.getContext("2d").drawImage(a,0,0,b,e),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+a.width+"x"+a.height+") to ("+b+"x"+e+")."),c;"data"in a&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+a.width+"x"+a.height+").")}return a}function m(a){return O.isPowerOfTwo(a.width)&&O.isPowerOfTwo(a.height)}function k(a,b){return a.generateMipmaps&&b&&1003!==a.minFilter&&1006!==a.minFilter}function n(b,c,e,f){a.generateMipmap(b);d.get(c).__maxMipLevel=Math.log(Math.max(e,
+f))*Math.LOG2E}function t(c,d,e){if(!1===Da)return d;if(null!==c){if(void 0!==a[c])return a[c];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+c+"'")}c=d;6403===d&&(5126===e&&(c=33326),5131===e&&(c=33325),5121===e&&(c=33321));6407===d&&(5126===e&&(c=34837),5131===e&&(c=34843),5121===e&&(c=32849));6408===d&&(5126===e&&(c=34836),5131===e&&(c=34842),5121===e&&(c=32856));33325!==c&&33326!==c&&34842!==c&&34836!==c||b.get("EXT_color_buffer_float");return c}function r(a){return 1003===
+a||1004===a||1005===a?9728:9729}function q(b){b=b.target;b.removeEventListener("dispose",q);var c=d.get(b);void 0!==c.__webglInit&&(a.deleteTexture(c.__webglTexture),d.remove(b));b.isVideoTexture&&F.delete(b);g.memory.textures--}function u(b){b=b.target;b.removeEventListener("dispose",u);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b.isWebGLCubeRenderTarget)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),
+c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer),c.__webglMultisampledFramebuffer&&a.deleteFramebuffer(c.__webglMultisampledFramebuffer),c.__webglColorRenderbuffer&&a.deleteRenderbuffer(c.__webglColorRenderbuffer),c.__webglDepthRenderbuffer&&a.deleteRenderbuffer(c.__webglDepthRenderbuffer);d.remove(b.texture);d.remove(b)}g.memory.textures--}function p(a,b){var e=d.get(a);
+if(a.isVideoTexture){var f=g.render.frame;F.get(a)!==f&&(F.set(a,f),a.update())}if(0<a.version&&e.__version!==a.version)if(f=a.image,void 0===f)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else if(!1===f.complete)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");else{Z(e,a,b);return}c.activeTexture(33984+b);c.bindTexture(3553,e.__webglTexture)}function x(b,e){if(6===b.image.length){var g=d.get(b);if(0<b.version&&g.__version!==
+b.version){T(g,b);c.activeTexture(33984+e);c.bindTexture(34067,g.__webglTexture);a.pixelStorei(37440,b.flipY);var h=b&&(b.isCompressedTexture||b.image[0].isCompressedTexture);e=b.image[0]&&b.image[0].isDataTexture;for(var z=[],q=0;6>q;q++)z[q]=h||e?e?b.image[q].image:b.image[q]:l(b.image[q],!1,!0,U);var r=z[0],u=m(r)||Da,p=f.convert(b.format),E=f.convert(b.type),w=t(b.internalFormat,p,E);v(34067,b,u);if(h){for(q=0;6>q;q++){var x=z[q].mipmaps;for(h=0;h<x.length;h++){var aa=x[h];1023!==b.format&&1022!==
+b.format?null!==p?c.compressedTexImage2D(34069+q,h,w,aa.width,aa.height,0,aa.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):c.texImage2D(34069+q,h,w,aa.width,aa.height,0,p,E,aa.data)}}g.__maxMipLevel=x.length-1}else{x=b.mipmaps;for(q=0;6>q;q++)if(e)for(c.texImage2D(34069+q,0,w,z[q].width,z[q].height,0,p,E,z[q].data),h=0;h<x.length;h++)aa=x[h],aa=aa.image[q].image,c.texImage2D(34069+q,h+1,w,aa.width,aa.height,0,p,E,aa.data);else for(c.texImage2D(34069+
+q,0,w,p,E,z[q]),h=0;h<x.length;h++)aa=x[h],c.texImage2D(34069+q,h+1,w,p,E,aa.image[q]);g.__maxMipLevel=x.length}k(b,u)&&n(34067,b,r.width,r.height);g.__version=b.version;if(b.onUpdate)b.onUpdate(b)}else c.activeTexture(33984+e),c.bindTexture(34067,g.__webglTexture)}}function w(a,b){c.activeTexture(33984+b);c.bindTexture(34067,d.get(a).__webglTexture)}function v(c,f,g){g?(a.texParameteri(c,10242,L[f.wrapS]),a.texParameteri(c,10243,L[f.wrapT]),32879!==c&&35866!==c||a.texParameteri(c,32882,L[f.wrapR]),
+a.texParameteri(c,10240,N[f.magFilter]),a.texParameteri(c,10241,N[f.minFilter])):(a.texParameteri(c,10242,33071),a.texParameteri(c,10243,33071),32879!==c&&35866!==c||a.texParameteri(c,32882,33071),1001===f.wrapS&&1001===f.wrapT||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),a.texParameteri(c,10240,r(f.magFilter)),a.texParameteri(c,10241,r(f.minFilter)),1003!==f.minFilter&&1006!==f.minFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter."));
+!(g=b.get("EXT_texture_filter_anisotropic"))||1015===f.type&&null===b.get("OES_texture_float_linear")||1016===f.type&&null===(Da||b.get("OES_texture_half_float_linear"))||!(1<f.anisotropy||d.get(f).__currentAnisotropy)||(a.texParameterf(c,g.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(f.anisotropy,e.getMaxAnisotropy())),d.get(f).__currentAnisotropy=f.anisotropy)}function T(b,c){void 0===b.__webglInit&&(b.__webglInit=!0,c.addEventListener("dispose",q),b.__webglTexture=a.createTexture(),g.memory.textures++)}
+function Z(b,d,e){var g=3553;d.isDataTexture2DArray&&(g=35866);d.isDataTexture3D&&(g=32879);T(b,d);c.activeTexture(33984+e);c.bindTexture(g,b.__webglTexture);a.pixelStorei(37440,d.flipY);a.pixelStorei(37441,d.premultiplyAlpha);a.pixelStorei(3317,d.unpackAlignment);e=Da?!1:1001!==d.wrapS||1001!==d.wrapT||1003!==d.minFilter&&1006!==d.minFilter;e=e&&!1===m(d.image);e=l(d.image,e,!1,y);var h=m(e)||Da,z=f.convert(d.format),q=f.convert(d.type),r=t(d.internalFormat,z,q);v(g,d,h);var u=d.mipmaps;if(d.isDepthTexture)r=
+6402,Da?r=1015===d.type?36012:1014===d.type?33190:1020===d.type?35056:33189:1015===d.type&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),1026===d.format&&6402===r&&1012!==d.type&&1014!==d.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),d.type=1012,q=f.convert(d.type)),1027===d.format&&6402===r&&(r=34041,1020!==d.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),
+d.type=1020,q=f.convert(d.type))),c.texImage2D(3553,0,r,e.width,e.height,0,z,q,null);else if(d.isDataTexture)if(0<u.length&&h){for(var p=0,E=u.length;p<E;p++){var w=u[p];c.texImage2D(3553,p,r,w.width,w.height,0,z,q,w.data)}d.generateMipmaps=!1;b.__maxMipLevel=u.length-1}else c.texImage2D(3553,0,r,e.width,e.height,0,z,q,e.data),b.__maxMipLevel=0;else if(d.isCompressedTexture){p=0;for(E=u.length;p<E;p++)w=u[p],1023!==d.format&&1022!==d.format?null!==z?c.compressedTexImage2D(3553,p,r,w.width,w.height,
+0,w.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):c.texImage2D(3553,p,r,w.width,w.height,0,z,q,w.data);b.__maxMipLevel=u.length-1}else if(d.isDataTexture2DArray)c.texImage3D(35866,0,r,e.width,e.height,e.depth,0,z,q,e.data),b.__maxMipLevel=0;else if(d.isDataTexture3D)c.texImage3D(32879,0,r,e.width,e.height,e.depth,0,z,q,e.data),b.__maxMipLevel=0;else if(0<u.length&&h){p=0;for(E=u.length;p<E;p++)w=u[p],c.texImage2D(3553,p,r,z,q,
+w);d.generateMipmaps=!1;b.__maxMipLevel=u.length-1}else c.texImage2D(3553,0,r,z,q,e),b.__maxMipLevel=0;k(d,h)&&n(g,d,e.width,e.height);b.__version=d.version;if(d.onUpdate)d.onUpdate(d)}function C(b,e,g,h){var l=f.convert(e.texture.format),m=f.convert(e.texture.type),n=t(e.texture.internalFormat,l,m);c.texImage2D(h,0,n,e.width,e.height,0,l,m,null);a.bindFramebuffer(36160,b);a.framebufferTexture2D(36160,g,h,d.get(e.texture).__webglTexture,0);a.bindFramebuffer(36160,null)}function B(b,c,d){a.bindRenderbuffer(36161,
+b);if(c.depthBuffer&&!c.stencilBuffer){var e=33189;d?((d=c.depthTexture)&&d.isDepthTexture&&(1015===d.type?e=36012:1014===d.type&&(e=33190)),d=Q(c),a.renderbufferStorageMultisample(36161,d,e,c.width,c.height)):a.renderbufferStorage(36161,e,c.width,c.height);a.framebufferRenderbuffer(36160,36096,36161,b)}else c.depthBuffer&&c.stencilBuffer?(d?(d=Q(c),a.renderbufferStorageMultisample(36161,d,35056,c.width,c.height)):a.renderbufferStorage(36161,34041,c.width,c.height),a.framebufferRenderbuffer(36160,
+33306,36161,b)):(b=f.convert(c.texture.format),e=f.convert(c.texture.type),e=t(c.texture.internalFormat,b,e),d?(d=Q(c),a.renderbufferStorageMultisample(36161,d,e,c.width,c.height)):a.renderbufferStorage(36161,e,c.width,c.height));a.bindRenderbuffer(36161,null)}function Q(a){return Da&&a.isWebGLMultisampleRenderTarget?Math.min(D,a.samples):0}var Da=e.isWebGL2,A=e.maxTextures,U=e.maxCubemapSize,y=e.maxTextureSize,D=e.maxSamples,F=new WeakMap,H,G=!1;try{G="undefined"!==typeof OffscreenCanvas&&null!==
+(new OffscreenCanvas(1,1)).getContext("2d")}catch(Jd){}var K=0,L={1E3:10497,1001:33071,1002:33648},N={1003:9728,1004:9984,1005:9986,1006:9729,1007:9985,1008:9987},M=!1,R=!1;this.allocateTextureUnit=function(){var a=K;a>=A&&console.warn("THREE.WebGLTextures: Trying to use "+a+" texture units while this GPU supports only "+A);K+=1;return a};this.resetTextureUnits=function(){K=0};this.setTexture2D=p;this.setTexture2DArray=function(a,b){var e=d.get(a);0<a.version&&e.__version!==a.version?Z(e,a,b):(c.activeTexture(33984+
+b),c.bindTexture(35866,e.__webglTexture))};this.setTexture3D=function(a,b){var e=d.get(a);0<a.version&&e.__version!==a.version?Z(e,a,b):(c.activeTexture(33984+b),c.bindTexture(32879,e.__webglTexture))};this.setTextureCube=x;this.setTextureCubeDynamic=w;this.setupRenderTarget=function(b){var e=d.get(b),h=d.get(b.texture);b.addEventListener("dispose",u);h.__webglTexture=a.createTexture();g.memory.textures++;var l=!0===b.isWebGLCubeRenderTarget,z=!0===b.isWebGLMultisampleRenderTarget,q=m(b)||Da;!Da||
+1022!==b.texture.format||1015!==b.texture.type&&1016!==b.texture.type||(b.texture.format=1023,console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead."));if(l)for(e.__webglFramebuffer=[],z=0;6>z;z++)e.__webglFramebuffer[z]=a.createFramebuffer();else if(e.__webglFramebuffer=a.createFramebuffer(),z)if(Da){e.__webglMultisampledFramebuffer=a.createFramebuffer();e.__webglColorRenderbuffer=a.createRenderbuffer();a.bindRenderbuffer(36161,e.__webglColorRenderbuffer);
+z=f.convert(b.texture.format);var r=f.convert(b.texture.type);z=t(b.texture.internalFormat,z,r);r=Q(b);a.renderbufferStorageMultisample(36161,r,z,b.width,b.height);a.bindFramebuffer(36160,e.__webglMultisampledFramebuffer);a.framebufferRenderbuffer(36160,36064,36161,e.__webglColorRenderbuffer);a.bindRenderbuffer(36161,null);b.depthBuffer&&(e.__webglDepthRenderbuffer=a.createRenderbuffer(),B(e.__webglDepthRenderbuffer,b,!0));a.bindFramebuffer(36160,null)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");
+if(l){c.bindTexture(34067,h.__webglTexture);v(34067,b.texture,q);for(z=0;6>z;z++)C(e.__webglFramebuffer[z],b,36064,34069+z);k(b.texture,q)&&n(34067,b.texture,b.width,b.height);c.bindTexture(34067,null)}else c.bindTexture(3553,h.__webglTexture),v(3553,b.texture,q),C(e.__webglFramebuffer,b,36064,3553),k(b.texture,q)&&n(3553,b.texture,b.width,b.height),c.bindTexture(3553,null);if(b.depthBuffer){e=d.get(b);h=!0===b.isWebGLCubeRenderTarget;if(b.depthTexture){if(h)throw Error("target.depthTexture not supported in Cube render targets");
+if(b&&b.isWebGLCubeRenderTarget)throw Error("Depth Texture with cube render targets is not supported");a.bindFramebuffer(36160,e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate=!0);
+p(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(36160,36096,3553,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(36160,33306,3553,e,0);else throw Error("Unknown depthTexture format");}else if(h)for(e.__webglDepthbuffer=[],h=0;6>h;h++)a.bindFramebuffer(36160,e.__webglFramebuffer[h]),e.__webglDepthbuffer[h]=a.createRenderbuffer(),B(e.__webglDepthbuffer[h],b,!1);else a.bindFramebuffer(36160,e.__webglFramebuffer),e.__webglDepthbuffer=
+a.createRenderbuffer(),B(e.__webglDepthbuffer,b,!1);a.bindFramebuffer(36160,null)}};this.updateRenderTargetMipmap=function(a){var b=a.texture,e=m(a)||Da;if(k(b,e)){e=a.isWebGLCubeRenderTarget?34067:3553;var f=d.get(b).__webglTexture;c.bindTexture(e,f);n(e,b,a.width,a.height);c.bindTexture(e,null)}};this.updateMultisampleRenderTarget=function(b){if(b.isWebGLMultisampleRenderTarget)if(Da){var c=d.get(b);a.bindFramebuffer(36008,c.__webglMultisampledFramebuffer);a.bindFramebuffer(36009,c.__webglFramebuffer);
+var e=b.width,f=b.height,g=16384;b.depthBuffer&&(g|=256);b.stencilBuffer&&(g|=1024);a.blitFramebuffer(0,0,e,f,0,0,e,f,g,9728);a.bindFramebuffer(36160,c.__webglMultisampledFramebuffer)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")};this.safeSetTexture2D=function(a,b){a&&a.isWebGLRenderTarget&&(!1===M&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),M=!0),a=a.texture);
+p(a,b)};this.safeSetTextureCube=function(a,b){a&&a.isWebGLCubeRenderTarget&&(!1===R&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),R=!0),a=a.texture);a&&a.isCubeTexture||Array.isArray(a.image)&&6===a.image.length?x(a,b):w(a,b)}}function Th(a,b,c){var d=c.isWebGL2;return{convert:function(a){if(1009===a)return 5121;if(1017===a)return 32819;if(1018===a)return 32820;if(1019===a)return 33635;if(1010===a)return 5120;
+if(1011===a)return 5122;if(1012===a)return 5123;if(1013===a)return 5124;if(1014===a)return 5125;if(1015===a)return 5126;if(1016===a){if(d)return 5131;var c=b.get("OES_texture_half_float");return null!==c?c.HALF_FLOAT_OES:null}if(1021===a)return 6406;if(1022===a)return 6407;if(1023===a)return 6408;if(1024===a)return 6409;if(1025===a)return 6410;if(1026===a)return 6402;if(1027===a)return 34041;if(1028===a)return 6403;if(1029===a)return 36244;if(1030===a)return 33319;if(1031===a)return 33320;if(1032===
+a)return 36248;if(1033===a)return 36249;if(33776===a||33777===a||33778===a||33779===a)if(c=b.get("WEBGL_compressed_texture_s3tc"),null!==c){if(33776===a)return c.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===a)return c.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===a)return c.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(33779===a)return c.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(35840===a||35841===a||35842===a||35843===a)if(c=b.get("WEBGL_compressed_texture_pvrtc"),null!==c){if(35840===a)return c.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
+if(35841===a)return c.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===a)return c.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===a)return c.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(36196===a)return c=b.get("WEBGL_compressed_texture_etc1"),null!==c?c.COMPRESSED_RGB_ETC1_WEBGL:null;if(37492===a||37496===a)if(c=b.get("WEBGL_compressed_texture_etc"),null!==c){if(37492===a)return c.COMPRESSED_RGB8_ETC2;if(37496===a)return c.COMPRESSED_RGBA8_ETC2_EAC}if(37808===a||37809===a||37810===a||37811===a||37812===
+a||37813===a||37814===a||37815===a||37816===a||37817===a||37818===a||37819===a||37820===a||37821===a||37840===a||37841===a||37842===a||37843===a||37844===a||37845===a||37846===a||37847===a||37848===a||37849===a||37850===a||37851===a||37852===a||37853===a)return c=b.get("WEBGL_compressed_texture_astc"),null!==c?a:null;if(36492===a)return c=b.get("EXT_texture_compression_bptc"),null!==c?a:null;if(1020===a){if(d)return 34042;c=b.get("WEBGL_depth_texture");return null!==c?c.UNSIGNED_INT_24_8_WEBGL:null}}}}
+function Le(a){P.call(this);this.cameras=a||[]}function Kc(){y.call(this);this.type="Group"}function Me(){this._grip=this._targetRay=null}function Uh(a,b){function c(a){var b=q.get(a.inputSource);b&&b.dispatchEvent({type:a.type})}function d(){q.forEach(function(a,b){a.disconnect(b)});q.clear();a.setFramebuffer(null);a.setRenderTarget(a.getRenderTarget());Q.stop();h.isPresenting=!1;h.dispatchEvent({type:"sessionend"})}function e(a){k=a;Q.setContext(l);Q.start();h.isPresenting=!0;h.dispatchEvent({type:"sessionstart"})}
+function f(a){for(var b=l.inputSources,c=0;c<r.length;c++)q.set(b[c],r[c]);for(c=0;c<a.removed.length;c++){b=a.removed[c];var d=q.get(b);d&&(d.dispatchEvent({type:"disconnected",data:b}),q.delete(b))}for(c=0;c<a.added.length;c++)b=a.added[c],(d=q.get(b))&&d.dispatchEvent({type:"connected",data:b})}function g(a,b){null===b?a.matrixWorld.copy(a.matrix):a.matrixWorld.multiplyMatrices(b.matrixWorld,a.matrix);a.matrixWorldInverse.getInverse(a.matrixWorld)}var h=this,l=null,m=1,k=null,n="local-floor",t=
+null,r=[],q=new Map,u=new P;u.layers.enable(1);u.viewport=new R;var E=new P;E.layers.enable(2);E.viewport=new R;var x=[u,E],w=new Le;w.layers.enable(1);w.layers.enable(2);var v=null,T=null;this.isPresenting=this.enabled=!1;this.getController=function(a){var b=r[a];void 0===b&&(b=new Me,r[a]=b);return b.getTargetRaySpace()};this.getControllerGrip=function(a){var b=r[a];void 0===b&&(b=new Me,r[a]=b);return b.getGripSpace()};this.setFramebufferScaleFactor=function(a){m=a;!0===h.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")};
+this.setReferenceSpaceType=function(a){n=a;!0===h.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")};this.getReferenceSpace=function(){return k};this.getSession=function(){return l};this.setSession=function(a){l=a;null!==l&&(l.addEventListener("select",c),l.addEventListener("selectstart",c),l.addEventListener("selectend",c),l.addEventListener("squeeze",c),l.addEventListener("squeezestart",c),l.addEventListener("squeezeend",c),l.addEventListener("end",
+d),a=b.getContextAttributes(),!0!==a.xrCompatible&&b.makeXRCompatible(),a=new XRWebGLLayer(l,b,{antialias:a.antialias,alpha:a.alpha,depth:a.depth,stencil:a.stencil,framebufferScaleFactor:m}),l.updateRenderState({baseLayer:a}),l.requestReferenceSpace(n).then(e),l.addEventListener("inputsourceschange",f))};var Z=new p,C=new p;this.getCamera=function(a){w.near=E.near=u.near=a.near;w.far=E.far=u.far=a.far;if(v!==w.near||T!==w.far)l.updateRenderState({depthNear:w.near,depthFar:w.far}),v=w.near,T=w.far;
+var b=a.parent,c=w.cameras;g(w,b);for(var d=0;d<c.length;d++)g(c[d],b);a.matrixWorld.copy(w.matrixWorld);a=a.children;d=0;for(b=a.length;d<b;d++)a[d].updateMatrixWorld(!0);if(2===c.length){Z.setFromMatrixPosition(u.matrixWorld);C.setFromMatrixPosition(E.matrixWorld);c=Z.distanceTo(C);var e=u.projectionMatrix.elements,f=E.projectionMatrix.elements,h=e[14]/(e[10]-1);d=e[14]/(e[10]+1);a=(e[9]+1)/e[5];b=(e[9]-1)/e[5];var m=(e[8]-1)/e[0],n=(f[8]+1)/f[0];f=h*m;e=h*n;n=c/(-m+n);m=n*-m;u.matrixWorld.decompose(w.position,
+w.quaternion,w.scale);w.translateX(m);w.translateZ(n);w.matrixWorld.compose(w.position,w.quaternion,w.scale);w.matrixWorldInverse.getInverse(w.matrixWorld);h+=n;n=d+n;w.projectionMatrix.makePerspective(f-m,e+(c-m),a*d/n*h,b*d/n*h,h,n)}else w.projectionMatrix.copy(u.projectionMatrix);return w};var B=null,Q=new uh;Q.setAnimationLoop(function(b,c){t=c.getViewerPose(k);if(null!==t){var d=t.views,e=l.renderState.baseLayer;a.setFramebuffer(e.framebuffer);var f=!1;d.length!==w.cameras.length&&(w.cameras.length=
+0,f=!0);for(var g=0;g<d.length;g++){var h=d[g],m=e.getViewport(h),n=x[g];n.matrix.fromArray(h.transform.matrix);n.projectionMatrix.fromArray(h.projectionMatrix);n.viewport.set(m.x,m.y,m.width,m.height);0===g&&w.matrix.copy(n.matrix);!0===f&&w.cameras.push(n)}}d=l.inputSources;for(g=0;g<r.length;g++)r[g].update(d[g],c,k);B&&B(b,c)});this.setAnimationLoop=function(a){B=a};this.dispose=function(){}}function zk(a){function b(b,c,f){b.opacity.value=c.opacity;c.color&&b.diffuse.value.copy(c.color);c.emissive&&
+b.emissive.value.copy(c.emissive).multiplyScalar(c.emissiveIntensity);c.map&&(b.map.value=c.map);c.alphaMap&&(b.alphaMap.value=c.alphaMap);c.specularMap&&(b.specularMap.value=c.specularMap);if(f=c.envMap||f)b.envMap.value=f,b.flipEnvMap.value=f.isCubeTexture?-1:1,b.reflectivity.value=c.reflectivity,b.refractionRatio.value=c.refractionRatio,b.maxMipLevel.value=a.get(f).__maxMipLevel;c.lightMap&&(b.lightMap.value=c.lightMap,b.lightMapIntensity.value=c.lightMapIntensity);c.aoMap&&(b.aoMap.value=c.aoMap,
+b.aoMapIntensity.value=c.aoMapIntensity);if(c.map)var d=c.map;else c.specularMap?d=c.specularMap:c.displacementMap?d=c.displacementMap:c.normalMap?d=c.normalMap:c.bumpMap?d=c.bumpMap:c.roughnessMap?d=c.roughnessMap:c.metalnessMap?d=c.metalnessMap:c.alphaMap?d=c.alphaMap:c.emissiveMap&&(d=c.emissiveMap);void 0!==d&&(d.isWebGLRenderTarget&&(d=d.texture),!0===d.matrixAutoUpdate&&d.updateMatrix(),b.uvTransform.value.copy(d.matrix));if(c.aoMap)var e=c.aoMap;else c.lightMap&&(e=c.lightMap);void 0!==e&&
+(e.isWebGLRenderTarget&&(e=e.texture),!0===e.matrixAutoUpdate&&e.updateMatrix(),b.uv2Transform.value.copy(e.matrix))}function c(a,b,c){a.roughness.value=b.roughness;a.metalness.value=b.metalness;b.roughnessMap&&(a.roughnessMap.value=b.roughnessMap);b.metalnessMap&&(a.metalnessMap.value=b.metalnessMap);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale,1===b.side&&(a.bumpScale.value*=-1));b.normalMap&&(a.normalMap.value=b.normalMap,
+a.normalScale.value.copy(b.normalScale),1===b.side&&a.normalScale.value.negate());b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=b.displacementScale,a.displacementBias.value=b.displacementBias);if(b.envMap||c)a.envMapIntensity.value=b.envMapIntensity}return{refreshFogUniforms:function(a,b){a.fogColor.value.copy(b.color);b.isFog?(a.fogNear.value=b.near,a.fogFar.value=b.far):b.isFogExp2&&(a.fogDensity.value=b.density)},refreshMaterialUniforms:function(a,e,f,
+g,h){if(e.isMeshBasicMaterial)b(a,e);else if(e.isMeshLambertMaterial)b(a,e),e.emissiveMap&&(a.emissiveMap.value=e.emissiveMap);else if(e.isMeshToonMaterial)b(a,e),a.specular.value.copy(e.specular),a.shininess.value=Math.max(e.shininess,1E-4),e.gradientMap&&(a.gradientMap.value=e.gradientMap),e.emissiveMap&&(a.emissiveMap.value=e.emissiveMap),e.bumpMap&&(a.bumpMap.value=e.bumpMap,a.bumpScale.value=e.bumpScale,1===e.side&&(a.bumpScale.value*=-1)),e.normalMap&&(a.normalMap.value=e.normalMap,a.normalScale.value.copy(e.normalScale),
+1===e.side&&a.normalScale.value.negate()),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias);else if(e.isMeshPhongMaterial)b(a,e),a.specular.value.copy(e.specular),a.shininess.value=Math.max(e.shininess,1E-4),e.emissiveMap&&(a.emissiveMap.value=e.emissiveMap),e.bumpMap&&(a.bumpMap.value=e.bumpMap,a.bumpScale.value=e.bumpScale,1===e.side&&(a.bumpScale.value*=-1)),e.normalMap&&(a.normalMap.value=e.normalMap,
+a.normalScale.value.copy(e.normalScale),1===e.side&&a.normalScale.value.negate()),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias);else if(e.isMeshStandardMaterial)b(a,e,f),e.isMeshPhysicalMaterial?(c(a,e,f),a.reflectivity.value=e.reflectivity,a.clearcoat.value=e.clearcoat,a.clearcoatRoughness.value=e.clearcoatRoughness,e.sheen&&a.sheen.value.copy(e.sheen),e.clearcoatMap&&(a.clearcoatMap.value=
+e.clearcoatMap),e.clearcoatRoughnessMap&&(a.clearcoatRoughnessMap.value=e.clearcoatRoughnessMap),e.clearcoatNormalMap&&(a.clearcoatNormalScale.value.copy(e.clearcoatNormalScale),a.clearcoatNormalMap.value=e.clearcoatNormalMap,1===e.side&&a.clearcoatNormalScale.value.negate()),a.transparency.value=e.transparency):c(a,e,f);else if(e.isMeshMatcapMaterial)b(a,e),e.matcap&&(a.matcap.value=e.matcap),e.bumpMap&&(a.bumpMap.value=e.bumpMap,a.bumpScale.value=e.bumpScale,1===e.side&&(a.bumpScale.value*=-1)),
+e.normalMap&&(a.normalMap.value=e.normalMap,a.normalScale.value.copy(e.normalScale),1===e.side&&a.normalScale.value.negate()),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias);else if(e.isMeshDepthMaterial)b(a,e),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias);else if(e.isMeshDistanceMaterial)b(a,
+e),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias),a.referencePosition.value.copy(e.referencePosition),a.nearDistance.value=e.nearDistance,a.farDistance.value=e.farDistance;else if(e.isMeshNormalMaterial)b(a,e),e.bumpMap&&(a.bumpMap.value=e.bumpMap,a.bumpScale.value=e.bumpScale,1===e.side&&(a.bumpScale.value*=-1)),e.normalMap&&(a.normalMap.value=e.normalMap,a.normalScale.value.copy(e.normalScale),
+1===e.side&&a.normalScale.value.negate()),e.displacementMap&&(a.displacementMap.value=e.displacementMap,a.displacementScale.value=e.displacementScale,a.displacementBias.value=e.displacementBias);else if(e.isLineBasicMaterial)a.diffuse.value.copy(e.color),a.opacity.value=e.opacity,e.isLineDashedMaterial&&(a.dashSize.value=e.dashSize,a.totalSize.value=e.dashSize+e.gapSize,a.scale.value=e.scale);else if(e.isPointsMaterial){a.diffuse.value.copy(e.color);a.opacity.value=e.opacity;a.size.value=e.size*g;
+a.scale.value=.5*h;e.map&&(a.map.value=e.map);e.alphaMap&&(a.alphaMap.value=e.alphaMap);if(e.map)var d=e.map;else e.alphaMap&&(d=e.alphaMap);void 0!==d&&(!0===d.matrixAutoUpdate&&d.updateMatrix(),a.uvTransform.value.copy(d.matrix))}else if(e.isSpriteMaterial){a.diffuse.value.copy(e.color);a.opacity.value=e.opacity;a.rotation.value=e.rotation;e.map&&(a.map.value=e.map);e.alphaMap&&(a.alphaMap.value=e.alphaMap);if(e.map)var m=e.map;else e.alphaMap&&(m=e.alphaMap);void 0!==m&&(!0===m.matrixAutoUpdate&&
+m.updateMatrix(),a.uvTransform.value.copy(m.matrix))}else e.isShadowMaterial?(a.color.value.copy(e.color),a.opacity.value=e.opacity):e.isShaderMaterial&&(e.uniformsNeedUpdate=!1)}}}function jg(a){var b;function c(){sa=new oj(I);Ha=new mj(I,sa,a);!1===Ha.isWebGL2&&(sa.get("WEBGL_depth_texture"),sa.get("OES_texture_float"),sa.get("OES_texture_half_float"),sa.get("OES_texture_half_float_linear"),sa.get("OES_standard_derivatives"),sa.get("OES_element_index_uint"),sa.get("ANGLE_instanced_arrays"));sa.get("OES_texture_float_linear");
+ra=new Th(I,sa,Ha);X=new xk(I,sa,Ha);X.scissor(S.copy(ka).multiplyScalar(xa).floor());X.viewport(Y.copy(da).multiplyScalar(xa).floor());fa=new rj(I);P=new nk;ba=new yk(I,sa,X,P,Ha,ra,fa);oa=new jj(I,Ha);va=new pj(I,oa,fa);pa=new uj(I,va,oa,fa);Aa=new tj(I);ta=new mk(y,sa,Ha);za=new zk(P);ya=new qk;wa=new wk;qa=new kj(y,X,pa,ja);Ca=new lj(I,sa,fa,Ha);Ea=new qj(I,sa,fa,Ha);fa.programs=ta.programs;y.capabilities=Ha;y.extensions=sa;y.properties=P;y.renderLists=ya;y.state=X;y.info=fa}function d(a){a.preventDefault();
+console.log("THREE.WebGLRenderer: Context Lost.");F=!0}function e(){console.log("THREE.WebGLRenderer: Context Restored.");F=!1;c()}function f(a){a=a.target;a.removeEventListener("dispose",f);g(a);P.remove(a)}function g(a){var b=P.get(a).program;a.program=void 0;void 0!==b&&ta.releaseProgram(b)}function h(a,b){a.render(function(a){y.renderBufferImmediate(a,b)})}function l(a,b,c,d){if(!1!==a.visible){if(a.layers.test(b.layers))if(a.isGroup)c=a.renderOrder;else if(a.isLOD)!0===a.autoUpdate&&a.update(b);
+else if(a.isLight)Q.pushLight(a),a.castShadow&&Q.pushShadow(a);else if(a.isSprite){if(!a.frustumCulled||na.intersectsSprite(a)){d&&Jb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(la);var e=pa.update(a),f=a.material;f.visible&&B.push(a,e,f,c,Jb.z,null)}}else if(a.isImmediateRenderObject)d&&Jb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(la),B.push(a,null,a.material,c,Jb.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.frame!==fa.render.frame&&(a.skeleton.update(),
+a.skeleton.frame=fa.render.frame),!a.frustumCulled||na.intersectsObject(a))if(d&&Jb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(la),e=pa.update(a),f=a.material,Array.isArray(f))for(var g=e.groups,h=0,m=g.length;h<m;h++){var n=g[h],k=f[n.materialIndex];k&&k.visible&&B.push(a,e,k,c,Jb.z,n)}else f.visible&&B.push(a,e,f,c,Jb.z,null);a=a.children;h=0;for(m=a.length;h<m;h++)l(a[h],b,c,d)}}function m(a,b,c,d){for(var e=0,f=a.length;e<f;e++){var g=a[e],h=g.object,l=g.geometry,m=void 0===d?g.material:
+d;g=g.group;if(c.isArrayCamera){W=c;for(var n=c.cameras,z=0,q=n.length;z<q;z++){var t=n[z];h.layers.test(t.layers)&&(X.viewport(Y.copy(t.viewport)),Q.setupLights(t),k(h,b,t,l,m,g))}}else W=null,k(h,b,c,l,m,g)}}function k(a,c,d,e,f,g){a.onBeforeRender(y,c,d,e,f,g);Q=wa.get(c,W||d);a.modelViewMatrix.multiplyMatrices(d.matrixWorldInverse,a.matrixWorld);a.normalMatrix.getNormalMatrix(a.modelViewMatrix);if(a.isImmediateRenderObject){var l=t(d,c,f,a);X.setMaterial(f);V=b=null;Ke=!1;h(a,l)}else y.renderBufferDirect(d,
+c,e,f,a,g);a.onAfterRender(y,c,d,e,f,g);Q=wa.get(c,W||d)}function n(a,b,c){var d=P.get(a),e=Q.state.lights,h=e.state.version;c=ta.getParameters(a,e.state,Q.state.shadowsArray,b,ha.numPlanes,ha.numIntersection,c);var l=ta.getProgramCacheKey(c),m=d.program,n=!0;if(void 0===m)a.addEventListener("dispose",f);else if(m.cacheKey!==l)g(a);else{if(d.lightsStateVersion!==h)d.lightsStateVersion=h;else if(void 0!==c.shaderID)return;n=!1}n&&(m=ta.acquireProgram(c,l),d.program=m,d.uniforms=c.uniforms,d.outputEncoding=
+c.outputEncoding,a.program=m);c=m.getAttributes();if(a.morphTargets)for(l=a.numSupportedMorphTargets=0;l<y.maxMorphTargets;l++)0<=c["morphTarget"+l]&&a.numSupportedMorphTargets++;if(a.morphNormals)for(l=a.numSupportedMorphNormals=0;l<y.maxMorphNormals;l++)0<=c["morphNormal"+l]&&a.numSupportedMorphNormals++;c=d.uniforms;if(!a.isShaderMaterial&&!a.isRawShaderMaterial||!0===a.clipping)d.numClippingPlanes=ha.numPlanes,d.numIntersection=ha.numIntersection,c.clippingPlanes=ha.uniform;d.environment=a.isMeshStandardMaterial?
+b.environment:null;d.fog=b.fog;d.needsLights=a.isMeshLambertMaterial||a.isMeshToonMaterial||a.isMeshPhongMaterial||a.isMeshStandardMaterial||a.isShadowMaterial||a.isShaderMaterial&&!0===a.lights;d.lightsStateVersion=h;d.needsLights&&(c.ambientLightColor.value=e.state.ambient,c.lightProbe.value=e.state.probe,c.directionalLights.value=e.state.directional,c.directionalLightShadows.value=e.state.directionalShadow,c.spotLights.value=e.state.spot,c.spotLightShadows.value=e.state.spotShadow,c.rectAreaLights.value=
+e.state.rectArea,c.pointLights.value=e.state.point,c.pointLightShadows.value=e.state.pointShadow,c.hemisphereLights.value=e.state.hemi,c.directionalShadowMap.value=e.state.directionalShadowMap,c.directionalShadowMatrix.value=e.state.directionalShadowMatrix,c.spotShadowMap.value=e.state.spotShadowMap,c.spotShadowMatrix.value=e.state.spotShadowMatrix,c.pointShadowMap.value=e.state.pointShadowMap,c.pointShadowMatrix.value=e.state.pointShadowMatrix);a=d.program.getUniforms();a=Gb.seqWithValue(a.seq,c);
+d.uniformsList=a}function t(a,b,c,d){ba.resetTextureUnits();var e=b.fog,f=c.isMeshStandardMaterial?b.environment:null,g=null===G?y.outputEncoding:G.texture.encoding,h=P.get(c),l=Q.state.lights;Je&&(ig||a!==ia)&&ha.setState(c.clippingPlanes,c.clipIntersection,c.clipShadows,a,h,a===ia&&c.id===M);c.version===h.__version?void 0===h.program?n(c,b,d):c.fog&&h.fog!==e?n(c,b,d):h.environment!==f?n(c,b,d):h.needsLights&&h.lightsStateVersion!==l.state.version?n(c,b,d):void 0===h.numClippingPlanes||h.numClippingPlanes===
+ha.numPlanes&&h.numIntersection===ha.numIntersection?h.outputEncoding!==g&&n(c,b,d):n(c,b,d):(n(c,b,d),h.__version=c.version);var m=!1,k=!1,z=!1;b=h.program;g=b.getUniforms();l=h.uniforms;X.useProgram(b.program)&&(z=k=m=!0);c.id!==M&&(M=c.id,k=!0);if(m||ia!==a){g.setValue(I,"projectionMatrix",a.projectionMatrix);Ha.logarithmicDepthBuffer&&g.setValue(I,"logDepthBufFC",2/(Math.log(a.far+1)/Math.LN2));ia!==a&&(ia=a,z=k=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshToonMaterial||c.isMeshStandardMaterial||
+c.envMap)m=g.map.cameraPosition,void 0!==m&&m.setValue(I,Jb.setFromMatrixPosition(a.matrixWorld));(c.isMeshPhongMaterial||c.isMeshToonMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial)&&g.setValue(I,"isOrthographic",!0===a.isOrthographicCamera);(c.isMeshPhongMaterial||c.isMeshToonMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial||c.skinning)&&g.setValue(I,"viewMatrix",a.matrixWorldInverse)}if(c.skinning&&
+(g.setOptional(I,d,"bindMatrix"),g.setOptional(I,d,"bindMatrixInverse"),a=d.skeleton))if(m=a.bones,Ha.floatVertexTextures){if(void 0===a.boneTexture){m=Math.sqrt(4*m.length);m=O.ceilPowerOfTwo(m);m=Math.max(m,4);var q=new Float32Array(m*m*4);q.set(a.boneMatrices);var t=new $b(q,m,m,1023,1015);a.boneMatrices=q;a.boneTexture=t;a.boneTextureSize=m}g.setValue(I,"boneTexture",a.boneTexture,ba);g.setValue(I,"boneTextureSize",a.boneTextureSize)}else g.setOptional(I,a,"boneMatrices");if(k||h.receiveShadow!==
+d.receiveShadow)h.receiveShadow=d.receiveShadow,g.setValue(I,"receiveShadow",d.receiveShadow);k&&(g.setValue(I,"toneMappingExposure",y.toneMappingExposure),g.setValue(I,"toneMappingWhitePoint",y.toneMappingWhitePoint),h.needsLights&&(k=z,l.ambientLightColor.needsUpdate=k,l.lightProbe.needsUpdate=k,l.directionalLights.needsUpdate=k,l.directionalLightShadows.needsUpdate=k,l.pointLights.needsUpdate=k,l.pointLightShadows.needsUpdate=k,l.spotLights.needsUpdate=k,l.spotLightShadows.needsUpdate=k,l.rectAreaLights.needsUpdate=
+k,l.hemisphereLights.needsUpdate=k),e&&c.fog&&za.refreshFogUniforms(l,e),za.refreshMaterialUniforms(l,c,f,xa,Ra),void 0!==l.ltc_1&&(l.ltc_1.value=A.LTC_1),void 0!==l.ltc_2&&(l.ltc_2.value=A.LTC_2),Gb.upload(I,h.uniformsList,l,ba));c.isShaderMaterial&&!0===c.uniformsNeedUpdate&&(Gb.upload(I,h.uniformsList,l,ba),c.uniformsNeedUpdate=!1);c.isSpriteMaterial&&g.setValue(I,"center",d.center);g.setValue(I,"modelViewMatrix",d.modelViewMatrix);g.setValue(I,"normalMatrix",d.normalMatrix);g.setValue(I,"modelMatrix",
+d.matrixWorld);return b}a=a||{};var r=void 0!==a.canvas?a.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),q=void 0!==a.context?a.context:null,u=void 0!==a.alpha?a.alpha:!1,E=void 0!==a.depth?a.depth:!0,x=void 0!==a.stencil?a.stencil:!0,w=void 0!==a.antialias?a.antialias:!1,ja=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,T=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,Z=void 0!==a.powerPreference?a.powerPreference:"default",C=void 0!==a.failIfMajorPerformanceCaveat?
+a.failIfMajorPerformanceCaveat:!1,B=null,Q=null;this.domElement=r;this.debug={checkShaderErrors:!0};this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes=[];this.localClippingEnabled=!1;this.gammaFactor=2;this.outputEncoding=3E3;this.physicallyCorrectLights=!1;this.toneMapping=0;this.toneMappingWhitePoint=this.toneMappingExposure=1;this.maxMorphTargets=8;this.maxMorphNormals=4;var y=this,F=!1,D=null,H=0,K=0,G=null,L=null,M=-1;var V=b=
+null;var Ke=!1;var ia=null,W=null,Y=new R,S=new R,aa=null,ea=r.width,Ra=r.height,xa=1,J=null,ca=null,da=new R(0,0,ea,Ra),ka=new R(0,0,ea,Ra),ma=!1,na=new Gc,ha=new nj,Je=!1,ig=!1,la=new N,Jb=new p;try{u={alpha:u,depth:E,stencil:x,antialias:w,premultipliedAlpha:ja,preserveDrawingBuffer:T,powerPreference:Z,failIfMajorPerformanceCaveat:C};r.addEventListener("webglcontextlost",d,!1);r.addEventListener("webglcontextrestored",e,!1);var I=q||r.getContext("webgl",u)||r.getContext("experimental-webgl",u);
+if(null===I){if(null!==r.getContext("webgl"))throw Error("Error creating WebGL context with your selected attributes.");throw Error("Error creating WebGL context.");}void 0===I.getShaderPrecisionFormat&&(I.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(Vh){throw console.error("THREE.WebGLRenderer: "+Vh.message),Vh;}var sa,Ha,X,fa,P,ba,oa,va,pa,ta,za,ya,wa,qa,Aa,Ca,Ea,ra;c();var ua=new Uh(y,I);this.xr=ua;var Ga=new Rh(y,pa,Ha.maxTextureSize);this.shadowMap=Ga;
+this.getContext=function(){return I};this.getContextAttributes=function(){return I.getContextAttributes()};this.forceContextLoss=function(){var a=sa.get("WEBGL_lose_context");a&&a.loseContext()};this.forceContextRestore=function(){var a=sa.get("WEBGL_lose_context");a&&a.restoreContext()};this.getPixelRatio=function(){return xa};this.setPixelRatio=function(a){void 0!==a&&(xa=a,this.setSize(ea,Ra,!1))};this.getSize=function(a){void 0===a&&(console.warn("WebGLRenderer: .getsize() now requires a Vector2 as an argument"),
+a=new v);return a.set(ea,Ra)};this.setSize=function(a,b,c){ua.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(ea=a,Ra=b,r.width=Math.floor(a*xa),r.height=Math.floor(b*xa),!1!==c&&(r.style.width=a+"px",r.style.height=b+"px"),this.setViewport(0,0,a,b))};this.getDrawingBufferSize=function(a){void 0===a&&(console.warn("WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument"),a=new v);return a.set(ea*xa,Ra*xa).floor()};this.setDrawingBufferSize=
+function(a,b,c){ea=a;Ra=b;xa=c;r.width=Math.floor(a*c);r.height=Math.floor(b*c);this.setViewport(0,0,a,b)};this.getCurrentViewport=function(a){void 0===a&&(console.warn("WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument"),a=new R);return a.copy(Y)};this.getViewport=function(a){return a.copy(da)};this.setViewport=function(a,b,c,d){a.isVector4?da.set(a.x,a.y,a.z,a.w):da.set(a,b,c,d);X.viewport(Y.copy(da).multiplyScalar(xa).floor())};this.getScissor=function(a){return a.copy(ka)};
+this.setScissor=function(a,b,c,d){a.isVector4?ka.set(a.x,a.y,a.z,a.w):ka.set(a,b,c,d);X.scissor(S.copy(ka).multiplyScalar(xa).floor())};this.getScissorTest=function(){return ma};this.setScissorTest=function(a){X.setScissorTest(ma=a)};this.setOpaqueSort=function(a){J=a};this.setTransparentSort=function(a){ca=a};this.getClearColor=function(){return qa.getClearColor()};this.setClearColor=function(){qa.setClearColor.apply(qa,arguments)};this.getClearAlpha=function(){return qa.getClearAlpha()};this.setClearAlpha=
+function(){qa.setClearAlpha.apply(qa,arguments)};this.clear=function(a,b,c){var d=0;if(void 0===a||a)d|=16384;if(void 0===b||b)d|=256;if(void 0===c||c)d|=1024;I.clear(d)};this.clearColor=function(){this.clear(!0,!1,!1)};this.clearDepth=function(){this.clear(!1,!0,!1)};this.clearStencil=function(){this.clear(!1,!1,!0)};this.dispose=function(){r.removeEventListener("webglcontextlost",d,!1);r.removeEventListener("webglcontextrestored",e,!1);ya.dispose();wa.dispose();P.dispose();pa.dispose();ua.dispose();
+Ba.stop()};this.renderBufferImmediate=function(a,b){X.initAttributes();var c=P.get(a);a.hasPositions&&!c.position&&(c.position=I.createBuffer());a.hasNormals&&!c.normal&&(c.normal=I.createBuffer());a.hasUvs&&!c.uv&&(c.uv=I.createBuffer());a.hasColors&&!c.color&&(c.color=I.createBuffer());b=b.getAttributes();a.hasPositions&&(I.bindBuffer(34962,c.position),I.bufferData(34962,a.positionArray,35048),X.enableAttribute(b.position),I.vertexAttribPointer(b.position,3,5126,!1,0,0));a.hasNormals&&(I.bindBuffer(34962,
+c.normal),I.bufferData(34962,a.normalArray,35048),X.enableAttribute(b.normal),I.vertexAttribPointer(b.normal,3,5126,!1,0,0));a.hasUvs&&(I.bindBuffer(34962,c.uv),I.bufferData(34962,a.uvArray,35048),X.enableAttribute(b.uv),I.vertexAttribPointer(b.uv,2,5126,!1,0,0));a.hasColors&&(I.bindBuffer(34962,c.color),I.bufferData(34962,a.colorArray,35048),X.enableAttribute(b.color),I.vertexAttribPointer(b.color,3,5126,!1,0,0));X.disableUnusedAttributes();I.drawArrays(4,0,a.count);a.count=0};var Ia=new zc;this.renderBufferDirect=
+function(a,c,d,e,f,g){null===c&&(c=Ia);var h=f.isMesh&&0>f.matrixWorld.determinant(),l=t(a,c,e,f);X.setMaterial(e,h);var m=!1;if(b!==d.id||V!==l.id||Ke!==(!0===e.wireframe))b=d.id,V=l.id,Ke=!0===e.wireframe,m=!0;if(e.morphTargets||e.morphNormals)Aa.update(f,d,e,l),m=!0;!0===f.isInstancedMesh&&(m=!0);a=d.index;c=d.attributes.position;if(null===a){if(void 0===c||0===c.count)return}else if(0===a.count)return;var n=1;!0===e.wireframe&&(a=va.getWireframeAttribute(d),n=2);h=Ca;if(null!==a){var k=oa.get(a);
+h=Ea;h.setIndex(k)}if(m){if(!1!==Ha.isWebGL2||!f.isInstancedMesh&&!d.isInstancedBufferGeometry||null!==sa.get("ANGLE_instanced_arrays")){X.initAttributes();m=d.attributes;l=l.getAttributes();var z=e.defaultAttributeValues;for(ja in l){var q=l[ja];if(0<=q){var r=m[ja];if(void 0!==r){var u=r.normalized,p=r.itemSize,w=oa.get(r);if(void 0!==w){var E=w.buffer,x=w.type;w=w.bytesPerElement;if(r.isInterleavedBufferAttribute){var v=r.data,C=v.stride;r=r.offset;v&&v.isInstancedInterleavedBuffer?(X.enableAttributeAndDivisor(q,
+v.meshPerAttribute),void 0===d._maxInstanceCount&&(d._maxInstanceCount=v.meshPerAttribute*v.count)):X.enableAttribute(q);I.bindBuffer(34962,E);X.vertexAttribPointer(q,p,x,u,C*w,r*w)}else r.isInstancedBufferAttribute?(X.enableAttributeAndDivisor(q,r.meshPerAttribute),void 0===d._maxInstanceCount&&(d._maxInstanceCount=r.meshPerAttribute*r.count)):X.enableAttribute(q),I.bindBuffer(34962,E),X.vertexAttribPointer(q,p,x,u,0,0)}}else if("instanceMatrix"===ja)w=oa.get(f.instanceMatrix),void 0!==w&&(E=w.buffer,
+x=w.type,X.enableAttributeAndDivisor(q+0,1),X.enableAttributeAndDivisor(q+1,1),X.enableAttributeAndDivisor(q+2,1),X.enableAttributeAndDivisor(q+3,1),I.bindBuffer(34962,E),I.vertexAttribPointer(q+0,4,x,!1,64,0),I.vertexAttribPointer(q+1,4,x,!1,64,16),I.vertexAttribPointer(q+2,4,x,!1,64,32),I.vertexAttribPointer(q+3,4,x,!1,64,48));else if(void 0!==z&&(u=z[ja],void 0!==u))switch(u.length){case 2:I.vertexAttrib2fv(q,u);break;case 3:I.vertexAttrib3fv(q,u);break;case 4:I.vertexAttrib4fv(q,u);break;default:I.vertexAttrib1fv(q,
+u)}}}X.disableUnusedAttributes()}null!==a&&I.bindBuffer(34963,k.buffer)}var ja=d.drawRange.start*n;m=null!==g?g.start*n:0;k=Math.max(ja,m);g=Math.max(0,Math.min(null!==a?a.count:c.count,ja+d.drawRange.count*n,m+(null!==g?g.count*n:Infinity))-1-k+1);0!==g&&(f.isMesh?!0===e.wireframe?(X.setLineWidth(e.wireframeLinewidth*(null===G?xa:1)),h.setMode(1)):h.setMode(4):f.isLine?(e=e.linewidth,void 0===e&&(e=1),X.setLineWidth(e*(null===G?xa:1)),f.isLineSegments?h.setMode(1):f.isLineLoop?h.setMode(2):h.setMode(3)):
+f.isPoints?h.setMode(0):f.isSprite&&h.setMode(4),f.isInstancedMesh?h.renderInstances(d,k,g,f.count):d.isInstancedBufferGeometry?h.renderInstances(d,k,g,Math.min(d.instanceCount,d._maxInstanceCount)):h.render(k,g))};this.compile=function(a,b){Q=wa.get(a,b);Q.init();a.traverse(function(a){a.isLight&&(Q.pushLight(a),a.castShadow&&Q.pushShadow(a))});Q.setupLights(b);var c={};a.traverse(function(b){var d=b.material;if(d)if(Array.isArray(d))for(var e=0;e<d.length;e++){var f=d[e];!1===f.uuid in c&&(n(f,
+a,b),c[f.uuid]=!0)}else!1===d.uuid in c&&(n(d,a,b),c[d.uuid]=!0)})};var Fa=null,Ba=new uh;Ba.setAnimationLoop(function(a){ua.isPresenting||Fa&&Fa(a)});"undefined"!==typeof window&&Ba.setContext(window);this.setAnimationLoop=function(a){Fa=a;ua.setAnimationLoop(a);Ba.start()};this.render=function(a,c,d,e){if(void 0!==d){console.warn("THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead.");var f=d}if(void 0!==e){console.warn("THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead.");
+var g=e}c&&c.isCamera?F||(V=b=null,Ke=!1,M=-1,ia=null,!0===a.autoUpdate&&a.updateMatrixWorld(),null===c.parent&&c.updateMatrixWorld(),ua.enabled&&ua.isPresenting&&(c=ua.getCamera(c)),a.onBeforeRender(y,a,c,f||G),Q=wa.get(a,c),Q.init(),la.multiplyMatrices(c.projectionMatrix,c.matrixWorldInverse),na.setFromProjectionMatrix(la),ig=this.localClippingEnabled,Je=ha.init(this.clippingPlanes,ig,c),B=ya.get(a,c),B.init(),l(a,c,0,y.sortObjects),B.finish(),!0===y.sortObjects&&B.sort(J,ca),Je&&ha.beginShadows(),
+Ga.render(Q.state.shadowsArray,a,c),Q.setupLights(c),Je&&ha.endShadows(),this.info.autoReset&&this.info.reset(),void 0!==f&&this.setRenderTarget(f),qa.render(B,a,c,g),d=B.opaque,e=B.transparent,a.overrideMaterial?(f=a.overrideMaterial,d.length&&m(d,a,c,f),e.length&&m(e,a,c,f)):(d.length&&m(d,a,c),e.length&&m(e,a,c)),a.onAfterRender(y,a,c),null!==G&&(ba.updateRenderTargetMipmap(G),ba.updateMultisampleRenderTarget(G)),X.buffers.depth.setTest(!0),X.buffers.depth.setMask(!0),X.buffers.color.setMask(!0),
+X.setPolygonOffset(!1),Q=B=null):console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.")};this.setFramebuffer=function(a){D!==a&&null===G&&I.bindFramebuffer(36160,a);D=a};this.getActiveCubeFace=function(){return H};this.getActiveMipmapLevel=function(){return K};this.getRenderTarget=function(){return G};this.setRenderTarget=function(a,b,c){G=a;H=b;K=c;a&&void 0===P.get(a).__webglFramebuffer&&ba.setupRenderTarget(a);var d=D,e=!1;a?(d=P.get(a).__webglFramebuffer,a.isWebGLCubeRenderTarget?
+(d=d[b||0],e=!0):d=a.isWebGLMultisampleRenderTarget?P.get(a).__webglMultisampledFramebuffer:d,Y.copy(a.viewport),S.copy(a.scissor),aa=a.scissorTest):(Y.copy(da).multiplyScalar(xa).floor(),S.copy(ka).multiplyScalar(xa).floor(),aa=ma);L!==d&&(I.bindFramebuffer(36160,d),L=d);X.viewport(Y);X.scissor(S);X.setScissorTest(aa);e&&(a=P.get(a.texture),I.framebufferTexture2D(36160,36064,34069+(b||0),a.__webglTexture,c||0))};this.readRenderTargetPixels=function(a,b,c,d,e,f,g){if(a&&a.isWebGLRenderTarget){var h=
+P.get(a).__webglFramebuffer;a.isWebGLCubeRenderTarget&&void 0!==g&&(h=h[g]);if(h){g=!1;h!==L&&(I.bindFramebuffer(36160,h),g=!0);try{var l=a.texture,m=l.format,n=l.type;1023!==m&&ra.convert(m)!==I.getParameter(35739)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===n||ra.convert(n)===I.getParameter(35738)||1015===n&&(Ha.isWebGL2||sa.get("OES_texture_float")||sa.get("WEBGL_color_buffer_float"))||1016===n&&(Ha.isWebGL2?
+sa.get("EXT_color_buffer_float"):sa.get("EXT_color_buffer_half_float"))?36053===I.checkFramebufferStatus(36160)?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&I.readPixels(b,c,d,e,ra.convert(m),ra.convert(n),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{g&&I.bindFramebuffer(36160,L)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")};
+this.copyFramebufferToTexture=function(a,b,c){void 0===c&&(c=0);var d=Math.pow(2,-c),e=Math.floor(b.image.width*d);d=Math.floor(b.image.height*d);var f=ra.convert(b.format);ba.setTexture2D(b,0);I.copyTexImage2D(3553,c,f,a.x,a.y,e,d,0);X.unbindTexture()};this.copyTextureToTexture=function(a,b,c,d){void 0===d&&(d=0);var e=b.image.width,f=b.image.height,g=ra.convert(c.format),h=ra.convert(c.type);ba.setTexture2D(c,0);b.isDataTexture?I.texSubImage2D(3553,d,a.x,a.y,e,f,g,h,b.image.data):b.isCompressedTexture?
+I.compressedTexSubImage2D(3553,d,a.x,a.y,b.mipmaps[0].width,b.mipmaps[0].height,g,b.mipmaps[0].data):I.texSubImage2D(3553,d,a.x,a.y,g,h,b.image);0===d&&c.generateMipmaps&&I.generateMipmap(3553);X.unbindTexture()};this.initTexture=function(a){ba.setTexture2D(a,0);X.unbindTexture()};"undefined"!==typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}function Ne(a,b){this.name="";this.color=new D(a);this.density=void 0!==b?b:2.5E-4}function Oe(a,b,c){this.name=
+"";this.color=new D(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function rb(a,b){this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.usage=35044;this.updateRange={offset:0,count:-1};this.version=0}function Kd(a,b,c,d){this.name="";this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function Kb(a){K.call(this);this.type="SpriteMaterial";this.color=new D(16777215);this.alphaMap=this.map=null;this.rotation=0;this.transparent=this.sizeAttenuation=!0;this.setValues(a)}
+function Ld(a){y.call(this);this.type="Sprite";if(void 0===Lc){Lc=new F;var b=new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]);b=new rb(b,5);Lc.setIndex([0,1,2,0,2,3]);Lc.setAttribute("position",new Kd(b,3,0,!1));Lc.setAttribute("uv",new Kd(b,2,3,!1))}this.geometry=Lc;this.material=void 0!==a?a:new Kb;this.center=new v(.5,.5)}function Pe(a,b,c,d,e,f){Mc.subVectors(a,c).addScalar(.5).multiply(d);void 0!==e?(Md.x=f*Mc.x-e*Mc.y,Md.y=e*Mc.x+f*Mc.y):Md.copy(Mc);a.copy(b);a.x+=Md.x;
+a.y+=Md.y;a.applyMatrix4(Wh)}function Nd(){y.call(this);this._currentLevel=0;this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}});this.autoUpdate=!0}function Qe(a,b){a&&a.isGeometry&&console.error("THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");ea.call(this,a,b);this.type="SkinnedMesh";this.bindMode="attached";this.bindMatrix=new N;this.bindMatrixInverse=new N}function Re(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*
+this.bones.length);this.frame=-1;if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else for(console.warn("THREE.Skeleton boneInverses is the wrong length."),this.boneInverses=[],a=0,b=this.bones.length;a<b;a++)this.boneInverses.push(new N)}function kg(){y.call(this);this.type="Bone"}function Se(a,b,c){ea.call(this,a,b);this.instanceMatrix=new G(new Float32Array(16*c),16);this.count=c;this.frustumCulled=!1}function da(a){K.call(this);this.type=
+"LineBasicMaterial";this.color=new D(16777215);this.linewidth=1;this.linejoin=this.linecap="round";this.morphTargets=!1;this.setValues(a)}function La(a,b,c){1===c&&console.error("THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead.");y.call(this);this.type="Line";this.geometry=void 0!==a?a:new F;this.material=void 0!==b?b:new da;this.updateMorphTargets()}function ma(a,b){La.call(this,a,b);this.type="LineSegments"}function Te(a,b){La.call(this,a,b);this.type=
+"LineLoop"}function Xa(a){K.call(this);this.type="PointsMaterial";this.color=new D(16777215);this.alphaMap=this.map=null;this.size=1;this.sizeAttenuation=!0;this.morphTargets=!1;this.setValues(a)}function Nc(a,b){y.call(this);this.type="Points";this.geometry=void 0!==a?a:new F;this.material=void 0!==b?b:new Xa;this.updateMorphTargets()}function lg(a,b,c,d,e,f,g){var h=mg.distanceSqToPoint(a);h<c&&(c=new p,mg.closestPointToPoint(a,c),c.applyMatrix4(d),a=e.ray.origin.distanceTo(c),a<e.near||a>e.far||
+f.push({distance:a,distanceToRay:Math.sqrt(h),point:c,index:b,face:null,object:g}))}function ng(a,b,c,d,e,f,g,h,l){W.call(this,a,b,c,d,e,f,g,h,l);this.format=void 0!==g?g:1022;this.minFilter=void 0!==f?f:1006;this.magFilter=void 0!==e?e:1006;this.generateMipmaps=!1}function Oc(a,b,c,d,e,f,g,h,l,m,k,n){W.call(this,null,f,g,h,l,m,d,e,k,n);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function Od(a,b,c,d,e,f,g,h,l){W.call(this,a,b,c,d,e,f,g,h,l);this.needsUpdate=!0}
+function Pd(a,b,c,d,e,f,g,h,l,m){m=void 0!==m?m:1026;if(1026!==m&&1027!==m)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===c&&1026===m&&(c=1012);void 0===c&&1027===m&&(c=1020);W.call(this,null,d,e,f,g,h,m,c,l);this.image={width:a,height:b};this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!==h?h:1003;this.generateMipmaps=this.flipY=!1}function Pc(a){F.call(this);this.type="WireframeGeometry";var b=[],c,d,e,f=[0,0],g={},h=["a","b","c"];if(a&&
+a.isGeometry){var l=a.faces;var m=0;for(d=l.length;m<d;m++){var k=l[m];for(c=0;3>c;c++){var n=k[h[c]];var t=k[h[(c+1)%3]];f[0]=Math.min(n,t);f[1]=Math.max(n,t);n=f[0]+","+f[1];void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]})}}for(n in g)m=g[n],h=a.vertices[m.index1],b.push(h.x,h.y,h.z),h=a.vertices[m.index2],b.push(h.x,h.y,h.z)}else if(a&&a.isBufferGeometry)if(h=new p,null!==a.index){l=a.attributes.position;k=a.index;var r=a.groups;0===r.length&&(r=[{start:0,count:k.count,materialIndex:0}]);a=0;for(e=
+r.length;a<e;++a)for(m=r[a],c=m.start,d=m.count,m=c,d=c+d;m<d;m+=3)for(c=0;3>c;c++)n=k.getX(m+c),t=k.getX(m+(c+1)%3),f[0]=Math.min(n,t),f[1]=Math.max(n,t),n=f[0]+","+f[1],void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]});for(n in g)m=g[n],h.fromBufferAttribute(l,m.index1),b.push(h.x,h.y,h.z),h.fromBufferAttribute(l,m.index2),b.push(h.x,h.y,h.z)}else for(l=a.attributes.position,m=0,d=l.count/3;m<d;m++)for(c=0;3>c;c++)g=3*m+c,h.fromBufferAttribute(l,g),b.push(h.x,h.y,h.z),g=3*m+(c+1)%3,h.fromBufferAttribute(l,
+g),b.push(h.x,h.y,h.z);this.setAttribute("position",new B(b,3))}function Qd(a,b,c){L.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Qc(a,b,c));this.mergeVertices()}function Qc(a,b,c){F.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=new p,l=new p,m=new p,k=new p,n=new p,t,r;3>a.length&&console.error("THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.");
+var q=b+1;for(t=0;t<=c;t++){var u=t/c;for(r=0;r<=b;r++){var E=r/b;a(E,u,l);e.push(l.x,l.y,l.z);0<=E-1E-5?(a(E-1E-5,u,m),k.subVectors(l,m)):(a(E+1E-5,u,m),k.subVectors(m,l));0<=u-1E-5?(a(E,u-1E-5,m),n.subVectors(l,m)):(a(E,u+1E-5,m),n.subVectors(m,l));h.crossVectors(k,n).normalize();f.push(h.x,h.y,h.z);g.push(E,u)}}for(t=0;t<c;t++)for(r=0;r<b;r++)a=t*q+r+1,h=(t+1)*q+r+1,l=(t+1)*q+r,d.push(t*q+r,a,l),d.push(a,h,l);this.setIndex(d);this.setAttribute("position",new B(e,3));this.setAttribute("normal",
+new B(f,3));this.setAttribute("uv",new B(g,2))}function Rd(a,b,c,d){L.call(this);this.type="PolyhedronGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};this.fromBufferGeometry(new Ga(a,b,c,d));this.mergeVertices()}function Ga(a,b,c,d){function e(a){h.push(a.x,a.y,a.z)}function f(b,c){b*=3;c.x=a[b+0];c.y=a[b+1];c.z=a[b+2]}function g(a,b,c,d){0>d&&1===a.x&&(l[b]=a.x-1);0===c.x&&0===c.z&&(l[b]=d/2/Math.PI+.5)}F.call(this);this.type="PolyhedronBufferGeometry";this.parameters={vertices:a,
+indices:b,radius:c,detail:d};c=c||1;d=d||0;var h=[],l=[];(function(a){for(var c=new p,d=new p,g=new p,h=0;h<b.length;h+=3){f(b[h+0],c);f(b[h+1],d);f(b[h+2],g);var l,m,k=c,x=d,w=g,v=Math.pow(2,a),T=[];for(m=0;m<=v;m++){T[m]=[];var Z=k.clone().lerp(w,m/v),C=x.clone().lerp(w,m/v),y=v-m;for(l=0;l<=y;l++)T[m][l]=0===l&&m===v?Z:Z.clone().lerp(C,l/y)}for(m=0;m<v;m++)for(l=0;l<2*(v-m)-1;l++)k=Math.floor(l/2),0===l%2?(e(T[m][k+1]),e(T[m+1][k]),e(T[m][k])):(e(T[m][k+1]),e(T[m+1][k+1]),e(T[m+1][k]))}})(d);(function(a){for(var b=
+new p,c=0;c<h.length;c+=3)b.x=h[c+0],b.y=h[c+1],b.z=h[c+2],b.normalize().multiplyScalar(a),h[c+0]=b.x,h[c+1]=b.y,h[c+2]=b.z})(c);(function(){for(var a=new p,b=0;b<h.length;b+=3)a.x=h[b+0],a.y=h[b+1],a.z=h[b+2],l.push(Math.atan2(a.z,-a.x)/2/Math.PI+.5,1-(Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+.5));a=new p;b=new p;for(var c=new p,d=new p,e=new v,f=new v,k=new v,E=0,x=0;E<h.length;E+=9,x+=6){a.set(h[E+0],h[E+1],h[E+2]);b.set(h[E+3],h[E+4],h[E+5]);c.set(h[E+6],h[E+7],h[E+8]);e.set(l[x+0],
+l[x+1]);f.set(l[x+2],l[x+3]);k.set(l[x+4],l[x+5]);d.copy(a).add(b).add(c).divideScalar(3);var w=Math.atan2(d.z,-d.x);g(e,x+0,a,w);g(f,x+2,b,w);g(k,x+4,c,w)}for(a=0;a<l.length;a+=6)b=l[a+0],c=l[a+2],d=l[a+4],e=Math.min(b,c,d),.9<Math.max(b,c,d)&&.1>e&&(.2>b&&(l[a+0]+=1),.2>c&&(l[a+2]+=1),.2>d&&(l[a+4]+=1))})();this.setAttribute("position",new B(h,3));this.setAttribute("normal",new B(h.slice(),3));this.setAttribute("uv",new B(l,2));0===d?this.computeVertexNormals():this.normalizeNormals()}function Sd(a,
+b){L.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Rc(a,b));this.mergeVertices()}function Rc(a,b){Ga.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);this.type="TetrahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Td(a,b){L.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new bc(a,b));this.mergeVertices()}function bc(a,b){Ga.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);this.type="OctahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Ud(a,b){L.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Sc(a,b));this.mergeVertices()}function Sc(a,b){var c=(1+Math.sqrt(5))/2;Ga.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);this.type="IcosahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Vd(a,b){L.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Tc(a,b));this.mergeVertices()}function Tc(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;Ga.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,
+0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Wd(a,b,c,d,e,f){L.call(this);this.type="TubeGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,
+closed:e};void 0!==f&&console.warn("THREE.TubeGeometry: taper has been removed.");a=new cc(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function cc(a,b,c,d,e){function f(e){k=a.getPointAt(e/b,k);var f=g.normals[e];e=g.binormals[e];for(t=0;t<=d;t++){var m=t/d*Math.PI*2,n=Math.sin(m);m=-Math.cos(m);l.x=m*f.x+n*e.x;l.y=m*f.y+n*e.y;l.z=m*f.z+n*e.z;l.normalize();q.push(l.x,l.y,l.z);h.x=k.x+c*l.x;h.y=k.y+c*l.y;h.z=
+k.z+c*l.z;r.push(h.x,h.y,h.z)}}F.call(this);this.type="TubeBufferGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new p,l=new p,m=new v,k=new p,n,t,r=[],q=[],u=[],E=[];for(n=0;n<b;n++)f(n);f(!1===e?b:0);for(n=0;n<=b;n++)for(t=0;t<=d;t++)m.x=n/b,m.y=t/d,u.push(m.x,m.y);(function(){for(t=1;t<=b;t++)for(n=1;n<=d;n++){var a=
+(d+1)*t+(n-1),c=(d+1)*t+n,e=(d+1)*(t-1)+n;E.push((d+1)*(t-1)+(n-1),a,e);E.push(a,c,e)}})();this.setIndex(E);this.setAttribute("position",new B(r,3));this.setAttribute("normal",new B(q,3));this.setAttribute("uv",new B(u,2))}function Xd(a,b,c,d,e,f,g){L.call(this);this.type="TorusKnotGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};void 0!==g&&console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.");this.fromBufferGeometry(new Uc(a,
+b,c,d,e,f));this.mergeVertices()}function Uc(a,b,c,d,e,f){function g(a,b,c,d,e){var f=Math.sin(a);b=c/b*a;c=Math.cos(b);e.x=d*(2+c)*.5*Math.cos(a);e.y=d*(2+c)*f*.5;e.z=d*Math.sin(b)*.5}F.call(this);this.type="TorusKnotBufferGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};a=a||1;b=b||.4;c=Math.floor(c)||64;d=Math.floor(d)||8;e=e||2;f=f||3;var h=[],l=[],m=[],k=[],n,t=new p,r=new p,q=new p,u=new p,E=new p,x=new p,w=new p;for(n=0;n<=c;++n){var v=n/c*e*Math.PI*2;
+g(v,e,f,a,q);g(v+.01,e,f,a,u);x.subVectors(u,q);w.addVectors(u,q);E.crossVectors(x,w);w.crossVectors(E,x);E.normalize();w.normalize();for(v=0;v<=d;++v){var T=v/d*Math.PI*2,Z=-b*Math.cos(T);T=b*Math.sin(T);t.x=q.x+(Z*w.x+T*E.x);t.y=q.y+(Z*w.y+T*E.y);t.z=q.z+(Z*w.z+T*E.z);l.push(t.x,t.y,t.z);r.subVectors(t,q).normalize();m.push(r.x,r.y,r.z);k.push(n/c);k.push(v/d)}}for(v=1;v<=c;v++)for(n=1;n<=d;n++)a=(d+1)*v+(n-1),b=(d+1)*v+n,e=(d+1)*(v-1)+n,h.push((d+1)*(v-1)+(n-1),a,e),h.push(a,b,e);this.setIndex(h);
+this.setAttribute("position",new B(l,3));this.setAttribute("normal",new B(m,3));this.setAttribute("uv",new B(k,2))}function Yd(a,b,c,d,e){L.call(this);this.type="TorusGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};this.fromBufferGeometry(new Vc(a,b,c,d,e));this.mergeVertices()}function Vc(a,b,c,d,e){F.call(this);this.type="TorusBufferGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};a=a||1;b=b||.4;c=Math.floor(c)||8;d=Math.floor(d)||
+6;e=e||2*Math.PI;var f=[],g=[],h=[],l=[],m=new p,k=new p,n=new p,t,r;for(t=0;t<=c;t++)for(r=0;r<=d;r++){var q=r/d*e,u=t/c*Math.PI*2;k.x=(a+b*Math.cos(u))*Math.cos(q);k.y=(a+b*Math.cos(u))*Math.sin(q);k.z=b*Math.sin(u);g.push(k.x,k.y,k.z);m.x=a*Math.cos(q);m.y=a*Math.sin(q);n.subVectors(k,m).normalize();h.push(n.x,n.y,n.z);l.push(r/d);l.push(t/c)}for(t=1;t<=c;t++)for(r=1;r<=d;r++)a=(d+1)*(t-1)+r-1,b=(d+1)*(t-1)+r,e=(d+1)*t+r,f.push((d+1)*t+r-1,a,e),f.push(a,b,e);this.setIndex(f);this.setAttribute("position",
+new B(g,3));this.setAttribute("normal",new B(h,3));this.setAttribute("uv",new B(l,2))}function Xh(a,b,c,d,e){for(var f,g=0,h=b,l=c-d;h<c;h+=d)g+=(a[l]-a[h])*(a[h+1]+a[l+1]),l=h;if(e===0<g)for(e=b;e<c;e+=d)f=Yh(e,a[e],a[e+1],f);else for(e=c-d;e>=b;e-=d)f=Yh(e,a[e],a[e+1],f);f&&Ue(f,f.next)&&(Zd(f),f=f.next);return f}function Lb(a,b){if(!a)return a;b||(b=a);do{var c=!1;if(a.steiner||!Ue(a,a.next)&&0!==na(a.prev,a,a.next))a=a.next;else{Zd(a);a=b=a.prev;if(a===a.next)break;c=!0}}while(c||a!==b);return b}
+function $d(a,b,c,d,e,f,g){if(a){if(!g&&f){var h=a,l=h;do null===l.z&&(l.z=og(l.x,l.y,d,e,f)),l.prevZ=l.prev,l=l.nextZ=l.next;while(l!==h);l.prevZ.nextZ=null;l.prevZ=null;h=l;var m,k,n,t,r=1;do{l=h;var q=h=null;for(k=0;l;){k++;var p=l;for(m=n=0;m<r&&(n++,p=p.nextZ,p);m++);for(t=r;0<n||0<t&&p;)0!==n&&(0===t||!p||l.z<=p.z)?(m=l,l=l.nextZ,n--):(m=p,p=p.nextZ,t--),q?q.nextZ=m:h=m,m.prevZ=q,q=m;l=p}q.nextZ=null;r*=2}while(1<k)}for(h=a;a.prev!==a.next;){l=a.prev;p=a.next;if(f)q=Ak(a,d,e,f);else a:if(q=
+a,k=q.prev,n=q,r=q.next,0<=na(k,n,r))q=!1;else{for(m=q.next.next;m!==q.prev;){if(Wc(k.x,k.y,n.x,n.y,r.x,r.y,m.x,m.y)&&0<=na(m.prev,m,m.next)){q=!1;break a}m=m.next}q=!0}if(q)b.push(l.i/c),b.push(a.i/c),b.push(p.i/c),Zd(a),h=a=p.next;else if(a=p,a===h){if(!g)$d(Lb(a),b,c,d,e,f,1);else if(1===g){a=Lb(a);g=b;h=c;l=a;do p=l.prev,q=l.next.next,!Ue(p,q)&&Zh(p,l,l.next,q)&&ae(p,q)&&ae(q,p)&&(g.push(p.i/h),g.push(l.i/h),g.push(q.i/h),Zd(l),Zd(l.next),l=a=q),l=l.next;while(l!==a);a=Lb(l);$d(a,b,c,d,e,f,2)}else if(2===
+g)a:{g=a;do{for(h=g.next.next;h!==g.prev;){if(l=g.i!==h.i){l=g;p=h;if(q=l.next.i!==p.i&&l.prev.i!==p.i){b:{q=l;do{if(q.i!==l.i&&q.next.i!==l.i&&q.i!==p.i&&q.next.i!==p.i&&Zh(q,q.next,l,p)){q=!0;break b}q=q.next}while(q!==l);q=!1}q=!q}if(q){if(q=ae(l,p)&&ae(p,l)){q=l;k=!1;n=(l.x+p.x)/2;r=(l.y+p.y)/2;do q.y>r!==q.next.y>r&&q.next.y!==q.y&&n<(q.next.x-q.x)*(r-q.y)/(q.next.y-q.y)+q.x&&(k=!k),q=q.next;while(q!==l);q=k}q=q&&(na(l.prev,l,p.prev)||na(l,p.prev,p))||Ue(l,p)&&0<na(l.prev,l,l.next)&&0<na(p.prev,
+p,p.next)}l=q}if(l){a=$h(g,h);g=Lb(g,g.next);a=Lb(a,a.next);$d(g,b,c,d,e,f);$d(a,b,c,d,e,f);break a}h=h.next}g=g.next}while(g!==a)}break}}}}function Ak(a,b,c,d){var e=a.prev,f=a.next;if(0<=na(e,a,f))return!1;var g=e.x>a.x?e.x>f.x?e.x:f.x:a.x>f.x?a.x:f.x,h=e.y>a.y?e.y>f.y?e.y:f.y:a.y>f.y?a.y:f.y,l=og(e.x<a.x?e.x<f.x?e.x:f.x:a.x<f.x?a.x:f.x,e.y<a.y?e.y<f.y?e.y:f.y:a.y<f.y?a.y:f.y,b,c,d);b=og(g,h,b,c,d);c=a.prevZ;for(d=a.nextZ;c&&c.z>=l&&d&&d.z<=b;){if(c!==a.prev&&c!==a.next&&Wc(e.x,e.y,a.x,a.y,f.x,
+f.y,c.x,c.y)&&0<=na(c.prev,c,c.next))return!1;c=c.prevZ;if(d!==a.prev&&d!==a.next&&Wc(e.x,e.y,a.x,a.y,f.x,f.y,d.x,d.y)&&0<=na(d.prev,d,d.next))return!1;d=d.nextZ}for(;c&&c.z>=l;){if(c!==a.prev&&c!==a.next&&Wc(e.x,e.y,a.x,a.y,f.x,f.y,c.x,c.y)&&0<=na(c.prev,c,c.next))return!1;c=c.prevZ}for(;d&&d.z<=b;){if(d!==a.prev&&d!==a.next&&Wc(e.x,e.y,a.x,a.y,f.x,f.y,d.x,d.y)&&0<=na(d.prev,d,d.next))return!1;d=d.nextZ}return!0}function Bk(a,b){return a.x-b.x}function Ck(a,b){var c=b,d=a.x,e=a.y,f=-Infinity;do{if(e<=
+c.y&&e>=c.next.y&&c.next.y!==c.y){var g=c.x+(e-c.y)*(c.next.x-c.x)/(c.next.y-c.y);if(g<=d&&g>f){f=g;if(g===d){if(e===c.y)return c;if(e===c.next.y)return c.next}var h=c.x<c.next.x?c:c.next}}c=c.next}while(c!==b);if(!h)return null;if(d===f)return h;b=h;g=h.x;var l=h.y,m=Infinity;c=h;do{if(d>=c.x&&c.x>=g&&d!==c.x&&Wc(e<l?d:f,e,g,l,e<l?f:d,e,c.x,c.y)){var k=Math.abs(e-c.y)/(d-c.x);var n;if((n=ae(c,a))&&!(n=k<m)&&(n=k===m)&&!(n=c.x>h.x)&&(n=c.x===h.x)){n=h;var t=c;n=0>na(n.prev,n,t.prev)&&0>na(t.next,
+n,n.next)}n&&(h=c,m=k)}c=c.next}while(c!==b);return h}function og(a,b,c,d,e){a=32767*(a-c)*e;b=32767*(b-d)*e;a=(a|a<<8)&16711935;a=(a|a<<4)&252645135;a=(a|a<<2)&858993459;b=(b|b<<8)&16711935;b=(b|b<<4)&252645135;b=(b|b<<2)&858993459;return(a|a<<1)&1431655765|((b|b<<1)&1431655765)<<1}function Dk(a){var b=a,c=a;do{if(b.x<c.x||b.x===c.x&&b.y<c.y)c=b;b=b.next}while(b!==a);return c}function Wc(a,b,c,d,e,f,g,h){return 0<=(e-g)*(b-h)-(a-g)*(f-h)&&0<=(a-g)*(d-h)-(c-g)*(b-h)&&0<=(c-g)*(f-h)-(e-g)*(d-h)}function na(a,
+b,c){return(b.y-a.y)*(c.x-b.x)-(b.x-a.x)*(c.y-b.y)}function Ue(a,b){return a.x===b.x&&a.y===b.y}function Zh(a,b,c,d){var e=Ve(na(a,b,c)),f=Ve(na(a,b,d)),g=Ve(na(c,d,a)),h=Ve(na(c,d,b));return e!==f&&g!==h||0===e&&We(a,c,b)||0===f&&We(a,d,b)||0===g&&We(c,a,d)||0===h&&We(c,b,d)?!0:!1}function We(a,b,c){return b.x<=Math.max(a.x,c.x)&&b.x>=Math.min(a.x,c.x)&&b.y<=Math.max(a.y,c.y)&&b.y>=Math.min(a.y,c.y)}function Ve(a){return 0<a?1:0>a?-1:0}function ae(a,b){return 0>na(a.prev,a,a.next)?0<=na(a,b,a.next)&&
+0<=na(a,a.prev,b):0>na(a,b,a.prev)||0>na(a,a.next,b)}function $h(a,b){var c=new pg(a.i,a.x,a.y),d=new pg(b.i,b.x,b.y),e=a.next,f=b.prev;a.next=b;b.prev=a;c.next=e;e.prev=c;d.next=c;c.prev=d;f.next=d;d.prev=f;return d}function Yh(a,b,c,d){a=new pg(a,b,c);d?(a.next=d.next,a.prev=d,d.next.prev=a,d.next=a):(a.prev=a,a.next=a);return a}function Zd(a){a.next.prev=a.prev;a.prev.next=a.next;a.prevZ&&(a.prevZ.nextZ=a.nextZ);a.nextZ&&(a.nextZ.prevZ=a.prevZ)}function pg(a,b,c){this.i=a;this.x=b;this.y=c;this.nextZ=
+this.prevZ=this.z=this.next=this.prev=null;this.steiner=!1}function ai(a){var b=a.length;2<b&&a[b-1].equals(a[0])&&a.pop()}function bi(a,b){for(var c=0;c<b.length;c++)a.push(b[c].x),a.push(b[c].y)}function dc(a,b){L.call(this);this.type="ExtrudeGeometry";this.parameters={shapes:a,options:b};this.fromBufferGeometry(new hb(a,b));this.mergeVertices()}function hb(a,b){function c(a){function c(a,b,c){b||console.error("THREE.ExtrudeGeometry: vec does not exist");return b.clone().multiplyScalar(c).add(a)}
+function g(a,b,c){var d=a.x-b.x;var e=a.y-b.y;var f=c.x-a.x;var g=c.y-a.y,h=d*d+e*e;if(Math.abs(d*g-e*f)>Number.EPSILON){var l=Math.sqrt(h),m=Math.sqrt(f*f+g*g);h=b.x-e/l;b=b.y+d/l;g=((c.x-g/m-h)*g-(c.y+f/m-b)*f)/(d*g-e*f);f=h+d*g-a.x;d=b+e*g-a.y;e=f*f+d*d;if(2>=e)return new v(f,d);e=Math.sqrt(e/2)}else a=!1,d>Number.EPSILON?f>Number.EPSILON&&(a=!0):d<-Number.EPSILON?f<-Number.EPSILON&&(a=!0):Math.sign(e)===Math.sign(g)&&(a=!0),a?(f=-e,e=Math.sqrt(h)):(f=d,d=e,e=Math.sqrt(h/2));return new v(f/e,d/
+e)}function h(a,b){for(J=a.length;0<=--J;){var c=J;var f=J-1;0>f&&(f=a.length-1);var g,h=w+2*B;for(g=0;g<h;g++){var l=W*g,m=W*(g+1),k=b+f+l,n=b+f+m;m=b+c+m;q(b+c+l);q(k);q(m);q(k);q(n);q(m);l=e.length/3;l=F.generateSideWallUV(d,e,l-6,l-3,l-2,l-1);u(l[0]);u(l[1]);u(l[3]);u(l[1]);u(l[2]);u(l[3])}}}function l(a,b,c){E.push(a);E.push(b);E.push(c)}function k(a,b,c){q(a);q(b);q(c);a=e.length/3;a=F.generateTopUV(d,e,a-3,a-2,a-1);u(a[0]);u(a[1]);u(a[2])}function q(a){e.push(E[3*a]);e.push(E[3*a+1]);e.push(E[3*
+a+2])}function u(a){f.push(a.x);f.push(a.y)}var E=[],x=void 0!==b.curveSegments?b.curveSegments:12,w=void 0!==b.steps?b.steps:1,ja=void 0!==b.depth?b.depth:100,T=void 0!==b.bevelEnabled?b.bevelEnabled:!0,Z=void 0!==b.bevelThickness?b.bevelThickness:6,C=void 0!==b.bevelSize?b.bevelSize:Z-2,y=void 0!==b.bevelOffset?b.bevelOffset:0,B=void 0!==b.bevelSegments?b.bevelSegments:3,A=b.extrudePath,F=void 0!==b.UVGenerator?b.UVGenerator:Ek;void 0!==b.amount&&(console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."),
+ja=b.amount);var D=!1;if(A){var G=A.getSpacedPoints(w);D=!0;T=!1;var H=A.computeFrenetFrames(w,!1);var K=new p;var L=new p;var N=new p}T||(y=C=Z=B=0);var O;x=a.extractPoints(x);a=x.shape;var M=x.holes;if(!sb.isClockWise(a)){a=a.reverse();var ia=0;for(O=M.length;ia<O;ia++){var P=M[ia];sb.isClockWise(P)&&(M[ia]=P.reverse())}}var Y=sb.triangulateShape(a,M),V=a;ia=0;for(O=M.length;ia<O;ia++)P=M[ia],a=a.concat(P);var aa,W=a.length,R,ea=Y.length;x=[];var J=0;var ca=V.length;var S=ca-1;for(aa=J+1;J<ca;J++,
+S++,aa++)S===ca&&(S=0),aa===ca&&(aa=0),x[J]=g(V[J],V[S],V[aa]);A=[];var fa=x.concat();ia=0;for(O=M.length;ia<O;ia++){P=M[ia];var ba=[];J=0;ca=P.length;S=ca-1;for(aa=J+1;J<ca;J++,S++,aa++)S===ca&&(S=0),aa===ca&&(aa=0),ba[J]=g(P[J],P[S],P[aa]);A.push(ba);fa=fa.concat(ba)}for(S=0;S<B;S++){ca=S/B;var da=Z*Math.cos(ca*Math.PI/2);aa=C*Math.sin(ca*Math.PI/2)+y;J=0;for(ca=V.length;J<ca;J++){var ha=c(V[J],x[J],aa);l(ha.x,ha.y,-da)}ia=0;for(O=M.length;ia<O;ia++)for(P=M[ia],ba=A[ia],J=0,ca=P.length;J<ca;J++)ha=
+c(P[J],ba[J],aa),l(ha.x,ha.y,-da)}aa=C+y;for(J=0;J<W;J++)ha=T?c(a[J],fa[J],aa):a[J],D?(L.copy(H.normals[0]).multiplyScalar(ha.x),K.copy(H.binormals[0]).multiplyScalar(ha.y),N.copy(G[0]).add(L).add(K),l(N.x,N.y,N.z)):l(ha.x,ha.y,0);for(ca=1;ca<=w;ca++)for(J=0;J<W;J++)ha=T?c(a[J],fa[J],aa):a[J],D?(L.copy(H.normals[ca]).multiplyScalar(ha.x),K.copy(H.binormals[ca]).multiplyScalar(ha.y),N.copy(G[ca]).add(L).add(K),l(N.x,N.y,N.z)):l(ha.x,ha.y,ja/w*ca);for(S=B-1;0<=S;S--){ca=S/B;da=Z*Math.cos(ca*Math.PI/
+2);aa=C*Math.sin(ca*Math.PI/2)+y;J=0;for(ca=V.length;J<ca;J++)ha=c(V[J],x[J],aa),l(ha.x,ha.y,ja+da);ia=0;for(O=M.length;ia<O;ia++)for(P=M[ia],ba=A[ia],J=0,ca=P.length;J<ca;J++)ha=c(P[J],ba[J],aa),D?l(ha.x,ha.y+G[w-1].y,G[w-1].x+da):l(ha.x,ha.y,ja+da)}(function(){var a=e.length/3;if(T){var b=0*W;for(J=0;J<ea;J++)R=Y[J],k(R[2]+b,R[1]+b,R[0]+b);b=W*(w+2*B);for(J=0;J<ea;J++)R=Y[J],k(R[0]+b,R[1]+b,R[2]+b)}else{for(J=0;J<ea;J++)R=Y[J],k(R[2],R[1],R[0]);for(J=0;J<ea;J++)R=Y[J],k(R[0]+W*w,R[1]+W*w,R[2]+W*
+w)}d.addGroup(a,e.length/3-a,0)})();(function(){var a=e.length/3,b=0;h(V,b);b+=V.length;ia=0;for(O=M.length;ia<O;ia++)P=M[ia],h(P,b),b+=P.length;d.addGroup(a,e.length/3-a,1)})()}F.call(this);this.type="ExtrudeBufferGeometry";this.parameters={shapes:a,options:b};a=Array.isArray(a)?a:[a];for(var d=this,e=[],f=[],g=0,h=a.length;g<h;g++)c(a[g]);this.setAttribute("position",new B(e,3));this.setAttribute("uv",new B(f,2));this.computeVertexNormals()}function ci(a,b,c){c.shapes=[];if(Array.isArray(a))for(var d=
+0,e=a.length;d<e;d++)c.shapes.push(a[d].uuid);else c.shapes.push(a.uuid);void 0!==b.extrudePath&&(c.options.extrudePath=b.extrudePath.toJSON());return c}function be(a,b){L.call(this);this.type="TextGeometry";this.parameters={text:a,parameters:b};this.fromBufferGeometry(new Xc(a,b));this.mergeVertices()}function Xc(a,b){b=b||{};var c=b.font;if(!c||!c.isFont)return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new L;a=c.generateShapes(a,b.size);b.depth=void 0!==
+b.height?b.height:50;void 0===b.bevelThickness&&(b.bevelThickness=10);void 0===b.bevelSize&&(b.bevelSize=8);void 0===b.bevelEnabled&&(b.bevelEnabled=!1);hb.call(this,a,b);this.type="TextBufferGeometry"}function ce(a,b,c,d,e,f,g){L.call(this);this.type="SphereGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};this.fromBufferGeometry(new ec(a,b,c,d,e,f,g));this.mergeVertices()}function ec(a,b,c,d,e,f,g){F.call(this);this.type="SphereBufferGeometry";
+this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};a=a||1;b=Math.max(3,Math.floor(b)||8);c=Math.max(2,Math.floor(c)||6);d=void 0!==d?d:0;e=void 0!==e?e:2*Math.PI;f=void 0!==f?f:0;g=void 0!==g?g:Math.PI;var h=Math.min(f+g,Math.PI),l,m,k=0,n=[],t=new p,r=new p,q=[],u=[],E=[],v=[];for(m=0;m<=c;m++){var w=[],y=m/c,T=0;0==m&&0==f?T=.5/b:m==c&&h==Math.PI&&(T=-.5/b);for(l=0;l<=b;l++){var Z=l/b;t.x=-a*Math.cos(d+Z*e)*Math.sin(f+y*g);t.y=a*Math.cos(f+
+y*g);t.z=a*Math.sin(d+Z*e)*Math.sin(f+y*g);u.push(t.x,t.y,t.z);r.copy(t).normalize();E.push(r.x,r.y,r.z);v.push(Z+T,1-y);w.push(k++)}n.push(w)}for(m=0;m<c;m++)for(l=0;l<b;l++)a=n[m][l+1],d=n[m][l],e=n[m+1][l],g=n[m+1][l+1],(0!==m||0<f)&&q.push(a,d,g),(m!==c-1||h<Math.PI)&&q.push(d,e,g);this.setIndex(q);this.setAttribute("position",new B(u,3));this.setAttribute("normal",new B(E,3));this.setAttribute("uv",new B(v,2))}function de(a,b,c,d,e,f){L.call(this);this.type="RingGeometry";this.parameters={innerRadius:a,
+outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};this.fromBufferGeometry(new Yc(a,b,c,d,e,f));this.mergeVertices()}function Yc(a,b,c,d,e,f){F.call(this);this.type="RingBufferGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};a=a||.5;b=b||1;e=void 0!==e?e:0;f=void 0!==f?f:2*Math.PI;c=void 0!==c?Math.max(3,c):8;d=void 0!==d?Math.max(1,d):1;var g=[],h=[],l=[],m=[],k=a,n=(b-a)/d,t=new p,r=new v,q,u;for(q=0;q<=d;q++){for(u=
+0;u<=c;u++)a=e+u/c*f,t.x=k*Math.cos(a),t.y=k*Math.sin(a),h.push(t.x,t.y,t.z),l.push(0,0,1),r.x=(t.x/b+1)/2,r.y=(t.y/b+1)/2,m.push(r.x,r.y);k+=n}for(q=0;q<d;q++)for(b=q*(c+1),u=0;u<c;u++)a=u+b,e=a+c+1,f=a+c+2,k=a+1,g.push(a,e,k),g.push(e,f,k);this.setIndex(g);this.setAttribute("position",new B(h,3));this.setAttribute("normal",new B(l,3));this.setAttribute("uv",new B(m,2))}function ee(a,b,c,d){L.call(this);this.type="LatheGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};this.fromBufferGeometry(new Zc(a,
+b,c,d));this.mergeVertices()}function Zc(a,b,c,d){F.call(this);this.type="LatheBufferGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};b=Math.floor(b)||12;c=c||0;d=d||2*Math.PI;d=O.clamp(d,0,2*Math.PI);var e=[],f=[],g=[],h=1/b,l=new p,m=new v,k;for(k=0;k<=b;k++){var n=c+k*h*d;var t=Math.sin(n),r=Math.cos(n);for(n=0;n<=a.length-1;n++)l.x=a[n].x*t,l.y=a[n].y,l.z=a[n].x*r,f.push(l.x,l.y,l.z),m.x=k/b,m.y=n/(a.length-1),g.push(m.x,m.y)}for(k=0;k<b;k++)for(n=0;n<a.length-1;n++)c=n+
+k*a.length,h=c+a.length,l=c+a.length+1,m=c+1,e.push(c,h,m),e.push(h,l,m);this.setIndex(e);this.setAttribute("position",new B(f,3));this.setAttribute("uv",new B(g,2));this.computeVertexNormals();if(d===2*Math.PI)for(d=this.attributes.normal.array,e=new p,f=new p,g=new p,c=b*a.length*3,n=k=0;k<a.length;k++,n+=3)e.x=d[n+0],e.y=d[n+1],e.z=d[n+2],f.x=d[c+n+0],f.y=d[c+n+1],f.z=d[c+n+2],g.addVectors(e,f).normalize(),d[n+0]=d[c+n+0]=g.x,d[n+1]=d[c+n+1]=g.y,d[n+2]=d[c+n+2]=g.z}function fc(a,b){L.call(this);
+this.type="ShapeGeometry";"object"===typeof b&&(console.warn("THREE.ShapeGeometry: Options parameter has been removed."),b=b.curveSegments);this.parameters={shapes:a,curveSegments:b};this.fromBufferGeometry(new gc(a,b));this.mergeVertices()}function gc(a,b){function c(a){var c,h=e.length/3;a=a.extractPoints(b);var m=a.shape,k=a.holes;!1===sb.isClockWise(m)&&(m=m.reverse());a=0;for(c=k.length;a<c;a++){var z=k[a];!0===sb.isClockWise(z)&&(k[a]=z.reverse())}var p=sb.triangulateShape(m,k);a=0;for(c=k.length;a<
+c;a++)z=k[a],m=m.concat(z);a=0;for(c=m.length;a<c;a++)z=m[a],e.push(z.x,z.y,0),f.push(0,0,1),g.push(z.x,z.y);a=0;for(c=p.length;a<c;a++)m=p[a],d.push(m[0]+h,m[1]+h,m[2]+h),l+=3}F.call(this);this.type="ShapeBufferGeometry";this.parameters={shapes:a,curveSegments:b};b=b||12;var d=[],e=[],f=[],g=[],h=0,l=0;if(!1===Array.isArray(a))c(a);else for(var m=0;m<a.length;m++)c(a[m]),this.addGroup(h,l,m),h+=l,l=0;this.setIndex(d);this.setAttribute("position",new B(e,3));this.setAttribute("normal",new B(f,3));
+this.setAttribute("uv",new B(g,2))}function di(a,b){b.shapes=[];if(Array.isArray(a))for(var c=0,d=a.length;c<d;c++)b.shapes.push(a[c].uuid);else b.shapes.push(a.uuid);return b}function $c(a,b){F.call(this);this.type="EdgesGeometry";this.parameters={thresholdAngle:b};var c=[];b=Math.cos(O.DEG2RAD*(void 0!==b?b:1));var d=[0,0],e={},f=["a","b","c"];if(a.isBufferGeometry){var g=new L;g.fromBufferGeometry(a)}else g=a.clone();g.mergeVertices();g.computeFaceNormals();a=g.vertices;g=g.faces;for(var h=0,l=
+g.length;h<l;h++)for(var m=g[h],k=0;3>k;k++){var n=m[f[k]];var t=m[f[(k+1)%3]];d[0]=Math.min(n,t);d[1]=Math.max(n,t);n=d[0]+","+d[1];void 0===e[n]?e[n]={index1:d[0],index2:d[1],face1:h,face2:void 0}:e[n].face2=h}for(n in e)if(d=e[n],void 0===d.face2||g[d.face1].normal.dot(g[d.face2].normal)<=b)f=a[d.index1],c.push(f.x,f.y,f.z),f=a[d.index2],c.push(f.x,f.y,f.z);this.setAttribute("position",new B(c,3))}function hc(a,b,c,d,e,f,g,h){L.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,
+radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new tb(a,b,c,d,e,f,g,h));this.mergeVertices()}function tb(a,b,c,d,e,f,g,h){function l(c){var e,f=new v,l=new p,z=0,u=!0===c?a:b,w=!0===c?1:-1;var y=q;for(e=1;e<=d;e++)n.push(0,E*w,0),t.push(0,w,0),r.push(.5,.5),q++;var B=q;for(e=0;e<=d;e++){var A=e/d*h+g,D=Math.cos(A);A=Math.sin(A);l.x=u*A;l.y=E*w;l.z=u*D;n.push(l.x,l.y,l.z);t.push(0,w,0);f.x=.5*D+.5;f.y=.5*A*w+.5;r.push(f.x,f.y);
+q++}for(e=0;e<d;e++)f=y+e,l=B+e,!0===c?k.push(l,l+1,f):k.push(l+1,l,f),z+=3;m.addGroup(x,z,!0===c?1:2);x+=z}F.call(this);this.type="CylinderBufferGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};var m=this;a=void 0!==a?a:1;b=void 0!==b?b:1;c=c||1;d=Math.floor(d)||8;e=Math.floor(e)||1;f=void 0!==f?f:!1;g=void 0!==g?g:0;h=void 0!==h?h:2*Math.PI;var k=[],n=[],t=[],r=[],q=0,u=[],E=c/2,x=0;(function(){var f,l,z=new p,
+v=new p,C=0,y=(b-a)/c;for(l=0;l<=e;l++){var B=[],A=l/e,D=A*(b-a)+a;for(f=0;f<=d;f++){var F=f/d,G=F*h+g,H=Math.sin(G);G=Math.cos(G);v.x=D*H;v.y=-A*c+E;v.z=D*G;n.push(v.x,v.y,v.z);z.set(H,y,G).normalize();t.push(z.x,z.y,z.z);r.push(F,1-A);B.push(q++)}u.push(B)}for(f=0;f<d;f++)for(l=0;l<e;l++)z=u[l+1][f],v=u[l+1][f+1],y=u[l][f+1],k.push(u[l][f],z,y),k.push(z,v,y),C+=6;m.addGroup(x,C,0);x+=C})();!1===f&&(0<a&&l(!0),0<b&&l(!1));this.setIndex(k);this.setAttribute("position",new B(n,3));this.setAttribute("normal",
+new B(t,3));this.setAttribute("uv",new B(r,2))}function fe(a,b,c,d,e,f,g){hc.call(this,0,a,b,c,d,e,f,g);this.type="ConeGeometry";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function ge(a,b,c,d,e,f,g){tb.call(this,0,a,b,c,d,e,f,g);this.type="ConeBufferGeometry";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function he(a,b,c,d){L.call(this);this.type="CircleGeometry";this.parameters=
+{radius:a,segments:b,thetaStart:c,thetaLength:d};this.fromBufferGeometry(new ad(a,b,c,d));this.mergeVertices()}function ad(a,b,c,d){F.call(this);this.type="CircleBufferGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};a=a||1;b=void 0!==b?Math.max(3,b):8;c=void 0!==c?c:0;d=void 0!==d?d:2*Math.PI;var e=[],f=[],g=[],h=[],l,m=new p,k=new v;f.push(0,0,0);g.push(0,0,1);h.push(.5,.5);var n=0;for(l=3;n<=b;n++,l+=3){var t=c+n/b*d;m.x=a*Math.cos(t);m.y=a*Math.sin(t);f.push(m.x,m.y,
+m.z);g.push(0,0,1);k.x=(f[l]/a+1)/2;k.y=(f[l+1]/a+1)/2;h.push(k.x,k.y)}for(l=1;l<=b;l++)e.push(l,l+1,0);this.setIndex(e);this.setAttribute("position",new B(f,3));this.setAttribute("normal",new B(g,3));this.setAttribute("uv",new B(h,2))}function ic(a){K.call(this);this.type="ShadowMaterial";this.color=new D(0);this.transparent=!0;this.setValues(a)}function ub(a){Ca.call(this,a);this.type="RawShaderMaterial"}function ib(a){K.call(this);this.defines={STANDARD:""};this.type="MeshStandardMaterial";this.color=
+new D(16777215);this.roughness=1;this.metalness=0;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new D(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalMapType=0;this.normalScale=new v(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.metalnessMap=this.roughnessMap=null;this.envMapIntensity=1;this.refractionRatio=.98;this.wireframe=
+!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.vertexTangents=this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function jc(a){ib.call(this);this.defines={STANDARD:"",PHYSICAL:""};this.type="MeshPhysicalMaterial";this.clearcoat=0;this.clearcoatMap=null;this.clearcoatRoughness=0;this.clearcoatRoughnessMap=null;this.clearcoatNormalScale=new v(1,1);this.clearcoatNormalMap=null;this.reflectivity=.5;this.sheen=null;this.transparency=0;this.setValues(a)}
+function Mb(a){K.call(this);this.type="MeshPhongMaterial";this.color=new D(16777215);this.specular=new D(1118481);this.shininess=30;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new D(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalMapType=0;this.normalScale=new v(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.specularMap=
+null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function kc(a){K.call(this);this.defines={TOON:""};this.type="MeshToonMaterial";this.color=new D(16777215);this.specular=new D(1118481);this.shininess=30;this.lightMap=this.gradientMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=
+new D(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalMapType=0;this.normalScale=new v(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.alphaMap=this.specularMap=null;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function lc(a){K.call(this);this.type="MeshNormalMaterial";this.bumpMap=
+null;this.bumpScale=1;this.normalMap=null;this.normalMapType=0;this.normalScale=new v(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.fog=!1;this.setValues(a)}function mc(a){K.call(this);this.type="MeshLambertMaterial";this.color=new D(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new D(0);this.emissiveIntensity=
+1;this.envMap=this.alphaMap=this.specularMap=this.emissiveMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function nc(a){K.call(this);this.defines={MATCAP:""};this.type="MeshMatcapMaterial";this.color=new D(16777215);this.bumpMap=this.map=this.matcap=null;this.bumpScale=1;this.normalMap=null;this.normalMapType=
+0;this.normalScale=new v(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.alphaMap=null;this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function oc(a){da.call(this);this.type="LineDashedMaterial";this.scale=1;this.dashSize=3;this.gapSize=1;this.setValues(a)}function Ma(a,b,c,d){this.parameterPositions=a;this._cachedIndex=0;this.resultBuffer=void 0!==d?d:new b.constructor(c);this.sampleValues=b;this.valueSize=c}function Xe(a,b,c,d){Ma.call(this,
+a,b,c,d);this._offsetNext=this._weightNext=this._offsetPrev=this._weightPrev=-0}function ie(a,b,c,d){Ma.call(this,a,b,c,d)}function Ye(a,b,c,d){Ma.call(this,a,b,c,d)}function ta(a,b,c,d){if(void 0===a)throw Error("THREE.KeyframeTrack: track name is undefined");if(void 0===b||0===b.length)throw Error("THREE.KeyframeTrack: no keyframes in track named "+a);this.name=a;this.times=ka.convertArray(b,this.TimeBufferType);this.values=ka.convertArray(c,this.ValueBufferType);this.setInterpolation(d||this.DefaultInterpolation)}
+function Ze(a,b,c){ta.call(this,a,b,c)}function $e(a,b,c,d){ta.call(this,a,b,c,d)}function bd(a,b,c,d){ta.call(this,a,b,c,d)}function af(a,b,c,d){Ma.call(this,a,b,c,d)}function je(a,b,c,d){ta.call(this,a,b,c,d)}function bf(a,b,c,d){ta.call(this,a,b,c,d)}function cd(a,b,c,d){ta.call(this,a,b,c,d)}function Sa(a,b,c,d){this.name=a;this.tracks=c;this.duration=void 0!==b?b:-1;this.blendMode=void 0!==d?d:2500;this.uuid=O.generateUUID();0>this.duration&&this.resetDuration()}function Fk(a){switch(a.toLowerCase()){case "scalar":case "double":case "float":case "number":case "integer":return bd;
+case "vector":case "vector2":case "vector3":case "vector4":return cd;case "color":return $e;case "quaternion":return je;case "bool":case "boolean":return Ze;case "string":return bf}throw Error("THREE.KeyframeTrack: Unsupported typeName: "+a);}function Gk(a){if(void 0===a.type)throw Error("THREE.KeyframeTrack: track type undefined, can not parse");var b=Fk(a.type);if(void 0===a.times){var c=[],d=[];ka.flattenJSON(a.keys,c,d,"value");a.times=c;a.values=d}return void 0!==b.parse?b.parse(a):new b(a.name,
+a.times,a.values,a.interpolation)}function qg(a,b,c){var d=this,e=!1,f=0,g=0,h=void 0,l=[];this.onStart=void 0;this.onLoad=a;this.onProgress=b;this.onError=c;this.itemStart=function(a){g++;if(!1===e&&void 0!==d.onStart)d.onStart(a,f,g);e=!0};this.itemEnd=function(a){f++;if(void 0!==d.onProgress)d.onProgress(a,f,g);if(f===g&&(e=!1,void 0!==d.onLoad))d.onLoad()};this.itemError=function(a){if(void 0!==d.onError)d.onError(a)};this.resolveURL=function(a){return h?h(a):a};this.setURLModifier=function(a){h=
+a;return this};this.addHandler=function(a,b){l.push(a,b);return this};this.removeHandler=function(a){a=l.indexOf(a);-1!==a&&l.splice(a,2);return this};this.getHandler=function(a){for(var b=0,c=l.length;b<c;b+=2){var d=l[b],e=l[b+1];d.global&&(d.lastIndex=0);if(d.test(a))return e}return null}}function V(a){this.manager=void 0!==a?a:ei;this.crossOrigin="anonymous";this.resourcePath=this.path="";this.requestHeader={}}function Ta(a){V.call(this,a)}function rg(a){V.call(this,a)}function sg(a){V.call(this,
+a)}function cf(a){V.call(this,a)}function dd(a){V.call(this,a)}function df(a){V.call(this,a)}function ef(a){V.call(this,a)}function H(){this.type="Curve";this.arcLengthDivisions=200}function Na(a,b,c,d,e,f,g,h){H.call(this);this.type="EllipseCurve";this.aX=a||0;this.aY=b||0;this.xRadius=c||1;this.yRadius=d||1;this.aStartAngle=e||0;this.aEndAngle=f||2*Math.PI;this.aClockwise=g||!1;this.aRotation=h||0}function ed(a,b,c,d,e,f){Na.call(this,a,b,c,c,d,e,f);this.type="ArcCurve"}function tg(){var a=0,b=
+0,c=0,d=0;return{initCatmullRom:function(e,f,g,h,l){e=l*(g-e);h=l*(h-f);a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},initNonuniformCatmullRom:function(e,f,g,h,l,m,k){e=((f-e)/l-(g-e)/(l+m)+(g-f)/m)*m;h=((g-f)/m-(h-f)/(m+k)+(h-g)/k)*m;a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},calc:function(e){var f=e*e;return a+b*e+c*f+d*f*e}}}function qa(a,b,c,d){H.call(this);this.type="CatmullRomCurve3";this.points=a||[];this.closed=b||!1;this.curveType=c||"centripetal";this.tension=d||.5}function fi(a,b,c,d,e){b=.5*(d-
+b);e=.5*(e-c);var f=a*a;return(2*c-2*d+b+e)*a*f+(-3*c+3*d-2*b-e)*f+b*a+c}function ke(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function le(a,b,c,d,e){var f=1-a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}function Ya(a,b,c,d){H.call(this);this.type="CubicBezierCurve";this.v0=a||new v;this.v1=b||new v;this.v2=c||new v;this.v3=d||new v}function jb(a,b,c,d){H.call(this);this.type="CubicBezierCurve3";this.v0=a||new p;this.v1=b||new p;this.v2=c||new p;this.v3=d||new p}function Ia(a,b){H.call(this);
+this.type="LineCurve";this.v1=a||new v;this.v2=b||new v}function Za(a,b){H.call(this);this.type="LineCurve3";this.v1=a||new p;this.v2=b||new p}function $a(a,b,c){H.call(this);this.type="QuadraticBezierCurve";this.v0=a||new v;this.v1=b||new v;this.v2=c||new v}function kb(a,b,c){H.call(this);this.type="QuadraticBezierCurve3";this.v0=a||new p;this.v1=b||new p;this.v2=c||new p}function ab(a){H.call(this);this.type="SplineCurve";this.points=a||[]}function vb(){H.call(this);this.type="CurvePath";this.curves=
+[];this.autoClose=!1}function bb(a){vb.call(this);this.type="Path";this.currentPoint=new v;a&&this.setFromPoints(a)}function Nb(a){bb.call(this,a);this.uuid=O.generateUUID();this.type="Shape";this.holes=[]}function S(a,b){y.call(this);this.type="Light";this.color=new D(a);this.intensity=void 0!==b?b:1;this.receiveShadow=void 0}function ff(a,b,c){S.call(this,a,c);this.type="HemisphereLight";this.castShadow=void 0;this.position.copy(y.DefaultUp);this.updateMatrix();this.groundColor=new D(b)}function lb(a){this.camera=
+a;this.bias=0;this.radius=1;this.mapSize=new v(512,512);this.mapPass=this.map=null;this.matrix=new N;this._frustum=new Gc;this._frameExtents=new v(1,1);this._viewportCount=1;this._viewports=[new R(0,0,1,1)]}function gf(){lb.call(this,new P(50,1,.5,500))}function hf(a,b,c,d,e,f){S.call(this,a,b);this.type="SpotLight";this.position.copy(y.DefaultUp);this.updateMatrix();this.target=new y;Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(a){this.intensity=
+a/Math.PI}});this.distance=void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/3;this.penumbra=void 0!==e?e:0;this.decay=void 0!==f?f:1;this.shadow=new gf}function ug(){lb.call(this,new P(90,1,.5,500));this._frameExtents=new v(4,2);this._viewportCount=6;this._viewports=[new R(2,1,1,1),new R(0,1,1,1),new R(3,1,1,1),new R(1,1,1,1),new R(3,0,1,1),new R(1,0,1,1)];this._cubeDirections=[new p(1,0,0),new p(-1,0,0),new p(0,0,1),new p(0,0,-1),new p(0,1,0),new p(0,-1,0)];this._cubeUps=[new p(0,1,0),new p(0,1,0),
+new p(0,1,0),new p(0,1,0),new p(0,0,1),new p(0,0,-1)]}function jf(a,b,c,d){S.call(this,a,b);this.type="PointLight";Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(a){this.intensity=a/(4*Math.PI)}});this.distance=void 0!==c?c:0;this.decay=void 0!==d?d:1;this.shadow=new ug}function fd(a,b,c,d,e,f){fb.call(this);this.type="OrthographicCamera";this.zoom=1;this.view=null;this.left=void 0!==a?a:-1;this.right=void 0!==b?b:1;this.top=void 0!==c?c:1;this.bottom=
+void 0!==d?d:-1;this.near=void 0!==e?e:.1;this.far=void 0!==f?f:2E3;this.updateProjectionMatrix()}function kf(){lb.call(this,new fd(-5,5,5,-5,.5,500))}function lf(a,b){S.call(this,a,b);this.type="DirectionalLight";this.position.copy(y.DefaultUp);this.updateMatrix();this.target=new y;this.shadow=new kf}function mf(a,b){S.call(this,a,b);this.type="AmbientLight";this.castShadow=void 0}function nf(a,b,c,d){S.call(this,a,b);this.type="RectAreaLight";this.width=void 0!==c?c:10;this.height=void 0!==d?d:
+10}function of(){this.coefficients=[];for(var a=0;9>a;a++)this.coefficients.push(new p)}function Ua(a,b){S.call(this,void 0,b);this.type="LightProbe";this.sh=void 0!==a?a:new of}function pf(a){V.call(this,a);this.textures={}}function me(){F.call(this);this.type="InstancedBufferGeometry";this.instanceCount=Infinity}function qf(a,b,c,d){"number"===typeof c&&(d=c,c=!1,console.error("THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument."));G.call(this,a,b,c);this.meshPerAttribute=
+d||1}function rf(a){V.call(this,a)}function sf(a){V.call(this,a)}function vg(a){"undefined"===typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported.");"undefined"===typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported.");V.call(this,a);this.options=void 0}function wg(){this.type="ShapePath";this.color=new D;this.subPaths=[];this.currentPath=null}function xg(a){this.type="Font";this.data=a}function yg(a){V.call(this,a)}function tf(a){V.call(this,
+a)}function zg(a,b,c){Ua.call(this,void 0,c);a=(new D).set(a);c=(new D).set(b);b=new p(a.r,a.g,a.b);a=new p(c.r,c.g,c.b);c=Math.sqrt(Math.PI);var d=c*Math.sqrt(.75);this.sh.coefficients[0].copy(b).add(a).multiplyScalar(c);this.sh.coefficients[1].copy(b).sub(a).multiplyScalar(d)}function Ag(a,b){Ua.call(this,void 0,b);a=(new D).set(a);this.sh.coefficients[0].set(a.r,a.g,a.b).multiplyScalar(2*Math.sqrt(Math.PI))}function gi(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new P;
+this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new P;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1;this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}function Bg(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}function Cg(){y.call(this);this.type="AudioListener";this.context=Dg.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);
+this.filter=null;this.timeDelta=0;this._clock=new Bg}function gd(a){y.call(this);this.type="Audio";this.listener=a;this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.detune=0;this.loop=!1;this.offset=this.loopEnd=this.loopStart=0;this.duration=void 0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this._progress=this._startedAt=0;this.filters=[]}function Eg(a){gd.call(this,a);this.panner=
+this.context.createPanner();this.panner.panningModel="HRTF";this.panner.connect(this.gain)}function Fg(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function Gg(a,b,c){this.binding=a;this.valueSize=c;switch(b){case "quaternion":a=this._slerp;b=this._slerpAdditive;var d=this._setAdditiveIdentityQuaternion;this.buffer=new Float64Array(6*c);this._workIndex=5;break;case "string":case "bool":b=
+a=this._select;d=this._setAdditiveIdentityOther;this.buffer=Array(5*c);break;default:a=this._lerp,b=this._lerpAdditive,d=this._setAdditiveIdentityNumeric,this.buffer=new Float64Array(5*c)}this._mixBufferRegion=a;this._mixBufferRegionAdditive=b;this._setIdentity=d;this._origIndex=3;this._addIndex=4;this.referenceCount=this.useCount=this.cumulativeWeightAdditive=this.cumulativeWeight=0}function hi(a,b,c){c=c||Aa.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function Aa(a,b,
+c){this.path=b;this.parsedPath=c||Aa.parseTrackName(b);this.node=Aa.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function ii(){this.uuid=O.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var a={};this._indicesByUUID=a;for(var b=0,c=arguments.length;b!==c;++b)a[arguments[b].uuid]=b;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var d=this;this.stats={objects:{get total(){return d._objects.length},get inUse(){return this.total-
+d.nCachedObjects_}},get bindingsPerObject(){return d._bindings.length}}}function ji(a,b,c,d){this._mixer=a;this._clip=b;this._localRoot=c||null;this.blendMode=d||b.blendMode;a=b.tracks;b=a.length;c=Array(b);d={endingStart:2400,endingEnd:2400};for(var e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop=
+2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function Hg(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function uf(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function Ig(a,b,c){rb.call(this,
+a,b);this.meshPerAttribute=c||1}function Jg(a,b,c,d){this.ray=new Wb(a,b);this.near=c||0;this.far=d||Infinity;this.camera=null;this.layers=new De;this.params={Mesh:{},Line:{threshold:1},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})}function ki(a,b){return a.distance-b.distance}function Kg(a,b,c,d){a.layers.test(b.layers)&&a.raycast(b,
+c);if(!0===d){a=a.children;d=0;for(var e=a.length;d<e;d++)Kg(a[d],b,c,!0)}}function li(a,b,c){this.radius=void 0!==a?a:1;this.phi=void 0!==b?b:0;this.theta=void 0!==c?c:0;return this}function mi(a,b,c){this.radius=void 0!==a?a:1;this.theta=void 0!==b?b:0;this.y=void 0!==c?c:0;return this}function Lg(a,b){this.min=void 0!==a?a:new v(Infinity,Infinity);this.max=void 0!==b?b:new v(-Infinity,-Infinity)}function Mg(a,b){this.start=void 0!==a?a:new p;this.end=void 0!==b?b:new p}function ne(a){y.call(this);
+this.material=a;this.render=function(){};this.hasUvs=this.hasColors=this.hasNormals=this.hasPositions=!1;this.uvArray=this.colorArray=this.normalArray=this.positionArray=null;this.count=0}function hd(a,b){y.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=b;a=new F;b=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(var c=0,d=1;32>c;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,
+Math.cos(f),Math.sin(f),1)}a.setAttribute("position",new B(b,3));b=new da({fog:!1,toneMapped:!1});this.cone=new ma(a,b);this.add(this.cone);this.update()}function ni(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,ni(a.children[c]));return b}function pc(a){for(var b=ni(a),c=new F,d=[],e=[],f=new D(0,0,1),g=new D(0,1,0),h=0;h<b.length;h++){var l=b[h];l.parent&&l.parent.isBone&&(d.push(0,0,0),d.push(0,0,0),e.push(f.r,f.g,f.b),e.push(g.r,g.g,g.b))}c.setAttribute("position",
+new B(d,3));c.setAttribute("color",new B(e,3));d=new da({vertexColors:!0,depthTest:!1,depthWrite:!1,toneMapped:!1,transparent:!0});ma.call(this,c,d);this.type="SkeletonHelper";this.root=a;this.bones=b;this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1}function id(a,b,c){this.light=a;this.light.updateMatrixWorld();this.color=c;a=new ec(b,4,2);b=new Pa({wireframe:!0,fog:!1,toneMapped:!1});ea.call(this,a,b);this.type="PointLightHelper";this.matrix=this.light.matrixWorld;this.matrixAutoUpdate=!1;this.update()}
+function jd(a,b,c){y.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=c;a=new bc(b);a.rotateY(.5*Math.PI);this.material=new Pa({wireframe:!0,fog:!1,toneMapped:!1});void 0===this.color&&(this.material.vertexColors=!0);b=a.getAttribute("position");b=new Float32Array(3*b.count);a.setAttribute("color",new G(b,3));this.add(new ea(a,this.material));this.update()}function vf(a,b,c,d){a=a||10;b=b||10;c=new D(void 0!==c?c:4473924);d=new D(void 0!==
+d?d:8947848);var e=b/2,f=a/b,g=a/2;a=[];for(var h=[],l=0,m=0,k=-g;l<=b;l++,k+=f){a.push(-g,0,k,g,0,k);a.push(k,0,-g,k,0,g);var n=l===e?c:d;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3}b=new F;b.setAttribute("position",new B(a,3));b.setAttribute("color",new B(h,3));c=new da({vertexColors:!0,toneMapped:!1});ma.call(this,b,c);this.type="GridHelper"}function wf(a,b,c,d,e,f){a=a||10;b=b||16;c=c||8;d=d||64;e=new D(void 0!==e?e:4473924);f=new D(void 0!==f?f:8947848);var g=
+[],h=[],l;for(l=0;l<=b;l++){var m=l/b*2*Math.PI;var k=Math.sin(m)*a;m=Math.cos(m)*a;g.push(0,0,0);g.push(k,0,m);var n=l&1?e:f;h.push(n.r,n.g,n.b);h.push(n.r,n.g,n.b)}for(l=0;l<=c;l++){n=l&1?e:f;var t=a-a/c*l;for(b=0;b<d;b++)m=b/d*2*Math.PI,k=Math.sin(m)*t,m=Math.cos(m)*t,g.push(k,0,m),h.push(n.r,n.g,n.b),m=(b+1)/d*2*Math.PI,k=Math.sin(m)*t,m=Math.cos(m)*t,g.push(k,0,m),h.push(n.r,n.g,n.b)}a=new F;a.setAttribute("position",new B(g,3));a.setAttribute("color",new B(h,3));g=new da({vertexColors:!0,toneMapped:!1});
+ma.call(this,a,g);this.type="PolarGridHelper"}function kd(a,b,c){y.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=c;void 0===b&&(b=1);a=new F;a.setAttribute("position",new B([-b,b,0,b,b,0,b,-b,0,-b,-b,0,-b,b,0],3));b=new da({fog:!1,toneMapped:!1});this.lightPlane=new La(a,b);this.add(this.lightPlane);a=new F;a.setAttribute("position",new B([0,0,0,0,0,1],3));this.targetLine=new La(a,b);this.add(this.targetLine);this.update()}function oe(a){function b(a,
+b,d){c(a,d);c(b,d)}function c(a,b){f.push(0,0,0);g.push(b.r,b.g,b.b);void 0===h[a]&&(h[a]=[]);h[a].push(f.length/3-1)}var d=new F,e=new da({color:16777215,vertexColors:!0,toneMapped:!1}),f=[],g=[],h={},l=new D(16755200),m=new D(16711680),k=new D(43775),n=new D(16777215),t=new D(3355443);b("n1","n2",l);b("n2","n4",l);b("n4","n3",l);b("n3","n1",l);b("f1","f2",l);b("f2","f4",l);b("f4","f3",l);b("f3","f1",l);b("n1","f1",l);b("n2","f2",l);b("n3","f3",l);b("n4","f4",l);b("p","n1",m);b("p","n2",m);b("p",
+"n3",m);b("p","n4",m);b("u1","u2",k);b("u2","u3",k);b("u3","u1",k);b("c","t",n);b("p","c",t);b("cn1","cn2",t);b("cn3","cn4",t);b("cf1","cf2",t);b("cf3","cf4",t);d.setAttribute("position",new B(f,3));d.setAttribute("color",new B(g,3));ma.call(this,d,e);this.type="CameraHelper";this.camera=a;this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=h;this.update()}function fa(a,b,c,d,e,f,g){xf.set(e,f,g).unproject(d);a=
+b[a];if(void 0!==a)for(c=c.getAttribute("position"),b=0,d=a.length;b<d;b++)c.setXYZ(a[b],xf.x,xf.y,xf.z)}function wb(a,b){this.object=a;void 0===b&&(b=16776960);a=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var c=new Float32Array(24),d=new F;d.setIndex(new G(a,1));d.setAttribute("position",new G(c,3));ma.call(this,d,new da({color:b,toneMapped:!1}));this.type="BoxHelper";this.matrixAutoUpdate=!1;this.update()}function pe(a,b){this.type="Box3Helper";this.box=a;b=b||16776960;a=
+new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var c=new F;c.setIndex(new G(a,1));c.setAttribute("position",new B([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3));ma.call(this,c,new da({color:b,toneMapped:!1}));this.type="Box3Helper";this.geometry.computeBoundingSphere()}function qe(a,b,c){this.plane=a;this.size=void 0===b?1:b;a=void 0!==c?c:16776960;b=new F;b.setAttribute("position",new B([1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0],3));
+b.computeBoundingSphere();La.call(this,b,new da({color:a,toneMapped:!1}));this.type="PlaneHelper";b=new F;b.setAttribute("position",new B([1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1],3));b.computeBoundingSphere();this.add(new ea(b,new Pa({color:a,opacity:.2,transparent:!0,depthWrite:!1,toneMapped:!1})))}function xb(a,b,c,d,e,f){y.call(this);this.type="ArrowHelper";void 0===a&&(a=new p(0,0,1));void 0===b&&(b=new p(0,0,0));void 0===c&&(c=1);void 0===d&&(d=16776960);void 0===e&&(e=.2*c);void 0===f&&(f=
+.2*e);void 0===yf&&(yf=new F,yf.setAttribute("position",new B([0,0,0,0,1,0],3)),Ng=new tb(0,.5,1,5,1),Ng.translate(0,-.5,0));this.position.copy(b);this.line=new La(yf,new da({color:d,toneMapped:!1}));this.line.matrixAutoUpdate=!1;this.add(this.line);this.cone=new ea(Ng,new Pa({color:d,toneMapped:!1}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);this.setDirection(a);this.setLength(c,e,f)}function re(a){a=a||1;var b=[0,0,0,a,0,0,0,0,0,0,a,0,0,0,0,0,0,a];a=new F;a.setAttribute("position",new B(b,
+3));a.setAttribute("color",new B([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));b=new da({vertexColors:!0,toneMapped:!1});ma.call(this,a,b);this.type="AxesHelper"}function Og(a){this._renderer=a;this._pingPongRenderTarget=null;a=new Float32Array(20);var b=new p(0,1,0);a=new ub({defines:{n:20},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:a},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:b},inputEncoding:{value:mb[3E3]},outputEncoding:{value:mb[3E3]}},vertexShader:Pg(),
+fragmentShader:"\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform sampler2D envMap;\nuniform int samples;\nuniform float weights[n];\nuniform bool latitudinal;\nuniform float dTheta;\nuniform float mipInt;\nuniform vec3 poleAxis;\n\n"+Qg()+"\n\n#define ENVMAP_TYPE_CUBE_UV\n#include <cube_uv_reflection_fragment>\n\nvec3 getSample(float theta, vec3 axis) {\n\tfloat cosTheta = cos(theta);\n\t// Rodrigues' axis-angle rotation\n\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t+ cross(axis, vOutputDirection) * sin(theta)\n\t\t+ axis * dot(axis, vOutputDirection) * (1.0 - cosTheta);\n\treturn bilinearCubeUV(envMap, sampleDirection, mipInt);\n}\n\nvoid main() {\n\tvec3 axis = latitudinal ? poleAxis : cross(poleAxis, vOutputDirection);\n\tif (all(equal(axis, vec3(0.0))))\n\t\taxis = vec3(vOutputDirection.z, 0.0, - vOutputDirection.x);\n\taxis = normalize(axis);\n\tgl_FragColor = vec4(0.0);\n\tgl_FragColor.rgb += weights[0] * getSample(0.0, axis);\n\tfor (int i = 1; i < n; i++) {\n\t\tif (i >= samples)\n\t\t\tbreak;\n\t\tfloat theta = dTheta * float(i);\n\t\tgl_FragColor.rgb += weights[i] * getSample(-1.0 * theta, axis);\n\t\tgl_FragColor.rgb += weights[i] * getSample(theta, axis);\n\t}\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t",
+blending:0,depthTest:!1,depthWrite:!1});a.type="SphericalGaussianBlur";this._blurMaterial=a;this._cubemapShader=this._equirectShader=null;this._compileMaterial(this._blurMaterial)}function oi(a){a=new Ba(3*nb,3*nb,a);a.texture.mapping=306;a.texture.name="PMREM.cubeUv";a.scissorTest=!0;return a}function Rg(a,b,c,d,e){a.viewport.set(b,c,d,e);a.scissor.set(b,c,d,e)}function pi(){var a=new v(1,1);a=new ub({uniforms:{envMap:{value:null},texelSize:{value:a},inputEncoding:{value:mb[3E3]},outputEncoding:{value:mb[3E3]}},
+vertexShader:Pg(),fragmentShader:"\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform sampler2D envMap;\nuniform vec2 texelSize;\n\n"+Qg()+"\n\n#include <common>\n\nvoid main() {\n\tgl_FragColor = vec4(0.0);\n\tvec3 outputDirection = normalize(vOutputDirection);\n\tvec2 uv = equirectUv( outputDirection );\n\tvec2 f = fract(uv / texelSize - 0.5);\n\tuv -= f * texelSize;\n\tvec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.x += texelSize.x;\n\tvec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.y += texelSize.y;\n\tvec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.x -= texelSize.x;\n\tvec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tvec3 tm = mix(tl, tr, f.x);\n\tvec3 bm = mix(bl, br, f.x);\n\tgl_FragColor.rgb = mix(tm, bm, f.y);\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t",
+blending:0,depthTest:!1,depthWrite:!1});a.type="EquirectangularToCubeUV";return a}function qi(){var a=new ub({uniforms:{envMap:{value:null},inputEncoding:{value:mb[3E3]},outputEncoding:{value:mb[3E3]}},vertexShader:Pg(),fragmentShader:"\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform samplerCube envMap;\n\n"+Qg()+"\n\nvoid main() {\n\tgl_FragColor = vec4(0.0);\n\tgl_FragColor.rgb = envMapTexelToLinear(textureCube(envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ))).rgb;\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t",
+blending:0,depthTest:!1,depthWrite:!1});a.type="CubemapToCubeUV";return a}function Pg(){return"\nprecision mediump float;\nprecision mediump int;\nattribute vec3 position;\nattribute vec2 uv;\nattribute float faceIndex;\nvarying vec3 vOutputDirection;\n\n// RH coordinate system; PMREM face-indexing convention\nvec3 getDirection(vec2 uv, float face) {\n\tuv = 2.0 * uv - 1.0;\n\tvec3 direction = vec3(uv, 1.0);\n\tif (face == 0.0) {\n\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\t} else if (face == 1.0) {\n\t\tdirection = direction.xzy;\n\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\t} else if (face == 2.0) {\n\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\t} else if (face == 3.0) {\n\t\tdirection = direction.zyx;\n\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\t} else if (face == 4.0) {\n\t\tdirection = direction.xzy;\n\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\t} else if (face == 5.0) {\n\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\t}\n\treturn direction;\n}\n\nvoid main() {\n\tvOutputDirection = getDirection(uv, faceIndex);\n\tgl_Position = vec4( position, 1.0 );\n}\n\t"}
+function Qg(){return"\nuniform int inputEncoding;\nuniform int outputEncoding;\n\n#include <encodings_pars_fragment>\n\nvec4 inputTexelToLinear(vec4 value){\n\tif(inputEncoding == 0){\n\t\treturn value;\n\t}else if(inputEncoding == 1){\n\t\treturn sRGBToLinear(value);\n\t}else if(inputEncoding == 2){\n\t\treturn RGBEToLinear(value);\n\t}else if(inputEncoding == 3){\n\t\treturn RGBMToLinear(value, 7.0);\n\t}else if(inputEncoding == 4){\n\t\treturn RGBMToLinear(value, 16.0);\n\t}else if(inputEncoding == 5){\n\t\treturn RGBDToLinear(value, 256.0);\n\t}else{\n\t\treturn GammaToLinear(value, 2.2);\n\t}\n}\n\nvec4 linearToOutputTexel(vec4 value){\n\tif(outputEncoding == 0){\n\t\treturn value;\n\t}else if(outputEncoding == 1){\n\t\treturn LinearTosRGB(value);\n\t}else if(outputEncoding == 2){\n\t\treturn LinearToRGBE(value);\n\t}else if(outputEncoding == 3){\n\t\treturn LinearToRGBM(value, 7.0);\n\t}else if(outputEncoding == 4){\n\t\treturn LinearToRGBM(value, 16.0);\n\t}else if(outputEncoding == 5){\n\t\treturn LinearToRGBD(value, 256.0);\n\t}else{\n\t\treturn LinearToGamma(value, 2.2);\n\t}\n}\n\nvec4 envMapTexelToLinear(vec4 color) {\n\treturn inputTexelToLinear(color);\n}\n\t"}
+function ri(a){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");qa.call(this,a);this.type="catmullrom";this.closed=!0}function si(a){console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");qa.call(this,a);this.type="catmullrom"}function Sg(a){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.");qa.call(this,a);this.type="catmullrom"}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,
+-52));void 0===Number.isInteger&&(Number.isInteger=function(a){return"number"===typeof a&&isFinite(a)&&Math.floor(a)===a});void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0<a?1:+a});!1==="name"in Function.prototype&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}});void 0===Object.assign&&(Object.assign=function(a){if(void 0===a||null===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=
+Object(a),c=1;c<arguments.length;c++){var d=arguments[c];if(void 0!==d&&null!==d)for(var e in d)Object.prototype.hasOwnProperty.call(d,e)&&(b[e]=d[e])}return b});Object.assign(ua.prototype,{addEventListener:function(a,b){void 0===this._listeners&&(this._listeners={});var c=this._listeners;void 0===c[a]&&(c[a]=[]);-1===c[a].indexOf(b)&&c[a].push(b)},hasEventListener:function(a,b){if(void 0===this._listeners)return!1;var c=this._listeners;return void 0!==c[a]&&-1!==c[a].indexOf(b)},removeEventListener:function(a,
+b){void 0!==this._listeners&&(a=this._listeners[a],void 0!==a&&(b=a.indexOf(b),-1!==b&&a.splice(b,1)))},dispatchEvent:function(a){if(void 0!==this._listeners){var b=this._listeners[a.type];if(void 0!==b){a.target=this;b=b.slice(0);for(var c=0,d=b.length;c<d;c++)b[c].call(this,a)}}}});for(var za=[],se=0;256>se;se++)za[se]=(16>se?"0":"")+se.toString(16);var O={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){var a=4294967295*Math.random()|0,b=4294967295*Math.random()|0,c=4294967295*Math.random()|
+0,d=4294967295*Math.random()|0;return(za[a&255]+za[a>>8&255]+za[a>>16&255]+za[a>>24&255]+"-"+za[b&255]+za[b>>8&255]+"-"+za[b>>16&15|64]+za[b>>24&255]+"-"+za[c&63|128]+za[c>>8&255]+"-"+za[c>>16&255]+za[c>>24&255]+za[d&255]+za[d>>8&255]+za[d>>16&255]+za[d>>24&255]).toUpperCase()},clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},lerp:function(a,b,c){return(1-c)*a+c*b},smoothstep:function(a,
+b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},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*(.5-Math.random())},degToRad:function(a){return a*O.DEG2RAD},radToDeg:function(a){return a*O.RAD2DEG},isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a},ceilPowerOfTwo:function(a){return Math.pow(2,
+Math.ceil(Math.log(a)/Math.LN2))},floorPowerOfTwo:function(a){return Math.pow(2,Math.floor(Math.log(a)/Math.LN2))},setQuaternionFromProperEuler:function(a,b,c,d,e){var f=Math.cos,g=Math.sin,h=f(c/2);c=g(c/2);var l=f((b+d)/2),m=g((b+d)/2),k=f((b-d)/2),n=g((b-d)/2);f=f((d-b)/2);b=g((d-b)/2);switch(e){case "XYX":a.set(h*m,c*k,c*n,h*l);break;case "YZY":a.set(c*n,h*m,c*k,h*l);break;case "ZXZ":a.set(c*k,c*n,h*m,h*l);break;case "XZX":a.set(h*m,c*b,c*f,h*l);break;case "YXY":a.set(c*f,h*m,c*b,h*l);break;case "ZYZ":a.set(c*
+b,c*f,h*m,h*l);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+e)}}};Object.defineProperties(v.prototype,{width:{get:function(){return this.x},set:function(a){this.x=a}},height:{get:function(){return this.y},set:function(a){this.y=a}}});Object.assign(v.prototype,{isVector2:!0,set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=
+a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),
+this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},
+subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},applyMatrix3:function(a){var b=this.x,c=this.y;a=a.elements;this.x=a[0]*b+a[3]*c+a[6];this.y=a[1]*b+a[4]*c+a[7];return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},
+max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(a,b){this.x=Math.max(a,Math.min(b,this.x));this.y=Math.max(a,Math.min(b,this.y));return this},clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);
+return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},cross:function(a){return this.x*a.y-this.y*a.x},lengthSq:function(){return this.x*
+this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){return Math.atan2(-this.y,-this.x)+Math.PI},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},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-
+a.y)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){this.x=a.x+(b.x-a.x)*c;this.y=a.y+(b.y-a.y)*c;return this},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a,b,c){void 0!==
+c&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);return this},rotateAround:function(a,b){var c=Math.cos(b);b=Math.sin(b);var d=this.x-a.x,e=this.y-a.y;this.x=d*c-e*b+a.x;this.y=d*b+e*c+a.y;return this},random:function(){this.x=Math.random();this.y=Math.random();return this}});Object.assign(ya.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,l){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=
+l;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},extractBasis:function(a,b,c){a.setFromMatrix3Column(this,0);b.setFromMatrix3Column(this,1);c.setFromMatrix3Column(this,2);return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],
+a[5],a[9],a[2],a[6],a[10]);return this},multiply:function(a){return this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[3],f=c[6],g=c[1],h=c[4],l=c[7],m=c[2],k=c[5];c=c[8];var n=d[0],t=d[3],p=d[6],q=d[1],u=d[4],v=d[7],x=d[2],w=d[5];d=d[8];b[0]=a*n+e*q+f*x;b[3]=a*t+e*u+f*w;b[6]=a*p+e*v+f*d;b[1]=g*n+h*q+l*x;b[4]=g*t+h*u+l*w;b[7]=g*p+h*v+l*d;b[2]=m*n+k*q+c*x;b[5]=m*t+k*
+u+c*w;b[8]=m*p+k*v+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;b[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],l=a[7];a=a[8];return b*f*a-b*g*l-c*e*a+c*g*h+d*e*l-d*f*h},getInverse:function(a,b){void 0!==b&&console.warn("THREE.Matrix3: .getInverse() can no longer be configured to throw on degenerate.");var c=a.elements;a=this.elements;b=c[0];var d=c[1],
+e=c[2],f=c[3],g=c[4],h=c[5],l=c[6],m=c[7];c=c[8];var k=c*g-h*m,n=h*l-c*f,p=m*f-g*l,r=b*k+d*n+e*p;if(0===r)return this.set(0,0,0,0,0,0,0,0,0);r=1/r;a[0]=k*r;a[1]=(e*m-c*d)*r;a[2]=(h*d-e*g)*r;a[3]=n*r;a[4]=(c*b-e*l)*r;a[5]=(e*f-h*b)*r;a[6]=p*r;a[7]=(d*l-m*b)*r;a[8]=(g*b-d*f)*r;return this},transpose:function(){var a=this.elements;var b=a[1];a[1]=a[3];a[3]=b;b=a[2];a[2]=a[6];a[6]=b;b=a[5];a[5]=a[7];a[7]=b;return this},getNormalMatrix:function(a){return this.setFromMatrix4(a).getInverse(this).transpose()},
+transposeIntoArray:function(a){var b=this.elements;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},setUvTransform:function(a,b,c,d,e,f,g){var h=Math.cos(e);e=Math.sin(e);this.set(c*h,c*e,-c*(h*f+e*g)+f+a,-d*e,d*h,-d*(-e*f+h*g)+g+b,0,0,1)},scale:function(a,b){var c=this.elements;c[0]*=a;c[3]*=a;c[6]*=a;c[1]*=b;c[4]*=b;c[7]*=b;return this},rotate:function(a){var b=Math.cos(a);a=Math.sin(a);var c=this.elements,d=c[0],e=c[3],f=c[6],g=c[1],h=c[4],
+l=c[7];c[0]=b*d+a*g;c[3]=b*e+a*h;c[6]=b*f+a*l;c[1]=-a*d+b*g;c[4]=-a*e+b*h;c[7]=-a*f+b*l;return this},translate:function(a,b){var c=this.elements;c[0]+=a*c[2];c[3]+=a*c[5];c[6]+=a*c[8];c[1]+=b*c[2];c[4]+=b*c[5];c[7]+=b*c[8];return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;9>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);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];return a}});var ld,Ob={getDataURL:function(a){if("undefined"==typeof HTMLCanvasElement)return a.src;if(!(a instanceof HTMLCanvasElement)){void 0===ld&&(ld=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"));ld.width=a.width;ld.height=a.height;var b=ld.getContext("2d");a instanceof ImageData?b.putImageData(a,0,0):b.drawImage(a,0,0,a.width,a.height);a=ld}return 2048<
+a.width||2048<a.height?a.toDataURL("image/jpeg",.6):a.toDataURL("image/png")}},ej=0;W.DEFAULT_IMAGE=void 0;W.DEFAULT_MAPPING=300;W.prototype=Object.assign(Object.create(ua.prototype),{constructor:W,isTexture:!0,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);
+this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.internalFormat=a.internalFormat;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.center.copy(a.center);this.rotation=a.rotation;this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrix.copy(a.matrix);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=
+a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){var b=void 0===a||"string"===typeof a;if(!b&&void 0!==a.textures[this.uuid])return a.textures[this.uuid];var c={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,
+minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){var d=this.image;void 0===d.uuid&&(d.uuid=O.generateUUID());if(!b&&void 0===a.images[d.uuid]){if(Array.isArray(d)){var e=[];for(var f=0,g=d.length;f<g;f++)e.push(Ob.getDataURL(d[f]))}else e=Ob.getDataURL(d);a.images[d.uuid]={uuid:d.uuid,url:e}}c.image=d.uuid}b||(a.textures[this.uuid]=c);return c},dispose:function(){this.dispatchEvent({type:"dispose"})},
+transformUv:function(a){if(300!==this.mapping)return a;a.applyMatrix3(this.matrix);if(0>a.x||1<a.x)switch(this.wrapS){case 1E3:a.x-=Math.floor(a.x);break;case 1001:a.x=0>a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1<a.y)switch(this.wrapT){case 1E3:a.y-=Math.floor(a.y);break;case 1001:a.y=0>a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y);return a}});Object.defineProperty(W.prototype,
+"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.defineProperties(R.prototype,{width:{get:function(){return this.z},set:function(a){this.z=a}},height:{get:function(){return this.w},set:function(a){this.w=a}}});Object.assign(R.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;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},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(a){this.x=
+a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors: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},addScaledVector:function(a,b){this.x+=a.x*
+b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors: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},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=
+a;this.w*=a;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/b);return this},setAxisAngleFromRotationMatrix:function(a){a=
+a.elements;var b=a[0];var c=a[4];var d=a[8],e=a[1],f=a[5],g=a[9];var h=a[2];var l=a[6];var m=a[10];if(.01>Math.abs(c-e)&&.01>Math.abs(d-h)&&.01>Math.abs(g-l)){if(.1>Math.abs(c+e)&&.1>Math.abs(d+h)&&.1>Math.abs(g+l)&&.1>Math.abs(b+f+m-3))return this.set(1,0,0,0),this;a=Math.PI;b=(b+1)/2;f=(f+1)/2;m=(m+1)/2;c=(c+e)/4;d=(d+h)/4;g=(g+l)/4;b>f&&b>m?.01>b?(l=0,c=h=.707106781):(l=Math.sqrt(b),h=c/l,c=d/l):f>m?.01>f?(l=.707106781,h=0,c=.707106781):(h=Math.sqrt(f),l=c/h,c=g/h):.01>m?(h=l=.707106781,c=0):(c=
+Math.sqrt(m),l=d/c,h=g/c);this.set(l,h,c,a);return this}a=Math.sqrt((l-g)*(l-g)+(d-h)*(d-h)+(e-c)*(e-c));.001>Math.abs(a)&&(a=1);this.x=(l-g)/a;this.y=(d-h)/a;this.z=(e-c)/a;this.w=Math.acos((b+f+m-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,
+b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,this.w));return this},clampScalar:function(a,b){this.x=Math.max(a,Math.min(b,this.x));this.y=Math.max(a,Math.min(b,this.y));this.z=Math.max(a,Math.min(b,this.z));this.w=Math.max(a,Math.min(b,this.w));return this},clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=
+Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);
+this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},manhattanLength:function(){return Math.abs(this.x)+
+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){this.x=a.x+(b.x-a.x)*c;this.y=a.y+(b.y-a.y)*c;this.z=a.z+(b.z-a.z)*c;this.w=a.w+(b.w-a.w)*c;return this},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&
+a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this},random:function(){this.x=Math.random();this.y=
+Math.random();this.z=Math.random();this.w=Math.random();return this}});Ba.prototype=Object.assign(Object.create(ua.prototype),{constructor:Ba,isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.texture.image.width=a,this.texture.image.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);
+this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Xf.prototype=Object.assign(Object.create(Ba.prototype),{constructor:Xf,isWebGLMultisampleRenderTarget:!0,copy:function(a){Ba.prototype.copy.call(this,a);this.samples=a.samples;return this}});Object.assign(va,{slerp:function(a,b,c,d){return c.copy(a).slerp(b,d)},slerpFlat:function(a,b,c,d,e,f,g){var h=
+c[d+0],l=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var k=e[f+1],n=e[f+2];e=e[f+3];if(c!==e||h!==d||l!==k||m!==n){f=1-g;var p=h*d+l*k+m*n+c*e,r=0<=p?1:-1,q=1-p*p;q>Number.EPSILON&&(q=Math.sqrt(q),p=Math.atan2(q,p*r),f=Math.sin(f*p)/q,g=Math.sin(g*p)/q);r*=g;h=h*f+d*r;l=l*f+k*r;m=m*f+n*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+l*l+m*m+c*c),h*=g,l*=g,m*=g,c*=g)}a[b]=h;a[b+1]=l;a[b+2]=m;a[b+3]=c},multiplyQuaternionsFlat:function(a,b,c,d,e,f){var g=c[d],h=c[d+1],l=c[d+2];c=c[d+3];d=e[f];var m=e[f+1],k=e[f+2];e=
+e[f+3];a[b]=g*e+c*d+h*k-l*m;a[b+1]=h*e+c*m+l*d-g*k;a[b+2]=l*e+c*k+g*m-h*d;a[b+3]=c*e-g*d-h*m-l*k;return a}});Object.defineProperties(va.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this._onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this._onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this._onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=a;this._onChangeCallback()}}});Object.assign(va.prototype,
+{isQuaternion:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this._onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this._onChangeCallback();return this},setFromEuler:function(a,b){if(!a||!a.isEuler)throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var c=a._x,d=a._y,e=a._z;a=a.order;var f=Math.cos,
+g=Math.sin,h=f(c/2),l=f(d/2);f=f(e/2);c=g(c/2);d=g(d/2);e=g(e/2);switch(a){case "XYZ":this._x=c*l*f+h*d*e;this._y=h*d*f-c*l*e;this._z=h*l*e+c*d*f;this._w=h*l*f-c*d*e;break;case "YXZ":this._x=c*l*f+h*d*e;this._y=h*d*f-c*l*e;this._z=h*l*e-c*d*f;this._w=h*l*f+c*d*e;break;case "ZXY":this._x=c*l*f-h*d*e;this._y=h*d*f+c*l*e;this._z=h*l*e+c*d*f;this._w=h*l*f-c*d*e;break;case "ZYX":this._x=c*l*f-h*d*e;this._y=h*d*f+c*l*e;this._z=h*l*e-c*d*f;this._w=h*l*f+c*d*e;break;case "YZX":this._x=c*l*f+h*d*e;this._y=
+h*d*f+c*l*e;this._z=h*l*e-c*d*f;this._w=h*l*f-c*d*e;break;case "XZY":this._x=c*l*f-h*d*e;this._y=h*d*f-c*l*e;this._z=h*l*e+c*d*f;this._w=h*l*f+c*d*e;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+a)}!1!==b&&this._onChangeCallback();return this},setFromAxisAngle:function(a,b){b/=2;var c=Math.sin(b);this._x=a.x*c;this._y=a.y*c;this._z=a.z*c;this._w=Math.cos(b);this._onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];
+a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],l=b[6];b=b[10];var m=c+f+b;0<m?(c=.5/Math.sqrt(m+1),this._w=.25/c,this._x=(l-g)*c,this._y=(d-h)*c,this._z=(e-a)*c):c>f&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(l-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y=.25*c,this._z=(g+l)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+l)/c,this._z=.25*c);this._onChangeCallback();return this},setFromUnitVectors:function(a,
+b){var c=a.dot(b)+1;1E-6>c?(c=0,Math.abs(a.x)>Math.abs(a.z)?(this._x=-a.y,this._y=a.x,this._z=0):(this._x=0,this._y=-a.z,this._z=a.y)):(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);this._w=c;return this.normalize()},angleTo:function(a){return 2*Math.acos(Math.abs(O.clamp(this.dot(a),-1,1)))},rotateTowards:function(a,b){var c=this.angleTo(a);if(0===c)return this;this.slerp(a,Math.min(1,b/c));return this},inverse:function(){return this.conjugate()},conjugate:function(){this._x*=
+-1;this._y*=-1;this._z*=-1;this._onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},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=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this._onChangeCallback();return this},
+multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z;a=a._w;var f=b._x,g=b._y,h=b._z;b=b._w;this._x=c*b+a*f+d*h-e*g;this._y=d*b+a*g+e*f-c*h;this._z=e*b+a*h+c*g-d*f;this._w=a*b-c*f-d*g-e*h;this._onChangeCallback();
+return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;a=1-g*g;if(a<=Number.EPSILON)return g=1-b,this._w=g*f+b*this._w,this._x=g*c+b*this._x,this._y=g*d+b*this._y,this._z=g*e+b*this._z,this.normalize(),this._onChangeCallback(),this;a=Math.sqrt(a);var h=Math.atan2(a,
+g);g=Math.sin((1-b)*h)/a;b=Math.sin(b*h)/a;this._w=f*g+this._w*b;this._x=c*g+this._x*b;this._y=d*g+this._y*b;this._z=e*g+this._z*b;this._onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this._onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+
+3]=this._w;return a},fromBufferAttribute:function(a,b){this._x=a.getX(b);this._y=a.getY(b);this._z=a.getZ(b);this._w=a.getW(b);return this},_onChange:function(a){this._onChangeCallback=a;return this},_onChangeCallback:function(){}});var Tg=new p,ti=new va;Object.assign(p.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;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},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),
+this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;
+return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*
+b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(a){a&&a.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");return this.applyQuaternion(ti.setFromEuler(a))},applyAxisAngle:function(a,b){return this.applyQuaternion(ti.setFromAxisAngle(a,b))},applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyNormalMatrix:function(a){return this.applyMatrix3(a).normalize()},
+applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,l=a*c+g*b-e*d,m=a*d+e*c-f*b;b=-e*b-f*c-g*d;this.x=h*a+b*-e+l*-g-m*-f;this.y=l*a+b*-f+m*-e-h*-g;this.z=m*a+b*-g+h*-f-l*-e;return this},project:function(a){return this.applyMatrix4(a.matrixWorldInverse).applyMatrix4(a.projectionMatrix)},
+unproject:function(a){return this.applyMatrix4(a.projectionMatrixInverse).applyMatrix4(a.matrixWorld)},transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,
+a.z);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},clampScalar:function(a,b){this.x=Math.max(a,Math.min(b,this.x));this.y=Math.max(a,Math.min(b,this.y));this.z=Math.max(a,Math.min(b,this.z));return this},clampLength:function(a,b){var c=this.length();return this.divideScalar(c||
+1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=
+0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},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.x*this.x+this.y*this.y+this.z*this.z)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},
+lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){this.x=a.x+(b.x-a.x)*c;this.y=a.y+(b.y-a.y)*c;this.z=a.z+(b.z-a.z)*c;return this},cross:function(a,b){return void 0!==b?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,b)):this.crossVectors(this,a)},crossVectors:function(a,b){var c=a.x,d=a.y;a=a.z;var e=b.x,f=b.y;b=b.z;this.x=d*b-a*f;this.y=a*
+e-c*b;this.z=c*f-d*e;return this},projectOnVector:function(a){var b=a.lengthSq();if(0===b)return this.set(0,0,0);b=a.dot(this)/b;return this.copy(a).multiplyScalar(b)},projectOnPlane:function(a){Tg.copy(this).projectOnVector(a);return this.sub(Tg)},reflect:function(a){return this.sub(Tg.copy(a).multiplyScalar(2*this.dot(a)))},angleTo:function(a){var b=Math.sqrt(this.lengthSq()*a.lengthSq());if(0===b)return Math.PI/2;a=this.dot(a)/b;return Math.acos(O.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},
+distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){return this.setFromSphericalCoords(a.radius,a.phi,a.theta)},setFromSphericalCoords:function(a,b,c){var d=Math.sin(b)*a;this.x=d*Math.sin(c);this.y=Math.cos(b)*a;this.z=d*Math.cos(c);return this},setFromCylindrical:function(a){return this.setFromCylindricalCoords(a.radius,a.theta,
+a.y)},setFromCylindricalCoords:function(a,b,c){this.x=a*Math.sin(b);this.y=c;this.z=a*Math.cos(b);return this},setFromMatrixPosition:function(a){a=a.elements;this.x=a[12];this.y=a[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,4*b)},setFromMatrix3Column:function(a,
+b){return this.fromArray(a.elements,3*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this},
+random:function(){this.x=Math.random();this.y=Math.random();this.z=Math.random();return this}});var md=new p,ba=new N,Hk=new p(0,0,0),Ik=new p(1,1,1),Pb=new p,zf=new p,Ea=new p;Object.assign(N.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,l,m,k,n,p,r,q,u){var z=this.elements;z[0]=a;z[4]=b;z[8]=c;z[12]=d;z[1]=e;z[5]=f;z[9]=g;z[13]=h;z[2]=l;z[6]=m;z[10]=k;z[14]=n;z[3]=p;z[7]=r;z[11]=q;z[15]=u;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new N).fromArray(this.elements)},
+copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,
+b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(a){var b=this.elements,c=a.elements,d=1/md.setFromMatrixColumn(a,0).length(),e=1/md.setFromMatrixColumn(a,1).length();a=1/md.setFromMatrixColumn(a,2).length();b[0]=c[0]*d;b[1]=c[1]*d;b[2]=c[2]*d;b[3]=0;b[4]=c[4]*e;b[5]=c[5]*e;b[6]=c[6]*e;b[7]=0;b[8]=c[8]*a;b[9]=c[9]*a;b[10]=c[10]*a;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromEuler:function(a){a&&a.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");
+var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c);c=Math.sin(c);var g=Math.cos(d);d=Math.sin(d);var h=Math.cos(e);e=Math.sin(e);if("XYZ"===a.order){a=f*h;var l=f*e,m=c*h,k=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=l+m*d;b[5]=a-k*d;b[9]=-c*g;b[2]=k-a*d;b[6]=m+l*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,l=g*e,m=d*h,k=d*e,b[0]=a+k*c,b[4]=m*c-l,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=l*c-m,b[6]=k+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,l=g*e,m=d*h,k=d*e,b[0]=a-k*c,b[4]=-f*e,b[8]=m+l*c,b[1]=l+m*c,b[5]=f*h,b[9]=
+k-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,l=f*e,m=c*h,k=c*e,b[0]=g*h,b[4]=m*d-l,b[8]=a*d+k,b[1]=g*e,b[5]=k*d+a,b[9]=l*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=k-a*e,b[8]=m*e+l,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=l*e+m,b[10]=a-k*e):"XZY"===a.order&&(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+k,b[5]=f*h,b[9]=l*e-m,b[2]=m*e-l,b[6]=c*h,b[10]=k*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){return this.compose(Hk,
+a,Ik)},lookAt:function(a,b,c){var d=this.elements;Ea.subVectors(a,b);0===Ea.lengthSq()&&(Ea.z=1);Ea.normalize();Pb.crossVectors(c,Ea);0===Pb.lengthSq()&&(1===Math.abs(c.z)?Ea.x+=1E-4:Ea.z+=1E-4,Ea.normalize(),Pb.crossVectors(c,Ea));Pb.normalize();zf.crossVectors(Ea,Pb);d[0]=Pb.x;d[4]=zf.x;d[8]=Ea.x;d[1]=Pb.y;d[5]=zf.y;d[9]=Ea.y;d[2]=Pb.z;d[6]=zf.z;d[10]=Ea.z;return this},multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),
+this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[4],f=c[8],g=c[12],h=c[1],l=c[5],m=c[9],k=c[13],n=c[2],p=c[6],r=c[10],q=c[14],u=c[3],v=c[7],x=c[11];c=c[15];var w=d[0],y=d[4],B=d[8],Z=d[12],C=d[1],A=d[5],D=d[9],F=d[13],G=d[2],H=d[6],K=d[10],L=d[14],M=d[3],N=d[7],O=d[11];d=d[15];b[0]=a*w+e*C+f*G+g*M;b[4]=a*y+e*A+f*H+g*N;b[8]=a*B+e*D+f*K+
+g*O;b[12]=a*Z+e*F+f*L+g*d;b[1]=h*w+l*C+m*G+k*M;b[5]=h*y+l*A+m*H+k*N;b[9]=h*B+l*D+m*K+k*O;b[13]=h*Z+l*F+m*L+k*d;b[2]=n*w+p*C+r*G+q*M;b[6]=n*y+p*A+r*H+q*N;b[10]=n*B+p*D+r*K+q*O;b[14]=n*Z+p*F+r*L+q*d;b[3]=u*w+v*C+x*G+c*M;b[7]=u*y+v*A+x*H+c*N;b[11]=u*B+v*D+x*K+c*O;b[15]=u*Z+v*F+x*L+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},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],l=a[13],m=a[2],k=a[6],n=a[10],p=a[14];return a[3]*(+e*h*k-d*l*k-e*g*n+c*l*n+d*g*p-c*h*p)+a[7]*(+b*h*p-b*l*n+e*f*n-d*f*p+d*l*m-e*h*m)+a[11]*(+b*l*k-b*g*p-e*f*k+c*f*p+e*g*m-c*l*m)+a[15]*(-d*g*m-b*h*k+b*g*n+d*f*k-c*f*n+c*h*m)},transpose:function(){var a=this.elements;var 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},setPosition:function(a,
+b,c){var d=this.elements;a.isVector3?(d[12]=a.x,d[13]=a.y,d[14]=a.z):(d[12]=a,d[13]=b,d[14]=c);return this},getInverse:function(a,b){void 0!==b&&console.warn("THREE.Matrix4: .getInverse() can no longer be configured to throw on degenerate.");b=this.elements;var c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],l=c[6],m=c[7],k=c[8],n=c[9],p=c[10],r=c[11],q=c[12],u=c[13],v=c[14];c=c[15];var x=n*v*m-u*p*m+u*l*r-h*v*r-n*l*c+h*p*c,w=q*p*m-k*v*m-q*l*r+g*v*r+k*l*c-g*p*c,y=k*u*m-q*n*m+q*h*r-g*u*
+r-k*h*c+g*n*c,B=q*n*l-k*u*l-q*h*p+g*u*p+k*h*v-g*n*v,A=a*x+d*w+e*y+f*B;if(0===A)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);A=1/A;b[0]=x*A;b[1]=(u*p*f-n*v*f-u*e*r+d*v*r+n*e*c-d*p*c)*A;b[2]=(h*v*f-u*l*f+u*e*m-d*v*m-h*e*c+d*l*c)*A;b[3]=(n*l*f-h*p*f-n*e*m+d*p*m+h*e*r-d*l*r)*A;b[4]=w*A;b[5]=(k*v*f-q*p*f+q*e*r-a*v*r-k*e*c+a*p*c)*A;b[6]=(q*l*f-g*v*f-q*e*m+a*v*m+g*e*c-a*l*c)*A;b[7]=(g*p*f-k*l*f+k*e*m-a*p*m-g*e*r+a*l*r)*A;b[8]=y*A;b[9]=(q*n*f-k*u*f-q*d*r+a*u*r+k*d*c-a*n*c)*A;b[10]=(g*u*f-q*h*f+q*d*m-
+a*u*m-g*d*c+a*h*c)*A;b[11]=(k*h*f-g*n*f-k*d*m+a*n*m+g*d*r-a*h*r)*A;b[12]=B*A;b[13]=(k*u*e-q*n*e+q*d*p-a*u*p-k*d*v+a*n*v)*A;b[14]=(q*h*e-g*u*e-q*d*l+a*u*l+g*d*v-a*h*v)*A;b[15]=(g*n*e-k*h*e+k*d*l-a*n*l-g*d*p+a*h*p)*A;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y;a=a.z;b[0]*=c;b[4]*=d;b[8]*=a;b[1]*=c;b[5]*=d;b[9]*=a;b[2]*=c;b[6]*=d;b[10]*=a;b[3]*=c;b[7]*=d;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],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},makeRotationX: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);b=Math.sin(b);var d=1-c,e=a.x,f=a.y;a=a.z;var g=d*e,h=d*f;this.set(g*e+c,g*f-b*a,g*a+b*f,0,g*f+b*a,h*f+c,h*a-b*e,0,g*a-b*f,h*a+b*e,d*a*a+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},makeShear:function(a,b,c){this.set(1,b,c,0,a,1,c,0,a,b,1,0,0,0,0,1);return this},compose:function(a,b,c){var d=this.elements,e=b._x,f=b._y,g=b._z,h=b._w,l=e+e,m=f+f,k=g+g;b=e*l;var n=e*m;e*=k;var p=f*m;f*=k;g*=k;l*=h;m*=h;h*=k;k=c.x;var r=
+c.y;c=c.z;d[0]=(1-(p+g))*k;d[1]=(n+h)*k;d[2]=(e-m)*k;d[3]=0;d[4]=(n-h)*r;d[5]=(1-(b+g))*r;d[6]=(f+l)*r;d[7]=0;d[8]=(e+m)*c;d[9]=(f-l)*c;d[10]=(1-(b+p))*c;d[11]=0;d[12]=a.x;d[13]=a.y;d[14]=a.z;d[15]=1;return this},decompose:function(a,b,c){var d=this.elements,e=md.set(d[0],d[1],d[2]).length(),f=md.set(d[4],d[5],d[6]).length(),g=md.set(d[8],d[9],d[10]).length();0>this.determinant()&&(e=-e);a.x=d[12];a.y=d[13];a.z=d[14];ba.copy(this);a=1/e;d=1/f;var h=1/g;ba.elements[0]*=a;ba.elements[1]*=a;ba.elements[2]*=
+a;ba.elements[4]*=d;ba.elements[5]*=d;ba.elements[6]*=d;ba.elements[8]*=h;ba.elements[9]*=h;ba.elements[10]*=h;b.setFromRotationMatrix(ba);c.x=e;c.y=f;c.z=g;return this},makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");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/(c-d);g[9]=(c+d)/(c-d);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},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),l=1/(c-d),m=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*l;g[9]=0;g[13]=-((c+d)*l);g[2]=0;g[6]=0;g[10]=-2*m;g[14]=-((f+e)*m);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},
+toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);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}});var ui=new N,vi=new va;Ub.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");Ub.DefaultOrder="XYZ";Object.defineProperties(Ub.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this._onChangeCallback()}},
+y:{get:function(){return this._y},set:function(a){this._y=a;this._onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this._onChangeCallback()}},order:{get:function(){return this._order},set:function(a){this._order=a;this._onChangeCallback()}}});Object.assign(Ub.prototype,{isEuler:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this._onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},
+copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this._onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=O.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],l=e[5],m=e[9],k=e[2],n=e[6];e=e[10];b=b||this._order;switch(b){case "XYZ":this._y=Math.asin(d(g,-1,1));.9999999>Math.abs(g)?(this._x=Math.atan2(-m,e),this._z=Math.atan2(-f,a)):(this._x=Math.atan2(n,l),this._z=0);break;case "YXZ":this._x=Math.asin(-d(m,-1,1));.9999999>Math.abs(m)?(this._y=
+Math.atan2(g,e),this._z=Math.atan2(h,l)):(this._y=Math.atan2(-k,a),this._z=0);break;case "ZXY":this._x=Math.asin(d(n,-1,1));.9999999>Math.abs(n)?(this._y=Math.atan2(-k,e),this._z=Math.atan2(-f,l)):(this._y=0,this._z=Math.atan2(h,a));break;case "ZYX":this._y=Math.asin(-d(k,-1,1));.9999999>Math.abs(k)?(this._x=Math.atan2(n,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,l));break;case "YZX":this._z=Math.asin(d(h,-1,1));.9999999>Math.abs(h)?(this._x=Math.atan2(-m,l),this._y=Math.atan2(-k,
+a)):(this._x=0,this._y=Math.atan2(g,e));break;case "XZY":this._z=Math.asin(-d(f,-1,1));.9999999>Math.abs(f)?(this._x=Math.atan2(n,l),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-m,e),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+b)}this._order=b;!1!==c&&this._onChangeCallback();return this},setFromQuaternion:function(a,b,c){ui.makeRotationFromQuaternion(a);return this.setFromRotationMatrix(ui,b,c)},setFromVector3:function(a,b){return this.set(a.x,
+a.y,a.z,b||this._order)},reorder:function(a){vi.setFromEuler(this);return this.setFromQuaternion(vi,a)},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this._onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,
+this._y,this._z):new p(this._x,this._y,this._z)},_onChange:function(a){this._onChangeCallback=a;return this},_onChangeCallback:function(){}});Object.assign(De.prototype,{set:function(a){this.mask=1<<a|0},enable:function(a){this.mask=this.mask|1<<a|0},enableAll:function(){this.mask=-1},toggle:function(a){this.mask^=1<<a|0},disable:function(a){this.mask&=~(1<<a|0)},disableAll:function(){this.mask=0},test:function(a){return 0!==(this.mask&a.mask)}});var fj=0,wi=new p,nd=new va,yb=new N,Af=new p,te=new p,
+Jk=new p,Kk=new va,xi=new p(1,0,0),yi=new p(0,1,0),zi=new p(0,0,1),Lk={type:"added"},Mk={type:"removed"};y.DefaultUp=new p(0,1,0);y.DefaultMatrixAutoUpdate=!0;y.prototype=Object.assign(Object.create(ua.prototype),{constructor:y,isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix4:function(a){this.matrixAutoUpdate&&this.updateMatrix();this.matrix.premultiply(a);this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(a){this.quaternion.premultiply(a);
+return this},setRotationFromAxisAngle:function(a,b){this.quaternion.setFromAxisAngle(a,b)},setRotationFromEuler:function(a){this.quaternion.setFromEuler(a,!0)},setRotationFromMatrix:function(a){this.quaternion.setFromRotationMatrix(a)},setRotationFromQuaternion:function(a){this.quaternion.copy(a)},rotateOnAxis:function(a,b){nd.setFromAxisAngle(a,b);this.quaternion.multiply(nd);return this},rotateOnWorldAxis:function(a,b){nd.setFromAxisAngle(a,b);this.quaternion.premultiply(nd);return this},rotateX:function(a){return this.rotateOnAxis(xi,
+a)},rotateY:function(a){return this.rotateOnAxis(yi,a)},rotateZ:function(a){return this.rotateOnAxis(zi,a)},translateOnAxis:function(a,b){wi.copy(a).applyQuaternion(this.quaternion);this.position.add(wi.multiplyScalar(b));return this},translateX:function(a){return this.translateOnAxis(xi,a)},translateY:function(a){return this.translateOnAxis(yi,a)},translateZ:function(a){return this.translateOnAxis(zi,a)},localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(a){return a.applyMatrix4(yb.getInverse(this.matrixWorld))},
+lookAt:function(a,b,c){a.isVector3?Af.copy(a):Af.set(a,b,c);a=this.parent;this.updateWorldMatrix(!0,!1);te.setFromMatrixPosition(this.matrixWorld);this.isCamera||this.isLight?yb.lookAt(te,Af,this.up):yb.lookAt(Af,te,this.up);this.quaternion.setFromRotationMatrix(yb);a&&(yb.extractRotation(a.matrixWorld),nd.setFromRotationMatrix(yb),this.quaternion.premultiply(nd.inverse()))},add:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.add(arguments[b]);return this}if(a===this)return console.error("THREE.Object3D.add: object can't be added as a child of itself.",
+a),this;a&&a.isObject3D?(null!==a.parent&&a.parent.remove(a),a.parent=this,this.children.push(a),a.dispatchEvent(Lk)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",a);return this},remove:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.remove(arguments[b]);return this}b=this.children.indexOf(a);-1!==b&&(a.parent=null,this.children.splice(b,1),a.dispatchEvent(Mk));return this},attach:function(a){this.updateWorldMatrix(!0,!1);yb.getInverse(this.matrixWorld);
+null!==a.parent&&(a.parent.updateWorldMatrix(!0,!1),yb.multiply(a.parent.matrixWorld));a.applyMatrix4(yb);a.updateWorldMatrix(!1,!1);this.add(a);return this},getObjectById:function(a){return this.getObjectByProperty("id",a)},getObjectByName:function(a){return this.getObjectByProperty("name",a)},getObjectByProperty:function(a,b){if(this[a]===b)return this;for(var c=0,d=this.children.length;c<d;c++){var e=this.children[c].getObjectByProperty(a,b);if(void 0!==e)return e}},getWorldPosition:function(a){void 0===
+a&&(console.warn("THREE.Object3D: .getWorldPosition() target is now required"),a=new p);this.updateMatrixWorld(!0);return a.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(a){void 0===a&&(console.warn("THREE.Object3D: .getWorldQuaternion() target is now required"),a=new va);this.updateMatrixWorld(!0);this.matrixWorld.decompose(te,a,Jk);return a},getWorldScale:function(a){void 0===a&&(console.warn("THREE.Object3D: .getWorldScale() target is now required"),a=new p);this.updateMatrixWorld(!0);
+this.matrixWorld.decompose(te,Kk,a);return a},getWorldDirection:function(a){void 0===a&&(console.warn("THREE.Object3D: .getWorldDirection() target is now required"),a=new p);this.updateMatrixWorld(!0);var b=this.matrixWorld.elements;return a.set(b[8],b[9],b[10]).normalize()},raycast:function(){},traverse:function(a){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverse(a)},traverseVisible:function(a){if(!1!==this.visible){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverseVisible(a)}},
+traverseAncestors:function(a){var b=this.parent;null!==b&&(a(b),b.traverseAncestors(a))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale);this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a)null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,a=!0;for(var b=this.children,c=
+0,d=b.length;c<d;c++)b[c].updateMatrixWorld(a)},updateWorldMatrix:function(a,b){var c=this.parent;!0===a&&null!==c&&c.updateWorldMatrix(!0,!1);this.matrixAutoUpdate&&this.updateMatrix();null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix);if(!0===b)for(a=this.children,b=0,c=a.length;b<c;b++)a[b].updateWorldMatrix(!1,!0)},toJSON:function(a){function b(b,c){void 0===b[c.uuid]&&(b[c.uuid]=c.toJSON(a));return c.uuid}function c(a){var b=
+[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var d=void 0===a||"string"===typeof a,e={};d&&(a={geometries:{},materials:{},textures:{},images:{},shapes:{}},e.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});var f={};f.uuid=this.uuid;f.type=this.type;""!==this.name&&(f.name=this.name);!0===this.castShadow&&(f.castShadow=!0);!0===this.receiveShadow&&(f.receiveShadow=!0);!1===this.visible&&(f.visible=!1);!1===this.frustumCulled&&(f.frustumCulled=!1);0!==this.renderOrder&&
+(f.renderOrder=this.renderOrder);"{}"!==JSON.stringify(this.userData)&&(f.userData=this.userData);f.layers=this.layers.mask;f.matrix=this.matrix.toArray();!1===this.matrixAutoUpdate&&(f.matrixAutoUpdate=!1);this.isInstancedMesh&&(f.type="InstancedMesh",f.count=this.count,f.instanceMatrix=this.instanceMatrix.toJSON());if(this.isMesh||this.isLine||this.isPoints){f.geometry=b(a.geometries,this.geometry);var g=this.geometry.parameters;if(void 0!==g&&void 0!==g.shapes)if(g=g.shapes,Array.isArray(g))for(var h=
+0,l=g.length;h<l;h++)b(a.shapes,g[h]);else b(a.shapes,g)}if(void 0!==this.material)if(Array.isArray(this.material)){g=[];h=0;for(l=this.material.length;h<l;h++)g.push(b(a.materials,this.material[h]));f.material=g}else f.material=b(a.materials,this.material);if(0<this.children.length)for(f.children=[],h=0;h<this.children.length;h++)f.children.push(this.children[h].toJSON(a).object);if(d){d=c(a.geometries);h=c(a.materials);l=c(a.textures);var m=c(a.images);g=c(a.shapes);0<d.length&&(e.geometries=d);
+0<h.length&&(e.materials=h);0<l.length&&(e.textures=l);0<m.length&&(e.images=m);0<g.length&&(e.shapes=g)}e.object=f;return e},clone:function(a){return(new this.constructor).copy(this,a)},copy:function(a,b){void 0===b&&(b=!0);this.name=a.name;this.up.copy(a.up);this.position.copy(a.position);this.quaternion.copy(a.quaternion);this.scale.copy(a.scale);this.matrix.copy(a.matrix);this.matrixWorld.copy(a.matrixWorld);this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;
+this.layers.mask=a.layers.mask;this.visible=a.visible;this.castShadow=a.castShadow;this.receiveShadow=a.receiveShadow;this.frustumCulled=a.frustumCulled;this.renderOrder=a.renderOrder;this.userData=JSON.parse(JSON.stringify(a.userData));if(!0===b)for(b=0;b<a.children.length;b++)this.add(a.children[b].clone());return this}});zc.prototype=Object.assign(Object.create(y.prototype),{constructor:zc,isScene:!0,copy:function(a,b){y.prototype.copy.call(this,a,b);null!==a.background&&(this.background=a.background.clone());
+null!==a.environment&&(this.environment=a.environment.clone());null!==a.fog&&(this.fog=a.fog.clone());null!==a.overrideMaterial&&(this.overrideMaterial=a.overrideMaterial.clone());this.autoUpdate=a.autoUpdate;this.matrixAutoUpdate=a.matrixAutoUpdate;return this},toJSON:function(a){var b=y.prototype.toJSON.call(this,a);null!==this.background&&(b.object.background=this.background.toJSON(a));null!==this.environment&&(b.object.environment=this.environment.toJSON(a));null!==this.fog&&(b.object.fog=this.fog.toJSON());
+return b},dispose:function(){this.dispatchEvent({type:"dispose"})}});var zb=[new p,new p,new p,new p,new p,new p,new p,new p],ue=new p,Ug=new Va,od=new p,pd=new p,qd=new p,Qb=new p,Rb=new p,qc=new p,ve=new p,Bf=new p,Cf=new p,Vb=new p;Object.assign(Va.prototype,{isBox3:!0,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromArray:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,l=a.length;h<l;h+=3){var m=a[h],k=a[h+1],n=a[h+2];m<b&&(b=
+m);k<c&&(c=k);n<d&&(d=n);m>e&&(e=m);k>f&&(f=k);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromBufferAttribute:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,l=a.count;h<l;h++){var m=a.getX(h),k=a.getY(h),n=a.getZ(h);m<b&&(b=m);k<c&&(c=k);n<d&&(d=n);m>e&&(e=m);k>f&&(f=k);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);
+return this},setFromCenterAndSize:function(a,b){b=ue.copy(b).multiplyScalar(.5);this.min.copy(a).sub(b);this.max.copy(a).add(b);return this},setFromObject:function(a){this.makeEmpty();return this.expandByObject(a)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this},isEmpty:function(){return this.max.x<
+this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},getCenter:function(a){void 0===a&&(console.warn("THREE.Box3: .getCenter() target is now required"),a=new p);return this.isEmpty()?a.set(0,0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){void 0===a&&(console.warn("THREE.Box3: .getSize() target is now required"),a=new p);return this.isEmpty()?a.set(0,0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);
+this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},expandByObject:function(a){a.updateWorldMatrix(!1,!1);var b=a.geometry;void 0!==b&&(null===b.boundingBox&&b.computeBoundingBox(),Ug.copy(b.boundingBox),Ug.applyMatrix4(a.matrixWorld),this.union(Ug));a=a.children;b=0;for(var c=a.length;b<c;b++)this.expandByObject(a[b]);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y||a.z<this.min.z||
+a.z>this.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z},getParameter:function(a,b){void 0===b&&(console.warn("THREE.Box3: .getParameter() target is now required"),b=new p);return b.set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||
+a.max.y<this.min.y||a.min.y>this.max.y||a.max.z<this.min.z||a.min.z>this.max.z?!1:!0},intersectsSphere:function(a){this.clampPoint(a.center,ue);return ue.distanceToSquared(a.center)<=a.radius*a.radius},intersectsPlane:function(a){if(0<a.normal.x){var b=a.normal.x*this.min.x;var c=a.normal.x*this.max.x}else b=a.normal.x*this.max.x,c=a.normal.x*this.min.x;0<a.normal.y?(b+=a.normal.y*this.min.y,c+=a.normal.y*this.max.y):(b+=a.normal.y*this.max.y,c+=a.normal.y*this.min.y);0<a.normal.z?(b+=a.normal.z*
+this.min.z,c+=a.normal.z*this.max.z):(b+=a.normal.z*this.max.z,c+=a.normal.z*this.min.z);return b<=-a.constant&&c>=-a.constant},intersectsTriangle:function(a){if(this.isEmpty())return!1;this.getCenter(ve);Bf.subVectors(this.max,ve);od.subVectors(a.a,ve);pd.subVectors(a.b,ve);qd.subVectors(a.c,ve);Qb.subVectors(pd,od);Rb.subVectors(qd,pd);qc.subVectors(od,qd);a=[0,-Qb.z,Qb.y,0,-Rb.z,Rb.y,0,-qc.z,qc.y,Qb.z,0,-Qb.x,Rb.z,0,-Rb.x,qc.z,0,-qc.x,-Qb.y,Qb.x,0,-Rb.y,Rb.x,0,-qc.y,qc.x,0];if(!Yf(a,od,pd,qd,Bf))return!1;
+a=[1,0,0,0,1,0,0,0,1];if(!Yf(a,od,pd,qd,Bf))return!1;Cf.crossVectors(Qb,Rb);a=[Cf.x,Cf.y,Cf.z];return Yf(a,od,pd,qd,Bf)},clampPoint:function(a,b){void 0===b&&(console.warn("THREE.Box3: .clampPoint() target is now required"),b=new p);return b.copy(a).clamp(this.min,this.max)},distanceToPoint:function(a){return ue.copy(a).clamp(this.min,this.max).sub(a).length()},getBoundingSphere:function(a){void 0===a&&console.error("THREE.Box3: .getBoundingSphere() target is now required");this.getCenter(a.center);
+a.radius=.5*this.getSize(ue).length();return a},intersect:function(a){this.min.max(a.min);this.max.min(a.max);this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(a){if(this.isEmpty())return this;zb[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(a);zb[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(a);zb[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(a);zb[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(a);
+zb[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(a);zb[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(a);zb[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(a);zb[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(a);this.setFromPoints(zb);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});var Nk=new Va;Object.assign(eb.prototype,{set:function(a,b){this.center.copy(a);this.radius=
+b;return this},setFromPoints:function(a,b){var c=this.center;void 0!==b?c.copy(b):Nk.setFromPoints(a).getCenter(c);for(var d=b=0,e=a.length;d<e;d++)b=Math.max(b,c.distanceToSquared(a[d]));this.radius=Math.sqrt(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.center.copy(a.center);this.radius=a.radius;return this},isEmpty:function(){return 0>this.radius},makeEmpty:function(){this.center.set(0,0,0);this.radius=-1;return this},containsPoint:function(a){return a.distanceToSquared(this.center)<=
+this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(a.distanceToPoint(this.center))<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a);void 0===b&&(console.warn("THREE.Sphere: .clampPoint() target is now required"),
+b=new p);b.copy(a);c>this.radius*this.radius&&(b.sub(this.center).normalize(),b.multiplyScalar(this.radius).add(this.center));return b},getBoundingBox:function(a){void 0===a&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),a=new Va);if(this.isEmpty())return a.makeEmpty(),a;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);
+return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}});var Ab=new p,Vg=new p,Df=new p,Sb=new p,Wg=new p,Ef=new p,Xg=new p;Object.assign(Wb.prototype,{set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.origin.copy(a.origin);this.direction.copy(a.direction);return this},at:function(a,b){void 0===b&&(console.warn("THREE.Ray: .at() target is now required"),b=new p);
+return b.copy(this.direction).multiplyScalar(a).add(this.origin)},lookAt:function(a){this.direction.copy(a).sub(this.origin).normalize();return this},recast:function(a){this.origin.copy(this.at(a,Ab));return this},closestPointToPoint:function(a,b){void 0===b&&(console.warn("THREE.Ray: .closestPointToPoint() target is now required"),b=new p);b.subVectors(a,this.origin);a=b.dot(this.direction);return 0>a?b.copy(this.origin):b.copy(this.direction).multiplyScalar(a).add(this.origin)},distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},
+distanceSqToPoint:function(a){var b=Ab.subVectors(a,this.origin).dot(this.direction);if(0>b)return this.origin.distanceToSquared(a);Ab.copy(this.direction).multiplyScalar(b).add(this.origin);return Ab.distanceToSquared(a)},distanceSqToSegment:function(a,b,c,d){Vg.copy(a).add(b).multiplyScalar(.5);Df.copy(b).sub(a).normalize();Sb.copy(this.origin).sub(Vg);var e=.5*a.distanceTo(b),f=-this.direction.dot(Df),g=Sb.dot(this.direction),h=-Sb.dot(Df),l=Sb.lengthSq(),m=Math.abs(1-f*f);if(0<m){a=f*h-g;b=f*
+g-h;var k=e*m;0<=a?b>=-k?b<=k?(e=1/m,a*=e,b*=e,f=a*(a+f*b+2*g)+b*(f*a+b+2*h)+l):(b=e,a=Math.max(0,-(f*b+g)),f=-a*a+b*(b+2*h)+l):(b=-e,a=Math.max(0,-(f*b+g)),f=-a*a+b*(b+2*h)+l):b<=-k?(a=Math.max(0,-(-f*e+g)),b=0<a?-e:Math.min(Math.max(-e,-h),e),f=-a*a+b*(b+2*h)+l):b<=k?(a=0,b=Math.min(Math.max(-e,-h),e),f=b*(b+2*h)+l):(a=Math.max(0,-(f*e+g)),b=0<a?e:Math.min(Math.max(-e,-h),e),f=-a*a+b*(b+2*h)+l)}else b=0<f?-e:e,a=Math.max(0,-(f*b+g)),f=-a*a+b*(b+2*h)+l;c&&c.copy(this.direction).multiplyScalar(a).add(this.origin);
+d&&d.copy(Df).multiplyScalar(b).add(Vg);return f},intersectSphere:function(a,b){Ab.subVectors(a.center,this.origin);var c=Ab.dot(this.direction),d=Ab.dot(Ab)-c*c;a=a.radius*a.radius;if(d>a)return null;a=Math.sqrt(a-d);d=c-a;c+=a;return 0>d&&0>c?null:0>d?this.at(c,b):this.at(d,b)},intersectsSphere:function(a){return this.distanceSqToPoint(a.center)<=a.radius*a.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+
+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){a=this.distanceToPlane(a);return null===a?null:this.at(a,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin);return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},intersectBox:function(a,b){var c=1/this.direction.x;var d=1/this.direction.y;var e=1/this.direction.z,f=this.origin;if(0<=c){var g=(a.min.x-f.x)*c;c*=a.max.x-f.x}else g=(a.max.x-f.x)*c,c*=a.min.x-f.x;if(0<=d){var h=(a.min.y-f.y)*d;d*=a.max.y-f.y}else h=(a.max.y-
+f.y)*d,d*=a.min.y-f.y;if(g>d||h>c)return null;if(h>g||g!==g)g=h;if(d<c||c!==c)c=d;0<=e?(h=(a.min.z-f.z)*e,a=(a.max.z-f.z)*e):(h=(a.max.z-f.z)*e,a=(a.min.z-f.z)*e);if(g>a||h>c)return null;if(h>g||g!==g)g=h;if(a<c||c!==c)c=a;return 0>c?null:this.at(0<=g?g:c,b)},intersectsBox:function(a){return null!==this.intersectBox(a,Ab)},intersectTriangle:function(a,b,c,d,e){Wg.subVectors(b,a);Ef.subVectors(c,a);Xg.crossVectors(Wg,Ef);b=this.direction.dot(Xg);if(0<b){if(d)return null;d=1}else if(0>b)d=-1,b=-b;else return null;
+Sb.subVectors(this.origin,a);a=d*this.direction.dot(Ef.crossVectors(Sb,Ef));if(0>a)return null;c=d*this.direction.dot(Wg.cross(Sb));if(0>c||a+c>b)return null;a=-d*Sb.dot(Xg);return 0>a?null:this.at(a/b,e)},applyMatrix4:function(a){this.origin.applyMatrix4(a);this.direction.transformDirection(a);return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});var Yg=new p,Ok=new p,Pk=new ya;Object.assign(Wa.prototype,{isPlane:!0,set:function(a,b){this.normal.copy(a);
+this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(a,b,c){b=Yg.subVectors(c,b).cross(Ok.subVectors(a,b)).normalize();this.setFromNormalAndCoplanarPoint(b,a);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;
+return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){void 0===b&&(console.warn("THREE.Plane: .projectPoint() target is now required"),b=new p);return b.copy(this.normal).multiplyScalar(-this.distanceToPoint(a)).add(a)},
+intersectLine:function(a,b){void 0===b&&(console.warn("THREE.Plane: .intersectLine() target is now required"),b=new p);var c=a.delta(Yg),d=this.normal.dot(c);if(0===d){if(0===this.distanceToPoint(a.start))return b.copy(a.start)}else if(d=-(a.start.dot(this.normal)+this.constant)/d,!(0>d||1<d))return b.copy(c).multiplyScalar(d).add(a.start)},intersectsLine:function(a){var b=this.distanceToPoint(a.start);a=this.distanceToPoint(a.end);return 0>b&&0<a||0>a&&0<b},intersectsBox:function(a){return a.intersectsPlane(this)},
+intersectsSphere:function(a){return a.intersectsPlane(this)},coplanarPoint:function(a){void 0===a&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),a=new p);return a.copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(a,b){b=b||Pk.getNormalMatrix(a);a=this.coplanarPoint(Yg).applyMatrix4(a);b=this.normal.applyMatrix3(b).normalize();this.constant=-a.dot(b);return this},translate:function(a){this.constant-=a.dot(this.normal);return this},equals:function(a){return a.normal.equals(this.normal)&&
+a.constant===this.constant}});var cb=new p,Bb=new p,Zg=new p,Cb=new p,rd=new p,sd=new p,Ai=new p,$g=new p,ah=new p,bh=new p;Object.assign(pa,{getNormal:function(a,b,c,d){void 0===d&&(console.warn("THREE.Triangle: .getNormal() target is now required"),d=new p);d.subVectors(c,b);cb.subVectors(a,b);d.cross(cb);a=d.lengthSq();return 0<a?d.multiplyScalar(1/Math.sqrt(a)):d.set(0,0,0)},getBarycoord:function(a,b,c,d,e){cb.subVectors(d,b);Bb.subVectors(c,b);Zg.subVectors(a,b);a=cb.dot(cb);b=cb.dot(Bb);c=cb.dot(Zg);
+var f=Bb.dot(Bb);d=Bb.dot(Zg);var g=a*f-b*b;void 0===e&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),e=new p);if(0===g)return e.set(-2,-1,-1);g=1/g;f=(f*c-b*d)*g;a=(a*d-b*c)*g;return e.set(1-f-a,a,f)},containsPoint:function(a,b,c,d){pa.getBarycoord(a,b,c,d,Cb);return 0<=Cb.x&&0<=Cb.y&&1>=Cb.x+Cb.y},getUV:function(a,b,c,d,e,f,g,h){this.getBarycoord(a,b,c,d,Cb);h.set(0,0);h.addScaledVector(e,Cb.x);h.addScaledVector(f,Cb.y);h.addScaledVector(g,Cb.z);return h},isFrontFacing:function(a,
+b,c,d){cb.subVectors(c,b);Bb.subVectors(a,b);return 0>cb.cross(Bb).dot(d)?!0:!1}});Object.assign(pa.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},getArea:function(){cb.subVectors(this.c,this.b);Bb.subVectors(this.a,
+this.b);return.5*cb.cross(Bb).length()},getMidpoint:function(a){void 0===a&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),a=new p);return a.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},getNormal:function(a){return pa.getNormal(this.a,this.b,this.c,a)},getPlane:function(a){void 0===a&&(console.warn("THREE.Triangle: .getPlane() target is now required"),a=new Wa);return a.setFromCoplanarPoints(this.a,this.b,this.c)},getBarycoord:function(a,b){return pa.getBarycoord(a,
+this.a,this.b,this.c,b)},getUV:function(a,b,c,d,e){return pa.getUV(a,this.a,this.b,this.c,b,c,d,e)},containsPoint:function(a){return pa.containsPoint(a,this.a,this.b,this.c)},isFrontFacing:function(a){return pa.isFrontFacing(this.a,this.b,this.c,a)},intersectsBox:function(a){return a.intersectsTriangle(this)},closestPointToPoint:function(a,b){void 0===b&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),b=new p);var c=this.a,d=this.b,e=this.c;rd.subVectors(d,c);sd.subVectors(e,
+c);$g.subVectors(a,c);var f=rd.dot($g),g=sd.dot($g);if(0>=f&&0>=g)return b.copy(c);ah.subVectors(a,d);var h=rd.dot(ah),l=sd.dot(ah);if(0<=h&&l<=h)return b.copy(d);var m=f*l-h*g;if(0>=m&&0<=f&&0>=h)return d=f/(f-h),b.copy(c).addScaledVector(rd,d);bh.subVectors(a,e);a=rd.dot(bh);var k=sd.dot(bh);if(0<=k&&a<=k)return b.copy(e);f=a*g-f*k;if(0>=f&&0<=g&&0>=k)return m=g/(g-k),b.copy(c).addScaledVector(sd,m);g=h*k-a*l;if(0>=g&&0<=l-h&&0<=a-k)return Ai.subVectors(e,d),m=(l-h)/(l-h+(a-k)),b.copy(d).addScaledVector(Ai,
+m);e=1/(g+f+m);d=f*e;m*=e;return b.copy(c).addScaledVector(rd,d).addScaledVector(sd,m)},equals:function(a){return a.a.equals(this.a)&&a.b.equals(this.b)&&a.c.equals(this.c)}});var Bi={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,
+crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,
+floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,
+lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,
+moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,
+sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Fa={h:0,s:0,l:0},Ff={h:0,s:0,l:0};Object.assign(D.prototype,{isColor:!0,r:1,g:1,b:1,set:function(a){a&&a.isColor?this.copy(a):"number"===typeof a?this.setHex(a):"string"===
+typeof a&&this.setStyle(a);return this},setScalar:function(a){this.b=this.g=this.r=a;return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(a,b,c){a=O.euclideanModulo(a,1);b=O.clamp(b,0,1);c=O.clamp(c,0,1);0===b?this.r=this.g=this.b=c:(b=.5>=c?c*(1+b):c+b-c*b,c=2*c-b,this.r=Zf(c,b,a+1/3),this.g=Zf(c,b,a),this.b=Zf(c,b,a-1/3));return this},setStyle:function(a){function b(b){void 0!==
+b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=
+Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){d=parseFloat(c[1])/360;var e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+
+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}return a&&0<a.length?this.setColorName(a):this},setColorName:function(a){var b=Bi[a];void 0!==b?this.setHex(b):console.warn("THREE.Color: Unknown color "+a);return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(a){this.r=a.r;
+this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a,b){void 0===b&&(b=2);this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},copyLinearToGamma:function(a,b){void 0===b&&(b=2);b=0<b?1/b:1;this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},convertGammaToLinear:function(a){this.copyGammaToLinear(this,a);return this},convertLinearToGamma:function(a){this.copyLinearToGamma(this,a);return this},copySRGBToLinear:function(a){this.r=
+$f(a.r);this.g=$f(a.g);this.b=$f(a.b);return this},copyLinearToSRGB:function(a){this.r=ag(a.r);this.g=ag(a.g);this.b=ag(a.b);return this},convertSRGBToLinear:function(){this.copySRGBToLinear(this);return this},convertLinearToSRGB:function(){this.copyLinearToSRGB(this);return this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(a){void 0===a&&(console.warn("THREE.Color: .getHSL() target is now required"),
+a={h:0,s:0,l:0});var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),f=Math.min(b,c,d),g,h=(f+e)/2;if(f===e)f=g=0;else{var l=e-f;f=.5>=h?l/(e+f):l/(2-e-f);switch(e){case b:g=(c-d)/l+(c<d?6:0);break;case c:g=(d-b)/l+2;break;case d:g=(b-c)/l+4}g/=6}a.h=g;a.s=f;a.l=h;return a},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(a,b,c){this.getHSL(Fa);Fa.h+=a;Fa.s+=b;Fa.l+=c;this.setHSL(Fa.h,Fa.s,Fa.l);return this},add:function(a){this.r+=a.r;this.g+=
+a.g;this.b+=a.b;return this},addColors:function(a,b){this.r=a.r+b.r;this.g=a.g+b.g;this.b=a.b+b.b;return this},addScalar:function(a){this.r+=a;this.g+=a;this.b+=a;return this},sub:function(a){this.r=Math.max(0,this.r-a.r);this.g=Math.max(0,this.g-a.g);this.b=Math.max(0,this.b-a.b);return this},multiply:function(a){this.r*=a.r;this.g*=a.g;this.b*=a.b;return this},multiplyScalar:function(a){this.r*=a;this.g*=a;this.b*=a;return this},lerp:function(a,b){this.r+=(a.r-this.r)*b;this.g+=(a.g-this.g)*b;this.b+=
+(a.b-this.b)*b;return this},lerpHSL:function(a,b){this.getHSL(Fa);a.getHSL(Ff);a=O.lerp(Fa.h,Ff.h,b);var c=O.lerp(Fa.s,Ff.s,b);b=O.lerp(Fa.l,Ff.l,b);this.setHSL(a,c,b);return this},equals:function(a){return a.r===this.r&&a.g===this.g&&a.b===this.b},fromArray:function(a,b){void 0===b&&(b=0);this.r=a[b];this.g=a[b+1];this.b=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.r;a[b+1]=this.g;a[b+2]=this.b;return a},toJSON:function(){return this.getHex()}});D.NAMES=
+Bi;Object.assign(Ac.prototype,{clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a=a.a;this.b=a.b;this.c=a.c;this.normal.copy(a.normal);this.color.copy(a.color);this.materialIndex=a.materialIndex;for(var b=0,c=a.vertexNormals.length;b<c;b++)this.vertexNormals[b]=a.vertexNormals[b].clone();b=0;for(c=a.vertexColors.length;b<c;b++)this.vertexColors[b]=a.vertexColors[b].clone();return this}});var gj=0;K.prototype=Object.assign(Object.create(ua.prototype),{constructor:K,isMaterial:!0,
+onBeforeCompile:function(){},setValues:function(a){if(void 0!==a)for(var b in a){var c=a[b];if(void 0===c)console.warn("THREE.Material: '"+b+"' parameter is undefined.");else if("shading"===b)console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===c?!0:!1;else{var d=this[b];void 0===d?console.warn("THREE."+this.type+": '"+b+"' is not a property of this material."):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]=
+c}}},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c=void 0===a||"string"===typeof a;c&&(a={textures:{},images:{}});var d={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};d.uuid=this.uuid;d.type=this.type;""!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.sheen&&
+this.sheen.isColor&&(d.sheen=this.sheen.getHex());this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());this.emissiveIntensity&&1!==this.emissiveIntensity&&(d.emissiveIntensity=this.emissiveIntensity);this.specular&&this.specular.isColor&&(d.specular=this.specular.getHex());void 0!==this.shininess&&(d.shininess=this.shininess);void 0!==this.clearcoat&&(d.clearcoat=this.clearcoat);void 0!==this.clearcoatRoughness&&(d.clearcoatRoughness=this.clearcoatRoughness);this.clearcoatMap&&
+this.clearcoatMap.isTexture&&(d.clearcoatMap=this.clearcoatMap.toJSON(a).uuid);this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(d.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(a).uuid);this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(d.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(a).uuid,d.clearcoatNormalScale=this.clearcoatNormalScale.toArray());this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);this.matcap&&this.matcap.isTexture&&(d.matcap=
+this.matcap.toJSON(a).uuid);this.alphaMap&&this.alphaMap.isTexture&&(d.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap&&this.lightMap.isTexture&&(d.lightMap=this.lightMap.toJSON(a).uuid);this.aoMap&&this.aoMap.isTexture&&(d.aoMap=this.aoMap.toJSON(a).uuid,d.aoMapIntensity=this.aoMapIntensity);this.bumpMap&&this.bumpMap.isTexture&&(d.bumpMap=this.bumpMap.toJSON(a).uuid,d.bumpScale=this.bumpScale);this.normalMap&&this.normalMap.isTexture&&(d.normalMap=this.normalMap.toJSON(a).uuid,d.normalMapType=
+this.normalMapType,d.normalScale=this.normalScale.toArray());this.displacementMap&&this.displacementMap.isTexture&&(d.displacementMap=this.displacementMap.toJSON(a).uuid,d.displacementScale=this.displacementScale,d.displacementBias=this.displacementBias);this.roughnessMap&&this.roughnessMap.isTexture&&(d.roughnessMap=this.roughnessMap.toJSON(a).uuid);this.metalnessMap&&this.metalnessMap.isTexture&&(d.metalnessMap=this.metalnessMap.toJSON(a).uuid);this.emissiveMap&&this.emissiveMap.isTexture&&(d.emissiveMap=
+this.emissiveMap.toJSON(a).uuid);this.specularMap&&this.specularMap.isTexture&&(d.specularMap=this.specularMap.toJSON(a).uuid);this.envMap&&this.envMap.isTexture&&(d.envMap=this.envMap.toJSON(a).uuid,d.reflectivity=this.reflectivity,d.refractionRatio=this.refractionRatio,void 0!==this.combine&&(d.combine=this.combine),void 0!==this.envMapIntensity&&(d.envMapIntensity=this.envMapIntensity));this.gradientMap&&this.gradientMap.isTexture&&(d.gradientMap=this.gradientMap.toJSON(a).uuid);void 0!==this.size&&
+(d.size=this.size);void 0!==this.sizeAttenuation&&(d.sizeAttenuation=this.sizeAttenuation);1!==this.blending&&(d.blending=this.blending);!0===this.flatShading&&(d.flatShading=this.flatShading);0!==this.side&&(d.side=this.side);this.vertexColors&&(d.vertexColors=!0);1>this.opacity&&(d.opacity=this.opacity);!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;d.stencilWrite=this.stencilWrite;d.stencilWriteMask=this.stencilWriteMask;
+d.stencilFunc=this.stencilFunc;d.stencilRef=this.stencilRef;d.stencilFuncMask=this.stencilFuncMask;d.stencilFail=this.stencilFail;d.stencilZFail=this.stencilZFail;d.stencilZPass=this.stencilZPass;this.rotation&&0!==this.rotation&&(d.rotation=this.rotation);!0===this.polygonOffset&&(d.polygonOffset=!0);0!==this.polygonOffsetFactor&&(d.polygonOffsetFactor=this.polygonOffsetFactor);0!==this.polygonOffsetUnits&&(d.polygonOffsetUnits=this.polygonOffsetUnits);this.linewidth&&1!==this.linewidth&&(d.linewidth=
+this.linewidth);void 0!==this.dashSize&&(d.dashSize=this.dashSize);void 0!==this.gapSize&&(d.gapSize=this.gapSize);void 0!==this.scale&&(d.scale=this.scale);!0===this.dithering&&(d.dithering=!0);0<this.alphaTest&&(d.alphaTest=this.alphaTest);!0===this.premultipliedAlpha&&(d.premultipliedAlpha=this.premultipliedAlpha);!0===this.wireframe&&(d.wireframe=this.wireframe);1<this.wireframeLinewidth&&(d.wireframeLinewidth=this.wireframeLinewidth);"round"!==this.wireframeLinecap&&(d.wireframeLinecap=this.wireframeLinecap);
+"round"!==this.wireframeLinejoin&&(d.wireframeLinejoin=this.wireframeLinejoin);!0===this.morphTargets&&(d.morphTargets=!0);!0===this.morphNormals&&(d.morphNormals=!0);!0===this.skinning&&(d.skinning=!0);!1===this.visible&&(d.visible=!1);!1===this.toneMapped&&(d.toneMapped=!1);"{}"!==JSON.stringify(this.userData)&&(d.userData=this.userData);c&&(c=b(a.textures),a=b(a.images),0<c.length&&(d.textures=c),0<a.length&&(d.images=a));return d},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=
+a.name;this.fog=a.fog;this.blending=a.blending;this.side=a.side;this.flatShading=a.flatShading;this.vertexColors=a.vertexColors;this.opacity=a.opacity;this.transparent=a.transparent;this.blendSrc=a.blendSrc;this.blendDst=a.blendDst;this.blendEquation=a.blendEquation;this.blendSrcAlpha=a.blendSrcAlpha;this.blendDstAlpha=a.blendDstAlpha;this.blendEquationAlpha=a.blendEquationAlpha;this.depthFunc=a.depthFunc;this.depthTest=a.depthTest;this.depthWrite=a.depthWrite;this.stencilWriteMask=a.stencilWriteMask;
+this.stencilFunc=a.stencilFunc;this.stencilRef=a.stencilRef;this.stencilFuncMask=a.stencilFuncMask;this.stencilFail=a.stencilFail;this.stencilZFail=a.stencilZFail;this.stencilZPass=a.stencilZPass;this.stencilWrite=a.stencilWrite;var b=a.clippingPlanes,c=null;if(null!==b){var d=b.length;c=Array(d);for(var e=0;e!==d;++e)c[e]=b[e].clone()}this.clippingPlanes=c;this.clipIntersection=a.clipIntersection;this.clipShadows=a.clipShadows;this.shadowSide=a.shadowSide;this.colorWrite=a.colorWrite;this.precision=
+a.precision;this.polygonOffset=a.polygonOffset;this.polygonOffsetFactor=a.polygonOffsetFactor;this.polygonOffsetUnits=a.polygonOffsetUnits;this.dithering=a.dithering;this.alphaTest=a.alphaTest;this.premultipliedAlpha=a.premultipliedAlpha;this.visible=a.visible;this.toneMapped=a.toneMapped;this.userData=JSON.parse(JSON.stringify(a.userData));return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Object.defineProperty(K.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});
+Pa.prototype=Object.create(K.prototype);Pa.prototype.constructor=Pa;Pa.prototype.isMeshBasicMaterial=!0;Pa.prototype.copy=function(a){K.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=
+a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;return this};var Y=new p;Object.defineProperty(G.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(G.prototype,{isBufferAttribute:!0,onUploadCallback:function(){},setUsage:function(a){this.usage=a;return this},copy:function(a){this.name=a.name;this.array=new a.array.constructor(a.array);
+this.itemSize=a.itemSize;this.count=a.count;this.normalized=a.normalized;this.usage=a.usage;return this},copyAt:function(a,b,c){a*=this.itemSize;c*=b.itemSize;for(var d=0,e=this.itemSize;d<e;d++)this.array[a+d]=b.array[c+d];return this},copyArray:function(a){this.array.set(a);return this},copyColorsArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",d),f=new D);b[c++]=f.r;b[c++]=f.g;b[c++]=
+f.b}return this},copyVector2sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",d),f=new v);b[c++]=f.x;b[c++]=f.y}return this},copyVector3sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",d),f=new p);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z}return this},copyVector4sArray:function(a){for(var b=
+this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",d),f=new R);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z;b[c++]=f.w}return this},applyMatrix3:function(a){for(var b=0,c=this.count;b<c;b++)Y.x=this.getX(b),Y.y=this.getY(b),Y.z=this.getZ(b),Y.applyMatrix3(a),this.setXYZ(b,Y.x,Y.y,Y.z);return this},applyMatrix4:function(a){for(var b=0,c=this.count;b<c;b++)Y.x=this.getX(b),Y.y=this.getY(b),Y.z=this.getZ(b),Y.applyMatrix4(a),
+this.setXYZ(b,Y.x,Y.y,Y.z);return this},applyNormalMatrix:function(a){for(var b=0,c=this.count;b<c;b++)Y.x=this.getX(b),Y.y=this.getY(b),Y.z=this.getZ(b),Y.applyNormalMatrix(a),this.setXYZ(b,Y.x,Y.y,Y.z);return this},transformDirection:function(a){for(var b=0,c=this.count;b<c;b++)Y.x=this.getX(b),Y.y=this.getY(b),Y.z=this.getZ(b),Y.transformDirection(a),this.setXYZ(b,Y.x,Y.y,Y.z);return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},getX:function(a){return this.array[a*
+this.itemSize]},setX:function(a,b){this.array[a*this.itemSize]=b;return this},getY:function(a){return this.array[a*this.itemSize+1]},setY:function(a,b){this.array[a*this.itemSize+1]=b;return this},getZ:function(a){return this.array[a*this.itemSize+2]},setZ:function(a,b){this.array[a*this.itemSize+2]=b;return this},getW:function(a){return this.array[a*this.itemSize+3]},setW:function(a,b){this.array[a*this.itemSize+3]=b;return this},setXY:function(a,b,c){a*=this.itemSize;this.array[a+0]=b;this.array[a+
+1]=c;return this},setXYZ:function(a,b,c,d){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;this.array[a+3]=e;return this},onUpload:function(a){this.onUploadCallback=a;return this},clone:function(){return(new this.constructor(this.array,this.itemSize)).copy(this)},toJSON:function(){return{itemSize:this.itemSize,type:this.array.constructor.name,array:Array.prototype.slice.call(this.array),
+normalized:this.normalized}}});yd.prototype=Object.create(G.prototype);yd.prototype.constructor=yd;zd.prototype=Object.create(G.prototype);zd.prototype.constructor=zd;Ad.prototype=Object.create(G.prototype);Ad.prototype.constructor=Ad;Bd.prototype=Object.create(G.prototype);Bd.prototype.constructor=Bd;Xb.prototype=Object.create(G.prototype);Xb.prototype.constructor=Xb;Cd.prototype=Object.create(G.prototype);Cd.prototype.constructor=Cd;Yb.prototype=Object.create(G.prototype);Yb.prototype.constructor=
+Yb;B.prototype=Object.create(G.prototype);B.prototype.constructor=B;Dd.prototype=Object.create(G.prototype);Dd.prototype.constructor=Dd;Object.assign(rh.prototype,{computeGroups:function(a){var b=[],c=void 0;a=a.faces;for(var d=0;d<a.length;d++){var e=a[d];if(e.materialIndex!==c){c=e.materialIndex;void 0!==f&&(f.count=3*d-f.start,b.push(f));var f={start:3*d,materialIndex:c}}}void 0!==f&&(f.count=3*d-f.start,b.push(f));this.groups=b},fromGeometry:function(a){var b=a.faces,c=a.vertices,d=a.faceVertexUvs,
+e=d[0]&&0<d[0].length,f=d[1]&&0<d[1].length,g=a.morphTargets,h=g.length;if(0<h){var l=[];for(var m=0;m<h;m++)l[m]={name:g[m].name,data:[]};this.morphTargets.position=l}var k=a.morphNormals,n=k.length;if(0<n){var p=[];for(m=0;m<n;m++)p[m]={name:k[m].name,data:[]};this.morphTargets.normal=p}var r=a.skinIndices,q=a.skinWeights,u=r.length===c.length,E=q.length===c.length;0<c.length&&0===b.length&&console.error("THREE.DirectGeometry: Faceless geometries are not supported.");for(m=0;m<b.length;m++){var x=
+b[m];this.vertices.push(c[x.a],c[x.b],c[x.c]);var w=x.vertexNormals;3===w.length?this.normals.push(w[0],w[1],w[2]):(w=x.normal,this.normals.push(w,w,w));w=x.vertexColors;3===w.length?this.colors.push(w[0],w[1],w[2]):(w=x.color,this.colors.push(w,w,w));!0===e&&(w=d[0][m],void 0!==w?this.uvs.push(w[0],w[1],w[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",m),this.uvs.push(new v,new v,new v)));!0===f&&(w=d[1][m],void 0!==w?this.uvs2.push(w[0],w[1],w[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",
+m),this.uvs2.push(new v,new v,new v)));for(w=0;w<h;w++){var y=g[w].vertices;l[w].data.push(y[x.a],y[x.b],y[x.c])}for(w=0;w<n;w++)y=k[w].vertexNormals[m],p[w].data.push(y.a,y.b,y.c);u&&this.skinIndices.push(r[x.a],r[x.b],r[x.c]);E&&this.skinWeights.push(q[x.a],q[x.b],q[x.c])}this.computeGroups(a);this.verticesNeedUpdate=a.verticesNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;
+null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());return this}});var hj=1,ob=new N,ch=new y,td=new p,Oa=new Va,we=new Va,oa=new p;F.prototype=Object.assign(Object.create(ua.prototype),{constructor:F,isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(a){Array.isArray(a)?this.index=new (65535<sh(a)?Yb:Xb)(a,1):this.index=a},getAttribute:function(a){return this.attributes[a]},setAttribute:function(a,
+b){this.attributes[a]=b;return this},deleteAttribute:function(a){delete this.attributes[a];return this},addGroup:function(a,b,c){this.groups.push({start:a,count:b,materialIndex:void 0!==c?c:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(a,b){this.drawRange.start=a;this.drawRange.count=b},applyMatrix4:function(a){var b=this.attributes.position;void 0!==b&&(b.applyMatrix4(a),b.needsUpdate=!0);b=this.attributes.normal;if(void 0!==b){var c=(new ya).getNormalMatrix(a);b.applyNormalMatrix(c);
+b.needsUpdate=!0}b=this.attributes.tangent;void 0!==b&&(b.transformDirection(a),b.needsUpdate=!0);null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();return this},rotateX:function(a){ob.makeRotationX(a);this.applyMatrix4(ob);return this},rotateY:function(a){ob.makeRotationY(a);this.applyMatrix4(ob);return this},rotateZ:function(a){ob.makeRotationZ(a);this.applyMatrix4(ob);return this},translate:function(a,b,c){ob.makeTranslation(a,b,c);this.applyMatrix4(ob);
+return this},scale:function(a,b,c){ob.makeScale(a,b,c);this.applyMatrix4(ob);return this},lookAt:function(a){ch.lookAt(a);ch.updateMatrix();this.applyMatrix4(ch.matrix);return this},center:function(){this.computeBoundingBox();this.boundingBox.getCenter(td).negate();this.translate(td.x,td.y,td.z);return this},setFromObject:function(a){var b=a.geometry;if(a.isPoints||a.isLine){a=new B(3*b.vertices.length,3);var c=new B(3*b.colors.length,3);this.setAttribute("position",a.copyVector3sArray(b.vertices));
+this.setAttribute("color",c.copyColorsArray(b.colors));b.lineDistances&&b.lineDistances.length===b.vertices.length&&(a=new B(b.lineDistances.length,1),this.setAttribute("lineDistance",a.copyArray(b.lineDistances)));null!==b.boundingSphere&&(this.boundingSphere=b.boundingSphere.clone());null!==b.boundingBox&&(this.boundingBox=b.boundingBox.clone())}else a.isMesh&&b&&b.isGeometry&&this.fromGeometry(b);return this},setFromPoints:function(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c];b.push(e.x,
+e.y,e.z||0)}this.setAttribute("position",new B(b,3));return this},updateFromObject:function(a){var b=a.geometry;if(a.isMesh){var c=b.__directGeometry;!0===b.elementsNeedUpdate&&(c=void 0,b.elementsNeedUpdate=!1);if(void 0===c)return this.fromGeometry(b);c.verticesNeedUpdate=b.verticesNeedUpdate;c.normalsNeedUpdate=b.normalsNeedUpdate;c.colorsNeedUpdate=b.colorsNeedUpdate;c.uvsNeedUpdate=b.uvsNeedUpdate;c.groupsNeedUpdate=b.groupsNeedUpdate;b.verticesNeedUpdate=!1;b.normalsNeedUpdate=!1;b.colorsNeedUpdate=
+!1;b.uvsNeedUpdate=!1;b.groupsNeedUpdate=!1;b=c}!0===b.verticesNeedUpdate&&(c=this.attributes.position,void 0!==c&&(c.copyVector3sArray(b.vertices),c.needsUpdate=!0),b.verticesNeedUpdate=!1);!0===b.normalsNeedUpdate&&(c=this.attributes.normal,void 0!==c&&(c.copyVector3sArray(b.normals),c.needsUpdate=!0),b.normalsNeedUpdate=!1);!0===b.colorsNeedUpdate&&(c=this.attributes.color,void 0!==c&&(c.copyColorsArray(b.colors),c.needsUpdate=!0),b.colorsNeedUpdate=!1);b.uvsNeedUpdate&&(c=this.attributes.uv,void 0!==
+c&&(c.copyVector2sArray(b.uvs),c.needsUpdate=!0),b.uvsNeedUpdate=!1);b.lineDistancesNeedUpdate&&(c=this.attributes.lineDistance,void 0!==c&&(c.copyArray(b.lineDistances),c.needsUpdate=!0),b.lineDistancesNeedUpdate=!1);b.groupsNeedUpdate&&(b.computeGroups(a.geometry),this.groups=b.groups,b.groupsNeedUpdate=!1);return this},fromGeometry:function(a){a.__directGeometry=(new rh).fromGeometry(a);return this.fromDirectGeometry(a.__directGeometry)},fromDirectGeometry:function(a){var b=new Float32Array(3*
+a.vertices.length);this.setAttribute("position",(new G(b,3)).copyVector3sArray(a.vertices));0<a.normals.length&&(b=new Float32Array(3*a.normals.length),this.setAttribute("normal",(new G(b,3)).copyVector3sArray(a.normals)));0<a.colors.length&&(b=new Float32Array(3*a.colors.length),this.setAttribute("color",(new G(b,3)).copyColorsArray(a.colors)));0<a.uvs.length&&(b=new Float32Array(2*a.uvs.length),this.setAttribute("uv",(new G(b,2)).copyVector2sArray(a.uvs)));0<a.uvs2.length&&(b=new Float32Array(2*
+a.uvs2.length),this.setAttribute("uv2",(new G(b,2)).copyVector2sArray(a.uvs2)));this.groups=a.groups;for(var c in a.morphTargets){b=[];for(var d=a.morphTargets[c],e=0,f=d.length;e<f;e++){var g=d[e],h=new B(3*g.data.length,3);h.name=g.name;b.push(h.copyVector3sArray(g.data))}this.morphAttributes[c]=b}0<a.skinIndices.length&&(c=new B(4*a.skinIndices.length,4),this.setAttribute("skinIndex",c.copyVector4sArray(a.skinIndices)));0<a.skinWeights.length&&(c=new B(4*a.skinWeights.length,4),this.setAttribute("skinWeight",
+c.copyVector4sArray(a.skinWeights)));null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());return this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new Va);var a=this.attributes.position,b=this.morphAttributes.position;if(void 0!==a){if(this.boundingBox.setFromBufferAttribute(a),b){a=0;for(var c=b.length;a<c;a++)Oa.setFromBufferAttribute(b[a]),this.morphTargetsRelative?(oa.addVectors(this.boundingBox.min,
+Oa.min),this.boundingBox.expandByPoint(oa),oa.addVectors(this.boundingBox.max,Oa.max),this.boundingBox.expandByPoint(oa)):(this.boundingBox.expandByPoint(Oa.min),this.boundingBox.expandByPoint(Oa.max))}}else this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)},computeBoundingSphere:function(){null===
+this.boundingSphere&&(this.boundingSphere=new eb);var a=this.attributes.position,b=this.morphAttributes.position;if(a){var c=this.boundingSphere.center;Oa.setFromBufferAttribute(a);if(b)for(var d=0,e=b.length;d<e;d++){var f=b[d];we.setFromBufferAttribute(f);this.morphTargetsRelative?(oa.addVectors(Oa.min,we.min),Oa.expandByPoint(oa),oa.addVectors(Oa.max,we.max),Oa.expandByPoint(oa)):(Oa.expandByPoint(we.min),Oa.expandByPoint(we.max))}Oa.getCenter(c);var g=0;d=0;for(e=a.count;d<e;d++)oa.fromBufferAttribute(a,
+d),g=Math.max(g,c.distanceToSquared(oa));if(b)for(d=0,e=b.length;d<e;d++){f=b[d];for(var h=this.morphTargetsRelative,l=0,m=f.count;l<m;l++)oa.fromBufferAttribute(f,l),h&&(td.fromBufferAttribute(a,l),oa.add(td)),g=Math.max(g,c.distanceToSquared(oa))}this.boundingSphere.radius=Math.sqrt(g);isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}},computeFaceNormals:function(){},
+computeVertexNormals:function(){var a=this.index,b=this.attributes;if(b.position){var c=b.position.array;if(void 0===b.normal)this.setAttribute("normal",new G(new Float32Array(c.length),3));else for(var d=b.normal.array,e=0,f=d.length;e<f;e++)d[e]=0;d=b.normal.array;var g=new p,h=new p,l=new p,m=new p,k=new p;if(a){var n=a.array;e=0;for(f=a.count;e<f;e+=3){a=3*n[e+0];var t=3*n[e+1];var r=3*n[e+2];g.fromArray(c,a);h.fromArray(c,t);l.fromArray(c,r);m.subVectors(l,h);k.subVectors(g,h);m.cross(k);d[a]+=
+m.x;d[a+1]+=m.y;d[a+2]+=m.z;d[t]+=m.x;d[t+1]+=m.y;d[t+2]+=m.z;d[r]+=m.x;d[r+1]+=m.y;d[r+2]+=m.z}}else for(e=0,f=c.length;e<f;e+=9)g.fromArray(c,e),h.fromArray(c,e+3),l.fromArray(c,e+6),m.subVectors(l,h),k.subVectors(g,h),m.cross(k),d[e]=m.x,d[e+1]=m.y,d[e+2]=m.z,d[e+3]=m.x,d[e+4]=m.y,d[e+5]=m.z,d[e+6]=m.x,d[e+7]=m.y,d[e+8]=m.z;this.normalizeNormals();b.normal.needsUpdate=!0}},merge:function(a,b){if(a&&a.isBufferGeometry){void 0===b&&(b=0,console.warn("THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge."));
+var c=this.attributes,d;for(d in c)if(void 0!==a.attributes[d]){var e=c[d].array,f=a.attributes[d],g=f.array,h=f.itemSize*b;f=Math.min(g.length,e.length-h);for(var l=0;l<f;l++,h++)e[h]=g[l]}return this}console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",a)},normalizeNormals:function(){for(var a=this.attributes.normal,b=0,c=a.count;b<c;b++)oa.x=a.getX(b),oa.y=a.getY(b),oa.z=a.getZ(b),oa.normalize(),a.setXYZ(b,oa.x,oa.y,oa.z)},toNonIndexed:function(){function a(a,
+b){var c=a.array,d=a.itemSize;a=a.normalized;for(var e=new c.constructor(b.length*d),f,g=0,h=0,l=b.length;h<l;h++){f=b[h]*d;for(var m=0;m<d;m++)e[g++]=c[f++]}return new G(e,d,a)}if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."),this;var b=new F,c=this.index.array,d=this.attributes,e;for(e in d){var f=d[e];f=a(f,c);b.setAttribute(e,f)}var g=this.morphAttributes;for(e in g){var h=[],l=g[e];d=0;for(var m=l.length;d<m;d++)f=l[d],f=a(f,c),
+h.push(f);b.morphAttributes[e]=h}b.morphTargetsRelative=this.morphTargetsRelative;c=this.groups;d=0;for(e=c.length;d<e;d++)f=c[d],b.addGroup(f.start,f.count,f.materialIndex);return b},toJSON:function(){var a={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};a.uuid=this.uuid;a.type=this.type;""!==this.name&&(a.name=this.name);0<Object.keys(this.userData).length&&(a.userData=this.userData);if(void 0!==this.parameters){var b=this.parameters;for(m in b)void 0!==b[m]&&(a[m]=
+b[m]);return a}a.data={attributes:{}};b=this.index;null!==b&&(a.data.index={type:b.array.constructor.name,array:Array.prototype.slice.call(b.array)});var c=this.attributes;for(m in c){b=c[m];var d=b.toJSON();""!==b.name&&(d.name=b.name);a.data.attributes[m]=d}c={};var e=!1;for(m in this.morphAttributes){for(var f=this.morphAttributes[m],g=[],h=0,l=f.length;h<l;h++)b=f[h],d=b.toJSON(),""!==b.name&&(d.name=b.name),g.push(d);0<g.length&&(c[m]=g,e=!0)}e&&(a.data.morphAttributes=c,a.data.morphTargetsRelative=
+this.morphTargetsRelative);var m=this.groups;0<m.length&&(a.data.groups=JSON.parse(JSON.stringify(m)));m=this.boundingSphere;null!==m&&(a.data.boundingSphere={center:m.center.toArray(),radius:m.radius});return a},clone:function(){return(new F).copy(this)},copy:function(a){var b;this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;var c=a.index;null!==c&&this.setIndex(c.clone());c=a.attributes;for(g in c)this.setAttribute(g,
+c[g].clone());var d=a.morphAttributes;for(g in d){var e=[],f=d[g];c=0;for(b=f.length;c<b;c++)e.push(f[c].clone());this.morphAttributes[g]=e}this.morphTargetsRelative=a.morphTargetsRelative;var g=a.groups;c=0;for(b=g.length;c<b;c++)d=g[c],this.addGroup(d.start,d.count,d.materialIndex);g=a.boundingBox;null!==g&&(this.boundingBox=g.clone());g=a.boundingSphere;null!==g&&(this.boundingSphere=g.clone());this.drawRange.start=a.drawRange.start;this.drawRange.count=a.drawRange.count;this.userData=a.userData;
+return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});var Ci=new N,rc=new Wb,dh=new eb,Db=new p,Eb=new p,Fb=new p,bg=new p,cg=new p,dg=new p,Ge=new p,He=new p,Ie=new p,Bc=new v,Cc=new v,Dc=new v,Ed=new p,Ee=new p;ea.prototype=Object.assign(Object.create(y.prototype),{constructor:ea,isMesh:!0,copy:function(a){y.prototype.copy.call(this,a);void 0!==a.morphTargetInfluences&&(this.morphTargetInfluences=a.morphTargetInfluences.slice());void 0!==a.morphTargetDictionary&&(this.morphTargetDictionary=
+Object.assign({},a.morphTargetDictionary));return this},updateMorphTargets:function(){var a=this.geometry;if(a.isBufferGeometry){a=a.morphAttributes;var b=Object.keys(a);if(0<b.length){var c=a[b[0]];if(void 0!==c)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++){var d=c[a].name||String(a);this.morphTargetInfluences.push(0);this.morphTargetDictionary[d]=a}}}else a=a.morphTargets,void 0!==a&&0<a.length&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")},
+raycast:function(a,b){var c=this.geometry,d=this.material,e=this.matrixWorld;if(void 0!==d&&(null===c.boundingSphere&&c.computeBoundingSphere(),dh.copy(c.boundingSphere),dh.applyMatrix4(e),!1!==a.ray.intersectsSphere(dh)&&(Ci.getInverse(e),rc.copy(a.ray).applyMatrix4(Ci),null===c.boundingBox||!1!==rc.intersectsBox(c.boundingBox))))if(c.isBufferGeometry){var f=c.index;e=c.attributes.position;var g=c.morphAttributes.position,h=c.morphTargetsRelative,l=c.attributes.uv,m=c.attributes.uv2,k=c.groups,n=
+c.drawRange,p,r;if(null!==f)if(Array.isArray(d)){var q=0;for(p=k.length;q<p;q++){var u=k[q];var E=d[u.materialIndex];var x=Math.max(u.start,n.start);for(r=c=Math.min(u.start+u.count,n.start+n.count);x<r;x+=3){c=f.getX(x);var w=f.getX(x+1);var y=f.getX(x+2);if(c=Fe(this,E,a,rc,e,g,h,l,m,c,w,y))c.faceIndex=Math.floor(x/3),c.face.materialIndex=u.materialIndex,b.push(c)}}}else for(x=Math.max(0,n.start),c=Math.min(f.count,n.start+n.count),q=x,p=c;q<p;q+=3){if(c=f.getX(q),w=f.getX(q+1),y=f.getX(q+2),c=
+Fe(this,d,a,rc,e,g,h,l,m,c,w,y))c.faceIndex=Math.floor(q/3),b.push(c)}else if(void 0!==e)if(Array.isArray(d))for(q=0,p=k.length;q<p;q++)for(u=k[q],E=d[u.materialIndex],x=Math.max(u.start,n.start),r=c=Math.min(u.start+u.count,n.start+n.count);x<r;x+=3){if(c=x,w=x+1,y=x+2,c=Fe(this,E,a,rc,e,g,h,l,m,c,w,y))c.faceIndex=Math.floor(x/3),c.face.materialIndex=u.materialIndex,b.push(c)}else for(x=Math.max(0,n.start),c=Math.min(e.count,n.start+n.count),q=x,p=c;q<p;q+=3)if(c=q,w=q+1,y=q+2,c=Fe(this,d,a,rc,e,
+g,h,l,m,c,w,y))c.faceIndex=Math.floor(q/3),b.push(c)}else if(c.isGeometry)for(e=Array.isArray(d),g=c.vertices,h=c.faces,c=c.faceVertexUvs[0],0<c.length&&(f=c),n=0,q=h.length;n<q;n++)if(p=h[n],c=e?d[p.materialIndex]:d,void 0!==c&&(l=g[p.a],m=g[p.b],k=g[p.c],c=th(this,c,a,rc,l,m,k,Ed)))f&&f[n]&&(u=f[n],Bc.copy(u[0]),Cc.copy(u[1]),Dc.copy(u[2]),c.uv=pa.getUV(Ed,l,m,k,Bc,Cc,Dc,new v)),c.face=p,c.faceIndex=n,b.push(c)},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});
+var ij=0,pb=new N,eh=new y,Gf=new p;L.prototype=Object.assign(Object.create(ua.prototype),{constructor:L,isGeometry:!0,applyMatrix4:function(a){for(var b=(new ya).getNormalMatrix(a),c=0,d=this.vertices.length;c<d;c++)this.vertices[c].applyMatrix4(a);c=0;for(d=this.faces.length;c<d;c++){a=this.faces[c];a.normal.applyMatrix3(b).normalize();for(var e=0,f=a.vertexNormals.length;e<f;e++)a.vertexNormals[e].applyMatrix3(b).normalize()}null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&
+this.computeBoundingSphere();this.normalsNeedUpdate=this.verticesNeedUpdate=!0;return this},rotateX:function(a){pb.makeRotationX(a);this.applyMatrix4(pb);return this},rotateY:function(a){pb.makeRotationY(a);this.applyMatrix4(pb);return this},rotateZ:function(a){pb.makeRotationZ(a);this.applyMatrix4(pb);return this},translate:function(a,b,c){pb.makeTranslation(a,b,c);this.applyMatrix4(pb);return this},scale:function(a,b,c){pb.makeScale(a,b,c);this.applyMatrix4(pb);return this},lookAt:function(a){eh.lookAt(a);
+eh.updateMatrix();this.applyMatrix4(eh.matrix);return this},fromBufferGeometry:function(a){function b(a,b,d,e){var f=void 0===h?[]:[c.colors[a].clone(),c.colors[b].clone(),c.colors[d].clone()],k=void 0===g?[]:[(new p).fromArray(g,3*a),(new p).fromArray(g,3*b),(new p).fromArray(g,3*d)];e=new Ac(a,b,d,k,f,e);c.faces.push(e);void 0!==l&&c.faceVertexUvs[0].push([(new v).fromArray(l,2*a),(new v).fromArray(l,2*b),(new v).fromArray(l,2*d)]);void 0!==m&&c.faceVertexUvs[1].push([(new v).fromArray(m,2*a),(new v).fromArray(m,
+2*b),(new v).fromArray(m,2*d)])}var c=this,d=null!==a.index?a.index.array:void 0,e=a.attributes;if(void 0===e.position)return console.error("THREE.Geometry.fromBufferGeometry(): Position attribute required for conversion."),this;var f=e.position.array,g=void 0!==e.normal?e.normal.array:void 0,h=void 0!==e.color?e.color.array:void 0,l=void 0!==e.uv?e.uv.array:void 0,m=void 0!==e.uv2?e.uv2.array:void 0;void 0!==m&&(this.faceVertexUvs[1]=[]);for(e=0;e<f.length;e+=3)c.vertices.push((new p).fromArray(f,
+e)),void 0!==h&&c.colors.push((new D).fromArray(h,e));var k=a.groups;if(0<k.length)for(e=0;e<k.length;e++){f=k[e];var n=f.start,t=n;for(n+=f.count;t<n;t+=3)void 0!==d?b(d[t],d[t+1],d[t+2],f.materialIndex):b(t,t+1,t+2,f.materialIndex)}else if(void 0!==d)for(e=0;e<d.length;e+=3)b(d[e],d[e+1],d[e+2]);else for(e=0;e<f.length/3;e+=3)b(e,e+1,e+2);this.computeFaceNormals();null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());
+return this},center:function(){this.computeBoundingBox();this.boundingBox.getCenter(Gf).negate();this.translate(Gf.x,Gf.y,Gf.z);return this},normalize:function(){this.computeBoundingSphere();var a=this.boundingSphere.center,b=this.boundingSphere.radius;b=0===b?1:1/b;var c=new N;c.set(b,0,0,-b*a.x,0,b,0,-b*a.y,0,0,b,-b*a.z,0,0,0,1);this.applyMatrix4(c);return this},computeFaceNormals:function(){for(var a=new p,b=new p,c=0,d=this.faces.length;c<d;c++){var e=this.faces[c],f=this.vertices[e.a],g=this.vertices[e.b];
+a.subVectors(this.vertices[e.c],g);b.subVectors(f,g);a.cross(b);a.normalize();e.normal.copy(a)}},computeVertexNormals:function(a){void 0===a&&(a=!0);var b;var c=Array(this.vertices.length);var d=0;for(b=this.vertices.length;d<b;d++)c[d]=new p;if(a){var e=new p,f=new p;a=0;for(d=this.faces.length;a<d;a++){b=this.faces[a];var g=this.vertices[b.a];var h=this.vertices[b.b];var l=this.vertices[b.c];e.subVectors(l,h);f.subVectors(g,h);e.cross(f);c[b.a].add(e);c[b.b].add(e);c[b.c].add(e)}}else for(this.computeFaceNormals(),
+a=0,d=this.faces.length;a<d;a++)b=this.faces[a],c[b.a].add(b.normal),c[b.b].add(b.normal),c[b.c].add(b.normal);d=0;for(b=this.vertices.length;d<b;d++)c[d].normalize();a=0;for(d=this.faces.length;a<d;a++)b=this.faces[a],g=b.vertexNormals,3===g.length?(g[0].copy(c[b.a]),g[1].copy(c[b.b]),g[2].copy(c[b.c])):(g[0]=c[b.a].clone(),g[1]=c[b.b].clone(),g[2]=c[b.c].clone());0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var a;this.computeFaceNormals();var b=0;for(a=this.faces.length;b<
+a;b++){var c=this.faces[b];var d=c.vertexNormals;3===d.length?(d[0].copy(c.normal),d[1].copy(c.normal),d[2].copy(c.normal)):(d[0]=c.normal.clone(),d[1]=c.normal.clone(),d[2]=c.normal.clone())}0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var a,b;var c=0;for(b=this.faces.length;c<b;c++){var d=this.faces[c];d.__originalFaceNormal?d.__originalFaceNormal.copy(d.normal):d.__originalFaceNormal=d.normal.clone();d.__originalVertexNormals||(d.__originalVertexNormals=[]);
+var e=0;for(a=d.vertexNormals.length;e<a;e++)d.__originalVertexNormals[e]?d.__originalVertexNormals[e].copy(d.vertexNormals[e]):d.__originalVertexNormals[e]=d.vertexNormals[e].clone()}var f=new L;f.faces=this.faces;e=0;for(a=this.morphTargets.length;e<a;e++){if(!this.morphNormals[e]){this.morphNormals[e]={};this.morphNormals[e].faceNormals=[];this.morphNormals[e].vertexNormals=[];d=this.morphNormals[e].faceNormals;var g=this.morphNormals[e].vertexNormals;c=0;for(b=this.faces.length;c<b;c++){var h=
+new p;var l={a:new p,b:new p,c:new p};d.push(h);g.push(l)}}g=this.morphNormals[e];f.vertices=this.morphTargets[e].vertices;f.computeFaceNormals();f.computeVertexNormals();c=0;for(b=this.faces.length;c<b;c++)d=this.faces[c],h=g.faceNormals[c],l=g.vertexNormals[c],h.copy(d.normal),l.a.copy(d.vertexNormals[0]),l.b.copy(d.vertexNormals[1]),l.c.copy(d.vertexNormals[2])}c=0;for(b=this.faces.length;c<b;c++)d=this.faces[c],d.normal=d.__originalFaceNormal,d.vertexNormals=d.__originalVertexNormals},computeBoundingBox:function(){null===
+this.boundingBox&&(this.boundingBox=new Va);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new eb);this.boundingSphere.setFromPoints(this.vertices)},merge:function(a,b,c){if(a&&a.isGeometry){var d,e=this.vertices.length,f=this.vertices,g=a.vertices,h=this.faces,l=a.faces,m=this.colors,k=a.colors;void 0===c&&(c=0);void 0!==b&&(d=(new ya).getNormalMatrix(b));for(var n=0,p=g.length;n<p;n++){var r=g[n].clone();void 0!==
+b&&r.applyMatrix4(b);f.push(r)}n=0;for(p=k.length;n<p;n++)m.push(k[n].clone());n=0;for(p=l.length;n<p;n++){g=l[n];var q=g.vertexNormals;k=g.vertexColors;m=new Ac(g.a+e,g.b+e,g.c+e);m.normal.copy(g.normal);void 0!==d&&m.normal.applyMatrix3(d).normalize();b=0;for(f=q.length;b<f;b++)r=q[b].clone(),void 0!==d&&r.applyMatrix3(d).normalize(),m.vertexNormals.push(r);m.color.copy(g.color);b=0;for(f=k.length;b<f;b++)r=k[b],m.vertexColors.push(r.clone());m.materialIndex=g.materialIndex+c;h.push(m)}n=0;for(p=
+a.faceVertexUvs.length;n<p;n++)for(c=a.faceVertexUvs[n],void 0===this.faceVertexUvs[n]&&(this.faceVertexUvs[n]=[]),b=0,f=c.length;b<f;b++){d=c[b];e=[];h=0;for(l=d.length;h<l;h++)e.push(d[h].clone());this.faceVertexUvs[n].push(e)}}else console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",a)},mergeMesh:function(a){a&&a.isMesh?(a.matrixAutoUpdate&&a.updateMatrix(),this.merge(a.geometry,a.matrix)):console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",
+a)},mergeVertices:function(){var a={},b=[],c=[],d=Math.pow(10,4),e;var f=0;for(e=this.vertices.length;f<e;f++){var g=this.vertices[f];g=Math.round(g.x*d)+"_"+Math.round(g.y*d)+"_"+Math.round(g.z*d);void 0===a[g]?(a[g]=f,b.push(this.vertices[f]),c[f]=b.length-1):c[f]=c[a[g]]}a=[];f=0;for(e=this.faces.length;f<e;f++)for(d=this.faces[f],d.a=c[d.a],d.b=c[d.b],d.c=c[d.c],d=[d.a,d.b,d.c],g=0;3>g;g++)if(d[g]===d[(g+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(d=a[f],this.faces.splice(d,1),c=0,e=
+this.faceVertexUvs.length;c<e;c++)this.faceVertexUvs[c].splice(d,1);f=this.vertices.length-b.length;this.vertices=b;return f},setFromPoints:function(a){this.vertices=[];for(var b=0,c=a.length;b<c;b++){var d=a[b];this.vertices.push(new p(d.x,d.y,d.z||0))}return this},sortFacesByMaterialIndex:function(){for(var a=this.faces,b=a.length,c=0;c<b;c++)a[c]._id=c;a.sort(function(a,b){return a.materialIndex-b.materialIndex});var d=this.faceVertexUvs[0],e=this.faceVertexUvs[1],f,g;d&&d.length===b&&(f=[]);e&&
+e.length===b&&(g=[]);for(c=0;c<b;c++){var h=a[c]._id;f&&f.push(d[h]);g&&g.push(e[h])}f&&(this.faceVertexUvs[0]=f);g&&(this.faceVertexUvs[1]=g)},toJSON:function(){function a(a,b,c){return c?a|1<<b:a&~(1<<b)}function b(a){var b=a.x.toString()+a.y.toString()+a.z.toString();if(void 0!==m[b])return m[b];m[b]=l.length/3;l.push(a.x,a.y,a.z);return m[b]}function c(a){var b=a.r.toString()+a.g.toString()+a.b.toString();if(void 0!==n[b])return n[b];n[b]=k.length;k.push(a.getHex());return n[b]}function d(a){var b=
+a.x.toString()+a.y.toString();if(void 0!==r[b])return r[b];r[b]=p.length/2;p.push(a.x,a.y);return r[b]}var e={metadata:{version:4.5,type:"Geometry",generator:"Geometry.toJSON"}};e.uuid=this.uuid;e.type=this.type;""!==this.name&&(e.name=this.name);if(void 0!==this.parameters){var f=this.parameters,g;for(g in f)void 0!==f[g]&&(e[g]=f[g]);return e}f=[];for(g=0;g<this.vertices.length;g++){var h=this.vertices[g];f.push(h.x,h.y,h.z)}h=[];var l=[],m={},k=[],n={},p=[],r={};for(g=0;g<this.faces.length;g++){var q=
+this.faces[g],u=void 0!==this.faceVertexUvs[0][g],v=0<q.normal.length(),x=0<q.vertexNormals.length,w=1!==q.color.r||1!==q.color.g||1!==q.color.b,y=0<q.vertexColors.length,A=0;A=a(A,0,0);A=a(A,1,!0);A=a(A,2,!1);A=a(A,3,u);A=a(A,4,v);A=a(A,5,x);A=a(A,6,w);A=a(A,7,y);h.push(A);h.push(q.a,q.b,q.c);h.push(q.materialIndex);u&&(u=this.faceVertexUvs[0][g],h.push(d(u[0]),d(u[1]),d(u[2])));v&&h.push(b(q.normal));x&&(v=q.vertexNormals,h.push(b(v[0]),b(v[1]),b(v[2])));w&&h.push(c(q.color));y&&(q=q.vertexColors,
+h.push(c(q[0]),c(q[1]),c(q[2])))}e.data={};e.data.vertices=f;e.data.normals=l;0<k.length&&(e.data.colors=k);0<p.length&&(e.data.uvs=[p]);e.data.faces=h;return e},clone:function(){return(new L).copy(this)},copy:function(a){var b,c,d;this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;var e=a.vertices;var f=0;for(b=e.length;f<
+b;f++)this.vertices.push(e[f].clone());e=a.colors;f=0;for(b=e.length;f<b;f++)this.colors.push(e[f].clone());e=a.faces;f=0;for(b=e.length;f<b;f++)this.faces.push(e[f].clone());f=0;for(b=a.faceVertexUvs.length;f<b;f++){var g=a.faceVertexUvs[f];void 0===this.faceVertexUvs[f]&&(this.faceVertexUvs[f]=[]);e=0;for(c=g.length;e<c;e++){var h=g[e],l=[];var m=0;for(d=h.length;m<d;m++)l.push(h[m].clone());this.faceVertexUvs[f].push(l)}}m=a.morphTargets;f=0;for(b=m.length;f<b;f++){d={};d.name=m[f].name;if(void 0!==
+m[f].vertices)for(d.vertices=[],e=0,c=m[f].vertices.length;e<c;e++)d.vertices.push(m[f].vertices[e].clone());if(void 0!==m[f].normals)for(d.normals=[],e=0,c=m[f].normals.length;e<c;e++)d.normals.push(m[f].normals[e].clone());this.morphTargets.push(d)}m=a.morphNormals;f=0;for(b=m.length;f<b;f++){d={};if(void 0!==m[f].vertexNormals)for(d.vertexNormals=[],e=0,c=m[f].vertexNormals.length;e<c;e++)g=m[f].vertexNormals[e],h={},h.a=g.a.clone(),h.b=g.b.clone(),h.c=g.c.clone(),d.vertexNormals.push(h);if(void 0!==
+m[f].faceNormals)for(d.faceNormals=[],e=0,c=m[f].faceNormals.length;e<c;e++)d.faceNormals.push(m[f].faceNormals[e].clone());this.morphNormals.push(d)}e=a.skinWeights;f=0;for(b=e.length;f<b;f++)this.skinWeights.push(e[f].clone());e=a.skinIndices;f=0;for(b=e.length;f<b;f++)this.skinIndices.push(e[f].clone());e=a.lineDistances;f=0;for(b=e.length;f<b;f++)this.lineDistances.push(e[f]);f=a.boundingBox;null!==f&&(this.boundingBox=f.clone());f=a.boundingSphere;null!==f&&(this.boundingSphere=f.clone());this.elementsNeedUpdate=
+a.elementsNeedUpdate;this.verticesNeedUpdate=a.verticesNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.lineDistancesNeedUpdate=a.lineDistancesNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});var fh=function(a){function b(b,d,e,f,g,h){a.call(this);this.type="BoxGeometry";this.parameters={width:b,height:d,depth:e,widthSegments:f,heightSegments:g,
+depthSegments:h};this.fromBufferGeometry(new Gd(b,d,e,f,g,h));this.mergeVertices()}a&&(b.__proto__=a);b.prototype=Object.create(a&&a.prototype);return b.prototype.constructor=b}(L),Gd=function(a){function b(b,d,e,f,g,h){function c(a,b,c,d,e,f,g,h,l,z,v){var w=f/l,x=g/z,y=f/2,A=g/2,E=h/2;g=l+1;for(var C=z+1,B=f=0,D=new p,F=0;F<C;F++)for(var G=F*x-A,H=0;H<g;H++)D[a]=(H*w-y)*d,D[b]=G*e,D[c]=E,n.push(D.x,D.y,D.z),D[a]=0,D[b]=0,D[c]=0<h?1:-1,t.push(D.x,D.y,D.z),r.push(H/l),r.push(1-F/z),f+=1;for(a=0;a<
+z;a++)for(b=0;b<l;b++)c=q+b+g*(a+1),d=q+(b+1)+g*(a+1),e=q+(b+1)+g*a,k.push(q+b+g*a,c,e),k.push(c,d,e),B+=6;m.addGroup(u,B,v);u+=B;q+=f}a.call(this);this.type="BoxBufferGeometry";this.parameters={width:b,height:d,depth:e,widthSegments:f,heightSegments:g,depthSegments:h};var m=this;b=b||1;d=d||1;e=e||1;f=Math.floor(f)||1;g=Math.floor(g)||1;h=Math.floor(h)||1;var k=[],n=[],t=[],r=[],q=0,u=0;c("z","y","x",-1,-1,e,d,b,h,g,0);c("z","y","x",1,-1,e,d,-b,h,g,1);c("x","z","y",1,1,b,e,d,f,h,2);c("x","z","y",
+1,-1,b,e,-d,f,h,3);c("x","y","z",1,-1,b,d,e,f,g,4);c("x","y","z",-1,-1,b,d,-e,f,g,5);this.setIndex(k);this.setAttribute("position",new B(n,3));this.setAttribute("normal",new B(t,3));this.setAttribute("uv",new B(r,2))}a&&(b.__proto__=a);b.prototype=Object.create(a&&a.prototype);return b.prototype.constructor=b}(F),Oh={clone:Ec,merge:wa};Ca.prototype=Object.create(K.prototype);Ca.prototype.constructor=Ca;Ca.prototype.isShaderMaterial=!0;Ca.prototype.copy=function(a){K.prototype.copy.call(this,a);this.fragmentShader=
+a.fragmentShader;this.vertexShader=a.vertexShader;this.uniforms=Ec(a.uniforms);this.defines=Object.assign({},a.defines);this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.lights=a.lights;this.clipping=a.clipping;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;this.extensions=Object.assign({},a.extensions);return this};Ca.prototype.toJSON=function(a){var b=K.prototype.toJSON.call(this,a);b.uniforms={};for(var c in this.uniforms){var d=
+this.uniforms[c].value;b.uniforms[c]=d&&d.isTexture?{type:"t",value:d.toJSON(a).uuid}:d&&d.isColor?{type:"c",value:d.getHex()}:d&&d.isVector2?{type:"v2",value:d.toArray()}:d&&d.isVector3?{type:"v3",value:d.toArray()}:d&&d.isVector4?{type:"v4",value:d.toArray()}:d&&d.isMatrix3?{type:"m3",value:d.toArray()}:d&&d.isMatrix4?{type:"m4",value:d.toArray()}:{value:d}}0<Object.keys(this.defines).length&&(b.defines=this.defines);b.vertexShader=this.vertexShader;b.fragmentShader=this.fragmentShader;a={};for(var e in this.extensions)!0===
+this.extensions[e]&&(a[e]=!0);0<Object.keys(a).length&&(b.extensions=a);return b};fb.prototype=Object.assign(Object.create(y.prototype),{constructor:fb,isCamera:!0,copy:function(a,b){y.prototype.copy.call(this,a,b);this.matrixWorldInverse.copy(a.matrixWorldInverse);this.projectionMatrix.copy(a.projectionMatrix);this.projectionMatrixInverse.copy(a.projectionMatrixInverse);return this},getWorldDirection:function(a){void 0===a&&(console.warn("THREE.Camera: .getWorldDirection() target is now required"),
+a=new p);this.updateMatrixWorld(!0);var b=this.matrixWorld.elements;return a.set(-b[8],-b[9],-b[10]).normalize()},updateMatrixWorld:function(a){y.prototype.updateMatrixWorld.call(this,a);this.matrixWorldInverse.getInverse(this.matrixWorld)},updateWorldMatrix:function(a,b){y.prototype.updateWorldMatrix.call(this,a,b);this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}});P.prototype=Object.assign(Object.create(fb.prototype),{constructor:P,
+isPerspectiveCamera:!0,copy:function(a,b){fb.prototype.copy.call(this,a,b);this.fov=a.fov;this.zoom=a.zoom;this.near=a.near;this.far=a.far;this.focus=a.focus;this.aspect=a.aspect;this.view=null===a.view?null:Object.assign({},a.view);this.filmGauge=a.filmGauge;this.filmOffset=a.filmOffset;return this},setFocalLength:function(a){a=.5*this.getFilmHeight()/a;this.fov=2*O.RAD2DEG*Math.atan(a);this.updateProjectionMatrix()},getFocalLength:function(){var a=Math.tan(.5*O.DEG2RAD*this.fov);return.5*this.getFilmHeight()/
+a},getEffectiveFOV:function(){return 2*O.RAD2DEG*Math.atan(Math.tan(.5*O.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(a,b,c,d,e,f){this.aspect=a/b;null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1});this.view.enabled=!0;this.view.fullWidth=a;this.view.fullHeight=b;this.view.offsetX=c;this.view.offsetY=
+d;this.view.width=e;this.view.height=f;this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1);this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=this.near,b=a*Math.tan(.5*O.DEG2RAD*this.fov)/this.zoom,c=2*b,d=this.aspect*c,e=-.5*d,f=this.view;if(null!==this.view&&this.view.enabled){var g=f.fullWidth,h=f.fullHeight;e+=f.offsetX*d/g;b-=f.offsetY*c/h;d*=f.width/g;c*=f.height/h}f=this.filmOffset;0!==f&&(e+=a*f/this.getFilmWidth());this.projectionMatrix.makePerspective(e,
+e+d,b,b-c,a,this.far);this.projectionMatrixInverse.getInverse(this.projectionMatrix)},toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.fov=this.fov;a.object.zoom=this.zoom;a.object.near=this.near;a.object.far=this.far;a.object.focus=this.focus;a.object.aspect=this.aspect;null!==this.view&&(a.object.view=Object.assign({},this.view));a.object.filmGauge=this.filmGauge;a.object.filmOffset=this.filmOffset;return a}});Fc.prototype=Object.create(y.prototype);Fc.prototype.constructor=Fc;Zb.prototype=
+Object.create(Ba.prototype);Zb.prototype.constructor=Zb;Zb.prototype.isWebGLCubeRenderTarget=!0;Zb.prototype.fromEquirectangularTexture=function(a,b){this.texture.type=b.type;this.texture.format=b.format;this.texture.encoding=b.encoding;var c=new zc,d=new Ca({type:"CubemapFromEquirect",uniforms:Ec({tEquirect:{value:null}}),vertexShader:"varying vec3 vWorldDirection;\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",
+fragmentShader:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}",side:1,blending:0});d.uniforms.tEquirect.value=b;b=new ea(new Gd(5,5,5),d);c.add(b);(new Fc(1,10,this)).update(a,c);b.geometry.dispose();b.material.dispose();return this};$b.prototype=Object.create(W.prototype);$b.prototype.constructor=$b;$b.prototype.isDataTexture=
+!0;var ud=new eb,Hf=new p;Object.assign(Gc.prototype,{set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){for(var b=this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromProjectionMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],l=c[6],m=c[7],k=c[8],n=c[9],p=c[10],r=c[11],q=c[12],u=
+c[13],v=c[14];c=c[15];b[0].setComponents(f-a,m-g,r-k,c-q).normalize();b[1].setComponents(f+a,m+g,r+k,c+q).normalize();b[2].setComponents(f+d,m+h,r+n,c+u).normalize();b[3].setComponents(f-d,m-h,r-n,c-u).normalize();b[4].setComponents(f-e,m-l,r-p,c-v).normalize();b[5].setComponents(f+e,m+l,r+p,c+v).normalize();return this},intersectsObject:function(a){var b=a.geometry;null===b.boundingSphere&&b.computeBoundingSphere();ud.copy(b.boundingSphere).applyMatrix4(a.matrixWorld);return this.intersectsSphere(ud)},
+intersectsSprite:function(a){ud.center.set(0,0,0);ud.radius=.7071067811865476;ud.applyMatrix4(a.matrixWorld);return this.intersectsSphere(ud)},intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)<a)return!1;return!0},intersectsBox:function(a){for(var b=this.planes,c=0;6>c;c++){var d=b[c];Hf.x=0<d.normal.x?a.max.x:a.min.x;Hf.y=0<d.normal.y?a.max.y:a.min.y;Hf.z=0<d.normal.z?a.max.z:a.min.z;if(0>d.distanceToPoint(Hf))return!1}return!0},
+containsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});var A={common:{diffuse:{value:new D(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new ya},uv2Transform:{value:new ya},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},
+lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new v(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:2.5E-4},fogNear:{value:1},fogFar:{value:2E3},fogColor:{value:new D(16777215)}},
+lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},
+spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new D(15658734)},opacity:{value:1},
+size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},uvTransform:{value:new ya}},sprite:{diffuse:{value:new D(15658734)},opacity:{value:1},center:{value:new v(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},uvTransform:{value:new ya}}};Fd.prototype=Object.create(L.prototype);Fd.prototype.constructor=Fd;ac.prototype=Object.create(F.prototype);ac.prototype.constructor=ac;var M={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif",
+alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif",
+aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"vec3 transformed = vec3( position );",beginnormal_vertex:"vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif",bsdfs:"vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE  = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS  = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha  = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif",
+bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",
+clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",
+clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",
+color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n  return m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",
+cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_maxMipLevel 8.0\n#define cubeUV_minMipLevel 4.0\n#define cubeUV_maxTileSize 256.0\n#define cubeUV_minTileSize 16.0\nfloat getFace(vec3 direction) {\n    vec3 absDirection = abs(direction);\n    float face = -1.0;\n    if (absDirection.x > absDirection.z) {\n      if (absDirection.x > absDirection.y)\n        face = direction.x > 0.0 ? 0.0 : 3.0;\n      else\n        face = direction.y > 0.0 ? 1.0 : 4.0;\n    } else {\n      if (absDirection.z > absDirection.y)\n        face = direction.z > 0.0 ? 2.0 : 5.0;\n      else\n        face = direction.y > 0.0 ? 1.0 : 4.0;\n    }\n    return face;\n}\nvec2 getUV(vec3 direction, float face) {\n    vec2 uv;\n    if (face == 0.0) {\n      uv = vec2(direction.z, direction.y) / abs(direction.x);    } else if (face == 1.0) {\n      uv = vec2(-direction.x, -direction.z) / abs(direction.y);    } else if (face == 2.0) {\n      uv = vec2(-direction.x, direction.y) / abs(direction.z);    } else if (face == 3.0) {\n      uv = vec2(-direction.z, direction.y) / abs(direction.x);    } else if (face == 4.0) {\n      uv = vec2(-direction.x, direction.z) / abs(direction.y);    } else {\n      uv = vec2(direction.x, direction.y) / abs(direction.z);    }\n    return 0.5 * (uv + 1.0);\n}\nvec3 bilinearCubeUV(sampler2D envMap, vec3 direction, float mipInt) {\n  float face = getFace(direction);\n  float filterInt = max(cubeUV_minMipLevel - mipInt, 0.0);\n  mipInt = max(mipInt, cubeUV_minMipLevel);\n  float faceSize = exp2(mipInt);\n  float texelSize = 1.0 / (3.0 * cubeUV_maxTileSize);\n  vec2 uv = getUV(direction, face) * (faceSize - 1.0);\n  vec2 f = fract(uv);\n  uv += 0.5 - f;\n  if (face > 2.0) {\n    uv.y += faceSize;\n    face -= 3.0;\n  }\n  uv.x += face * faceSize;\n  if(mipInt < cubeUV_maxMipLevel){\n    uv.y += 2.0 * cubeUV_maxTileSize;\n  }\n  uv.y += filterInt * 2.0 * cubeUV_minTileSize;\n  uv.x += 3.0 * max(0.0, cubeUV_maxTileSize - 2.0 * faceSize);\n  uv *= texelSize;\n  vec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n  uv.x += texelSize;\n  vec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n  uv.y += texelSize;\n  vec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n  uv.x -= texelSize;\n  vec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n  vec3 tm = mix(tl, tr, f.x);\n  vec3 bm = mix(bl, br, f.x);\n  return mix(tm, bm, f.y);\n}\n#define r0 1.0\n#define v0 0.339\n#define m0 -2.0\n#define r1 0.8\n#define v1 0.276\n#define m1 -1.0\n#define r4 0.4\n#define v4 0.046\n#define m4 2.0\n#define r5 0.305\n#define v5 0.016\n#define m5 3.0\n#define r6 0.21\n#define v6 0.0038\n#define m6 4.0\nfloat roughnessToMip(float roughness) {\n  float mip = 0.0;\n  if (roughness >= r1) {\n    mip = (r0 - roughness) * (m1 - m0) / (r0 - r1) + m0;\n  } else if (roughness >= r4) {\n    mip = (r1 - roughness) * (m4 - m1) / (r1 - r4) + m1;\n  } else if (roughness >= r5) {\n    mip = (r4 - roughness) * (m5 - m4) / (r4 - r5) + m4;\n  } else if (roughness >= r6) {\n    mip = (r5 - roughness) * (m6 - m5) / (r5 - r6) + m5;\n  } else {\n    mip = -2.0 * log2(1.16 * roughness);  }\n  return mip;\n}\nvec4 textureCubeUV(sampler2D envMap, vec3 sampleDir, float roughness) {\n  float mip = clamp(roughnessToMip(roughness), m0, cubeUV_maxMipLevel);\n  float mipF = fract(mip);\n  float mipInt = floor(mip);\n  vec3 color0 = bilinearCubeUV(envMap, sampleDir, mipInt);\n  if (mipF == 0.0) {\n    return vec4(color0, 1.0);\n  } else {\n    vec3 color1 = bilinearCubeUV(envMap, sampleDir, mipInt + 1.0);\n    return vec4(mix(color0, color1, mipF), 1.0);\n  }\n}\n#endif",
+defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",
+displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",
+emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value )  {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",
+envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\t\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t}  else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec2 sampleUV = equirectUv( reflectVec );\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",
+envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",
+envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t  vec3 reflectVec = reflect( -viewDir, normal );\n\t\t  reflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t  vec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV = equirectUv( reflectVec );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif",
+envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) { \n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",
+fog_vertex:"#ifdef USE_FOG\n\tfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",
+gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n#endif",
+lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif",
+lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight  ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif",
+lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct ToonMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",
+lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",
+lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif",
+lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(    0, 1,    0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",
+lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",
+lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif",
+lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",
+logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",
+map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",
+map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",
+morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",
+morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif",
+normal_fragment_begin:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",
+normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif",
+normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tmat3 tsn = mat3( S, T, N );\n\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif",
+clearcoat_normal_fragment_begin:"#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",
+packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",
+premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",
+roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",
+shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",
+shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",
+shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",
+skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",
+skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix  = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",
+specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( ( color * ( 2.51 * color + 0.03 ) ) / ( color * ( 2.43 * color + 0.59 ) + 0.14 ) );\n}",
+uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",
+uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",
+background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",cube_frag:"#include <envmap_common_pars_fragment>\nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include <cube_uv_reflection_fragment>\nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include <envmap_fragment>\n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",
+cube_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",
+depth_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvHighPrecisionZW = gl_Position.zw;\n}",
+distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",
+distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}",
+equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",
+linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",
+linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}",
+meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
+meshbasic_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}",
+meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
+meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
+meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
+meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\tvViewPosition = - mvPosition.xyz;\n}",
+meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_toon_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_toon_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
+meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
+meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
+meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
+meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n\t#define TRANSPARENCY\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef TRANSPARENCY\n\tuniform float transparency;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#ifdef TRANSPARENCY\n\t\tdiffuseColor.a *= saturate( 1. - transparency + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) );\n\t#endif\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",
+meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
+normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",
+normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",
+points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",
+points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}",
+shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",shadow_vert:"#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
+sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",
+sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}"},
+gb={basic:{uniforms:wa([A.common,A.specularmap,A.envmap,A.aomap,A.lightmap,A.fog]),vertexShader:M.meshbasic_vert,fragmentShader:M.meshbasic_frag},lambert:{uniforms:wa([A.common,A.specularmap,A.envmap,A.aomap,A.lightmap,A.emissivemap,A.fog,A.lights,{emissive:{value:new D(0)}}]),vertexShader:M.meshlambert_vert,fragmentShader:M.meshlambert_frag},phong:{uniforms:wa([A.common,A.specularmap,A.envmap,A.aomap,A.lightmap,A.emissivemap,A.bumpmap,A.normalmap,A.displacementmap,A.fog,A.lights,{emissive:{value:new D(0)},
+specular:{value:new D(1118481)},shininess:{value:30}}]),vertexShader:M.meshphong_vert,fragmentShader:M.meshphong_frag},standard:{uniforms:wa([A.common,A.envmap,A.aomap,A.lightmap,A.emissivemap,A.bumpmap,A.normalmap,A.displacementmap,A.roughnessmap,A.metalnessmap,A.fog,A.lights,{emissive:{value:new D(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:M.meshphysical_vert,fragmentShader:M.meshphysical_frag},toon:{uniforms:wa([A.common,A.specularmap,A.aomap,A.lightmap,
+A.emissivemap,A.bumpmap,A.normalmap,A.displacementmap,A.gradientmap,A.fog,A.lights,{emissive:{value:new D(0)},specular:{value:new D(1118481)},shininess:{value:30}}]),vertexShader:M.meshtoon_vert,fragmentShader:M.meshtoon_frag},matcap:{uniforms:wa([A.common,A.bumpmap,A.normalmap,A.displacementmap,A.fog,{matcap:{value:null}}]),vertexShader:M.meshmatcap_vert,fragmentShader:M.meshmatcap_frag},points:{uniforms:wa([A.points,A.fog]),vertexShader:M.points_vert,fragmentShader:M.points_frag},dashed:{uniforms:wa([A.common,
+A.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:M.linedashed_vert,fragmentShader:M.linedashed_frag},depth:{uniforms:wa([A.common,A.displacementmap]),vertexShader:M.depth_vert,fragmentShader:M.depth_frag},normal:{uniforms:wa([A.common,A.bumpmap,A.normalmap,A.displacementmap,{opacity:{value:1}}]),vertexShader:M.normal_vert,fragmentShader:M.normal_frag},sprite:{uniforms:wa([A.sprite,A.fog]),vertexShader:M.sprite_vert,fragmentShader:M.sprite_frag},background:{uniforms:{uvTransform:{value:new ya},
+t2D:{value:null}},vertexShader:M.background_vert,fragmentShader:M.background_frag},cube:{uniforms:wa([A.envmap,{opacity:{value:1}}]),vertexShader:M.cube_vert,fragmentShader:M.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:M.equirect_vert,fragmentShader:M.equirect_frag},distanceRGBA:{uniforms:wa([A.common,A.displacementmap,{referencePosition:{value:new p},nearDistance:{value:1},farDistance:{value:1E3}}]),vertexShader:M.distanceRGBA_vert,fragmentShader:M.distanceRGBA_frag},shadow:{uniforms:wa([A.lights,
+A.fog,{color:{value:new D(0)},opacity:{value:1}}]),vertexShader:M.shadow_vert,fragmentShader:M.shadow_frag}};gb.physical={uniforms:wa([gb.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new v(1,1)},clearcoatNormalMap:{value:null},sheen:{value:new D(0)},transparency:{value:0}}]),vertexShader:M.meshphysical_vert,fragmentShader:M.meshphysical_frag};qb.prototype=Object.create(W.prototype);qb.prototype.constructor=
+qb;qb.prototype.isCubeTexture=!0;Object.defineProperty(qb.prototype,"images",{get:function(){return this.image},set:function(a){this.image=a}});Hc.prototype=Object.create(W.prototype);Hc.prototype.constructor=Hc;Hc.prototype.isDataTexture2DArray=!0;Ic.prototype=Object.create(W.prototype);Ic.prototype.constructor=Ic;Ic.prototype.isDataTexture3D=!0;var Bh=new W,Ej=new Hc,Gj=new Ic,Ch=new qb,vh=[],xh=[],Ah=new Float32Array(16),zh=new Float32Array(9),yh=new Float32Array(4);Dh.prototype.updateCache=function(a){var b=
+this.cache;a instanceof Float32Array&&b.length!==a.length&&(this.cache=new Float32Array(a.length));Ja(b,a)};Eh.prototype.setValue=function(a,b,c){for(var d=this.seq,e=0,f=d.length;e!==f;++e){var g=d[e];g.setValue(a,b[g.id],c)}};var eg=/([\w\d_]+)(\])?(\[|\.)?/g;Gb.prototype.setValue=function(a,b,c,d){b=this.map[b];void 0!==b&&b.setValue(a,c,d)};Gb.prototype.setOptional=function(a,b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};Gb.upload=function(a,b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],
+h=c[g.id];!1!==h.needsUpdate&&g.setValue(a,h.value,d)}};Gb.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in b&&c.push(f)}return c};var lk=0,gg=/^[ \t]*#include +<([\w\d./]+)>/gm,Nh=/#pragma unroll_loop[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}/g,Mh=/#pragma unroll_loop_start[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}[\s]+?#pragma unroll_loop_end/g,vk=0;Hb.prototype=Object.create(K.prototype);Hb.prototype.constructor=
+Hb;Hb.prototype.isMeshDepthMaterial=!0;Hb.prototype.copy=function(a){K.prototype.copy.call(this,a);this.depthPacking=a.depthPacking;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;return this};Ib.prototype=Object.create(K.prototype);Ib.prototype.constructor=
+Ib;Ib.prototype.isMeshDistanceMaterial=!0;Ib.prototype.copy=function(a){K.prototype.copy.call(this,a);this.referencePosition.copy(a.referencePosition);this.nearDistance=a.nearDistance;this.farDistance=a.farDistance;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;return this};Le.prototype=Object.assign(Object.create(P.prototype),
+{constructor:Le,isArrayCamera:!0});Kc.prototype=Object.assign(Object.create(y.prototype),{constructor:Kc,isGroup:!0});Object.assign(Me.prototype,{constructor:Me,getTargetRaySpace:function(){null===this._targetRay&&(this._targetRay=new Kc,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1);return this._targetRay},getGripSpace:function(){null===this._grip&&(this._grip=new Kc,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1);return this._grip},dispatchEvent:function(a){null!==this._targetRay&&
+this._targetRay.dispatchEvent(a);null!==this._grip&&this._grip.dispatchEvent(a);return this},disconnect:function(a){this.dispatchEvent({type:"disconnected",data:a});null!==this._targetRay&&(this._targetRay.visible=!1);null!==this._grip&&(this._grip.visible=!1);return this},update:function(a,b,c){var d=null,e=null,f=this._targetRay,g=this._grip;a&&(null!==f&&(d=b.getPose(a.targetRaySpace,c),null!==d&&(f.matrix.fromArray(d.transform.matrix),f.matrix.decompose(f.position,f.rotation,f.scale))),null!==
+g&&a.gripSpace&&(e=b.getPose(a.gripSpace,c),null!==e&&(g.matrix.fromArray(e.transform.matrix),g.matrix.decompose(g.position,g.rotation,g.scale))));null!==f&&(f.visible=null!==d);null!==g&&(g.visible=null!==e);return this}});Object.assign(Uh.prototype,ua.prototype);Object.assign(Ne.prototype,{isFogExp2:!0,clone:function(){return new Ne(this.color,this.density)},toJSON:function(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}});Object.assign(Oe.prototype,{isFog:!0,clone:function(){return new Oe(this.color,
+this.near,this.far)},toJSON:function(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}});Object.defineProperty(rb.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(rb.prototype,{isInterleavedBuffer:!0,onUploadCallback:function(){},setUsage:function(a){this.usage=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.count=a.count;this.stride=a.stride;this.usage=a.usage;return this},copyAt:function(a,b,c){a*=this.stride;
+c*=b.stride;for(var d=0,e=this.stride;d<e;d++)this.array[a+d]=b.array[c+d];return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},clone:function(){return(new this.constructor).copy(this)},onUpload:function(a){this.onUploadCallback=a;return this}});var sc=new p;Object.defineProperties(Kd.prototype,{count:{get:function(){return this.data.count}},array:{get:function(){return this.data.array}}});Object.assign(Kd.prototype,{isInterleavedBufferAttribute:!0,applyMatrix4:function(a){for(var b=
+0,c=this.data.count;b<c;b++)sc.x=this.getX(b),sc.y=this.getY(b),sc.z=this.getZ(b),sc.applyMatrix4(a),this.setXYZ(b,sc.x,sc.y,sc.z);return this},setX:function(a,b){this.data.array[a*this.data.stride+this.offset]=b;return this},setY:function(a,b){this.data.array[a*this.data.stride+this.offset+1]=b;return this},setZ:function(a,b){this.data.array[a*this.data.stride+this.offset+2]=b;return this},setW:function(a,b){this.data.array[a*this.data.stride+this.offset+3]=b;return this},getX:function(a){return this.data.array[a*
+this.data.stride+this.offset]},getY:function(a){return this.data.array[a*this.data.stride+this.offset+1]},getZ:function(a){return this.data.array[a*this.data.stride+this.offset+2]},getW:function(a){return this.data.array[a*this.data.stride+this.offset+3]},setXY:function(a,b,c){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;return this},
+setXYZW:function(a,b,c,d,e){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;this.data.array[a+3]=e;return this},clone:function(){console.log("THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data.");for(var a=[],b=0;b<this.count;b++)for(var c=b*this.data.stride+this.offset,d=0;d<this.itemSize;d++)a.push(this.data.array[c+d]);return new G(new this.array.constructor(a),this.itemSize,this.normalized)},
+toJSON:function(){console.log("THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data.");for(var a=[],b=0;b<this.count;b++)for(var c=b*this.data.stride+this.offset,d=0;d<this.itemSize;d++)a.push(this.data.array[c+d]);return{itemSize:this.itemSize,type:this.array.constructor.name,array:a,normalized:this.normalized}}});Kb.prototype=Object.create(K.prototype);Kb.prototype.constructor=Kb;Kb.prototype.isSpriteMaterial=!0;Kb.prototype.copy=function(a){K.prototype.copy.call(this,
+a);this.color.copy(a.color);this.map=a.map;this.alphaMap=a.alphaMap;this.rotation=a.rotation;this.sizeAttenuation=a.sizeAttenuation;return this};var Lc,xe=new p,vd=new p,wd=new p,Mc=new v,Md=new v,Wh=new N,If=new p,ye=new p,Jf=new p,Di=new v,gh=new v,Ei=new v;Ld.prototype=Object.assign(Object.create(y.prototype),{constructor:Ld,isSprite:!0,raycast:function(a,b){null===a.camera&&console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.');vd.setFromMatrixScale(this.matrixWorld);
+Wh.copy(a.camera.matrixWorld);this.modelViewMatrix.multiplyMatrices(a.camera.matrixWorldInverse,this.matrixWorld);wd.setFromMatrixPosition(this.modelViewMatrix);a.camera.isPerspectiveCamera&&!1===this.material.sizeAttenuation&&vd.multiplyScalar(-wd.z);var c=this.material.rotation;if(0!==c){var d=Math.cos(c);var e=Math.sin(c)}c=this.center;Pe(If.set(-.5,-.5,0),wd,c,vd,e,d);Pe(ye.set(.5,-.5,0),wd,c,vd,e,d);Pe(Jf.set(.5,.5,0),wd,c,vd,e,d);Di.set(0,0);gh.set(1,0);Ei.set(1,1);var f=a.ray.intersectTriangle(If,
+ye,Jf,!1,xe);if(null===f&&(Pe(ye.set(-.5,.5,0),wd,c,vd,e,d),gh.set(0,1),f=a.ray.intersectTriangle(If,Jf,ye,!1,xe),null===f))return;e=a.ray.origin.distanceTo(xe);e<a.near||e>a.far||b.push({distance:e,point:xe.clone(),uv:pa.getUV(xe,If,ye,Jf,Di,gh,Ei,new v),face:null,object:this})},clone:function(){return(new this.constructor(this.material)).copy(this)},copy:function(a){y.prototype.copy.call(this,a);void 0!==a.center&&this.center.copy(a.center);return this}});var Kf=new p,Fi=new p;Nd.prototype=Object.assign(Object.create(y.prototype),
+{constructor:Nd,isLOD:!0,copy:function(a){y.prototype.copy.call(this,a,!1);for(var b=a.levels,c=0,d=b.length;c<d;c++){var e=b[c];this.addLevel(e.object.clone(),e.distance)}this.autoUpdate=a.autoUpdate;return this},addLevel:function(a,b){void 0===b&&(b=0);b=Math.abs(b);for(var c=this.levels,d=0;d<c.length&&!(b<c[d].distance);d++);c.splice(d,0,{distance:b,object:a});this.add(a);return this},getCurrentLevel:function(){return this._currentLevel},getObjectForDistance:function(a){var b=this.levels;if(0<
+b.length){for(var c=1,d=b.length;c<d&&!(a<b[c].distance);c++);return b[c-1].object}return null},raycast:function(a,b){if(0<this.levels.length){Kf.setFromMatrixPosition(this.matrixWorld);var c=a.ray.origin.distanceTo(Kf);this.getObjectForDistance(c).raycast(a,b)}},update:function(a){var b=this.levels;if(1<b.length){Kf.setFromMatrixPosition(a.matrixWorld);Fi.setFromMatrixPosition(this.matrixWorld);a=Kf.distanceTo(Fi)/a.zoom;b[0].object.visible=!0;for(var c=1,d=b.length;c<d;c++)if(a>=b[c].distance)b[c-
+1].object.visible=!1,b[c].object.visible=!0;else break;for(this._currentLevel=c-1;c<d;c++)b[c].object.visible=!1}},toJSON:function(a){a=y.prototype.toJSON.call(this,a);!1===this.autoUpdate&&(a.object.autoUpdate=!1);a.object.levels=[];for(var b=this.levels,c=0,d=b.length;c<d;c++){var e=b[c];a.object.levels.push({object:e.object.uuid,distance:e.distance})}return a}});Qe.prototype=Object.assign(Object.create(ea.prototype),{constructor:Qe,isSkinnedMesh:!0,bind:function(a,b){this.skeleton=a;void 0===b&&
+(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),b=this.matrixWorld);this.bindMatrix.copy(b);this.bindMatrixInverse.getInverse(b)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){for(var a=new R,b=this.geometry.attributes.skinWeight,c=0,d=b.count;c<d;c++){a.x=b.getX(c);a.y=b.getY(c);a.z=b.getZ(c);a.w=b.getW(c);var e=1/a.manhattanLength();Infinity!==e?a.multiplyScalar(e):a.set(1,0,0,0);b.setXYZW(c,a.x,a.y,a.z,a.w)}},updateMatrixWorld:function(a){ea.prototype.updateMatrixWorld.call(this,
+a);"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)},boneTransform:function(){var a=new p,b=new R,c=new R,d=new p,e=new N;return function(f,g){var h=this.skeleton,l=this.geometry;b.fromBufferAttribute(l.attributes.skinIndex,f);c.fromBufferAttribute(l.attributes.skinWeight,
+f);a.fromBufferAttribute(l.attributes.position,f).applyMatrix4(this.bindMatrix);g.set(0,0,0);for(f=0;4>f;f++)if(l=c.getComponent(f),0!==l){var m=b.getComponent(f);e.multiplyMatrices(h.bones[m].matrixWorld,h.boneInverses[m]);g.addScaledVector(d.copy(a).applyMatrix4(e),l)}return g.applyMatrix4(this.bindMatrixInverse)}}()});var Gi=new N,Qk=new N;Object.assign(Re.prototype,{calculateInverses:function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<b;a++){var c=new N;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);
+this.boneInverses.push(c)}},pose:function(){var a,b;var c=0;for(b=this.bones.length;c<b;c++)(a=this.bones[c])&&a.matrixWorld.getInverse(this.boneInverses[c]);c=0;for(b=this.bones.length;c<b;c++)if(a=this.bones[c])a.parent&&a.parent.isBone?(a.matrix.getInverse(a.parent.matrixWorld),a.matrix.multiply(a.matrixWorld)):a.matrix.copy(a.matrixWorld),a.matrix.decompose(a.position,a.quaternion,a.scale)},update:function(){for(var a=this.bones,b=this.boneInverses,c=this.boneMatrices,d=this.boneTexture,e=0,f=
+a.length;e<f;e++)Gi.multiplyMatrices(a[e]?a[e].matrixWorld:Qk,b[e]),Gi.toArray(c,16*e);void 0!==d&&(d.needsUpdate=!0)},clone:function(){return new Re(this.bones,this.boneInverses)},getBoneByName:function(a){for(var b=0,c=this.bones.length;b<c;b++){var d=this.bones[b];if(d.name===a)return d}},dispose:function(){this.boneTexture&&(this.boneTexture.dispose(),this.boneTexture=void 0)}});kg.prototype=Object.assign(Object.create(y.prototype),{constructor:kg,isBone:!0});var Hi=new N,Ii=new N,Lf=[],ze=new ea;
+Se.prototype=Object.assign(Object.create(ea.prototype),{constructor:Se,isInstancedMesh:!0,getMatrixAt:function(a,b){b.fromArray(this.instanceMatrix.array,16*a)},raycast:function(a,b){var c=this.matrixWorld,d=this.count;ze.geometry=this.geometry;ze.material=this.material;if(void 0!==ze.material)for(var e=0;e<d;e++){this.getMatrixAt(e,Hi);Ii.multiplyMatrices(c,Hi);ze.matrixWorld=Ii;ze.raycast(a,Lf);for(var f=0,g=Lf.length;f<g;f++){var h=Lf[f];h.instanceId=e;h.object=this;b.push(h)}Lf.length=0}},setMatrixAt:function(a,
+b){b.toArray(this.instanceMatrix.array,16*a)},updateMorphTargets:function(){}});da.prototype=Object.create(K.prototype);da.prototype.constructor=da;da.prototype.isLineBasicMaterial=!0;da.prototype.copy=function(a){K.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.linecap=a.linecap;this.linejoin=a.linejoin;this.morphTargets=a.morphTargets;return this};var Ji=new p,Ki=new p,Li=new N,Mf=new Wb,Ae=new eb;La.prototype=Object.assign(Object.create(y.prototype),{constructor:La,
+isLine:!0,computeLineDistances:function(){var a=this.geometry;if(a.isBufferGeometry)if(null===a.index){for(var b=a.attributes.position,c=[0],d=1,e=b.count;d<e;d++)Ji.fromBufferAttribute(b,d-1),Ki.fromBufferAttribute(b,d),c[d]=c[d-1],c[d]+=Ji.distanceTo(Ki);a.setAttribute("lineDistance",new B(c,1))}else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else if(a.isGeometry)for(b=a.vertices,c=a.lineDistances,c[0]=0,d=1,e=b.length;d<e;d++)c[d]=
+c[d-1],c[d]+=b[d-1].distanceTo(b[d]);return this},raycast:function(a,b){var c=this.geometry,d=this.matrixWorld,e=a.params.Line.threshold;null===c.boundingSphere&&c.computeBoundingSphere();Ae.copy(c.boundingSphere);Ae.applyMatrix4(d);Ae.radius+=e;if(!1!==a.ray.intersectsSphere(Ae)){Li.getInverse(d);Mf.copy(a.ray).applyMatrix4(Li);d=e/((this.scale.x+this.scale.y+this.scale.z)/3);d*=d;var f=new p,g=new p;e=new p;var h=new p,l=this&&this.isLineSegments?2:1;if(c.isBufferGeometry){var m=c.index,k=c.attributes.position.array;
+if(null!==m){m=m.array;c=0;for(var n=m.length-1;c<n;c+=l){var t=m[c+1];f.fromArray(k,3*m[c]);g.fromArray(k,3*t);t=Mf.distanceSqToSegment(f,g,h,e);t>d||(h.applyMatrix4(this.matrixWorld),t=a.ray.origin.distanceTo(h),t<a.near||t>a.far||b.push({distance:t,point:e.clone().applyMatrix4(this.matrixWorld),index:c,face:null,faceIndex:null,object:this}))}}else for(c=0,n=k.length/3-1;c<n;c+=l)f.fromArray(k,3*c),g.fromArray(k,3*c+3),t=Mf.distanceSqToSegment(f,g,h,e),t>d||(h.applyMatrix4(this.matrixWorld),t=a.ray.origin.distanceTo(h),
+t<a.near||t>a.far||b.push({distance:t,point:e.clone().applyMatrix4(this.matrixWorld),index:c,face:null,faceIndex:null,object:this}))}else if(c.isGeometry)for(f=c.vertices,g=f.length,c=0;c<g-1;c+=l)t=Mf.distanceSqToSegment(f[c],f[c+1],h,e),t>d||(h.applyMatrix4(this.matrixWorld),t=a.ray.origin.distanceTo(h),t<a.near||t>a.far||b.push({distance:t,point:e.clone().applyMatrix4(this.matrixWorld),index:c,face:null,faceIndex:null,object:this}))}},updateMorphTargets:function(){var a=this.geometry;if(a.isBufferGeometry){a=
+a.morphAttributes;var b=Object.keys(a);if(0<b.length){var c=a[b[0]];if(void 0!==c)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++){var d=c[a].name||String(a);this.morphTargetInfluences.push(0);this.morphTargetDictionary[d]=a}}}else a=a.morphTargets,void 0!==a&&0<a.length&&console.error("THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});
+var Nf=new p,Of=new p;ma.prototype=Object.assign(Object.create(La.prototype),{constructor:ma,isLineSegments:!0,computeLineDistances:function(){var a=this.geometry;if(a.isBufferGeometry)if(null===a.index){for(var b=a.attributes.position,c=[],d=0,e=b.count;d<e;d+=2)Nf.fromBufferAttribute(b,d),Of.fromBufferAttribute(b,d+1),c[d]=0===d?0:c[d-1],c[d+1]=c[d]+Nf.distanceTo(Of);a.setAttribute("lineDistance",new B(c,1))}else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");
+else if(a.isGeometry)for(b=a.vertices,c=a.lineDistances,d=0,e=b.length;d<e;d+=2)Nf.copy(b[d]),Of.copy(b[d+1]),c[d]=0===d?0:c[d-1],c[d+1]=c[d]+Nf.distanceTo(Of);return this}});Te.prototype=Object.assign(Object.create(La.prototype),{constructor:Te,isLineLoop:!0});Xa.prototype=Object.create(K.prototype);Xa.prototype.constructor=Xa;Xa.prototype.isPointsMaterial=!0;Xa.prototype.copy=function(a){K.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.alphaMap=a.alphaMap;this.size=a.size;
+this.sizeAttenuation=a.sizeAttenuation;this.morphTargets=a.morphTargets;return this};var Mi=new N,mg=new Wb,Be=new eb,Pf=new p;Nc.prototype=Object.assign(Object.create(y.prototype),{constructor:Nc,isPoints:!0,raycast:function(a,b){var c=this.geometry,d=this.matrixWorld,e=a.params.Points.threshold;null===c.boundingSphere&&c.computeBoundingSphere();Be.copy(c.boundingSphere);Be.applyMatrix4(d);Be.radius+=e;if(!1!==a.ray.intersectsSphere(Be))if(Mi.getInverse(d),mg.copy(a.ray).applyMatrix4(Mi),e/=(this.scale.x+
+this.scale.y+this.scale.z)/3,e*=e,c.isBufferGeometry){var f=c.index;c=c.attributes.position.array;if(null!==f){var g=f.array;f=0;for(var h=g.length;f<h;f++){var l=g[f];Pf.fromArray(c,3*l);lg(Pf,l,e,d,a,b,this)}}else for(f=0,g=c.length/3;f<g;f++)Pf.fromArray(c,3*f),lg(Pf,f,e,d,a,b,this)}else for(c=c.vertices,f=0,g=c.length;f<g;f++)lg(c[f],f,e,d,a,b,this)},updateMorphTargets:function(){var a=this.geometry;if(a.isBufferGeometry){a=a.morphAttributes;var b=Object.keys(a);if(0<b.length){var c=a[b[0]];if(void 0!==
+c)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++){var d=c[a].name||String(a);this.morphTargetInfluences.push(0);this.morphTargetDictionary[d]=a}}}else a=a.morphTargets,void 0!==a&&0<a.length&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});ng.prototype=Object.assign(Object.create(W.prototype),{constructor:ng,
+isVideoTexture:!0,update:function(){var a=this.image;a.readyState>=a.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}});Oc.prototype=Object.create(W.prototype);Oc.prototype.constructor=Oc;Oc.prototype.isCompressedTexture=!0;Od.prototype=Object.create(W.prototype);Od.prototype.constructor=Od;Od.prototype.isCanvasTexture=!0;Pd.prototype=Object.create(W.prototype);Pd.prototype.constructor=Pd;Pd.prototype.isDepthTexture=!0;Pc.prototype=Object.create(F.prototype);Pc.prototype.constructor=Pc;Qd.prototype=Object.create(L.prototype);
+Qd.prototype.constructor=Qd;Qc.prototype=Object.create(F.prototype);Qc.prototype.constructor=Qc;Rd.prototype=Object.create(L.prototype);Rd.prototype.constructor=Rd;Ga.prototype=Object.create(F.prototype);Ga.prototype.constructor=Ga;Sd.prototype=Object.create(L.prototype);Sd.prototype.constructor=Sd;Rc.prototype=Object.create(Ga.prototype);Rc.prototype.constructor=Rc;Td.prototype=Object.create(L.prototype);Td.prototype.constructor=Td;bc.prototype=Object.create(Ga.prototype);bc.prototype.constructor=
+bc;Ud.prototype=Object.create(L.prototype);Ud.prototype.constructor=Ud;Sc.prototype=Object.create(Ga.prototype);Sc.prototype.constructor=Sc;Vd.prototype=Object.create(L.prototype);Vd.prototype.constructor=Vd;Tc.prototype=Object.create(Ga.prototype);Tc.prototype.constructor=Tc;Wd.prototype=Object.create(L.prototype);Wd.prototype.constructor=Wd;cc.prototype=Object.create(F.prototype);cc.prototype.constructor=cc;cc.prototype.toJSON=function(){var a=F.prototype.toJSON.call(this);a.path=this.parameters.path.toJSON();
+return a};Xd.prototype=Object.create(L.prototype);Xd.prototype.constructor=Xd;Uc.prototype=Object.create(F.prototype);Uc.prototype.constructor=Uc;Yd.prototype=Object.create(L.prototype);Yd.prototype.constructor=Yd;Vc.prototype=Object.create(F.prototype);Vc.prototype.constructor=Vc;var Rk={triangulate:function(a,b,c){c=c||2;var d=b&&b.length,e=d?b[0]*c:a.length,f=Xh(a,0,e,c,!0),g=[];if(!f||f.next===f.prev)return g;var h;if(d){var l=c;d=[];var m;var k=0;for(m=b.length;k<m;k++){var n=b[k]*l;var p=k<
+m-1?b[k+1]*l:a.length;n=Xh(a,n,p,l,!1);n===n.next&&(n.steiner=!0);d.push(Dk(n))}d.sort(Bk);for(k=0;k<d.length;k++){l=d[k];b=f;if(b=Ck(l,b))l=$h(b,l),Lb(b,b.next),Lb(l,l.next);f=Lb(f,f.next)}}if(a.length>80*c){var r=h=a[0];var q=d=a[1];for(l=c;l<e;l+=c)k=a[l],b=a[l+1],k<r&&(r=k),b<q&&(q=b),k>h&&(h=k),b>d&&(d=b);h=Math.max(h-r,d-q);h=0!==h?1/h:0}$d(f,g,c,r,q,h);return g}},sb={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;e<b;d=e++)c+=a[d].x*a[e].y-a[e].x*a[d].y;return.5*c},isClockWise:function(a){return 0>
+sb.area(a)},triangulateShape:function(a,b){var c=[],d=[],e=[];ai(a);bi(c,a);var f=a.length;b.forEach(ai);for(a=0;a<b.length;a++)d.push(f),f+=b[a].length,bi(c,b[a]);b=Rk.triangulate(c,d);for(a=0;a<b.length;a+=3)e.push(b.slice(a,a+3));return e}};dc.prototype=Object.create(L.prototype);dc.prototype.constructor=dc;dc.prototype.toJSON=function(){var a=L.prototype.toJSON.call(this);return ci(this.parameters.shapes,this.parameters.options,a)};hb.prototype=Object.create(F.prototype);hb.prototype.constructor=
+hb;hb.prototype.toJSON=function(){var a=F.prototype.toJSON.call(this);return ci(this.parameters.shapes,this.parameters.options,a)};var Ek={generateTopUV:function(a,b,c,d,e){a=b[3*d];d=b[3*d+1];var f=b[3*e];e=b[3*e+1];return[new v(b[3*c],b[3*c+1]),new v(a,d),new v(f,e)]},generateSideWallUV:function(a,b,c,d,e,f){a=b[3*c];var g=b[3*c+1];c=b[3*c+2];var h=b[3*d],l=b[3*d+1];d=b[3*d+2];var k=b[3*e],p=b[3*e+1];e=b[3*e+2];var n=b[3*f],t=b[3*f+1];b=b[3*f+2];return.01>Math.abs(g-l)?[new v(a,1-c),new v(h,1-d),
+new v(k,1-e),new v(n,1-b)]:[new v(g,1-c),new v(l,1-d),new v(p,1-e),new v(t,1-b)]}};be.prototype=Object.create(L.prototype);be.prototype.constructor=be;Xc.prototype=Object.create(hb.prototype);Xc.prototype.constructor=Xc;ce.prototype=Object.create(L.prototype);ce.prototype.constructor=ce;ec.prototype=Object.create(F.prototype);ec.prototype.constructor=ec;de.prototype=Object.create(L.prototype);de.prototype.constructor=de;Yc.prototype=Object.create(F.prototype);Yc.prototype.constructor=Yc;ee.prototype=
+Object.create(L.prototype);ee.prototype.constructor=ee;Zc.prototype=Object.create(F.prototype);Zc.prototype.constructor=Zc;fc.prototype=Object.create(L.prototype);fc.prototype.constructor=fc;fc.prototype.toJSON=function(){var a=L.prototype.toJSON.call(this);return di(this.parameters.shapes,a)};gc.prototype=Object.create(F.prototype);gc.prototype.constructor=gc;gc.prototype.toJSON=function(){var a=F.prototype.toJSON.call(this);return di(this.parameters.shapes,a)};$c.prototype=Object.create(F.prototype);
+$c.prototype.constructor=$c;hc.prototype=Object.create(L.prototype);hc.prototype.constructor=hc;tb.prototype=Object.create(F.prototype);tb.prototype.constructor=tb;fe.prototype=Object.create(hc.prototype);fe.prototype.constructor=fe;ge.prototype=Object.create(tb.prototype);ge.prototype.constructor=ge;he.prototype=Object.create(L.prototype);he.prototype.constructor=he;ad.prototype=Object.create(F.prototype);ad.prototype.constructor=ad;var ra=Object.freeze({__proto__:null,WireframeGeometry:Pc,ParametricGeometry:Qd,
+ParametricBufferGeometry:Qc,TetrahedronGeometry:Sd,TetrahedronBufferGeometry:Rc,OctahedronGeometry:Td,OctahedronBufferGeometry:bc,IcosahedronGeometry:Ud,IcosahedronBufferGeometry:Sc,DodecahedronGeometry:Vd,DodecahedronBufferGeometry:Tc,PolyhedronGeometry:Rd,PolyhedronBufferGeometry:Ga,TubeGeometry:Wd,TubeBufferGeometry:cc,TorusKnotGeometry:Xd,TorusKnotBufferGeometry:Uc,TorusGeometry:Yd,TorusBufferGeometry:Vc,TextGeometry:be,TextBufferGeometry:Xc,SphereGeometry:ce,SphereBufferGeometry:ec,RingGeometry:de,
+RingBufferGeometry:Yc,PlaneGeometry:Fd,PlaneBufferGeometry:ac,LatheGeometry:ee,LatheBufferGeometry:Zc,ShapeGeometry:fc,ShapeBufferGeometry:gc,ExtrudeGeometry:dc,ExtrudeBufferGeometry:hb,EdgesGeometry:$c,ConeGeometry:fe,ConeBufferGeometry:ge,CylinderGeometry:hc,CylinderBufferGeometry:tb,CircleGeometry:he,CircleBufferGeometry:ad,BoxGeometry:fh,BoxBufferGeometry:Gd});ic.prototype=Object.create(K.prototype);ic.prototype.constructor=ic;ic.prototype.isShadowMaterial=!0;ic.prototype.copy=function(a){K.prototype.copy.call(this,
+a);this.color.copy(a.color);return this};ub.prototype=Object.create(Ca.prototype);ub.prototype.constructor=ub;ub.prototype.isRawShaderMaterial=!0;ib.prototype=Object.create(K.prototype);ib.prototype.constructor=ib;ib.prototype.isMeshStandardMaterial=!0;ib.prototype.copy=function(a){K.prototype.copy.call(this,a);this.defines={STANDARD:""};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;
+this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap;this.metalnessMap=a.metalnessMap;this.alphaMap=
+a.alphaMap;this.envMap=a.envMap;this.envMapIntensity=a.envMapIntensity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;this.vertexTangents=a.vertexTangents;return this};jc.prototype=Object.create(ib.prototype);jc.prototype.constructor=jc;jc.prototype.isMeshPhysicalMaterial=
+!0;jc.prototype.copy=function(a){ib.prototype.copy.call(this,a);this.defines={STANDARD:"",PHYSICAL:""};this.clearcoat=a.clearcoat;this.clearcoatMap=a.clearcoatMap;this.clearcoatRoughness=a.clearcoatRoughness;this.clearcoatRoughnessMap=a.clearcoatRoughnessMap;this.clearcoatNormalMap=a.clearcoatNormalMap;this.clearcoatNormalScale.copy(a.clearcoatNormalScale);this.reflectivity=a.reflectivity;this.sheen=a.sheen?(this.sheen||new D).copy(a.sheen):null;this.transparency=a.transparency;return this};Mb.prototype=
+Object.create(K.prototype);Mb.prototype.constructor=Mb;Mb.prototype.isMeshPhongMaterial=!0;Mb.prototype.copy=function(a){K.prototype.copy.call(this,a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;
+this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=
+a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};kc.prototype=Object.create(K.prototype);kc.prototype.constructor=kc;kc.prototype.isMeshToonMaterial=!0;kc.prototype.copy=function(a){K.prototype.copy.call(this,a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.gradientMap=a.gradientMap;this.lightMap=a.lightMap;this.lightMapIntensity=
+a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;
+this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};lc.prototype=Object.create(K.prototype);lc.prototype.constructor=lc;lc.prototype.isMeshNormalMaterial=!0;lc.prototype.copy=function(a){K.prototype.copy.call(this,a);this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;
+this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};mc.prototype=Object.create(K.prototype);mc.prototype.constructor=mc;mc.prototype.isMeshLambertMaterial=!0;mc.prototype.copy=function(a){K.prototype.copy.call(this,
+a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;
+this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};nc.prototype=Object.create(K.prototype);nc.prototype.constructor=nc;nc.prototype.isMeshMatcapMaterial=!0;nc.prototype.copy=function(a){K.prototype.copy.call(this,a);this.defines={MATCAP:""};this.color.copy(a.color);this.matcap=a.matcap;this.map=a.map;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=
+a.normalMap;this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.alphaMap=a.alphaMap;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};oc.prototype=Object.create(da.prototype);oc.prototype.constructor=oc;oc.prototype.isLineDashedMaterial=!0;oc.prototype.copy=function(a){da.prototype.copy.call(this,a);
+this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var Sk=Object.freeze({__proto__:null,ShadowMaterial:ic,SpriteMaterial:Kb,RawShaderMaterial:ub,ShaderMaterial:Ca,PointsMaterial:Xa,MeshPhysicalMaterial:jc,MeshStandardMaterial:ib,MeshPhongMaterial:Mb,MeshToonMaterial:kc,MeshNormalMaterial:lc,MeshLambertMaterial:mc,MeshDepthMaterial:Hb,MeshDistanceMaterial:Ib,MeshBasicMaterial:Pa,MeshMatcapMaterial:nc,LineDashedMaterial:oc,LineBasicMaterial:da,Material:K}),ka={arraySlice:function(a,
+b,c){return ka.isTypedArray(a)?new a.constructor(a.subarray(b,void 0!==c?c:a.length)):a.slice(b,c)},convertArray:function(a,b,c){return!a||!c&&a.constructor===b?a:"number"===typeof b.BYTES_PER_ELEMENT?new b(a):Array.prototype.slice.call(a)},isTypedArray:function(a){return ArrayBuffer.isView(a)&&!(a instanceof DataView)},getKeyframeOrder:function(a){for(var b=a.length,c=Array(b),d=0;d!==b;++d)c[d]=d;c.sort(function(b,c){return a[b]-a[c]});return c},sortedArray:function(a,b,c){for(var d=a.length,e=
+new a.constructor(d),f=0,g=0;g!==d;++f)for(var h=c[f]*b,l=0;l!==b;++l)e[g++]=a[h+l];return e},flattenJSON:function(a,b,c,d){for(var e=1,f=a[0];void 0!==f&&void 0===f[d];)f=a[e++];if(void 0!==f){var g=f[d];if(void 0!==g)if(Array.isArray(g)){do g=f[d],void 0!==g&&(b.push(f.time),c.push.apply(c,g)),f=a[e++];while(void 0!==f)}else if(void 0!==g.toArray){do g=f[d],void 0!==g&&(b.push(f.time),g.toArray(c,c.length)),f=a[e++];while(void 0!==f)}else{do g=f[d],void 0!==g&&(b.push(f.time),c.push(g)),f=a[e++];
+while(void 0!==f)}}},subclip:function(a,b,c,d,e){e=e||30;a=a.clone();a.name=b;var f=[];for(b=0;b<a.tracks.length;++b){for(var g=a.tracks[b],h=g.getValueSize(),l=[],k=[],p=0;p<g.times.length;++p){var n=g.times[p]*e;if(!(n<c||n>=d))for(l.push(g.times[p]),n=0;n<h;++n)k.push(g.values[p*h+n])}0!==l.length&&(g.times=ka.convertArray(l,g.times.constructor),g.values=ka.convertArray(k,g.values.constructor),f.push(g))}a.tracks=f;c=Infinity;for(b=0;b<a.tracks.length;++b)c>a.tracks[b].times[0]&&(c=a.tracks[b].times[0]);
+for(b=0;b<a.tracks.length;++b)a.tracks[b].shift(-1*c);a.resetDuration();return a},makeClipAdditive:function(a,b,c,d){void 0===b&&(b=0);void 0===c&&(c=a);if(void 0===d||0>=d)d=30;var e=a.tracks.length;b/=d;for(d=0;d<e;++d){var f=c.tracks[d],g=f.ValueTypeName;if("bool"!==g&&"string"!==g){var h=a.tracks.find(function(a){return a.name===f.name&&a.ValueTypeName===g});if(void 0!==h){var l=f.getValueSize(),k=f.times.length-1;b<=f.times[0]?k=ka.arraySlice(f.values,0,f.valueSize):b>=f.times[k]?k=ka.arraySlice(f.values,
+k*l):(k=f.createInterpolant(),k.evaluate(b),k=k.resultBuffer);"quaternion"===g&&(new va(k[0],k[1],k[2],k[3])).normalize().conjugate().toArray(k);for(var p=h.times.length,n=0;n<p;++n){var t=n*l;if("quaternion"===g)va.multiplyQuaternionsFlat(h.values,t,k,0,h.values,t);else for(var r=0;r<l;++r)h.values[t+r]-=k[r]}}}}a.blendMode=2501;return a}};Object.assign(Ma.prototype,{evaluate:function(a){var b=this.parameterPositions,c=this._cachedIndex,d=b[c],e=b[c-1];a:{b:{c:{d:if(!(a<d)){for(var f=c+2;;){if(void 0===
+d){if(a<e)break d;this._cachedIndex=c=b.length;return this.afterEnd_(c-1,a,e)}if(c===f)break;e=d;d=b[++c];if(a<d)break b}d=b.length;break c}if(a>=e)break a;else{f=b[1];a<f&&(c=2,e=f);for(f=c-2;;){if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(c===f)break;d=e;e=b[--c-1];if(a>=e)break b}d=c;c=0}}for(;c<d;)e=c+d>>>1,a<b[e]?d=e:c=e+1;d=b[c];e=b[c-1];if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(void 0===d)return this._cachedIndex=c=b.length,this.afterEnd_(c-
+1,e,a)}this._cachedIndex=c;this.intervalChanged_(c,e,d)}return this.interpolate_(c,e,a,d)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||this.DefaultSettings_},copySampleValue_:function(a){var b=this.resultBuffer,c=this.sampleValues,d=this.valueSize;a*=d;for(var e=0;e!==d;++e)b[e]=c[a+e];return b},interpolate_:function(){throw Error("call to abstract method");},intervalChanged_:function(){}});Object.assign(Ma.prototype,{beforeStart_:Ma.prototype.copySampleValue_,
+afterEnd_:Ma.prototype.copySampleValue_});Xe.prototype=Object.assign(Object.create(Ma.prototype),{constructor:Xe,DefaultSettings_:{endingStart:2400,endingEnd:2400},intervalChanged_:function(a,b,c){var d=this.parameterPositions,e=a-2,f=a+1,g=d[e],h=d[f];if(void 0===g)switch(this.getSettings_().endingStart){case 2401:e=a;g=2*b-c;break;case 2402:e=d.length-2;g=b+d[e]-d[e+1];break;default:e=a,g=c}if(void 0===h)switch(this.getSettings_().endingEnd){case 2401:f=a;h=2*c-b;break;case 2402:f=1;h=c+d[1]-d[0];
+break;default:f=a-1,h=b}a=.5*(c-b);d=this.valueSize;this._weightPrev=a/(b-g);this._weightNext=a/(h-c);this._offsetPrev=e*d;this._offsetNext=f*d},interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g,l=this._offsetPrev,k=this._offsetNext,p=this._weightPrev,n=this._weightNext,t=(c-b)/(d-b);c=t*t;d=c*t;b=-p*d+2*p*c-p*t;p=(1+p)*d+(-1.5-2*p)*c+(-.5+p)*t+1;t=(-1-n)*d+(1.5+n)*c+.5*t;n=n*d-n*c;for(c=0;c!==g;++c)e[c]=b*f[l+c]+p*f[h+c]+t*f[a+c]+n*f[k+c];
+return e}});ie.prototype=Object.assign(Object.create(Ma.prototype),{constructor:ie,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g;b=(c-b)/(d-b);c=1-b;for(d=0;d!==g;++d)e[d]=f[h+d]*c+f[a+d]*b;return e}});Ye.prototype=Object.assign(Object.create(Ma.prototype),{constructor:Ye,interpolate_:function(a){return this.copySampleValue_(a-1)}});Object.assign(ta,{toJSON:function(a){var b=a.constructor;if(void 0!==b.toJSON)b=b.toJSON(a);else{b={name:a.name,
+times:ka.convertArray(a.times,Array),values:ka.convertArray(a.values,Array)};var c=a.getInterpolation();c!==a.DefaultInterpolation&&(b.interpolation=c)}b.type=a.ValueTypeName;return b}});Object.assign(ta.prototype,{constructor:ta,TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(a){return new Ye(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodLinear:function(a){return new ie(this.times,this.values,this.getValueSize(),
+a)},InterpolantFactoryMethodSmooth:function(a){return new Xe(this.times,this.values,this.getValueSize(),a)},setInterpolation:function(a){switch(a){case 2300:var b=this.InterpolantFactoryMethodDiscrete;break;case 2301:b=this.InterpolantFactoryMethodLinear;break;case 2302:b=this.InterpolantFactoryMethodSmooth}if(void 0===b){b="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant)if(a!==this.DefaultInterpolation)this.setInterpolation(this.DefaultInterpolation);
+else throw Error(b);console.warn("THREE.KeyframeTrack:",b);return this}this.createInterpolant=b;return this},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return 2300;case this.InterpolantFactoryMethodLinear:return 2301;case this.InterpolantFactoryMethodSmooth:return 2302}},getValueSize:function(){return this.values.length/this.times.length},shift:function(a){if(0!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]+=a;return this},scale:function(a){if(1!==
+a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]*=a;return this},trim:function(a,b){for(var c=this.times,d=c.length,e=0,f=d-1;e!==d&&c[e]<a;)++e;for(;-1!==f&&c[f]>b;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),a=this.getValueSize(),this.times=ka.arraySlice(c,e,f),this.values=ka.arraySlice(this.values,e*a,f*a);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),a=!1);var c=this.times;
+b=this.values;var d=c.length;0===d&&(console.error("THREE.KeyframeTrack: Track is empty.",this),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if("number"===typeof g&&isNaN(g)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,f,g);a=!1;break}if(null!==e&&e>g){console.error("THREE.KeyframeTrack: Out of order keys.",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&ka.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error("THREE.KeyframeTrack: Value is not a valid number.",
+this,f,d);a=!1;break}return a},optimize:function(){for(var a=ka.arraySlice(this.times),b=ka.arraySlice(this.values),c=this.getValueSize(),d=2302===this.getInterpolation(),e=1,f=a.length-1,g=1;g<f;++g){var h=!1,l=a[g];if(l!==a[g+1]&&(1!==g||l!==l[0]))if(d)h=!0;else{var k=g*c,p=k-c,n=k+c;for(l=0;l!==c;++l){var t=b[k+l];if(t!==b[p+l]||t!==b[n+l]){h=!0;break}}}if(h){if(g!==e)for(a[e]=a[g],h=g*c,k=e*c,l=0;l!==c;++l)b[k+l]=b[h+l];++e}}if(0<f){a[e]=a[f];h=f*c;k=e*c;for(l=0;l!==c;++l)b[k+l]=b[h+l];++e}e!==
+a.length?(this.times=ka.arraySlice(a,0,e),this.values=ka.arraySlice(b,0,e*c)):(this.times=a,this.values=b);return this},clone:function(){var a=ka.arraySlice(this.times,0),b=ka.arraySlice(this.values,0);a=new this.constructor(this.name,a,b);a.createInterpolant=this.createInterpolant;return a}});Ze.prototype=Object.assign(Object.create(ta.prototype),{constructor:Ze,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});
+$e.prototype=Object.assign(Object.create(ta.prototype),{constructor:$e,ValueTypeName:"color"});bd.prototype=Object.assign(Object.create(ta.prototype),{constructor:bd,ValueTypeName:"number"});af.prototype=Object.assign(Object.create(Ma.prototype),{constructor:af,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;b=(c-b)/(d-b);for(c=a+g;a!==c;a+=4)va.slerpFlat(e,0,f,a-g,f,a,b);return e}});je.prototype=Object.assign(Object.create(ta.prototype),{constructor:je,
+ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(a){return new af(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:void 0});bf.prototype=Object.assign(Object.create(ta.prototype),{constructor:bf,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});cd.prototype=Object.assign(Object.create(ta.prototype),{constructor:cd,ValueTypeName:"vector"});
+Object.assign(Sa,{parse:function(a){for(var b=[],c=a.tracks,d=1/(a.fps||1),e=0,f=c.length;e!==f;++e)b.push(Gk(c[e]).scale(d));return new Sa(a.name,a.duration,b,a.blendMode)},toJSON:function(a){var b=[],c=a.tracks;a={name:a.name,duration:a.duration,tracks:b,uuid:a.uuid,blendMode:a.blendMode};for(var d=0,e=c.length;d!==e;++d)b.push(ta.toJSON(c[d]));return a},CreateFromMorphTargetSequence:function(a,b,c,d){for(var e=b.length,f=[],g=0;g<e;g++){var h=[],l=[];h.push((g+e-1)%e,g,(g+1)%e);l.push(0,1,0);var k=
+ka.getKeyframeOrder(h);h=ka.sortedArray(h,1,k);l=ka.sortedArray(l,1,k);d||0!==h[0]||(h.push(e),l.push(l[0]));f.push((new bd(".morphTargetInfluences["+b[g].name+"]",h,l)).scale(1/c))}return new Sa(a,-1,f)},findByName:function(a,b){var c=a;Array.isArray(a)||(c=a.geometry&&a.geometry.animations||a.animations);for(a=0;a<c.length;a++)if(c[a].name===b)return c[a];return null},CreateClipsFromMorphTargetSequences:function(a,b,c){for(var d={},e=/^([\w-]*?)([\d]+)$/,f=0,g=a.length;f<g;f++){var h=a[f],l=h.name.match(e);
+if(l&&1<l.length){var k=l[1];(l=d[k])||(d[k]=l=[]);l.push(h)}}a=[];for(k in d)a.push(Sa.CreateFromMorphTargetSequence(k,d[k],b,c));return a},parseAnimation:function(a,b){if(!a)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;var c=function(a,b,c,d,e){if(0!==c.length){var f=[],g=[];ka.flattenJSON(c,f,g,d);0!==f.length&&e.push(new a(b,f,g))}},d=[],e=a.name||"default",f=a.length||-1,g=a.fps||30,h=a.blendMode;a=a.hierarchy||[];for(var l=0;l<a.length;l++){var k=a[l].keys;
+if(k&&0!==k.length)if(k[0].morphTargets){f={};for(var p=0;p<k.length;p++)if(k[p].morphTargets)for(var n=0;n<k[p].morphTargets.length;n++)f[k[p].morphTargets[n]]=-1;for(var t in f){var r=[],q=[];for(n=0;n!==k[p].morphTargets.length;++n){var u=k[p];r.push(u.time);q.push(u.morphTarget===t?1:0)}d.push(new bd(".morphTargetInfluence["+t+"]",r,q))}f=f.length*(g||1)}else p=".bones["+b[l].name+"]",c(cd,p+".position",k,"pos",d),c(je,p+".quaternion",k,"rot",d),c(cd,p+".scale",k,"scl",d)}return 0===d.length?
+null:new Sa(e,f,d,h)}});Object.assign(Sa.prototype,{resetDuration:function(){for(var a=0,b=0,c=this.tracks.length;b!==c;++b){var d=this.tracks[b];a=Math.max(a,d.times[d.times.length-1])}this.duration=a;return this},trim:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].trim(0,this.duration);return this},validate:function(){for(var a=!0,b=0;b<this.tracks.length;b++)a=a&&this.tracks[b].validate();return a},optimize:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].optimize();
+return this},clone:function(){for(var a=[],b=0;b<this.tracks.length;b++)a.push(this.tracks[b].clone());return new Sa(this.name,this.duration,a,this.blendMode)}});var tc={enabled:!1,files:{},add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}},ei=new qg;Object.assign(V.prototype,{load:function(){},loadAsync:function(a,b){var c=this;return new Promise(function(d,e){c.load(a,
+d,b,e)})},parse:function(){},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this},setResourcePath:function(a){this.resourcePath=a;return this},setRequestHeader:function(a){this.requestHeader=a;return this}});var db={};Ta.prototype=Object.assign(Object.create(V.prototype),{constructor:Ta,load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=tc.get(a);if(void 0!==f)return e.manager.itemStart(a),
+setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;if(void 0!==db[a])db[a].push({onLoad:b,onProgress:c,onError:d});else{var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){c=g[1];var h=!!g[2];g=g[3];g=decodeURIComponent(g);h&&(g=atob(g));try{var l=(this.responseType||"").toLowerCase();switch(l){case "arraybuffer":case "blob":var k=new Uint8Array(g.length);for(h=0;h<g.length;h++)k[h]=g.charCodeAt(h);var p="blob"===l?new Blob([k.buffer],{type:c}):k.buffer;break;case "document":p=(new DOMParser).parseFromString(g,
+c);break;case "json":p=JSON.parse(g);break;default:p=g}setTimeout(function(){b&&b(p);e.manager.itemEnd(a)},0)}catch(t){setTimeout(function(){d&&d(t);e.manager.itemError(a);e.manager.itemEnd(a)},0)}}else{db[a]=[];db[a].push({onLoad:b,onProgress:c,onError:d});var n=new XMLHttpRequest;n.open("GET",a,!0);n.addEventListener("load",function(b){var c=this.response,d=db[a];delete db[a];if(200===this.status||0===this.status){0===this.status&&console.warn("THREE.FileLoader: HTTP Status 0 received.");tc.add(a,
+c);for(var f=0,g=d.length;f<g;f++){var h=d[f];if(h.onLoad)h.onLoad(c)}}else{f=0;for(g=d.length;f<g;f++)if(h=d[f],h.onError)h.onError(b);e.manager.itemError(a)}e.manager.itemEnd(a)},!1);n.addEventListener("progress",function(b){for(var c=db[a],d=0,e=c.length;d<e;d++){var f=c[d];if(f.onProgress)f.onProgress(b)}},!1);n.addEventListener("error",function(b){var c=db[a];delete db[a];for(var d=0,f=c.length;d<f;d++){var g=c[d];if(g.onError)g.onError(b)}e.manager.itemError(a);e.manager.itemEnd(a)},!1);n.addEventListener("abort",
+function(b){var c=db[a];delete db[a];for(var d=0,f=c.length;d<f;d++){var g=c[d];if(g.onError)g.onError(b)}e.manager.itemError(a);e.manager.itemEnd(a)},!1);void 0!==this.responseType&&(n.responseType=this.responseType);void 0!==this.withCredentials&&(n.withCredentials=this.withCredentials);n.overrideMimeType&&n.overrideMimeType(void 0!==this.mimeType?this.mimeType:"text/plain");for(h in this.requestHeader)n.setRequestHeader(h,this.requestHeader[h]);n.send(null)}e.manager.itemStart(a);return n}},setResponseType:function(a){this.responseType=
+a;return this},setWithCredentials:function(a){this.withCredentials=a;return this},setMimeType:function(a){this.mimeType=a;return this}});rg.prototype=Object.assign(Object.create(V.prototype),{constructor:rg,load:function(a,b,c,d){var e=this,f=new Ta(e.manager);f.setPath(e.path);f.load(a,function(c){try{b(e.parse(JSON.parse(c)))}catch(h){d?d(h):console.error(h),e.manager.itemError(a)}},c,d)},parse:function(a){for(var b=[],c=0;c<a.length;c++){var d=Sa.parse(a[c]);b.push(d)}return b}});sg.prototype=
+Object.assign(Object.create(V.prototype),{constructor:sg,load:function(a,b,c,d){function e(e){l.load(a[e],function(a){a=f.parse(a,!0);g[e]={width:a.width,height:a.height,format:a.format,mipmaps:a.mipmaps};k+=1;6===k&&(1===a.mipmapCount&&(h.minFilter=1006),h.format=a.format,h.needsUpdate=!0,b&&b(h))},c,d)}var f=this,g=[],h=new Oc;h.image=g;var l=new Ta(this.manager);l.setPath(this.path);l.setResponseType("arraybuffer");if(Array.isArray(a))for(var k=0,p=0,n=a.length;p<n;++p)e(p);else l.load(a,function(a){a=
+f.parse(a,!0);if(a.isCubemap)for(var c=a.mipmaps.length/a.mipmapCount,d=0;d<c;d++){g[d]={mipmaps:[]};for(var e=0;e<a.mipmapCount;e++)g[d].mipmaps.push(a.mipmaps[d*a.mipmapCount+e]),g[d].format=a.format,g[d].width=a.width,g[d].height=a.height}else h.image.width=a.width,h.image.height=a.height,h.mipmaps=a.mipmaps;1===a.mipmapCount&&(h.minFilter=1006);h.format=a.format;h.needsUpdate=!0;b&&b(h)},c,d);return h}});cf.prototype=Object.assign(Object.create(V.prototype),{constructor:cf,load:function(a,b,c,
+d){var e=this,f=new $b,g=new Ta(this.manager);g.setResponseType("arraybuffer");g.setPath(this.path);g.load(a,function(a){if(a=e.parse(a))void 0!==a.image?f.image=a.image:void 0!==a.data&&(f.image.width=a.width,f.image.height=a.height,f.image.data=a.data),f.wrapS=void 0!==a.wrapS?a.wrapS:1001,f.wrapT=void 0!==a.wrapT?a.wrapT:1001,f.magFilter=void 0!==a.magFilter?a.magFilter:1006,f.minFilter=void 0!==a.minFilter?a.minFilter:1006,f.anisotropy=void 0!==a.anisotropy?a.anisotropy:1,void 0!==a.format&&(f.format=
+a.format),void 0!==a.type&&(f.type=a.type),void 0!==a.mipmaps&&(f.mipmaps=a.mipmaps,f.minFilter=1008),1===a.mipmapCount&&(f.minFilter=1006),f.needsUpdate=!0,b&&b(f,a)},c,d);return f}});dd.prototype=Object.assign(Object.create(V.prototype),{constructor:dd,load:function(a,b,c,d){function e(){l.removeEventListener("load",e,!1);l.removeEventListener("error",f,!1);tc.add(a,this);b&&b(this);g.manager.itemEnd(a)}function f(b){l.removeEventListener("load",e,!1);l.removeEventListener("error",f,!1);d&&d(b);
+g.manager.itemError(a);g.manager.itemEnd(a)}void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var g=this,h=tc.get(a);if(void 0!==h)return g.manager.itemStart(a),setTimeout(function(){b&&b(h);g.manager.itemEnd(a)},0),h;var l=document.createElementNS("http://www.w3.org/1999/xhtml","img");l.addEventListener("load",e,!1);l.addEventListener("error",f,!1);"data:"!==a.substr(0,5)&&void 0!==this.crossOrigin&&(l.crossOrigin=this.crossOrigin);g.manager.itemStart(a);l.src=a;return l}});df.prototype=
+Object.assign(Object.create(V.prototype),{constructor:df,load:function(a,b,c,d){function e(c){g.load(a[c],function(a){f.images[c]=a;h++;6===h&&(f.needsUpdate=!0,b&&b(f))},void 0,d)}var f=new qb,g=new dd(this.manager);g.setCrossOrigin(this.crossOrigin);g.setPath(this.path);var h=0;for(c=0;c<a.length;++c)e(c);return f}});ef.prototype=Object.assign(Object.create(V.prototype),{constructor:ef,load:function(a,b,c,d){var e=new W,f=new dd(this.manager);f.setCrossOrigin(this.crossOrigin);f.setPath(this.path);
+f.load(a,function(c){e.image=c;c=0<a.search(/\.jpe?g($|\?)/i)||0===a.search(/^data:image\/jpeg/);e.format=c?1022:1023;e.needsUpdate=!0;void 0!==b&&b(e)},c,d);return e}});Object.assign(H.prototype,{getPoint:function(){console.warn("THREE.Curve: .getPoint() not implemented.");return null},getPointAt:function(a,b){a=this.getUtoTmapping(a);return this.getPoint(a,b)},getPoints:function(a){void 0===a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));return b},getSpacedPoints:function(a){void 0===
+a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPointAt(c/a));return b},getLength:function(){var a=this.getLengths();return a[a.length-1]},getLengths:function(a){void 0===a&&(a=this.arcLengthDivisions);if(this.cacheArcLengths&&this.cacheArcLengths.length===a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var b=[],c=this.getPoint(0),d,e=0;b.push(0);for(d=1;d<=a;d++){var f=this.getPoint(d/a);e+=f.distanceTo(c);b.push(e);c=f}return this.cacheArcLengths=b},updateArcLengths:function(){this.needsUpdate=
+!0;this.getLengths()},getUtoTmapping:function(a,b){var c=this.getLengths(),d=c.length;b=b?b:a*c[d-1];for(var e=0,f=d-1,g;e<=f;)if(a=Math.floor(e+(f-e)/2),g=c[a]-b,0>g)e=a+1;else if(0<g)f=a-1;else{f=a;break}a=f;if(c[a]===b)return a/(d-1);e=c[a];return(a+(b-e)/(c[a+1]-e))/(d-1)},getTangent:function(a,b){var c=a-1E-4;a+=1E-4;0>c&&(c=0);1<a&&(a=1);c=this.getPoint(c);a=this.getPoint(a);b=b||(c.isVector2?new v:new p);b.copy(a).sub(c).normalize();return b},getTangentAt:function(a,b){a=this.getUtoTmapping(a);
+return this.getTangent(a,b)},computeFrenetFrames:function(a,b){var c=new p,d=[],e=[],f=[],g=new p,h=new N,l;for(l=0;l<=a;l++){var k=l/a;d[l]=this.getTangentAt(k,new p);d[l].normalize()}e[0]=new p;f[0]=new p;l=Number.MAX_VALUE;k=Math.abs(d[0].x);var v=Math.abs(d[0].y),n=Math.abs(d[0].z);k<=l&&(l=k,c.set(1,0,0));v<=l&&(l=v,c.set(0,1,0));n<=l&&c.set(0,0,1);g.crossVectors(d[0],c).normalize();e[0].crossVectors(d[0],g);f[0].crossVectors(d[0],e[0]);for(l=1;l<=a;l++)e[l]=e[l-1].clone(),f[l]=f[l-1].clone(),
+g.crossVectors(d[l-1],d[l]),g.length()>Number.EPSILON&&(g.normalize(),c=Math.acos(O.clamp(d[l-1].dot(d[l]),-1,1)),e[l].applyMatrix4(h.makeRotationAxis(g,c))),f[l].crossVectors(d[l],e[l]);if(!0===b)for(c=Math.acos(O.clamp(e[0].dot(e[a]),-1,1)),c/=a,0<d[0].dot(g.crossVectors(e[0],e[a]))&&(c=-c),l=1;l<=a;l++)e[l].applyMatrix4(h.makeRotationAxis(d[l],c*l)),f[l].crossVectors(d[l],e[l]);return{tangents:d,normals:e,binormals:f}},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.arcLengthDivisions=
+a.arcLengthDivisions;return this},toJSON:function(){var a={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};a.arcLengthDivisions=this.arcLengthDivisions;a.type=this.type;return a},fromJSON:function(a){this.arcLengthDivisions=a.arcLengthDivisions;return this}});Na.prototype=Object.create(H.prototype);Na.prototype.constructor=Na;Na.prototype.isEllipseCurve=!0;Na.prototype.getPoint=function(a,b){b=b||new v;for(var c=2*Math.PI,d=this.aEndAngle-this.aStartAngle,e=Math.abs(d)<Number.EPSILON;0>
+d;)d+=c;for(;d>c;)d-=c;d<Number.EPSILON&&(d=e?0:c);!0!==this.aClockwise||e||(d=d===c?-c:d-c);c=this.aStartAngle+a*d;a=this.aX+this.xRadius*Math.cos(c);var f=this.aY+this.yRadius*Math.sin(c);0!==this.aRotation&&(c=Math.cos(this.aRotation),d=Math.sin(this.aRotation),e=a-this.aX,f-=this.aY,a=e*c-f*d+this.aX,f=e*d+f*c+this.aY);return b.set(a,f)};Na.prototype.copy=function(a){H.prototype.copy.call(this,a);this.aX=a.aX;this.aY=a.aY;this.xRadius=a.xRadius;this.yRadius=a.yRadius;this.aStartAngle=a.aStartAngle;
+this.aEndAngle=a.aEndAngle;this.aClockwise=a.aClockwise;this.aRotation=a.aRotation;return this};Na.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.aX=this.aX;a.aY=this.aY;a.xRadius=this.xRadius;a.yRadius=this.yRadius;a.aStartAngle=this.aStartAngle;a.aEndAngle=this.aEndAngle;a.aClockwise=this.aClockwise;a.aRotation=this.aRotation;return a};Na.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.aX=a.aX;this.aY=a.aY;this.xRadius=a.xRadius;this.yRadius=a.yRadius;this.aStartAngle=
+a.aStartAngle;this.aEndAngle=a.aEndAngle;this.aClockwise=a.aClockwise;this.aRotation=a.aRotation;return this};ed.prototype=Object.create(Na.prototype);ed.prototype.constructor=ed;ed.prototype.isArcCurve=!0;var Qf=new p,hh=new tg,ih=new tg,jh=new tg;qa.prototype=Object.create(H.prototype);qa.prototype.constructor=qa;qa.prototype.isCatmullRomCurve3=!0;qa.prototype.getPoint=function(a,b){b=b||new p;var c=this.points,d=c.length;a*=d-(this.closed?0:1);var e=Math.floor(a);a-=e;this.closed?e+=0<e?0:(Math.floor(Math.abs(e)/
+d)+1)*d:0===a&&e===d-1&&(e=d-2,a=1);if(this.closed||0<e)var f=c[(e-1)%d];else Qf.subVectors(c[0],c[1]).add(c[0]),f=Qf;var g=c[e%d];var h=c[(e+1)%d];this.closed||e+2<d?c=c[(e+2)%d]:(Qf.subVectors(c[d-1],c[d-2]).add(c[d-1]),c=Qf);if("centripetal"===this.curveType||"chordal"===this.curveType){var l="chordal"===this.curveType?.5:.25;d=Math.pow(f.distanceToSquared(g),l);e=Math.pow(g.distanceToSquared(h),l);l=Math.pow(h.distanceToSquared(c),l);1E-4>e&&(e=1);1E-4>d&&(d=e);1E-4>l&&(l=e);hh.initNonuniformCatmullRom(f.x,
+g.x,h.x,c.x,d,e,l);ih.initNonuniformCatmullRom(f.y,g.y,h.y,c.y,d,e,l);jh.initNonuniformCatmullRom(f.z,g.z,h.z,c.z,d,e,l)}else"catmullrom"===this.curveType&&(hh.initCatmullRom(f.x,g.x,h.x,c.x,this.tension),ih.initCatmullRom(f.y,g.y,h.y,c.y,this.tension),jh.initCatmullRom(f.z,g.z,h.z,c.z,this.tension));b.set(hh.calc(a),ih.calc(a),jh.calc(a));return b};qa.prototype.copy=function(a){H.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++)this.points.push(a.points[b].clone());
+this.closed=a.closed;this.curveType=a.curveType;this.tension=a.tension;return this};qa.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.points=[];for(var b=0,c=this.points.length;b<c;b++)a.points.push(this.points[b].toArray());a.closed=this.closed;a.curveType=this.curveType;a.tension=this.tension;return a};qa.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++){var d=a.points[b];this.points.push((new p).fromArray(d))}this.closed=
+a.closed;this.curveType=a.curveType;this.tension=a.tension;return this};Ya.prototype=Object.create(H.prototype);Ya.prototype.constructor=Ya;Ya.prototype.isCubicBezierCurve=!0;Ya.prototype.getPoint=function(a,b){b=b||new v;var c=this.v0,d=this.v1,e=this.v2,f=this.v3;b.set(le(a,c.x,d.x,e.x,f.x),le(a,c.y,d.y,e.y,f.y));return b};Ya.prototype.copy=function(a){H.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);this.v3.copy(a.v3);return this};Ya.prototype.toJSON=function(){var a=
+H.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();a.v3=this.v3.toArray();return a};Ya.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);this.v3.fromArray(a.v3);return this};jb.prototype=Object.create(H.prototype);jb.prototype.constructor=jb;jb.prototype.isCubicBezierCurve3=!0;jb.prototype.getPoint=function(a,b){b=b||new p;var c=this.v0,d=this.v1,e=this.v2,f=this.v3;
+b.set(le(a,c.x,d.x,e.x,f.x),le(a,c.y,d.y,e.y,f.y),le(a,c.z,d.z,e.z,f.z));return b};jb.prototype.copy=function(a){H.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);this.v3.copy(a.v3);return this};jb.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();a.v3=this.v3.toArray();return a};jb.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);
+this.v2.fromArray(a.v2);this.v3.fromArray(a.v3);return this};Ia.prototype=Object.create(H.prototype);Ia.prototype.constructor=Ia;Ia.prototype.isLineCurve=!0;Ia.prototype.getPoint=function(a,b){b=b||new v;1===a?b.copy(this.v2):(b.copy(this.v2).sub(this.v1),b.multiplyScalar(a).add(this.v1));return b};Ia.prototype.getPointAt=function(a,b){return this.getPoint(a,b)};Ia.prototype.getTangent=function(a,b){a=b||new v;return a=a.copy(this.v2).sub(this.v1).normalize()};Ia.prototype.copy=function(a){H.prototype.copy.call(this,
+a);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};Ia.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};Ia.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};Za.prototype=Object.create(H.prototype);Za.prototype.constructor=Za;Za.prototype.isLineCurve3=!0;Za.prototype.getPoint=function(a,b){b=b||new p;1===a?b.copy(this.v2):(b.copy(this.v2).sub(this.v1),
+b.multiplyScalar(a).add(this.v1));return b};Za.prototype.getPointAt=function(a,b){return this.getPoint(a,b)};Za.prototype.copy=function(a){H.prototype.copy.call(this,a);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};Za.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};Za.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};$a.prototype=Object.create(H.prototype);
+$a.prototype.constructor=$a;$a.prototype.isQuadraticBezierCurve=!0;$a.prototype.getPoint=function(a,b){b=b||new v;var c=this.v0,d=this.v1,e=this.v2;b.set(ke(a,c.x,d.x,e.x),ke(a,c.y,d.y,e.y));return b};$a.prototype.copy=function(a){H.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};$a.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};$a.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,
+a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};kb.prototype=Object.create(H.prototype);kb.prototype.constructor=kb;kb.prototype.isQuadraticBezierCurve3=!0;kb.prototype.getPoint=function(a,b){b=b||new p;var c=this.v0,d=this.v1,e=this.v2;b.set(ke(a,c.x,d.x,e.x),ke(a,c.y,d.y,e.y),ke(a,c.z,d.z,e.z));return b};kb.prototype.copy=function(a){H.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};kb.prototype.toJSON=function(){var a=
+H.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};kb.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};ab.prototype=Object.create(H.prototype);ab.prototype.constructor=ab;ab.prototype.isSplineCurve=!0;ab.prototype.getPoint=function(a,b){b=b||new v;var c=this.points,d=(c.length-1)*a;a=Math.floor(d);d-=a;var e=c[0===a?a:a-1],f=c[a],g=c[a>c.length-
+2?c.length-1:a+1];c=c[a>c.length-3?c.length-1:a+2];b.set(fi(d,e.x,f.x,g.x,c.x),fi(d,e.y,f.y,g.y,c.y));return b};ab.prototype.copy=function(a){H.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++)this.points.push(a.points[b].clone());return this};ab.prototype.toJSON=function(){var a=H.prototype.toJSON.call(this);a.points=[];for(var b=0,c=this.points.length;b<c;b++)a.points.push(this.points[b].toArray());return a};ab.prototype.fromJSON=function(a){H.prototype.fromJSON.call(this,
+a);this.points=[];for(var b=0,c=a.points.length;b<c;b++){var d=a.points[b];this.points.push((new v).fromArray(d))}return this};var kh=Object.freeze({__proto__:null,ArcCurve:ed,CatmullRomCurve3:qa,CubicBezierCurve:Ya,CubicBezierCurve3:jb,EllipseCurve:Na,LineCurve:Ia,LineCurve3:Za,QuadraticBezierCurve:$a,QuadraticBezierCurve3:kb,SplineCurve:ab});vb.prototype=Object.assign(Object.create(H.prototype),{constructor:vb,add:function(a){this.curves.push(a)},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 Ia(b,a))},getPoint:function(a){var b=a*this.getLength(),c=this.getCurveLengths();for(a=0;a<c.length;){if(c[a]>=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();return a[a.length-1]},updateArcLengths:function(){this.needsUpdate=!0;this.cacheLengths=null;this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&
+this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var a=[],b=0,c=0,d=this.curves.length;c<d;c++)b+=this.curves[c].getLength(),a.push(b);return this.cacheLengths=a},getSpacedPoints:function(a){void 0===a&&(a=40);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));this.autoClose&&b.push(b[0]);return b},getPoints:function(a){a=a||12;for(var b=[],c,d=0,e=this.curves;d<e.length;d++){var f=e[d];f=f.getPoints(f&&f.isEllipseCurve?2*a:f&&(f.isLineCurve||f.isLineCurve3)?1:f&&f.isSplineCurve?
+a*f.points.length:a);for(var g=0;g<f.length;g++){var h=f[g];c&&c.equals(h)||(b.push(h),c=h)}}this.autoClose&&1<b.length&&!b[b.length-1].equals(b[0])&&b.push(b[0]);return b},copy:function(a){H.prototype.copy.call(this,a);this.curves=[];for(var b=0,c=a.curves.length;b<c;b++)this.curves.push(a.curves[b].clone());this.autoClose=a.autoClose;return this},toJSON:function(){var a=H.prototype.toJSON.call(this);a.autoClose=this.autoClose;a.curves=[];for(var b=0,c=this.curves.length;b<c;b++)a.curves.push(this.curves[b].toJSON());
+return a},fromJSON:function(a){H.prototype.fromJSON.call(this,a);this.autoClose=a.autoClose;this.curves=[];for(var b=0,c=a.curves.length;b<c;b++){var d=a.curves[b];this.curves.push((new kh[d.type]).fromJSON(d))}return this}});bb.prototype=Object.assign(Object.create(vb.prototype),{constructor:bb,setFromPoints: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);return this},moveTo:function(a,b){this.currentPoint.set(a,b);return this},lineTo:function(a,b){var c=
+new Ia(this.currentPoint.clone(),new v(a,b));this.curves.push(c);this.currentPoint.set(a,b);return this},quadraticCurveTo:function(a,b,c,d){a=new $a(this.currentPoint.clone(),new v(a,b),new v(c,d));this.curves.push(a);this.currentPoint.set(c,d);return this},bezierCurveTo:function(a,b,c,d,e,f){a=new Ya(this.currentPoint.clone(),new v(a,b),new v(c,d),new v(e,f));this.curves.push(a);this.currentPoint.set(e,f);return this},splineThru:function(a){var b=[this.currentPoint.clone()].concat(a);b=new ab(b);
+this.curves.push(b);this.currentPoint.copy(a[a.length-1]);return this},arc:function(a,b,c,d,e,f){this.absarc(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f);return this},absarc:function(a,b,c,d,e,f){this.absellipse(a,b,c,c,d,e,f);return this},ellipse:function(a,b,c,d,e,f,g,h){this.absellipse(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f,g,h);return this},absellipse:function(a,b,c,d,e,f,g,h){a=new Na(a,b,c,d,e,f,g,h);0<this.curves.length&&(b=a.getPoint(0),b.equals(this.currentPoint)||this.lineTo(b.x,
+b.y));this.curves.push(a);a=a.getPoint(1);this.currentPoint.copy(a);return this},copy:function(a){vb.prototype.copy.call(this,a);this.currentPoint.copy(a.currentPoint);return this},toJSON:function(){var a=vb.prototype.toJSON.call(this);a.currentPoint=this.currentPoint.toArray();return a},fromJSON:function(a){vb.prototype.fromJSON.call(this,a);this.currentPoint.fromArray(a.currentPoint);return this}});Nb.prototype=Object.assign(Object.create(bb.prototype),{constructor:Nb,getPointsHoles:function(a){for(var b=
+[],c=0,d=this.holes.length;c<d;c++)b[c]=this.holes[c].getPoints(a);return b},extractPoints:function(a){return{shape:this.getPoints(a),holes:this.getPointsHoles(a)}},copy:function(a){bb.prototype.copy.call(this,a);this.holes=[];for(var b=0,c=a.holes.length;b<c;b++)this.holes.push(a.holes[b].clone());return this},toJSON:function(){var a=bb.prototype.toJSON.call(this);a.uuid=this.uuid;a.holes=[];for(var b=0,c=this.holes.length;b<c;b++)a.holes.push(this.holes[b].toJSON());return a},fromJSON:function(a){bb.prototype.fromJSON.call(this,
+a);this.uuid=a.uuid;this.holes=[];for(var b=0,c=a.holes.length;b<c;b++){var d=a.holes[b];this.holes.push((new bb).fromJSON(d))}return this}});S.prototype=Object.assign(Object.create(y.prototype),{constructor:S,isLight:!0,copy:function(a){y.prototype.copy.call(this,a);this.color.copy(a.color);this.intensity=a.intensity;return this},toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.color=this.color.getHex();a.object.intensity=this.intensity;void 0!==this.groundColor&&(a.object.groundColor=
+this.groundColor.getHex());void 0!==this.distance&&(a.object.distance=this.distance);void 0!==this.angle&&(a.object.angle=this.angle);void 0!==this.decay&&(a.object.decay=this.decay);void 0!==this.penumbra&&(a.object.penumbra=this.penumbra);void 0!==this.shadow&&(a.object.shadow=this.shadow.toJSON());return a}});ff.prototype=Object.assign(Object.create(S.prototype),{constructor:ff,isHemisphereLight:!0,copy:function(a){S.prototype.copy.call(this,a);this.groundColor.copy(a.groundColor);return this}});
+Object.assign(lb.prototype,{_projScreenMatrix:new N,_lightPositionWorld:new p,_lookTarget:new p,getViewportCount:function(){return this._viewportCount},getFrustum:function(){return this._frustum},updateMatrices:function(a){var b=this.camera,c=this.matrix,d=this._projScreenMatrix,e=this._lookTarget,f=this._lightPositionWorld;f.setFromMatrixPosition(a.matrixWorld);b.position.copy(f);e.setFromMatrixPosition(a.target.matrixWorld);b.lookAt(e);b.updateMatrixWorld();d.multiplyMatrices(b.projectionMatrix,
+b.matrixWorldInverse);this._frustum.setFromProjectionMatrix(d);c.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1);c.multiply(b.projectionMatrix);c.multiply(b.matrixWorldInverse)},getViewport:function(a){return this._viewports[a]},getFrameExtents:function(){return this._frameExtents},copy:function(a){this.camera=a.camera.clone();this.bias=a.bias;this.radius=a.radius;this.mapSize.copy(a.mapSize);return this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var a={};0!==this.bias&&
+(a.bias=this.bias);1!==this.radius&&(a.radius=this.radius);if(512!==this.mapSize.x||512!==this.mapSize.y)a.mapSize=this.mapSize.toArray();a.camera=this.camera.toJSON(!1).object;delete a.camera.matrix;return a}});gf.prototype=Object.assign(Object.create(lb.prototype),{constructor:gf,isSpotLightShadow:!0,updateMatrices:function(a){var b=this.camera,c=2*O.RAD2DEG*a.angle,d=this.mapSize.width/this.mapSize.height,e=a.distance||b.far;if(c!==b.fov||d!==b.aspect||e!==b.far)b.fov=c,b.aspect=d,b.far=e,b.updateProjectionMatrix();
+lb.prototype.updateMatrices.call(this,a)}});hf.prototype=Object.assign(Object.create(S.prototype),{constructor:hf,isSpotLight:!0,copy:function(a){S.prototype.copy.call(this,a);this.distance=a.distance;this.angle=a.angle;this.penumbra=a.penumbra;this.decay=a.decay;this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});ug.prototype=Object.assign(Object.create(lb.prototype),{constructor:ug,isPointLightShadow:!0,updateMatrices:function(a,b){void 0===b&&(b=0);var c=this.camera,d=this.matrix,
+e=this._lightPositionWorld,f=this._lookTarget,g=this._projScreenMatrix;e.setFromMatrixPosition(a.matrixWorld);c.position.copy(e);f.copy(c.position);f.add(this._cubeDirections[b]);c.up.copy(this._cubeUps[b]);c.lookAt(f);c.updateMatrixWorld();d.makeTranslation(-e.x,-e.y,-e.z);g.multiplyMatrices(c.projectionMatrix,c.matrixWorldInverse);this._frustum.setFromProjectionMatrix(g)}});jf.prototype=Object.assign(Object.create(S.prototype),{constructor:jf,isPointLight:!0,copy:function(a){S.prototype.copy.call(this,
+a);this.distance=a.distance;this.decay=a.decay;this.shadow=a.shadow.clone();return this}});fd.prototype=Object.assign(Object.create(fb.prototype),{constructor:fd,isOrthographicCamera:!0,copy:function(a,b){fb.prototype.copy.call(this,a,b);this.left=a.left;this.right=a.right;this.top=a.top;this.bottom=a.bottom;this.near=a.near;this.far=a.far;this.zoom=a.zoom;this.view=null===a.view?null:Object.assign({},a.view);return this},setViewOffset:function(a,b,c,d,e,f){null===this.view&&(this.view={enabled:!0,
+fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1});this.view.enabled=!0;this.view.fullWidth=a;this.view.fullHeight=b;this.view.offsetX=c;this.view.offsetY=d;this.view.width=e;this.view.height=f;this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1);this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=(this.right-this.left)/(2*this.zoom),b=(this.top-this.bottom)/(2*this.zoom),c=(this.right+this.left)/2,d=(this.top+this.bottom)/
+2,e=c-a;c+=a;a=d+b;b=d-b;null!==this.view&&this.view.enabled&&(d=(this.right-this.left)/this.view.fullWidth/this.zoom,b=(this.top-this.bottom)/this.view.fullHeight/this.zoom,e+=d*this.view.offsetX,c=e+d*this.view.width,a-=b*this.view.offsetY,b=a-b*this.view.height);this.projectionMatrix.makeOrthographic(e,c,a,b,this.near,this.far);this.projectionMatrixInverse.getInverse(this.projectionMatrix)},toJSON:function(a){a=y.prototype.toJSON.call(this,a);a.object.zoom=this.zoom;a.object.left=this.left;a.object.right=
+this.right;a.object.top=this.top;a.object.bottom=this.bottom;a.object.near=this.near;a.object.far=this.far;null!==this.view&&(a.object.view=Object.assign({},this.view));return a}});kf.prototype=Object.assign(Object.create(lb.prototype),{constructor:kf,isDirectionalLightShadow:!0,updateMatrices:function(a){lb.prototype.updateMatrices.call(this,a)}});lf.prototype=Object.assign(Object.create(S.prototype),{constructor:lf,isDirectionalLight:!0,copy:function(a){S.prototype.copy.call(this,a);this.target=
+a.target.clone();this.shadow=a.shadow.clone();return this}});mf.prototype=Object.assign(Object.create(S.prototype),{constructor:mf,isAmbientLight:!0});nf.prototype=Object.assign(Object.create(S.prototype),{constructor:nf,isRectAreaLight:!0,copy:function(a){S.prototype.copy.call(this,a);this.width=a.width;this.height=a.height;return this},toJSON:function(a){a=S.prototype.toJSON.call(this,a);a.object.width=this.width;a.object.height=this.height;return a}});Object.assign(of.prototype,{isSphericalHarmonics3:!0,
+set:function(a){for(var b=0;9>b;b++)this.coefficients[b].copy(a[b]);return this},zero:function(){for(var a=0;9>a;a++)this.coefficients[a].set(0,0,0);return this},getAt:function(a,b){var c=a.x,d=a.y;a=a.z;var e=this.coefficients;b.copy(e[0]).multiplyScalar(.282095);b.addScaledVector(e[1],.488603*d);b.addScaledVector(e[2],.488603*a);b.addScaledVector(e[3],.488603*c);b.addScaledVector(e[4],1.092548*c*d);b.addScaledVector(e[5],1.092548*d*a);b.addScaledVector(e[6],.315392*(3*a*a-1));b.addScaledVector(e[7],
+1.092548*c*a);b.addScaledVector(e[8],.546274*(c*c-d*d));return b},getIrradianceAt:function(a,b){var c=a.x,d=a.y;a=a.z;var e=this.coefficients;b.copy(e[0]).multiplyScalar(.886227);b.addScaledVector(e[1],1.023328*d);b.addScaledVector(e[2],1.023328*a);b.addScaledVector(e[3],1.023328*c);b.addScaledVector(e[4],.858086*c*d);b.addScaledVector(e[5],.858086*d*a);b.addScaledVector(e[6],.743125*a*a-.247708);b.addScaledVector(e[7],.858086*c*a);b.addScaledVector(e[8],.429043*(c*c-d*d));return b},add:function(a){for(var b=
+0;9>b;b++)this.coefficients[b].add(a.coefficients[b]);return this},addScaledSH:function(a,b){for(var c=0;9>c;c++)this.coefficients[c].addScaledVector(a.coefficients[c],b);return this},scale:function(a){for(var b=0;9>b;b++)this.coefficients[b].multiplyScalar(a);return this},lerp:function(a,b){for(var c=0;9>c;c++)this.coefficients[c].lerp(a.coefficients[c],b);return this},equals:function(a){for(var b=0;9>b;b++)if(!this.coefficients[b].equals(a.coefficients[b]))return!1;return!0},copy:function(a){return this.set(a.coefficients)},
+clone:function(){return(new this.constructor).copy(this)},fromArray:function(a,b){void 0===b&&(b=0);for(var c=this.coefficients,d=0;9>d;d++)c[d].fromArray(a,b+3*d);return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);for(var c=this.coefficients,d=0;9>d;d++)c[d].toArray(a,b+3*d);return a}});Object.assign(of,{getBasisAt:function(a,b){var c=a.x,d=a.y;a=a.z;b[0]=.282095;b[1]=.488603*d;b[2]=.488603*a;b[3]=.488603*c;b[4]=1.092548*c*d;b[5]=1.092548*d*a;b[6]=.315392*(3*a*a-1);b[7]=1.092548*
+c*a;b[8]=.546274*(c*c-d*d)}});Ua.prototype=Object.assign(Object.create(S.prototype),{constructor:Ua,isLightProbe:!0,copy:function(a){S.prototype.copy.call(this,a);this.sh.copy(a.sh);return this},fromJSON:function(a){this.intensity=a.intensity;this.sh.fromArray(a.sh);return this},toJSON:function(a){a=S.prototype.toJSON.call(this,a);a.object.sh=this.sh.toArray();return a}});pf.prototype=Object.assign(Object.create(V.prototype),{constructor:pf,load:function(a,b,c,d){var e=this,f=new Ta(e.manager);f.setPath(e.path);
+f.load(a,function(c){try{b(e.parse(JSON.parse(c)))}catch(h){d?d(h):console.error(h),e.manager.itemError(a)}},c,d)},parse:function(a){function b(a){void 0===c[a]&&console.warn("THREE.MaterialLoader: Undefined texture",a);return c[a]}var c=this.textures,d=new Sk[a.type];void 0!==a.uuid&&(d.uuid=a.uuid);void 0!==a.name&&(d.name=a.name);void 0!==a.color&&d.color.setHex(a.color);void 0!==a.roughness&&(d.roughness=a.roughness);void 0!==a.metalness&&(d.metalness=a.metalness);void 0!==a.sheen&&(d.sheen=(new D).setHex(a.sheen));
+void 0!==a.emissive&&d.emissive.setHex(a.emissive);void 0!==a.specular&&d.specular.setHex(a.specular);void 0!==a.shininess&&(d.shininess=a.shininess);void 0!==a.clearcoat&&(d.clearcoat=a.clearcoat);void 0!==a.clearcoatRoughness&&(d.clearcoatRoughness=a.clearcoatRoughness);void 0!==a.fog&&(d.fog=a.fog);void 0!==a.flatShading&&(d.flatShading=a.flatShading);void 0!==a.blending&&(d.blending=a.blending);void 0!==a.combine&&(d.combine=a.combine);void 0!==a.side&&(d.side=a.side);void 0!==a.opacity&&(d.opacity=
+a.opacity);void 0!==a.transparent&&(d.transparent=a.transparent);void 0!==a.alphaTest&&(d.alphaTest=a.alphaTest);void 0!==a.depthTest&&(d.depthTest=a.depthTest);void 0!==a.depthWrite&&(d.depthWrite=a.depthWrite);void 0!==a.colorWrite&&(d.colorWrite=a.colorWrite);void 0!==a.stencilWrite&&(d.stencilWrite=a.stencilWrite);void 0!==a.stencilWriteMask&&(d.stencilWriteMask=a.stencilWriteMask);void 0!==a.stencilFunc&&(d.stencilFunc=a.stencilFunc);void 0!==a.stencilRef&&(d.stencilRef=a.stencilRef);void 0!==
+a.stencilFuncMask&&(d.stencilFuncMask=a.stencilFuncMask);void 0!==a.stencilFail&&(d.stencilFail=a.stencilFail);void 0!==a.stencilZFail&&(d.stencilZFail=a.stencilZFail);void 0!==a.stencilZPass&&(d.stencilZPass=a.stencilZPass);void 0!==a.wireframe&&(d.wireframe=a.wireframe);void 0!==a.wireframeLinewidth&&(d.wireframeLinewidth=a.wireframeLinewidth);void 0!==a.wireframeLinecap&&(d.wireframeLinecap=a.wireframeLinecap);void 0!==a.wireframeLinejoin&&(d.wireframeLinejoin=a.wireframeLinejoin);void 0!==a.rotation&&
+(d.rotation=a.rotation);1!==a.linewidth&&(d.linewidth=a.linewidth);void 0!==a.dashSize&&(d.dashSize=a.dashSize);void 0!==a.gapSize&&(d.gapSize=a.gapSize);void 0!==a.scale&&(d.scale=a.scale);void 0!==a.polygonOffset&&(d.polygonOffset=a.polygonOffset);void 0!==a.polygonOffsetFactor&&(d.polygonOffsetFactor=a.polygonOffsetFactor);void 0!==a.polygonOffsetUnits&&(d.polygonOffsetUnits=a.polygonOffsetUnits);void 0!==a.skinning&&(d.skinning=a.skinning);void 0!==a.morphTargets&&(d.morphTargets=a.morphTargets);
+void 0!==a.morphNormals&&(d.morphNormals=a.morphNormals);void 0!==a.dithering&&(d.dithering=a.dithering);void 0!==a.vertexTangents&&(d.vertexTangents=a.vertexTangents);void 0!==a.visible&&(d.visible=a.visible);void 0!==a.toneMapped&&(d.toneMapped=a.toneMapped);void 0!==a.userData&&(d.userData=a.userData);void 0!==a.vertexColors&&(d.vertexColors="number"===typeof a.vertexColors?0<a.vertexColors?!0:!1:a.vertexColors);if(void 0!==a.uniforms)for(var e in a.uniforms){var f=a.uniforms[e];d.uniforms[e]=
+{};switch(f.type){case "t":d.uniforms[e].value=b(f.value);break;case "c":d.uniforms[e].value=(new D).setHex(f.value);break;case "v2":d.uniforms[e].value=(new v).fromArray(f.value);break;case "v3":d.uniforms[e].value=(new p).fromArray(f.value);break;case "v4":d.uniforms[e].value=(new R).fromArray(f.value);break;case "m3":d.uniforms[e].value=(new ya).fromArray(f.value);case "m4":d.uniforms[e].value=(new N).fromArray(f.value);break;default:d.uniforms[e].value=f.value}}void 0!==a.defines&&(d.defines=
+a.defines);void 0!==a.vertexShader&&(d.vertexShader=a.vertexShader);void 0!==a.fragmentShader&&(d.fragmentShader=a.fragmentShader);if(void 0!==a.extensions)for(var g in a.extensions)d.extensions[g]=a.extensions[g];void 0!==a.shading&&(d.flatShading=1===a.shading);void 0!==a.size&&(d.size=a.size);void 0!==a.sizeAttenuation&&(d.sizeAttenuation=a.sizeAttenuation);void 0!==a.map&&(d.map=b(a.map));void 0!==a.matcap&&(d.matcap=b(a.matcap));void 0!==a.alphaMap&&(d.alphaMap=b(a.alphaMap));void 0!==a.bumpMap&&
+(d.bumpMap=b(a.bumpMap));void 0!==a.bumpScale&&(d.bumpScale=a.bumpScale);void 0!==a.normalMap&&(d.normalMap=b(a.normalMap));void 0!==a.normalMapType&&(d.normalMapType=a.normalMapType);void 0!==a.normalScale&&(e=a.normalScale,!1===Array.isArray(e)&&(e=[e,e]),d.normalScale=(new v).fromArray(e));void 0!==a.displacementMap&&(d.displacementMap=b(a.displacementMap));void 0!==a.displacementScale&&(d.displacementScale=a.displacementScale);void 0!==a.displacementBias&&(d.displacementBias=a.displacementBias);
+void 0!==a.roughnessMap&&(d.roughnessMap=b(a.roughnessMap));void 0!==a.metalnessMap&&(d.metalnessMap=b(a.metalnessMap));void 0!==a.emissiveMap&&(d.emissiveMap=b(a.emissiveMap));void 0!==a.emissiveIntensity&&(d.emissiveIntensity=a.emissiveIntensity);void 0!==a.specularMap&&(d.specularMap=b(a.specularMap));void 0!==a.envMap&&(d.envMap=b(a.envMap));void 0!==a.envMapIntensity&&(d.envMapIntensity=a.envMapIntensity);void 0!==a.reflectivity&&(d.reflectivity=a.reflectivity);void 0!==a.refractionRatio&&(d.refractionRatio=
+a.refractionRatio);void 0!==a.lightMap&&(d.lightMap=b(a.lightMap));void 0!==a.lightMapIntensity&&(d.lightMapIntensity=a.lightMapIntensity);void 0!==a.aoMap&&(d.aoMap=b(a.aoMap));void 0!==a.aoMapIntensity&&(d.aoMapIntensity=a.aoMapIntensity);void 0!==a.gradientMap&&(d.gradientMap=b(a.gradientMap));void 0!==a.clearcoatMap&&(d.clearcoatMap=b(a.clearcoatMap));void 0!==a.clearcoatRoughnessMap&&(d.clearcoatRoughnessMap=b(a.clearcoatRoughnessMap));void 0!==a.clearcoatNormalMap&&(d.clearcoatNormalMap=b(a.clearcoatNormalMap));
+void 0!==a.clearcoatNormalScale&&(d.clearcoatNormalScale=(new v).fromArray(a.clearcoatNormalScale));return d},setTextures:function(a){this.textures=a;return this}});var lh={decodeText:function(a){if("undefined"!==typeof TextDecoder)return(new TextDecoder).decode(a);for(var b="",c=0,d=a.length;c<d;c++)b+=String.fromCharCode(a[c]);try{return decodeURIComponent(escape(b))}catch(e){return b}},extractUrlBase:function(a){var b=a.lastIndexOf("/");return-1===b?"./":a.substr(0,b+1)}};me.prototype=Object.assign(Object.create(F.prototype),
+{constructor:me,isInstancedBufferGeometry:!0,copy:function(a){F.prototype.copy.call(this,a);this.instanceCount=a.instanceCount;return this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var a=F.prototype.toJSON.call(this);a.instanceCount=this.instanceCount;a.isInstancedBufferGeometry=!0;return a}});qf.prototype=Object.assign(Object.create(G.prototype),{constructor:qf,isInstancedBufferAttribute:!0,copy:function(a){G.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;
+return this},toJSON:function(){var a=G.prototype.toJSON.call(this);a.meshPerAttribute=this.meshPerAttribute;a.isInstancedBufferAttribute=!0;return a}});rf.prototype=Object.assign(Object.create(V.prototype),{constructor:rf,load:function(a,b,c,d){var e=this,f=new Ta(e.manager);f.setPath(e.path);f.load(a,function(c){try{b(e.parse(JSON.parse(c)))}catch(h){d?d(h):console.error(h),e.manager.itemError(a)}},c,d)},parse:function(a){var b=a.isInstancedBufferGeometry?new me:new F,c=a.data.index;if(void 0!==
+c){var d=new mh[c.type](c.array);b.setIndex(new G(d,1))}c=a.data.attributes;for(var e in c){var f=c[e];d=new mh[f.type](f.array);d=new (f.isInstancedBufferAttribute?qf:G)(d,f.itemSize,f.normalized);void 0!==f.name&&(d.name=f.name);b.setAttribute(e,d)}var g=a.data.morphAttributes;if(g)for(e in g){var h=g[e],l=[];c=0;for(var k=h.length;c<k;c++)f=h[c],d=new mh[f.type](f.array),d=new G(d,f.itemSize,f.normalized),void 0!==f.name&&(d.name=f.name),l.push(d);b.morphAttributes[e]=l}a.data.morphTargetsRelative&&
+(b.morphTargetsRelative=!0);e=a.data.groups||a.data.drawcalls||a.data.offsets;if(void 0!==e)for(c=0,f=e.length;c!==f;++c)d=e[c],b.addGroup(d.start,d.count,d.materialIndex);c=a.data.boundingSphere;void 0!==c&&(e=new p,void 0!==c.center&&e.fromArray(c.center),b.boundingSphere=new eb(e,c.radius));a.name&&(b.name=a.name);a.userData&&(b.userData=a.userData);return b}});var mh={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:"undefined"!==typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,
+Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};sf.prototype=Object.assign(Object.create(V.prototype),{constructor:sf,load:function(a,b,c,d){var e=this,f=""===this.path?lh.extractUrlBase(a):this.path;this.resourcePath=this.resourcePath||f;f=new Ta(e.manager);f.setPath(this.path);f.load(a,function(c){var f=null;try{f=JSON.parse(c)}catch(l){void 0!==d&&d(l);console.error("THREE:ObjectLoader: Can't parse "+
+a+".",l.message);return}c=f.metadata;void 0===c||void 0===c.type||"geometry"===c.type.toLowerCase()?console.error("THREE.ObjectLoader: Can't load "+a):e.parse(f,b)},c,d)},parse:function(a,b){var c=this.parseShape(a.shapes);c=this.parseGeometries(a.geometries,c);var d=this.parseImages(a.images,function(){void 0!==b&&b(e)});d=this.parseTextures(a.textures,d);d=this.parseMaterials(a.materials,d);var e=this.parseObject(a.object,c,d);a.animations&&(e.animations=this.parseAnimations(a.animations));void 0!==
+a.images&&0!==a.images.length||void 0===b||b(e);return e},parseShape:function(a){var b={};if(void 0!==a)for(var c=0,d=a.length;c<d;c++){var e=(new Nb).fromJSON(a[c]);b[e.uuid]=e}return b},parseGeometries:function(a,b){var c={};if(void 0!==a)for(var d=new rf,e=0,f=a.length;e<f;e++){var g=a[e];switch(g.type){case "PlaneGeometry":case "PlaneBufferGeometry":var h=new ra[g.type](g.width,g.height,g.widthSegments,g.heightSegments);break;case "BoxGeometry":case "BoxBufferGeometry":case "CubeGeometry":h=new ra[g.type](g.width,
+g.height,g.depth,g.widthSegments,g.heightSegments,g.depthSegments);break;case "CircleGeometry":case "CircleBufferGeometry":h=new ra[g.type](g.radius,g.segments,g.thetaStart,g.thetaLength);break;case "CylinderGeometry":case "CylinderBufferGeometry":h=new ra[g.type](g.radiusTop,g.radiusBottom,g.height,g.radialSegments,g.heightSegments,g.openEnded,g.thetaStart,g.thetaLength);break;case "ConeGeometry":case "ConeBufferGeometry":h=new ra[g.type](g.radius,g.height,g.radialSegments,g.heightSegments,g.openEnded,
+g.thetaStart,g.thetaLength);break;case "SphereGeometry":case "SphereBufferGeometry":h=new ra[g.type](g.radius,g.widthSegments,g.heightSegments,g.phiStart,g.phiLength,g.thetaStart,g.thetaLength);break;case "DodecahedronGeometry":case "DodecahedronBufferGeometry":case "IcosahedronGeometry":case "IcosahedronBufferGeometry":case "OctahedronGeometry":case "OctahedronBufferGeometry":case "TetrahedronGeometry":case "TetrahedronBufferGeometry":h=new ra[g.type](g.radius,g.detail);break;case "RingGeometry":case "RingBufferGeometry":h=
+new ra[g.type](g.innerRadius,g.outerRadius,g.thetaSegments,g.phiSegments,g.thetaStart,g.thetaLength);break;case "TorusGeometry":case "TorusBufferGeometry":h=new ra[g.type](g.radius,g.tube,g.radialSegments,g.tubularSegments,g.arc);break;case "TorusKnotGeometry":case "TorusKnotBufferGeometry":h=new ra[g.type](g.radius,g.tube,g.tubularSegments,g.radialSegments,g.p,g.q);break;case "TubeGeometry":case "TubeBufferGeometry":h=new ra[g.type]((new kh[g.path.type]).fromJSON(g.path),g.tubularSegments,g.radius,
+g.radialSegments,g.closed);break;case "LatheGeometry":case "LatheBufferGeometry":h=new ra[g.type](g.points,g.segments,g.phiStart,g.phiLength);break;case "PolyhedronGeometry":case "PolyhedronBufferGeometry":h=new ra[g.type](g.vertices,g.indices,g.radius,g.details);break;case "ShapeGeometry":case "ShapeBufferGeometry":h=[];for(var l=0,k=g.shapes.length;l<k;l++){var p=b[g.shapes[l]];h.push(p)}h=new ra[g.type](h,g.curveSegments);break;case "ExtrudeGeometry":case "ExtrudeBufferGeometry":h=[];l=0;for(k=
+g.shapes.length;l<k;l++)p=b[g.shapes[l]],h.push(p);l=g.options.extrudePath;void 0!==l&&(g.options.extrudePath=(new kh[l.type]).fromJSON(l));h=new ra[g.type](h,g.options);break;case "BufferGeometry":case "InstancedBufferGeometry":h=d.parse(g);break;case "Geometry":console.error('THREE.ObjectLoader: Loading "Geometry" is not supported anymore.');break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+g.type+'"');continue}h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);!0===h.isBufferGeometry&&
+void 0!==g.userData&&(h.userData=g.userData);c[g.uuid]=h}return c},parseMaterials:function(a,b){var c={},d={};if(void 0!==a){var e=new pf;e.setTextures(b);b=0;for(var f=a.length;b<f;b++){var g=a[b];if("MultiMaterial"===g.type){for(var h=[],l=0;l<g.materials.length;l++){var k=g.materials[l];void 0===c[k.uuid]&&(c[k.uuid]=e.parse(k));h.push(c[k.uuid])}d[g.uuid]=h}else void 0===c[g.uuid]&&(c[g.uuid]=e.parse(g)),d[g.uuid]=c[g.uuid]}}return d},parseAnimations:function(a){for(var b=[],c=0;c<a.length;c++){var d=
+a[c],e=Sa.parse(d);void 0!==d.uuid&&(e.uuid=d.uuid);b.push(e)}return b},parseImages:function(a,b){function c(a){d.manager.itemStart(a);return f.load(a,function(){d.manager.itemEnd(a)},void 0,function(){d.manager.itemError(a);d.manager.itemEnd(a)})}var d=this,e={};if(void 0!==a&&0<a.length){b=new qg(b);var f=new dd(b);f.setCrossOrigin(this.crossOrigin);b=0;for(var g=a.length;b<g;b++){var h=a[b],l=h.url;if(Array.isArray(l)){e[h.uuid]=[];for(var k=0,p=l.length;k<p;k++){var n=l[k];n=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(n)?
+n:d.resourcePath+n;e[h.uuid].push(c(n))}}else n=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(h.url)?h.url:d.resourcePath+h.url,e[h.uuid]=c(n)}}return e},parseTextures:function(a,b){function c(a,b){if("number"===typeof a)return a;console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",a);return b[a]}var d={};if(void 0!==a)for(var e=0,f=a.length;e<f;e++){var g=a[e];void 0===g.image&&console.warn('THREE.ObjectLoader: No "image" specified for',g.uuid);void 0===b[g.image]&&console.warn("THREE.ObjectLoader: Undefined image",
+g.image);var h=Array.isArray(b[g.image])?new qb(b[g.image]):new W(b[g.image]);h.needsUpdate=!0;h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);void 0!==g.mapping&&(h.mapping=c(g.mapping,Tk));void 0!==g.offset&&h.offset.fromArray(g.offset);void 0!==g.repeat&&h.repeat.fromArray(g.repeat);void 0!==g.center&&h.center.fromArray(g.center);void 0!==g.rotation&&(h.rotation=g.rotation);void 0!==g.wrap&&(h.wrapS=c(g.wrap[0],Ni),h.wrapT=c(g.wrap[1],Ni));void 0!==g.format&&(h.format=g.format);void 0!==g.type&&
+(h.type=g.type);void 0!==g.encoding&&(h.encoding=g.encoding);void 0!==g.minFilter&&(h.minFilter=c(g.minFilter,Oi));void 0!==g.magFilter&&(h.magFilter=c(g.magFilter,Oi));void 0!==g.anisotropy&&(h.anisotropy=g.anisotropy);void 0!==g.flipY&&(h.flipY=g.flipY);void 0!==g.premultiplyAlpha&&(h.premultiplyAlpha=g.premultiplyAlpha);void 0!==g.unpackAlignment&&(h.unpackAlignment=g.unpackAlignment);d[g.uuid]=h}return d},parseObject:function(a,b,c){function d(a){void 0===b[a]&&console.warn("THREE.ObjectLoader: Undefined geometry",
+a);return b[a]}function e(a){if(void 0!==a){if(Array.isArray(a)){for(var b=[],d=0,e=a.length;d<e;d++){var f=a[d];void 0===c[f]&&console.warn("THREE.ObjectLoader: Undefined material",f);b.push(c[f])}return b}void 0===c[a]&&console.warn("THREE.ObjectLoader: Undefined material",a);return c[a]}}switch(a.type){case "Scene":var f=new zc;void 0!==a.background&&Number.isInteger(a.background)&&(f.background=new D(a.background));void 0!==a.fog&&("Fog"===a.fog.type?f.fog=new Oe(a.fog.color,a.fog.near,a.fog.far):
+"FogExp2"===a.fog.type&&(f.fog=new Ne(a.fog.color,a.fog.density)));break;case "PerspectiveCamera":f=new P(a.fov,a.aspect,a.near,a.far);void 0!==a.focus&&(f.focus=a.focus);void 0!==a.zoom&&(f.zoom=a.zoom);void 0!==a.filmGauge&&(f.filmGauge=a.filmGauge);void 0!==a.filmOffset&&(f.filmOffset=a.filmOffset);void 0!==a.view&&(f.view=Object.assign({},a.view));break;case "OrthographicCamera":f=new fd(a.left,a.right,a.top,a.bottom,a.near,a.far);void 0!==a.zoom&&(f.zoom=a.zoom);void 0!==a.view&&(f.view=Object.assign({},
+a.view));break;case "AmbientLight":f=new mf(a.color,a.intensity);break;case "DirectionalLight":f=new lf(a.color,a.intensity);break;case "PointLight":f=new jf(a.color,a.intensity,a.distance,a.decay);break;case "RectAreaLight":f=new nf(a.color,a.intensity,a.width,a.height);break;case "SpotLight":f=new hf(a.color,a.intensity,a.distance,a.angle,a.penumbra,a.decay);break;case "HemisphereLight":f=new ff(a.color,a.groundColor,a.intensity);break;case "LightProbe":f=(new Ua).fromJSON(a);break;case "SkinnedMesh":console.warn("THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.");
+case "Mesh":f=d(a.geometry);var g=e(a.material);f=new ea(f,g);break;case "InstancedMesh":f=d(a.geometry);g=e(a.material);var h=a.instanceMatrix;f=new Se(f,g,a.count);f.instanceMatrix=new G(new Float32Array(h.array),16);break;case "LOD":f=new Nd;break;case "Line":f=new La(d(a.geometry),e(a.material),a.mode);break;case "LineLoop":f=new Te(d(a.geometry),e(a.material));break;case "LineSegments":f=new ma(d(a.geometry),e(a.material));break;case "PointCloud":case "Points":f=new Nc(d(a.geometry),e(a.material));
+break;case "Sprite":f=new Ld(e(a.material));break;case "Group":f=new Kc;break;default:f=new y}f.uuid=a.uuid;void 0!==a.name&&(f.name=a.name);void 0!==a.matrix?(f.matrix.fromArray(a.matrix),void 0!==a.matrixAutoUpdate&&(f.matrixAutoUpdate=a.matrixAutoUpdate),f.matrixAutoUpdate&&f.matrix.decompose(f.position,f.quaternion,f.scale)):(void 0!==a.position&&f.position.fromArray(a.position),void 0!==a.rotation&&f.rotation.fromArray(a.rotation),void 0!==a.quaternion&&f.quaternion.fromArray(a.quaternion),void 0!==
+a.scale&&f.scale.fromArray(a.scale));void 0!==a.castShadow&&(f.castShadow=a.castShadow);void 0!==a.receiveShadow&&(f.receiveShadow=a.receiveShadow);a.shadow&&(void 0!==a.shadow.bias&&(f.shadow.bias=a.shadow.bias),void 0!==a.shadow.radius&&(f.shadow.radius=a.shadow.radius),void 0!==a.shadow.mapSize&&f.shadow.mapSize.fromArray(a.shadow.mapSize),void 0!==a.shadow.camera&&(f.shadow.camera=this.parseObject(a.shadow.camera)));void 0!==a.visible&&(f.visible=a.visible);void 0!==a.frustumCulled&&(f.frustumCulled=
+a.frustumCulled);void 0!==a.renderOrder&&(f.renderOrder=a.renderOrder);void 0!==a.userData&&(f.userData=a.userData);void 0!==a.layers&&(f.layers.mask=a.layers);if(void 0!==a.children)for(h=a.children,g=0;g<h.length;g++)f.add(this.parseObject(h[g],b,c));if("LOD"===a.type)for(void 0!==a.autoUpdate&&(f.autoUpdate=a.autoUpdate),a=a.levels,h=0;h<a.length;h++){g=a[h];var l=f.getObjectByProperty("uuid",g.object);void 0!==l&&f.addLevel(l,g.distance)}return f}});var Tk={UVMapping:300,CubeReflectionMapping:301,
+CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},Ni={RepeatWrapping:1E3,ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},Oi={NearestFilter:1003,NearestMipmapNearestFilter:1004,NearestMipmapLinearFilter:1005,LinearFilter:1006,LinearMipmapNearestFilter:1007,LinearMipmapLinearFilter:1008};vg.prototype=Object.assign(Object.create(V.prototype),{constructor:vg,
+setOptions:function(a){this.options=a;return this},load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=tc.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;fetch(a).then(function(a){return a.blob()}).then(function(a){return void 0===e.options?createImageBitmap(a):createImageBitmap(a,e.options)}).then(function(c){tc.add(a,c);b&&b(c);e.manager.itemEnd(a)}).catch(function(b){d&&
+d(b);e.manager.itemError(a);e.manager.itemEnd(a)});e.manager.itemStart(a)}});Object.assign(wg.prototype,{moveTo:function(a,b){this.currentPath=new bb;this.subPaths.push(this.currentPath);this.currentPath.moveTo(a,b);return this},lineTo:function(a,b){this.currentPath.lineTo(a,b);return this},quadraticCurveTo:function(a,b,c,d){this.currentPath.quadraticCurveTo(a,b,c,d);return this},bezierCurveTo:function(a,b,c,d,e,f){this.currentPath.bezierCurveTo(a,b,c,d,e,f);return this},splineThru:function(a){this.currentPath.splineThru(a);
+return this},toShapes:function(a,b){function c(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c],f=new Nb;f.curves=e.curves;b.push(f)}return b}function d(a,b){for(var c=b.length,d=!1,e=c-1,f=0;f<c;e=f++){var g=b[e],h=b[f],l=h.x-g.x,k=h.y-g.y;if(Math.abs(k)>Number.EPSILON){if(0>k&&(g=b[f],l=-l,h=b[e],k=-k),!(a.y<g.y||a.y>h.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=k*(a.x-g.x)-l*(a.y-g.y);if(0===e)return!0;0>e||(d=!d)}}else if(a.y===g.y&&(h.x<=a.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}
+var e=sb.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);b=[];if(1===f.length){var g=f[0];var h=new Nb;h.curves=g.curves;b.push(h);return b}var l=!e(f[0].getPoints());l=a?!l:l;h=[];var k=[],p=[],n=0;k[n]=void 0;p[n]=[];for(var t=0,r=f.length;t<r;t++){g=f[t];var q=g.getPoints();var u=e(q);(u=a?!u:u)?(!l&&k[n]&&n++,k[n]={s:new Nb,p:q},k[n].s.curves=g.curves,l&&n++,p[n]=[]):p[n].push({h:g,p:q[0]})}if(!k[0])return c(f);if(1<k.length){t=!1;a=[];e=0;for(f=k.length;e<f;e++)h[e]=
+[];e=0;for(f=k.length;e<f;e++)for(g=p[e],u=0;u<g.length;u++){l=g[u];n=!0;for(q=0;q<k.length;q++)d(l.p,k[q].p)&&(e!==q&&a.push({froms:e,tos:q,hole:u}),n?(n=!1,h[q].push(l)):t=!0);n&&h[e].push(l)}0<a.length&&(t||(p=h))}t=0;for(e=k.length;t<e;t++)for(h=k[t].s,b.push(h),a=p[t],f=0,g=a.length;f<g;f++)h.holes.push(a[f].h);return b}});Object.assign(xg.prototype,{isFont:!0,generateShapes:function(a,b){void 0===b&&(b=100);var c=[],d=b;b=this.data;var e=Array.from?Array.from(a):String(a).split("");d/=b.resolution;
+var f=(b.boundingBox.yMax-b.boundingBox.yMin+b.underlineThickness)*d;a=[];for(var g=0,h=0,l=0;l<e.length;l++){var k=e[l];if("\n"===k)g=0,h-=f;else{var p=k;k=d;var n=g,t=h,r=b,q=r.glyphs[p]||r.glyphs["?"];if(q){p=new wg;if(q.o){r=q._cachedOutline||(q._cachedOutline=q.o.split(" "));for(var u=0,v=r.length;u<v;)switch(r[u++]){case "m":var x=r[u++]*k+n;var w=r[u++]*k+t;p.moveTo(x,w);break;case "l":x=r[u++]*k+n;w=r[u++]*k+t;p.lineTo(x,w);break;case "q":var y=r[u++]*k+n;var A=r[u++]*k+t;var B=r[u++]*k+n;
+var C=r[u++]*k+t;p.quadraticCurveTo(B,C,y,A);break;case "b":y=r[u++]*k+n,A=r[u++]*k+t,B=r[u++]*k+n,C=r[u++]*k+t,x=r[u++]*k+n,w=r[u++]*k+t,p.bezierCurveTo(B,C,x,w,y,A)}}k={offsetX:q.ha*k,path:p}}else console.error('THREE.Font: character "'+p+'" does not exists in font family '+r.familyName+"."),k=void 0;g+=k.offsetX;a.push(k.path)}}b=0;for(e=a.length;b<e;b++)Array.prototype.push.apply(c,a[b].toShapes());return c}});yg.prototype=Object.assign(Object.create(V.prototype),{constructor:yg,load:function(a,
+b,c,d){var e=this,f=new Ta(this.manager);f.setPath(this.path);f.load(a,function(a){try{var c=JSON.parse(a)}catch(l){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),c=JSON.parse(a.substring(65,a.length-2))}a=e.parse(c);b&&b(a)},c,d)},parse:function(a){return new xg(a)}});var Rf,Dg={getContext:function(){void 0===Rf&&(Rf=new (window.AudioContext||window.webkitAudioContext));return Rf},setContext:function(a){Rf=a}};tf.prototype=Object.assign(Object.create(V.prototype),
+{constructor:tf,load:function(a,b,c,d){var e=this,f=new Ta(e.manager);f.setResponseType("arraybuffer");f.setPath(e.path);f.load(a,function(c){try{var f=c.slice(0);Dg.getContext().decodeAudioData(f,function(a){b(a)})}catch(l){d?d(l):console.error(l),e.manager.itemError(a)}},c,d)}});zg.prototype=Object.assign(Object.create(Ua.prototype),{constructor:zg,isHemisphereLightProbe:!0,copy:function(a){Ua.prototype.copy.call(this,a);return this},toJSON:function(a){return Ua.prototype.toJSON.call(this,a)}});
+Ag.prototype=Object.assign(Object.create(Ua.prototype),{constructor:Ag,isAmbientLightProbe:!0,copy:function(a){Ua.prototype.copy.call(this,a);return this},toJSON:function(a){return Ua.prototype.toJSON.call(this,a)}});var Pi=new N,Qi=new N;Object.assign(gi.prototype,{update:function(a){var b=this._cache;if(b.focus!==a.focus||b.fov!==a.fov||b.aspect!==a.aspect*this.aspect||b.near!==a.near||b.far!==a.far||b.zoom!==a.zoom||b.eyeSep!==this.eyeSep){b.focus=a.focus;b.fov=a.fov;b.aspect=a.aspect*this.aspect;
+b.near=a.near;b.far=a.far;b.zoom=a.zoom;b.eyeSep=this.eyeSep;var c=a.projectionMatrix.clone(),d=b.eyeSep/2,e=d*b.near/b.focus,f=b.near*Math.tan(O.DEG2RAD*b.fov*.5)/b.zoom;Qi.elements[12]=-d;Pi.elements[12]=d;d=-f*b.aspect+e;var g=f*b.aspect+e;c.elements[0]=2*b.near/(g-d);c.elements[8]=(g+d)/(g-d);this.cameraL.projectionMatrix.copy(c);d=-f*b.aspect-e;g=f*b.aspect-e;c.elements[0]=2*b.near/(g-d);c.elements[8]=(g+d)/(g-d);this.cameraR.projectionMatrix.copy(c)}this.cameraL.matrixWorld.copy(a.matrixWorld).multiply(Qi);
+this.cameraR.matrixWorld.copy(a.matrixWorld).multiply(Pi)}});Object.assign(Bg.prototype,{start:function(){this.oldTime=this.startTime=("undefined"===typeof performance?Date:performance).now();this.elapsedTime=0;this.running=!0},stop:function(){this.getElapsedTime();this.autoStart=this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var b=("undefined"===typeof performance?
+Date:performance).now();a=(b-this.oldTime)/1E3;this.oldTime=b;this.elapsedTime+=a}return a}});var uc=new p,Ri=new va,Uk=new p,vc=new p;Cg.prototype=Object.assign(Object.create(y.prototype),{constructor:Cg,getInput:function(){return this.gain},removeFilter:function(){null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null);return this},getFilter:function(){return this.filter},setFilter:function(a){null!==
+this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination);this.filter=a;this.gain.connect(this.filter);this.filter.connect(this.context.destination);return this},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(a){this.gain.gain.setTargetAtTime(a,this.context.currentTime,.01);return this},updateMatrixWorld:function(a){y.prototype.updateMatrixWorld.call(this,a);a=this.context.listener;
+var b=this.up;this.timeDelta=this._clock.getDelta();this.matrixWorld.decompose(uc,Ri,Uk);vc.set(0,0,-1).applyQuaternion(Ri);if(a.positionX){var c=this.context.currentTime+this.timeDelta;a.positionX.linearRampToValueAtTime(uc.x,c);a.positionY.linearRampToValueAtTime(uc.y,c);a.positionZ.linearRampToValueAtTime(uc.z,c);a.forwardX.linearRampToValueAtTime(vc.x,c);a.forwardY.linearRampToValueAtTime(vc.y,c);a.forwardZ.linearRampToValueAtTime(vc.z,c);a.upX.linearRampToValueAtTime(b.x,c);a.upY.linearRampToValueAtTime(b.y,
+c);a.upZ.linearRampToValueAtTime(b.z,c)}else a.setPosition(uc.x,uc.y,uc.z),a.setOrientation(vc.x,vc.y,vc.z,b.x,b.y,b.z)}});gd.prototype=Object.assign(Object.create(y.prototype),{constructor:gd,getOutput:function(){return this.gain},setNodeSource:function(a){this.hasPlaybackControl=!1;this.sourceType="audioNode";this.source=a;this.connect();return this},setMediaElementSource:function(a){this.hasPlaybackControl=!1;this.sourceType="mediaNode";this.source=this.context.createMediaElementSource(a);this.connect();
+return this},setMediaStreamSource:function(a){this.hasPlaybackControl=!1;this.sourceType="mediaStreamNode";this.source=this.context.createMediaStreamSource(a);this.connect();return this},setBuffer:function(a){this.buffer=a;this.sourceType="buffer";this.autoplay&&this.play();return this},play:function(a){void 0===a&&(a=0);if(!0===this.isPlaying)console.warn("THREE.Audio: Audio is already playing.");else if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
+else return this._startedAt=this.context.currentTime+a,a=this.context.createBufferSource(),a.buffer=this.buffer,a.loop=this.loop,a.loopStart=this.loopStart,a.loopEnd=this.loopEnd,a.onended=this.onEnded.bind(this),a.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=a,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()},pause:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
+else return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress%=this.duration||this.buffer.duration),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this},stop:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this._progress=0,this.source.stop(),this.source.onended=null,this.isPlaying=!1,this},connect:function(){if(0<this.filters.length){this.source.connect(this.filters[0]);
+for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].connect(this.filters[a]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this},disconnect:function(){if(0<this.filters.length){this.source.disconnect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].disconnect(this.filters[a]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},
+getFilters:function(){return this.filters},setFilters:function(a){a||(a=[]);!0===this.isPlaying?(this.disconnect(),this.filters=a,this.connect()):this.filters=a;return this},setDetune:function(a){this.detune=a;if(void 0!==this.source.detune)return!0===this.isPlaying&&this.source.detune.setTargetAtTime(this.detune,this.context.currentTime,.01),this},getDetune:function(){return this.detune},getFilter:function(){return this.getFilters()[0]},setFilter:function(a){return this.setFilters(a?[a]:[])},setPlaybackRate:function(a){if(!1===
+this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.playbackRate=a,!0===this.isPlaying&&this.source.playbackRate.setTargetAtTime(this.playbackRate,this.context.currentTime,.01),this},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying=!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop},setLoop:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
+else return this.loop=a,!0===this.isPlaying&&(this.source.loop=this.loop),this},setLoopStart:function(a){this.loopStart=a;return this},setLoopEnd:function(a){this.loopEnd=a;return this},getVolume:function(){return this.gain.gain.value},setVolume:function(a){this.gain.gain.setTargetAtTime(a,this.context.currentTime,.01);return this}});var wc=new p,Si=new va,Vk=new p,xc=new p;Eg.prototype=Object.assign(Object.create(gd.prototype),{constructor:Eg,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},
+setRefDistance:function(a){this.panner.refDistance=a;return this},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(a){this.panner.rolloffFactor=a;return this},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(a){this.panner.distanceModel=a;return this},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(a){this.panner.maxDistance=a;return this},setDirectionalCone:function(a,b,c){this.panner.coneInnerAngle=
+a;this.panner.coneOuterAngle=b;this.panner.coneOuterGain=c;return this},updateMatrixWorld:function(a){y.prototype.updateMatrixWorld.call(this,a);if(!0!==this.hasPlaybackControl||!1!==this.isPlaying)if(this.matrixWorld.decompose(wc,Si,Vk),xc.set(0,0,1).applyQuaternion(Si),a=this.panner,a.positionX){var b=this.context.currentTime+this.listener.timeDelta;a.positionX.linearRampToValueAtTime(wc.x,b);a.positionY.linearRampToValueAtTime(wc.y,b);a.positionZ.linearRampToValueAtTime(wc.z,b);a.orientationX.linearRampToValueAtTime(xc.x,
+b);a.orientationY.linearRampToValueAtTime(xc.y,b);a.orientationZ.linearRampToValueAtTime(xc.z,b)}else a.setPosition(wc.x,wc.y,wc.z),a.setOrientation(xc.x,xc.y,xc.z)}});Object.assign(Fg.prototype,{getFrequencyData:function(){this.analyser.getByteFrequencyData(this.data);return this.data},getAverageFrequency:function(){for(var a=0,b=this.getFrequencyData(),c=0;c<b.length;c++)a+=b[c];return a/b.length}});Object.assign(Gg.prototype,{accumulate:function(a,b){var c=this.buffer,d=this.valueSize;a=a*d+d;
+var e=this.cumulativeWeight;if(0===e){for(e=0;e!==d;++e)c[a+e]=c[e];e=b}else e+=b,this._mixBufferRegion(c,a,0,b/e,d);this.cumulativeWeight=e},accumulateAdditive:function(a){var b=this.buffer,c=this.valueSize,d=c*this._addIndex;0===this.cumulativeWeightAdditive&&this._setIdentity();this._mixBufferRegionAdditive(b,d,0,a,c);this.cumulativeWeightAdditive+=a},apply:function(a){var b=this.valueSize,c=this.buffer;a=a*b+b;var d=this.cumulativeWeight,e=this.cumulativeWeightAdditive,f=this.binding;this.cumulativeWeightAdditive=
+this.cumulativeWeight=0;1>d&&this._mixBufferRegion(c,a,b*this._origIndex,1-d,b);0<e&&this._mixBufferRegionAdditive(c,a,this._addIndex*b,1,b);d=b;for(e=b+b;d!==e;++d)if(c[d]!==c[d+b]){f.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=b*this._origIndex;this.binding.getValue(a,c);for(var d=b;d!==c;++d)a[d]=a[c+d%b];this._setIdentity();this.cumulativeWeightAdditive=this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},
+_setAdditiveIdentityNumeric:function(){for(var a=this._addIndex*this.valueSize,b=a+this.valueSize;a<b;a++)this.buffer[a]=0},_setAdditiveIdentityQuaternion:function(){this._setAdditiveIdentityNumeric();this.buffer[4*this._addIndex+3]=1},_setAdditiveIdentityOther:function(){for(var a=this._origIndex*this.valueSize,b=this._addIndex*this.valueSize,c=0;c<this.valueSize;c++)this.buffer[b+c]=this.buffer[a+c]},_select:function(a,b,c,d,e){if(.5<=d)for(d=0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d){va.slerpFlat(a,
+b,a,b,a,c,d)},_slerpAdditive:function(a,b,c,d,e){e*=this._workIndex;va.multiplyQuaternionsFlat(a,e,a,b,a,c);va.slerpFlat(a,b,a,b,a,e,d)},_lerp:function(a,b,c,d,e){for(var f=1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}},_lerpAdditive:function(a,b,c,d,e){for(var f=0;f!==e;++f){var g=b+f;a[g]+=a[c+f]*d}}});var Wk=/[\[\]\.:\/]/g,Xk="[^"+"\\[\\]\\.:\\/".replace("\\.","")+"]",Yk=/((?:WC+[\/:])*)/.source.replace("WC","[^\\[\\]\\.:\\/]"),Zk=/(WCOD+)?/.source.replace("WCOD",Xk),$k=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",
+"[^\\[\\]\\.:\\/]"),al=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC","[^\\[\\]\\.:\\/]"),bl=new RegExp("^"+Yk+Zk+$k+al+"$"),cl=["material","materials","bones"];Object.assign(hi.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,
+c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].unbind()}});Object.assign(Aa,{Composite:hi,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new Aa.Composite(a,b,c):new Aa(a,b,c)},sanitizeNodeName:function(a){return a.replace(/\s/g,"_").replace(Wk,"")},parseTrackName:function(a){var b=bl.exec(a);if(!b)throw Error("PropertyBinding: Cannot parse trackName: "+a);b={nodeName:b[2],objectName:b[3],objectIndex:b[4],
+propertyName:b[5],propertyIndex:b[6]};var c=b.nodeName&&b.nodeName.lastIndexOf(".");if(void 0!==c&&-1!==c){var d=b.nodeName.substring(c+1);-1!==cl.indexOf(d)&&(b.nodeName=b.nodeName.substring(0,c),b.objectName=d)}if(null===b.propertyName||0===b.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+a);return b},findNode:function(a,b){if(!b||""===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;if(a.skeleton){var c=a.skeleton.getBoneByName(b);if(void 0!==
+c)return c}if(a.children){var d=function(a){for(var c=0;c<a.length;c++){var e=a[c];if(e.name===b||e.uuid===b||(e=d(e.children)))return e}return null};if(a=d(a.children))return a}return null}});Object.assign(Aa.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(a,b){a[b]=this.node[this.propertyName]},function(a,b){for(var c=
+this.resolvedProperty,d=0,e=c.length;d!==e;++d)a[b++]=c[d]},function(a,b){a[b]=this.resolvedProperty[this.propertyIndex]},function(a,b){this.resolvedProperty.toArray(a,b)}],SetterByBindingTypeAndVersioning:[[function(a,b){this.targetObject[this.propertyName]=a[b]},function(a,b){this.targetObject[this.propertyName]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.targetObject[this.propertyName]=a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){for(var c=this.resolvedProperty,
+d=0,e=c.length;d!==e;++d)c[d]=a[b++]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.needsUpdate=!0},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty[this.propertyIndex]=a[b]},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];
+this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty.fromArray(a,b)},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.matrixWorldNeedsUpdate=!0}]],getValue:function(a,b){this.bind();this.getValue(a,b)},setValue:function(a,b){this.bind();this.setValue(a,b)},bind:function(){var a=this.node,b=this.parsedPath,c=b.objectName,d=b.propertyName,e=b.propertyIndex;a||(this.node=
+a=Aa.findNode(this.rootNode,b.nodeName)||this.rootNode);this.getValue=this._getValue_unavailable;this.setValue=this._setValue_unavailable;if(a){if(c){var f=b.objectIndex;switch(c){case "materials":if(!a.material){console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);return}if(!a.material.materials){console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",this);return}a=a.material.materials;
+break;case "bones":if(!a.skeleton){console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);return}a=a.skeleton.bones;for(c=0;c<a.length;c++)if(a[c].name===f){f=c;break}break;default:if(void 0===a[c]){console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);return}a=a[c]}if(void 0!==f){if(void 0===a[f]){console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",this,a);return}a=
+a[f]}}f=a[d];if(void 0===f)console.error("THREE.PropertyBinding: Trying to update property for track: "+b.nodeName+"."+d+" but it wasn't found.",a);else{b=this.Versioning.None;this.targetObject=a;void 0!==a.needsUpdate?b=this.Versioning.NeedsUpdate:void 0!==a.matrixWorldNeedsUpdate&&(b=this.Versioning.MatrixWorldNeedsUpdate);c=this.BindingType.Direct;if(void 0!==e){if("morphTargetInfluences"===d){if(!a.geometry){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",
+this);return}if(a.geometry.isBufferGeometry){if(!a.geometry.morphAttributes){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);return}void 0!==a.morphTargetDictionary[e]&&(e=a.morphTargetDictionary[e])}else{console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.",this);return}}c=this.BindingType.ArrayElement;this.resolvedProperty=f;this.propertyIndex=
+e}else void 0!==f.fromArray&&void 0!==f.toArray?(c=this.BindingType.HasFromToArray,this.resolvedProperty=f):Array.isArray(f)?(c=this.BindingType.EntireArray,this.resolvedProperty=f):this.propertyName=d;this.getValue=this.GetterByBindingType[c];this.setValue=this.SetterByBindingTypeAndVersioning[c][b]}}else console.error("THREE.PropertyBinding: Trying to update node for track: "+this.path+" but it wasn't found.")},unbind:function(){this.node=null;this.getValue=this._getValue_unbound;this.setValue=
+this._setValue_unbound}});Object.assign(Aa.prototype,{_getValue_unbound:Aa.prototype.getValue,_setValue_unbound:Aa.prototype.setValue});Object.assign(ii.prototype,{isAnimationObjectGroup:!0,add:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._paths,f=this._parsedPaths,g=this._bindings,h=g.length,k=void 0,m=0,p=arguments.length;m!==p;++m){var n=arguments[m],t=n.uuid,r=d[t];if(void 0===r){r=b++;d[t]=r;a.push(n);t=0;for(var q=h;t!==q;++t)g[t].push(new Aa(n,
+e[t],f[t]))}else if(r<c){k=a[r];var u=--c;q=a[u];d[q.uuid]=r;a[r]=q;d[t]=u;a[u]=n;t=0;for(q=h;t!==q;++t){var v=g[t],x=v[r];v[r]=v[u];void 0===x&&(x=new Aa(n,e[t],f[t]));v[u]=x}}else a[r]!==k&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_=c},remove:function(){for(var a=this._objects,b=this.nCachedObjects_,c=this._indicesByUUID,d=this._bindings,e=d.length,f=0,g=
+arguments.length;f!==g;++f){var h=arguments[f],k=h.uuid,m=c[k];if(void 0!==m&&m>=b){var p=b++,n=a[p];c[n.uuid]=m;a[m]=n;c[k]=p;a[p]=h;h=0;for(k=e;h!==k;++h){n=d[h];var t=n[m];n[m]=n[p];n[p]=t}}}this.nCachedObjects_=b},uncache:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._bindings,f=e.length,g=0,h=arguments.length;g!==h;++g){var k=arguments[g].uuid,m=d[k];if(void 0!==m)if(delete d[k],m<c){k=--c;var p=a[k],n=--b,t=a[n];d[p.uuid]=m;a[m]=p;d[t.uuid]=
+k;a[k]=t;a.pop();p=0;for(t=f;p!==t;++p){var r=e[p],q=r[n];r[m]=r[k];r[k]=q;r.pop()}}else for(n=--b,t=a[n],d[t.uuid]=m,a[m]=t,a.pop(),p=0,t=f;p!==t;++p)r=e[p],r[m]=r[n],r.pop()}this.nCachedObjects_=c},subscribe_:function(a,b){var c=this._bindingsIndicesByPath,d=c[a],e=this._bindings;if(void 0!==d)return e[d];var f=this._paths,g=this._parsedPaths,h=this._objects,k=this.nCachedObjects_,m=Array(h.length);d=e.length;c[a]=d;f.push(a);g.push(b);e.push(m);c=k;for(d=h.length;c!==d;++c)m[c]=new Aa(h[c],a,b);
+return m},unsubscribe_:function(a){var b=this._bindingsIndicesByPath,c=b[a];if(void 0!==c){var d=this._paths,e=this._parsedPaths,f=this._bindings,g=f.length-1,h=f[g];b[a[g]]=c;f[c]=h;f.pop();e[c]=e[g];e.pop();d[c]=d[g];d.pop()}}});Object.assign(ji.prototype,{play:function(){this._mixer._activateAction(this);return this},stop:function(){this._mixer._deactivateAction(this);return this.reset()},reset:function(){this.paused=!1;this.enabled=!0;this.time=0;this._loopCount=-1;this._startTime=null;return this.stopFading().stopWarping()},
+isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},isScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(a){this._startTime=a;return this},setLoop:function(a,b){this.loop=a;this.repetitions=b;return this},setEffectiveWeight:function(a){this.weight=a;this._effectiveWeight=this.enabled?a:0;return this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(a){return this._scheduleFading(a,
+0,1)},fadeOut:function(a){return this._scheduleFading(a,1,0)},crossFadeFrom:function(a,b,c){a.fadeOut(b);this.fadeIn(b);if(c){c=this._clip.duration;var d=a._clip.duration,e=c/d;a.warp(1,d/c,b);this.warp(e,1,b)}return this},crossFadeTo:function(a,b,c){return a.crossFadeFrom(this,b,c)},stopFading:function(){var a=this._weightInterpolant;null!==a&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},setEffectiveTimeScale:function(a){this.timeScale=a;this._effectiveTimeScale=
+this.paused?0:a;return this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},setDuration:function(a){this.timeScale=this._clip.duration/a;return this.stopWarping()},syncWith:function(a){this.time=a.time;this.timeScale=a.timeScale;return this.stopWarping()},halt:function(a){return this.warp(this._effectiveTimeScale,0,a)},warp:function(a,b,c){var d=this._mixer,e=d.time,f=this._timeScaleInterpolant,g=this.timeScale;null===f&&(this._timeScaleInterpolant=f=d._lendControlInterpolant());
+d=f.parameterPositions;f=f.sampleValues;d[0]=e;d[1]=e+c;f[0]=a/g;f[1]=b/g;return this},stopWarping:function(){var a=this._timeScaleInterpolant;null!==a&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot||this._mixer._root},_update:function(a,b,c,d){if(this.enabled){var e=this._startTime;if(null!==e){b=(a-e)*c;if(0>b||0===c)return;this._startTime=
+null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0<a)switch(b=this._interpolants,e=this._propertyBindings,this.blendMode){case 2501:for(var f=0,g=b.length;f!==g;++f)b[f].evaluate(c),e[f].accumulateAdditive(a);break;default:for(f=0,g=b.length;f!==g;++f)b[f].evaluate(c),e[f].accumulate(d,a)}}else this._updateWeight(a)},_updateWeight:function(a){var b=0;if(this.enabled){b=this.weight;var c=this._weightInterpolant;if(null!==c){var d=c.evaluate(a)[0];b*=d;a>c.parameterPositions[1]&&
+(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){b=this.timeScale;var c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0];b*=d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a,c=this._clip.duration,d=this.loop,e=this._loopCount,f=2202===d;if(0===a)return-1===e?b:f&&1===(e&1)?c-b:b;if(2200===
+d)a:{if(-1===e&&(this._loopCount=0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else{this.time=b;break a}this.clampWhenFinished?this.paused=!0:this.enabled=!1;this.time=b;this._mixer.dispatchEvent({type:"finished",action:this,direction:0>a?-1:1})}else{-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,f)):this._setEndings(0===this.repetitions,!0,f));if(b>=c||0>b){d=Math.floor(b/c);b-=c*d;e+=Math.abs(d);var g=this.repetitions-e;0>=g?(this.clampWhenFinished?this.paused=!0:this.enabled=
+!1,this.time=b=0<a?c:0,this._mixer.dispatchEvent({type:"finished",action:this,direction:0<a?1:-1})):(1===g?(a=0>a,this._setEndings(a,!a,f)):this._setEndings(!1,!1,f),this._loopCount=e,this.time=b,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:d}))}else this.time=b;if(f&&1===(e&1))return c-b}return b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?
+2401:2400:2402)},_scheduleFading:function(a,b,c){var d=this._mixer,e=d.time,f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}});Hg.prototype=Object.assign(Object.create(ua.prototype),{constructor:Hg,_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings;a=a._interpolants;var g=c.uuid,h=this._bindingsByRootAndName,k=h[g];void 0===
+k&&(k={},h[g]=k);for(h=0;h!==e;++h){var m=d[h],p=m.name,n=k[p];if(void 0===n){n=f[h];if(void 0!==n){null===n._cacheIndex&&(++n.referenceCount,this._addInactiveBinding(n,g,p));continue}n=new Gg(Aa.create(c,p,b&&b._propertyBindings[h].binding.parsedPath),m.ValueTypeName,m.getValueSize());++n.referenceCount;this._addInactiveBinding(n,g,p)}f[h]=n;a[h].resultBuffer=n.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,
+d=this._actionsByClip[c];this._bindAction(a,d&&d.knownActions[0]);this._addInactiveAction(a,c,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}},_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b=a._propertyBindings,c=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=
+[];this._nActiveActions=0;this._actionsByClip={};this._bindings=[];this._nActiveBindings=0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length},get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length},get inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},
+_isActiveAction:function(a){a=a._cacheIndex;return null!==a&&a<this._nActiveActions},_addInactiveAction:function(a,b,c){var d=this._actions,e=this._actionsByClip,f=e[b];void 0===f?(f={knownActions:[a],actionByRoot:{}},a._byClipCacheIndex=0,e[b]=f):(b=f.knownActions,a._byClipCacheIndex=b.length,b.push(a));a._cacheIndex=d.length;d.push(a);f.actionByRoot[c]=a},_removeInactiveAction:function(a){var b=this._actions,c=b[b.length-1],d=a._cacheIndex;c._cacheIndex=d;b[d]=c;b.pop();a._cacheIndex=null;b=a._clip.uuid;
+c=this._actionsByClip;d=c[b];var e=d.knownActions,f=e[e.length-1],g=a._byClipCacheIndex;f._byClipCacheIndex=g;e[g]=f;e.pop();a._byClipCacheIndex=null;delete d.actionByRoot[(a._localRoot||this._root).uuid];0===e.length&&delete c[b];this._removeInactiveBindingsForAction(a)},_removeInactiveBindingsForAction:function(a){a=a._propertyBindings;for(var b=0,c=a.length;b!==c;++b){var d=a[b];0===--d.referenceCount&&this._removeInactiveBinding(d)}},_lendAction:function(a){var b=this._actions,c=a._cacheIndex,
+d=this._nActiveActions++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackAction:function(a){var b=this._actions,c=a._cacheIndex,d=--this._nActiveActions,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_addInactiveBinding:function(a,b,c){var d=this._bindingsByRootAndName,e=d[b],f=this._bindings;void 0===e&&(e={},d[b]=e);e[c]=a;a._cacheIndex=f.length;f.push(a)},_removeInactiveBinding:function(a){var b=this._bindings,c=a.binding,d=c.rootNode.uuid;c=c.path;var e=this._bindingsByRootAndName,
+f=e[d],g=b[b.length-1];a=a._cacheIndex;g._cacheIndex=a;b[a]=g;b.pop();delete f[c];0===Object.keys(f).length&&delete e[d]},_lendBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=this._nActiveBindings++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=--this._nActiveBindings,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_lendControlInterpolant:function(){var a=this._controlInterpolants,b=this._nActiveControlInterpolants++,
+c=a[b];void 0===c&&(c=new ie(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),c.__cacheIndex=b,a[b]=c);return c},_takeBackControlInterpolant:function(a){var b=this._controlInterpolants,c=a.__cacheIndex,d=--this._nActiveControlInterpolants,e=b[d];a.__cacheIndex=d;b[d]=a;e.__cacheIndex=c;b[c]=e},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(a,b,c){var d=b||this._root,e=d.uuid;d="string"===typeof a?Sa.findByName(d,a):a;a=null!==d?d.uuid:a;var f=
+this._actionsByClip[a],g=null;void 0===c&&(c=null!==d?d.blendMode:2500);if(void 0!==f){g=f.actionByRoot[e];if(void 0!==g&&g.blendMode===c)return g;g=f.knownActions[0];null===d&&(d=g._clip)}if(null===d)return null;b=new ji(this,d,b,c);this._bindAction(b,g);this._addInactiveAction(b,a,e);return b},existingAction:function(a,b){var c=b||this._root;b=c.uuid;c="string"===typeof a?Sa.findByName(c,a):a;a=this._actionsByClip[c?c.uuid:a];return void 0!==a?a.actionByRoot[b]||null:null},stopAllAction:function(){for(var a=
+this._actions,b=this._nActiveActions-1;0<=b;--b)a[b].stop();return this},update:function(a){a*=this.timeScale;for(var b=this._actions,c=this._nActiveActions,d=this.time+=a,e=Math.sign(a),f=this._accuIndex^=1,g=0;g!==c;++g)b[g]._update(d,a,e,f);a=this._bindings;b=this._nActiveBindings;for(g=0;g!==b;++g)a[g].apply(f);return this},setTime:function(a){for(var b=this.time=0;b<this._actions.length;b++)this._actions[b].time=0;return this.update(a)},getRoot:function(){return this._root},uncacheClip:function(a){var b=
+this._actions;a=a.uuid;var c=this._actionsByClip,d=c[a];if(void 0!==d){d=d.knownActions;for(var e=0,f=d.length;e!==f;++e){var g=d[e];this._deactivateAction(g);var h=g._cacheIndex,k=b[b.length-1];g._cacheIndex=null;g._byClipCacheIndex=null;k._cacheIndex=h;b[h]=k;b.pop();this._removeInactiveBindingsForAction(g)}delete c[a]}},uncacheRoot:function(a){a=a.uuid;var b=this._actionsByClip;for(d in b){var c=b[d].actionByRoot[a];void 0!==c&&(this._deactivateAction(c),this._removeInactiveAction(c))}var d=this._bindingsByRootAndName[a];
+if(void 0!==d)for(var e in d)a=d[e],a.restoreOriginalState(),this._removeInactiveBinding(a)},uncacheAction:function(a,b){a=this.existingAction(a,b);null!==a&&(this._deactivateAction(a),this._removeInactiveAction(a))}});uf.prototype.clone=function(){return new uf(void 0===this.value.clone?this.value:this.value.clone())};Ig.prototype=Object.assign(Object.create(rb.prototype),{constructor:Ig,isInstancedInterleavedBuffer:!0,copy:function(a){rb.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;
+return this}});Object.assign(Jg.prototype,{set:function(a,b){this.ray.set(a,b)},setFromCamera:function(a,b){b&&b.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(b.matrixWorld),this.ray.direction.set(a.x,a.y,.5).unproject(b).sub(this.ray.origin).normalize(),this.camera=b):b&&b.isOrthographicCamera?(this.ray.origin.set(a.x,a.y,(b.near+b.far)/(b.near-b.far)).unproject(b),this.ray.direction.set(0,0,-1).transformDirection(b.matrixWorld),this.camera=b):console.error("THREE.Raycaster: Unsupported camera type.")},
+intersectObject:function(a,b,c){c=c||[];Kg(a,this,c,b);c.sort(ki);return c},intersectObjects:function(a,b,c){c=c||[];if(!1===Array.isArray(a))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),c;for(var d=0,e=a.length;d<e;d++)Kg(a[d],this,c,b);c.sort(ki);return c}});Object.assign(li.prototype,{set:function(a,b,c){this.radius=a;this.phi=b;this.theta=c;return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.phi=
+a.phi;this.theta=a.theta;return this},makeSafe:function(){this.phi=Math.max(1E-6,Math.min(Math.PI-1E-6,this.phi));return this},setFromVector3:function(a){return this.setFromCartesianCoords(a.x,a.y,a.z)},setFromCartesianCoords:function(a,b,c){this.radius=Math.sqrt(a*a+b*b+c*c);0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(a,c),this.phi=Math.acos(O.clamp(b/this.radius,-1,1)));return this}});Object.assign(mi.prototype,{set:function(a,b,c){this.radius=a;this.theta=b;this.y=c;return this},
+clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.theta=a.theta;this.y=a.y;return this},setFromVector3:function(a){return this.setFromCartesianCoords(a.x,a.y,a.z)},setFromCartesianCoords:function(a,b,c){this.radius=Math.sqrt(a*a+c*c);this.theta=Math.atan2(a,c);this.y=b;return this}});var Ti=new v;Object.assign(Lg.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<
+c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(a,b){b=Ti.copy(b).multiplyScalar(.5);this.min.copy(a).sub(b);this.max.copy(a).add(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},getCenter:function(a){void 0===
+a&&(console.warn("THREE.Box2: .getCenter() target is now required"),a=new v);return this.isEmpty()?a.set(0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){void 0===a&&(console.warn("THREE.Box2: .getSize() target is now required"),a=new v);return this.isEmpty()?a.set(0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);
+this.max.addScalar(a);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y},getParameter:function(a,b){void 0===b&&(console.warn("THREE.Box2: .getParameter() target is now required"),b=new v);return b.set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.x<
+this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y?!1:!0},clampPoint:function(a,b){void 0===b&&(console.warn("THREE.Box2: .clampPoint() target is now required"),b=new v);return b.copy(a).clamp(this.min,this.max)},distanceToPoint:function(a){return Ti.copy(a).clamp(this.min,this.max).sub(a).length()},intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);
+this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});var Ui=new p,Sf=new p;Object.assign(Mg.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},getCenter:function(a){void 0===a&&(console.warn("THREE.Line3: .getCenter() target is now required"),a=new p);return a.addVectors(this.start,this.end).multiplyScalar(.5)},
+delta:function(a){void 0===a&&(console.warn("THREE.Line3: .delta() target is now required"),a=new p);return a.subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(a,b){void 0===b&&(console.warn("THREE.Line3: .at() target is now required"),b=new p);return this.delta(b).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(a,b){Ui.subVectors(a,this.start);Sf.subVectors(this.end,
+this.start);a=Sf.dot(Sf);a=Sf.dot(Ui)/a;b&&(a=O.clamp(a,0,1));return a},closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);void 0===c&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),c=new p);return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}});ne.prototype=Object.create(y.prototype);
+ne.prototype.constructor=ne;ne.prototype.isImmediateRenderObject=!0;var Vi=new p;hd.prototype=Object.create(y.prototype);hd.prototype.constructor=hd;hd.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};hd.prototype.update=function(){this.light.updateMatrixWorld();var a=this.light.distance?this.light.distance:1E3,b=a*Math.tan(this.light.angle);this.cone.scale.set(b,b,a);Vi.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(Vi);void 0!==this.color?
+this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)};var Tb=new p,Tf=new N,nh=new N;pc.prototype=Object.create(ma.prototype);pc.prototype.constructor=pc;pc.prototype.isSkeletonHelper=!0;pc.prototype.updateMatrixWorld=function(a){var b=this.bones,c=this.geometry,d=c.getAttribute("position");nh.getInverse(this.root.matrixWorld);for(var e=0,f=0;e<b.length;e++){var g=b[e];g.parent&&g.parent.isBone&&(Tf.multiplyMatrices(nh,g.matrixWorld),Tb.setFromMatrixPosition(Tf),
+d.setXYZ(f,Tb.x,Tb.y,Tb.z),Tf.multiplyMatrices(nh,g.parent.matrixWorld),Tb.setFromMatrixPosition(Tf),d.setXYZ(f+1,Tb.x,Tb.y,Tb.z),f+=2)}c.getAttribute("position").needsUpdate=!0;y.prototype.updateMatrixWorld.call(this,a)};id.prototype=Object.create(ea.prototype);id.prototype.constructor=id;id.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};id.prototype.update=function(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)};
+var dl=new p,Wi=new D,Xi=new D;jd.prototype=Object.create(y.prototype);jd.prototype.constructor=jd;jd.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};jd.prototype.update=function(){var a=this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{var b=a.geometry.getAttribute("color");Wi.copy(this.light.color);Xi.copy(this.light.groundColor);for(var c=0,d=b.count;c<d;c++){var e=c<d/2?Wi:Xi;b.setXYZ(c,e.r,e.g,e.b)}b.needsUpdate=
+!0}a.lookAt(dl.setFromMatrixPosition(this.light.matrixWorld).negate())};vf.prototype=Object.assign(Object.create(ma.prototype),{constructor:vf,copy:function(a){ma.prototype.copy.call(this,a);this.geometry.copy(a.geometry);this.material.copy(a.material);return this},clone:function(){return(new this.constructor).copy(this)}});wf.prototype=Object.create(ma.prototype);wf.prototype.constructor=wf;var Yi=new p,Uf=new p,Zi=new p;kd.prototype=Object.create(y.prototype);kd.prototype.constructor=kd;kd.prototype.dispose=
+function(){this.lightPlane.geometry.dispose();this.lightPlane.material.dispose();this.targetLine.geometry.dispose();this.targetLine.material.dispose()};kd.prototype.update=function(){Yi.setFromMatrixPosition(this.light.matrixWorld);Uf.setFromMatrixPosition(this.light.target.matrixWorld);Zi.subVectors(Uf,Yi);this.lightPlane.lookAt(Uf);void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),
+this.targetLine.material.color.copy(this.light.color));this.targetLine.lookAt(Uf);this.targetLine.scale.z=Zi.length()};var xf=new p,la=new fb;oe.prototype=Object.create(ma.prototype);oe.prototype.constructor=oe;oe.prototype.update=function(){var a=this.geometry,b=this.pointMap;la.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse);fa("c",b,a,la,0,0,-1);fa("t",b,a,la,0,0,1);fa("n1",b,a,la,-1,-1,-1);fa("n2",b,a,la,1,-1,-1);fa("n3",b,a,la,-1,1,-1);fa("n4",b,a,la,1,1,-1);fa("f1",b,a,la,
+-1,-1,1);fa("f2",b,a,la,1,-1,1);fa("f3",b,a,la,-1,1,1);fa("f4",b,a,la,1,1,1);fa("u1",b,a,la,.7,1.1,-1);fa("u2",b,a,la,-.7,1.1,-1);fa("u3",b,a,la,0,2,-1);fa("cf1",b,a,la,-1,0,1);fa("cf2",b,a,la,1,0,1);fa("cf3",b,a,la,0,-1,1);fa("cf4",b,a,la,0,1,1);fa("cn1",b,a,la,-1,0,-1);fa("cn2",b,a,la,1,0,-1);fa("cn3",b,a,la,0,-1,-1);fa("cn4",b,a,la,0,1,-1);a.getAttribute("position").needsUpdate=!0};var Vf=new Va;wb.prototype=Object.create(ma.prototype);wb.prototype.constructor=wb;wb.prototype.update=function(a){void 0!==
+a&&console.warn("THREE.BoxHelper: .update() has no longer arguments.");void 0!==this.object&&Vf.setFromObject(this.object);if(!Vf.isEmpty()){a=Vf.min;var b=Vf.max,c=this.geometry.attributes.position,d=c.array;d[0]=b.x;d[1]=b.y;d[2]=b.z;d[3]=a.x;d[4]=b.y;d[5]=b.z;d[6]=a.x;d[7]=a.y;d[8]=b.z;d[9]=b.x;d[10]=a.y;d[11]=b.z;d[12]=b.x;d[13]=b.y;d[14]=a.z;d[15]=a.x;d[16]=b.y;d[17]=a.z;d[18]=a.x;d[19]=a.y;d[20]=a.z;d[21]=b.x;d[22]=a.y;d[23]=a.z;c.needsUpdate=!0;this.geometry.computeBoundingSphere()}};wb.prototype.setFromObject=
+function(a){this.object=a;this.update();return this};wb.prototype.copy=function(a){ma.prototype.copy.call(this,a);this.object=a.object;return this};wb.prototype.clone=function(){return(new this.constructor).copy(this)};pe.prototype=Object.create(ma.prototype);pe.prototype.constructor=pe;pe.prototype.updateMatrixWorld=function(a){var b=this.box;b.isEmpty()||(b.getCenter(this.position),b.getSize(this.scale),this.scale.multiplyScalar(.5),y.prototype.updateMatrixWorld.call(this,a))};qe.prototype=Object.create(La.prototype);
+qe.prototype.constructor=qe;qe.prototype.updateMatrixWorld=function(a){var b=-this.plane.constant;1E-8>Math.abs(b)&&(b=1E-8);this.scale.set(.5*this.size,.5*this.size,b);this.children[0].material.side=0>b?1:0;this.lookAt(this.plane.normal);y.prototype.updateMatrixWorld.call(this,a)};var $i=new p,yf,Ng;xb.prototype=Object.create(y.prototype);xb.prototype.constructor=xb;xb.prototype.setDirection=function(a){.99999<a.y?this.quaternion.set(0,0,0,1):-.99999>a.y?this.quaternion.set(1,0,0,0):($i.set(a.z,
+0,-a.x).normalize(),this.quaternion.setFromAxisAngle($i,Math.acos(a.y)))};xb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(1E-4,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};xb.prototype.setColor=function(a){this.line.material.color.set(a);this.cone.material.color.set(a)};xb.prototype.copy=function(a){y.prototype.copy.call(this,a,!1);this.line.copy(a.line);this.cone.copy(a.cone);
+return this};xb.prototype.clone=function(){return(new this.constructor).copy(this)};re.prototype=Object.create(ma.prototype);re.prototype.constructor=re;var nb=Math.pow(2,8),aj=[.125,.215,.35,.446,.526,.582],bj=5+aj.length,mb={3E3:0,3001:1,3002:2,3004:3,3005:4,3006:5,3007:6},oh=new fd,ph=function(){for(var a=[],b=[],c=[],d=8,e=0;e<bj;e++){var f=Math.pow(2,d);b.push(f);var g=1/f;4<e?g=aj[e-8+4-1]:0==e&&(g=0);c.push(g);g=1/(f-1);f=-g/2;g=1+g/2;var h=[f,f,g,f,g,g,f,f,g,g,f,g];f=new Float32Array(108);
+g=new Float32Array(72);for(var k=new Float32Array(36),m=0;6>m;m++){var p=m%3*2/3-1,n=2<m?0:-1;f.set([p,n,0,p+2/3,n,0,p+2/3,n+1,0,p,n,0,p+2/3,n+1,0,p,n+1,0],18*m);g.set(h,12*m);k.set([m,m,m,m,m,m],6*m)}h=new F;h.setAttribute("position",new G(f,3));h.setAttribute("uv",new G(g,2));h.setAttribute("faceIndex",new G(k,1));a.push(h);4<d&&d--}return{_lodPlanes:a,_sizeLods:b,_sigmas:c}}(),Ce=ph._lodPlanes,cj=ph._sizeLods,Wf=ph._sigmas,qh=null,yc=(1+Math.sqrt(5))/2,xd=1/yc,dj=[new p(1,1,1),new p(-1,1,1),new p(1,
+1,-1),new p(-1,1,-1),new p(0,yc,xd),new p(0,yc,-xd),new p(xd,0,yc),new p(-xd,0,yc),new p(yc,xd,0),new p(-yc,xd,0)];Og.prototype={constructor:Og,fromScene:function(a,b,c,d){void 0===b&&(b=0);void 0===c&&(c=.1);void 0===d&&(d=100);qh=this._renderer.getRenderTarget();var e=this._allocateTargets();this._sceneToCubeUV(a,c,d,e);0<b&&this._blur(e,0,0,b);this._applyPMREM(e);this._cleanup(e);return e},fromEquirectangular:function(a){a.magFilter=1003;a.minFilter=1003;a.generateMipmaps=!1;return this.fromCubemap(a)},
+fromCubemap:function(a){qh=this._renderer.getRenderTarget();var b=this._allocateTargets(a);this._textureToCubeUV(a,b);this._applyPMREM(b);this._cleanup(b);return b},compileCubemapShader:function(){null===this._cubemapShader&&(this._cubemapShader=qi(),this._compileMaterial(this._cubemapShader))},compileEquirectangularShader:function(){null===this._equirectShader&&(this._equirectShader=pi(),this._compileMaterial(this._equirectShader))},dispose:function(){this._blurMaterial.dispose();null!==this._cubemapShader&&
+this._cubemapShader.dispose();null!==this._equirectShader&&this._equirectShader.dispose();for(var a=0;a<Ce.length;a++)Ce[a].dispose()},_cleanup:function(a){this._pingPongRenderTarget.dispose();this._renderer.setRenderTarget(qh);a.scissorTest=!1;a.setSize(a.width,a.height)},_allocateTargets:function(a){var b=void 0===a||1009!==a.type?!1:3E3===a.encoding||3001===a.encoding||3007===a.encoding;b={magFilter:1003,minFilter:1003,generateMipmaps:!1,type:1009,format:1023,encoding:b?a.encoding:3002,depthBuffer:!1,
+stencilBuffer:!1};var c=oi(b);c.depthBuffer=a?!1:!0;this._pingPongRenderTarget=oi(b);return c},_compileMaterial:function(a){a=new ea(Ce[0],a);this._renderer.compile(a,oh)},_sceneToCubeUV:function(a,b,c,d){b=new P(90,1,b,c);c=[1,-1,1,1,1,1];var e=[1,1,1,-1,-1,-1],f=this._renderer,g=f.outputEncoding,h=f.toneMapping,k=f.toneMappingExposure,m=f.getClearColor(),p=f.getClearAlpha();f.toneMapping=1;f.toneMappingExposure=1;f.outputEncoding=3E3;var n=a.background;if(n&&n.isColor){n.convertSRGBToLinear();var t=
+Math.min(Math.max(Math.ceil(Math.log2(Math.max(n.r,n.g,n.b))),-128),127);n=n.multiplyScalar(Math.pow(2,-t));f.setClearColor(n,(t+128)/255);a.background=null}for(n=0;6>n;n++)t=n%3,0==t?(b.up.set(0,c[n],0),b.lookAt(e[n],0,0)):1==t?(b.up.set(0,0,c[n]),b.lookAt(0,e[n],0)):(b.up.set(0,c[n],0),b.lookAt(0,0,e[n])),Rg(d,t*nb,2<n?nb:0,nb,nb),f.setRenderTarget(d),f.render(a,b);f.toneMapping=h;f.toneMappingExposure=k;f.outputEncoding=g;f.setClearColor(m,p)},_textureToCubeUV:function(a,b){var c=this._renderer;
+a.isCubeTexture?null==this._cubemapShader&&(this._cubemapShader=qi()):null==this._equirectShader&&(this._equirectShader=pi());var d=a.isCubeTexture?this._cubemapShader:this._equirectShader,e=new ea(Ce[0],d);d=d.uniforms;d.envMap.value=a;a.isCubeTexture||d.texelSize.value.set(1/a.image.width,1/a.image.height);d.inputEncoding.value=mb[a.encoding];d.outputEncoding.value=mb[b.texture.encoding];Rg(b,0,0,3*nb,2*nb);c.setRenderTarget(b);c.render(e,oh)},_applyPMREM:function(a){var b=this._renderer,c=b.autoClear;
+b.autoClear=!1;for(var d=1;d<bj;d++)this._blur(a,d-1,d,Math.sqrt(Wf[d]*Wf[d]-Wf[d-1]*Wf[d-1]),dj[(d-1)%dj.length]);b.autoClear=c},_blur:function(a,b,c,d,e){var f=this._pingPongRenderTarget;this._halfBlur(a,f,b,c,d,"latitudinal",e);this._halfBlur(f,a,c,c,d,"longitudinal",e)},_halfBlur:function(a,b,c,d,e,f,g){var h=this._renderer,k=this._blurMaterial;"latitudinal"!==f&&"longitudinal"!==f&&console.error("blur direction must be either latitudinal or longitudinal!");var m=new ea(Ce[d],k);k=k.uniforms;
+var p=cj[c]-1;p=isFinite(e)?Math.PI/(2*p):2*Math.PI/39;var n=e/p,t=isFinite(e)?1+Math.floor(3*n):20;20<t&&console.warn("sigmaRadians, "+e+", is too large and will clip, as it requested "+t+" samples when the maximum is set to 20");e=[];for(var r=0,q=0;20>q;++q){var u=q/n;u=Math.exp(-u*u/2);e.push(u);0==q?r+=u:q<t&&(r+=2*u)}for(q=0;q<e.length;q++)e[q]/=r;k.envMap.value=a.texture;k.samples.value=t;k.weights.value=e;k.latitudinal.value="latitudinal"===f;g&&(k.poleAxis.value=g);k.dTheta.value=p;k.mipInt.value=
+8-c;k.inputEncoding.value=mb[a.texture.encoding];k.outputEncoding.value=mb[a.texture.encoding];a=cj[d];u=3*Math.max(0,nb-2*a);Rg(b,u,(0===d?0:2*nb)+2*a*(4<d?d-8+4:0),3*a,2*a);h.setRenderTarget(b);h.render(m,oh)}};H.create=function(a,b){console.log("THREE.Curve.create() has been deprecated");a.prototype=Object.create(H.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};Object.assign(vb.prototype,{createPointsGeometry:function(a){console.warn("THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");
+a=this.getPoints(a);return this.createGeometry(a)},createSpacedPointsGeometry:function(a){console.warn("THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");a=this.getSpacedPoints(a);return this.createGeometry(a)},createGeometry:function(a){console.warn("THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");for(var b=new L,c=0,d=a.length;c<d;c++){var e=a[c];b.vertices.push(new p(e.x,
+e.y,e.z||0))}return b}});Object.assign(bb.prototype,{fromPoints:function(a){console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints().");return this.setFromPoints(a)}});ri.prototype=Object.create(qa.prototype);si.prototype=Object.create(qa.prototype);Sg.prototype=Object.create(qa.prototype);Object.assign(Sg.prototype,{initFromArray:function(){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},
+reparametrizeByArcLength:function(){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}});vf.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};pc.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")};Object.assign(V.prototype,{extractUrlBase:function(a){console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.");
+return lh.extractUrlBase(a)}});V.Handlers={add:function(){console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.")},get:function(){console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.")}};Object.assign(sf.prototype,{setTexturePath:function(a){console.warn("THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().");return this.setResourcePath(a)}});Object.assign(Lg.prototype,{center:function(a){console.warn("THREE.Box2: .center() has been renamed to .getCenter().");
+return this.getCenter(a)},empty:function(){console.warn("THREE.Box2: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},size:function(a){console.warn("THREE.Box2: .size() has been renamed to .getSize().");return this.getSize(a)}});Object.assign(Va.prototype,{center:function(a){console.warn("THREE.Box3: .center() has been renamed to .getCenter().");
+return this.getCenter(a)},empty:function(){console.warn("THREE.Box3: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)},size:function(a){console.warn("THREE.Box3: .size() has been renamed to .getSize().");
+return this.getSize(a)}});Object.assign(eb.prototype,{empty:function(){console.warn("THREE.Sphere: .empty() has been renamed to .isEmpty().");return this.isEmpty()}});Gc.prototype.setFromMatrix=function(a){console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix().");return this.setFromProjectionMatrix(a)};Mg.prototype.center=function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");return this.getCenter(a)};Object.assign(O,{random16:function(){console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead.");
+return Math.random()},nearestPowerOfTwo:function(a){console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().");return O.floorPowerOfTwo(a)},nextPowerOfTwo:function(a){console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().");return O.ceilPowerOfTwo(a)}});Object.assign(ya.prototype,{flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},
+multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},multiplyVector3Array:function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBufferAttribute:function(a){console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},applyToVector3Array:function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}});
+Object.assign(N.prototype,{extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");return this.copyPosition(a)},flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},getPosition:function(){console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");return(new p).setFromMatrixColumn(this,
+3)},setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().");return this.makeRotationFromQuaternion(a)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector4:function(a){console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");
+return a.applyMatrix4(this)},multiplyVector3Array:function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},rotateAxis:function(a){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");a.transformDirection(this)},crossVector:function(a){console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},
+rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBufferAttribute:function(a){console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},
+applyToVector3Array:function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},makeFrustum:function(a,b,c,d,e,f){console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.");return this.makePerspective(a,b,d,c,e,f)}});Wa.prototype.isIntersectionLine=function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");return this.intersectsLine(a)};va.prototype.multiplyVector3=
+function(a){console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return a.applyQuaternion(this)};Object.assign(Wb.prototype,{isIntersectionBox:function(a){console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionPlane:function(a){console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().");return this.intersectsPlane(a)},isIntersectionSphere:function(a){console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().");
+return this.intersectsSphere(a)}});Object.assign(pa.prototype,{area:function(){console.warn("THREE.Triangle: .area() has been renamed to .getArea().");return this.getArea()},barycoordFromPoint:function(a,b){console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().");return this.getBarycoord(a,b)},midpoint:function(a){console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint().");return this.getMidpoint(a)},normal:function(a){console.warn("THREE.Triangle: .normal() has been renamed to .getNormal().");
+return this.getNormal(a)},plane:function(a){console.warn("THREE.Triangle: .plane() has been renamed to .getPlane().");return this.getPlane(a)}});Object.assign(pa,{barycoordFromPoint:function(a,b,c,d,e){console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().");return pa.getBarycoord(a,b,c,d,e)},normal:function(a,b,c,d){console.warn("THREE.Triangle: .normal() has been renamed to .getNormal().");return pa.getNormal(a,b,c,d)}});Object.assign(Nb.prototype,{extractAllPoints:function(a){console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.");
+return this.extractPoints(a)},extrude:function(a){console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");return new dc(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new fc(this,a)}});Object.assign(v.prototype,{fromAttribute:function(a,b,c){console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},distanceToManhattan:function(a){console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().");
+return this.manhattanDistanceTo(a)},lengthManhattan:function(){console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});Object.assign(p.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},
+getPositionFromMatrix:function(a){console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().");return this.setFromMatrixPosition(a)},getScaleFromMatrix:function(a){console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().");return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,b){console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().");return this.setFromMatrixColumn(b,
+a)},applyProjection:function(a){console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.");return this.applyMatrix4(a)},fromAttribute:function(a,b,c){console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},distanceToManhattan:function(a){console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().");return this.manhattanDistanceTo(a)},lengthManhattan:function(){console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().");
+return this.manhattanLength()}});Object.assign(R.prototype,{fromAttribute:function(a,b,c){console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},lengthManhattan:function(){console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});Object.assign(L.prototype,{computeTangents:function(){console.error("THREE.Geometry: .computeTangents() has been removed.")},computeLineDistances:function(){console.error("THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.")},
+applyMatrix:function(a){console.warn("THREE.Geometry: .applyMatrix() has been renamed to .applyMatrix4().");return this.applyMatrix4(a)}});Object.assign(y.prototype,{getChildByName:function(a){console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().");return this.getObjectByName(a)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(a,b){console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.");
+return this.translateOnAxis(b,a)},getWorldRotation:function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")},applyMatrix:function(a){console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4().");return this.applyMatrix4(a)}});Object.defineProperties(y.prototype,{eulerOrder:{get:function(){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");return this.rotation.order},set:function(a){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");
+this.rotation.order=a}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}});Object.assign(ea.prototype,{setDrawMode:function(){console.error("THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}});
+Object.defineProperties(ea.prototype,{drawMode:{get:function(){console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode.");return 0},set:function(){console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}}});Object.defineProperties(Nd.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");
+return this.levels}}});Object.defineProperty(Re.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}});Qe.prototype.initBones=function(){console.error("THREE.SkinnedMesh: initBones() has been removed.")};Object.defineProperty(H.prototype,"__arcLengthDivisions",{get:function(){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");return this.arcLengthDivisions},
+set:function(a){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");this.arcLengthDivisions=a}});P.prototype.setLens=function(a,b){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.");void 0!==b&&(this.filmGauge=b);this.setFocalLength(a)};Object.defineProperties(S.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(a){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov.");
+this.shadow.camera.fov=a}},shadowCameraLeft:{set:function(a){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left.");this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right.");this.shadow.camera.right=a}},shadowCameraTop:{set:function(a){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top.");this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.");
+this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near.");this.shadow.camera.near=a}},shadowCameraFar:{set:function(a){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far.");this.shadow.camera.far=a}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(a){console.warn("THREE.Light: .shadowBias is now .shadow.bias.");
+this.shadow.bias=a}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(a){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.");this.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.");this.shadow.mapSize.height=a}}});Object.defineProperties(G.prototype,{length:{get:function(){console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead.");
+return this.array.length}},dynamic:{get:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.");return 35048===this.usage},set:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.");this.setUsage(35048)}}});Object.assign(G.prototype,{setDynamic:function(a){console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead.");this.setUsage(!0===a?35048:35044);return this},copyIndicesArray:function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")},
+setArray:function(){console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")}});Object.assign(F.prototype,{addIndex:function(a){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");this.setIndex(a)},addAttribute:function(a,b,c){console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute().");return b&&b.isBufferAttribute||b&&b.isInterleavedBufferAttribute?"index"===
+a?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(b),this):this.setAttribute(a,b):(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.setAttribute(a,new G(b,c)))},addDrawCall:function(a,b,c){void 0!==c&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.");console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup().");this.addGroup(a,b)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().");
+this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")},removeAttribute:function(a){console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute().");return this.deleteAttribute(a)},applyMatrix:function(a){console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4().");return this.applyMatrix4(a)}});
+Object.defineProperties(F.prototype,{drawcalls:{get:function(){console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups.");return this.groups}},offsets:{get:function(){console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups.");return this.groups}}});Object.defineProperties(me.prototype,{maxInstancedCount:{get:function(){console.warn("THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount.");return this.instanceCount},set:function(a){console.warn("THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount.");
+this.instanceCount=a}}});Object.defineProperties(Jg.prototype,{linePrecision:{get:function(){console.warn("THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead.");return this.params.Line.threshold},set:function(a){console.warn("THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead.");this.params.Line.threshold=a}}});Object.defineProperties(rb.prototype,{dynamic:{get:function(){console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead.");
+return 35048===this.usage},set:function(a){console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead.");this.setUsage(a)}}});Object.assign(rb.prototype,{setDynamic:function(a){console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead.");this.setUsage(!0===a?35048:35044);return this},setArray:function(){console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")}});
+Object.assign(hb.prototype,{getArrays:function(){console.error("THREE.ExtrudeBufferGeometry: .getArrays() has been removed.")},addShapeList:function(){console.error("THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.")},addShape:function(){console.error("THREE.ExtrudeBufferGeometry: .addShape() has been removed.")}});Object.defineProperties(uf.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.");
+return this}}});Object.defineProperties(K.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},overdraw:{get:function(){console.warn("THREE.Material: .overdraw has been removed.")},set:function(){console.warn("THREE.Material: .overdraw has been removed.")}},wrapRGB:{get:function(){console.warn("THREE.Material: .wrapRGB has been removed.");return new D}},shading:{get:function(){console.error("THREE."+
+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(a){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.");this.flatShading=1===a}},stencilMask:{get:function(){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead.");return this.stencilFuncMask},set:function(a){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead.");this.stencilFuncMask=
+a}}});Object.defineProperties(Mb.prototype,{metal:{get:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.");return!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}});Object.defineProperties(Ca.prototype,{derivatives:{get:function(){console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");return this.extensions.derivatives},
+set:function(a){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");this.extensions.derivatives=a}}});Object.assign(jg.prototype,{clearTarget:function(a,b,c,d){console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.");this.setRenderTarget(a);this.clear(b,c,d)},animate:function(a){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop().");this.setAnimationLoop(a)},getCurrentRenderTarget:function(){console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().");
+return this.getRenderTarget()},getMaxAnisotropy:function(){console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().");return this.capabilities.getMaxAnisotropy()},getPrecision:function(){console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.");return this.capabilities.precision},resetGLState:function(){console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset().");return this.state.reset()},supportsFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' ).");
+return this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).");return this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' ).");return this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' ).");
+return this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).");return this.extensions.get("WEBGL_compressed_texture_pvrtc")},supportsBlendMinMax:function(){console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).");return this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.");
+return this.capabilities.vertexTextures},supportsInstancedArrays:function(){console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' ).");return this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(a){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().");this.setScissorTest(a)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},
+addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},setFaceCulling:function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")},allocTextureUnit:function(){console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")},setTexture:function(){console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")},setTexture2D:function(){console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")},
+setTextureCube:function(){console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")},getActiveMipMapLevel:function(){console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel().");return this.getActiveMipmapLevel()}});Object.defineProperties(jg.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},
+set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.");this.shadowMap.type=a}},shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}},context:{get:function(){console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.");return this.getContext()}},
+vr:{get:function(){console.warn("THREE.WebGLRenderer: .vr has been renamed to .xr");return this.xr}},gammaInput:{get:function(){console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.");return!1},set:function(){console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.")}},gammaOutput:{get:function(){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.");
+return!1},set:function(a){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.");this.outputEncoding=!0===a?3001:3E3}}});Object.defineProperties(Rh.prototype,{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}},renderReverseSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")},
+set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")}},renderSingleSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")}}});Object.defineProperties(Ba.prototype,{wrapS:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");
+return this.texture.wrapS},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");this.texture.wrapS=a}},wrapT:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");return this.texture.wrapT},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");this.texture.wrapT=a}},magFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");return this.texture.magFilter},
+set:function(a){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");this.texture.magFilter=a}},minFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");return this.texture.minFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");this.texture.minFilter=a}},anisotropy:{get:function(){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");return this.texture.anisotropy},
+set:function(a){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");this.texture.anisotropy=a}},offset:{get:function(){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");return this.texture.offset},set:function(a){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");this.texture.offset=a}},repeat:{get:function(){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");return this.texture.repeat},set:function(a){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");
+this.texture.repeat=a}},format:{get:function(){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");return this.texture.format},set:function(a){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");this.texture.format=a}},type:{get:function(){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");return this.texture.type},set:function(a){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");this.texture.type=a}},generateMipmaps:{get:function(){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");
+return this.texture.generateMipmaps},set:function(a){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");this.texture.generateMipmaps=a}}});Object.defineProperties(gd.prototype,{load:{value:function(a){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var b=this;(new tf).load(a,function(a){b.setBuffer(a)});return this}},startTime:{set:function(){console.warn("THREE.Audio: .startTime is now .play( delay ).")}}});Fg.prototype.getData=
+function(){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");return this.getFrequencyData()};Fc.prototype.updateCubeMap=function(a,b){console.warn("THREE.CubeCamera: .updateCubeMap() is now .update().");return this.update(a,b)};Ob.crossOrigin=void 0;Ob.loadTexture=function(a,b,c,d){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");var e=new ef;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a};
+Ob.loadTextureCube=function(a,b,c,d){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");var e=new df;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a};Ob.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")};Ob.loadCompressedTextureCube=function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")};
+"undefined"!==typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:"117"}}));k.ACESFilmicToneMapping=5;k.AddEquation=100;k.AddOperation=2;k.AdditiveAnimationBlendMode=2501;k.AdditiveBlending=2;k.AlphaFormat=1021;k.AlwaysDepth=1;k.AlwaysStencilFunc=519;k.AmbientLight=mf;k.AmbientLightProbe=Ag;k.AnimationClip=Sa;k.AnimationLoader=rg;k.AnimationMixer=Hg;k.AnimationObjectGroup=ii;k.AnimationUtils=ka;k.ArcCurve=ed;k.ArrayCamera=Le;k.ArrowHelper=xb;k.Audio=
+gd;k.AudioAnalyser=Fg;k.AudioContext=Dg;k.AudioListener=Cg;k.AudioLoader=tf;k.AxesHelper=re;k.AxisHelper=function(a){console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper.");return new re(a)};k.BackSide=1;k.BasicDepthPacking=3200;k.BasicShadowMap=0;k.BinaryTextureLoader=function(a){console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.");return new cf(a)};k.Bone=kg;k.BooleanKeyframeTrack=Ze;k.BoundingBoxHelper=function(a,b){console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.");
+return new wb(a,b)};k.Box2=Lg;k.Box3=Va;k.Box3Helper=pe;k.BoxBufferGeometry=Gd;k.BoxGeometry=fh;k.BoxHelper=wb;k.BufferAttribute=G;k.BufferGeometry=F;k.BufferGeometryLoader=rf;k.ByteType=1010;k.Cache=tc;k.Camera=fb;k.CameraHelper=oe;k.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been removed")};k.CanvasTexture=Od;k.CatmullRomCurve3=qa;k.CineonToneMapping=4;k.CircleBufferGeometry=ad;k.CircleGeometry=he;k.ClampToEdgeWrapping=1001;k.Clock=Bg;k.ClosedSplineCurve3=ri;k.Color=D;k.ColorKeyframeTrack=
+$e;k.CompressedTexture=Oc;k.CompressedTextureLoader=sg;k.ConeBufferGeometry=ge;k.ConeGeometry=fe;k.CubeCamera=Fc;k.CubeGeometry=fh;k.CubeReflectionMapping=301;k.CubeRefractionMapping=302;k.CubeTexture=qb;k.CubeTextureLoader=df;k.CubeUVReflectionMapping=306;k.CubeUVRefractionMapping=307;k.CubicBezierCurve=Ya;k.CubicBezierCurve3=jb;k.CubicInterpolant=Xe;k.CullFaceBack=1;k.CullFaceFront=2;k.CullFaceFrontBack=3;k.CullFaceNone=0;k.Curve=H;k.CurvePath=vb;k.CustomBlending=5;k.CylinderBufferGeometry=tb;k.CylinderGeometry=
+hc;k.Cylindrical=mi;k.DataTexture=$b;k.DataTexture2DArray=Hc;k.DataTexture3D=Ic;k.DataTextureLoader=cf;k.DecrementStencilOp=7683;k.DecrementWrapStencilOp=34056;k.DefaultLoadingManager=ei;k.DepthFormat=1026;k.DepthStencilFormat=1027;k.DepthTexture=Pd;k.DirectionalLight=lf;k.DirectionalLightHelper=kd;k.DirectionalLightShadow=kf;k.DiscreteInterpolant=Ye;k.DodecahedronBufferGeometry=Tc;k.DodecahedronGeometry=Vd;k.DoubleSide=2;k.DstAlphaFactor=206;k.DstColorFactor=208;k.DynamicBufferAttribute=function(a,
+b){console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead.");return(new G(a,b)).setUsage(35048)};k.DynamicCopyUsage=35050;k.DynamicDrawUsage=35048;k.DynamicReadUsage=35049;k.EdgesGeometry=$c;k.EdgesHelper=function(a,b){console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.");return new ma(new $c(a.geometry),new da({color:void 0!==b?b:16777215}))};k.EllipseCurve=Na;k.EqualDepth=4;k.EqualStencilFunc=
+514;k.EquirectangularReflectionMapping=303;k.EquirectangularRefractionMapping=304;k.Euler=Ub;k.EventDispatcher=ua;k.ExtrudeBufferGeometry=hb;k.ExtrudeGeometry=dc;k.Face3=Ac;k.Face4=function(a,b,c,d,e,f,g){console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead.");return new Ac(a,b,c,e,f,g)};k.FaceColors=1;k.FileLoader=Ta;k.FlatShading=1;k.Float32Attribute=function(a,b){console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.");
+return new B(a,b)};k.Float32BufferAttribute=B;k.Float64Attribute=function(a,b){console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.");return new Dd(a,b)};k.Float64BufferAttribute=Dd;k.FloatType=1015;k.Fog=Oe;k.FogExp2=Ne;k.Font=xg;k.FontLoader=yg;k.FrontFaceDirectionCCW=1;k.FrontFaceDirectionCW=0;k.FrontSide=0;k.Frustum=Gc;k.GammaEncoding=3007;k.Geometry=L;k.GeometryUtils={merge:function(a,b,c){console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.");
+if(b.isMesh){b.matrixAutoUpdate&&b.updateMatrix();var d=b.matrix;b=b.geometry}a.merge(b,d,c)},center:function(a){console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.");return a.center()}};k.GreaterDepth=6;k.GreaterEqualDepth=5;k.GreaterEqualStencilFunc=518;k.GreaterStencilFunc=516;k.GridHelper=vf;k.Group=Kc;k.HalfFloatType=1016;k.HemisphereLight=ff;k.HemisphereLightHelper=jd;k.HemisphereLightProbe=zg;k.IcosahedronBufferGeometry=Sc;k.IcosahedronGeometry=
+Ud;k.ImageBitmapLoader=vg;k.ImageLoader=dd;k.ImageUtils=Ob;k.ImmediateRenderObject=ne;k.IncrementStencilOp=7682;k.IncrementWrapStencilOp=34055;k.InstancedBufferAttribute=qf;k.InstancedBufferGeometry=me;k.InstancedInterleavedBuffer=Ig;k.InstancedMesh=Se;k.Int16Attribute=function(a,b){console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.");return new Bd(a,b)};k.Int16BufferAttribute=Bd;k.Int32Attribute=function(a,b){console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.");
+return new Cd(a,b)};k.Int32BufferAttribute=Cd;k.Int8Attribute=function(a,b){console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.");return new yd(a,b)};k.Int8BufferAttribute=yd;k.IntType=1013;k.InterleavedBuffer=rb;k.InterleavedBufferAttribute=Kd;k.Interpolant=Ma;k.InterpolateDiscrete=2300;k.InterpolateLinear=2301;k.InterpolateSmooth=2302;k.InvertStencilOp=5386;k.JSONLoader=function(){console.error("THREE.JSONLoader has been removed.")};k.KeepStencilOp=7680;
+k.KeyframeTrack=ta;k.LOD=Nd;k.LatheBufferGeometry=Zc;k.LatheGeometry=ee;k.Layers=De;k.LensFlare=function(){console.error("THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js")};k.LessDepth=2;k.LessEqualDepth=3;k.LessEqualStencilFunc=515;k.LessStencilFunc=513;k.Light=S;k.LightProbe=Ua;k.LightShadow=lb;k.Line=La;k.Line3=Mg;k.LineBasicMaterial=da;k.LineCurve=Ia;k.LineCurve3=Za;k.LineDashedMaterial=oc;k.LineLoop=Te;k.LinePieces=1;k.LineSegments=ma;k.LineStrip=0;k.LinearEncoding=3E3;k.LinearFilter=
+1006;k.LinearInterpolant=ie;k.LinearMipMapLinearFilter=1008;k.LinearMipMapNearestFilter=1007;k.LinearMipmapLinearFilter=1008;k.LinearMipmapNearestFilter=1007;k.LinearToneMapping=1;k.Loader=V;k.LoaderUtils=lh;k.LoadingManager=qg;k.LogLuvEncoding=3003;k.LoopOnce=2200;k.LoopPingPong=2202;k.LoopRepeat=2201;k.LuminanceAlphaFormat=1025;k.LuminanceFormat=1024;k.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2};k.Material=K;k.MaterialLoader=pf;k.Math=O;k.MathUtils=O;k.Matrix3=ya;k.Matrix4=N;k.MaxEquation=
+104;k.Mesh=ea;k.MeshBasicMaterial=Pa;k.MeshDepthMaterial=Hb;k.MeshDistanceMaterial=Ib;k.MeshFaceMaterial=function(a){console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead.");return a};k.MeshLambertMaterial=mc;k.MeshMatcapMaterial=nc;k.MeshNormalMaterial=lc;k.MeshPhongMaterial=Mb;k.MeshPhysicalMaterial=jc;k.MeshStandardMaterial=ib;k.MeshToonMaterial=kc;k.MinEquation=103;k.MirroredRepeatWrapping=1002;k.MixOperation=1;k.MultiMaterial=function(a){void 0===a&&(a=[]);console.warn("THREE.MultiMaterial has been removed. Use an Array instead.");
+a.isMultiMaterial=!0;a.materials=a;a.clone=function(){return a.slice()};return a};k.MultiplyBlending=4;k.MultiplyOperation=0;k.NearestFilter=1003;k.NearestMipMapLinearFilter=1005;k.NearestMipMapNearestFilter=1004;k.NearestMipmapLinearFilter=1005;k.NearestMipmapNearestFilter=1004;k.NeverDepth=0;k.NeverStencilFunc=512;k.NoBlending=0;k.NoColors=0;k.NoToneMapping=0;k.NormalAnimationBlendMode=2500;k.NormalBlending=1;k.NotEqualDepth=7;k.NotEqualStencilFunc=517;k.NumberKeyframeTrack=bd;k.Object3D=y;k.ObjectLoader=
+sf;k.ObjectSpaceNormalMap=1;k.OctahedronBufferGeometry=bc;k.OctahedronGeometry=Td;k.OneFactor=201;k.OneMinusDstAlphaFactor=207;k.OneMinusDstColorFactor=209;k.OneMinusSrcAlphaFactor=205;k.OneMinusSrcColorFactor=203;k.OrthographicCamera=fd;k.PCFShadowMap=1;k.PCFSoftShadowMap=2;k.PMREMGenerator=Og;k.ParametricBufferGeometry=Qc;k.ParametricGeometry=Qd;k.Particle=function(a){console.warn("THREE.Particle has been renamed to THREE.Sprite.");return new Ld(a)};k.ParticleBasicMaterial=function(a){console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.");
+return new Xa(a)};k.ParticleSystem=function(a,b){console.warn("THREE.ParticleSystem has been renamed to THREE.Points.");return new Nc(a,b)};k.ParticleSystemMaterial=function(a){console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.");return new Xa(a)};k.Path=bb;k.PerspectiveCamera=P;k.Plane=Wa;k.PlaneBufferGeometry=ac;k.PlaneGeometry=Fd;k.PlaneHelper=qe;k.PointCloud=function(a,b){console.warn("THREE.PointCloud has been renamed to THREE.Points.");return new Nc(a,b)};k.PointCloudMaterial=
+function(a){console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.");return new Xa(a)};k.PointLight=jf;k.PointLightHelper=id;k.Points=Nc;k.PointsMaterial=Xa;k.PolarGridHelper=wf;k.PolyhedronBufferGeometry=Ga;k.PolyhedronGeometry=Rd;k.PositionalAudio=Eg;k.PropertyBinding=Aa;k.PropertyMixer=Gg;k.QuadraticBezierCurve=$a;k.QuadraticBezierCurve3=kb;k.Quaternion=va;k.QuaternionKeyframeTrack=je;k.QuaternionLinearInterpolant=af;k.REVISION="117";k.RGBADepthPacking=3201;k.RGBAFormat=
+1023;k.RGBAIntegerFormat=1033;k.RGBA_ASTC_10x10_Format=37819;k.RGBA_ASTC_10x5_Format=37816;k.RGBA_ASTC_10x6_Format=37817;k.RGBA_ASTC_10x8_Format=37818;k.RGBA_ASTC_12x10_Format=37820;k.RGBA_ASTC_12x12_Format=37821;k.RGBA_ASTC_4x4_Format=37808;k.RGBA_ASTC_5x4_Format=37809;k.RGBA_ASTC_5x5_Format=37810;k.RGBA_ASTC_6x5_Format=37811;k.RGBA_ASTC_6x6_Format=37812;k.RGBA_ASTC_8x5_Format=37813;k.RGBA_ASTC_8x6_Format=37814;k.RGBA_ASTC_8x8_Format=37815;k.RGBA_BPTC_Format=36492;k.RGBA_ETC2_EAC_Format=37496;k.RGBA_PVRTC_2BPPV1_Format=
+35843;k.RGBA_PVRTC_4BPPV1_Format=35842;k.RGBA_S3TC_DXT1_Format=33777;k.RGBA_S3TC_DXT3_Format=33778;k.RGBA_S3TC_DXT5_Format=33779;k.RGBDEncoding=3006;k.RGBEEncoding=3002;k.RGBEFormat=1023;k.RGBFormat=1022;k.RGBIntegerFormat=1032;k.RGBM16Encoding=3005;k.RGBM7Encoding=3004;k.RGB_ETC1_Format=36196;k.RGB_ETC2_Format=37492;k.RGB_PVRTC_2BPPV1_Format=35841;k.RGB_PVRTC_4BPPV1_Format=35840;k.RGB_S3TC_DXT1_Format=33776;k.RGFormat=1030;k.RGIntegerFormat=1031;k.RawShaderMaterial=ub;k.Ray=Wb;k.Raycaster=Jg;k.RectAreaLight=
+nf;k.RedFormat=1028;k.RedIntegerFormat=1029;k.ReinhardToneMapping=2;k.RepeatWrapping=1E3;k.ReplaceStencilOp=7681;k.ReverseSubtractEquation=102;k.RingBufferGeometry=Yc;k.RingGeometry=de;k.SRGB8_ALPHA8_ASTC_10x10_Format=37851;k.SRGB8_ALPHA8_ASTC_10x5_Format=37848;k.SRGB8_ALPHA8_ASTC_10x6_Format=37849;k.SRGB8_ALPHA8_ASTC_10x8_Format=37850;k.SRGB8_ALPHA8_ASTC_12x10_Format=37852;k.SRGB8_ALPHA8_ASTC_12x12_Format=37853;k.SRGB8_ALPHA8_ASTC_4x4_Format=37840;k.SRGB8_ALPHA8_ASTC_5x4_Format=37841;k.SRGB8_ALPHA8_ASTC_5x5_Format=
+37842;k.SRGB8_ALPHA8_ASTC_6x5_Format=37843;k.SRGB8_ALPHA8_ASTC_6x6_Format=37844;k.SRGB8_ALPHA8_ASTC_8x5_Format=37845;k.SRGB8_ALPHA8_ASTC_8x6_Format=37846;k.SRGB8_ALPHA8_ASTC_8x8_Format=37847;k.Scene=zc;k.SceneUtils={createMultiMaterialObject:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},detach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},attach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")}};
+k.ShaderChunk=M;k.ShaderLib=gb;k.ShaderMaterial=Ca;k.ShadowMaterial=ic;k.Shape=Nb;k.ShapeBufferGeometry=gc;k.ShapeGeometry=fc;k.ShapePath=wg;k.ShapeUtils=sb;k.ShortType=1011;k.Skeleton=Re;k.SkeletonHelper=pc;k.SkinnedMesh=Qe;k.SmoothShading=2;k.Sphere=eb;k.SphereBufferGeometry=ec;k.SphereGeometry=ce;k.Spherical=li;k.SphericalHarmonics3=of;k.SphericalReflectionMapping=305;k.Spline=Sg;k.SplineCurve=ab;k.SplineCurve3=si;k.SpotLight=hf;k.SpotLightHelper=hd;k.SpotLightShadow=gf;k.Sprite=Ld;k.SpriteMaterial=
+Kb;k.SrcAlphaFactor=204;k.SrcAlphaSaturateFactor=210;k.SrcColorFactor=202;k.StaticCopyUsage=35046;k.StaticDrawUsage=35044;k.StaticReadUsage=35045;k.StereoCamera=gi;k.StreamCopyUsage=35042;k.StreamDrawUsage=35040;k.StreamReadUsage=35041;k.StringKeyframeTrack=bf;k.SubtractEquation=101;k.SubtractiveBlending=3;k.TOUCH={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3};k.TangentSpaceNormalMap=0;k.TetrahedronBufferGeometry=Rc;k.TetrahedronGeometry=Sd;k.TextBufferGeometry=Xc;k.TextGeometry=be;k.Texture=W;k.TextureLoader=
+ef;k.TorusBufferGeometry=Vc;k.TorusGeometry=Yd;k.TorusKnotBufferGeometry=Uc;k.TorusKnotGeometry=Xd;k.Triangle=pa;k.TriangleFanDrawMode=2;k.TriangleStripDrawMode=1;k.TrianglesDrawMode=0;k.TubeBufferGeometry=cc;k.TubeGeometry=Wd;k.UVMapping=300;k.Uint16Attribute=function(a,b){console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.");return new Xb(a,b)};k.Uint16BufferAttribute=Xb;k.Uint32Attribute=function(a,b){console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.");
+return new Yb(a,b)};k.Uint32BufferAttribute=Yb;k.Uint8Attribute=function(a,b){console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.");return new zd(a,b)};k.Uint8BufferAttribute=zd;k.Uint8ClampedAttribute=function(a,b){console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.");return new Ad(a,b)};k.Uint8ClampedBufferAttribute=Ad;k.Uncharted2ToneMapping=3;k.Uniform=uf;k.UniformsLib=A;k.UniformsUtils=
+Oh;k.UnsignedByteType=1009;k.UnsignedInt248Type=1020;k.UnsignedIntType=1014;k.UnsignedShort4444Type=1017;k.UnsignedShort5551Type=1018;k.UnsignedShort565Type=1019;k.UnsignedShortType=1012;k.VSMShadowMap=3;k.Vector2=v;k.Vector3=p;k.Vector4=R;k.VectorKeyframeTrack=cd;k.Vertex=function(a,b,c){console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead.");return new p(a,b,c)};k.VertexColors=2;k.VideoTexture=ng;k.WebGLCubeRenderTarget=Zb;k.WebGLMultisampleRenderTarget=Xf;k.WebGLRenderTarget=
+Ba;k.WebGLRenderTargetCube=function(a,b,c){console.warn("THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options ).");return new Zb(a,c)};k.WebGLRenderer=jg;k.WebGLUtils=Th;k.WireframeGeometry=Pc;k.WireframeHelper=function(a,b){console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.");return new ma(new Pc(a.geometry),new da({color:void 0!==b?b:16777215}))};k.WrapAroundEnding=2402;k.XHRLoader=function(a){console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader.");
+return new Ta(a)};k.ZeroCurvatureEnding=2400;k.ZeroFactor=200;k.ZeroSlopeEnding=2401;k.ZeroStencilOp=0;k.sRGBEncoding=3001;Object.defineProperty(k,"__esModule",{value:!0})});
+
+},{}],243:[function(require,module,exports){
+'use strict';
+
+module.exports = TinyQueue;
+
+function TinyQueue(data, compare) {
+    if (!(this instanceof TinyQueue)) return new TinyQueue(data, compare);
+
+    this.data = data || [];
+    this.length = this.data.length;
+    this.compare = compare || defaultCompare;
+
+    if (this.length > 0) {
+        for (var i = (this.length >> 1); i >= 0; i--) this._down(i);
+    }
+}
+
+function defaultCompare(a, b) {
+    return a < b ? -1 : a > b ? 1 : 0;
+}
+
+TinyQueue.prototype = {
+
+    push: function (item) {
+        this.data.push(item);
+        this.length++;
+        this._up(this.length - 1);
+    },
+
+    pop: function () {
+        if (this.length === 0) return undefined;
+        var top = this.data[0];
+        this.length--;
+        if (this.length > 0) {
+            this.data[0] = this.data[this.length];
+            this._down(0);
+        }
+        this.data.pop();
+        return top;
+    },
+
+    peek: function () {
+        return this.data[0];
+    },
+
+    _up: function (pos) {
+        var data = this.data;
+        var compare = this.compare;
+        var item = data[pos];
+
+        while (pos > 0) {
+            var parent = (pos - 1) >> 1;
+            var current = data[parent];
+            if (compare(item, current) >= 0) break;
+            data[pos] = current;
+            pos = parent;
+        }
+
+        data[pos] = item;
+    },
+
+    _down: function (pos) {
+        var data = this.data;
+        var compare = this.compare;
+        var len = this.length;
+        var halfLen = len >> 1;
+        var item = data[pos];
+
+        while (pos < halfLen) {
+            var left = (pos << 1) + 1;
+            var right = left + 1;
+            var best = data[left];
+
+            if (right < len && compare(data[right], best) < 0) {
+                left = right;
+                best = data[right];
+            }
+            if (compare(best, item) >= 0) break;
+
+            data[pos] = best;
+            pos = left;
+        }
+
+        data[pos] = item;
+    }
+};
+
+},{}],244:[function(require,module,exports){
+var createElement = require("./vdom/create-element.js")
+
+module.exports = createElement
+
+},{"./vdom/create-element.js":250}],245:[function(require,module,exports){
+var diff = require("./vtree/diff.js")
+
+module.exports = diff
+
+},{"./vtree/diff.js":270}],246:[function(require,module,exports){
+var h = require("./virtual-hyperscript/index.js")
+
+module.exports = h
+
+},{"./virtual-hyperscript/index.js":257}],247:[function(require,module,exports){
+var diff = require("./diff.js")
+var patch = require("./patch.js")
+var h = require("./h.js")
+var create = require("./create-element.js")
+var VNode = require('./vnode/vnode.js')
+var VText = require('./vnode/vtext.js')
+
+module.exports = {
+    diff: diff,
+    patch: patch,
+    h: h,
+    create: create,
+    VNode: VNode,
+    VText: VText
+}
+
+},{"./create-element.js":244,"./diff.js":245,"./h.js":246,"./patch.js":248,"./vnode/vnode.js":266,"./vnode/vtext.js":268}],248:[function(require,module,exports){
+var patch = require("./vdom/patch.js")
+
+module.exports = patch
+
+},{"./vdom/patch.js":253}],249:[function(require,module,exports){
+var isObject = require("is-object")
+var isHook = require("../vnode/is-vhook.js")
+
+module.exports = applyProperties
+
+function applyProperties(node, props, previous) {
+    for (var propName in props) {
+        var propValue = props[propName]
+
+        if (propValue === undefined) {
+            removeProperty(node, propName, propValue, previous);
+        } else if (isHook(propValue)) {
+            removeProperty(node, propName, propValue, previous)
+            if (propValue.hook) {
+                propValue.hook(node,
+                    propName,
+                    previous ? previous[propName] : undefined)
+            }
+        } else {
+            if (isObject(propValue)) {
+                patchObject(node, props, previous, propName, propValue);
+            } else {
+                node[propName] = propValue
+            }
+        }
+    }
+}
+
+function removeProperty(node, propName, propValue, previous) {
+    if (previous) {
+        var previousValue = previous[propName]
+
+        if (!isHook(previousValue)) {
+            if (propName === "attributes") {
+                for (var attrName in previousValue) {
+                    node.removeAttribute(attrName)
+                }
+            } else if (propName === "style") {
+                for (var i in previousValue) {
+                    node.style[i] = ""
+                }
+            } else if (typeof previousValue === "string") {
+                node[propName] = ""
+            } else {
+                node[propName] = null
+            }
+        } else if (previousValue.unhook) {
+            previousValue.unhook(node, propName, propValue)
+        }
+    }
+}
+
+function patchObject(node, props, previous, propName, propValue) {
+    var previousValue = previous ? previous[propName] : undefined
+
+    // Set attributes
+    if (propName === "attributes") {
+        for (var attrName in propValue) {
+            var attrValue = propValue[attrName]
+
+            if (attrValue === undefined) {
+                node.removeAttribute(attrName)
+            } else {
+                node.setAttribute(attrName, attrValue)
+            }
+        }
+
+        return
+    }
+
+    if(previousValue && isObject(previousValue) &&
+        getPrototype(previousValue) !== getPrototype(propValue)) {
+        node[propName] = propValue
+        return
+    }
+
+    if (!isObject(node[propName])) {
+        node[propName] = {}
+    }
+
+    var replacer = propName === "style" ? "" : undefined
+
+    for (var k in propValue) {
+        var value = propValue[k]
+        node[propName][k] = (value === undefined) ? replacer : value
+    }
+}
+
+function getPrototype(value) {
+    if (Object.getPrototypeOf) {
+        return Object.getPrototypeOf(value)
+    } else if (value.__proto__) {
+        return value.__proto__
+    } else if (value.constructor) {
+        return value.constructor.prototype
+    }
+}
+
+},{"../vnode/is-vhook.js":261,"is-object":20}],250:[function(require,module,exports){
+var document = require("global/document")
+
+var applyProperties = require("./apply-properties")
+
+var isVNode = require("../vnode/is-vnode.js")
+var isVText = require("../vnode/is-vtext.js")
+var isWidget = require("../vnode/is-widget.js")
+var handleThunk = require("../vnode/handle-thunk.js")
+
+module.exports = createElement
+
+function createElement(vnode, opts) {
+    var doc = opts ? opts.document || document : document
+    var warn = opts ? opts.warn : null
+
+    vnode = handleThunk(vnode).a
+
+    if (isWidget(vnode)) {
+        return vnode.init()
+    } else if (isVText(vnode)) {
+        return doc.createTextNode(vnode.text)
+    } else if (!isVNode(vnode)) {
+        if (warn) {
+            warn("Item is not a valid virtual dom node", vnode)
+        }
+        return null
+    }
+
+    var node = (vnode.namespace === null) ?
+        doc.createElement(vnode.tagName) :
+        doc.createElementNS(vnode.namespace, vnode.tagName)
+
+    var props = vnode.properties
+    applyProperties(node, props)
+
+    var children = vnode.children
+
+    for (var i = 0; i < children.length; i++) {
+        var childNode = createElement(children[i], opts)
+        if (childNode) {
+            node.appendChild(childNode)
+        }
+    }
+
+    return node
+}
+
+},{"../vnode/handle-thunk.js":259,"../vnode/is-vnode.js":262,"../vnode/is-vtext.js":263,"../vnode/is-widget.js":264,"./apply-properties":249,"global/document":16}],251:[function(require,module,exports){
+// Maps a virtual DOM tree onto a real DOM tree in an efficient manner.
+// We don't want to read all of the DOM nodes in the tree so we use
+// the in-order tree indexing to eliminate recursion down certain branches.
+// We only recurse into a DOM node if we know that it contains a child of
+// interest.
+
+var noChild = {}
+
+module.exports = domIndex
+
+function domIndex(rootNode, tree, indices, nodes) {
+    if (!indices || indices.length === 0) {
+        return {}
+    } else {
+        indices.sort(ascending)
+        return recurse(rootNode, tree, indices, nodes, 0)
+    }
+}
+
+function recurse(rootNode, tree, indices, nodes, rootIndex) {
+    nodes = nodes || {}
+
+
+    if (rootNode) {
+        if (indexInRange(indices, rootIndex, rootIndex)) {
+            nodes[rootIndex] = rootNode
+        }
+
+        var vChildren = tree.children
+
+        if (vChildren) {
+
+            var childNodes = rootNode.childNodes
+
+            for (var i = 0; i < tree.children.length; i++) {
+                rootIndex += 1
+
+                var vChild = vChildren[i] || noChild
+                var nextIndex = rootIndex + (vChild.count || 0)
+
+                // skip recursion down the tree if there are no nodes down here
+                if (indexInRange(indices, rootIndex, nextIndex)) {
+                    recurse(childNodes[i], vChild, indices, nodes, rootIndex)
+                }
+
+                rootIndex = nextIndex
+            }
+        }
+    }
+
+    return nodes
+}
+
+// Binary search for an index in the interval [left, right]
+function indexInRange(indices, left, right) {
+    if (indices.length === 0) {
+        return false
+    }
+
+    var minIndex = 0
+    var maxIndex = indices.length - 1
+    var currentIndex
+    var currentItem
+
+    while (minIndex <= maxIndex) {
+        currentIndex = ((maxIndex + minIndex) / 2) >> 0
+        currentItem = indices[currentIndex]
+
+        if (minIndex === maxIndex) {
+            return currentItem >= left && currentItem <= right
+        } else if (currentItem < left) {
+            minIndex = currentIndex + 1
+        } else  if (currentItem > right) {
+            maxIndex = currentIndex - 1
+        } else {
+            return true
+        }
+    }
+
+    return false;
+}
+
+function ascending(a, b) {
+    return a > b ? 1 : -1
+}
+
+},{}],252:[function(require,module,exports){
+var applyProperties = require("./apply-properties")
+
+var isWidget = require("../vnode/is-widget.js")
+var VPatch = require("../vnode/vpatch.js")
+
+var updateWidget = require("./update-widget")
+
+module.exports = applyPatch
+
+function applyPatch(vpatch, domNode, renderOptions) {
+    var type = vpatch.type
+    var vNode = vpatch.vNode
+    var patch = vpatch.patch
+
+    switch (type) {
+        case VPatch.REMOVE:
+            return removeNode(domNode, vNode)
+        case VPatch.INSERT:
+            return insertNode(domNode, patch, renderOptions)
+        case VPatch.VTEXT:
+            return stringPatch(domNode, vNode, patch, renderOptions)
+        case VPatch.WIDGET:
+            return widgetPatch(domNode, vNode, patch, renderOptions)
+        case VPatch.VNODE:
+            return vNodePatch(domNode, vNode, patch, renderOptions)
+        case VPatch.ORDER:
+            reorderChildren(domNode, patch)
+            return domNode
+        case VPatch.PROPS:
+            applyProperties(domNode, patch, vNode.properties)
+            return domNode
+        case VPatch.THUNK:
+            return replaceRoot(domNode,
+                renderOptions.patch(domNode, patch, renderOptions))
+        default:
+            return domNode
+    }
+}
+
+function removeNode(domNode, vNode) {
+    var parentNode = domNode.parentNode
+
+    if (parentNode) {
+        parentNode.removeChild(domNode)
+    }
+
+    destroyWidget(domNode, vNode);
+
+    return null
+}
+
+function insertNode(parentNode, vNode, renderOptions) {
+    var newNode = renderOptions.render(vNode, renderOptions)
+
+    if (parentNode) {
+        parentNode.appendChild(newNode)
+    }
+
+    return parentNode
+}
+
+function stringPatch(domNode, leftVNode, vText, renderOptions) {
+    var newNode
+
+    if (domNode.nodeType === 3) {
+        domNode.replaceData(0, domNode.length, vText.text)
+        newNode = domNode
+    } else {
+        var parentNode = domNode.parentNode
+        newNode = renderOptions.render(vText, renderOptions)
+
+        if (parentNode && newNode !== domNode) {
+            parentNode.replaceChild(newNode, domNode)
+        }
+    }
+
+    return newNode
+}
+
+function widgetPatch(domNode, leftVNode, widget, renderOptions) {
+    var updating = updateWidget(leftVNode, widget)
+    var newNode
+
+    if (updating) {
+        newNode = widget.update(leftVNode, domNode) || domNode
+    } else {
+        newNode = renderOptions.render(widget, renderOptions)
+    }
+
+    var parentNode = domNode.parentNode
+
+    if (parentNode && newNode !== domNode) {
+        parentNode.replaceChild(newNode, domNode)
+    }
+
+    if (!updating) {
+        destroyWidget(domNode, leftVNode)
+    }
+
+    return newNode
+}
+
+function vNodePatch(domNode, leftVNode, vNode, renderOptions) {
+    var parentNode = domNode.parentNode
+    var newNode = renderOptions.render(vNode, renderOptions)
+
+    if (parentNode && newNode !== domNode) {
+        parentNode.replaceChild(newNode, domNode)
+    }
+
+    return newNode
+}
+
+function destroyWidget(domNode, w) {
+    if (typeof w.destroy === "function" && isWidget(w)) {
+        w.destroy(domNode)
+    }
+}
+
+function reorderChildren(domNode, moves) {
+    var childNodes = domNode.childNodes
+    var keyMap = {}
+    var node
+    var remove
+    var insert
+
+    for (var i = 0; i < moves.removes.length; i++) {
+        remove = moves.removes[i]
+        node = childNodes[remove.from]
+        if (remove.key) {
+            keyMap[remove.key] = node
+        }
+        domNode.removeChild(node)
+    }
+
+    var length = childNodes.length
+    for (var j = 0; j < moves.inserts.length; j++) {
+        insert = moves.inserts[j]
+        node = keyMap[insert.key]
+        // this is the weirdest bug i've ever seen in webkit
+        domNode.insertBefore(node, insert.to >= length++ ? null : childNodes[insert.to])
+    }
+}
+
+function replaceRoot(oldRoot, newRoot) {
+    if (oldRoot && newRoot && oldRoot !== newRoot && oldRoot.parentNode) {
+        oldRoot.parentNode.replaceChild(newRoot, oldRoot)
+    }
+
+    return newRoot;
+}
+
+},{"../vnode/is-widget.js":264,"../vnode/vpatch.js":267,"./apply-properties":249,"./update-widget":254}],253:[function(require,module,exports){
+var document = require("global/document")
+var isArray = require("x-is-array")
+
+var render = require("./create-element")
+var domIndex = require("./dom-index")
+var patchOp = require("./patch-op")
+module.exports = patch
+
+function patch(rootNode, patches, renderOptions) {
+    renderOptions = renderOptions || {}
+    renderOptions.patch = renderOptions.patch && renderOptions.patch !== patch
+        ? renderOptions.patch
+        : patchRecursive
+    renderOptions.render = renderOptions.render || render
+
+    return renderOptions.patch(rootNode, patches, renderOptions)
+}
+
+function patchRecursive(rootNode, patches, renderOptions) {
+    var indices = patchIndices(patches)
+
+    if (indices.length === 0) {
+        return rootNode
+    }
+
+    var index = domIndex(rootNode, patches.a, indices)
+    var ownerDocument = rootNode.ownerDocument
+
+    if (!renderOptions.document && ownerDocument !== document) {
+        renderOptions.document = ownerDocument
+    }
+
+    for (var i = 0; i < indices.length; i++) {
+        var nodeIndex = indices[i]
+        rootNode = applyPatch(rootNode,
+            index[nodeIndex],
+            patches[nodeIndex],
+            renderOptions)
+    }
+
+    return rootNode
+}
+
+function applyPatch(rootNode, domNode, patchList, renderOptions) {
+    if (!domNode) {
+        return rootNode
+    }
+
+    var newNode
+
+    if (isArray(patchList)) {
+        for (var i = 0; i < patchList.length; i++) {
+            newNode = patchOp(patchList[i], domNode, renderOptions)
+
+            if (domNode === rootNode) {
+                rootNode = newNode
+            }
+        }
+    } else {
+        newNode = patchOp(patchList, domNode, renderOptions)
+
+        if (domNode === rootNode) {
+            rootNode = newNode
+        }
+    }
+
+    return rootNode
+}
+
+function patchIndices(patches) {
+    var indices = []
+
+    for (var key in patches) {
+        if (key !== "a") {
+            indices.push(Number(key))
+        }
+    }
+
+    return indices
+}
+
+},{"./create-element":250,"./dom-index":251,"./patch-op":252,"global/document":16,"x-is-array":289}],254:[function(require,module,exports){
+var isWidget = require("../vnode/is-widget.js")
+
+module.exports = updateWidget
+
+function updateWidget(a, b) {
+    if (isWidget(a) && isWidget(b)) {
+        if ("name" in a && "name" in b) {
+            return a.id === b.id
+        } else {
+            return a.init === b.init
+        }
+    }
+
+    return false
+}
+
+},{"../vnode/is-widget.js":264}],255:[function(require,module,exports){
+'use strict';
+
+var EvStore = require('ev-store');
+
+module.exports = EvHook;
+
+function EvHook(value) {
+    if (!(this instanceof EvHook)) {
+        return new EvHook(value);
+    }
+
+    this.value = value;
+}
+
+EvHook.prototype.hook = function (node, propertyName) {
+    var es = EvStore(node);
+    var propName = propertyName.substr(3);
+
+    es[propName] = this.value;
+};
+
+EvHook.prototype.unhook = function(node, propertyName) {
+    var es = EvStore(node);
+    var propName = propertyName.substr(3);
+
+    es[propName] = undefined;
+};
+
+},{"ev-store":9}],256:[function(require,module,exports){
+'use strict';
+
+module.exports = SoftSetHook;
+
+function SoftSetHook(value) {
+    if (!(this instanceof SoftSetHook)) {
+        return new SoftSetHook(value);
+    }
+
+    this.value = value;
+}
+
+SoftSetHook.prototype.hook = function (node, propertyName) {
+    if (node[propertyName] !== this.value) {
+        node[propertyName] = this.value;
+    }
+};
+
+},{}],257:[function(require,module,exports){
+'use strict';
+
+var isArray = require('x-is-array');
+
+var VNode = require('../vnode/vnode.js');
+var VText = require('../vnode/vtext.js');
+var isVNode = require('../vnode/is-vnode');
+var isVText = require('../vnode/is-vtext');
+var isWidget = require('../vnode/is-widget');
+var isHook = require('../vnode/is-vhook');
+var isVThunk = require('../vnode/is-thunk');
+
+var parseTag = require('./parse-tag.js');
+var softSetHook = require('./hooks/soft-set-hook.js');
+var evHook = require('./hooks/ev-hook.js');
+
+module.exports = h;
+
+function h(tagName, properties, children) {
+    var childNodes = [];
+    var tag, props, key, namespace;
+
+    if (!children && isChildren(properties)) {
+        children = properties;
+        props = {};
+    }
+
+    props = props || properties || {};
+    tag = parseTag(tagName, props);
+
+    // support keys
+    if (props.hasOwnProperty('key')) {
+        key = props.key;
+        props.key = undefined;
+    }
+
+    // support namespace
+    if (props.hasOwnProperty('namespace')) {
+        namespace = props.namespace;
+        props.namespace = undefined;
+    }
+
+    // fix cursor bug
+    if (tag === 'INPUT' &&
+        !namespace &&
+        props.hasOwnProperty('value') &&
+        props.value !== undefined &&
+        !isHook(props.value)
+    ) {
+        props.value = softSetHook(props.value);
+    }
+
+    transformProperties(props);
+
+    if (children !== undefined && children !== null) {
+        addChild(children, childNodes, tag, props);
+    }
+
+
+    return new VNode(tag, props, childNodes, key, namespace);
+}
+
+function addChild(c, childNodes, tag, props) {
+    if (typeof c === 'string') {
+        childNodes.push(new VText(c));
+    } else if (typeof c === 'number') {
+        childNodes.push(new VText(String(c)));
+    } else if (isChild(c)) {
+        childNodes.push(c);
+    } else if (isArray(c)) {
+        for (var i = 0; i < c.length; i++) {
+            addChild(c[i], childNodes, tag, props);
+        }
+    } else if (c === null || c === undefined) {
+        return;
+    } else {
+        throw UnexpectedVirtualElement({
+            foreignObject: c,
+            parentVnode: {
+                tagName: tag,
+                properties: props
+            }
+        });
+    }
+}
+
+function transformProperties(props) {
+    for (var propName in props) {
+        if (props.hasOwnProperty(propName)) {
+            var value = props[propName];
+
+            if (isHook(value)) {
+                continue;
+            }
+
+            if (propName.substr(0, 3) === 'ev-') {
+                // add ev-foo support
+                props[propName] = evHook(value);
+            }
+        }
+    }
+}
+
+function isChild(x) {
+    return isVNode(x) || isVText(x) || isWidget(x) || isVThunk(x);
+}
+
+function isChildren(x) {
+    return typeof x === 'string' || isArray(x) || isChild(x);
+}
+
+function UnexpectedVirtualElement(data) {
+    var err = new Error();
+
+    err.type = 'virtual-hyperscript.unexpected.virtual-element';
+    err.message = 'Unexpected virtual child passed to h().\n' +
+        'Expected a VNode / Vthunk / VWidget / string but:\n' +
+        'got:\n' +
+        errorString(data.foreignObject) +
+        '.\n' +
+        'The parent vnode is:\n' +
+        errorString(data.parentVnode)
+        '\n' +
+        'Suggested fix: change your `h(..., [ ... ])` callsite.';
+    err.foreignObject = data.foreignObject;
+    err.parentVnode = data.parentVnode;
+
+    return err;
+}
+
+function errorString(obj) {
+    try {
+        return JSON.stringify(obj, null, '    ');
+    } catch (e) {
+        return String(obj);
+    }
+}
+
+},{"../vnode/is-thunk":260,"../vnode/is-vhook":261,"../vnode/is-vnode":262,"../vnode/is-vtext":263,"../vnode/is-widget":264,"../vnode/vnode.js":266,"../vnode/vtext.js":268,"./hooks/ev-hook.js":255,"./hooks/soft-set-hook.js":256,"./parse-tag.js":258,"x-is-array":289}],258:[function(require,module,exports){
+'use strict';
+
+var split = require('browser-split');
+
+var classIdSplit = /([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/;
+var notClassId = /^\.|#/;
+
+module.exports = parseTag;
+
+function parseTag(tag, props) {
+    if (!tag) {
+        return 'DIV';
+    }
+
+    var noId = !(props.hasOwnProperty('id'));
+
+    var tagParts = split(tag, classIdSplit);
+    var tagName = null;
+
+    if (notClassId.test(tagParts[1])) {
+        tagName = 'DIV';
+    }
+
+    var classes, part, type, i;
+
+    for (i = 0; i < tagParts.length; i++) {
+        part = tagParts[i];
+
+        if (!part) {
+            continue;
+        }
+
+        type = part.charAt(0);
+
+        if (!tagName) {
+            tagName = part;
+        } else if (type === '.') {
+            classes = classes || [];
+            classes.push(part.substring(1, part.length));
+        } else if (type === '#' && noId) {
+            props.id = part.substring(1, part.length);
+        }
+    }
+
+    if (classes) {
+        if (props.className) {
+            classes.push(props.className);
+        }
+
+        props.className = classes.join(' ');
+    }
+
+    return props.namespace ? tagName : tagName.toUpperCase();
+}
+
+},{"browser-split":5}],259:[function(require,module,exports){
+var isVNode = require("./is-vnode")
+var isVText = require("./is-vtext")
+var isWidget = require("./is-widget")
+var isThunk = require("./is-thunk")
+
+module.exports = handleThunk
+
+function handleThunk(a, b) {
+    var renderedA = a
+    var renderedB = b
+
+    if (isThunk(b)) {
+        renderedB = renderThunk(b, a)
+    }
+
+    if (isThunk(a)) {
+        renderedA = renderThunk(a, null)
+    }
+
+    return {
+        a: renderedA,
+        b: renderedB
+    }
+}
+
+function renderThunk(thunk, previous) {
+    var renderedThunk = thunk.vnode
+
+    if (!renderedThunk) {
+        renderedThunk = thunk.vnode = thunk.render(previous)
+    }
+
+    if (!(isVNode(renderedThunk) ||
+            isVText(renderedThunk) ||
+            isWidget(renderedThunk))) {
+        throw new Error("thunk did not return a valid node");
+    }
+
+    return renderedThunk
+}
+
+},{"./is-thunk":260,"./is-vnode":262,"./is-vtext":263,"./is-widget":264}],260:[function(require,module,exports){
+module.exports = isThunk
+
+function isThunk(t) {
+    return t && t.type === "Thunk"
+}
+
+},{}],261:[function(require,module,exports){
+module.exports = isHook
+
+function isHook(hook) {
+    return hook &&
+      (typeof hook.hook === "function" && !hook.hasOwnProperty("hook") ||
+       typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook"))
+}
+
+},{}],262:[function(require,module,exports){
+var version = require("./version")
+
+module.exports = isVirtualNode
+
+function isVirtualNode(x) {
+    return x && x.type === "VirtualNode" && x.version === version
+}
+
+},{"./version":265}],263:[function(require,module,exports){
+var version = require("./version")
+
+module.exports = isVirtualText
+
+function isVirtualText(x) {
+    return x && x.type === "VirtualText" && x.version === version
+}
+
+},{"./version":265}],264:[function(require,module,exports){
+module.exports = isWidget
+
+function isWidget(w) {
+    return w && w.type === "Widget"
+}
+
+},{}],265:[function(require,module,exports){
+module.exports = "2"
+
+},{}],266:[function(require,module,exports){
+var version = require("./version")
+var isVNode = require("./is-vnode")
+var isWidget = require("./is-widget")
+var isThunk = require("./is-thunk")
+var isVHook = require("./is-vhook")
+
+module.exports = VirtualNode
+
+var noProperties = {}
+var noChildren = []
+
+function VirtualNode(tagName, properties, children, key, namespace) {
+    this.tagName = tagName
+    this.properties = properties || noProperties
+    this.children = children || noChildren
+    this.key = key != null ? String(key) : undefined
+    this.namespace = (typeof namespace === "string") ? namespace : null
+
+    var count = (children && children.length) || 0
+    var descendants = 0
+    var hasWidgets = false
+    var hasThunks = false
+    var descendantHooks = false
+    var hooks
+
+    for (var propName in properties) {
+        if (properties.hasOwnProperty(propName)) {
+            var property = properties[propName]
+            if (isVHook(property) && property.unhook) {
+                if (!hooks) {
+                    hooks = {}
+                }
+
+                hooks[propName] = property
+            }
+        }
+    }
+
+    for (var i = 0; i < count; i++) {
+        var child = children[i]
+        if (isVNode(child)) {
+            descendants += child.count || 0
+
+            if (!hasWidgets && child.hasWidgets) {
+                hasWidgets = true
+            }
+
+            if (!hasThunks && child.hasThunks) {
+                hasThunks = true
+            }
+
+            if (!descendantHooks && (child.hooks || child.descendantHooks)) {
+                descendantHooks = true
+            }
+        } else if (!hasWidgets && isWidget(child)) {
+            if (typeof child.destroy === "function") {
+                hasWidgets = true
+            }
+        } else if (!hasThunks && isThunk(child)) {
+            hasThunks = true;
+        }
+    }
+
+    this.count = count + descendants
+    this.hasWidgets = hasWidgets
+    this.hasThunks = hasThunks
+    this.hooks = hooks
+    this.descendantHooks = descendantHooks
+}
+
+VirtualNode.prototype.version = version
+VirtualNode.prototype.type = "VirtualNode"
+
+},{"./is-thunk":260,"./is-vhook":261,"./is-vnode":262,"./is-widget":264,"./version":265}],267:[function(require,module,exports){
+var version = require("./version")
+
+VirtualPatch.NONE = 0
+VirtualPatch.VTEXT = 1
+VirtualPatch.VNODE = 2
+VirtualPatch.WIDGET = 3
+VirtualPatch.PROPS = 4
+VirtualPatch.ORDER = 5
+VirtualPatch.INSERT = 6
+VirtualPatch.REMOVE = 7
+VirtualPatch.THUNK = 8
+
+module.exports = VirtualPatch
+
+function VirtualPatch(type, vNode, patch) {
+    this.type = Number(type)
+    this.vNode = vNode
+    this.patch = patch
+}
+
+VirtualPatch.prototype.version = version
+VirtualPatch.prototype.type = "VirtualPatch"
+
+},{"./version":265}],268:[function(require,module,exports){
+var version = require("./version")
+
+module.exports = VirtualText
+
+function VirtualText(text) {
+    this.text = String(text)
+}
+
+VirtualText.prototype.version = version
+VirtualText.prototype.type = "VirtualText"
+
+},{"./version":265}],269:[function(require,module,exports){
+var isObject = require("is-object")
+var isHook = require("../vnode/is-vhook")
+
+module.exports = diffProps
+
+function diffProps(a, b) {
+    var diff
+
+    for (var aKey in a) {
+        if (!(aKey in b)) {
+            diff = diff || {}
+            diff[aKey] = undefined
+        }
+
+        var aValue = a[aKey]
+        var bValue = b[aKey]
+
+        if (aValue === bValue) {
+            continue
+        } else if (isObject(aValue) && isObject(bValue)) {
+            if (getPrototype(bValue) !== getPrototype(aValue)) {
+                diff = diff || {}
+                diff[aKey] = bValue
+            } else if (isHook(bValue)) {
+                 diff = diff || {}
+                 diff[aKey] = bValue
+            } else {
+                var objectDiff = diffProps(aValue, bValue)
+                if (objectDiff) {
+                    diff = diff || {}
+                    diff[aKey] = objectDiff
+                }
+            }
+        } else {
+            diff = diff || {}
+            diff[aKey] = bValue
+        }
+    }
+
+    for (var bKey in b) {
+        if (!(bKey in a)) {
+            diff = diff || {}
+            diff[bKey] = b[bKey]
+        }
+    }
+
+    return diff
+}
+
+function getPrototype(value) {
+  if (Object.getPrototypeOf) {
+    return Object.getPrototypeOf(value)
+  } else if (value.__proto__) {
+    return value.__proto__
+  } else if (value.constructor) {
+    return value.constructor.prototype
+  }
+}
+
+},{"../vnode/is-vhook":261,"is-object":20}],270:[function(require,module,exports){
+var isArray = require("x-is-array")
+
+var VPatch = require("../vnode/vpatch")
+var isVNode = require("../vnode/is-vnode")
+var isVText = require("../vnode/is-vtext")
+var isWidget = require("../vnode/is-widget")
+var isThunk = require("../vnode/is-thunk")
+var handleThunk = require("../vnode/handle-thunk")
+
+var diffProps = require("./diff-props")
+
+module.exports = diff
+
+function diff(a, b) {
+    var patch = { a: a }
+    walk(a, b, patch, 0)
+    return patch
+}
+
+function walk(a, b, patch, index) {
+    if (a === b) {
+        return
+    }
+
+    var apply = patch[index]
+    var applyClear = false
+
+    if (isThunk(a) || isThunk(b)) {
+        thunks(a, b, patch, index)
+    } else if (b == null) {
+
+        // If a is a widget we will add a remove patch for it
+        // Otherwise any child widgets/hooks must be destroyed.
+        // This prevents adding two remove patches for a widget.
+        if (!isWidget(a)) {
+            clearState(a, patch, index)
+            apply = patch[index]
+        }
+
+        apply = appendPatch(apply, new VPatch(VPatch.REMOVE, a, b))
+    } else if (isVNode(b)) {
+        if (isVNode(a)) {
+            if (a.tagName === b.tagName &&
+                a.namespace === b.namespace &&
+                a.key === b.key) {
+                var propsPatch = diffProps(a.properties, b.properties)
+                if (propsPatch) {
+                    apply = appendPatch(apply,
+                        new VPatch(VPatch.PROPS, a, propsPatch))
+                }
+                apply = diffChildren(a, b, patch, apply, index)
+            } else {
+                apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b))
+                applyClear = true
+            }
+        } else {
+            apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b))
+            applyClear = true
+        }
+    } else if (isVText(b)) {
+        if (!isVText(a)) {
+            apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b))
+            applyClear = true
+        } else if (a.text !== b.text) {
+            apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b))
+        }
+    } else if (isWidget(b)) {
+        if (!isWidget(a)) {
+            applyClear = true
+        }
+
+        apply = appendPatch(apply, new VPatch(VPatch.WIDGET, a, b))
+    }
+
+    if (apply) {
+        patch[index] = apply
+    }
+
+    if (applyClear) {
+        clearState(a, patch, index)
+    }
+}
+
+function diffChildren(a, b, patch, apply, index) {
+    var aChildren = a.children
+    var orderedSet = reorder(aChildren, b.children)
+    var bChildren = orderedSet.children
+
+    var aLen = aChildren.length
+    var bLen = bChildren.length
+    var len = aLen > bLen ? aLen : bLen
+
+    for (var i = 0; i < len; i++) {
+        var leftNode = aChildren[i]
+        var rightNode = bChildren[i]
+        index += 1
+
+        if (!leftNode) {
+            if (rightNode) {
+                // Excess nodes in b need to be added
+                apply = appendPatch(apply,
+                    new VPatch(VPatch.INSERT, null, rightNode))
+            }
+        } else {
+            walk(leftNode, rightNode, patch, index)
+        }
+
+        if (isVNode(leftNode) && leftNode.count) {
+            index += leftNode.count
+        }
+    }
+
+    if (orderedSet.moves) {
+        // Reorder nodes last
+        apply = appendPatch(apply, new VPatch(
+            VPatch.ORDER,
+            a,
+            orderedSet.moves
+        ))
+    }
+
+    return apply
+}
+
+function clearState(vNode, patch, index) {
+    // TODO: Make this a single walk, not two
+    unhook(vNode, patch, index)
+    destroyWidgets(vNode, patch, index)
+}
+
+// Patch records for all destroyed widgets must be added because we need
+// a DOM node reference for the destroy function
+function destroyWidgets(vNode, patch, index) {
+    if (isWidget(vNode)) {
+        if (typeof vNode.destroy === "function") {
+            patch[index] = appendPatch(
+                patch[index],
+                new VPatch(VPatch.REMOVE, vNode, null)
+            )
+        }
+    } else if (isVNode(vNode) && (vNode.hasWidgets || vNode.hasThunks)) {
+        var children = vNode.children
+        var len = children.length
+        for (var i = 0; i < len; i++) {
+            var child = children[i]
+            index += 1
+
+            destroyWidgets(child, patch, index)
+
+            if (isVNode(child) && child.count) {
+                index += child.count
+            }
+        }
+    } else if (isThunk(vNode)) {
+        thunks(vNode, null, patch, index)
+    }
+}
+
+// Create a sub-patch for thunks
+function thunks(a, b, patch, index) {
+    var nodes = handleThunk(a, b)
+    var thunkPatch = diff(nodes.a, nodes.b)
+    if (hasPatches(thunkPatch)) {
+        patch[index] = new VPatch(VPatch.THUNK, null, thunkPatch)
+    }
+}
+
+function hasPatches(patch) {
+    for (var index in patch) {
+        if (index !== "a") {
+            return true
+        }
+    }
+
+    return false
+}
+
+// Execute hooks when two nodes are identical
+function unhook(vNode, patch, index) {
+    if (isVNode(vNode)) {
+        if (vNode.hooks) {
+            patch[index] = appendPatch(
+                patch[index],
+                new VPatch(
+                    VPatch.PROPS,
+                    vNode,
+                    undefinedKeys(vNode.hooks)
+                )
+            )
+        }
+
+        if (vNode.descendantHooks || vNode.hasThunks) {
+            var children = vNode.children
+            var len = children.length
+            for (var i = 0; i < len; i++) {
+                var child = children[i]
+                index += 1
+
+                unhook(child, patch, index)
+
+                if (isVNode(child) && child.count) {
+                    index += child.count
+                }
+            }
+        }
+    } else if (isThunk(vNode)) {
+        thunks(vNode, null, patch, index)
+    }
+}
+
+function undefinedKeys(obj) {
+    var result = {}
+
+    for (var key in obj) {
+        result[key] = undefined
+    }
+
+    return result
+}
+
+// List diff, naive left to right reordering
+function reorder(aChildren, bChildren) {
+    // O(M) time, O(M) memory
+    var bChildIndex = keyIndex(bChildren)
+    var bKeys = bChildIndex.keys
+    var bFree = bChildIndex.free
+
+    if (bFree.length === bChildren.length) {
+        return {
+            children: bChildren,
+            moves: null
+        }
+    }
+
+    // O(N) time, O(N) memory
+    var aChildIndex = keyIndex(aChildren)
+    var aKeys = aChildIndex.keys
+    var aFree = aChildIndex.free
+
+    if (aFree.length === aChildren.length) {
+        return {
+            children: bChildren,
+            moves: null
+        }
+    }
+
+    // O(MAX(N, M)) memory
+    var newChildren = []
+
+    var freeIndex = 0
+    var freeCount = bFree.length
+    var deletedItems = 0
+
+    // Iterate through a and match a node in b
+    // O(N) time,
+    for (var i = 0 ; i < aChildren.length; i++) {
+        var aItem = aChildren[i]
+        var itemIndex
+
+        if (aItem.key) {
+            if (bKeys.hasOwnProperty(aItem.key)) {
+                // Match up the old keys
+                itemIndex = bKeys[aItem.key]
+                newChildren.push(bChildren[itemIndex])
+
+            } else {
+                // Remove old keyed items
+                itemIndex = i - deletedItems++
+                newChildren.push(null)
+            }
+        } else {
+            // Match the item in a with the next free item in b
+            if (freeIndex < freeCount) {
+                itemIndex = bFree[freeIndex++]
+                newChildren.push(bChildren[itemIndex])
+            } else {
+                // There are no free items in b to match with
+                // the free items in a, so the extra free nodes
+                // are deleted.
+                itemIndex = i - deletedItems++
+                newChildren.push(null)
+            }
+        }
+    }
+
+    var lastFreeIndex = freeIndex >= bFree.length ?
+        bChildren.length :
+        bFree[freeIndex]
+
+    // Iterate through b and append any new keys
+    // O(M) time
+    for (var j = 0; j < bChildren.length; j++) {
+        var newItem = bChildren[j]
+
+        if (newItem.key) {
+            if (!aKeys.hasOwnProperty(newItem.key)) {
+                // Add any new keyed items
+                // We are adding new items to the end and then sorting them
+                // in place. In future we should insert new items in place.
+                newChildren.push(newItem)
+            }
+        } else if (j >= lastFreeIndex) {
+            // Add any leftover non-keyed items
+            newChildren.push(newItem)
+        }
+    }
+
+    var simulate = newChildren.slice()
+    var simulateIndex = 0
+    var removes = []
+    var inserts = []
+    var simulateItem
+
+    for (var k = 0; k < bChildren.length;) {
+        var wantedItem = bChildren[k]
+        simulateItem = simulate[simulateIndex]
+
+        // remove items
+        while (simulateItem === null && simulate.length) {
+            removes.push(remove(simulate, simulateIndex, null))
+            simulateItem = simulate[simulateIndex]
+        }
+
+        if (!simulateItem || simulateItem.key !== wantedItem.key) {
+            // if we need a key in this position...
+            if (wantedItem.key) {
+                if (simulateItem && simulateItem.key) {
+                    // if an insert doesn't put this key in place, it needs to move
+                    if (bKeys[simulateItem.key] !== k + 1) {
+                        removes.push(remove(simulate, simulateIndex, simulateItem.key))
+                        simulateItem = simulate[simulateIndex]
+                        // if the remove didn't put the wanted item in place, we need to insert it
+                        if (!simulateItem || simulateItem.key !== wantedItem.key) {
+                            inserts.push({key: wantedItem.key, to: k})
+                        }
+                        // items are matching, so skip ahead
+                        else {
+                            simulateIndex++
+                        }
+                    }
+                    else {
+                        inserts.push({key: wantedItem.key, to: k})
+                    }
+                }
+                else {
+                    inserts.push({key: wantedItem.key, to: k})
+                }
+                k++
+            }
+            // a key in simulate has no matching wanted key, remove it
+            else if (simulateItem && simulateItem.key) {
+                removes.push(remove(simulate, simulateIndex, simulateItem.key))
+            }
+        }
+        else {
+            simulateIndex++
+            k++
+        }
+    }
+
+    // remove all the remaining nodes from simulate
+    while(simulateIndex < simulate.length) {
+        simulateItem = simulate[simulateIndex]
+        removes.push(remove(simulate, simulateIndex, simulateItem && simulateItem.key))
+    }
+
+    // If the only moves we have are deletes then we can just
+    // let the delete patch remove these items.
+    if (removes.length === deletedItems && !inserts.length) {
+        return {
+            children: newChildren,
+            moves: null
+        }
+    }
+
+    return {
+        children: newChildren,
+        moves: {
+            removes: removes,
+            inserts: inserts
+        }
+    }
+}
+
+function remove(arr, index, key) {
+    arr.splice(index, 1)
+
+    return {
+        from: index,
+        key: key
+    }
+}
+
+function keyIndex(children) {
+    var keys = {}
+    var free = []
+    var length = children.length
+
+    for (var i = 0; i < length; i++) {
+        var child = children[i]
+
+        if (child.key) {
+            keys[child.key] = i
+        } else {
+            free.push(i)
+        }
+    }
+
+    return {
+        keys: keys,     // A hash of key name to index
+        free: free      // An array of unkeyed item indices
+    }
+}
+
+function appendPatch(apply, patch) {
+    if (apply) {
+        if (isArray(apply)) {
+            apply.push(patch)
+        } else {
+            apply = [apply, patch]
+        }
+
+        return apply
+    } else {
+        return patch
+    }
+}
+
+},{"../vnode/handle-thunk":259,"../vnode/is-thunk":260,"../vnode/is-vnode":262,"../vnode/is-vtext":263,"../vnode/is-widget":264,"../vnode/vpatch":267,"./diff-props":269,"x-is-array":289}],271:[function(require,module,exports){
+/** @license MIT License (c) copyright 2010-2014 original author or authors */
+/** @author Brian Cavalier */
 /** @author John Hann */
 
 (function(define) { 'use strict';
@@ -17539,7 +26727,7 @@ define(function (require) {
 });
 })(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); });
 
-},{"./Scheduler":207,"./env":219,"./makePromise":221}],207:[function(require,module,exports){
+},{"./Scheduler":272,"./env":284,"./makePromise":286}],272:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -17621,7 +26809,7 @@ define(function() {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
 
-},{}],208:[function(require,module,exports){
+},{}],273:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -17649,7 +26837,7 @@ define(function() {
        return TimeoutError;
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-},{}],209:[function(require,module,exports){
+},{}],274:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -17706,7 +26894,7 @@ define(function() {
 
 
 
-},{}],210:[function(require,module,exports){
+},{}],275:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18007,7 +27195,7 @@ define(function(require) {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
 
-},{"../apply":209,"../state":222}],211:[function(require,module,exports){
+},{"../apply":274,"../state":287}],276:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18169,7 +27357,7 @@ define(function() {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
 
-},{}],212:[function(require,module,exports){
+},{}],277:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18198,7 +27386,7 @@ define(function() {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
 
-},{}],213:[function(require,module,exports){
+},{}],278:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18220,7 +27408,7 @@ define(function(require) {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
 
-},{"../state":222}],214:[function(require,module,exports){
+},{"../state":287}],279:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18287,7 +27475,7 @@ define(function() {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
 
-},{}],215:[function(require,module,exports){
+},{}],280:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18313,7 +27501,7 @@ define(function() {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
 
-},{}],216:[function(require,module,exports){
+},{}],281:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18393,7 +27581,7 @@ define(function(require) {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
 
-},{"../TimeoutError":208,"../env":219}],217:[function(require,module,exports){
+},{"../TimeoutError":273,"../env":284}],282:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18481,7 +27669,7 @@ define(function(require) {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
 
-},{"../env":219,"../format":220}],218:[function(require,module,exports){
+},{"../env":284,"../format":285}],283:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18521,7 +27709,7 @@ define(function() {
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
 
 
-},{}],219:[function(require,module,exports){
+},{}],284:[function(require,module,exports){
 (function (process){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
@@ -18599,7 +27787,7 @@ define(function(require) {
 
 }).call(this,require('_process'))
 
-},{"_process":6}],220:[function(require,module,exports){
+},{"_process":7}],285:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -18657,7 +27845,7 @@ define(function() {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
 
-},{}],221:[function(require,module,exports){
+},{}],286:[function(require,module,exports){
 (function (process){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
@@ -19617,7 +28805,7 @@ define(function() {
 
 }).call(this,require('_process'))
 
-},{"_process":6}],222:[function(require,module,exports){
+},{"_process":7}],287:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 /** @author Brian Cavalier */
 /** @author John Hann */
@@ -19654,7 +28842,7 @@ define(function() {
 });
 }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
 
-},{}],223:[function(require,module,exports){
+},{}],288:[function(require,module,exports){
 /** @license MIT License (c) copyright 2010-2014 original author or authors */
 
 /**
@@ -19829,733 +29017,3319 @@ define(function (require) {
                return Promise.all(arguments);
        }
 
-       /**
-        * Return a promise that will fulfill once all input promises have
-        * fulfilled, or reject when any one input promise rejects.
-        * @param {array|Promise} promises array (or promise for an array) of promises
-        * @returns {Promise}
-        */
-       function all(promises) {
-               return when(promises, Promise.all);
-       }
+       /**
+        * Return a promise that will fulfill once all input promises have
+        * fulfilled, or reject when any one input promise rejects.
+        * @param {array|Promise} promises array (or promise for an array) of promises
+        * @returns {Promise}
+        */
+       function all(promises) {
+               return when(promises, Promise.all);
+       }
+
+       /**
+        * Return a promise that will always fulfill with an array containing
+        * the outcome states of all input promises.  The returned promise
+        * will only reject if `promises` itself is a rejected promise.
+        * @param {array|Promise} promises array (or promise for an array) of promises
+        * @returns {Promise} promise for array of settled state descriptors
+        */
+       function settle(promises) {
+               return when(promises, Promise.settle);
+       }
+
+       /**
+        * Promise-aware array map function, similar to `Array.prototype.map()`,
+        * but input array may contain promises or values.
+        * @param {Array|Promise} promises array of anything, may contain promises and values
+        * @param {function(x:*, index:Number):*} mapFunc map function which may
+        *  return a promise or value
+        * @returns {Promise} promise that will fulfill with an array of mapped values
+        *  or reject if any input promise rejects.
+        */
+       function map(promises, mapFunc) {
+               return when(promises, function(promises) {
+                       return Promise.map(promises, mapFunc);
+               });
+       }
+
+       /**
+        * Filter the provided array of promises using the provided predicate.  Input may
+        * contain promises and values
+        * @param {Array|Promise} promises array of promises and values
+        * @param {function(x:*, index:Number):boolean} predicate filtering predicate.
+        *  Must return truthy (or promise for truthy) for items to retain.
+        * @returns {Promise} promise that will fulfill with an array containing all items
+        *  for which predicate returned truthy.
+        */
+       function filter(promises, predicate) {
+               return when(promises, function(promises) {
+                       return Promise.filter(promises, predicate);
+               });
+       }
+
+       return when;
+});
+})(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); });
+
+},{"./lib/Promise":271,"./lib/TimeoutError":273,"./lib/apply":274,"./lib/decorators/array":275,"./lib/decorators/flow":276,"./lib/decorators/fold":277,"./lib/decorators/inspect":278,"./lib/decorators/iterate":279,"./lib/decorators/progress":280,"./lib/decorators/timed":281,"./lib/decorators/unhandledRejection":282,"./lib/decorators/with":283}],289:[function(require,module,exports){
+var nativeIsArray = Array.isArray
+var toString = Object.prototype.toString
+
+module.exports = nativeIsArray || isArray
+
+function isArray(obj) {
+    return toString.call(obj) === "[object Array]"
+}
+
+},{}],290:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var APIv3_1 = require("./api/APIv3");
+Object.defineProperty(exports, "APIv3", { enumerable: true, get: function () { return APIv3_1.APIv3; } });
+var ModelCreator_1 = require("./api/ModelCreator");
+Object.defineProperty(exports, "ModelCreator", { enumerable: true, get: function () { return ModelCreator_1.ModelCreator; } });
+__exportStar(require("./api/interfaces/interfaces"), exports);
+
+},{"./api/APIv3":303,"./api/ModelCreator":304,"./api/interfaces/interfaces":305}],291:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ImageBoundary = void 0;
+var Component_1 = require("./component/Component");
+Object.defineProperty(exports, "Component", { enumerable: true, get: function () { return Component_1.Component; } });
+var ComponentService_1 = require("./component/ComponentService");
+Object.defineProperty(exports, "ComponentService", { enumerable: true, get: function () { return ComponentService_1.ComponentService; } });
+var HandlerBase_1 = require("./component/utils/HandlerBase");
+Object.defineProperty(exports, "HandlerBase", { enumerable: true, get: function () { return HandlerBase_1.HandlerBase; } });
+var MeshFactory_1 = require("./component/utils/MeshFactory");
+Object.defineProperty(exports, "MeshFactory", { enumerable: true, get: function () { return MeshFactory_1.MeshFactory; } });
+var MeshScene_1 = require("./component/utils/MeshScene");
+Object.defineProperty(exports, "MeshScene", { enumerable: true, get: function () { return MeshScene_1.MeshScene; } });
+var MouseOperator_1 = require("./component/utils/MouseOperator");
+Object.defineProperty(exports, "MouseOperator", { enumerable: true, get: function () { return MouseOperator_1.MouseOperator; } });
+var ComponentSize_1 = require("./component/utils/ComponentSize");
+Object.defineProperty(exports, "ComponentSize", { enumerable: true, get: function () { return ComponentSize_1.ComponentSize; } });
+var AttributionComponent_1 = require("./component/AttributionComponent");
+Object.defineProperty(exports, "AttributionComponent", { enumerable: true, get: function () { return AttributionComponent_1.AttributionComponent; } });
+var BackgroundComponent_1 = require("./component/BackgroundComponent");
+Object.defineProperty(exports, "BackgroundComponent", { enumerable: true, get: function () { return BackgroundComponent_1.BackgroundComponent; } });
+var BearingComponent_1 = require("./component/BearingComponent");
+Object.defineProperty(exports, "BearingComponent", { enumerable: true, get: function () { return BearingComponent_1.BearingComponent; } });
+var CacheComponent_1 = require("./component/CacheComponent");
+Object.defineProperty(exports, "CacheComponent", { enumerable: true, get: function () { return CacheComponent_1.CacheComponent; } });
+var CoverComponent_1 = require("./component/CoverComponent");
+Object.defineProperty(exports, "CoverComponent", { enumerable: true, get: function () { return CoverComponent_1.CoverComponent; } });
+var DebugComponent_1 = require("./component/DebugComponent");
+Object.defineProperty(exports, "DebugComponent", { enumerable: true, get: function () { return DebugComponent_1.DebugComponent; } });
+var DirectionComponent_1 = require("./component/direction/DirectionComponent");
+Object.defineProperty(exports, "DirectionComponent", { enumerable: true, get: function () { return DirectionComponent_1.DirectionComponent; } });
+var DirectionDOMCalculator_1 = require("./component/direction/DirectionDOMCalculator");
+Object.defineProperty(exports, "DirectionDOMCalculator", { enumerable: true, get: function () { return DirectionDOMCalculator_1.DirectionDOMCalculator; } });
+var DirectionDOMRenderer_1 = require("./component/direction/DirectionDOMRenderer");
+Object.defineProperty(exports, "DirectionDOMRenderer", { enumerable: true, get: function () { return DirectionDOMRenderer_1.DirectionDOMRenderer; } });
+var ImageComponent_1 = require("./component/ImageComponent");
+Object.defineProperty(exports, "ImageComponent", { enumerable: true, get: function () { return ImageComponent_1.ImageComponent; } });
+var KeyboardComponent_1 = require("./component/keyboard/KeyboardComponent");
+Object.defineProperty(exports, "KeyboardComponent", { enumerable: true, get: function () { return KeyboardComponent_1.KeyboardComponent; } });
+var KeyPlayHandler_1 = require("./component/keyboard/KeyPlayHandler");
+Object.defineProperty(exports, "KeyPlayHandler", { enumerable: true, get: function () { return KeyPlayHandler_1.KeyPlayHandler; } });
+var KeyZoomHandler_1 = require("./component/keyboard/KeyZoomHandler");
+Object.defineProperty(exports, "KeyZoomHandler", { enumerable: true, get: function () { return KeyZoomHandler_1.KeyZoomHandler; } });
+var KeySequenceNavigationHandler_1 = require("./component/keyboard/KeySequenceNavigationHandler");
+Object.defineProperty(exports, "KeySequenceNavigationHandler", { enumerable: true, get: function () { return KeySequenceNavigationHandler_1.KeySequenceNavigationHandler; } });
+var KeySpatialNavigationHandler_1 = require("./component/keyboard/KeySpatialNavigationHandler");
+Object.defineProperty(exports, "KeySpatialNavigationHandler", { enumerable: true, get: function () { return KeySpatialNavigationHandler_1.KeySpatialNavigationHandler; } });
+var LoadingComponent_1 = require("./component/LoadingComponent");
+Object.defineProperty(exports, "LoadingComponent", { enumerable: true, get: function () { return LoadingComponent_1.LoadingComponent; } });
+var Marker_1 = require("./component/marker/marker/Marker");
+Object.defineProperty(exports, "Marker", { enumerable: true, get: function () { return Marker_1.Marker; } });
+var MarkerComponent_1 = require("./component/marker/MarkerComponent");
+Object.defineProperty(exports, "MarkerComponent", { enumerable: true, get: function () { return MarkerComponent_1.MarkerComponent; } });
+var MarkerScene_1 = require("./component/marker/MarkerScene");
+Object.defineProperty(exports, "MarkerScene", { enumerable: true, get: function () { return MarkerScene_1.MarkerScene; } });
+var MarkerSet_1 = require("./component/marker/MarkerSet");
+Object.defineProperty(exports, "MarkerSet", { enumerable: true, get: function () { return MarkerSet_1.MarkerSet; } });
+var MouseComponent_1 = require("./component/mouse/MouseComponent");
+Object.defineProperty(exports, "MouseComponent", { enumerable: true, get: function () { return MouseComponent_1.MouseComponent; } });
+__exportStar(require("./component/mouse/HandlerTypes"), exports);
+var BounceHandler_1 = require("./component/mouse/BounceHandler");
+Object.defineProperty(exports, "BounceHandler", { enumerable: true, get: function () { return BounceHandler_1.BounceHandler; } });
+var DragPanHandler_1 = require("./component/mouse/DragPanHandler");
+Object.defineProperty(exports, "DragPanHandler", { enumerable: true, get: function () { return DragPanHandler_1.DragPanHandler; } });
+var DoubleClickZoomHandler_1 = require("./component/mouse/DoubleClickZoomHandler");
+Object.defineProperty(exports, "DoubleClickZoomHandler", { enumerable: true, get: function () { return DoubleClickZoomHandler_1.DoubleClickZoomHandler; } });
+var EarthControlHandler_1 = require("./component/mouse/EarthControlHandler");
+Object.defineProperty(exports, "EarthControlHandler", { enumerable: true, get: function () { return EarthControlHandler_1.EarthControlHandler; } });
+var ScrollZoomHandler_1 = require("./component/mouse/ScrollZoomHandler");
+Object.defineProperty(exports, "ScrollZoomHandler", { enumerable: true, get: function () { return ScrollZoomHandler_1.ScrollZoomHandler; } });
+var TouchZoomHandler_1 = require("./component/mouse/TouchZoomHandler");
+Object.defineProperty(exports, "TouchZoomHandler", { enumerable: true, get: function () { return TouchZoomHandler_1.TouchZoomHandler; } });
+var ImageBoundary = require("./component/mouse/ImageBoundary");
+exports.ImageBoundary = ImageBoundary;
+var Popup_1 = require("./component/popup/popup/Popup");
+Object.defineProperty(exports, "Popup", { enumerable: true, get: function () { return Popup_1.Popup; } });
+var PopupComponent_1 = require("./component/popup/PopupComponent");
+Object.defineProperty(exports, "PopupComponent", { enumerable: true, get: function () { return PopupComponent_1.PopupComponent; } });
+var NavigationComponent_1 = require("./component/NavigationComponent");
+Object.defineProperty(exports, "NavigationComponent", { enumerable: true, get: function () { return NavigationComponent_1.NavigationComponent; } });
+var RouteComponent_1 = require("./component/RouteComponent");
+Object.defineProperty(exports, "RouteComponent", { enumerable: true, get: function () { return RouteComponent_1.RouteComponent; } });
+var SequenceComponent_1 = require("./component/sequence/SequenceComponent");
+Object.defineProperty(exports, "SequenceComponent", { enumerable: true, get: function () { return SequenceComponent_1.SequenceComponent; } });
+var SequenceDOMRenderer_1 = require("./component/sequence/SequenceDOMRenderer");
+Object.defineProperty(exports, "SequenceDOMRenderer", { enumerable: true, get: function () { return SequenceDOMRenderer_1.SequenceDOMRenderer; } });
+var SequenceMode_1 = require("./component/sequence/SequenceMode");
+Object.defineProperty(exports, "SequenceMode", { enumerable: true, get: function () { return SequenceMode_1.SequenceMode; } });
+var SpatialDataCache_1 = require("./component/spatialdata/SpatialDataCache");
+Object.defineProperty(exports, "SpatialDataCache", { enumerable: true, get: function () { return SpatialDataCache_1.SpatialDataCache; } });
+var SpatialDataComponent_1 = require("./component/spatialdata/SpatialDataComponent");
+Object.defineProperty(exports, "SpatialDataComponent", { enumerable: true, get: function () { return SpatialDataComponent_1.SpatialDataComponent; } });
+var SpatialDataScene_1 = require("./component/spatialdata/SpatialDataScene");
+Object.defineProperty(exports, "SpatialDataScene", { enumerable: true, get: function () { return SpatialDataScene_1.SpatialDataScene; } });
+var ImagePlaneComponent_1 = require("./component/imageplane/ImagePlaneComponent");
+Object.defineProperty(exports, "ImagePlaneComponent", { enumerable: true, get: function () { return ImagePlaneComponent_1.ImagePlaneComponent; } });
+var ImagePlaneGLRenderer_1 = require("./component/imageplane/ImagePlaneGLRenderer");
+Object.defineProperty(exports, "ImagePlaneGLRenderer", { enumerable: true, get: function () { return ImagePlaneGLRenderer_1.ImagePlaneGLRenderer; } });
+var Shaders_1 = require("./component/shaders/Shaders");
+Object.defineProperty(exports, "Shaders", { enumerable: true, get: function () { return Shaders_1.Shaders; } });
+var SimpleMarker_1 = require("./component/marker/marker/SimpleMarker");
+Object.defineProperty(exports, "SimpleMarker", { enumerable: true, get: function () { return SimpleMarker_1.SimpleMarker; } });
+var CircleMarker_1 = require("./component/marker/marker/CircleMarker");
+Object.defineProperty(exports, "CircleMarker", { enumerable: true, get: function () { return CircleMarker_1.CircleMarker; } });
+var SliderComponent_1 = require("./component/slider/SliderComponent");
+Object.defineProperty(exports, "SliderComponent", { enumerable: true, get: function () { return SliderComponent_1.SliderComponent; } });
+var SliderDOMRenderer_1 = require("./component/slider/SliderDOMRenderer");
+Object.defineProperty(exports, "SliderDOMRenderer", { enumerable: true, get: function () { return SliderDOMRenderer_1.SliderDOMRenderer; } });
+var SliderGLRenderer_1 = require("./component/slider/SliderGLRenderer");
+Object.defineProperty(exports, "SliderGLRenderer", { enumerable: true, get: function () { return SliderGLRenderer_1.SliderGLRenderer; } });
+var StatsComponent_1 = require("./component/StatsComponent");
+Object.defineProperty(exports, "StatsComponent", { enumerable: true, get: function () { return StatsComponent_1.StatsComponent; } });
+var TagHandlerBase_1 = require("./component/tag/handlers/TagHandlerBase");
+Object.defineProperty(exports, "TagHandlerBase", { enumerable: true, get: function () { return TagHandlerBase_1.TagHandlerBase; } });
+var CreateHandlerBase_1 = require("./component/tag/handlers/CreateHandlerBase");
+Object.defineProperty(exports, "CreateHandlerBase", { enumerable: true, get: function () { return CreateHandlerBase_1.CreateHandlerBase; } });
+var CreatePointHandler_1 = require("./component/tag/handlers/CreatePointHandler");
+Object.defineProperty(exports, "CreatePointHandler", { enumerable: true, get: function () { return CreatePointHandler_1.CreatePointHandler; } });
+var CreateVertexHandler_1 = require("./component/tag/handlers/CreateVertexHandler");
+Object.defineProperty(exports, "CreateVertexHandler", { enumerable: true, get: function () { return CreateVertexHandler_1.CreateVertexHandler; } });
+var CreatePointsHandler_1 = require("./component/tag/handlers/CreatePointsHandler");
+Object.defineProperty(exports, "CreatePointsHandler", { enumerable: true, get: function () { return CreatePointsHandler_1.CreatePointsHandler; } });
+var CreatePolygonHandler_1 = require("./component/tag/handlers/CreatePolygonHandler");
+Object.defineProperty(exports, "CreatePolygonHandler", { enumerable: true, get: function () { return CreatePolygonHandler_1.CreatePolygonHandler; } });
+var CreateRectHandler_1 = require("./component/tag/handlers/CreateRectHandler");
+Object.defineProperty(exports, "CreateRectHandler", { enumerable: true, get: function () { return CreateRectHandler_1.CreateRectHandler; } });
+var CreateRectDragHandler_1 = require("./component/tag/handlers/CreateRectDragHandler");
+Object.defineProperty(exports, "CreateRectDragHandler", { enumerable: true, get: function () { return CreateRectDragHandler_1.CreateRectDragHandler; } });
+var EditVertexHandler_1 = require("./component/tag/handlers/EditVertexHandler");
+Object.defineProperty(exports, "EditVertexHandler", { enumerable: true, get: function () { return EditVertexHandler_1.EditVertexHandler; } });
+var Tag_1 = require("./component/tag/tag/Tag");
+Object.defineProperty(exports, "Tag", { enumerable: true, get: function () { return Tag_1.Tag; } });
+var OutlineTag_1 = require("./component/tag/tag/OutlineTag");
+Object.defineProperty(exports, "OutlineTag", { enumerable: true, get: function () { return OutlineTag_1.OutlineTag; } });
+var ExtremePointTag_1 = require("./component/tag/tag/ExtremePointTag");
+Object.defineProperty(exports, "ExtremePointTag", { enumerable: true, get: function () { return ExtremePointTag_1.ExtremePointTag; } });
+var RenderTag_1 = require("./component/tag/tag/RenderTag");
+Object.defineProperty(exports, "RenderTag", { enumerable: true, get: function () { return RenderTag_1.RenderTag; } });
+var OutlineRenderTagBase_1 = require("./component/tag/tag/OutlineRenderTagBase");
+Object.defineProperty(exports, "OutlineRenderTagBase", { enumerable: true, get: function () { return OutlineRenderTagBase_1.OutlineRenderTagBase; } });
+var OutlineRenderTag_1 = require("./component/tag/tag/OutlineRenderTag");
+Object.defineProperty(exports, "OutlineRenderTag", { enumerable: true, get: function () { return OutlineRenderTag_1.OutlineRenderTag; } });
+var ExtremePointRenderTag_1 = require("./component/tag/tag/ExtremePointRenderTag");
+Object.defineProperty(exports, "ExtremePointRenderTag", { enumerable: true, get: function () { return ExtremePointRenderTag_1.ExtremePointRenderTag; } });
+var SpotTag_1 = require("./component/tag/tag/SpotTag");
+Object.defineProperty(exports, "SpotTag", { enumerable: true, get: function () { return SpotTag_1.SpotTag; } });
+var SpotRenderTag_1 = require("./component/tag/tag/SpotRenderTag");
+Object.defineProperty(exports, "SpotRenderTag", { enumerable: true, get: function () { return SpotRenderTag_1.SpotRenderTag; } });
+var TagDomain_1 = require("./component/tag/tag/TagDomain");
+Object.defineProperty(exports, "TagDomain", { enumerable: true, get: function () { return TagDomain_1.TagDomain; } });
+var TagComponent_1 = require("./component/tag/TagComponent");
+Object.defineProperty(exports, "TagComponent", { enumerable: true, get: function () { return TagComponent_1.TagComponent; } });
+var TagCreator_1 = require("./component/tag/TagCreator");
+Object.defineProperty(exports, "TagCreator", { enumerable: true, get: function () { return TagCreator_1.TagCreator; } });
+var TagDOMRenderer_1 = require("./component/tag/TagDOMRenderer");
+Object.defineProperty(exports, "TagDOMRenderer", { enumerable: true, get: function () { return TagDOMRenderer_1.TagDOMRenderer; } });
+var TagMode_1 = require("./component/tag/TagMode");
+Object.defineProperty(exports, "TagMode", { enumerable: true, get: function () { return TagMode_1.TagMode; } });
+var TagOperation_1 = require("./component/tag/TagOperation");
+Object.defineProperty(exports, "TagOperation", { enumerable: true, get: function () { return TagOperation_1.TagOperation; } });
+var TagScene_1 = require("./component/tag/TagScene");
+Object.defineProperty(exports, "TagScene", { enumerable: true, get: function () { return TagScene_1.TagScene; } });
+var TagSet_1 = require("./component/tag/TagSet");
+Object.defineProperty(exports, "TagSet", { enumerable: true, get: function () { return TagSet_1.TagSet; } });
+var Geometry_1 = require("./component/tag/geometry/Geometry");
+Object.defineProperty(exports, "Geometry", { enumerable: true, get: function () { return Geometry_1.Geometry; } });
+var VertexGeometry_1 = require("./component/tag/geometry/VertexGeometry");
+Object.defineProperty(exports, "VertexGeometry", { enumerable: true, get: function () { return VertexGeometry_1.VertexGeometry; } });
+var RectGeometry_1 = require("./component/tag/geometry/RectGeometry");
+Object.defineProperty(exports, "RectGeometry", { enumerable: true, get: function () { return RectGeometry_1.RectGeometry; } });
+var PointGeometry_1 = require("./component/tag/geometry/PointGeometry");
+Object.defineProperty(exports, "PointGeometry", { enumerable: true, get: function () { return PointGeometry_1.PointGeometry; } });
+var PointsGeometry_1 = require("./component/tag/geometry/PointsGeometry");
+Object.defineProperty(exports, "PointsGeometry", { enumerable: true, get: function () { return PointsGeometry_1.PointsGeometry; } });
+var PolygonGeometry_1 = require("./component/tag/geometry/PolygonGeometry");
+Object.defineProperty(exports, "PolygonGeometry", { enumerable: true, get: function () { return PolygonGeometry_1.PolygonGeometry; } });
+var GeometryTagError_1 = require("./component/tag/error/GeometryTagError");
+Object.defineProperty(exports, "GeometryTagError", { enumerable: true, get: function () { return GeometryTagError_1.GeometryTagError; } });
+var ZoomComponent_1 = require("./component/zoom/ZoomComponent");
+Object.defineProperty(exports, "ZoomComponent", { enumerable: true, get: function () { return ZoomComponent_1.ZoomComponent; } });
+var CreateTag_1 = require("./component/tag/tag/CreateTag");
+Object.defineProperty(exports, "CreateTag", { enumerable: true, get: function () { return CreateTag_1.CreateTag; } });
+var OutlineCreateTag_1 = require("./component/tag/tag/OutlineCreateTag");
+Object.defineProperty(exports, "OutlineCreateTag", { enumerable: true, get: function () { return OutlineCreateTag_1.OutlineCreateTag; } });
+var ExtremePointCreateTag_1 = require("./component/tag/tag/ExtremePointCreateTag");
+Object.defineProperty(exports, "ExtremePointCreateTag", { enumerable: true, get: function () { return ExtremePointCreateTag_1.ExtremePointCreateTag; } });
+__exportStar(require("./component/interfaces/interfaces"), exports);
+
+},{"./component/AttributionComponent":306,"./component/BackgroundComponent":307,"./component/BearingComponent":308,"./component/CacheComponent":309,"./component/Component":310,"./component/ComponentService":311,"./component/CoverComponent":312,"./component/DebugComponent":313,"./component/ImageComponent":314,"./component/LoadingComponent":315,"./component/NavigationComponent":316,"./component/RouteComponent":317,"./component/StatsComponent":318,"./component/direction/DirectionComponent":319,"./component/direction/DirectionDOMCalculator":320,"./component/direction/DirectionDOMRenderer":321,"./component/imageplane/ImagePlaneComponent":322,"./component/imageplane/ImagePlaneGLRenderer":323,"./component/interfaces/interfaces":327,"./component/keyboard/KeyPlayHandler":328,"./component/keyboard/KeySequenceNavigationHandler":329,"./component/keyboard/KeySpatialNavigationHandler":330,"./component/keyboard/KeyZoomHandler":331,"./component/keyboard/KeyboardComponent":332,"./component/marker/MarkerComponent":334,"./component/marker/MarkerScene":335,"./component/marker/MarkerSet":336,"./component/marker/marker/CircleMarker":338,"./component/marker/marker/Marker":339,"./component/marker/marker/SimpleMarker":340,"./component/mouse/BounceHandler":341,"./component/mouse/DoubleClickZoomHandler":342,"./component/mouse/DragPanHandler":343,"./component/mouse/EarthControlHandler":344,"./component/mouse/HandlerTypes":345,"./component/mouse/ImageBoundary":346,"./component/mouse/MouseComponent":347,"./component/mouse/ScrollZoomHandler":348,"./component/mouse/TouchZoomHandler":349,"./component/popup/PopupComponent":351,"./component/popup/popup/Popup":352,"./component/sequence/SequenceComponent":353,"./component/sequence/SequenceDOMRenderer":354,"./component/sequence/SequenceMode":355,"./component/shaders/Shaders":356,"./component/slider/SliderComponent":357,"./component/slider/SliderDOMRenderer":358,"./component/slider/SliderGLRenderer":359,"./component/spatialdata/SpatialDataCache":362,"./component/spatialdata/SpatialDataComponent":363,"./component/spatialdata/SpatialDataScene":364,"./component/tag/TagComponent":367,"./component/tag/TagCreator":368,"./component/tag/TagDOMRenderer":369,"./component/tag/TagMode":370,"./component/tag/TagOperation":371,"./component/tag/TagScene":372,"./component/tag/TagSet":373,"./component/tag/error/GeometryTagError":374,"./component/tag/geometry/Geometry":375,"./component/tag/geometry/PointGeometry":376,"./component/tag/geometry/PointsGeometry":377,"./component/tag/geometry/PolygonGeometry":378,"./component/tag/geometry/RectGeometry":379,"./component/tag/geometry/VertexGeometry":380,"./component/tag/handlers/CreateHandlerBase":381,"./component/tag/handlers/CreatePointHandler":382,"./component/tag/handlers/CreatePointsHandler":383,"./component/tag/handlers/CreatePolygonHandler":384,"./component/tag/handlers/CreateRectDragHandler":385,"./component/tag/handlers/CreateRectHandler":386,"./component/tag/handlers/CreateVertexHandler":387,"./component/tag/handlers/EditVertexHandler":388,"./component/tag/handlers/TagHandlerBase":389,"./component/tag/tag/CreateTag":391,"./component/tag/tag/ExtremePointCreateTag":392,"./component/tag/tag/ExtremePointRenderTag":393,"./component/tag/tag/ExtremePointTag":394,"./component/tag/tag/OutlineCreateTag":395,"./component/tag/tag/OutlineRenderTag":396,"./component/tag/tag/OutlineRenderTagBase":397,"./component/tag/tag/OutlineTag":398,"./component/tag/tag/RenderTag":399,"./component/tag/tag/SpotRenderTag":400,"./component/tag/tag/SpotTag":401,"./component/tag/tag/Tag":402,"./component/tag/tag/TagDomain":403,"./component/utils/ComponentSize":404,"./component/utils/HandlerBase":405,"./component/utils/MeshFactory":406,"./component/utils/MeshScene":407,"./component/utils/MouseOperator":408,"./component/zoom/ZoomComponent":409}],292:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var EdgeDirection_1 = require("./graph/edge/EdgeDirection");
+Object.defineProperty(exports, "EdgeDirection", { enumerable: true, get: function () { return EdgeDirection_1.EdgeDirection; } });
+var EdgeCalculatorSettings_1 = require("./graph/edge/EdgeCalculatorSettings");
+Object.defineProperty(exports, "EdgeCalculatorSettings", { enumerable: true, get: function () { return EdgeCalculatorSettings_1.EdgeCalculatorSettings; } });
+var EdgeCalculatorDirections_1 = require("./graph/edge/EdgeCalculatorDirections");
+Object.defineProperty(exports, "EdgeCalculatorDirections", { enumerable: true, get: function () { return EdgeCalculatorDirections_1.EdgeCalculatorDirections; } });
+var EdgeCalculatorCoefficients_1 = require("./graph/edge/EdgeCalculatorCoefficients");
+Object.defineProperty(exports, "EdgeCalculatorCoefficients", { enumerable: true, get: function () { return EdgeCalculatorCoefficients_1.EdgeCalculatorCoefficients; } });
+var EdgeCalculator_1 = require("./graph/edge/EdgeCalculator");
+Object.defineProperty(exports, "EdgeCalculator", { enumerable: true, get: function () { return EdgeCalculator_1.EdgeCalculator; } });
+__exportStar(require("./graph/edge/interfaces/interfaces"), exports);
+
+},{"./graph/edge/EdgeCalculator":433,"./graph/edge/EdgeCalculatorCoefficients":434,"./graph/edge/EdgeCalculatorDirections":435,"./graph/edge/EdgeCalculatorSettings":436,"./graph/edge/EdgeDirection":437,"./graph/edge/interfaces/interfaces":438}],293:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var AbortMapillaryError_1 = require("./error/AbortMapillaryError");
+Object.defineProperty(exports, "AbortMapillaryError", { enumerable: true, get: function () { return AbortMapillaryError_1.AbortMapillaryError; } });
+var ArgumentMapillaryError_1 = require("./error/ArgumentMapillaryError");
+Object.defineProperty(exports, "ArgumentMapillaryError", { enumerable: true, get: function () { return ArgumentMapillaryError_1.ArgumentMapillaryError; } });
+var GraphMapillaryError_1 = require("./error/GraphMapillaryError");
+Object.defineProperty(exports, "GraphMapillaryError", { enumerable: true, get: function () { return GraphMapillaryError_1.GraphMapillaryError; } });
+var MapillaryError_1 = require("./error/MapillaryError");
+Object.defineProperty(exports, "MapillaryError", { enumerable: true, get: function () { return MapillaryError_1.MapillaryError; } });
+
+},{"./error/AbortMapillaryError":410,"./error/ArgumentMapillaryError":411,"./error/GraphMapillaryError":412,"./error/MapillaryError":413}],294:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Lines = exports.Geo = void 0;
+var Camera_1 = require("./geo/Camera");
+Object.defineProperty(exports, "Camera", { enumerable: true, get: function () { return Camera_1.Camera; } });
+var GeoCoords_1 = require("./geo/GeoCoords");
+Object.defineProperty(exports, "GeoCoords", { enumerable: true, get: function () { return GeoCoords_1.GeoCoords; } });
+var GeoRBush_1 = require("./geo/GeoRBush");
+Object.defineProperty(exports, "GeoRBush", { enumerable: true, get: function () { return GeoRBush_1.GeoRBush; } });
+var ViewportCoords_1 = require("./geo/ViewportCoords");
+Object.defineProperty(exports, "ViewportCoords", { enumerable: true, get: function () { return ViewportCoords_1.ViewportCoords; } });
+var Spatial_1 = require("./geo/Spatial");
+Object.defineProperty(exports, "Spatial", { enumerable: true, get: function () { return Spatial_1.Spatial; } });
+var Transform_1 = require("./geo/Transform");
+Object.defineProperty(exports, "Transform", { enumerable: true, get: function () { return Transform_1.Transform; } });
+__exportStar(require("./geo/interfaces/interfaces"), exports);
+var Geo = require("./geo/Geo");
+exports.Geo = Geo;
+var Lines = require("./geo/Lines");
+exports.Lines = Lines;
+
+},{"./geo/Camera":414,"./geo/Geo":415,"./geo/GeoCoords":416,"./geo/GeoRBush":417,"./geo/Lines":418,"./geo/Spatial":419,"./geo/Transform":420,"./geo/ViewportCoords":421,"./geo/interfaces/interfaces":422}],295:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var FilterCreator_1 = require("./graph/FilterCreator");
+Object.defineProperty(exports, "FilterCreator", { enumerable: true, get: function () { return FilterCreator_1.FilterCreator; } });
+var Graph_1 = require("./graph/Graph");
+Object.defineProperty(exports, "Graph", { enumerable: true, get: function () { return Graph_1.Graph; } });
+var GraphCalculator_1 = require("./graph/GraphCalculator");
+Object.defineProperty(exports, "GraphCalculator", { enumerable: true, get: function () { return GraphCalculator_1.GraphCalculator; } });
+var GraphMode_1 = require("./graph/GraphMode");
+Object.defineProperty(exports, "GraphMode", { enumerable: true, get: function () { return GraphMode_1.GraphMode; } });
+var GraphService_1 = require("./graph/GraphService");
+Object.defineProperty(exports, "GraphService", { enumerable: true, get: function () { return GraphService_1.GraphService; } });
+var ImageLoadingService_1 = require("./graph/ImageLoadingService");
+Object.defineProperty(exports, "ImageLoadingService", { enumerable: true, get: function () { return ImageLoadingService_1.ImageLoadingService; } });
+var MeshReader_1 = require("./graph/MeshReader");
+Object.defineProperty(exports, "MeshReader", { enumerable: true, get: function () { return MeshReader_1.MeshReader; } });
+var Node_1 = require("./graph/Node");
+Object.defineProperty(exports, "Node", { enumerable: true, get: function () { return Node_1.Node; } });
+var NodeCache_1 = require("./graph/NodeCache");
+Object.defineProperty(exports, "NodeCache", { enumerable: true, get: function () { return NodeCache_1.NodeCache; } });
+var Sequence_1 = require("./graph/Sequence");
+Object.defineProperty(exports, "Sequence", { enumerable: true, get: function () { return Sequence_1.Sequence; } });
+__exportStar(require("./graph/interfaces/interfaces"), exports);
+
+},{"./graph/FilterCreator":423,"./graph/Graph":424,"./graph/GraphCalculator":425,"./graph/GraphMode":426,"./graph/GraphService":427,"./graph/ImageLoadingService":428,"./graph/MeshReader":429,"./graph/Node":430,"./graph/NodeCache":431,"./graph/Sequence":432,"./graph/interfaces/interfaces":439}],296:[function(require,module,exports){
+"use strict";
+/**
+ * MapillaryJS is a WebGL JavaScript library for exploring street level imagery
+ * @name Mapillary
+ */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SpatialDataComponent = exports.PopupComponent = exports.MarkerComponent = exports.TagComponent = void 0;
+__exportStar(require("./Support"), exports);
+var Edge_1 = require("./Edge");
+Object.defineProperty(exports, "EdgeDirection", { enumerable: true, get: function () { return Edge_1.EdgeDirection; } });
+var Error_1 = require("./Error");
+Object.defineProperty(exports, "AbortMapillaryError", { enumerable: true, get: function () { return Error_1.AbortMapillaryError; } });
+var Render_1 = require("./Render");
+Object.defineProperty(exports, "RenderMode", { enumerable: true, get: function () { return Render_1.RenderMode; } });
+var State_1 = require("./State");
+Object.defineProperty(exports, "TransitionMode", { enumerable: true, get: function () { return State_1.TransitionMode; } });
+var Viewer_1 = require("./Viewer");
+Object.defineProperty(exports, "Alignment", { enumerable: true, get: function () { return Viewer_1.Alignment; } });
+Object.defineProperty(exports, "ImageSize", { enumerable: true, get: function () { return Viewer_1.ImageSize; } });
+Object.defineProperty(exports, "Viewer", { enumerable: true, get: function () { return Viewer_1.Viewer; } });
+var Component_1 = require("./Component");
+Object.defineProperty(exports, "SliderMode", { enumerable: true, get: function () { return Component_1.SliderMode; } });
+Object.defineProperty(exports, "ComponentSize", { enumerable: true, get: function () { return Component_1.ComponentSize; } });
+var TagComponent = require("./component/tag/Tag");
+exports.TagComponent = TagComponent;
+var MarkerComponent = require("./component/marker/Marker");
+exports.MarkerComponent = MarkerComponent;
+var PopupComponent = require("./component/popup/Popup");
+exports.PopupComponent = PopupComponent;
+var SpatialDataComponent = require("./component/spatialdata/SpatialData");
+exports.SpatialDataComponent = SpatialDataComponent;
+
+},{"./Component":291,"./Edge":292,"./Error":293,"./Render":297,"./State":298,"./Support":299,"./Viewer":302,"./component/marker/Marker":333,"./component/popup/Popup":350,"./component/spatialdata/SpatialData":361,"./component/tag/Tag":366}],297:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var DOMRenderer_1 = require("./render/DOMRenderer");
+Object.defineProperty(exports, "DOMRenderer", { enumerable: true, get: function () { return DOMRenderer_1.DOMRenderer; } });
+var GLRenderer_1 = require("./render/GLRenderer");
+Object.defineProperty(exports, "GLRenderer", { enumerable: true, get: function () { return GLRenderer_1.GLRenderer; } });
+var GLRenderStage_1 = require("./render/GLRenderStage");
+Object.defineProperty(exports, "GLRenderStage", { enumerable: true, get: function () { return GLRenderStage_1.GLRenderStage; } });
+var RenderCamera_1 = require("./render/RenderCamera");
+Object.defineProperty(exports, "RenderCamera", { enumerable: true, get: function () { return RenderCamera_1.RenderCamera; } });
+var RenderMode_1 = require("./render/RenderMode");
+Object.defineProperty(exports, "RenderMode", { enumerable: true, get: function () { return RenderMode_1.RenderMode; } });
+var RenderService_1 = require("./render/RenderService");
+Object.defineProperty(exports, "RenderService", { enumerable: true, get: function () { return RenderService_1.RenderService; } });
+__exportStar(require("./render/interfaces/interfaces"), exports);
+
+},{"./render/DOMRenderer":440,"./render/GLRenderStage":441,"./render/GLRenderer":442,"./render/RenderCamera":443,"./render/RenderMode":444,"./render/RenderService":445,"./render/interfaces/interfaces":446}],298:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var FrameGenerator_1 = require("./state/FrameGenerator");
+Object.defineProperty(exports, "FrameGenerator", { enumerable: true, get: function () { return FrameGenerator_1.FrameGenerator; } });
+var RotationDelta_1 = require("./state/RotationDelta");
+Object.defineProperty(exports, "RotationDelta", { enumerable: true, get: function () { return RotationDelta_1.RotationDelta; } });
+var State_1 = require("./state/State");
+Object.defineProperty(exports, "State", { enumerable: true, get: function () { return State_1.State; } });
+var StateBase_1 = require("./state/states/StateBase");
+Object.defineProperty(exports, "StateBase", { enumerable: true, get: function () { return StateBase_1.StateBase; } });
+var StateContext_1 = require("./state/StateContext");
+Object.defineProperty(exports, "StateContext", { enumerable: true, get: function () { return StateContext_1.StateContext; } });
+var StateService_1 = require("./state/StateService");
+Object.defineProperty(exports, "StateService", { enumerable: true, get: function () { return StateService_1.StateService; } });
+var TransitionMode_1 = require("./state/TransitionMode");
+Object.defineProperty(exports, "TransitionMode", { enumerable: true, get: function () { return TransitionMode_1.TransitionMode; } });
+var EarthState_1 = require("./state/states/EarthState");
+Object.defineProperty(exports, "EarthState", { enumerable: true, get: function () { return EarthState_1.EarthState; } });
+var InteractiveStateBase_1 = require("./state/states/InteractiveStateBase");
+Object.defineProperty(exports, "InteractiveStateBase", { enumerable: true, get: function () { return InteractiveStateBase_1.InteractiveStateBase; } });
+var InteractiveWaitingState_1 = require("./state/states/InteractiveWaitingState");
+Object.defineProperty(exports, "InteractiveWaitingState", { enumerable: true, get: function () { return InteractiveWaitingState_1.InteractiveWaitingState; } });
+var TraversingState_1 = require("./state/states/TraversingState");
+Object.defineProperty(exports, "TraversingState", { enumerable: true, get: function () { return TraversingState_1.TraversingState; } });
+var WaitingState_1 = require("./state/states/WaitingState");
+Object.defineProperty(exports, "WaitingState", { enumerable: true, get: function () { return WaitingState_1.WaitingState; } });
+__exportStar(require("./state/interfaces/interfaces"), exports);
+
+},{"./state/FrameGenerator":447,"./state/RotationDelta":448,"./state/State":449,"./state/StateContext":450,"./state/StateService":451,"./state/TransitionMode":452,"./state/interfaces/interfaces":453,"./state/states/EarthState":454,"./state/states/InteractiveStateBase":455,"./state/states/InteractiveWaitingState":456,"./state/states/StateBase":457,"./state/states/TraversingState":458,"./state/states/WaitingState":459}],299:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isFallbackSupported = exports.isSupported = void 0;
+var support = require("./utils/Support");
+/**
+ * Test whether the current browser supports the full
+ * functionality of MapillaryJS.
+ *
+ * @description The full functionality includes WebGL rendering.
+ *
+ * @return {boolean}
+ *
+ * @example `var supported = Mapillary.isSupported();`
+ */
+function isSupported() {
+    return isFallbackSupported() &&
+        support.isWebGLSupportedCached();
+}
+exports.isSupported = isSupported;
+/**
+ * Test whether the current browser supports the fallback
+ * functionality of MapillaryJS.
+ *
+ * @description The fallback functionality does not include WebGL
+ * rendering, only 2D canvas rendering.
+ *
+ * @return {boolean}
+ *
+ * @example `var fallbackSupported = Mapillary.isFallbackSupported();`
+ */
+function isFallbackSupported() {
+    return support.isBrowser() &&
+        support.isBlobSupported() &&
+        support.isArraySupported() &&
+        support.isFunctionSupported() &&
+        support.isJSONSupported() &&
+        support.isObjectSupported();
+}
+exports.isFallbackSupported = isFallbackSupported;
+
+},{"./utils/Support":468}],300:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var ImageTileLoader_1 = require("./tiles/ImageTileLoader");
+Object.defineProperty(exports, "ImageTileLoader", { enumerable: true, get: function () { return ImageTileLoader_1.ImageTileLoader; } });
+var ImageTileStore_1 = require("./tiles/ImageTileStore");
+Object.defineProperty(exports, "ImageTileStore", { enumerable: true, get: function () { return ImageTileStore_1.ImageTileStore; } });
+var TextureProvider_1 = require("./tiles/TextureProvider");
+Object.defineProperty(exports, "TextureProvider", { enumerable: true, get: function () { return TextureProvider_1.TextureProvider; } });
+var RegionOfInterestCalculator_1 = require("./tiles/RegionOfInterestCalculator");
+Object.defineProperty(exports, "RegionOfInterestCalculator", { enumerable: true, get: function () { return RegionOfInterestCalculator_1.RegionOfInterestCalculator; } });
+__exportStar(require("./tiles/interfaces/interfaces"), exports);
+
+},{"./tiles/ImageTileLoader":460,"./tiles/ImageTileStore":461,"./tiles/RegionOfInterestCalculator":462,"./tiles/TextureProvider":463,"./tiles/interfaces/interfaces":464}],301:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var DOM_1 = require("./utils/DOM");
+Object.defineProperty(exports, "DOM", { enumerable: true, get: function () { return DOM_1.DOM; } });
+var EventEmitter_1 = require("./utils/EventEmitter");
+Object.defineProperty(exports, "EventEmitter", { enumerable: true, get: function () { return EventEmitter_1.EventEmitter; } });
+var Settings_1 = require("./utils/Settings");
+Object.defineProperty(exports, "Settings", { enumerable: true, get: function () { return Settings_1.Settings; } });
+__exportStar(require("./utils/Support"), exports);
+var Urls_1 = require("./utils/Urls");
+Object.defineProperty(exports, "Urls", { enumerable: true, get: function () { return Urls_1.Urls; } });
+
+},{"./utils/DOM":465,"./utils/EventEmitter":466,"./utils/Settings":467,"./utils/Support":468,"./utils/Urls":469}],302:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var Alignment_1 = require("./viewer/Alignment");
+Object.defineProperty(exports, "Alignment", { enumerable: true, get: function () { return Alignment_1.Alignment; } });
+var CacheService_1 = require("./viewer/CacheService");
+Object.defineProperty(exports, "CacheService", { enumerable: true, get: function () { return CacheService_1.CacheService; } });
+var ComponentController_1 = require("./viewer/ComponentController");
+Object.defineProperty(exports, "ComponentController", { enumerable: true, get: function () { return ComponentController_1.ComponentController; } });
+var Container_1 = require("./viewer/Container");
+Object.defineProperty(exports, "Container", { enumerable: true, get: function () { return Container_1.Container; } });
+var Observer_1 = require("./viewer/Observer");
+Object.defineProperty(exports, "Observer", { enumerable: true, get: function () { return Observer_1.Observer; } });
+var ImageSize_1 = require("./viewer/ImageSize");
+Object.defineProperty(exports, "ImageSize", { enumerable: true, get: function () { return ImageSize_1.ImageSize; } });
+var KeyboardService_1 = require("./viewer/KeyboardService");
+Object.defineProperty(exports, "KeyboardService", { enumerable: true, get: function () { return KeyboardService_1.KeyboardService; } });
+var LoadingService_1 = require("./viewer/LoadingService");
+Object.defineProperty(exports, "LoadingService", { enumerable: true, get: function () { return LoadingService_1.LoadingService; } });
+var MouseService_1 = require("./viewer/MouseService");
+Object.defineProperty(exports, "MouseService", { enumerable: true, get: function () { return MouseService_1.MouseService; } });
+var Navigator_1 = require("./viewer/Navigator");
+Object.defineProperty(exports, "Navigator", { enumerable: true, get: function () { return Navigator_1.Navigator; } });
+var PlayService_1 = require("./viewer/PlayService");
+Object.defineProperty(exports, "PlayService", { enumerable: true, get: function () { return PlayService_1.PlayService; } });
+var Projection_1 = require("./viewer/Projection");
+Object.defineProperty(exports, "Projection", { enumerable: true, get: function () { return Projection_1.Projection; } });
+var SpriteService_1 = require("./viewer/SpriteService");
+Object.defineProperty(exports, "SpriteService", { enumerable: true, get: function () { return SpriteService_1.SpriteService; } });
+var TouchService_1 = require("./viewer/TouchService");
+Object.defineProperty(exports, "TouchService", { enumerable: true, get: function () { return TouchService_1.TouchService; } });
+var Viewer_1 = require("./viewer/Viewer");
+Object.defineProperty(exports, "Viewer", { enumerable: true, get: function () { return Viewer_1.Viewer; } });
+__exportStar(require("./viewer/interfaces/interfaces"), exports);
+
+},{"./viewer/Alignment":470,"./viewer/CacheService":471,"./viewer/ComponentController":472,"./viewer/Container":473,"./viewer/ImageSize":474,"./viewer/KeyboardService":475,"./viewer/LoadingService":476,"./viewer/MouseService":477,"./viewer/Navigator":478,"./viewer/Observer":479,"./viewer/PlayService":481,"./viewer/Projection":482,"./viewer/SpriteService":483,"./viewer/TouchService":484,"./viewer/Viewer":485,"./viewer/interfaces/interfaces":486}],303:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.APIv3 = void 0;
+var operators_1 = require("rxjs/operators");
+var rxjs_1 = require("rxjs");
+var API_1 = require("../API");
+/**
+ * @class APIv3
+ *
+ * @classdesc Provides methods for access of API v3.
+ */
+var APIv3 = /** @class */ (function () {
+    /**
+     * Create a new api v3 instance.
+     *
+     * @param {number} clientId - Client id for API requests.
+     * @param {number} [token] - Optional bearer token for API requests of
+     * protected resources.
+     * @param {ModelCreator} [creator] - Optional model creator instance.
+     */
+    function APIv3(clientId, token, creator) {
+        this._clientId = clientId;
+        this._modelCreator = creator != null ? creator : new API_1.ModelCreator();
+        this._model = this._modelCreator.createModel(clientId, token);
+        this._pageCount = 999;
+        this._pathImageByKey = "imageByKey";
+        this._pathImageCloseTo = "imageCloseTo";
+        this._pathImagesByH = "imagesByH";
+        this._pathImageViewAdd = "imageViewAdd";
+        this._pathSequenceByKey = "sequenceByKey";
+        this._pathSequenceViewAdd = "sequenceViewAdd";
+        this._propertiesCore = [
+            "cl",
+            "l",
+            "sequence_key",
+        ];
+        this._propertiesFill = [
+            "captured_at",
+            "captured_with_camera_uuid",
+            "user",
+            "organization_key",
+            "private",
+            "project",
+        ];
+        this._propertiesKey = [
+            "key",
+        ];
+        this._propertiesSequence = [
+            "keys",
+        ];
+        this._propertiesSpatial = [
+            "atomic_scale",
+            "cluster_key",
+            "c_rotation",
+            "ca",
+            "calt",
+            "camera_projection_type",
+            "cca",
+            "cfocal",
+            "ck1",
+            "ck2",
+            "gpano",
+            "height",
+            "merge_cc",
+            "merge_version",
+            "orientation",
+            "width",
+        ];
+        this._propertiesUser = [
+            "username",
+        ];
+    }
+    Object.defineProperty(APIv3.prototype, "clientId", {
+        get: function () {
+            return this._clientId;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    APIv3.prototype.imageByKeyFill$ = function (keys) {
+        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
+            this._pathImageByKey,
+            keys,
+            this._propertiesKey
+                .concat(this._propertiesFill)
+                .concat(this._propertiesSpatial),
+            this._propertiesKey
+                .concat(this._propertiesUser)
+        ])).pipe(operators_1.map(function (value) {
+            if (!value) {
+                throw new Error("Images (" + keys.join(", ") + ") could not be found.");
+            }
+            return value.json.imageByKey;
+        })), this._pathImageByKey, keys);
+    };
+    APIv3.prototype.imageByKeyFull$ = function (keys) {
+        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
+            this._pathImageByKey,
+            keys,
+            this._propertiesKey
+                .concat(this._propertiesCore)
+                .concat(this._propertiesFill)
+                .concat(this._propertiesSpatial),
+            this._propertiesKey
+                .concat(this._propertiesUser)
+        ])).pipe(operators_1.map(function (value) {
+            if (!value) {
+                throw new Error("Images (" + keys.join(", ") + ") could not be found.");
+            }
+            return value.json.imageByKey;
+        })), this._pathImageByKey, keys);
+    };
+    APIv3.prototype.imageCloseTo$ = function (lat, lon) {
+        var lonLat = lon + ":" + lat;
+        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
+            this._pathImageCloseTo,
+            [lonLat],
+            this._propertiesKey
+                .concat(this._propertiesCore)
+                .concat(this._propertiesFill)
+                .concat(this._propertiesSpatial),
+            this._propertiesKey
+                .concat(this._propertiesUser)
+        ])).pipe(operators_1.map(function (value) {
+            return value != null ? value.json.imageCloseTo[lonLat] : null;
+        })), this._pathImageCloseTo, [lonLat]);
+    };
+    APIv3.prototype.imagesByH$ = function (hs) {
+        var _this = this;
+        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
+            this._pathImagesByH,
+            hs,
+            { from: 0, to: this._pageCount },
+            this._propertiesKey
+                .concat(this._propertiesCore)
+        ])).pipe(operators_1.map(function (value) {
+            if (!value) {
+                value = { json: { imagesByH: {} } };
+                for (var _i = 0, hs_1 = hs; _i < hs_1.length; _i++) {
+                    var h = hs_1[_i];
+                    value.json.imagesByH[h] = {};
+                    for (var i = 0; i <= _this._pageCount; i++) {
+                        value.json.imagesByH[h][i] = null;
+                    }
+                }
+            }
+            return value.json.imagesByH;
+        })), this._pathImagesByH, hs);
+    };
+    APIv3.prototype.imageViewAdd$ = function (keys) {
+        return this._catchInvalidateCall$(this._wrapCallModelResponse$(this._model.call([this._pathImageViewAdd], [keys])), this._pathImageViewAdd, keys);
+    };
+    APIv3.prototype.invalidateImageByKey = function (keys) {
+        this._invalidateGet(this._pathImageByKey, keys);
+    };
+    APIv3.prototype.invalidateImagesByH = function (hs) {
+        this._invalidateGet(this._pathImagesByH, hs);
+    };
+    APIv3.prototype.invalidateSequenceByKey = function (sKeys) {
+        this._invalidateGet(this._pathSequenceByKey, sKeys);
+    };
+    APIv3.prototype.setToken = function (token) {
+        this._model.invalidate([]);
+        this._model = null;
+        this._model = this._modelCreator.createModel(this._clientId, token);
+    };
+    APIv3.prototype.sequenceByKey$ = function (sequenceKeys) {
+        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
+            this._pathSequenceByKey,
+            sequenceKeys,
+            this._propertiesKey
+                .concat(this._propertiesSequence)
+        ])).pipe(operators_1.map(function (value) {
+            if (!value) {
+                value = { json: { sequenceByKey: {} } };
+            }
+            for (var _i = 0, sequenceKeys_1 = sequenceKeys; _i < sequenceKeys_1.length; _i++) {
+                var sequenceKey = sequenceKeys_1[_i];
+                if (!(sequenceKey in value.json.sequenceByKey)) {
+                    console.warn("Sequence data missing (" + sequenceKey + ")");
+                    value.json.sequenceByKey[sequenceKey] = { key: sequenceKey, keys: [] };
+                }
+            }
+            return value.json.sequenceByKey;
+        })), this._pathSequenceByKey, sequenceKeys);
+    };
+    APIv3.prototype.sequenceViewAdd$ = function (sequenceKeys) {
+        return this._catchInvalidateCall$(this._wrapCallModelResponse$(this._model.call([this._pathSequenceViewAdd], [sequenceKeys])), this._pathSequenceViewAdd, sequenceKeys);
+    };
+    APIv3.prototype._catchInvalidateGet$ = function (observable, path, paths) {
+        var _this = this;
+        return observable.pipe(operators_1.catchError(function (error) {
+            _this._invalidateGet(path, paths);
+            throw error;
+        }));
+    };
+    APIv3.prototype._catchInvalidateCall$ = function (observable, path, paths) {
+        var _this = this;
+        return observable.pipe(operators_1.catchError(function (error) {
+            _this._invalidateCall(path, paths);
+            throw error;
+        }));
+    };
+    APIv3.prototype._invalidateGet = function (path, paths) {
+        this._model.invalidate([path, paths]);
+    };
+    APIv3.prototype._invalidateCall = function (path, paths) {
+        this._model.invalidate([path], [paths]);
+    };
+    APIv3.prototype._wrapModelResponse$ = function (modelResponse) {
+        return rxjs_1.Observable
+            .create(function (subscriber) {
+            modelResponse
+                .then(function (value) {
+                subscriber.next(value);
+                subscriber.complete();
+            }, function (error) {
+                subscriber.error(error);
+            });
+        });
+    };
+    APIv3.prototype._wrapCallModelResponse$ = function (modelResponse) {
+        return this._wrapModelResponse$(modelResponse).pipe(operators_1.map(function (value) {
+            return;
+        }));
+    };
+    return APIv3;
+}());
+exports.APIv3 = APIv3;
+exports.default = APIv3;
+
+},{"../API":290,"rxjs":43,"rxjs/operators":241}],304:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ModelCreator = void 0;
+var falcor = require("falcor");
+var falcor_http_datasource_1 = require("falcor-http-datasource");
+var Utils_1 = require("../Utils");
+/**
+ * @class ModelCreator
+ *
+ * @classdesc Creates API models.
+ */
+var ModelCreator = /** @class */ (function () {
+    function ModelCreator() {
+    }
+    /**
+     * Creates a Falcor model.
+     *
+     * @description Max cache size will be set to 16 MB. Authorization
+     * header will be added if bearer token is supplied.
+     *
+     * @param {number} clientId - Client id for API requests.
+     * @param {number} [token] - Optional bearer token for API requests of
+     * protected resources.
+     * @returns {falcor.Model} Falcor model for HTTP requests.
+     */
+    ModelCreator.prototype.createModel = function (clientId, token) {
+        var configuration = {
+            crossDomain: true,
+            withCredentials: false,
+        };
+        if (token != null) {
+            configuration.headers = { "Authorization": "Bearer " + token };
+        }
+        return new falcor.Model({
+            maxSize: 16 * 1024 * 1024,
+            source: new falcor_http_datasource_1.default(Utils_1.Urls.falcorModel(clientId), configuration),
+        });
+    };
+    return ModelCreator;
+}());
+exports.ModelCreator = ModelCreator;
+exports.default = ModelCreator;
 
-       /**
-        * Return a promise that will always fulfill with an array containing
-        * the outcome states of all input promises.  The returned promise
-        * will only reject if `promises` itself is a rejected promise.
-        * @param {array|Promise} promises array (or promise for an array) of promises
-        * @returns {Promise} promise for array of settled state descriptors
-        */
-       function settle(promises) {
-               return when(promises, Promise.settle);
-       }
+},{"../Utils":301,"falcor":15,"falcor-http-datasource":10}],305:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
 
-       /**
-        * Promise-aware array map function, similar to `Array.prototype.map()`,
-        * but input array may contain promises or values.
-        * @param {Array|Promise} promises array of anything, may contain promises and values
-        * @param {function(x:*, index:Number):*} mapFunc map function which may
-        *  return a promise or value
-        * @returns {Promise} promise that will fulfill with an array of mapped values
-        *  or reject if any input promise rejects.
-        */
-       function map(promises, mapFunc) {
-               return when(promises, function(promises) {
-                       return Promise.map(promises, mapFunc);
-               });
-       }
+},{}],306:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.AttributionComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../Component");
+var Utils_1 = require("../Utils");
+var AttributionComponent = /** @class */ (function (_super) {
+    __extends(AttributionComponent, _super);
+    function AttributionComponent(name, container, navigator) {
+        return _super.call(this, name, container, navigator) || this;
+    }
+    AttributionComponent.prototype._activate = function () {
+        var _this = this;
+        this._disposable = rxjs_1.combineLatest(this._navigator.stateService.currentNode$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
+            var node = _a[0], size = _a[1];
+            return {
+                name: _this._name,
+                vnode: _this._getAttributionNode(node.username, node.key, node.capturedAt, size.width),
+            };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+    };
+    AttributionComponent.prototype._deactivate = function () {
+        this._disposable.unsubscribe();
+    };
+    AttributionComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    AttributionComponent.prototype._getAttributionNode = function (username, key, capturedAt, width) {
+        var compact = width <= 640;
+        var mapillaryIcon = vd.h("div.AttributionMapillaryLogo", []);
+        var mapillaryLink = vd.h("a.AttributionIconContainer", { href: Utils_1.Urls.explore, target: "_blank" }, [mapillaryIcon]);
+        var imageBy = compact ? "" + username : "image by " + username;
+        var imageByContent = vd.h("div.AttributionUsername", { textContent: imageBy }, []);
+        var date = new Date(capturedAt).toDateString().split(" ");
+        var formatted = (date.length > 3 ?
+            compact ?
+                [date[3]] :
+                [date[1], date[2] + ",", date[3]] :
+            date).join(" ");
+        var dateContent = vd.h("div.AttributionDate", { textContent: formatted }, []);
+        var imageLink = vd.h("a.AttributionImageContainer", { href: Utils_1.Urls.exporeImage(key), target: "_blank" }, [imageByContent, dateContent]);
+        var compactClass = compact ? ".AttributionCompact" : "";
+        return vd.h("div.AttributionContainer" + compactClass, {}, [mapillaryLink, imageLink]);
+    };
+    AttributionComponent.componentName = "attribution";
+    return AttributionComponent;
+}(Component_1.Component));
+exports.AttributionComponent = AttributionComponent;
+Component_1.ComponentService.register(AttributionComponent);
+exports.default = AttributionComponent;
 
-       /**
-        * Filter the provided array of promises using the provided predicate.  Input may
-        * contain promises and values
-        * @param {Array|Promise} promises array of promises and values
-        * @param {function(x:*, index:Number):boolean} predicate filtering predicate.
-        *  Must return truthy (or promise for truthy) for items to retain.
-        * @returns {Promise} promise that will fulfill with an array containing all items
-        *  for which predicate returned truthy.
-        */
-       function filter(promises, predicate) {
-               return when(promises, function(promises) {
-                       return Promise.filter(promises, predicate);
-               });
-       }
+},{"../Component":291,"../Utils":301,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],307:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.BackgroundComponent = void 0;
+var vd = require("virtual-dom");
+var Component_1 = require("../Component");
+var BackgroundComponent = /** @class */ (function (_super) {
+    __extends(BackgroundComponent, _super);
+    function BackgroundComponent(name, container, navigator) {
+        return _super.call(this, name, container, navigator) || this;
+    }
+    BackgroundComponent.prototype._activate = function () {
+        this._container.domRenderer.render$
+            .next({ name: this._name, vnode: this._getBackgroundNode("The viewer can't display the given image.") });
+    };
+    BackgroundComponent.prototype._deactivate = function () {
+        return;
+    };
+    BackgroundComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    BackgroundComponent.prototype._getBackgroundNode = function (notice) {
+        // todo: add condition for when to display the DOM node
+        return vd.h("div.BackgroundWrapper", {}, [
+            vd.h("p", { textContent: notice }, []),
+        ]);
+    };
+    BackgroundComponent.componentName = "background";
+    return BackgroundComponent;
+}(Component_1.Component));
+exports.BackgroundComponent = BackgroundComponent;
+Component_1.ComponentService.register(BackgroundComponent);
+exports.default = BackgroundComponent;
 
-       return when;
-});
-})(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); });
+},{"../Component":291,"virtual-dom":247}],308:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.BearingComponent = void 0;
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var UnitBezier = require("@mapbox/unitbezier");
+var rxjs_1 = require("rxjs");
+var Component_1 = require("../Component");
+var Geo_1 = require("../Geo");
+var ViewportCoords_1 = require("../geo/ViewportCoords");
+var ComponentSize_1 = require("./utils/ComponentSize");
+/**
+ * @class BearingComponent
+ *
+ * @classdesc Component for indicating bearing and field of view.
+ *
+ * @example
+ * ```
+ * var viewer = new Mapillary.Viewer(
+ *     "<element-id>",
+ *     "<client-id>",
+ *     "<my key>");
+ *
+ * var bearingComponent = viewer.getComponent("bearing");
+ * bearingComponent.configure({ size: Mapillary.ComponentSize.Small });
+ * ```
+ */
+var BearingComponent = /** @class */ (function (_super) {
+    __extends(BearingComponent, _super);
+    function BearingComponent(name, container, navigator) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._spatial = new Geo_1.Spatial();
+        _this._viewportCoords = new ViewportCoords_1.default();
+        _this._svgNamespace = "http://www.w3.org/2000/svg";
+        _this._distinctThreshold = Math.PI / 360;
+        _this._animationSpeed = 0.075;
+        _this._unitBezier = new UnitBezier(0.74, 0.67, 0.38, 0.96);
+        return _this;
+    }
+    BearingComponent.prototype._activate = function () {
+        var _this = this;
+        var cameraBearingFov$ = this._container.renderService.renderCamera$.pipe(operators_1.map(function (rc) {
+            var vFov = _this._spatial.degToRad(rc.perspective.fov);
+            var hFov = rc.perspective.aspect === Number.POSITIVE_INFINITY ?
+                Math.PI :
+                Math.atan(rc.perspective.aspect * Math.tan(0.5 * vFov)) * 2;
+            return [_this._spatial.azimuthalToBearing(rc.rotation.phi), hFov];
+        }), operators_1.distinctUntilChanged(function (a1, a2) {
+            return Math.abs(a2[0] - a1[0]) < _this._distinctThreshold &&
+                Math.abs(a2[1] - a1[1]) < _this._distinctThreshold;
+        }));
+        var nodeFov$ = rxjs_1.combineLatest(this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
+            return frame.state.currentNode.key;
+        })), this._navigator.panService.panNodes$).pipe(operators_1.map(function (_a) {
+            var frame = _a[0], panNodes = _a[1];
+            var node = frame.state.currentNode;
+            var transform = frame.state.currentTransform;
+            if (node.pano) {
+                var panoHFov = 2 * Math.PI * node.gpano.CroppedAreaImageWidthPixels / node.gpano.FullPanoWidthPixels;
+                return [panoHFov / 2, panoHFov / 2];
+            }
+            var currentProjectedPoints = _this._computeProjectedPoints(transform);
+            var hFov = _this._spatial.degToRad(_this._computeHorizontalFov(currentProjectedPoints));
+            var hFovLeft = hFov / 2;
+            var hFovRight = hFov / 2;
+            for (var _i = 0, panNodes_1 = panNodes; _i < panNodes_1.length; _i++) {
+                var _b = panNodes_1[_i], n = _b[0], f = _b[2];
+                var diff = _this._spatial.wrap(n.ca - node.ca, -180, 180);
+                if (diff < 0) {
+                    hFovLeft = _this._spatial.degToRad(Math.abs(diff)) + f / 2;
+                }
+                else {
+                    hFovRight = _this._spatial.degToRad(Math.abs(diff)) + f / 2;
+                }
+            }
+            return [hFovLeft, hFovRight];
+        }), operators_1.distinctUntilChanged(function (_a, _b) {
+            var hFovLeft1 = _a[0], hFovRight1 = _a[1];
+            var hFovLeft2 = _b[0], hFovRight2 = _b[1];
+            return Math.abs(hFovLeft2 - hFovLeft1) < _this._distinctThreshold &&
+                Math.abs(hFovRight2 - hFovRight1) < _this._distinctThreshold;
+        }));
+        var offset$ = rxjs_1.combineLatest(this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
+            return frame.state.currentNode.key;
+        })), this._container.renderService.bearing$).pipe(operators_1.map(function (_a) {
+            var frame = _a[0], bearing = _a[1];
+            var offset = _this._spatial.degToRad(frame.state.currentNode.ca - bearing);
+            return offset;
+        }));
+        var nodeFovOperation$ = new rxjs_1.Subject();
+        var smoothNodeFov$ = nodeFovOperation$.pipe(operators_1.scan(function (state, operation) {
+            return operation(state);
+        }, { alpha: 0, curr: [0, 0, 0], prev: [0, 0, 0] }), operators_1.map(function (state) {
+            var alpha = _this._unitBezier.solve(state.alpha);
+            var curr = state.curr;
+            var prev = state.prev;
+            return [
+                _this._interpolate(prev[0], curr[0], alpha),
+                _this._interpolate(prev[1], curr[1], alpha),
+            ];
+        }));
+        this._fovSubscription = nodeFov$.pipe(operators_1.map(function (nbf) {
+            return function (state) {
+                var a = _this._unitBezier.solve(state.alpha);
+                var c = state.curr;
+                var p = state.prev;
+                var prev = [
+                    _this._interpolate(p[0], c[0], a),
+                    _this._interpolate(p[1], c[1], a),
+                ];
+                var curr = nbf.slice();
+                return {
+                    alpha: 0,
+                    curr: curr,
+                    prev: prev,
+                };
+            };
+        }))
+            .subscribe(nodeFovOperation$);
+        this._fovAnimationSubscription = nodeFov$.pipe(operators_1.switchMap(function () {
+            return _this._container.renderService.renderCameraFrame$.pipe(operators_1.skip(1), operators_1.scan(function (alpha) {
+                return alpha + _this._animationSpeed;
+            }, 0), operators_1.takeWhile(function (alpha) {
+                return alpha <= 1 + _this._animationSpeed;
+            }), operators_1.map(function (alpha) {
+                return Math.min(alpha, 1);
+            }));
+        }), operators_1.map(function (alpha) {
+            return function (nbfState) {
+                return {
+                    alpha: alpha,
+                    curr: nbfState.curr.slice(),
+                    prev: nbfState.prev.slice(),
+                };
+            };
+        }))
+            .subscribe(nodeFovOperation$);
+        var nodeBearingFov$ = rxjs_1.combineLatest(offset$, smoothNodeFov$).pipe(operators_1.map(function (_a) {
+            var offset = _a[0], fov = _a[1];
+            return [offset, fov[0], fov[1]];
+        }));
+        this._renderSubscription = rxjs_1.combineLatest(cameraBearingFov$, nodeBearingFov$, this._configuration$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
+            var _b = _a[0], cb = _b[0], cf = _b[1], _c = _a[1], no = _c[0], nfl = _c[1], nfr = _c[2], configuration = _a[2], size = _a[3];
+            var background = _this._createBackground(cb);
+            var fovIndicator = _this._createFovIndicator(nfl, nfr, no);
+            var north = _this._createNorth(cb);
+            var cameraSector = _this._createCircleSectorCompass(_this._createCircleSector(Math.max(Math.PI / 20, cf), "#FFF"));
+            var compact = configuration.size === ComponentSize_1.default.Small ||
+                configuration.size === ComponentSize_1.default.Automatic && size.width < 640 ?
+                ".BearingCompact" : "";
+            return {
+                name: _this._name,
+                vnode: vd.h("div.BearingIndicatorContainer" + compact, { oncontextmenu: function (event) { event.preventDefault(); } }, [
+                    background,
+                    fovIndicator,
+                    north,
+                    cameraSector,
+                ]),
+            };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+    };
+    BearingComponent.prototype._deactivate = function () {
+        this._renderSubscription.unsubscribe();
+        this._fovSubscription.unsubscribe();
+        this._fovAnimationSubscription.unsubscribe();
+    };
+    BearingComponent.prototype._getDefaultConfiguration = function () {
+        return { size: ComponentSize_1.default.Automatic };
+    };
+    BearingComponent.prototype._createFovIndicator = function (fovLeft, fovRigth, offset) {
+        var arc = this._createFovArc(fovLeft, fovRigth);
+        var group = vd.h("g", {
+            attributes: { transform: "translate(18,18)" },
+            namespace: this._svgNamespace,
+        }, [arc]);
+        var svg = vd.h("svg", {
+            attributes: { viewBox: "0 0 36 36" },
+            namespace: this._svgNamespace,
+            style: {
+                height: "36px",
+                left: "2px",
+                position: "absolute",
+                top: "2px",
+                transform: "rotateZ(" + this._spatial.radToDeg(offset) + "deg)",
+                width: "36px",
+            },
+        }, [group]);
+        return svg;
+    };
+    BearingComponent.prototype._createFovArc = function (fovLeft, fovRigth) {
+        var radius = 16.75;
+        var strokeWidth = 2.5;
+        var fov = fovLeft + fovRigth;
+        if (fov > 2 * Math.PI - Math.PI / 90) {
+            return vd.h("circle", {
+                attributes: {
+                    cx: "0",
+                    cy: "0",
+                    "fill-opacity": "0",
+                    r: "" + radius,
+                    stroke: "#FFF",
+                    "stroke-width": "" + strokeWidth,
+                },
+                namespace: this._svgNamespace,
+            }, []);
+        }
+        var arcStart = -Math.PI / 2 - fovLeft;
+        var arcEnd = arcStart + fov;
+        var startX = radius * Math.cos(arcStart);
+        var startY = radius * Math.sin(arcStart);
+        var endX = radius * Math.cos(arcEnd);
+        var endY = radius * Math.sin(arcEnd);
+        var largeArc = fov >= Math.PI ? 1 : 0;
+        var description = "M " + startX + " " + startY + " A " + radius + " " + radius + " 0 " + largeArc + " 1 " + endX + " " + endY;
+        return vd.h("path", {
+            attributes: {
+                d: description,
+                "fill-opacity": "0",
+                stroke: "#FFF",
+                "stroke-width": "" + strokeWidth,
+            },
+            namespace: this._svgNamespace,
+        }, []);
+    };
+    BearingComponent.prototype._createCircleSectorCompass = function (cameraSector) {
+        var group = vd.h("g", {
+            attributes: { transform: "translate(1,1)" },
+            namespace: this._svgNamespace,
+        }, [cameraSector]);
+        var svg = vd.h("svg", {
+            attributes: { viewBox: "0 0 2 2" },
+            namespace: this._svgNamespace,
+            style: {
+                height: "26px",
+                left: "7px",
+                position: "absolute",
+                top: "7px",
+                width: "26px",
+            },
+        }, [group]);
+        return svg;
+    };
+    BearingComponent.prototype._createCircleSector = function (fov, fill) {
+        if (fov > 2 * Math.PI - Math.PI / 90) {
+            return vd.h("circle", {
+                attributes: { cx: "0", cy: "0", fill: fill, r: "1" },
+                namespace: this._svgNamespace,
+            }, []);
+        }
+        var arcStart = -Math.PI / 2 - fov / 2;
+        var arcEnd = arcStart + fov;
+        var startX = Math.cos(arcStart);
+        var startY = Math.sin(arcStart);
+        var endX = Math.cos(arcEnd);
+        var endY = Math.sin(arcEnd);
+        var largeArc = fov >= Math.PI ? 1 : 0;
+        var description = "M 0 0 " + startX + " " + startY + " A 1 1 0 " + largeArc + " 1 " + endX + " " + endY;
+        return vd.h("path", {
+            attributes: { d: description, fill: fill },
+            namespace: this._svgNamespace,
+        }, []);
+    };
+    BearingComponent.prototype._createNorth = function (bearing) {
+        var north = vd.h("div.BearingNorth", []);
+        var container = vd.h("div.BearingNorthContainer", { style: { transform: "rotateZ(" + this._spatial.radToDeg(-bearing) + "deg)" } }, [north]);
+        return container;
+    };
+    BearingComponent.prototype._createBackground = function (bearing) {
+        return vd.h("div.BearingIndicatorBackground", { style: { transform: "rotateZ(" + this._spatial.radToDeg(-bearing) + "deg)" } }, [
+            vd.h("div.BearingIndicatorBackgroundCircle", []),
+            vd.h("div.BearingIndicatorBackgroundArrowContainer", [
+                vd.h("div.BearingIndicatorBackgroundArrow", []),
+            ]),
+        ]);
+    };
+    BearingComponent.prototype._computeProjectedPoints = function (transform) {
+        var vertices = [[1, 0]];
+        var directions = [[0, 0.5]];
+        var pointsPerLine = 12;
+        return Geo_1.Geo.computeProjectedPoints(transform, vertices, directions, pointsPerLine, this._viewportCoords);
+    };
+    BearingComponent.prototype._computeHorizontalFov = function (projectedPoints) {
+        var _this = this;
+        var fovs = projectedPoints
+            .map(function (projectedPoint) {
+            return _this._coordToFov(projectedPoint[0]);
+        });
+        var fov = Math.min.apply(Math, fovs);
+        return fov;
+    };
+    BearingComponent.prototype._coordToFov = function (x) {
+        return this._spatial.radToDeg(2 * Math.atan(x));
+    };
+    BearingComponent.prototype._interpolate = function (x1, x2, alpha) {
+        return (1 - alpha) * x1 + alpha * x2;
+    };
+    BearingComponent.componentName = "bearing";
+    return BearingComponent;
+}(Component_1.Component));
+exports.BearingComponent = BearingComponent;
+Component_1.ComponentService.register(BearingComponent);
+exports.default = BearingComponent;
 
-},{"./lib/Promise":206,"./lib/TimeoutError":208,"./lib/apply":209,"./lib/decorators/array":210,"./lib/decorators/flow":211,"./lib/decorators/fold":212,"./lib/decorators/inspect":213,"./lib/decorators/iterate":214,"./lib/decorators/progress":215,"./lib/decorators/timed":216,"./lib/decorators/unhandledRejection":217,"./lib/decorators/with":218}],224:[function(require,module,exports){
-var nativeIsArray = Array.isArray
-var toString = Object.prototype.toString
 
-module.exports = nativeIsArray || isArray
+},{"../Component":291,"../Geo":294,"../geo/ViewportCoords":421,"./utils/ComponentSize":404,"@mapbox/unitbezier":2,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],309:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CacheComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Edge_1 = require("../Edge");
+var Component_1 = require("../Component");
+var CacheComponent = /** @class */ (function (_super) {
+    __extends(CacheComponent, _super);
+    function CacheComponent(name, container, navigator) {
+        return _super.call(this, name, container, navigator) || this;
+    }
+    /**
+     * Set the cache depth.
+     *
+     * Configures the cache depth. The cache depth can be different for
+     * different edge direction types.
+     *
+     * @param {ICacheDepth} depth - Cache depth structure.
+     */
+    CacheComponent.prototype.setDepth = function (depth) {
+        this.configure({ depth: depth });
+    };
+    CacheComponent.prototype._activate = function () {
+        var _this = this;
+        this._sequenceSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
+            return node.sequenceEdges$;
+        }), operators_1.filter(function (status) {
+            return status.cached;
+        })), this._configuration$).pipe(operators_1.switchMap(function (nc) {
+            var status = nc[0];
+            var configuration = nc[1];
+            var sequenceDepth = Math.max(0, Math.min(4, configuration.depth.sequence));
+            var next$ = _this._cache$(status.edges, Edge_1.EdgeDirection.Next, sequenceDepth);
+            var prev$ = _this._cache$(status.edges, Edge_1.EdgeDirection.Prev, sequenceDepth);
+            return rxjs_1.merge(next$, prev$).pipe(operators_1.catchError(function (error, caught) {
+                console.error("Failed to cache sequence edges.", error);
+                return rxjs_1.empty();
+            }));
+        }))
+            .subscribe(function () { });
+        this._spatialSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
+            return rxjs_1.combineLatest(rxjs_1.of(node), node.spatialEdges$.pipe(operators_1.filter(function (status) {
+                return status.cached;
+            })));
+        })), this._configuration$).pipe(operators_1.switchMap(function (_a) {
+            var _b = _a[0], node = _b[0], edgeStatus = _b[1], configuration = _a[1];
+            var edges = edgeStatus.edges;
+            var depth = configuration.depth;
+            var panoDepth = Math.max(0, Math.min(2, depth.pano));
+            var stepDepth = node.pano ? 0 : Math.max(0, Math.min(3, depth.step));
+            var turnDepth = node.pano ? 0 : Math.max(0, Math.min(1, depth.turn));
+            var pano$ = _this._cache$(edges, Edge_1.EdgeDirection.Pano, panoDepth);
+            var forward$ = _this._cache$(edges, Edge_1.EdgeDirection.StepForward, stepDepth);
+            var backward$ = _this._cache$(edges, Edge_1.EdgeDirection.StepBackward, stepDepth);
+            var left$ = _this._cache$(edges, Edge_1.EdgeDirection.StepLeft, stepDepth);
+            var right$ = _this._cache$(edges, Edge_1.EdgeDirection.StepRight, stepDepth);
+            var turnLeft$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnLeft, turnDepth);
+            var turnRight$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnRight, turnDepth);
+            var turnU$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnU, turnDepth);
+            return rxjs_1.merge(forward$, backward$, left$, right$, pano$, turnLeft$, turnRight$, turnU$).pipe(operators_1.catchError(function (error, caught) {
+                console.error("Failed to cache spatial edges.", error);
+                return rxjs_1.empty();
+            }));
+        }))
+            .subscribe(function () { });
+    };
+    CacheComponent.prototype._deactivate = function () {
+        this._sequenceSubscription.unsubscribe();
+        this._spatialSubscription.unsubscribe();
+    };
+    CacheComponent.prototype._getDefaultConfiguration = function () {
+        return { depth: { pano: 1, sequence: 2, step: 1, turn: 0 } };
+    };
+    CacheComponent.prototype._cache$ = function (edges, direction, depth) {
+        var _this = this;
+        return rxjs_1.zip(rxjs_1.of(edges), rxjs_1.of(depth)).pipe(operators_1.expand(function (ed) {
+            var es = ed[0];
+            var d = ed[1];
+            var edgesDepths$ = [];
+            if (d > 0) {
+                for (var _i = 0, es_1 = es; _i < es_1.length; _i++) {
+                    var edge = es_1[_i];
+                    if (edge.data.direction === direction) {
+                        edgesDepths$.push(rxjs_1.zip(_this._navigator.graphService.cacheNode$(edge.to).pipe(operators_1.mergeMap(function (n) {
+                            return _this._nodeToEdges$(n, direction);
+                        })), rxjs_1.of(d - 1)));
+                    }
+                }
+            }
+            return rxjs_1.from(edgesDepths$).pipe(operators_1.mergeAll());
+        }), operators_1.skip(1));
+    };
+    CacheComponent.prototype._nodeToEdges$ = function (node, direction) {
+        return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
+            node.sequenceEdges$ :
+            node.spatialEdges$).pipe(operators_1.first(function (status) {
+            return status.cached;
+        }), operators_1.map(function (status) {
+            return status.edges;
+        }));
+    };
+    CacheComponent.componentName = "cache";
+    return CacheComponent;
+}(Component_1.Component));
+exports.CacheComponent = CacheComponent;
+Component_1.ComponentService.register(CacheComponent);
+exports.default = CacheComponent;
 
-function isArray(obj) {
-    return toString.call(obj) === "[object Array]"
-}
+},{"../Component":291,"../Edge":292,"rxjs":43,"rxjs/operators":241}],310:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Component = void 0;
+var operators_1 = require("rxjs/operators");
+var rxjs_1 = require("rxjs");
+var Utils_1 = require("../Utils");
+var Component = /** @class */ (function (_super) {
+    __extends(Component, _super);
+    function Component(name, container, navigator) {
+        var _this = _super.call(this) || this;
+        _this._activated$ = new rxjs_1.BehaviorSubject(false);
+        _this._configurationSubject$ = new rxjs_1.Subject();
+        _this._activated = false;
+        _this._container = container;
+        _this._name = name;
+        _this._navigator = navigator;
+        _this._configuration$ =
+            _this._configurationSubject$.pipe(operators_1.startWith(_this.defaultConfiguration), operators_1.scan(function (conf, newConf) {
+                for (var key in newConf) {
+                    if (newConf.hasOwnProperty(key)) {
+                        conf[key] = newConf[key];
+                    }
+                }
+                return conf;
+            }), operators_1.publishReplay(1), operators_1.refCount());
+        _this._configuration$.subscribe(function () { });
+        return _this;
+    }
+    Object.defineProperty(Component.prototype, "activated", {
+        get: function () {
+            return this._activated;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Component.prototype, "activated$", {
+        /** @ignore */
+        get: function () {
+            return this._activated$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Component.prototype, "defaultConfiguration", {
+        /**
+         * Get default configuration.
+         *
+         * @returns {TConfiguration} Default configuration for component.
+         */
+        get: function () {
+            return this._getDefaultConfiguration();
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Component.prototype, "configuration$", {
+        /** @ignore */
+        get: function () {
+            return this._configuration$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Component.prototype, "name", {
+        /**
+         * Get name.
+         *
+         * @description The name of the component. Used when interacting with the
+         * component through the Viewer's API.
+         */
+        get: function () {
+            return this._name;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Component.prototype.activate = function (conf) {
+        if (this._activated) {
+            return;
+        }
+        if (conf !== undefined) {
+            this._configurationSubject$.next(conf);
+        }
+        this._activated = true;
+        this._activate();
+        this._activated$.next(true);
+    };
+    Component.prototype.configure = function (conf) {
+        this._configurationSubject$.next(conf);
+    };
+    Component.prototype.deactivate = function () {
+        if (!this._activated) {
+            return;
+        }
+        this._activated = false;
+        this._deactivate();
+        this._container.domRenderer.clear(this._name);
+        this._container.glRenderer.clear(this._name);
+        this._activated$.next(false);
+    };
+    /**
+     * Detect the viewer's new width and height and resize the component's
+     * rendered elements accordingly if applicable.
+     *
+     * @ignore
+     */
+    Component.prototype.resize = function () { return; };
+    Component.componentName = "not_worthy";
+    return Component;
+}(Utils_1.EventEmitter));
+exports.Component = Component;
+exports.default = Component;
 
-},{}],225:[function(require,module,exports){
+},{"../Utils":301,"rxjs":43,"rxjs/operators":241}],311:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var APIv3_1 = require("./api/APIv3");
-exports.APIv3 = APIv3_1.APIv3;
-var ModelCreator_1 = require("./api/ModelCreator");
-exports.ModelCreator = ModelCreator_1.ModelCreator;
+exports.ComponentService = void 0;
+var Error_1 = require("../Error");
+var ComponentService = /** @class */ (function () {
+    function ComponentService(container, navigator) {
+        this._components = {};
+        for (var componentName in ComponentService.registeredComponents) {
+            if (!ComponentService.registeredComponents.hasOwnProperty(componentName)) {
+                continue;
+            }
+            var component = ComponentService.registeredComponents[componentName];
+            this._components[componentName] = {
+                active: false,
+                component: new component(componentName, container, navigator),
+            };
+        }
+        this._coverComponent = new ComponentService.registeredCoverComponent("cover", container, navigator);
+        this._coverComponent.activate();
+        this._coverActivated = true;
+    }
+    ComponentService.register = function (component) {
+        if (ComponentService.registeredComponents[component.componentName] === undefined) {
+            ComponentService.registeredComponents[component.componentName] = component;
+        }
+    };
+    ComponentService.registerCover = function (coverComponent) {
+        ComponentService.registeredCoverComponent = coverComponent;
+    };
+    Object.defineProperty(ComponentService.prototype, "coverActivated", {
+        get: function () {
+            return this._coverActivated;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    ComponentService.prototype.activateCover = function () {
+        if (this._coverActivated) {
+            return;
+        }
+        this._coverActivated = true;
+        for (var componentName in this._components) {
+            if (!this._components.hasOwnProperty(componentName)) {
+                continue;
+            }
+            var component = this._components[componentName];
+            if (component.active) {
+                component.component.deactivate();
+            }
+        }
+    };
+    ComponentService.prototype.deactivateCover = function () {
+        if (!this._coverActivated) {
+            return;
+        }
+        this._coverActivated = false;
+        for (var componentName in this._components) {
+            if (!this._components.hasOwnProperty(componentName)) {
+                continue;
+            }
+            var component = this._components[componentName];
+            if (component.active) {
+                component.component.activate();
+            }
+        }
+    };
+    ComponentService.prototype.activate = function (name) {
+        this._checkName(name);
+        this._components[name].active = true;
+        if (!this._coverActivated) {
+            this.get(name).activate();
+        }
+    };
+    ComponentService.prototype.configure = function (name, conf) {
+        this._checkName(name);
+        this.get(name).configure(conf);
+    };
+    ComponentService.prototype.deactivate = function (name) {
+        this._checkName(name);
+        this._components[name].active = false;
+        if (!this._coverActivated) {
+            this.get(name).deactivate();
+        }
+    };
+    ComponentService.prototype.get = function (name) {
+        return this._components[name].component;
+    };
+    ComponentService.prototype.getCover = function () {
+        return this._coverComponent;
+    };
+    ComponentService.prototype._checkName = function (name) {
+        if (!(name in this._components)) {
+            throw new Error_1.ArgumentMapillaryError("Component does not exist: " + name);
+        }
+    };
+    ComponentService.registeredComponents = {};
+    return ComponentService;
+}());
+exports.ComponentService = ComponentService;
+exports.default = ComponentService;
 
-},{"./api/APIv3":237,"./api/ModelCreator":238}],226:[function(require,module,exports){
+},{"../Error":293}],312:[function(require,module,exports){
 "use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
 Object.defineProperty(exports, "__esModule", { value: true });
-var Component_1 = require("./component/Component");
-exports.Component = Component_1.Component;
-var ComponentService_1 = require("./component/ComponentService");
-exports.ComponentService = ComponentService_1.ComponentService;
-var AttributionComponent_1 = require("./component/AttributionComponent");
-exports.AttributionComponent = AttributionComponent_1.AttributionComponent;
-var BackgroundComponent_1 = require("./component/BackgroundComponent");
-exports.BackgroundComponent = BackgroundComponent_1.BackgroundComponent;
-var BearingComponent_1 = require("./component/BearingComponent");
-exports.BearingComponent = BearingComponent_1.BearingComponent;
-var CacheComponent_1 = require("./component/CacheComponent");
-exports.CacheComponent = CacheComponent_1.CacheComponent;
-var CoverComponent_1 = require("./component/CoverComponent");
-exports.CoverComponent = CoverComponent_1.CoverComponent;
-var DebugComponent_1 = require("./component/DebugComponent");
-exports.DebugComponent = DebugComponent_1.DebugComponent;
-var DirectionComponent_1 = require("./component/direction/DirectionComponent");
-exports.DirectionComponent = DirectionComponent_1.DirectionComponent;
-var DirectionDOMCalculator_1 = require("./component/direction/DirectionDOMCalculator");
-exports.DirectionDOMCalculator = DirectionDOMCalculator_1.DirectionDOMCalculator;
-var DirectionDOMRenderer_1 = require("./component/direction/DirectionDOMRenderer");
-exports.DirectionDOMRenderer = DirectionDOMRenderer_1.DirectionDOMRenderer;
-var ImageComponent_1 = require("./component/ImageComponent");
-exports.ImageComponent = ImageComponent_1.ImageComponent;
-var KeyboardComponent_1 = require("./component/KeyboardComponent");
-exports.KeyboardComponent = KeyboardComponent_1.KeyboardComponent;
-var LoadingComponent_1 = require("./component/LoadingComponent");
-exports.LoadingComponent = LoadingComponent_1.LoadingComponent;
-var Marker_1 = require("./component/marker/marker/Marker");
-exports.Marker = Marker_1.Marker;
-var MarkerComponent_1 = require("./component/marker/MarkerComponent");
-exports.MarkerComponent = MarkerComponent_1.MarkerComponent;
-var MarkerScene_1 = require("./component/marker/MarkerScene");
-exports.MarkerScene = MarkerScene_1.MarkerScene;
-var MarkerSet_1 = require("./component/marker/MarkerSet");
-exports.MarkerSet = MarkerSet_1.MarkerSet;
-var MouseComponent_1 = require("./component/mouse/MouseComponent");
-exports.MouseComponent = MouseComponent_1.MouseComponent;
-var MouseHandlerBase_1 = require("./component/mouse/MouseHandlerBase");
-exports.MouseHandlerBase = MouseHandlerBase_1.MouseHandlerBase;
-var BounceHandler_1 = require("./component/mouse/BounceHandler");
-exports.BounceHandler = BounceHandler_1.BounceHandler;
-var DragPanHandler_1 = require("./component/mouse/DragPanHandler");
-exports.DragPanHandler = DragPanHandler_1.DragPanHandler;
-var DoubleClickZoomHandler_1 = require("./component/mouse/DoubleClickZoomHandler");
-exports.DoubleClickZoomHandler = DoubleClickZoomHandler_1.DoubleClickZoomHandler;
-var ScrollZoomHandler_1 = require("./component/mouse/ScrollZoomHandler");
-exports.ScrollZoomHandler = ScrollZoomHandler_1.ScrollZoomHandler;
-var TouchZoomHandler_1 = require("./component/mouse/TouchZoomHandler");
-exports.TouchZoomHandler = TouchZoomHandler_1.TouchZoomHandler;
-var Popup_1 = require("./component/popup/popup/Popup");
-exports.Popup = Popup_1.Popup;
-var PopupComponent_1 = require("./component/popup/PopupComponent");
-exports.PopupComponent = PopupComponent_1.PopupComponent;
-var NavigationComponent_1 = require("./component/NavigationComponent");
-exports.NavigationComponent = NavigationComponent_1.NavigationComponent;
-var RouteComponent_1 = require("./component/RouteComponent");
-exports.RouteComponent = RouteComponent_1.RouteComponent;
-var SequenceComponent_1 = require("./component/sequence/SequenceComponent");
-exports.SequenceComponent = SequenceComponent_1.SequenceComponent;
-var SequenceDOMRenderer_1 = require("./component/sequence/SequenceDOMRenderer");
-exports.SequenceDOMRenderer = SequenceDOMRenderer_1.SequenceDOMRenderer;
-var SequenceDOMInteraction_1 = require("./component/sequence/SequenceDOMInteraction");
-exports.SequenceDOMInteraction = SequenceDOMInteraction_1.SequenceDOMInteraction;
-var ImagePlaneComponent_1 = require("./component/imageplane/ImagePlaneComponent");
-exports.ImagePlaneComponent = ImagePlaneComponent_1.ImagePlaneComponent;
-var ImagePlaneFactory_1 = require("./component/imageplane/ImagePlaneFactory");
-exports.ImagePlaneFactory = ImagePlaneFactory_1.ImagePlaneFactory;
-var ImagePlaneGLRenderer_1 = require("./component/imageplane/ImagePlaneGLRenderer");
-exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer_1.ImagePlaneGLRenderer;
-var ImagePlaneScene_1 = require("./component/imageplane/ImagePlaneScene");
-exports.ImagePlaneScene = ImagePlaneScene_1.ImagePlaneScene;
-var ImagePlaneShaders_1 = require("./component/imageplane/ImagePlaneShaders");
-exports.ImagePlaneShaders = ImagePlaneShaders_1.ImagePlaneShaders;
-var SimpleMarker_1 = require("./component/marker/marker/SimpleMarker");
-exports.SimpleMarker = SimpleMarker_1.SimpleMarker;
-var CircleMarker_1 = require("./component/marker/marker/CircleMarker");
-exports.CircleMarker = CircleMarker_1.CircleMarker;
-var SliderComponent_1 = require("./component/imageplane/SliderComponent");
-exports.SliderComponent = SliderComponent_1.SliderComponent;
-var StatsComponent_1 = require("./component/StatsComponent");
-exports.StatsComponent = StatsComponent_1.StatsComponent;
-var Tag_1 = require("./component/tag/tag/Tag");
-exports.Tag = Tag_1.Tag;
-var OutlineTag_1 = require("./component/tag/tag/OutlineTag");
-exports.OutlineTag = OutlineTag_1.OutlineTag;
-var RenderTag_1 = require("./component/tag/tag/RenderTag");
-exports.RenderTag = RenderTag_1.RenderTag;
-var OutlineRenderTag_1 = require("./component/tag/tag/OutlineRenderTag");
-exports.OutlineRenderTag = OutlineRenderTag_1.OutlineRenderTag;
-var OutlineCreateTag_1 = require("./component/tag/tag/OutlineCreateTag");
-exports.OutlineCreateTag = OutlineCreateTag_1.OutlineCreateTag;
-var SpotTag_1 = require("./component/tag/tag/SpotTag");
-exports.SpotTag = SpotTag_1.SpotTag;
-var SpotRenderTag_1 = require("./component/tag/tag/SpotRenderTag");
-exports.SpotRenderTag = SpotRenderTag_1.SpotRenderTag;
-var TagComponent_1 = require("./component/tag/TagComponent");
-exports.TagComponent = TagComponent_1.TagComponent;
-var TagCreator_1 = require("./component/tag/TagCreator");
-exports.TagCreator = TagCreator_1.TagCreator;
-var TagDOMRenderer_1 = require("./component/tag/TagDOMRenderer");
-exports.TagDOMRenderer = TagDOMRenderer_1.TagDOMRenderer;
-var TagMode_1 = require("./component/tag/TagMode");
-exports.TagMode = TagMode_1.TagMode;
-var TagOperation_1 = require("./component/tag/TagOperation");
-exports.TagOperation = TagOperation_1.TagOperation;
-var TagScene_1 = require("./component/tag/TagScene");
-exports.TagScene = TagScene_1.TagScene;
-var TagSet_1 = require("./component/tag/TagSet");
-exports.TagSet = TagSet_1.TagSet;
-var Geometry_1 = require("./component/tag/geometry/Geometry");
-exports.Geometry = Geometry_1.Geometry;
-var VertexGeometry_1 = require("./component/tag/geometry/VertexGeometry");
-exports.VertexGeometry = VertexGeometry_1.VertexGeometry;
-var RectGeometry_1 = require("./component/tag/geometry/RectGeometry");
-exports.RectGeometry = RectGeometry_1.RectGeometry;
-var PointGeometry_1 = require("./component/tag/geometry/PointGeometry");
-exports.PointGeometry = PointGeometry_1.PointGeometry;
-var PolygonGeometry_1 = require("./component/tag/geometry/PolygonGeometry");
-exports.PolygonGeometry = PolygonGeometry_1.PolygonGeometry;
-var GeometryTagError_1 = require("./component/tag/error/GeometryTagError");
-exports.GeometryTagError = GeometryTagError_1.GeometryTagError;
+exports.CoverComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../Component");
+var Utils_1 = require("../Utils");
+var Viewer_1 = require("../Viewer");
+var CoverComponent = /** @class */ (function (_super) {
+    __extends(CoverComponent, _super);
+    function CoverComponent(name, container, navigator) {
+        return _super.call(this, name, container, navigator) || this;
+    }
+    CoverComponent.prototype._activate = function () {
+        var _this = this;
+        this._configuration$.pipe(operators_1.distinctUntilChanged(undefined, function (configuration) {
+            return configuration.state;
+        }), operators_1.switchMap(function (configuration) {
+            return rxjs_1.combineLatest(rxjs_1.of(configuration.state), _this._navigator.stateService.currentNode$);
+        }), operators_1.switchMap(function (_a) {
+            var state = _a[0], node = _a[1];
+            var keySrc$ = rxjs_1.combineLatest(rxjs_1.of(node.key), node.image$.pipe(operators_1.filter(function (image) {
+                return !!image;
+            }), operators_1.map(function (image) {
+                return image.src;
+            })));
+            return state === Component_1.CoverState.Visible ? keySrc$.pipe(operators_1.first()) : keySrc$;
+        }), operators_1.distinctUntilChanged(function (_a, _b) {
+            var k1 = _a[0], s1 = _a[1];
+            var k2 = _b[0], s2 = _b[1];
+            return k1 === k2 && s1 === s2;
+        }), operators_1.map(function (_a) {
+            var key = _a[0], src = _a[1];
+            return { key: key, src: src };
+        }))
+            .subscribe(this._configurationSubject$);
+        this._renderSubscription = rxjs_1.combineLatest(this._configuration$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
+            var configuration = _a[0], size = _a[1];
+            if (!configuration.key) {
+                return { name: _this._name, vnode: vd.h("div", []) };
+            }
+            var compactClass = size.width <= 640 || size.height <= 480 ? ".CoverCompact" : "";
+            if (configuration.state === Component_1.CoverState.Hidden) {
+                var doneContainer = vd.h("div.CoverContainer.CoverDone" + compactClass, [_this._getCoverBackgroundVNode(configuration)]);
+                return { name: _this._name, vnode: doneContainer };
+            }
+            var container = vd.h("div.CoverContainer" + compactClass, [_this._getCoverButtonVNode(configuration)]);
+            return { name: _this._name, vnode: container };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+    };
+    CoverComponent.prototype._deactivate = function () {
+        this._renderSubscription.unsubscribe();
+        this._keySubscription.unsubscribe();
+    };
+    CoverComponent.prototype._getDefaultConfiguration = function () {
+        return { state: Component_1.CoverState.Visible };
+    };
+    CoverComponent.prototype._getCoverButtonVNode = function (configuration) {
+        var _this = this;
+        var cover = configuration.state === Component_1.CoverState.Loading ? "div.Cover.CoverLoading" : "div.Cover";
+        var coverButton = vd.h("div.CoverButton", [vd.h("div.CoverButtonIcon", [])]);
+        var coverLogo = vd.h("a.CoverLogo", { href: Utils_1.Urls.explore, target: "_blank" }, []);
+        var coverIndicator = vd.h("div.CoverIndicator", { onclick: function () { _this.configure({ state: Component_1.CoverState.Loading }); } }, []);
+        return vd.h(cover, [
+            this._getCoverBackgroundVNode(configuration),
+            coverIndicator,
+            coverButton,
+            coverLogo,
+        ]);
+    };
+    CoverComponent.prototype._getCoverBackgroundVNode = function (conf) {
+        var url = conf.src != null ?
+            conf.src : Utils_1.Urls.thumbnail(conf.key, Viewer_1.ImageSize.Size640);
+        var properties = { style: { backgroundImage: "url(" + url + ")" } };
+        var children = [];
+        if (conf.state === Component_1.CoverState.Loading) {
+            children.push(vd.h("div.Spinner", {}, []));
+        }
+        return vd.h("div.CoverBackground", properties, children);
+    };
+    CoverComponent.componentName = "cover";
+    return CoverComponent;
+}(Component_1.Component));
+exports.CoverComponent = CoverComponent;
+Component_1.ComponentService.registerCover(CoverComponent);
+exports.default = CoverComponent;
 
-},{"./component/AttributionComponent":239,"./component/BackgroundComponent":240,"./component/BearingComponent":241,"./component/CacheComponent":242,"./component/Component":243,"./component/ComponentService":244,"./component/CoverComponent":245,"./component/DebugComponent":246,"./component/ImageComponent":247,"./component/KeyboardComponent":248,"./component/LoadingComponent":249,"./component/NavigationComponent":250,"./component/RouteComponent":251,"./component/StatsComponent":252,"./component/direction/DirectionComponent":253,"./component/direction/DirectionDOMCalculator":254,"./component/direction/DirectionDOMRenderer":255,"./component/imageplane/ImagePlaneComponent":256,"./component/imageplane/ImagePlaneFactory":257,"./component/imageplane/ImagePlaneGLRenderer":258,"./component/imageplane/ImagePlaneScene":259,"./component/imageplane/ImagePlaneShaders":260,"./component/imageplane/SliderComponent":261,"./component/marker/MarkerComponent":263,"./component/marker/MarkerScene":264,"./component/marker/MarkerSet":265,"./component/marker/marker/CircleMarker":266,"./component/marker/marker/Marker":267,"./component/marker/marker/SimpleMarker":268,"./component/mouse/BounceHandler":269,"./component/mouse/DoubleClickZoomHandler":270,"./component/mouse/DragPanHandler":271,"./component/mouse/MouseComponent":272,"./component/mouse/MouseHandlerBase":273,"./component/mouse/ScrollZoomHandler":274,"./component/mouse/TouchZoomHandler":275,"./component/popup/PopupComponent":277,"./component/popup/popup/Popup":278,"./component/sequence/SequenceComponent":279,"./component/sequence/SequenceDOMInteraction":280,"./component/sequence/SequenceDOMRenderer":281,"./component/tag/TagComponent":283,"./component/tag/TagCreator":284,"./component/tag/TagDOMRenderer":285,"./component/tag/TagMode":286,"./component/tag/TagOperation":287,"./component/tag/TagScene":288,"./component/tag/TagSet":289,"./component/tag/error/GeometryTagError":290,"./component/tag/geometry/Geometry":291,"./component/tag/geometry/PointGeometry":292,"./component/tag/geometry/PolygonGeometry":293,"./component/tag/geometry/RectGeometry":294,"./component/tag/geometry/VertexGeometry":295,"./component/tag/tag/OutlineCreateTag":296,"./component/tag/tag/OutlineRenderTag":297,"./component/tag/tag/OutlineTag":298,"./component/tag/tag/RenderTag":299,"./component/tag/tag/SpotRenderTag":300,"./component/tag/tag/SpotTag":301,"./component/tag/tag/Tag":302}],227:[function(require,module,exports){
+},{"../Component":291,"../Utils":301,"../Viewer":302,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],313:[function(require,module,exports){
 "use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
 Object.defineProperty(exports, "__esModule", { value: true });
-var EdgeDirection_1 = require("./graph/edge/EdgeDirection");
-exports.EdgeDirection = EdgeDirection_1.EdgeDirection;
-var EdgeCalculatorSettings_1 = require("./graph/edge/EdgeCalculatorSettings");
-exports.EdgeCalculatorSettings = EdgeCalculatorSettings_1.EdgeCalculatorSettings;
-var EdgeCalculatorDirections_1 = require("./graph/edge/EdgeCalculatorDirections");
-exports.EdgeCalculatorDirections = EdgeCalculatorDirections_1.EdgeCalculatorDirections;
-var EdgeCalculatorCoefficients_1 = require("./graph/edge/EdgeCalculatorCoefficients");
-exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients_1.EdgeCalculatorCoefficients;
-var EdgeCalculator_1 = require("./graph/edge/EdgeCalculator");
-exports.EdgeCalculator = EdgeCalculator_1.EdgeCalculator;
+exports.DebugComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../Component");
+var DebugComponent = /** @class */ (function (_super) {
+    __extends(DebugComponent, _super);
+    function DebugComponent() {
+        var _this = _super !== null && _super.apply(this, arguments) || this;
+        _this._open$ = new rxjs_1.BehaviorSubject(false);
+        return _this;
+    }
+    DebugComponent.prototype._activate = function () {
+        var _this = this;
+        this._disposable = rxjs_1.combineLatest(this._navigator.stateService.currentState$, this._open$, this._navigator.imageLoadingService.loadstatus$).pipe(operators_1.map(function (_a) {
+            var frame = _a[0], open = _a[1], loadStatus = _a[2];
+            return { name: _this._name, vnode: _this._getDebugVNode(open, _this._getDebugInfo(frame, loadStatus)) };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+    };
+    DebugComponent.prototype._deactivate = function () {
+        this._disposable.unsubscribe();
+    };
+    DebugComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    DebugComponent.prototype._getDebugInfo = function (frame, loadStatus) {
+        var ret = [];
+        ret.push(vd.h("h2", "Node"));
+        if (frame.state.currentNode) {
+            ret.push(vd.h("p", "currentNode: " + frame.state.currentNode.key));
+        }
+        if (frame.state.previousNode) {
+            ret.push(vd.h("p", "previousNode: " + frame.state.previousNode.key));
+        }
+        ret.push(vd.h("h2", "Loading"));
+        var total = 0;
+        var loaded = 0;
+        var loading = 0;
+        for (var key in loadStatus) {
+            if (!loadStatus.hasOwnProperty(key)) {
+                continue;
+            }
+            var status_1 = loadStatus[key];
+            total += status_1.loaded;
+            if (status_1.loaded !== status_1.total) {
+                loading++;
+            }
+            else {
+                loaded++;
+            }
+        }
+        ret.push(vd.h("p", "Loaded Images: " + loaded));
+        ret.push(vd.h("p", "Loading Images: " + loading));
+        ret.push(vd.h("p", "Total bytes loaded: " + total));
+        ret.push(vd.h("h2", "Camera"));
+        ret.push(vd.h("p", "camera.position.x: " + frame.state.camera.position.x));
+        ret.push(vd.h("p", "camera.position.y: " + frame.state.camera.position.y));
+        ret.push(vd.h("p", "camera.position.z: " + frame.state.camera.position.z));
+        ret.push(vd.h("p", "camera.lookat.x: " + frame.state.camera.lookat.x));
+        ret.push(vd.h("p", "camera.lookat.y: " + frame.state.camera.lookat.y));
+        ret.push(vd.h("p", "camera.lookat.z: " + frame.state.camera.lookat.z));
+        ret.push(vd.h("p", "camera.up.x: " + frame.state.camera.up.x));
+        ret.push(vd.h("p", "camera.up.y: " + frame.state.camera.up.y));
+        ret.push(vd.h("p", "camera.up.z: " + frame.state.camera.up.z));
+        return ret;
+    };
+    DebugComponent.prototype._getDebugVNode = function (open, info) {
+        if (open) {
+            return vd.h("div.Debug", {}, [
+                vd.h("h2", {}, ["Debug"]),
+                this._getDebugVNodeButton(open),
+                vd.h("pre", {}, info),
+            ]);
+        }
+        else {
+            return this._getDebugVNodeButton(open);
+        }
+    };
+    DebugComponent.prototype._getDebugVNodeButton = function (open) {
+        var buttonText = open ? "Disable Debug" : "D";
+        var buttonCssClass = open ? "" : ".DebugButtonFixed";
+        if (open) {
+            return vd.h("button.DebugButton" + buttonCssClass, { onclick: this._closeDebugElement.bind(this) }, [buttonText]);
+        }
+        else {
+            return vd.h("button.DebugButton" + buttonCssClass, { onclick: this._openDebugElement.bind(this) }, [buttonText]);
+        }
+    };
+    DebugComponent.prototype._closeDebugElement = function (open) {
+        this._open$.next(false);
+    };
+    DebugComponent.prototype._openDebugElement = function () {
+        this._open$.next(true);
+    };
+    DebugComponent.componentName = "debug";
+    return DebugComponent;
+}(Component_1.Component));
+exports.DebugComponent = DebugComponent;
+Component_1.ComponentService.register(DebugComponent);
+exports.default = DebugComponent;
 
-},{"./graph/edge/EdgeCalculator":320,"./graph/edge/EdgeCalculatorCoefficients":321,"./graph/edge/EdgeCalculatorDirections":322,"./graph/edge/EdgeCalculatorSettings":323,"./graph/edge/EdgeDirection":324}],228:[function(require,module,exports){
+},{"../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],314:[function(require,module,exports){
 "use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
 Object.defineProperty(exports, "__esModule", { value: true });
-var ArgumentMapillaryError_1 = require("./error/ArgumentMapillaryError");
-exports.ArgumentMapillaryError = ArgumentMapillaryError_1.ArgumentMapillaryError;
-var GraphMapillaryError_1 = require("./error/GraphMapillaryError");
-exports.GraphMapillaryError = GraphMapillaryError_1.GraphMapillaryError;
-var MapillaryError_1 = require("./error/MapillaryError");
-exports.MapillaryError = MapillaryError_1.MapillaryError;
+exports.ImageComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../Component");
+var Utils_1 = require("../Utils");
+var ImageComponent = /** @class */ (function (_super) {
+    __extends(ImageComponent, _super);
+    function ImageComponent(name, container, navigator, dom) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._canvasId = container.id + "-" + _this._name;
+        _this._dom = !!dom ? dom : new Utils_1.DOM();
+        return _this;
+    }
+    ImageComponent.prototype._activate = function () {
+        var _this = this;
+        var canvasSize$ = this._container.domRenderer.element$.pipe(operators_1.map(function (element) {
+            return _this._dom.document.getElementById(_this._canvasId);
+        }), operators_1.filter(function (canvas) {
+            return !!canvas;
+        }), operators_1.map(function (canvas) {
+            var adaptableDomRenderer = canvas.parentElement;
+            var width = adaptableDomRenderer.offsetWidth;
+            var height = adaptableDomRenderer.offsetHeight;
+            return [canvas, { height: height, width: width }];
+        }), operators_1.distinctUntilChanged(function (s1, s2) {
+            return s1.height === s2.height && s1.width === s2.width;
+        }, function (_a) {
+            var canvas = _a[0], size = _a[1];
+            return size;
+        }));
+        this.drawSubscription = rxjs_1.combineLatest(canvasSize$, this._navigator.stateService.currentNode$)
+            .subscribe(function (_a) {
+            var _b = _a[0], canvas = _b[0], size = _b[1], node = _a[1];
+            canvas.width = size.width;
+            canvas.height = size.height;
+            canvas
+                .getContext("2d")
+                .drawImage(node.image, 0, 0, size.width, size.height);
+        });
+        this._container.domRenderer.renderAdaptive$.next({ name: this._name, vnode: vd.h("canvas#" + this._canvasId, []) });
+    };
+    ImageComponent.prototype._deactivate = function () {
+        this.drawSubscription.unsubscribe();
+    };
+    ImageComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    ImageComponent.componentName = "image";
+    return ImageComponent;
+}(Component_1.Component));
+exports.ImageComponent = ImageComponent;
+Component_1.ComponentService.register(ImageComponent);
+exports.default = ImageComponent;
 
-},{"./error/ArgumentMapillaryError":303,"./error/GraphMapillaryError":304,"./error/MapillaryError":305}],229:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Camera_1 = require("./geo/Camera");
-exports.Camera = Camera_1.Camera;
-var GeoCoords_1 = require("./geo/GeoCoords");
-exports.GeoCoords = GeoCoords_1.GeoCoords;
-var ViewportCoords_1 = require("./geo/ViewportCoords");
-exports.ViewportCoords = ViewportCoords_1.ViewportCoords;
-var Spatial_1 = require("./geo/Spatial");
-exports.Spatial = Spatial_1.Spatial;
-var Transform_1 = require("./geo/Transform");
-exports.Transform = Transform_1.Transform;
 
-},{"./geo/Camera":306,"./geo/GeoCoords":307,"./geo/Spatial":308,"./geo/Transform":309,"./geo/ViewportCoords":310}],230:[function(require,module,exports){
+},{"../Component":291,"../Utils":301,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],315:[function(require,module,exports){
 "use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
 Object.defineProperty(exports, "__esModule", { value: true });
-var FilterCreator_1 = require("./graph/FilterCreator");
-exports.FilterCreator = FilterCreator_1.FilterCreator;
-var Graph_1 = require("./graph/Graph");
-exports.Graph = Graph_1.Graph;
-var GraphCalculator_1 = require("./graph/GraphCalculator");
-exports.GraphCalculator = GraphCalculator_1.GraphCalculator;
-var GraphService_1 = require("./graph/GraphService");
-exports.GraphService = GraphService_1.GraphService;
-var ImageLoadingService_1 = require("./graph/ImageLoadingService");
-exports.ImageLoadingService = ImageLoadingService_1.ImageLoadingService;
-var MeshReader_1 = require("./graph/MeshReader");
-exports.MeshReader = MeshReader_1.MeshReader;
-var Node_1 = require("./graph/Node");
-exports.Node = Node_1.Node;
-var NodeCache_1 = require("./graph/NodeCache");
-exports.NodeCache = NodeCache_1.NodeCache;
-var Sequence_1 = require("./graph/Sequence");
-exports.Sequence = Sequence_1.Sequence;
+exports.LoadingComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../Component");
+var LoadingComponent = /** @class */ (function (_super) {
+    __extends(LoadingComponent, _super);
+    function LoadingComponent(name, container, navigator) {
+        return _super.call(this, name, container, navigator) || this;
+    }
+    LoadingComponent.prototype._activate = function () {
+        var _this = this;
+        this._loadingSubscription = this._navigator.loadingService.loading$.pipe(operators_1.switchMap(function (loading) {
+            return loading ?
+                _this._navigator.imageLoadingService.loadstatus$ :
+                rxjs_1.of({});
+        }), operators_1.map(function (loadStatus) {
+            var total = 0;
+            var loaded = 0;
+            for (var key in loadStatus) {
+                if (!loadStatus.hasOwnProperty(key)) {
+                    continue;
+                }
+                var status_1 = loadStatus[key];
+                if (status_1.loaded !== status_1.total) {
+                    loaded += status_1.loaded;
+                    total += status_1.total;
+                }
+            }
+            var percentage = 100;
+            if (total !== 0) {
+                percentage = (loaded / total) * 100;
+            }
+            return { name: _this._name, vnode: _this._getBarVNode(percentage) };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+    };
+    LoadingComponent.prototype._deactivate = function () {
+        this._loadingSubscription.unsubscribe();
+    };
+    LoadingComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    LoadingComponent.prototype._getBarVNode = function (percentage) {
+        var loadingBarStyle = {};
+        var loadingContainerStyle = {};
+        if (percentage !== 100) {
+            loadingBarStyle.width = percentage.toFixed(0) + "%";
+            loadingBarStyle.opacity = "1";
+        }
+        else {
+            loadingBarStyle.width = "100%";
+            loadingBarStyle.opacity = "0";
+        }
+        return vd.h("div.Loading", { style: loadingContainerStyle }, [vd.h("div.LoadingBar", { style: loadingBarStyle }, [])]);
+    };
+    LoadingComponent.componentName = "loading";
+    return LoadingComponent;
+}(Component_1.Component));
+exports.LoadingComponent = LoadingComponent;
+Component_1.ComponentService.register(LoadingComponent);
+exports.default = LoadingComponent;
 
-},{"./graph/FilterCreator":311,"./graph/Graph":312,"./graph/GraphCalculator":313,"./graph/GraphService":314,"./graph/ImageLoadingService":315,"./graph/MeshReader":316,"./graph/Node":317,"./graph/NodeCache":318,"./graph/Sequence":319}],231:[function(require,module,exports){
+},{"../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],316:[function(require,module,exports){
 "use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.NavigationComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Edge_1 = require("../Edge");
+var Error_1 = require("../Error");
+var Component_1 = require("../Component");
 /**
- * MapillaryJS is a WebGL JavaScript library for exploring street level imagery
- * @name Mapillary
+ * @class NavigationComponent
+ *
+ * @classdesc Fallback navigation component for environments without WebGL support.
+ *
+ * Replaces the functionality in the Direction and Sequence components.
  */
-Object.defineProperty(exports, "__esModule", { value: true });
-var Edge_1 = require("./Edge");
-exports.EdgeDirection = Edge_1.EdgeDirection;
-var Render_1 = require("./Render");
-exports.RenderMode = Render_1.RenderMode;
-var Viewer_1 = require("./Viewer");
-exports.Alignment = Viewer_1.Alignment;
-exports.ImageSize = Viewer_1.ImageSize;
-exports.Viewer = Viewer_1.Viewer;
-var TagComponent = require("./component/tag/Tag");
-exports.TagComponent = TagComponent;
-var MarkerComponent = require("./component/marker/Marker");
-exports.MarkerComponent = MarkerComponent;
-var PopupComponent = require("./component/popup/Popup");
-exports.PopupComponent = PopupComponent;
-
-},{"./Edge":227,"./Render":232,"./Viewer":236,"./component/marker/Marker":262,"./component/popup/Popup":276,"./component/tag/Tag":282}],232:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var DOMRenderer_1 = require("./render/DOMRenderer");
-exports.DOMRenderer = DOMRenderer_1.DOMRenderer;
-var GLRenderer_1 = require("./render/GLRenderer");
-exports.GLRenderer = GLRenderer_1.GLRenderer;
-var GLRenderStage_1 = require("./render/GLRenderStage");
-exports.GLRenderStage = GLRenderStage_1.GLRenderStage;
-var RenderCamera_1 = require("./render/RenderCamera");
-exports.RenderCamera = RenderCamera_1.RenderCamera;
-var RenderMode_1 = require("./render/RenderMode");
-exports.RenderMode = RenderMode_1.RenderMode;
-var RenderService_1 = require("./render/RenderService");
-exports.RenderService = RenderService_1.RenderService;
-
-},{"./render/DOMRenderer":325,"./render/GLRenderStage":326,"./render/GLRenderer":327,"./render/RenderCamera":328,"./render/RenderMode":329,"./render/RenderService":330}],233:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var State_1 = require("./state/State");
-exports.State = State_1.State;
-var StateBase_1 = require("./state/states/StateBase");
-exports.StateBase = StateBase_1.StateBase;
-var StateContext_1 = require("./state/StateContext");
-exports.StateContext = StateContext_1.StateContext;
-var StateService_1 = require("./state/StateService");
-exports.StateService = StateService_1.StateService;
-var TraversingState_1 = require("./state/states/TraversingState");
-exports.TraversingState = TraversingState_1.TraversingState;
-var WaitingState_1 = require("./state/states/WaitingState");
-exports.WaitingState = WaitingState_1.WaitingState;
-
-},{"./state/State":331,"./state/StateContext":332,"./state/StateService":333,"./state/states/StateBase":334,"./state/states/TraversingState":335,"./state/states/WaitingState":336}],234:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ImageTileLoader_1 = require("./tiles/ImageTileLoader");
-exports.ImageTileLoader = ImageTileLoader_1.ImageTileLoader;
-var ImageTileStore_1 = require("./tiles/ImageTileStore");
-exports.ImageTileStore = ImageTileStore_1.ImageTileStore;
-var TextureProvider_1 = require("./tiles/TextureProvider");
-exports.TextureProvider = TextureProvider_1.TextureProvider;
-var RegionOfInterestCalculator_1 = require("./tiles/RegionOfInterestCalculator");
-exports.RegionOfInterestCalculator = RegionOfInterestCalculator_1.RegionOfInterestCalculator;
+var NavigationComponent = /** @class */ (function (_super) {
+    __extends(NavigationComponent, _super);
+    /** @ignore */
+    function NavigationComponent(name, container, navigator) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._seqNames = {};
+        _this._seqNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.Prev]] = "Prev";
+        _this._seqNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.Next]] = "Next";
+        _this._spaTopNames = {};
+        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.TurnLeft]] = "Turnleft";
+        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepLeft]] = "Left";
+        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepForward]] = "Forward";
+        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepRight]] = "Right";
+        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.TurnRight]] = "Turnright";
+        _this._spaBottomNames = {};
+        _this._spaBottomNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.TurnU]] = "Turnaround";
+        _this._spaBottomNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepBackward]] = "Backward";
+        return _this;
+    }
+    NavigationComponent.prototype._activate = function () {
+        var _this = this;
+        this._renderSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$, this._configuration$).pipe(operators_1.switchMap(function (_a) {
+            var node = _a[0], configuration = _a[1];
+            var sequenceEdges$ = configuration.sequence ?
+                node.sequenceEdges$.pipe(operators_1.map(function (status) {
+                    return status.edges
+                        .map(function (edge) {
+                        return edge.data.direction;
+                    });
+                })) :
+                rxjs_1.of([]);
+            var spatialEdges$ = !node.pano && configuration.spatial ?
+                node.spatialEdges$.pipe(operators_1.map(function (status) {
+                    return status.edges
+                        .map(function (edge) {
+                        return edge.data.direction;
+                    });
+                })) :
+                rxjs_1.of([]);
+            return rxjs_1.combineLatest(sequenceEdges$, spatialEdges$).pipe(operators_1.map(function (_a) {
+                var seq = _a[0], spa = _a[1];
+                return seq.concat(spa);
+            }));
+        }), operators_1.map(function (edgeDirections) {
+            var seqs = _this._createArrowRow(_this._seqNames, edgeDirections);
+            var spaTops = _this._createArrowRow(_this._spaTopNames, edgeDirections);
+            var spaBottoms = _this._createArrowRow(_this._spaBottomNames, edgeDirections);
+            var seqContainer = vd.h("div.NavigationSequence", seqs);
+            var spaTopContainer = vd.h("div.NavigationSpatialTop", spaTops);
+            var spaBottomContainer = vd.h("div.NavigationSpatialBottom", spaBottoms);
+            var spaContainer = vd.h("div.NavigationSpatial", [spaTopContainer, spaBottomContainer]);
+            return { name: _this._name, vnode: vd.h("div.NavigationContainer", [seqContainer, spaContainer]) };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+    };
+    NavigationComponent.prototype._deactivate = function () {
+        this._renderSubscription.unsubscribe();
+    };
+    NavigationComponent.prototype._getDefaultConfiguration = function () {
+        return { sequence: true, spatial: true };
+    };
+    NavigationComponent.prototype._createArrowRow = function (arrowNames, edgeDirections) {
+        var arrows = [];
+        for (var arrowName in arrowNames) {
+            if (!(arrowNames.hasOwnProperty(arrowName))) {
+                continue;
+            }
+            var direction = Edge_1.EdgeDirection[arrowName];
+            if (edgeDirections.indexOf(direction) !== -1) {
+                arrows.push(this._createVNode(direction, arrowNames[arrowName], "visible"));
+            }
+            else {
+                arrows.push(this._createVNode(direction, arrowNames[arrowName], "hidden"));
+            }
+        }
+        return arrows;
+    };
+    NavigationComponent.prototype._createVNode = function (direction, name, visibility) {
+        var _this = this;
+        return vd.h("span.Direction.Direction" + name, {
+            onclick: function (ev) {
+                _this._navigator.moveDir$(direction)
+                    .subscribe(undefined, function (error) {
+                    if (!(error instanceof Error_1.AbortMapillaryError)) {
+                        console.error(error);
+                    }
+                });
+            },
+            style: {
+                visibility: visibility,
+            },
+        }, []);
+    };
+    NavigationComponent.componentName = "navigation";
+    return NavigationComponent;
+}(Component_1.Component));
+exports.NavigationComponent = NavigationComponent;
+Component_1.ComponentService.register(NavigationComponent);
+exports.default = NavigationComponent;
 
-},{"./tiles/ImageTileLoader":337,"./tiles/ImageTileStore":338,"./tiles/RegionOfInterestCalculator":339,"./tiles/TextureProvider":340}],235:[function(require,module,exports){
+},{"../Component":291,"../Edge":292,"../Error":293,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],317:[function(require,module,exports){
 "use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
 Object.defineProperty(exports, "__esModule", { value: true });
-var EventEmitter_1 = require("./utils/EventEmitter");
-exports.EventEmitter = EventEmitter_1.EventEmitter;
-var Settings_1 = require("./utils/Settings");
-exports.Settings = Settings_1.Settings;
-var Urls_1 = require("./utils/Urls");
-exports.Urls = Urls_1.Urls;
+exports.RouteComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../Component");
+var DescriptionState = /** @class */ (function () {
+    function DescriptionState() {
+    }
+    return DescriptionState;
+}());
+var RouteState = /** @class */ (function () {
+    function RouteState() {
+    }
+    return RouteState;
+}());
+var RouteTrack = /** @class */ (function () {
+    function RouteTrack() {
+        this.nodeInstructions = [];
+        this.nodeInstructionsOrdered = [];
+    }
+    return RouteTrack;
+}());
+var RouteComponent = /** @class */ (function (_super) {
+    __extends(RouteComponent, _super);
+    function RouteComponent(name, container, navigator) {
+        return _super.call(this, name, container, navigator) || this;
+    }
+    RouteComponent.prototype.play = function () {
+        this.configure({ playing: true });
+    };
+    RouteComponent.prototype.stop = function () {
+        this.configure({ playing: false });
+    };
+    RouteComponent.prototype._activate = function () {
+        var _this = this;
+        var slowedStream$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
+            return (frame.id % 2) === 0;
+        }), operators_1.filter(function (frame) {
+            return frame.state.nodesAhead < 15;
+        }), operators_1.distinctUntilChanged(undefined, function (frame) {
+            return frame.state.lastNode.key;
+        }));
+        var routeTrack$ = rxjs_1.combineLatest(this.configuration$.pipe(operators_1.mergeMap(function (conf) {
+            return rxjs_1.from(conf.paths);
+        }), operators_1.distinct(function (p) {
+            return p.sequenceKey;
+        }), operators_1.mergeMap(function (path) {
+            return _this._navigator.apiV3.sequenceByKey$([path.sequenceKey]).pipe(operators_1.map(function (sequenceByKey) {
+                return sequenceByKey[path.sequenceKey];
+            }));
+        })), this.configuration$).pipe(operators_1.map(function (_a) {
+            var sequence = _a[0], conf = _a[1];
+            var i = 0;
+            var instructionPlaces = [];
+            for (var _i = 0, _b = conf.paths; _i < _b.length; _i++) {
+                var path = _b[_i];
+                if (path.sequenceKey === sequence.key) {
+                    var nodeInstructions = [];
+                    var saveKey = false;
+                    for (var _c = 0, _d = sequence.keys; _c < _d.length; _c++) {
+                        var key = _d[_c];
+                        if (path.startKey === key) {
+                            saveKey = true;
+                        }
+                        if (saveKey) {
+                            var description = null;
+                            for (var _e = 0, _f = path.infoKeys; _e < _f.length; _e++) {
+                                var infoKey = _f[_e];
+                                if (infoKey.key === key) {
+                                    description = infoKey.description;
+                                }
+                            }
+                            nodeInstructions.push({ description: description, key: key });
+                        }
+                        if (path.stopKey === key) {
+                            saveKey = false;
+                        }
+                    }
+                    instructionPlaces.push({ nodeInstructions: nodeInstructions, place: i });
+                }
+                i++;
+            }
+            return instructionPlaces;
+        }), operators_1.scan(function (routeTrack, instructionPlaces) {
+            for (var _i = 0, instructionPlaces_1 = instructionPlaces; _i < instructionPlaces_1.length; _i++) {
+                var instructionPlace = instructionPlaces_1[_i];
+                routeTrack.nodeInstructionsOrdered[instructionPlace.place] = instructionPlace.nodeInstructions;
+            }
+            for (var place in routeTrack.nodeInstructionsOrdered) {
+                if (!routeTrack.nodeInstructionsOrdered.hasOwnProperty(place)) {
+                    continue;
+                }
+                var instructionGroup = routeTrack.nodeInstructionsOrdered[place];
+                for (var _a = 0, instructionGroup_1 = instructionGroup; _a < instructionGroup_1.length; _a++) {
+                    var instruction = instructionGroup_1[_a];
+                    routeTrack.nodeInstructions.push(instruction);
+                }
+            }
+            return routeTrack;
+        }, new RouteTrack()));
+        var cacheNode$ = rxjs_1.combineLatest(slowedStream$, routeTrack$, this.configuration$).pipe(operators_1.map(function (_a) {
+            var frame = _a[0], routeTrack = _a[1], conf = _a[2];
+            return { conf: conf, frame: frame, routeTrack: routeTrack };
+        }), operators_1.scan(function (routeState, rtAndFrame) {
+            if (rtAndFrame.conf.playing === undefined || rtAndFrame.conf.playing) {
+                routeState.routeTrack = rtAndFrame.routeTrack;
+                routeState.currentNode = rtAndFrame.frame.state.currentNode;
+                routeState.lastNode = rtAndFrame.frame.state.lastNode;
+                routeState.playing = true;
+            }
+            else {
+                _this._navigator.stateService.cutNodes();
+                routeState.playing = false;
+            }
+            return routeState;
+        }, new RouteState()), operators_1.filter(function (routeState) {
+            return routeState.playing;
+        }), operators_1.filter(function (routeState) {
+            for (var _i = 0, _a = routeState.routeTrack.nodeInstructions; _i < _a.length; _i++) {
+                var nodeInstruction = _a[_i];
+                if (!nodeInstruction) {
+                    continue;
+                }
+                if (nodeInstruction.key === routeState.lastNode.key) {
+                    return true;
+                }
+            }
+            return false;
+        }), operators_1.distinctUntilChanged(undefined, function (routeState) {
+            return routeState.lastNode.key;
+        }), operators_1.mergeMap(function (routeState) {
+            var i = 0;
+            for (var _i = 0, _a = routeState.routeTrack.nodeInstructions; _i < _a.length; _i++) {
+                var nodeInstruction = _a[_i];
+                if (nodeInstruction.key === routeState.lastNode.key) {
+                    break;
+                }
+                i++;
+            }
+            var nextInstruction = routeState.routeTrack.nodeInstructions[i + 1];
+            if (!nextInstruction) {
+                return rxjs_1.of(null);
+            }
+            return _this._navigator.graphService.cacheNode$(nextInstruction.key);
+        }));
+        this._disposable = rxjs_1.combineLatest(cacheNode$, this.configuration$).pipe(operators_1.map(function (_a) {
+            var node = _a[0], conf = _a[1];
+            return { conf: conf, node: node };
+        }), operators_1.filter(function (cAN) {
+            return cAN.node !== null && cAN.conf.playing;
+        }), operators_1.pluck("node"))
+            .subscribe(this._navigator.stateService.appendNode$);
+        this._disposableDescription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$, routeTrack$, this.configuration$).pipe(operators_1.map(function (_a) {
+            var node = _a[0], routeTrack = _a[1], conf = _a[2];
+            if (conf.playing !== undefined && !conf.playing) {
+                return "quit";
+            }
+            var description = null;
+            for (var _i = 0, _b = routeTrack.nodeInstructions; _i < _b.length; _i++) {
+                var nodeInstruction = _b[_i];
+                if (nodeInstruction.key === node.key) {
+                    description = nodeInstruction.description;
+                    break;
+                }
+            }
+            return description;
+        }), operators_1.scan(function (descriptionState, description) {
+            if (description !== descriptionState.description && description !== null) {
+                descriptionState.description = description;
+                descriptionState.showsLeft = 6;
+            }
+            else {
+                descriptionState.showsLeft--;
+            }
+            if (description === "quit") {
+                descriptionState.description = null;
+            }
+            return descriptionState;
+        }, new DescriptionState()), operators_1.map(function (descriptionState) {
+            if (descriptionState.showsLeft > 0 && descriptionState.description) {
+                return { name: _this._name, vnode: _this._getRouteAnnotationNode(descriptionState.description) };
+            }
+            else {
+                return { name: _this._name, vnode: vd.h("div", []) };
+            }
+        }))
+            .subscribe(this._container.domRenderer.render$);
+    };
+    RouteComponent.prototype._deactivate = function () {
+        this._disposable.unsubscribe();
+        this._disposableDescription.unsubscribe();
+    };
+    RouteComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    RouteComponent.prototype._getRouteAnnotationNode = function (description) {
+        return vd.h("div.RouteFrame", {}, [
+            vd.h("p", { textContent: description }, []),
+        ]);
+    };
+    RouteComponent.componentName = "route";
+    return RouteComponent;
+}(Component_1.Component));
+exports.RouteComponent = RouteComponent;
+Component_1.ComponentService.register(RouteComponent);
+exports.default = RouteComponent;
 
-},{"./utils/EventEmitter":341,"./utils/Settings":342,"./utils/Urls":343}],236:[function(require,module,exports){
+},{"../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],318:[function(require,module,exports){
 "use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
 Object.defineProperty(exports, "__esModule", { value: true });
-var Alignment_1 = require("./viewer/Alignment");
-exports.Alignment = Alignment_1.Alignment;
-var CacheService_1 = require("./viewer/CacheService");
-exports.CacheService = CacheService_1.CacheService;
-var ComponentController_1 = require("./viewer/ComponentController");
-exports.ComponentController = ComponentController_1.ComponentController;
-var Container_1 = require("./viewer/Container");
-exports.Container = Container_1.Container;
-var Observer_1 = require("./viewer/Observer");
-exports.Observer = Observer_1.Observer;
-var ImageSize_1 = require("./viewer/ImageSize");
-exports.ImageSize = ImageSize_1.ImageSize;
-var LoadingService_1 = require("./viewer/LoadingService");
-exports.LoadingService = LoadingService_1.LoadingService;
-var MouseService_1 = require("./viewer/MouseService");
-exports.MouseService = MouseService_1.MouseService;
-var Navigator_1 = require("./viewer/Navigator");
-exports.Navigator = Navigator_1.Navigator;
-var Projection_1 = require("./viewer/Projection");
-exports.Projection = Projection_1.Projection;
-var SpriteService_1 = require("./viewer/SpriteService");
-exports.SpriteService = SpriteService_1.SpriteService;
-var TouchService_1 = require("./viewer/TouchService");
-exports.TouchService = TouchService_1.TouchService;
-var Viewer_1 = require("./viewer/Viewer");
-exports.Viewer = Viewer_1.Viewer;
+exports.StatsComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../Component");
+var StatsComponent = /** @class */ (function (_super) {
+    __extends(StatsComponent, _super);
+    function StatsComponent(name, container, navigator, scheduler) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._scheduler = scheduler;
+        return _this;
+    }
+    StatsComponent.prototype._activate = function () {
+        var _this = this;
+        this._sequenceSubscription = this._navigator.stateService.currentNode$.pipe(operators_1.scan(function (keys, node) {
+            var sKey = node.sequenceKey;
+            keys.report = [];
+            if (!(sKey in keys.reported)) {
+                keys.report = [sKey];
+                keys.reported[sKey] = true;
+            }
+            return keys;
+        }, { report: [], reported: {} }), operators_1.filter(function (keys) {
+            return keys.report.length > 0;
+        }), operators_1.mergeMap(function (keys) {
+            return _this._navigator.apiV3.sequenceViewAdd$(keys.report).pipe(operators_1.catchError(function (error, caught) {
+                console.error("Failed to report sequence stats (" + keys.report + ")", error);
+                return rxjs_1.empty();
+            }));
+        }))
+            .subscribe(function () { });
+        this._imageSubscription = this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) {
+            return node.key;
+        })).pipe(operators_1.buffer(this._navigator.stateService.currentNode$.pipe(operators_1.debounceTime(5000, this._scheduler))), operators_1.scan(function (keys, newKeys) {
+            keys.report = [];
+            for (var _i = 0, newKeys_1 = newKeys; _i < newKeys_1.length; _i++) {
+                var key = newKeys_1[_i];
+                if (!(key in keys.reported)) {
+                    keys.report.push(key);
+                    keys.reported[key] = true;
+                }
+            }
+            return keys;
+        }, { report: [], reported: {} }), operators_1.filter(function (keys) {
+            return keys.report.length > 0;
+        }), operators_1.mergeMap(function (keys) {
+            return _this._navigator.apiV3.imageViewAdd$(keys.report).pipe(operators_1.catchError(function (error, caught) {
+                console.error("Failed to report image stats (" + keys.report + ")", error);
+                return rxjs_1.empty();
+            }));
+        }))
+            .subscribe(function () { });
+    };
+    StatsComponent.prototype._deactivate = function () {
+        this._sequenceSubscription.unsubscribe();
+        this._imageSubscription.unsubscribe();
+    };
+    StatsComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    StatsComponent.componentName = "stats";
+    return StatsComponent;
+}(Component_1.Component));
+exports.StatsComponent = StatsComponent;
+Component_1.ComponentService.register(StatsComponent);
+exports.default = StatsComponent;
 
-},{"./viewer/Alignment":344,"./viewer/CacheService":345,"./viewer/ComponentController":346,"./viewer/Container":347,"./viewer/ImageSize":348,"./viewer/LoadingService":349,"./viewer/MouseService":350,"./viewer/Navigator":351,"./viewer/Observer":352,"./viewer/Projection":353,"./viewer/SpriteService":354,"./viewer/TouchService":355,"./viewer/Viewer":356}],237:[function(require,module,exports){
+},{"../Component":291,"rxjs":43,"rxjs/operators":241}],319:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
 Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/defer");
-require("rxjs/add/observable/fromPromise");
-require("rxjs/add/operator/catch");
-require("rxjs/add/operator/map");
-var API_1 = require("../API");
+exports.DirectionComponent = void 0;
+var vd = require("virtual-dom");
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
 /**
- * @class APIv3
- *
- * @classdesc Provides methods for access of API v3.
+ * @class DirectionComponent
+ * @classdesc Component showing navigation arrows for steps and turns.
  */
-var APIv3 = (function () {
+var DirectionComponent = /** @class */ (function (_super) {
+    __extends(DirectionComponent, _super);
+    function DirectionComponent(name, container, navigator, directionDOMRenderer) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._renderer = !!directionDOMRenderer ?
+            directionDOMRenderer :
+            new Component_1.DirectionDOMRenderer(_this.defaultConfiguration, { height: container.element.offsetHeight, width: container.element.offsetWidth });
+        _this._hoveredKeySubject$ = new rxjs_1.Subject();
+        _this._hoveredKey$ = _this._hoveredKeySubject$.pipe(operators_1.share());
+        return _this;
+    }
+    Object.defineProperty(DirectionComponent.prototype, "hoveredKey$", {
+        /**
+         * Get hovered key observable.
+         *
+         * @description An observable emitting the key of the node for the direction
+         * arrow that is being hovered. When the mouse leaves a direction arrow null
+         * is emitted.
+         *
+         * @returns {Observable<string>}
+         */
+        get: function () {
+            return this._hoveredKey$;
+        },
+        enumerable: false,
+        configurable: true
+    });
     /**
-     * Create a new api v3 instance.
+     * Set highlight key.
      *
-     * @param {number} clientId - Client id for API requests.
-     * @param {number} [token] - Optional bearer token for API requests of
-     * protected resources.
-     * @param {ModelCreator} [creator] - Optional model creator instance.
+     * @description The arrow pointing towards the node corresponding to the
+     * highlight key will be highlighted.
+     *
+     * @param {string} highlightKey Key of node to be highlighted if existing
+     * among arrows.
      */
-    function APIv3(clientId, token, creator) {
-        this._clientId = clientId;
-        this._modelCreator = creator != null ? creator : new API_1.ModelCreator();
-        this._model = this._modelCreator.createModel(clientId, token);
-        this._pageCount = 999;
-        this._pathImageByKey = "imageByKey";
-        this._pathImageCloseTo = "imageCloseTo";
-        this._pathImagesByH = "imagesByH";
-        this._pathImageViewAdd = "imageViewAdd";
-        this._pathSequenceByKey = "sequenceByKey";
-        this._pathSequenceViewAdd = "sequenceViewAdd";
-        this._propertiesCore = [
-            "cl",
-            "l",
-            "sequence",
-        ];
-        this._propertiesFill = [
-            "captured_at",
-            "user",
-            "project",
-        ];
-        this._propertiesKey = [
-            "key",
-        ];
-        this._propertiesSequence = [
-            "keys",
-        ];
-        this._propertiesSpatial = [
-            "atomic_scale",
-            "ca",
-            "calt",
-            "cca",
-            "cfocal",
-            "gpano",
-            "height",
-            "merge_cc",
-            "merge_version",
-            "c_rotation",
-            "orientation",
-            "width",
-        ];
-        this._propertiesUser = [
-            "username",
-        ];
-    }
-    APIv3.prototype.imageByKeyFill$ = function (keys) {
-        return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([
-            this._pathImageByKey,
-            keys,
-            this._propertiesKey
-                .concat(this._propertiesFill)
-                .concat(this._propertiesSpatial),
-            this._propertiesKey
-                .concat(this._propertiesUser)
-        ]))
-            .map(function (value) {
-            if (!value) {
-                throw new Error("Images (" + keys.join(", ") + ") could not be found.");
-            }
-            return value.json.imageByKey;
-        }), this._pathImageByKey, keys);
+    DirectionComponent.prototype.setHighlightKey = function (highlightKey) {
+        this.configure({ highlightKey: highlightKey });
     };
-    APIv3.prototype.imageByKeyFull$ = function (keys) {
-        return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([
-            this._pathImageByKey,
-            keys,
-            this._propertiesKey
-                .concat(this._propertiesCore)
-                .concat(this._propertiesFill)
-                .concat(this._propertiesSpatial),
-            this._propertiesKey
-                .concat(this._propertiesUser)
-        ]))
-            .map(function (value) {
-            if (!value) {
-                throw new Error("Images (" + keys.join(", ") + ") could not be found.");
+    /**
+     * Set min width of container element.
+     *
+     * @description  Set min width of the non transformed container element holding
+     * the navigation arrows. If the min width is larger than the max width the
+     * min width value will be used.
+     *
+     * The container element is automatically resized when the resize
+     * method on the Viewer class is called.
+     *
+     * @param {number} minWidth
+     */
+    DirectionComponent.prototype.setMinWidth = function (minWidth) {
+        this.configure({ minWidth: minWidth });
+    };
+    /**
+     * Set max width of container element.
+     *
+     * @description Set max width of the non transformed container element holding
+     * the navigation arrows. If the min width is larger than the max width the
+     * min width value will be used.
+     *
+     * The container element is automatically resized when the resize
+     * method on the Viewer class is called.
+     *
+     * @param {number} minWidth
+     */
+    DirectionComponent.prototype.setMaxWidth = function (maxWidth) {
+        this.configure({ maxWidth: maxWidth });
+    };
+    DirectionComponent.prototype._activate = function () {
+        var _this = this;
+        this._configurationSubscription = this._configuration$
+            .subscribe(function (configuration) {
+            _this._renderer.setConfiguration(configuration);
+        });
+        this._resizeSubscription = this._container.renderService.size$
+            .subscribe(function (size) {
+            _this._renderer.resize(size);
+        });
+        this._nodeSubscription = this._navigator.stateService.currentNode$.pipe(operators_1.tap(function (node) {
+            _this._container.domRenderer.render$.next({ name: _this._name, vnode: vd.h("div", {}, []) });
+            _this._renderer.setNode(node);
+        }), operators_1.withLatestFrom(this._configuration$), operators_1.switchMap(function (_a) {
+            var node = _a[0], configuration = _a[1];
+            return rxjs_1.combineLatest(node.spatialEdges$, configuration.distinguishSequence ?
+                _this._navigator.graphService
+                    .cacheSequence$(node.sequenceKey).pipe(operators_1.catchError(function (error, caught) {
+                    console.error("Failed to cache sequence (" + node.sequenceKey + ")", error);
+                    return rxjs_1.of(null);
+                })) :
+                rxjs_1.of(null));
+        }))
+            .subscribe(function (_a) {
+            var edgeStatus = _a[0], sequence = _a[1];
+            _this._renderer.setEdges(edgeStatus, sequence);
+        });
+        this._renderCameraSubscription = this._container.renderService.renderCameraFrame$.pipe(operators_1.tap(function (renderCamera) {
+            _this._renderer.setRenderCamera(renderCamera);
+        }), operators_1.map(function () {
+            return _this._renderer;
+        }), operators_1.filter(function (renderer) {
+            return renderer.needsRender;
+        }), operators_1.map(function (renderer) {
+            return { name: _this._name, vnode: renderer.render(_this._navigator) };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+        this._hoveredKeySubscription = rxjs_1.combineLatest(this._container.domRenderer.element$, this._container.renderService.renderCamera$, this._container.mouseService.mouseMove$.pipe(operators_1.startWith(null)), this._container.mouseService.mouseUp$.pipe(operators_1.startWith(null))).pipe(operators_1.map(function (_a) {
+            var element = _a[0];
+            var elements = element.getElementsByClassName("DirectionsPerspective");
+            for (var i = 0; i < elements.length; i++) {
+                var hovered = elements.item(i).querySelector(":hover");
+                if (hovered != null && hovered.hasAttribute("data-key")) {
+                    return hovered.getAttribute("data-key");
+                }
             }
-            return value.json.imageByKey;
-        }), this._pathImageByKey, keys);
+            return null;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(this._hoveredKeySubject$);
+        this._emitHoveredKeySubscription = this._hoveredKey$
+            .subscribe(function (key) {
+            _this.fire(DirectionComponent.hoveredkeychanged, key);
+        });
+    };
+    DirectionComponent.prototype._deactivate = function () {
+        this._configurationSubscription.unsubscribe();
+        this._emitHoveredKeySubscription.unsubscribe();
+        this._hoveredKeySubscription.unsubscribe();
+        this._nodeSubscription.unsubscribe();
+        this._renderCameraSubscription.unsubscribe();
+    };
+    DirectionComponent.prototype._getDefaultConfiguration = function () {
+        return {
+            distinguishSequence: false,
+            maxWidth: 460,
+            minWidth: 260,
+        };
+    };
+    /** @inheritdoc */
+    DirectionComponent.componentName = "direction";
+    /**
+     * Event fired when the hovered key changes.
+     *
+     * @description Emits the key of the node for the direction
+     * arrow that is being hovered. When the mouse leaves a
+     * direction arrow null is emitted.
+     *
+     * @event DirectionComponent#hoveredkeychanged
+     * @type {string} The hovered key, null if no key is hovered.
+     */
+    DirectionComponent.hoveredkeychanged = "hoveredkeychanged";
+    return DirectionComponent;
+}(Component_1.Component));
+exports.DirectionComponent = DirectionComponent;
+Component_1.ComponentService.register(DirectionComponent);
+exports.default = DirectionComponent;
+
+
+},{"../../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],320:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DirectionDOMCalculator = void 0;
+var Geo_1 = require("../../Geo");
+/**
+ * @class DirectionDOMCalculator
+ * @classdesc Helper class for calculating DOM CSS properties.
+ */
+var DirectionDOMCalculator = /** @class */ (function () {
+    function DirectionDOMCalculator(configuration, size) {
+        this._spatial = new Geo_1.Spatial();
+        this._minThresholdWidth = 320;
+        this._maxThresholdWidth = 1480;
+        this._minThresholdHeight = 240;
+        this._maxThresholdHeight = 820;
+        this._configure(configuration);
+        this._resize(size);
+        this._reset();
+    }
+    Object.defineProperty(DirectionDOMCalculator.prototype, "minWidth", {
+        get: function () {
+            return this._minWidth;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "maxWidth", {
+        get: function () {
+            return this._maxWidth;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "containerWidth", {
+        get: function () {
+            return this._containerWidth;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "containerWidthCss", {
+        get: function () {
+            return this._containerWidthCss;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "containerMarginCss", {
+        get: function () {
+            return this._containerMarginCss;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "containerLeftCss", {
+        get: function () {
+            return this._containerLeftCss;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "containerHeight", {
+        get: function () {
+            return this._containerHeight;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "containerHeightCss", {
+        get: function () {
+            return this._containerHeightCss;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "containerBottomCss", {
+        get: function () {
+            return this._containerBottomCss;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleSize", {
+        get: function () {
+            return this._stepCircleSize;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleSizeCss", {
+        get: function () {
+            return this._stepCircleSizeCss;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleMarginCss", {
+        get: function () {
+            return this._stepCircleMarginCss;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "turnCircleSize", {
+        get: function () {
+            return this._turnCircleSize;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "turnCircleSizeCss", {
+        get: function () {
+            return this._turnCircleSizeCss;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "outerRadius", {
+        get: function () {
+            return this._outerRadius;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "innerRadius", {
+        get: function () {
+            return this._innerRadius;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(DirectionDOMCalculator.prototype, "shadowOffset", {
+        get: function () {
+            return this._shadowOffset;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * Configures the min and max width values.
+     *
+     * @param {IDirectionConfiguration} configuration Configuration
+     * with min and max width values.
+     */
+    DirectionDOMCalculator.prototype.configure = function (configuration) {
+        this._configure(configuration);
+        this._reset();
     };
-    APIv3.prototype.imageCloseTo$ = function (lat, lon) {
-        var lonLat = lon + ":" + lat;
-        return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([
-            this._pathImageCloseTo,
-            [lonLat],
-            this._propertiesKey
-                .concat(this._propertiesCore)
-                .concat(this._propertiesFill)
-                .concat(this._propertiesSpatial),
-            this._propertiesKey
-                .concat(this._propertiesUser)
-        ]))
-            .map(function (value) {
-            return value != null ? value.json.imageCloseTo[lonLat] : null;
-        }), this._pathImageCloseTo, [lonLat]);
+    /**
+     * Resizes all properties according to the width and height
+     * of the size object.
+     *
+     * @param {ISize} size The size of the container element.
+     */
+    DirectionDOMCalculator.prototype.resize = function (size) {
+        this._resize(size);
+        this._reset();
     };
-    APIv3.prototype.imagesByH$ = function (hs) {
-        var _this = this;
-        return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([
-            this._pathImagesByH,
-            hs,
-            { from: 0, to: this._pageCount },
-            this._propertiesKey
-                .concat(this._propertiesCore),
-            this._propertiesKey
-        ]))
-            .map(function (value) {
-            if (value == null) {
-                value = { json: { imagesByH: {} } };
-                for (var _i = 0, hs_1 = hs; _i < hs_1.length; _i++) {
-                    var h = hs_1[_i];
-                    value.json.imagesByH[h] = {};
-                    for (var i = 0; i <= _this._pageCount; i++) {
-                        value.json.imagesByH[h][i] = null;
-                    }
-                }
-            }
-            return value.json.imagesByH;
-        }), this._pathImagesByH, hs);
+    /**
+     * Calculates the coordinates on the unit circle for an angle.
+     *
+     * @param {number} angle Angle in radians.
+     * @returns {Array<number>} The x and y coordinates on the unit circle.
+     */
+    DirectionDOMCalculator.prototype.angleToCoordinates = function (angle) {
+        return [Math.cos(angle), Math.sin(angle)];
     };
-    APIv3.prototype.imageViewAdd$ = function (keys) {
-        return this._catchInvalidateCall$(this._wrapPromise$(this._model.call([this._pathImageViewAdd], [keys])), this._pathImageViewAdd, keys);
+    /**
+     * Calculates the coordinates on the unit circle for the
+     * relative angle between the first and second angle.
+     *
+     * @param {number} first Angle in radians.
+     * @param {number} second Angle in radians.
+     * @returns {Array<number>} The x and y coordinates on the unit circle
+     * for the relative angle between the first and second angle.
+     */
+    DirectionDOMCalculator.prototype.relativeAngleToCoordiantes = function (first, second) {
+        var relativeAngle = this._spatial.wrapAngle(first - second);
+        return this.angleToCoordinates(relativeAngle);
     };
-    APIv3.prototype.invalidateImageByKey = function (keys) {
-        this._invalidateGet(this._pathImageByKey, keys);
+    DirectionDOMCalculator.prototype._configure = function (configuration) {
+        this._minWidth = configuration.minWidth;
+        this._maxWidth = this._getMaxWidth(configuration.minWidth, configuration.maxWidth);
     };
-    APIv3.prototype.invalidateImagesByH = function (hs) {
-        this._invalidateGet(this._pathImagesByH, hs);
+    DirectionDOMCalculator.prototype._resize = function (size) {
+        this._elementWidth = size.width;
+        this._elementHeight = size.height;
     };
-    APIv3.prototype.invalidateSequenceByKey = function (sKeys) {
-        this._invalidateGet(this._pathSequenceByKey, sKeys);
+    DirectionDOMCalculator.prototype._reset = function () {
+        this._containerWidth = this._getContainerWidth(this._elementWidth, this._elementHeight);
+        this._containerHeight = this._getContainerHeight(this.containerWidth);
+        this._stepCircleSize = this._getStepCircleDiameter(this._containerHeight);
+        this._turnCircleSize = this._getTurnCircleDiameter(this.containerHeight);
+        this._outerRadius = this._getOuterRadius(this._containerHeight);
+        this._innerRadius = this._getInnerRadius(this._containerHeight);
+        this._shadowOffset = 3;
+        this._containerWidthCss = this._numberToCssPixels(this._containerWidth);
+        this._containerMarginCss = this._numberToCssPixels(-0.5 * this._containerWidth);
+        this._containerLeftCss = this._numberToCssPixels(Math.floor(0.5 * this._elementWidth));
+        this._containerHeightCss = this._numberToCssPixels(this._containerHeight);
+        this._containerBottomCss = this._numberToCssPixels(Math.floor(-0.08 * this._containerHeight));
+        this._stepCircleSizeCss = this._numberToCssPixels(this._stepCircleSize);
+        this._stepCircleMarginCss = this._numberToCssPixels(-0.5 * this._stepCircleSize);
+        this._turnCircleSizeCss = this._numberToCssPixels(this._turnCircleSize);
     };
-    APIv3.prototype.setToken = function (token) {
-        this._model.invalidate([]);
-        this._model = null;
-        this._model = this._modelCreator.createModel(this._clientId, token);
+    DirectionDOMCalculator.prototype._getContainerWidth = function (elementWidth, elementHeight) {
+        var relativeWidth = (elementWidth - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth);
+        var relativeHeight = (elementHeight - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight);
+        var coeff = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));
+        coeff = 0.04 * Math.round(25 * coeff);
+        return this._minWidth + coeff * (this._maxWidth - this._minWidth);
     };
-    APIv3.prototype.sequenceByKey$ = function (sequenceKeys) {
-        return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([
-            this._pathSequenceByKey,
-            sequenceKeys,
-            this._propertiesKey
-                .concat(this._propertiesSequence)
-        ]))
-            .map(function (value) {
-            return value.json.sequenceByKey;
-        }), this._pathSequenceByKey, sequenceKeys);
+    DirectionDOMCalculator.prototype._getContainerHeight = function (containerWidth) {
+        return 0.77 * containerWidth;
     };
-    APIv3.prototype.sequenceViewAdd$ = function (sequenceKeys) {
-        return this._catchInvalidateCall$(this._wrapPromise$(this._model.call([this._pathSequenceViewAdd], [sequenceKeys])), this._pathSequenceViewAdd, sequenceKeys);
+    DirectionDOMCalculator.prototype._getStepCircleDiameter = function (containerHeight) {
+        return 0.34 * containerHeight;
     };
-    Object.defineProperty(APIv3.prototype, "clientId", {
-        get: function () {
-            return this._clientId;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    APIv3.prototype._catchInvalidateGet$ = function (observable, path, paths) {
-        var _this = this;
-        return observable
-            .catch(function (error) {
-            _this._invalidateGet(path, paths);
-            throw error;
-        });
+    DirectionDOMCalculator.prototype._getTurnCircleDiameter = function (containerHeight) {
+        return 0.3 * containerHeight;
     };
-    APIv3.prototype._catchInvalidateCall$ = function (observable, path, paths) {
-        var _this = this;
-        return observable
-            .catch(function (error) {
-            _this._invalidateCall(path, paths);
-            throw error;
-        });
+    DirectionDOMCalculator.prototype._getOuterRadius = function (containerHeight) {
+        return 0.31 * containerHeight;
     };
-    APIv3.prototype._invalidateGet = function (path, paths) {
-        this._model.invalidate([path, paths]);
+    DirectionDOMCalculator.prototype._getInnerRadius = function (containerHeight) {
+        return 0.125 * containerHeight;
     };
-    APIv3.prototype._invalidateCall = function (path, paths) {
-        this._model.invalidate([path], [paths]);
+    DirectionDOMCalculator.prototype._numberToCssPixels = function (value) {
+        return value + "px";
     };
-    APIv3.prototype._wrapPromise$ = function (promise) {
-        return Observable_1.Observable.defer(function () { return Observable_1.Observable.fromPromise(promise); });
+    DirectionDOMCalculator.prototype._getMaxWidth = function (value, minWidth) {
+        return value > minWidth ? value : minWidth;
     };
-    return APIv3;
+    return DirectionDOMCalculator;
 }());
-exports.APIv3 = APIv3;
-exports.default = APIv3;
+exports.DirectionDOMCalculator = DirectionDOMCalculator;
+exports.default = DirectionDOMCalculator;
+
 
-},{"../API":225,"rxjs/Observable":29,"rxjs/add/observable/defer":39,"rxjs/add/observable/fromPromise":43,"rxjs/add/operator/catch":52,"rxjs/add/operator/map":65}],238:[function(require,module,exports){
+},{"../../Geo":294}],321:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
-var falcor = require("falcor");
-var HttpDataSource = require("falcor-http-datasource");
-var Utils_1 = require("../Utils");
+exports.DirectionDOMRenderer = void 0;
+var vd = require("virtual-dom");
+var Component_1 = require("../../Component");
+var Edge_1 = require("../../Edge");
+var Error_1 = require("../../Error");
+var Geo_1 = require("../../Geo");
 /**
- * @class ModelCreator
- *
- * @classdesc Creates API models.
+ * @class DirectionDOMRenderer
+ * @classdesc DOM renderer for direction arrows.
  */
-var ModelCreator = (function () {
-    function ModelCreator() {
+var DirectionDOMRenderer = /** @class */ (function () {
+    function DirectionDOMRenderer(configuration, size) {
+        this._isEdge = false;
+        this._spatial = new Geo_1.Spatial();
+        this._calculator = new Component_1.DirectionDOMCalculator(configuration, size);
+        this._node = null;
+        this._rotation = { phi: 0, theta: 0 };
+        this._epsilon = 0.5 * Math.PI / 180;
+        this._highlightKey = null;
+        this._distinguishSequence = false;
+        this._needsRender = false;
+        this._stepEdges = [];
+        this._turnEdges = [];
+        this._panoEdges = [];
+        this._sequenceEdgeKeys = [];
+        this._stepDirections = [
+            Edge_1.EdgeDirection.StepForward,
+            Edge_1.EdgeDirection.StepBackward,
+            Edge_1.EdgeDirection.StepLeft,
+            Edge_1.EdgeDirection.StepRight,
+        ];
+        this._turnDirections = [
+            Edge_1.EdgeDirection.TurnLeft,
+            Edge_1.EdgeDirection.TurnRight,
+            Edge_1.EdgeDirection.TurnU,
+        ];
+        this._turnNames = {};
+        this._turnNames[Edge_1.EdgeDirection.TurnLeft] = "TurnLeft";
+        this._turnNames[Edge_1.EdgeDirection.TurnRight] = "TurnRight";
+        this._turnNames[Edge_1.EdgeDirection.TurnU] = "TurnAround";
+        // detects IE 8-11, then Edge 20+.
+        var isIE = !!document.documentMode;
+        this._isEdge = !isIE && !!window.StyleMedia;
     }
+    Object.defineProperty(DirectionDOMRenderer.prototype, "needsRender", {
+        /**
+         * Get needs render.
+         *
+         * @returns {boolean} Value indicating whether render should be called.
+         */
+        get: function () {
+            return this._needsRender;
+        },
+        enumerable: false,
+        configurable: true
+    });
     /**
-     * Creates a Falcor model.
+     * Renders virtual DOM elements.
      *
-     * @description Max cache size will be set to 16 MB. Authorization
-     * header will be added if bearer token is supplied.
+     * @description Calling render resets the needs render property.
+     */
+    DirectionDOMRenderer.prototype.render = function (navigator) {
+        this._needsRender = false;
+        var rotation = this._rotation;
+        var steps = [];
+        var turns = [];
+        if (this._node.pano) {
+            steps = steps.concat(this._createPanoArrows(navigator, rotation));
+        }
+        else {
+            steps = steps.concat(this._createPerspectiveToPanoArrows(navigator, rotation));
+            steps = steps.concat(this._createStepArrows(navigator, rotation));
+            turns = turns.concat(this._createTurnArrows(navigator));
+        }
+        return this._getContainer(steps, turns, rotation);
+    };
+    DirectionDOMRenderer.prototype.setEdges = function (edgeStatus, sequence) {
+        this._setEdges(edgeStatus, sequence);
+        this._setNeedsRender();
+    };
+    /**
+     * Set node for which to show edges.
      *
-     * @param {number} clientId - Client id for API requests.
-     * @param {number} [token] - Optional bearer token for API requests of
-     * protected resources.
-     * @returns {falcor.Model} Falcor model for HTTP requests.
+     * @param {Node} node
      */
-    ModelCreator.prototype.createModel = function (clientId, token) {
-        var configuration = {
-            crossDomain: true,
-            withCredentials: false,
+    DirectionDOMRenderer.prototype.setNode = function (node) {
+        this._node = node;
+        this._clearEdges();
+        this._setNeedsRender();
+    };
+    /**
+     * Set the render camera to use for calculating rotations.
+     *
+     * @param {RenderCamera} renderCamera
+     */
+    DirectionDOMRenderer.prototype.setRenderCamera = function (renderCamera) {
+        var rotation = renderCamera.rotation;
+        if (Math.abs(rotation.phi - this._rotation.phi) < this._epsilon) {
+            return;
+        }
+        this._rotation = rotation;
+        this._setNeedsRender();
+    };
+    /**
+     * Set configuration values.
+     *
+     * @param {IDirectionConfiguration} configuration
+     */
+    DirectionDOMRenderer.prototype.setConfiguration = function (configuration) {
+        var needsRender = false;
+        if (this._highlightKey !== configuration.highlightKey ||
+            this._distinguishSequence !== configuration.distinguishSequence) {
+            this._highlightKey = configuration.highlightKey;
+            this._distinguishSequence = configuration.distinguishSequence;
+            needsRender = true;
+        }
+        if (this._calculator.minWidth !== configuration.minWidth ||
+            this._calculator.maxWidth !== configuration.maxWidth) {
+            this._calculator.configure(configuration);
+            needsRender = true;
+        }
+        if (needsRender) {
+            this._setNeedsRender();
+        }
+    };
+    /**
+     * Detect the element's width and height and resize
+     * elements accordingly.
+     *
+     * @param {ISize} size Size of vßiewer container element.
+     */
+    DirectionDOMRenderer.prototype.resize = function (size) {
+        this._calculator.resize(size);
+        this._setNeedsRender();
+    };
+    DirectionDOMRenderer.prototype._setNeedsRender = function () {
+        if (this._node != null) {
+            this._needsRender = true;
+        }
+    };
+    DirectionDOMRenderer.prototype._clearEdges = function () {
+        this._stepEdges = [];
+        this._turnEdges = [];
+        this._panoEdges = [];
+        this._sequenceEdgeKeys = [];
+    };
+    DirectionDOMRenderer.prototype._setEdges = function (edgeStatus, sequence) {
+        this._stepEdges = [];
+        this._turnEdges = [];
+        this._panoEdges = [];
+        this._sequenceEdgeKeys = [];
+        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
+            var edge = _a[_i];
+            var direction = edge.data.direction;
+            if (this._stepDirections.indexOf(direction) > -1) {
+                this._stepEdges.push(edge);
+                continue;
+            }
+            if (this._turnDirections.indexOf(direction) > -1) {
+                this._turnEdges.push(edge);
+                continue;
+            }
+            if (edge.data.direction === Edge_1.EdgeDirection.Pano) {
+                this._panoEdges.push(edge);
+            }
+        }
+        if (this._distinguishSequence && sequence != null) {
+            var edges = this._panoEdges
+                .concat(this._stepEdges)
+                .concat(this._turnEdges);
+            for (var _b = 0, edges_1 = edges; _b < edges_1.length; _b++) {
+                var edge = edges_1[_b];
+                var edgeKey = edge.to;
+                for (var _c = 0, _d = sequence.keys; _c < _d.length; _c++) {
+                    var sequenceKey = _d[_c];
+                    if (sequenceKey === edgeKey) {
+                        this._sequenceEdgeKeys.push(edgeKey);
+                        break;
+                    }
+                }
+            }
+        }
+    };
+    DirectionDOMRenderer.prototype._createPanoArrows = function (navigator, rotation) {
+        var arrows = [];
+        for (var _i = 0, _a = this._panoEdges; _i < _a.length; _i++) {
+            var panoEdge = _a[_i];
+            arrows.push(this._createVNodeByKey(navigator, panoEdge.to, panoEdge.data.worldMotionAzimuth, rotation, this._calculator.outerRadius, "DirectionsArrowPano"));
+        }
+        for (var _b = 0, _c = this._stepEdges; _b < _c.length; _b++) {
+            var stepEdge = _c[_b];
+            arrows.push(this._createPanoToPerspectiveArrow(navigator, stepEdge.to, stepEdge.data.worldMotionAzimuth, rotation, stepEdge.data.direction));
+        }
+        return arrows;
+    };
+    DirectionDOMRenderer.prototype._createPanoToPerspectiveArrow = function (navigator, key, azimuth, rotation, direction) {
+        var threshold = Math.PI / 8;
+        var relativePhi = rotation.phi;
+        switch (direction) {
+            case Edge_1.EdgeDirection.StepBackward:
+                relativePhi = rotation.phi - Math.PI;
+                break;
+            case Edge_1.EdgeDirection.StepLeft:
+                relativePhi = rotation.phi + Math.PI / 2;
+                break;
+            case Edge_1.EdgeDirection.StepRight:
+                relativePhi = rotation.phi - Math.PI / 2;
+                break;
+            default:
+                break;
+        }
+        if (Math.abs(this._spatial.wrapAngle(azimuth - relativePhi)) < threshold) {
+            return this._createVNodeByKey(navigator, key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowStep");
+        }
+        return this._createVNodeDisabled(key, azimuth, rotation);
+    };
+    DirectionDOMRenderer.prototype._createPerspectiveToPanoArrows = function (navigator, rotation) {
+        var arrows = [];
+        for (var _i = 0, _a = this._panoEdges; _i < _a.length; _i++) {
+            var panoEdge = _a[_i];
+            arrows.push(this._createVNodeByKey(navigator, panoEdge.to, panoEdge.data.worldMotionAzimuth, rotation, this._calculator.innerRadius, "DirectionsArrowPano", true));
+        }
+        return arrows;
+    };
+    DirectionDOMRenderer.prototype._createStepArrows = function (navigator, rotation) {
+        var arrows = [];
+        for (var _i = 0, _a = this._stepEdges; _i < _a.length; _i++) {
+            var stepEdge = _a[_i];
+            arrows.push(this._createVNodeByDirection(navigator, stepEdge.to, stepEdge.data.worldMotionAzimuth, rotation, stepEdge.data.direction));
+        }
+        return arrows;
+    };
+    DirectionDOMRenderer.prototype._createTurnArrows = function (navigator) {
+        var turns = [];
+        for (var _i = 0, _a = this._turnEdges; _i < _a.length; _i++) {
+            var turnEdge = _a[_i];
+            var direction = turnEdge.data.direction;
+            var name_1 = this._turnNames[direction];
+            turns.push(this._createVNodeByTurn(navigator, turnEdge.to, name_1, direction));
+        }
+        return turns;
+    };
+    DirectionDOMRenderer.prototype._createVNodeByKey = function (navigator, key, azimuth, rotation, offset, className, shiftVertically) {
+        var onClick = function (e) {
+            navigator.moveToKey$(key)
+                .subscribe(undefined, function (error) {
+                if (!(error instanceof Error_1.AbortMapillaryError)) {
+                    console.error(error);
+                }
+            });
+        };
+        return this._createVNode(key, azimuth, rotation, offset, className, "DirectionsCircle", onClick, shiftVertically);
+    };
+    DirectionDOMRenderer.prototype._createVNodeByDirection = function (navigator, key, azimuth, rotation, direction) {
+        var onClick = function (e) {
+            navigator.moveDir$(direction)
+                .subscribe(undefined, function (error) {
+                if (!(error instanceof Error_1.AbortMapillaryError)) {
+                    console.error(error);
+                }
+            });
+        };
+        return this._createVNode(key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowStep", "DirectionsCircle", onClick);
+    };
+    DirectionDOMRenderer.prototype._createVNodeByTurn = function (navigator, key, className, direction) {
+        var onClick = function (e) {
+            navigator.moveDir$(direction)
+                .subscribe(undefined, function (error) {
+                if (!(error instanceof Error_1.AbortMapillaryError)) {
+                    console.error(error);
+                }
+            });
+        };
+        var style = {
+            height: this._calculator.turnCircleSizeCss,
+            transform: "rotate(0)",
+            width: this._calculator.turnCircleSizeCss,
+        };
+        switch (direction) {
+            case Edge_1.EdgeDirection.TurnLeft:
+                style.left = "5px";
+                style.top = "5px";
+                break;
+            case Edge_1.EdgeDirection.TurnRight:
+                style.right = "5px";
+                style.top = "5px";
+                break;
+            case Edge_1.EdgeDirection.TurnU:
+                style.left = "5px";
+                style.bottom = "5px";
+                break;
+            default:
+                break;
+        }
+        var circleProperties = {
+            attributes: {
+                "data-key": key,
+            },
+            onclick: onClick,
+            style: style,
+        };
+        var circleClassName = "TurnCircle";
+        if (this._sequenceEdgeKeys.indexOf(key) > -1) {
+            circleClassName += "Sequence";
+        }
+        if (this._highlightKey === key) {
+            circleClassName += "Highlight";
+        }
+        var turn = vd.h("div." + className, {}, []);
+        return vd.h("div." + circleClassName, circleProperties, [turn]);
+    };
+    DirectionDOMRenderer.prototype._createVNodeDisabled = function (key, azimuth, rotation) {
+        return this._createVNode(key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowDisabled", "DirectionsCircleDisabled");
+    };
+    DirectionDOMRenderer.prototype._createVNode = function (key, azimuth, rotation, radius, className, circleClassName, onClick, shiftVertically) {
+        var translation = this._calculator.angleToCoordinates(azimuth - rotation.phi);
+        // rotate 90 degrees clockwise and flip over X-axis
+        var translationX = Math.round(-radius * translation[1] + 0.5 * this._calculator.containerWidth);
+        var translationY = Math.round(-radius * translation[0] + 0.5 * this._calculator.containerHeight);
+        var shadowTranslation = this._calculator.relativeAngleToCoordiantes(azimuth, rotation.phi);
+        var shadowOffset = this._calculator.shadowOffset;
+        var shadowTranslationX = -shadowOffset * shadowTranslation[1];
+        var shadowTranslationY = shadowOffset * shadowTranslation[0];
+        var filter = "drop-shadow(" + shadowTranslationX + "px " + shadowTranslationY + "px 1px rgba(0,0,0,0.8))";
+        var properties = {
+            style: {
+                "-webkit-filter": filter,
+                filter: filter,
+            },
         };
-        if (token != null) {
-            configuration.headers = { "Authorization": "Bearer " + token };
+        var chevron = vd.h("div." + className, properties, []);
+        var azimuthDeg = -this._spatial.radToDeg(azimuth - rotation.phi);
+        var circleTransform = shiftVertically ?
+            "translate(" + translationX + "px, " + translationY + "px) rotate(" + azimuthDeg + "deg) translateZ(-0.01px)" :
+            "translate(" + translationX + "px, " + translationY + "px) rotate(" + azimuthDeg + "deg)";
+        var circleProperties = {
+            attributes: { "data-key": key },
+            onclick: onClick,
+            style: {
+                height: this._calculator.stepCircleSizeCss,
+                marginLeft: this._calculator.stepCircleMarginCss,
+                marginTop: this._calculator.stepCircleMarginCss,
+                transform: circleTransform,
+                width: this._calculator.stepCircleSizeCss,
+            },
+        };
+        if (this._sequenceEdgeKeys.indexOf(key) > -1) {
+            circleClassName += "Sequence";
         }
-        return new falcor.Model({
-            maxSize: 16 * 1024 * 1024,
-            source: new HttpDataSource(Utils_1.Urls.falcorModel(clientId), configuration),
-        });
+        if (this._highlightKey === key) {
+            circleClassName += "Highlight";
+        }
+        return vd.h("div." + circleClassName, circleProperties, [chevron]);
     };
-    return ModelCreator;
+    DirectionDOMRenderer.prototype._getContainer = function (steps, turns, rotation) {
+        // edge does not handle hover on perspective transforms.
+        var transform = this._isEdge ?
+            "rotateX(60deg)" :
+            "perspective(" + this._calculator.containerWidthCss + ") rotateX(60deg)";
+        var properties = {
+            oncontextmenu: function (event) { event.preventDefault(); },
+            style: {
+                bottom: this._calculator.containerBottomCss,
+                height: this._calculator.containerHeightCss,
+                left: this._calculator.containerLeftCss,
+                marginLeft: this._calculator.containerMarginCss,
+                transform: transform,
+                width: this._calculator.containerWidthCss,
+            },
+        };
+        return vd.h("div.DirectionsPerspective", properties, turns.concat(steps));
+    };
+    return DirectionDOMRenderer;
 }());
-exports.ModelCreator = ModelCreator;
-exports.default = ModelCreator;
+exports.DirectionDOMRenderer = DirectionDOMRenderer;
+exports.default = DirectionDOMRenderer;
 
-},{"../Utils":235,"falcor":15,"falcor-http-datasource":10}],239:[function(require,module,exports){
-"use strict";
-/// <reference path="../../typings/index.d.ts" />
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var AttributionComponent = (function (_super) {
-    __extends(AttributionComponent, _super);
-    function AttributionComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    AttributionComponent.prototype._activate = function () {
-        var _this = this;
-        this._disposable = this._navigator.stateService.currentNode$
-            .map(function (node) {
-            return { name: _this._name, vnode: _this._getAttributionNode(node.username, node.key) };
-        })
-            .subscribe(this._container.domRenderer.render$);
-    };
-    AttributionComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-    };
-    AttributionComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    AttributionComponent.prototype._getAttributionNode = function (username, photoId) {
-        return vd.h("div.Attribution", {}, [
-            vd.h("a", { href: "https://www.mapillary.com/app/user/" + username,
-                target: "_blank",
-                textContent: "@" + username,
-            }, []),
-            vd.h("span", { textContent: "|" }, []),
-            vd.h("a", { href: "https://www.mapillary.com/app/?pKey=" + photoId + "&focus=photo",
-                target: "_blank",
-                textContent: "mapillary.com",
-            }, []),
-        ]);
-    };
-    AttributionComponent.componentName = "attribution";
-    return AttributionComponent;
-}(Component_1.Component));
-exports.AttributionComponent = AttributionComponent;
-Component_1.ComponentService.register(AttributionComponent);
-exports.default = AttributionComponent;
 
-},{"../Component":226,"virtual-dom":182}],240:[function(require,module,exports){
+},{"../../Component":291,"../../Edge":292,"../../Error":293,"../../Geo":294,"virtual-dom":247}],322:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var BackgroundComponent = (function (_super) {
-    __extends(BackgroundComponent, _super);
-    function BackgroundComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    BackgroundComponent.prototype._activate = function () {
-        this._container.domRenderer.render$
-            .next({ name: this._name, vnode: this._getBackgroundNode("The viewer can't display the given photo.") });
-    };
-    BackgroundComponent.prototype._deactivate = function () {
-        return;
-    };
-    BackgroundComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    BackgroundComponent.prototype._getBackgroundNode = function (notice) {
-        // todo: add condition for when to display the DOM node
-        return vd.h("div.BackgroundWrapper", {}, [
-            vd.h("p", { textContent: notice }, []),
-        ]);
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     };
-    BackgroundComponent.componentName = "background";
-    return BackgroundComponent;
-}(Component_1.Component));
-exports.BackgroundComponent = BackgroundComponent;
-Component_1.ComponentService.register(BackgroundComponent);
-exports.default = BackgroundComponent;
-
-},{"../Component":226,"virtual-dom":182}],241:[function(require,module,exports){
-"use strict";
-/// <reference path="../../typings/index.d.ts" />
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -20563,785 +32337,626 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var vd = require("virtual-dom");
-var Observable_1 = require("rxjs/Observable");
-var Component_1 = require("../Component");
-var Geo_1 = require("../Geo");
-var BearingComponent = (function (_super) {
-    __extends(BearingComponent, _super);
-    function BearingComponent(name, container, navigator) {
+exports.ImagePlaneComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+var Viewer_1 = require("../../Viewer");
+var Render_1 = require("../../Render");
+var Tiles_1 = require("../../Tiles");
+var Utils_1 = require("../../Utils");
+var ViewportCoords_1 = require("../../geo/ViewportCoords");
+var Spatial_1 = require("../../geo/Spatial");
+var ImagePlaneComponent = /** @class */ (function (_super) {
+    __extends(ImagePlaneComponent, _super);
+    function ImagePlaneComponent(name, container, navigator) {
         var _this = _super.call(this, name, container, navigator) || this;
-        _this._spatial = new Geo_1.Spatial();
-        _this._svgNamespace = "http://www.w3.org/2000/svg";
-        _this._distinctThreshold = Math.PI / 90;
+        _this._imageTileLoader = new Tiles_1.ImageTileLoader(Utils_1.Urls.tileScheme, Utils_1.Urls.tileDomain, Utils_1.Urls.origin);
+        _this._roiCalculator = new Tiles_1.RegionOfInterestCalculator();
+        _this._rendererOperation$ = new rxjs_1.Subject();
+        _this._rendererCreator$ = new rxjs_1.Subject();
+        _this._rendererDisposer$ = new rxjs_1.Subject();
+        _this._renderer$ = _this._rendererOperation$.pipe(operators_1.scan(function (renderer, operation) {
+            return operation(renderer);
+        }, null), operators_1.filter(function (renderer) {
+            return renderer != null;
+        }), operators_1.distinctUntilChanged(undefined, function (renderer) {
+            return renderer.frameId;
+        }));
+        _this._rendererCreator$.pipe(operators_1.map(function () {
+            return function (renderer) {
+                if (renderer != null) {
+                    throw new Error("Multiple image plane states can not be created at the same time");
+                }
+                return new Component_1.ImagePlaneGLRenderer();
+            };
+        }))
+            .subscribe(_this._rendererOperation$);
+        _this._rendererDisposer$.pipe(operators_1.map(function () {
+            return function (renderer) {
+                renderer.dispose();
+                return null;
+            };
+        }))
+            .subscribe(_this._rendererOperation$);
         return _this;
     }
-    BearingComponent.prototype._activate = function () {
+    ImagePlaneComponent.prototype._activate = function () {
         var _this = this;
-        var nodeBearingFov$ = this._navigator.stateService.currentState$
-            .distinctUntilChanged(undefined, function (frame) {
+        this._rendererSubscription = this._renderer$.pipe(operators_1.map(function (renderer) {
+            var renderHash = {
+                name: _this._name,
+                render: {
+                    frameId: renderer.frameId,
+                    needsRender: renderer.needsRender,
+                    render: renderer.render.bind(renderer),
+                    stage: Render_1.GLRenderStage.Background,
+                },
+            };
+            renderer.clearNeedsRender();
+            return renderHash;
+        }))
+            .subscribe(this._container.glRenderer.render$);
+        this._rendererCreator$.next(null);
+        this._stateSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return function (renderer) {
+                renderer.updateFrame(frame);
+                return renderer;
+            };
+        }))
+            .subscribe(this._rendererOperation$);
+        var textureProvider$ = this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
             return frame.state.currentNode.key;
-        })
-            .map(function (frame) {
-            var node = frame.state.currentNode;
-            var transform = frame.state.currentTransform;
-            if (node.pano) {
-                var hFov_1 = 2 * Math.PI * node.gpano.CroppedAreaImageWidthPixels / node.gpano.FullPanoWidthPixels;
-                return [_this._spatial.degToRad(node.ca), hFov_1];
-            }
-            var size = Math.max(transform.basicWidth, transform.basicHeight);
-            if (size <= 0) {
-                console.warn("Original image size (" + transform.basicWidth + ", " + transform.basicHeight + ") is invalid (" + node.key + ". " +
-                    "Not showing available fov.");
-            }
-            var hFov = size > 0 ?
-                2 * Math.atan(0.5 * transform.basicWidth / (size * transform.focal)) :
-                0;
-            return [_this._spatial.degToRad(node.ca), hFov];
-        })
-            .distinctUntilChanged(function (a1, a2) {
-            return Math.abs(a2[0] - a1[0]) < _this._distinctThreshold &&
-                Math.abs(a2[1] - a1[1]) < _this._distinctThreshold;
+        }), operators_1.withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$), operators_1.map(function (_a) {
+            var frame = _a[0], renderer = _a[1], size = _a[2];
+            var state = frame.state;
+            var viewportSize = Math.max(size.width, size.height);
+            var currentNode = state.currentNode;
+            var currentTransform = state.currentTransform;
+            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
+            return new Tiles_1.TextureProvider(currentNode.key, currentTransform.basicWidth, currentTransform.basicHeight, tileSize, currentNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer);
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._textureProviderSubscription = textureProvider$.subscribe(function () { });
+        this._setTextureProviderSubscription = textureProvider$.pipe(operators_1.map(function (provider) {
+            return function (renderer) {
+                renderer.setTextureProvider(provider.key, provider);
+                return renderer;
+            };
+        }))
+            .subscribe(this._rendererOperation$);
+        this._setTileSizeSubscription = this._container.renderService.size$.pipe(operators_1.switchMap(function (size) {
+            return rxjs_1.combineLatest(textureProvider$, rxjs_1.of(size)).pipe(operators_1.first());
+        }))
+            .subscribe(function (_a) {
+            var provider = _a[0], size = _a[1];
+            var viewportSize = Math.max(size.width, size.height);
+            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
+            provider.setTileSize(tileSize);
         });
-        var cameraBearingFov$ = this._container.renderService.renderCamera$
-            .map(function (rc) {
-            var vFov = _this._spatial.degToRad(rc.perspective.fov);
-            var hFov = rc.perspective.aspect === Number.POSITIVE_INFINITY ?
-                Math.PI :
-                Math.atan(rc.perspective.aspect * Math.tan(0.5 * vFov)) * 2;
-            return [_this._spatial.azimuthalToBearing(rc.rotation.phi), hFov];
-        })
-            .distinctUntilChanged(function (a1, a2) {
-            return Math.abs(a2[0] - a1[0]) < _this._distinctThreshold &&
-                Math.abs(a2[1] - a1[1]) < _this._distinctThreshold;
+        this._abortTextureProviderSubscription = textureProvider$.pipe(operators_1.pairwise())
+            .subscribe(function (pair) {
+            var previous = pair[0];
+            previous.abort();
         });
-        this._renderSubscription = Observable_1.Observable
-            .combineLatest(nodeBearingFov$, cameraBearingFov$)
-            .map(function (args) {
-            var background = vd.h("div.BearingIndicatorBackground", { oncontextmenu: function (event) { event.preventDefault(); } }, [
-                vd.h("div.BearingIndicatorBackgroundRectangle", {}, []),
-                vd.h("div.BearingIndicatorBackgroundCircle", {}, []),
-            ]);
-            var north = vd.h("div.BearingIndicatorNorth", {}, []);
-            var nodeSector = _this._createCircleSector(args[0][0], args[0][1], "#000");
-            var cameraSector = _this._createCircleSector(args[1][0], args[1][1], "#fff");
-            var compass = _this._createCircleSectorCompass(nodeSector, cameraSector);
-            return {
-                name: _this._name,
-                vnode: vd.h("div.BearingIndicator", {}, [
-                    background,
-                    north,
-                    compass,
-                ]),
+        var roiTrigger$ = rxjs_1.combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.pipe(operators_1.debounceTime(250))).pipe(operators_1.map(function (_a) {
+            var camera = _a[0], size = _a[1];
+            return [
+                camera.camera.position.clone(),
+                camera.camera.lookat.clone(),
+                camera.zoom.valueOf(),
+                size.height.valueOf(),
+                size.width.valueOf()
+            ];
+        }), operators_1.pairwise(), operators_1.skipWhile(function (pls) {
+            return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0;
+        }), operators_1.map(function (pls) {
+            var samePosition = pls[0][0].equals(pls[1][0]);
+            var sameLookat = pls[0][1].equals(pls[1][1]);
+            var sameZoom = pls[0][2] === pls[1][2];
+            var sameHeight = pls[0][3] === pls[1][3];
+            var sameWidth = pls[0][4] === pls[1][4];
+            return samePosition && sameLookat && sameZoom && sameHeight && sameWidth;
+        }), operators_1.distinctUntilChanged(), operators_1.filter(function (stalled) {
+            return stalled;
+        }), operators_1.switchMap(function (stalled) {
+            return _this._container.renderService.renderCameraFrame$.pipe(operators_1.first());
+        }), operators_1.withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$));
+        this._setRegionOfInterestSubscription = textureProvider$.pipe(operators_1.switchMap(function (provider) {
+            return roiTrigger$.pipe(operators_1.map(function (_a) {
+                var camera = _a[0], size = _a[1], transform = _a[2];
+                var basic = new ViewportCoords_1.default().viewportToBasic(0, 0, transform, camera.perspective);
+                if (basic[0] < 0 || basic[1] < 0 || basic[0] > 1 || basic[1] > 1) {
+                    return undefined;
+                }
+                return [
+                    _this._roiCalculator.computeRegionOfInterest(camera, size, transform),
+                    provider,
+                ];
+            }), operators_1.filter(function (args) {
+                return !!args;
+            }));
+        }), operators_1.filter(function (args) {
+            return !args[1].disposed;
+        }))
+            .subscribe(function (args) {
+            var roi = args[0];
+            var provider = args[1];
+            provider.setRegionOfInterest(roi);
+        });
+        var hasTexture$ = textureProvider$.pipe(operators_1.switchMap(function (provider) {
+            return provider.hasTexture$;
+        }), operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount());
+        this._hasTextureSubscription = hasTexture$.subscribe(function () { });
+        var nodeImage$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
+            return frame.state.nodesAhead === 0;
+        }), operators_1.map(function (frame) {
+            return frame.state.currentNode;
+        }), operators_1.distinctUntilChanged(undefined, function (node) {
+            return node.key;
+        }), operators_1.debounceTime(1000), operators_1.withLatestFrom(hasTexture$), operators_1.filter(function (args) {
+            return !args[1];
+        }), operators_1.map(function (args) {
+            return args[0];
+        }), operators_1.filter(function (node) {
+            return node.pano ?
+                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
+                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
+        }), operators_1.switchMap(function (node) {
+            var baseImageSize = node.pano ?
+                Utils_1.Settings.basePanoramaSize :
+                Utils_1.Settings.baseImageSize;
+            if (Math.max(node.image.width, node.image.height) > baseImageSize) {
+                return rxjs_1.empty();
+            }
+            var image$ = node
+                .cacheImage$(Utils_1.Settings.maxImageSize).pipe(operators_1.map(function (n) {
+                return [n.image, n];
+            }));
+            return image$.pipe(operators_1.takeUntil(hasTexture$.pipe(operators_1.filter(function (hasTexture) {
+                return hasTexture;
+            }))), operators_1.catchError(function (error, caught) {
+                console.error("Failed to fetch high res image (" + node.key + ")", error);
+                return rxjs_1.empty();
+            }));
+        })).pipe(operators_1.publish(), operators_1.refCount());
+        this._updateBackgroundSubscription = nodeImage$.pipe(operators_1.withLatestFrom(textureProvider$))
+            .subscribe(function (args) {
+            if (args[0][1].key !== args[1].key ||
+                args[1].disposed) {
+                return;
+            }
+            args[1].updateBackground(args[0][0]);
+        });
+        this._updateTextureImageSubscription = nodeImage$.pipe(operators_1.map(function (imn) {
+            return function (renderer) {
+                renderer.updateTextureImage(imn[0], imn[1]);
+                return renderer;
             };
-        })
-            .subscribe(this._container.domRenderer.render$);
-    };
-    BearingComponent.prototype._deactivate = function () {
-        this._renderSubscription.unsubscribe();
-    };
-    BearingComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    BearingComponent.prototype._createCircleSectorCompass = function (nodeSector, cameraSector) {
-        var group = vd.h("g", {
-            attributes: { transform: "translate(1,1)" },
-            namespace: this._svgNamespace,
-        }, [nodeSector, cameraSector]);
-        var centerCircle = vd.h("circle", {
-            attributes: {
-                cx: "1",
-                cy: "1",
-                fill: "#abb1b9",
-                r: "0.291667",
-                stroke: "#000",
-                "stroke-width": "0.0833333",
-            },
-            namespace: this._svgNamespace,
-        }, []);
-        var svg = vd.h("svg", {
-            attributes: { viewBox: "0 0 2 2" },
-            namespace: this._svgNamespace,
-            style: {
-                bottom: "4px",
-                height: "48px",
-                left: "4px",
-                position: "absolute",
-                width: "48px",
-            },
-        }, [group, centerCircle]);
-        return svg;
-    };
-    BearingComponent.prototype._createCircleSector = function (bearing, fov, fill) {
-        if (fov > 2 * Math.PI - Math.PI / 90) {
-            return vd.h("circle", {
-                attributes: { cx: "0", cy: "0", fill: fill, r: "1" },
-                namespace: this._svgNamespace,
-            }, []);
-        }
-        var arcStart = bearing - fov / 2 - Math.PI / 2;
-        var arcEnd = arcStart + fov;
-        var startX = Math.cos(arcStart);
-        var startY = Math.sin(arcStart);
-        var endX = Math.cos(arcEnd);
-        var endY = Math.sin(arcEnd);
-        var largeArc = fov >= Math.PI ? 1 : 0;
-        var description = "M 0 0 " + startX + " " + startY + " A 1 1 0 " + largeArc + " 1 " + endX + " " + endY;
-        return vd.h("path", {
-            attributes: { d: description, fill: fill },
-            namespace: this._svgNamespace,
-        }, []);
-    };
-    BearingComponent.componentName = "bearing";
-    return BearingComponent;
-}(Component_1.Component));
-exports.BearingComponent = BearingComponent;
-Component_1.ComponentService.register(BearingComponent);
-exports.default = BearingComponent;
-
-},{"../Component":226,"../Geo":229,"rxjs/Observable":29,"virtual-dom":182}],242:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/observable/from");
-require("rxjs/add/observable/merge");
-require("rxjs/add/observable/of");
-require("rxjs/add/observable/zip");
-require("rxjs/add/operator/catch");
-require("rxjs/add/operator/combineLatest");
-require("rxjs/add/operator/distinct");
-require("rxjs/add/operator/expand");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/mergeAll");
-require("rxjs/add/operator/skip");
-require("rxjs/add/operator/switchMap");
-var Edge_1 = require("../Edge");
-var Component_1 = require("../Component");
-var CacheComponent = (function (_super) {
-    __extends(CacheComponent, _super);
-    function CacheComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    /**
-     * Set the cache depth.
-     *
-     * Configures the cache depth. The cache depth can be different for
-     * different edge direction types.
-     *
-     * @param {ICacheDepth} depth - Cache depth structure.
-     */
-    CacheComponent.prototype.setDepth = function (depth) {
-        this.configure({ depth: depth });
-    };
-    CacheComponent.prototype._activate = function () {
-        var _this = this;
-        this._sequenceSubscription = Observable_1.Observable
-            .combineLatest(this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
-            return node.sequenceEdges$;
-        })
-            .filter(function (status) {
-            return status.cached;
-        }), this._configuration$)
-            .switchMap(function (nc) {
-            var status = nc[0];
-            var configuration = nc[1];
-            var sequenceDepth = Math.max(0, Math.min(4, configuration.depth.sequence));
-            var next$ = _this._cache$(status.edges, Edge_1.EdgeDirection.Next, sequenceDepth);
-            var prev$ = _this._cache$(status.edges, Edge_1.EdgeDirection.Prev, sequenceDepth);
-            return Observable_1.Observable
-                .merge(next$, prev$)
-                .catch(function (error, caught) {
-                console.error("Failed to cache sequence edges.", error);
-                return Observable_1.Observable.empty();
-            });
-        })
-            .subscribe(function () { });
-        this._spatialSubscription = this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
-            return Observable_1.Observable
-                .combineLatest(Observable_1.Observable.of(node), node.spatialEdges$
-                .filter(function (status) {
-                return status.cached;
+        }))
+            .subscribe(this._rendererOperation$);
+        this._clearPeripheryPlaneSubscription = this._navigator.panService.panNodes$.pipe(operators_1.filter(function (panNodes) {
+            return panNodes.length === 0;
+        }), operators_1.map(function () {
+            return function (renderer) {
+                renderer.clearPeripheryPlanes();
+                return renderer;
+            };
+        }))
+            .subscribe(this._rendererOperation$);
+        var cachedPanNodes$ = this._navigator.panService.panNodes$.pipe(operators_1.switchMap(function (nts) {
+            return rxjs_1.from(nts).pipe(operators_1.mergeMap(function (_a) {
+                var n = _a[0], t = _a[1];
+                return rxjs_1.combineLatest(_this._navigator.graphService.cacheNode$(n.key).pipe(operators_1.catchError(function (error) {
+                    console.error("Failed to cache periphery node (" + n.key + ")", error);
+                    return rxjs_1.empty();
+                })), rxjs_1.of(t));
             }));
-        })
-            .combineLatest(this._configuration$, function (ns, configuration) {
-            return [ns[0], ns[1], configuration];
-        })
-            .switchMap(function (args) {
-            var node = args[0];
-            var edges = args[1].edges;
-            var depth = args[2].depth;
-            var panoDepth = Math.max(0, Math.min(2, depth.pano));
-            var stepDepth = node.pano ? 0 : Math.max(0, Math.min(3, depth.step));
-            var turnDepth = node.pano ? 0 : Math.max(0, Math.min(1, depth.turn));
-            var pano$ = _this._cache$(edges, Edge_1.EdgeDirection.Pano, panoDepth);
-            var forward$ = _this._cache$(edges, Edge_1.EdgeDirection.StepForward, stepDepth);
-            var backward$ = _this._cache$(edges, Edge_1.EdgeDirection.StepBackward, stepDepth);
-            var left$ = _this._cache$(edges, Edge_1.EdgeDirection.StepLeft, stepDepth);
-            var right$ = _this._cache$(edges, Edge_1.EdgeDirection.StepRight, stepDepth);
-            var turnLeft$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnLeft, turnDepth);
-            var turnRight$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnRight, turnDepth);
-            var turnU$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnU, turnDepth);
-            return Observable_1.Observable
-                .merge(forward$, backward$, left$, right$, pano$, turnLeft$, turnRight$, turnU$)
-                .catch(function (error, caught) {
-                console.error("Failed to cache spatial edges.", error);
-                return Observable_1.Observable.empty();
-            });
-        })
-            .subscribe(function () { });
-    };
-    CacheComponent.prototype._deactivate = function () {
-        this._sequenceSubscription.unsubscribe();
-        this._spatialSubscription.unsubscribe();
-    };
-    CacheComponent.prototype._getDefaultConfiguration = function () {
-        return { depth: { pano: 1, sequence: 2, step: 1, turn: 0 } };
-    };
-    CacheComponent.prototype._cache$ = function (edges, direction, depth) {
-        var _this = this;
-        return Observable_1.Observable
-            .zip(Observable_1.Observable.of(edges), Observable_1.Observable.of(depth))
-            .expand(function (ed) {
-            var es = ed[0];
-            var d = ed[1];
-            var edgesDepths$ = [];
-            if (d > 0) {
-                for (var _i = 0, es_1 = es; _i < es_1.length; _i++) {
-                    var edge = es_1[_i];
-                    if (edge.data.direction === direction) {
-                        edgesDepths$.push(Observable_1.Observable
-                            .zip(_this._navigator.graphService.cacheNode$(edge.to)
-                            .mergeMap(function (n) {
-                            return _this._nodeToEdges$(n, direction);
-                        }), Observable_1.Observable.of(d - 1)));
-                    }
+        }), operators_1.share());
+        this._addPeripheryPlaneSubscription = cachedPanNodes$.pipe(operators_1.map(function (_a) {
+            var n = _a[0], t = _a[1];
+            return function (renderer) {
+                renderer.addPeripheryPlane(n, t);
+                return renderer;
+            };
+        }))
+            .subscribe(this._rendererOperation$);
+        this._updatePeripheryPlaneTextureSubscription = cachedPanNodes$.pipe(operators_1.mergeMap(function (_a) {
+            var n = _a[0];
+            return Viewer_1.ImageSize.Size2048 > Math.max(n.image.width, n.image.height) ?
+                n.cacheImage$(Viewer_1.ImageSize.Size2048).pipe(operators_1.catchError(function () {
+                    return rxjs_1.empty();
+                })) :
+                rxjs_1.empty();
+        }), operators_1.map(function (n) {
+            return function (renderer) {
+                renderer.updateTextureImage(n.image, n);
+                return renderer;
+            };
+        }))
+            .subscribe(this._rendererOperation$);
+        var inTransition$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state.alpha < 1;
+        }), operators_1.distinctUntilChanged());
+        var panTrigger$ = rxjs_1.combineLatest(this._container.mouseService.active$, this._container.touchService.active$, this._navigator.stateService.inMotion$, inTransition$).pipe(operators_1.map(function (_a) {
+            var mouseActive = _a[0], touchActive = _a[1], inMotion = _a[2], inTransition = _a[3];
+            return !(mouseActive || touchActive || inMotion || inTransition);
+        }), operators_1.filter(function (trigger) {
+            return trigger;
+        }));
+        this._moveToPeripheryNodeSubscription = this._navigator.panService.panNodes$.pipe(operators_1.switchMap(function (nts) {
+            return panTrigger$.pipe(operators_1.withLatestFrom(_this._container.renderService.renderCamera$, _this._navigator.stateService.currentNode$, _this._navigator.stateService.currentTransform$), operators_1.mergeMap(function (_a) {
+                var renderCamera = _a[1], currentNode = _a[2], currentTransform = _a[3];
+                return rxjs_1.of([
+                    renderCamera,
+                    currentNode,
+                    currentTransform,
+                    nts,
+                ]);
+            }));
+        }), operators_1.switchMap(function (_a) {
+            var camera = _a[0], cn = _a[1], ct = _a[2], nts = _a[3];
+            var direction = camera.camera.lookat.clone().sub(camera.camera.position);
+            var cd = new Spatial_1.default().viewingDirection(cn.rotation);
+            var ca = cd.angleTo(direction);
+            var closest = [ca, undefined];
+            var basic = new ViewportCoords_1.default().viewportToBasic(0, 0, ct, camera.perspective);
+            if (basic[0] >= 0 && basic[0] <= 1 && basic[1] >= 0 && basic[1] <= 1) {
+                closest[0] = Number.NEGATIVE_INFINITY;
+            }
+            for (var _i = 0, nts_1 = nts; _i < nts_1.length; _i++) {
+                var n = nts_1[_i][0];
+                var d = new Spatial_1.default().viewingDirection(n.rotation);
+                var a = d.angleTo(direction);
+                if (a < closest[0]) {
+                    closest[0] = a;
+                    closest[1] = n.key;
                 }
             }
-            return Observable_1.Observable
-                .from(edgesDepths$)
-                .mergeAll();
-        })
-            .skip(1);
+            if (!closest[1]) {
+                return rxjs_1.empty();
+            }
+            return _this._navigator.moveToKey$(closest[1]).pipe(operators_1.catchError(function () {
+                return rxjs_1.empty();
+            }));
+        }))
+            .subscribe();
     };
-    CacheComponent.prototype._nodeToEdges$ = function (node, direction) {
-        return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
-            node.sequenceEdges$ :
-            node.spatialEdges$)
-            .first(function (status) {
-            return status.cached;
-        })
-            .map(function (status) {
-            return status.edges;
-        });
+    ImagePlaneComponent.prototype._deactivate = function () {
+        this._rendererDisposer$.next(null);
+        this._abortTextureProviderSubscription.unsubscribe();
+        this._hasTextureSubscription.unsubscribe();
+        this._rendererSubscription.unsubscribe();
+        this._setRegionOfInterestSubscription.unsubscribe();
+        this._setTextureProviderSubscription.unsubscribe();
+        this._setTileSizeSubscription.unsubscribe();
+        this._stateSubscription.unsubscribe();
+        this._textureProviderSubscription.unsubscribe();
+        this._updateBackgroundSubscription.unsubscribe();
+        this._updateTextureImageSubscription.unsubscribe();
+        this._clearPeripheryPlaneSubscription.unsubscribe();
+        this._addPeripheryPlaneSubscription.unsubscribe();
+        this._updatePeripheryPlaneTextureSubscription.unsubscribe();
+        this._moveToPeripheryNodeSubscription.unsubscribe();
     };
-    CacheComponent.componentName = "cache";
-    return CacheComponent;
+    ImagePlaneComponent.prototype._getDefaultConfiguration = function () {
+        return {};
+    };
+    ImagePlaneComponent.componentName = "imagePlane";
+    return ImagePlaneComponent;
 }(Component_1.Component));
-exports.CacheComponent = CacheComponent;
-Component_1.ComponentService.register(CacheComponent);
-exports.default = CacheComponent;
+exports.ImagePlaneComponent = ImagePlaneComponent;
+Component_1.ComponentService.register(ImagePlaneComponent);
+exports.default = ImagePlaneComponent;
 
-},{"../Component":226,"../Edge":227,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/from":41,"rxjs/add/observable/merge":44,"rxjs/add/observable/of":45,"rxjs/add/observable/zip":48,"rxjs/add/operator/catch":52,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinct":57,"rxjs/add/operator/expand":60,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeAll":67,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/skip":75,"rxjs/add/operator/switchMap":79}],243:[function(require,module,exports){
+},{"../../Component":291,"../../Render":297,"../../Tiles":300,"../../Utils":301,"../../Viewer":302,"../../geo/Spatial":419,"../../geo/ViewportCoords":421,"rxjs":43,"rxjs/operators":241}],323:[function(require,module,exports){
 "use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
 Object.defineProperty(exports, "__esModule", { value: true });
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/startWith");
-var Utils_1 = require("../Utils");
-var Component = (function (_super) {
-    __extends(Component, _super);
-    function Component(name, container, navigator) {
-        var _this = _super.call(this) || this;
-        _this._activated$ = new BehaviorSubject_1.BehaviorSubject(false);
-        _this._configurationSubject$ = new Subject_1.Subject();
-        _this._activated = false;
-        _this._container = container;
-        _this._name = name;
-        _this._navigator = navigator;
-        _this._configuration$ =
-            _this._configurationSubject$
-                .startWith(_this.defaultConfiguration)
-                .scan(function (conf, newConf) {
-                for (var key in newConf) {
-                    if (newConf.hasOwnProperty(key)) {
-                        conf[key] = newConf[key];
-                    }
-                }
-                return conf;
-            })
-                .publishReplay(1)
-                .refCount();
-        _this._configuration$.subscribe(function () { });
-        return _this;
-    }
-    Object.defineProperty(Component.prototype, "activated", {
-        get: function () {
-            return this._activated;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "activated$", {
-        get: function () {
-            return this._activated$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "defaultConfiguration", {
-        /**
-         * Get default configuration.
-         *
-         * @returns {TConfiguration} Default configuration for component.
-         */
-        get: function () {
-            return this._getDefaultConfiguration();
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "configuration$", {
+exports.ImagePlaneGLRenderer = void 0;
+var Component_1 = require("../../Component");
+var ImagePlaneGLRenderer = /** @class */ (function () {
+    function ImagePlaneGLRenderer() {
+        this._factory = new Component_1.MeshFactory();
+        this._scene = new Component_1.MeshScene();
+        this._alpha = 0;
+        this._alphaOld = 0;
+        this._fadeOutSpeed = 0.05;
+        this._currentKey = null;
+        this._previousKey = null;
+        this._providerDisposers = {};
+        this._frameId = 0;
+        this._needsRender = false;
+    }
+    Object.defineProperty(ImagePlaneGLRenderer.prototype, "frameId", {
         get: function () {
-            return this._configuration$;
+            return this._frameId;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(Component.prototype, "name", {
+    Object.defineProperty(ImagePlaneGLRenderer.prototype, "needsRender", {
         get: function () {
-            return this._name;
+            return this._needsRender;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Component.prototype.activate = function (conf) {
-        if (this._activated) {
-            return;
-        }
-        if (conf !== undefined) {
-            this._configurationSubject$.next(conf);
-        }
-        this._activated = true;
-        this._activate();
-        this._activated$.next(true);
-    };
-    Component.prototype.configure = function (conf) {
-        this._configurationSubject$.next(conf);
+    ImagePlaneGLRenderer.prototype.indicateNeedsRender = function () {
+        this._needsRender = true;
     };
-    Component.prototype.deactivate = function () {
-        if (!this._activated) {
-            return;
-        }
-        this._activated = false;
-        this._deactivate();
-        this._container.domRenderer.clear(this._name);
-        this._container.glRenderer.clear(this._name);
-        this._activated$.next(false);
+    ImagePlaneGLRenderer.prototype.addPeripheryPlane = function (node, transform) {
+        var mesh = this._factory.createMesh(node, transform);
+        var planes = {};
+        planes[node.key] = mesh;
+        this._scene.addPeripheryPlanes(planes);
+        this._needsRender = true;
     };
-    /**
-     * Detect the viewer's new width and height and resize the component's
-     * rendered elements accordingly if applicable.
-     */
-    Component.prototype.resize = function () { return; };
-    /**
-     * Component name. Used when interacting with component through the Viewer's API.
-     */
-    Component.componentName = "not_worthy";
-    return Component;
-}(Utils_1.EventEmitter));
-exports.Component = Component;
-exports.default = Component;
-
-},{"../Utils":235,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/startWith":78}],244:[function(require,module,exports){
-"use strict";
-/// <reference path="../../typings/index.d.ts" />
-Object.defineProperty(exports, "__esModule", { value: true });
-var _ = require("underscore");
-var Error_1 = require("../Error");
-var ComponentService = (function () {
-    function ComponentService(container, navigator) {
-        this._components = {};
-        this._container = container;
-        this._navigator = navigator;
-        for (var _i = 0, _a = _.values(ComponentService.registeredComponents); _i < _a.length; _i++) {
-            var component = _a[_i];
-            this._components[component.componentName] = {
-                active: false,
-                component: new component(component.componentName, container, navigator),
-            };
-        }
-        this._coverComponent = new ComponentService.registeredCoverComponent("cover", container, navigator);
-        this._coverComponent.activate();
-        this._coverActivated = true;
-    }
-    ComponentService.register = function (component) {
-        if (ComponentService.registeredComponents[component.componentName] === undefined) {
-            ComponentService.registeredComponents[component.componentName] = component;
-        }
+    ImagePlaneGLRenderer.prototype.clearPeripheryPlanes = function () {
+        this._scene.setPeripheryPlanes({});
+        this._needsRender = true;
     };
-    ComponentService.registerCover = function (coverComponent) {
-        ComponentService.registeredCoverComponent = coverComponent;
+    ImagePlaneGLRenderer.prototype.updateFrame = function (frame) {
+        this._updateFrameId(frame.id);
+        this._needsRender = this._updateAlpha(frame.state.alpha) || this._needsRender;
+        this._needsRender = this._updateAlphaOld(frame.state.alpha) || this._needsRender;
+        this._needsRender = this._updateImagePlanes(frame.state) || this._needsRender;
     };
-    ComponentService.prototype.activateCover = function () {
-        if (this._coverActivated) {
+    ImagePlaneGLRenderer.prototype.setTextureProvider = function (key, provider) {
+        var _this = this;
+        if (key !== this._currentKey) {
             return;
         }
-        this._coverActivated = true;
-        for (var _i = 0, _a = _.values(this._components); _i < _a.length; _i++) {
-            var component = _a[_i];
-            if (component.active) {
-                component.component.deactivate();
-            }
+        var createdSubscription = provider.textureCreated$
+            .subscribe(function (texture) {
+            _this._updateTexture(texture);
+        });
+        var updatedSubscription = provider.textureUpdated$
+            .subscribe(function (updated) {
+            _this._needsRender = true;
+        });
+        var dispose = function () {
+            createdSubscription.unsubscribe();
+            updatedSubscription.unsubscribe();
+            provider.dispose();
+        };
+        if (key in this._providerDisposers) {
+            var disposeProvider = this._providerDisposers[key];
+            disposeProvider();
+            delete this._providerDisposers[key];
         }
-        return;
+        this._providerDisposers[key] = dispose;
     };
-    ComponentService.prototype.deactivateCover = function () {
-        if (!this._coverActivated) {
-            return;
-        }
-        this._coverActivated = false;
-        for (var _i = 0, _a = _.values(this._components); _i < _a.length; _i++) {
-            var component = _a[_i];
-            if (component.active) {
-                component.component.activate();
+    ImagePlaneGLRenderer.prototype.updateTextureImage = function (image, node) {
+        this._needsRender = true;
+        var planes = this._extend({}, this._scene.planes, this._scene.planesOld, this._scene.planesPeriphery);
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
             }
-        }
-        return;
-    };
-    ComponentService.prototype.activate = function (name) {
-        this._checkName(name);
-        this._components[name].active = true;
-        if (!this._coverActivated) {
-            this.get(name).activate();
-        }
-    };
-    ComponentService.prototype.configure = function (name, conf) {
-        this._checkName(name);
-        this.get(name).configure(conf);
-    };
-    ComponentService.prototype.deactivate = function (name) {
-        this._checkName(name);
-        this._components[name].active = false;
-        if (!this._coverActivated) {
-            this.get(name).deactivate();
+            if (key !== node.key) {
+                continue;
+            }
+            var plane = planes[key];
+            var material = plane.material;
+            var texture = material.uniforms.projectorTex.value;
+            texture.image = image;
+            texture.needsUpdate = true;
         }
     };
-    ComponentService.prototype.resize = function () {
-        for (var _i = 0, _a = _.values(this._components); _i < _a.length; _i++) {
-            var component = _a[_i];
-            component.component.resize();
+    ImagePlaneGLRenderer.prototype.render = function (perspectiveCamera, renderer) {
+        var planes = this._scene.planes;
+        var planesOld = this._scene.planesOld;
+        var planesPeriphery = this._scene.planesPeriphery;
+        var planeAlpha = Object.keys(planesOld).length ? 1 : this._alpha;
+        var peripheryAlpha = Object.keys(planesOld).length ? 1 : Math.floor(this._alpha);
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            plane.material.uniforms.opacity.value = planeAlpha;
         }
-    };
-    ComponentService.prototype.get = function (name) {
-        return this._components[name].component;
-    };
-    ComponentService.prototype.getCover = function () {
-        return this._coverComponent;
-    };
-    ComponentService.prototype._checkName = function (name) {
-        if (!(name in this._components)) {
-            throw new Error_1.ArgumentMapillaryError("Component does not exist: " + name);
+        for (var key in planesOld) {
+            if (!planesOld.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planesOld[key];
+            plane.material.uniforms.opacity.value = this._alphaOld;
         }
-    };
-    ComponentService.registeredComponents = {};
-    return ComponentService;
-}());
-exports.ComponentService = ComponentService;
-exports.default = ComponentService;
-
-},{"../Error":228,"underscore":178}],245:[function(require,module,exports){
-"use strict";
-/// <reference path="../../typings/index.d.ts" />
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var vd = require("virtual-dom");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/withLatestFrom");
-var Component_1 = require("../Component");
-var CoverComponent = (function (_super) {
-    __extends(CoverComponent, _super);
-    function CoverComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    CoverComponent.prototype._activate = function () {
-        var _this = this;
-        this._keyDisposable = this._navigator.stateService.currentNode$
-            .withLatestFrom(this._configuration$, function (node, configuration) {
-            return [node, configuration];
-        })
-            .filter(function (nc) {
-            return nc[0].key !== nc[1].key;
-        })
-            .map(function (nc) { return nc[0]; })
-            .map(function (node) {
-            return { key: node.key, src: node.image.src };
-        })
-            .subscribe(this._configurationSubject$);
-        this._disposable = this._configuration$
-            .map(function (conf) {
-            if (!conf.key) {
-                return { name: _this._name, vnode: vd.h("div", []) };
+        for (var key in planesPeriphery) {
+            if (!planesPeriphery.hasOwnProperty(key)) {
+                continue;
             }
-            if (!conf.visible) {
-                return { name: _this._name, vnode: vd.h("div.Cover.CoverDone", [_this._getCoverBackgroundVNode(conf)]) };
+            var plane = planesPeriphery[key];
+            plane.material.uniforms.opacity.value = peripheryAlpha;
+        }
+        renderer.render(this._scene.scenePeriphery, perspectiveCamera);
+        renderer.render(this._scene.scene, perspectiveCamera);
+        renderer.render(this._scene.sceneOld, perspectiveCamera);
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
             }
-            return { name: _this._name, vnode: _this._getCoverButtonVNode(conf) };
-        })
-            .subscribe(this._container.domRenderer.render$);
+            var plane = planes[key];
+            plane.material.uniforms.opacity.value = this._alpha;
+        }
+        renderer.render(this._scene.scene, perspectiveCamera);
     };
-    CoverComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-        this._keyDisposable.unsubscribe();
+    ImagePlaneGLRenderer.prototype.clearNeedsRender = function () {
+        this._needsRender = false;
     };
-    CoverComponent.prototype._getDefaultConfiguration = function () {
-        return { "loading": false, "visible": true };
+    ImagePlaneGLRenderer.prototype.dispose = function () {
+        this._scene.clear();
     };
-    CoverComponent.prototype._getCoverButtonVNode = function (conf) {
-        var _this = this;
-        var cover = conf.loading ? "div.Cover.CoverLoading" : "div.Cover";
-        return vd.h(cover, [
-            this._getCoverBackgroundVNode(conf),
-            vd.h("button.CoverButton", { onclick: function () { _this.configure({ loading: true }); } }, ["Explore"]),
-            vd.h("a.CoverLogo", { href: "https://www.mapillary.com", target: "_blank" }, []),
-        ]);
+    ImagePlaneGLRenderer.prototype._updateFrameId = function (frameId) {
+        this._frameId = frameId;
     };
-    CoverComponent.prototype._getCoverBackgroundVNode = function (conf) {
-        var url = conf.src != null ?
-            "url(" + conf.src + ")" :
-            "url(https://d1cuyjsrcm0gby.cloudfront.net/" + conf.key + "/thumb-640.jpg)";
-        var properties = { style: { backgroundImage: url } };
-        var children = [];
-        if (conf.loading) {
-            children.push(vd.h("div.Spinner", {}, []));
+    ImagePlaneGLRenderer.prototype._updateAlpha = function (alpha) {
+        if (alpha === this._alpha) {
+            return false;
         }
-        children.push(vd.h("div.CoverBackgroundGradient", {}, []));
-        return vd.h("div.CoverBackground", properties, children);
-    };
-    CoverComponent.componentName = "cover";
-    return CoverComponent;
-}(Component_1.Component));
-exports.CoverComponent = CoverComponent;
-Component_1.ComponentService.registerCover(CoverComponent);
-exports.default = CoverComponent;
-
-},{"../Component":226,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/withLatestFrom":83,"virtual-dom":182}],246:[function(require,module,exports){
-"use strict";
-/// <reference path="../../typings/index.d.ts" />
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var _ = require("underscore");
-var vd = require("virtual-dom");
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-require("rxjs/add/operator/combineLatest");
-var Component_1 = require("../Component");
-var DebugComponent = (function (_super) {
-    __extends(DebugComponent, _super);
-    function DebugComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._open$ = new BehaviorSubject_1.BehaviorSubject(false);
-        _this._displaying = false;
-        return _this;
-    }
-    DebugComponent.prototype._activate = function () {
-        var _this = this;
-        this._disposable = this._navigator.stateService.currentState$
-            .combineLatest(this._open$, this._navigator.imageLoadingService.loadstatus$, function (frame, open, loadStatus) {
-            return { name: _this._name, vnode: _this._getDebugVNode(open, _this._getDebugInfo(frame, loadStatus)) };
-        })
-            .subscribe(this._container.domRenderer.render$);
-    };
-    DebugComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
+        this._alpha = alpha;
+        return true;
     };
-    DebugComponent.prototype._getDefaultConfiguration = function () {
-        return {};
+    ImagePlaneGLRenderer.prototype._updateAlphaOld = function (alpha) {
+        if (alpha < 1 || this._alphaOld === 0) {
+            return false;
+        }
+        this._alphaOld = Math.max(0, this._alphaOld - this._fadeOutSpeed);
+        return true;
     };
-    DebugComponent.prototype._getDebugInfo = function (frame, loadStatus) {
-        var ret = [];
-        ret.push(vd.h("h2", "Node"));
-        if (frame.state.currentNode) {
-            ret.push(vd.h("p", "currentNode: " + frame.state.currentNode.key));
+    ImagePlaneGLRenderer.prototype._updateImagePlanes = function (state) {
+        if (state.currentNode == null || state.currentNode.key === this._currentKey) {
+            return false;
         }
-        if (frame.state.previousNode) {
-            ret.push(vd.h("p", "previousNode: " + frame.state.previousNode.key));
+        var previousKey = state.previousNode != null ? state.previousNode.key : null;
+        var currentKey = state.currentNode.key;
+        if (this._previousKey !== previousKey &&
+            this._previousKey !== currentKey &&
+            this._previousKey in this._providerDisposers) {
+            var disposeProvider = this._providerDisposers[this._previousKey];
+            disposeProvider();
+            delete this._providerDisposers[this._previousKey];
         }
-        ret.push(vd.h("h2", "Loading"));
-        var total = 0;
-        var loaded = 0;
-        var loading = 0;
-        for (var _i = 0, _a = _.values(loadStatus); _i < _a.length; _i++) {
-            var loadStat = _a[_i];
-            total += loadStat.loaded;
-            if (loadStat.loaded !== loadStat.total) {
-                loading++;
-            }
-            else {
-                loaded++;
+        if (previousKey != null) {
+            if (previousKey !== this._currentKey && previousKey !== this._previousKey) {
+                var previousMesh = this._factory.createMesh(state.previousNode, state.previousTransform);
+                var previousPlanes = {};
+                previousPlanes[previousKey] = previousMesh;
+                this._scene.updateImagePlanes(previousPlanes);
             }
+            this._previousKey = previousKey;
         }
-        ret.push(vd.h("p", "Loaded Images: " + loaded));
-        ret.push(vd.h("p", "Loading Images: " + loading));
-        ret.push(vd.h("p", "Total bytes loaded: " + total));
-        ret.push(vd.h("h2", "Camera"));
-        ret.push(vd.h("p", "camera.position.x: " + frame.state.camera.position.x));
-        ret.push(vd.h("p", "camera.position.y: " + frame.state.camera.position.y));
-        ret.push(vd.h("p", "camera.position.z: " + frame.state.camera.position.z));
-        ret.push(vd.h("p", "camera.lookat.x: " + frame.state.camera.lookat.x));
-        ret.push(vd.h("p", "camera.lookat.y: " + frame.state.camera.lookat.y));
-        ret.push(vd.h("p", "camera.lookat.z: " + frame.state.camera.lookat.z));
-        ret.push(vd.h("p", "camera.up.x: " + frame.state.camera.up.x));
-        ret.push(vd.h("p", "camera.up.y: " + frame.state.camera.up.y));
-        ret.push(vd.h("p", "camera.up.z: " + frame.state.camera.up.z));
-        return ret;
+        this._currentKey = currentKey;
+        var currentMesh = this._factory.createMesh(state.currentNode, state.currentTransform);
+        var planes = {};
+        planes[currentKey] = currentMesh;
+        this._scene.updateImagePlanes(planes);
+        this._alphaOld = 1;
+        return true;
     };
-    DebugComponent.prototype._getDebugVNode = function (open, info) {
-        if (open) {
-            return vd.h("div.Debug", {}, [
-                vd.h("h2", {}, ["Debug"]),
-                this._getDebugVNodeButton(open),
-                vd.h("pre", {}, info),
-            ]);
-        }
-        else {
-            return this._getDebugVNodeButton(open);
+    ImagePlaneGLRenderer.prototype._updateTexture = function (texture) {
+        this._needsRender = true;
+        var planes = this._scene.planes;
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            var material = plane.material;
+            var oldTexture = material.uniforms.projectorTex.value;
+            material.uniforms.projectorTex.value = null;
+            oldTexture.dispose();
+            material.uniforms.projectorTex.value = texture;
         }
     };
-    DebugComponent.prototype._getDebugVNodeButton = function (open) {
-        var buttonText = open ? "Disable Debug" : "D";
-        var buttonCssClass = open ? "" : ".DebugButtonFixed";
-        if (open) {
-            return vd.h("button.DebugButton" + buttonCssClass, { onclick: this._closeDebugElement.bind(this) }, [buttonText]);
+    ImagePlaneGLRenderer.prototype._extend = function (dest) {
+        var sources = [];
+        for (var _i = 1; _i < arguments.length; _i++) {
+            sources[_i - 1] = arguments[_i];
         }
-        else {
-            return vd.h("button.DebugButton" + buttonCssClass, { onclick: this._openDebugElement.bind(this) }, [buttonText]);
+        for (var _a = 0, sources_1 = sources; _a < sources_1.length; _a++) {
+            var src = sources_1[_a];
+            for (var k in src) {
+                if (!src.hasOwnProperty(k)) {
+                    continue;
+                }
+                dest[k] = src[k];
+            }
         }
+        return dest;
     };
-    DebugComponent.prototype._closeDebugElement = function (open) {
-        this._open$.next(false);
-    };
-    DebugComponent.prototype._openDebugElement = function () {
-        this._open$.next(true);
-    };
-    DebugComponent.componentName = "debug";
-    return DebugComponent;
-}(Component_1.Component));
-exports.DebugComponent = DebugComponent;
-Component_1.ComponentService.register(DebugComponent);
-exports.default = DebugComponent;
+    return ImagePlaneGLRenderer;
+}());
+exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer;
+exports.default = ImagePlaneGLRenderer;
 
-},{"../Component":226,"rxjs/BehaviorSubject":26,"rxjs/add/operator/combineLatest":53,"underscore":178,"virtual-dom":182}],247:[function(require,module,exports){
+},{"../../Component":291}],324:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
 Object.defineProperty(exports, "__esModule", { value: true });
-var vd = require("virtual-dom");
-require("rxjs/add/operator/combineLatest");
-var Component_1 = require("../Component");
-var ImageComponent = (function (_super) {
-    __extends(ImageComponent, _super);
-    function ImageComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._canvasId = container.id + "-" + _this._name;
-        return _this;
-    }
-    ImageComponent.prototype._activate = function () {
-        var _this = this;
-        this.drawSubscription = this._container.domRenderer.element$
-            .combineLatest(this._navigator.stateService.currentNode$, function (element, node) {
-            var canvas = document.getElementById(_this._canvasId);
-            return { canvas: canvas, node: node };
-        })
-            .subscribe(function (canvasNode) {
-            var canvas = canvasNode.canvas;
-            var node = canvasNode.node;
-            if (!node || !canvas) {
-                return null;
-            }
-            var adaptableDomRenderer = canvas.parentElement;
-            var width = adaptableDomRenderer.offsetWidth;
-            var height = adaptableDomRenderer.offsetHeight;
-            canvas.width = width;
-            canvas.height = height;
-            var ctx = canvas.getContext("2d");
-            ctx.drawImage(node.image, 0, 0, width, height);
-        });
-        this._container.domRenderer.renderAdaptive$.next({ name: this._name, vnode: vd.h("canvas#" + this._canvasId, []) });
-    };
-    ImageComponent.prototype._deactivate = function () {
-        this.drawSubscription.unsubscribe();
-    };
-    ImageComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    ImageComponent.componentName = "image";
-    return ImageComponent;
-}(Component_1.Component));
-exports.ImageComponent = ImageComponent;
-Component_1.ComponentService.register(ImageComponent);
-exports.default = ImageComponent;
 
-},{"../Component":226,"rxjs/add/operator/combineLatest":53,"virtual-dom":182}],248:[function(require,module,exports){
+},{}],325:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CoverState = void 0;
+var CoverState;
+(function (CoverState) {
+    CoverState[CoverState["Hidden"] = 0] = "Hidden";
+    CoverState[CoverState["Loading"] = 1] = "Loading";
+    CoverState[CoverState["Visible"] = 2] = "Visible";
+})(CoverState = exports.CoverState || (exports.CoverState = {}));
+
+},{}],326:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SliderMode = void 0;
+/**
+ * Enumeration for slider mode.
+ *
+ * @enum {number}
+ * @readonly
+ *
+ * @description Modes for specifying how transitions
+ * between nodes are performed in slider mode. Only
+ * applicable when the slider component determines
+ * that transitions with motion is possilble. When it
+ * is not, the stationary mode will be applied.
+ */
+var SliderMode;
+(function (SliderMode) {
+    /**
+     * Transitions with motion.
+     *
+     * @description The slider component moves the
+     * camera between the node origins.
+     *
+     * In this mode it is not possible to zoom or pan.
+     *
+     * The slider component falls back to stationary
+     * mode when it determines that the pair of nodes
+     * does not have a strong enough relation.
+     */
+    SliderMode[SliderMode["Motion"] = 0] = "Motion";
+    /**
+     * Stationary transitions.
+     *
+     * @description The camera is stationary.
+     *
+     * In this mode it is possible to zoom and pan.
+     */
+    SliderMode[SliderMode["Stationary"] = 1] = "Stationary";
+})(SliderMode = exports.SliderMode || (exports.SliderMode = {}));
+
+},{}],327:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var ICoverConfiguration_1 = require("./ICoverConfiguration");
+Object.defineProperty(exports, "CoverState", { enumerable: true, get: function () { return ICoverConfiguration_1.CoverState; } });
+var ISliderConfiguration_1 = require("./ISliderConfiguration");
+Object.defineProperty(exports, "SliderMode", { enumerable: true, get: function () { return ISliderConfiguration_1.SliderMode; } });
+__exportStar(require("../imageplane/interfaces/interfaces"), exports);
+__exportStar(require("../marker/interfaces/interfaces"), exports);
+__exportStar(require("../spatialdata/interfaces/interfaces"), exports);
+__exportStar(require("../tag/interfaces/interfaces"), exports);
+
+},{"../imageplane/interfaces/interfaces":324,"../marker/interfaces/interfaces":337,"../spatialdata/interfaces/interfaces":365,"../tag/interfaces/interfaces":390,"./ICoverConfiguration":325,"./ISliderConfiguration":326}],328:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -21349,208 +32964,105 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/fromEvent");
-require("rxjs/add/operator/withLatestFrom");
-var Edge_1 = require("../Edge");
-var Component_1 = require("../Component");
-var Geo_1 = require("../Geo");
-var KeyboardComponent = (function (_super) {
-    __extends(KeyboardComponent, _super);
-    function KeyboardComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._spatial = new Geo_1.Spatial();
-        _this._perspectiveDirections = [
-            Edge_1.EdgeDirection.StepForward,
-            Edge_1.EdgeDirection.StepBackward,
-            Edge_1.EdgeDirection.StepLeft,
-            Edge_1.EdgeDirection.StepRight,
-            Edge_1.EdgeDirection.TurnLeft,
-            Edge_1.EdgeDirection.TurnRight,
-            Edge_1.EdgeDirection.TurnU,
-        ];
-        return _this;
+exports.KeyPlayHandler = void 0;
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+var Edge_1 = require("../../Edge");
+/**
+ * The `KeyPlayHandler` allows the user to control the play behavior
+ * using the following key commands:
+ *
+ * `Spacebar`: Start or stop playing.
+ * `SHIFT` + `D`: Switch direction.
+ * `<`: Decrease speed.
+ * `>`: Increase speed.
+ *
+ * @example
+ * ```
+ * var keyboardComponent = viewer.getComponent("keyboard");
+ *
+ * keyboardComponent.keyPlay.disable();
+ * keyboardComponent.keyPlay.enable();
+ *
+ * var isEnabled = keyboardComponent.keyPlay.isEnabled;
+ * ```
+ */
+var KeyPlayHandler = /** @class */ (function (_super) {
+    __extends(KeyPlayHandler, _super);
+    function KeyPlayHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
     }
-    KeyboardComponent.prototype._activate = function () {
+    KeyPlayHandler.prototype._enable = function () {
         var _this = this;
-        var sequenceEdges$ = this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
+        this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe(operators_1.withLatestFrom(this._navigator.playService.playing$, this._navigator.playService.direction$, this._navigator.playService.speed$, this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
             return node.sequenceEdges$;
-        });
-        var spatialEdges$ = this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
-            return node.spatialEdges$;
-        });
-        this._disposable = Observable_1.Observable
-            .fromEvent(document, "keydown")
-            .withLatestFrom(this._navigator.stateService.currentState$, sequenceEdges$, spatialEdges$, function (event, frame, sequenceEdges, spatialEdges) {
-            return { event: event, frame: frame, sequenceEdges: sequenceEdges, spatialEdges: spatialEdges };
-        })
-            .subscribe(function (kf) {
-            if (!kf.frame.state.currentNode.pano) {
-                _this._navigatePerspective(kf.event, kf.sequenceEdges, kf.spatialEdges);
-            }
-            else {
-                _this._navigatePanorama(kf.event, kf.sequenceEdges, kf.spatialEdges, kf.frame.state.camera);
-            }
-        });
-    };
-    KeyboardComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-    };
-    KeyboardComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    KeyboardComponent.prototype._navigatePanorama = function (event, sequenceEdges, spatialEdges, camera) {
-        var navigationAngle = 0;
-        var stepDirection = null;
-        var sequenceDirection = null;
-        var phi = this._rotationFromCamera(camera).phi;
-        switch (event.keyCode) {
-            case 37:// left
-                if (event.shiftKey || event.altKey) {
-                    break;
-                }
-                navigationAngle = Math.PI / 2 + phi;
-                stepDirection = Edge_1.EdgeDirection.StepLeft;
-                break;
-            case 38:// up
-                if (event.shiftKey) {
-                    break;
-                }
-                if (event.altKey) {
-                    sequenceDirection = Edge_1.EdgeDirection.Next;
-                    break;
-                }
-                navigationAngle = phi;
-                stepDirection = Edge_1.EdgeDirection.StepForward;
-                break;
-            case 39:// right
-                if (event.shiftKey || event.altKey) {
-                    break;
-                }
-                navigationAngle = -Math.PI / 2 + phi;
-                stepDirection = Edge_1.EdgeDirection.StepRight;
-                break;
-            case 40:// down
-                if (event.shiftKey) {
-                    break;
-                }
-                if (event.altKey) {
-                    sequenceDirection = Edge_1.EdgeDirection.Prev;
-                    break;
-                }
-                navigationAngle = Math.PI + phi;
-                stepDirection = Edge_1.EdgeDirection.StepBackward;
-                break;
-            default:
+        }))))
+            .subscribe(function (_a) {
+            var event = _a[0], playing = _a[1], direction = _a[2], speed = _a[3], status = _a[4];
+            if (event.altKey || event.ctrlKey || event.metaKey) {
                 return;
-        }
-        event.preventDefault();
-        if (sequenceDirection != null) {
-            this._moveInDir(sequenceDirection, sequenceEdges);
-            return;
-        }
-        if (stepDirection == null || !spatialEdges.cached) {
-            return;
-        }
-        navigationAngle = this._spatial.wrapAngle(navigationAngle);
-        var threshold = Math.PI / 4;
-        var edges = spatialEdges.edges.filter(function (e) {
-            return e.data.direction === Edge_1.EdgeDirection.Pano ||
-                e.data.direction === stepDirection;
-        });
-        var smallestAngle = Number.MAX_VALUE;
-        var toKey = null;
-        for (var _i = 0, edges_1 = edges; _i < edges_1.length; _i++) {
-            var edge = edges_1[_i];
-            var angle = Math.abs(this._spatial.wrapAngle(edge.data.worldMotionAzimuth - navigationAngle));
-            if (angle < Math.min(smallestAngle, threshold)) {
-                smallestAngle = angle;
-                toKey = edge.to;
             }
-        }
-        if (toKey == null) {
-            return;
-        }
-        this._navigator.moveToKey$(toKey)
-            .subscribe(function (n) { return; }, function (e) { console.error(e); });
-    };
-    KeyboardComponent.prototype._rotationFromCamera = function (camera) {
-        var direction = camera.lookat.clone().sub(camera.position);
-        var upProjection = direction.clone().dot(camera.up);
-        var planeProjection = direction.clone().sub(camera.up.clone().multiplyScalar(upProjection));
-        var phi = Math.atan2(planeProjection.y, planeProjection.x);
-        var theta = Math.PI / 2 - this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);
-        return { phi: phi, theta: theta };
-    };
-    KeyboardComponent.prototype._navigatePerspective = function (event, sequenceEdges, spatialEdges) {
-        var direction = null;
-        var sequenceDirection = null;
-        switch (event.keyCode) {
-            case 37:// left
-                if (event.altKey) {
-                    break;
-                }
-                direction = event.shiftKey ? Edge_1.EdgeDirection.TurnLeft : Edge_1.EdgeDirection.StepLeft;
-                break;
-            case 38:// up
-                if (event.altKey) {
-                    sequenceDirection = Edge_1.EdgeDirection.Next;
-                    break;
-                }
-                direction = event.shiftKey ? Edge_1.EdgeDirection.Pano : Edge_1.EdgeDirection.StepForward;
-                break;
-            case 39:// right
-                if (event.altKey) {
-                    break;
-                }
-                direction = event.shiftKey ? Edge_1.EdgeDirection.TurnRight : Edge_1.EdgeDirection.StepRight;
-                break;
-            case 40:// down
-                if (event.altKey) {
-                    sequenceDirection = Edge_1.EdgeDirection.Prev;
+            switch (event.key) {
+                case "D":
+                    if (!event.shiftKey) {
+                        return;
+                    }
+                    var newDirection = playing ?
+                        null : direction === Edge_1.EdgeDirection.Next ?
+                        Edge_1.EdgeDirection.Prev : direction === Edge_1.EdgeDirection.Prev ?
+                        Edge_1.EdgeDirection.Next : null;
+                    if (newDirection != null) {
+                        _this._navigator.playService.setDirection(newDirection);
+                    }
                     break;
-                }
-                direction = event.shiftKey ? Edge_1.EdgeDirection.TurnU : Edge_1.EdgeDirection.StepBackward;
-                break;
-            default:
-                return;
-        }
-        event.preventDefault();
-        if (sequenceDirection != null) {
-            this._moveInDir(sequenceDirection, sequenceEdges);
-            return;
-        }
-        this._moveInDir(direction, spatialEdges);
-    };
-    KeyboardComponent.prototype._moveInDir = function (direction, edgeStatus) {
-        if (!edgeStatus.cached) {
-            return;
-        }
-        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-            var edge = _a[_i];
-            if (edge.data.direction === direction) {
-                this._navigator.moveToKey$(edge.to)
-                    .subscribe(function (n) { return; }, function (e) { console.error(e); });
-                return;
+                case " ":
+                    if (event.shiftKey) {
+                        return;
+                    }
+                    if (playing) {
+                        _this._navigator.playService.stop();
+                    }
+                    else {
+                        for (var _i = 0, _b = status.edges; _i < _b.length; _i++) {
+                            var edge = _b[_i];
+                            if (edge.data.direction === direction) {
+                                _this._navigator.playService.play();
+                            }
+                        }
+                    }
+                    break;
+                case "<":
+                    _this._navigator.playService.setSpeed(speed - 0.05);
+                    break;
+                case ">":
+                    _this._navigator.playService.setSpeed(speed + 0.05);
+                    break;
+                default:
+                    return;
             }
-        }
+            event.preventDefault();
+        });
     };
-    KeyboardComponent.componentName = "keyboard";
-    return KeyboardComponent;
-}(Component_1.Component));
-exports.KeyboardComponent = KeyboardComponent;
-Component_1.ComponentService.register(KeyboardComponent);
-exports.default = KeyboardComponent;
+    KeyPlayHandler.prototype._disable = function () {
+        this._keyDownSubscription.unsubscribe();
+    };
+    KeyPlayHandler.prototype._getConfiguration = function (enable) {
+        return { keyZoom: enable };
+    };
+    return KeyPlayHandler;
+}(Component_1.HandlerBase));
+exports.KeyPlayHandler = KeyPlayHandler;
+exports.default = KeyPlayHandler;
 
-},{"../Component":226,"../Edge":227,"../Geo":229,"rxjs/Observable":29,"rxjs/add/observable/fromEvent":42,"rxjs/add/operator/withLatestFrom":83}],249:[function(require,module,exports){
+},{"../../Component":291,"../../Edge":292,"rxjs/operators":241}],329:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -21558,72 +33070,90 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var _ = require("underscore");
-var vd = require("virtual-dom");
-require("rxjs/add/operator/combineLatest");
-var Component_1 = require("../Component");
-var LoadingComponent = (function (_super) {
-    __extends(LoadingComponent, _super);
-    function LoadingComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
+exports.KeySequenceNavigationHandler = void 0;
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+var Edge_1 = require("../../Edge");
+var Error_1 = require("../../Error");
+/**
+ * The `KeySequenceNavigationHandler` allows the user to navigate through a sequence using the
+ * following key commands:
+ *
+ * `ALT` + `Up Arrow`: Navigate to next image in the sequence.
+ * `ALT` + `Down Arrow`: Navigate to previous image in sequence.
+ *
+ * @example
+ * ```
+ * var keyboardComponent = viewer.getComponent("keyboard");
+ *
+ * keyboardComponent.keySequenceNavigation.disable();
+ * keyboardComponent.keySequenceNavigation.enable();
+ *
+ * var isEnabled = keyboardComponent.keySequenceNavigation.isEnabled;
+ * ```
+ */
+var KeySequenceNavigationHandler = /** @class */ (function (_super) {
+    __extends(KeySequenceNavigationHandler, _super);
+    function KeySequenceNavigationHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
     }
-    LoadingComponent.prototype._activate = function () {
+    KeySequenceNavigationHandler.prototype._enable = function () {
         var _this = this;
-        this._loadingSubscription = this._navigator.loadingService.loading$
-            .combineLatest(this._navigator.imageLoadingService.loadstatus$, function (loading, loadStatus) {
-            if (!loading) {
-                return { name: "loading", vnode: _this._getBarVNode(100) };
+        var sequenceEdges$ = this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
+            return node.sequenceEdges$;
+        }));
+        this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe(operators_1.withLatestFrom(sequenceEdges$))
+            .subscribe(function (_a) {
+            var event = _a[0], edgeStatus = _a[1];
+            var direction = null;
+            switch (event.keyCode) {
+                case 38: // up
+                    direction = Edge_1.EdgeDirection.Next;
+                    break;
+                case 40: // down
+                    direction = Edge_1.EdgeDirection.Prev;
+                    break;
+                default:
+                    return;
             }
-            var total = 0;
-            var loaded = 0;
-            for (var _i = 0, _a = _.values(loadStatus); _i < _a.length; _i++) {
-                var loadStat = _a[_i];
-                if (loadStat.loaded !== loadStat.total) {
-                    loaded += loadStat.loaded;
-                    total += loadStat.total;
-                }
+            event.preventDefault();
+            if (!event.altKey || event.shiftKey || !edgeStatus.cached) {
+                return;
             }
-            var percentage = 100;
-            if (total !== 0) {
-                percentage = (loaded / total) * 100;
+            for (var _i = 0, _b = edgeStatus.edges; _i < _b.length; _i++) {
+                var edge = _b[_i];
+                if (edge.data.direction === direction) {
+                    _this._navigator.moveToKey$(edge.to)
+                        .subscribe(undefined, function (error) {
+                        if (!(error instanceof Error_1.AbortMapillaryError)) {
+                            console.error(error);
+                        }
+                    });
+                    return;
+                }
             }
-            return { name: _this._name, vnode: _this._getBarVNode(percentage) };
-        })
-            .subscribe(this._container.domRenderer.render$);
-    };
-    LoadingComponent.prototype._deactivate = function () {
-        this._loadingSubscription.unsubscribe();
+        });
     };
-    LoadingComponent.prototype._getDefaultConfiguration = function () {
-        return {};
+    KeySequenceNavigationHandler.prototype._disable = function () {
+        this._keyDownSubscription.unsubscribe();
     };
-    LoadingComponent.prototype._getBarVNode = function (percentage) {
-        var loadingBarStyle = {};
-        var loadingContainerStyle = {};
-        if (percentage !== 100) {
-            loadingBarStyle.width = percentage.toFixed(0) + "%";
-            loadingBarStyle.opacity = "1";
-        }
-        else {
-            loadingBarStyle.width = "100%";
-            loadingBarStyle.opacity = "0";
-        }
-        return vd.h("div.Loading", { style: loadingContainerStyle }, [vd.h("div.LoadingBar", { style: loadingBarStyle }, [])]);
+    KeySequenceNavigationHandler.prototype._getConfiguration = function (enable) {
+        return { keySequenceNavigation: enable };
     };
-    LoadingComponent.componentName = "loading";
-    return LoadingComponent;
-}(Component_1.Component));
-exports.LoadingComponent = LoadingComponent;
-Component_1.ComponentService.register(LoadingComponent);
-exports.default = LoadingComponent;
+    return KeySequenceNavigationHandler;
+}(Component_1.HandlerBase));
+exports.KeySequenceNavigationHandler = KeySequenceNavigationHandler;
+exports.default = KeySequenceNavigationHandler;
 
-},{"../Component":226,"rxjs/add/operator/combineLatest":53,"underscore":178,"virtual-dom":182}],250:[function(require,module,exports){
+},{"../../Component":291,"../../Edge":292,"../../Error":293,"rxjs/operators":241}],330:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -21631,80 +33161,149 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var vd = require("virtual-dom");
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/first");
-var Edge_1 = require("../Edge");
-var Component_1 = require("../Component");
-var NavigationComponent = (function (_super) {
-    __extends(NavigationComponent, _super);
-    function NavigationComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._dirNames = {};
-        _this._dirNames[Edge_1.EdgeDirection.StepForward] = "Forward";
-        _this._dirNames[Edge_1.EdgeDirection.StepBackward] = "Backward";
-        _this._dirNames[Edge_1.EdgeDirection.StepLeft] = "Left";
-        _this._dirNames[Edge_1.EdgeDirection.StepRight] = "Right";
-        _this._dirNames[Edge_1.EdgeDirection.TurnLeft] = "Turnleft";
-        _this._dirNames[Edge_1.EdgeDirection.TurnRight] = "Turnright";
-        _this._dirNames[Edge_1.EdgeDirection.TurnU] = "Turnaround";
+exports.KeySpatialNavigationHandler = void 0;
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+var Edge_1 = require("../../Edge");
+var Error_1 = require("../../Error");
+/**
+ * The `KeySpatialNavigationHandler` allows the user to navigate through a sequence using the
+ * following key commands:
+ *
+ * `Up Arrow`: Step forward.
+ * `Down Arrow`: Step backward.
+ * `Left Arrow`: Step to the left.
+ * `Rigth Arrow`: Step to the right.
+ * `SHIFT` + `Down Arrow`: Turn around.
+ * `SHIFT` + `Left Arrow`: Turn to the left.
+ * `SHIFT` + `Rigth Arrow`: Turn to the right.
+ *
+ * @example
+ * ```
+ * var keyboardComponent = viewer.getComponent("keyboard");
+ *
+ * keyboardComponent.keySpatialNavigation.disable();
+ * keyboardComponent.keySpatialNavigation.enable();
+ *
+ * var isEnabled = keyboardComponent.keySpatialNavigation.isEnabled;
+ * ```
+ */
+var KeySpatialNavigationHandler = /** @class */ (function (_super) {
+    __extends(KeySpatialNavigationHandler, _super);
+    /** @ignore */
+    function KeySpatialNavigationHandler(component, container, navigator, spatial) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._spatial = spatial;
         return _this;
     }
-    NavigationComponent.prototype._activate = function () {
+    KeySpatialNavigationHandler.prototype._enable = function () {
         var _this = this;
-        this._renderSubscription = this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
-            return node.pano ?
-                Observable_1.Observable.of([]) :
-                Observable_1.Observable.combineLatest(node.sequenceEdges$, node.spatialEdges$, function (seq, spa) {
-                    return seq.edges.concat(spa.edges);
+        var spatialEdges$ = this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
+            return node.spatialEdges$;
+        }));
+        this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe(operators_1.withLatestFrom(spatialEdges$, this._navigator.stateService.currentState$))
+            .subscribe(function (_a) {
+            var event = _a[0], edgeStatus = _a[1], frame = _a[2];
+            var pano = frame.state.currentNode.pano;
+            var direction = null;
+            switch (event.keyCode) {
+                case 37: // left
+                    direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnLeft : Edge_1.EdgeDirection.StepLeft;
+                    break;
+                case 38: // up
+                    direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.Pano : Edge_1.EdgeDirection.StepForward;
+                    break;
+                case 39: // right
+                    direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnRight : Edge_1.EdgeDirection.StepRight;
+                    break;
+                case 40: // down
+                    direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnU : Edge_1.EdgeDirection.StepBackward;
+                    break;
+                default:
+                    return;
+            }
+            event.preventDefault();
+            if (event.altKey || !edgeStatus.cached ||
+                (event.shiftKey && pano)) {
+                return;
+            }
+            if (!pano) {
+                _this._moveDir(direction, edgeStatus);
+            }
+            else {
+                var shifts = {};
+                shifts[Edge_1.EdgeDirection.StepBackward] = Math.PI;
+                shifts[Edge_1.EdgeDirection.StepForward] = 0;
+                shifts[Edge_1.EdgeDirection.StepLeft] = Math.PI / 2;
+                shifts[Edge_1.EdgeDirection.StepRight] = -Math.PI / 2;
+                var phi = _this._rotationFromCamera(frame.state.camera).phi;
+                var navigationAngle = _this._spatial.wrapAngle(phi + shifts[direction]);
+                var threshold = Math.PI / 4;
+                var edges = edgeStatus.edges.filter(function (e) {
+                    return e.data.direction === Edge_1.EdgeDirection.Pano || e.data.direction === direction;
                 });
-        })
-            .map(function (edges) {
-            var btns = [];
-            for (var _i = 0, edges_1 = edges; _i < edges_1.length; _i++) {
-                var edge = edges_1[_i];
-                var direction = edge.data.direction;
-                var name_1 = _this._dirNames[direction];
-                if (name_1 == null) {
-                    continue;
+                var smallestAngle = Number.MAX_VALUE;
+                var toKey = null;
+                for (var _i = 0, edges_1 = edges; _i < edges_1.length; _i++) {
+                    var edge = edges_1[_i];
+                    var angle = Math.abs(_this._spatial.wrapAngle(edge.data.worldMotionAzimuth - navigationAngle));
+                    if (angle < Math.min(smallestAngle, threshold)) {
+                        smallestAngle = angle;
+                        toKey = edge.to;
+                    }
+                }
+                if (toKey == null) {
+                    return;
                 }
-                btns.push(_this._createVNode(direction, name_1));
+                _this._moveToKey(toKey);
             }
-            return { name: _this._name, vnode: vd.h("div.NavigationComponent", btns) };
-        })
-            .subscribe(this._container.domRenderer.render$);
+        });
     };
-    NavigationComponent.prototype._deactivate = function () {
-        this._renderSubscription.unsubscribe();
+    KeySpatialNavigationHandler.prototype._disable = function () {
+        this._keyDownSubscription.unsubscribe();
     };
-    NavigationComponent.prototype._getDefaultConfiguration = function () {
-        return {};
+    KeySpatialNavigationHandler.prototype._getConfiguration = function (enable) {
+        return { keySpatialNavigation: enable };
     };
-    NavigationComponent.prototype._createVNode = function (direction, name) {
-        var _this = this;
-        return vd.h("span.Direction.Direction" + name, {
-            onclick: function (ev) {
-                _this._navigator.moveDir$(direction)
-                    .subscribe(function (node) { return; }, function (error) { console.error(error); });
-            },
-        }, []);
+    KeySpatialNavigationHandler.prototype._moveDir = function (direction, edgeStatus) {
+        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
+            var edge = _a[_i];
+            if (edge.data.direction === direction) {
+                this._moveToKey(edge.to);
+                return;
+            }
+        }
     };
-    NavigationComponent.componentName = "navigation";
-    return NavigationComponent;
-}(Component_1.Component));
-exports.NavigationComponent = NavigationComponent;
-Component_1.ComponentService.register(NavigationComponent);
-exports.default = NavigationComponent;
+    KeySpatialNavigationHandler.prototype._moveToKey = function (key) {
+        this._navigator.moveToKey$(key)
+            .subscribe(undefined, function (error) {
+            if (!(error instanceof Error_1.AbortMapillaryError)) {
+                console.error(error);
+            }
+        });
+    };
+    KeySpatialNavigationHandler.prototype._rotationFromCamera = function (camera) {
+        var direction = camera.lookat.clone().sub(camera.position);
+        var upProjection = direction.clone().dot(camera.up);
+        var planeProjection = direction.clone().sub(camera.up.clone().multiplyScalar(upProjection));
+        var phi = Math.atan2(planeProjection.y, planeProjection.x);
+        var theta = Math.PI / 2 - this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);
+        return { phi: phi, theta: theta };
+    };
+    return KeySpatialNavigationHandler;
+}(Component_1.HandlerBase));
+exports.KeySpatialNavigationHandler = KeySpatialNavigationHandler;
+exports.default = KeySpatialNavigationHandler;
 
-},{"../Component":226,"../Edge":227,"rxjs/Observable":29,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"virtual-dom":182}],251:[function(require,module,exports){
+},{"../../Component":291,"../../Edge":292,"../../Error":293,"rxjs/operators":241}],331:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -21712,218 +33311,79 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var _ = require("underscore");
-var vd = require("virtual-dom");
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/fromPromise");
-require("rxjs/add/observable/of");
-require("rxjs/add/operator/combineLatest");
-require("rxjs/add/operator/distinct");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/pluck");
-require("rxjs/add/operator/scan");
-var Component_1 = require("../Component");
-var DescriptionState = (function () {
-    function DescriptionState() {
-    }
-    return DescriptionState;
-}());
-var RouteState = (function () {
-    function RouteState() {
-    }
-    return RouteState;
-}());
-var RouteTrack = (function () {
-    function RouteTrack() {
-        this.nodeInstructions = [];
-        this.nodeInstructionsOrdered = [];
-    }
-    return RouteTrack;
-}());
-var RouteComponent = (function (_super) {
-    __extends(RouteComponent, _super);
-    function RouteComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
+exports.KeyZoomHandler = void 0;
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+/**
+ * The `KeyZoomHandler` allows the user to zoom in and out using the
+ * following key commands:
+ *
+ * `+`: Zoom in.
+ * `-`: Zoom out.
+ *
+ * @example
+ * ```
+ * var keyboardComponent = viewer.getComponent("keyboard");
+ *
+ * keyboardComponent.keyZoom.disable();
+ * keyboardComponent.keyZoom.enable();
+ *
+ * var isEnabled = keyboardComponent.keyZoom.isEnabled;
+ * ```
+ */
+var KeyZoomHandler = /** @class */ (function (_super) {
+    __extends(KeyZoomHandler, _super);
+    /** @ignore */
+    function KeyZoomHandler(component, container, navigator, viewportCoords) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._viewportCoords = viewportCoords;
+        return _this;
     }
-    RouteComponent.prototype._activate = function () {
+    KeyZoomHandler.prototype._enable = function () {
         var _this = this;
-        var _slowedStream$;
-        _slowedStream$ = this._navigator.stateService.currentState$.filter(function (frame) {
-            return (frame.id % 2) === 0;
-        }).filter(function (frame) {
-            return frame.state.nodesAhead < 15;
-        }).distinctUntilChanged(undefined, function (frame) {
-            return frame.state.lastNode.key;
-        });
-        var _routeTrack$;
-        _routeTrack$ = this.configuration$.mergeMap(function (conf) {
-            return Observable_1.Observable.from(conf.paths);
-        }).distinct(function (p) {
-            return p.sequenceKey;
-        }).mergeMap(function (path) {
-            return _this._navigator.apiV3.sequenceByKey$([path.sequenceKey])
-                .map(function (sequenceByKey) {
-                return sequenceByKey[path.sequenceKey];
-            });
-        }).combineLatest(this.configuration$, function (sequence, conf) {
-            var i = 0;
-            var instructionPlaces = [];
-            for (var _i = 0, _a = conf.paths; _i < _a.length; _i++) {
-                var path = _a[_i];
-                if (path.sequenceKey === sequence.key) {
-                    var nodeInstructions = [];
-                    var saveKey = false;
-                    for (var _b = 0, _c = sequence.keys; _b < _c.length; _b++) {
-                        var key = _c[_b];
-                        if (path.startKey === key) {
-                            saveKey = true;
-                        }
-                        if (saveKey) {
-                            var description = null;
-                            for (var _d = 0, _e = path.infoKeys; _d < _e.length; _d++) {
-                                var infoKey = _e[_d];
-                                if (infoKey.key === key) {
-                                    description = infoKey.description;
-                                }
-                            }
-                            nodeInstructions.push({ description: description, key: key });
-                        }
-                        if (path.stopKey === key) {
-                            saveKey = false;
-                        }
-                    }
-                    instructionPlaces.push({ nodeInstructions: nodeInstructions, place: i });
-                }
-                i++;
-            }
-            return instructionPlaces;
-        }).scan(function (routeTrack, instructionPlaces) {
-            for (var _i = 0, instructionPlaces_1 = instructionPlaces; _i < instructionPlaces_1.length; _i++) {
-                var instructionPlace = instructionPlaces_1[_i];
-                routeTrack.nodeInstructionsOrdered[instructionPlace.place] = instructionPlace.nodeInstructions;
-            }
-            routeTrack.nodeInstructions = _.flatten(routeTrack.nodeInstructionsOrdered);
-            return routeTrack;
-        }, new RouteTrack());
-        this._disposable = _slowedStream$
-            .combineLatest(_routeTrack$, this.configuration$, function (frame, routeTrack, conf) {
-            return { conf: conf, frame: frame, routeTrack: routeTrack };
-        }).scan(function (routeState, rtAndFrame) {
-            if (rtAndFrame.conf.playing === undefined || rtAndFrame.conf.playing) {
-                routeState.routeTrack = rtAndFrame.routeTrack;
-                routeState.currentNode = rtAndFrame.frame.state.currentNode;
-                routeState.lastNode = rtAndFrame.frame.state.lastNode;
-                routeState.playing = true;
-            }
-            else {
-                _this._navigator.stateService.cutNodes();
-                routeState.playing = false;
-            }
-            return routeState;
-        }, new RouteState())
-            .filter(function (routeState) {
-            return routeState.playing;
-        }).filter(function (routeState) {
-            for (var _i = 0, _a = routeState.routeTrack.nodeInstructions; _i < _a.length; _i++) {
-                var nodeInstruction = _a[_i];
-                if (!nodeInstruction) {
-                    continue;
-                }
-                if (nodeInstruction.key === routeState.lastNode.key) {
-                    return true;
-                }
+        this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$))
+            .subscribe(function (_a) {
+            var event = _a[0], render = _a[1], transform = _a[2];
+            if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) {
+                return;
             }
-            return false;
-        }).distinctUntilChanged(undefined, function (routeState) {
-            return routeState.lastNode.key;
-        }).mergeMap(function (routeState) {
-            var i = 0;
-            for (var _i = 0, _a = routeState.routeTrack.nodeInstructions; _i < _a.length; _i++) {
-                var nodeInstruction = _a[_i];
-                if (nodeInstruction.key === routeState.lastNode.key) {
+            var delta = 0;
+            switch (event.key) {
+                case "+":
+                    delta = 1;
                     break;
-                }
-                i++;
-            }
-            var nextInstruction = routeState.routeTrack.nodeInstructions[i + 1];
-            if (!nextInstruction) {
-                return Observable_1.Observable.of(null);
-            }
-            return _this._navigator.graphService.cacheNode$(nextInstruction.key);
-        }).combineLatest(this.configuration$, function (node, conf) {
-            return { conf: conf, node: node };
-        }).filter(function (cAN) {
-            return cAN.node !== null && cAN.conf.playing;
-        }).pluck("node").subscribe(this._navigator.stateService.appendNode$);
-        this._disposableDescription = this._navigator.stateService.currentNode$
-            .combineLatest(_routeTrack$, this.configuration$, function (node, routeTrack, conf) {
-            if (conf.playing !== undefined && !conf.playing) {
-                return "quit";
-            }
-            var description = null;
-            for (var _i = 0, _a = routeTrack.nodeInstructions; _i < _a.length; _i++) {
-                var nodeInstruction = _a[_i];
-                if (nodeInstruction.key === node.key) {
-                    description = nodeInstruction.description;
+                case "-":
+                    delta = -1;
                     break;
-                }
-            }
-            return description;
-        }).scan(function (descriptionState, description) {
-            if (description !== descriptionState.description && description !== null) {
-                descriptionState.description = description;
-                descriptionState.showsLeft = 6;
-            }
-            else {
-                descriptionState.showsLeft--;
-            }
-            if (description === "quit") {
-                descriptionState.description = null;
-            }
-            return descriptionState;
-        }, new DescriptionState()).map(function (descriptionState) {
-            if (descriptionState.showsLeft > 0 && descriptionState.description) {
-                return { name: _this._name, vnode: _this._getRouteAnnotationNode(descriptionState.description) };
-            }
-            else {
-                return { name: _this._name, vnode: vd.h("div", []) };
+                default:
+                    return;
             }
-        }).subscribe(this._container.domRenderer.render$);
-    };
-    RouteComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-        this._disposableDescription.unsubscribe();
-    };
-    RouteComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    RouteComponent.prototype.play = function () {
-        this.configure({ playing: true });
+            event.preventDefault();
+            var unprojected = _this._viewportCoords.unprojectFromViewport(0, 0, render.perspective);
+            var reference = transform.projectBasic(unprojected.toArray());
+            _this._navigator.stateService.zoomIn(delta, reference);
+        });
     };
-    RouteComponent.prototype.stop = function () {
-        this.configure({ playing: false });
+    KeyZoomHandler.prototype._disable = function () {
+        this._keyDownSubscription.unsubscribe();
     };
-    RouteComponent.prototype._getRouteAnnotationNode = function (description) {
-        return vd.h("div.RouteFrame", {}, [
-            vd.h("p", { textContent: description }, []),
-        ]);
+    KeyZoomHandler.prototype._getConfiguration = function (enable) {
+        return { keyZoom: enable };
     };
-    RouteComponent.componentName = "route";
-    return RouteComponent;
-}(Component_1.Component));
-exports.RouteComponent = RouteComponent;
-Component_1.ComponentService.register(RouteComponent);
-exports.default = RouteComponent;
+    return KeyZoomHandler;
+}(Component_1.HandlerBase));
+exports.KeyZoomHandler = KeyZoomHandler;
+exports.default = KeyZoomHandler;
 
-},{"../Component":226,"rxjs/Observable":29,"rxjs/add/observable/fromPromise":43,"rxjs/add/observable/of":45,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinct":57,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/pluck":70,"rxjs/add/operator/scan":73,"underscore":178,"virtual-dom":182}],252:[function(require,module,exports){
+},{"../../Component":291,"rxjs/operators":241}],332:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -21931,879 +33391,1524 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/operator/buffer");
-require("rxjs/add/operator/debounceTime");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/scan");
-var Component_1 = require("../Component");
-var StatsComponent = (function (_super) {
-    __extends(StatsComponent, _super);
-    function StatsComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
+exports.KeyboardComponent = void 0;
+var Component_1 = require("../../Component");
+var Geo_1 = require("../../Geo");
+/**
+ * @class KeyboardComponent
+ *
+ * @classdesc Component for keyboard event handling.
+ *
+ * To retrive and use the keyboard component
+ *
+ * @example
+ * ```
+ * var viewer = new Mapillary.Viewer(
+ *     "<element-id>",
+ *     "<client-id>",
+ *     "<my key>");
+ *
+ * var keyboardComponent = viewer.getComponent("keyboard");
+ * ```
+ */
+var KeyboardComponent = /** @class */ (function (_super) {
+    __extends(KeyboardComponent, _super);
+    /** @ignore */
+    function KeyboardComponent(name, container, navigator) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._keyPlayHandler = new Component_1.KeyPlayHandler(_this, container, navigator);
+        _this._keySequenceNavigationHandler = new Component_1.KeySequenceNavigationHandler(_this, container, navigator);
+        _this._keySpatialNavigationHandler = new Component_1.KeySpatialNavigationHandler(_this, container, navigator, new Geo_1.Spatial());
+        _this._keyZoomHandler = new Component_1.KeyZoomHandler(_this, container, navigator, new Geo_1.ViewportCoords());
+        return _this;
     }
-    StatsComponent.prototype._activate = function () {
+    Object.defineProperty(KeyboardComponent.prototype, "keyPlay", {
+        /**
+         * Get key play.
+         *
+         * @returns {KeyPlayHandler} The key play handler.
+         */
+        get: function () {
+            return this._keyPlayHandler;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(KeyboardComponent.prototype, "keySequenceNavigation", {
+        /**
+         * Get key sequence navigation.
+         *
+         * @returns {KeySequenceNavigationHandler} The key sequence navigation handler.
+         */
+        get: function () {
+            return this._keySequenceNavigationHandler;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(KeyboardComponent.prototype, "keySpatialNavigation", {
+        /**
+         * Get spatial.
+         *
+         * @returns {KeySpatialNavigationHandler} The spatial handler.
+         */
+        get: function () {
+            return this._keySpatialNavigationHandler;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(KeyboardComponent.prototype, "keyZoom", {
+        /**
+         * Get key zoom.
+         *
+         * @returns {KeyZoomHandler} The key zoom handler.
+         */
+        get: function () {
+            return this._keyZoomHandler;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    KeyboardComponent.prototype._activate = function () {
         var _this = this;
-        this._sequenceSubscription = this._navigator.stateService.currentNode$
-            .scan(function (keys, node) {
-            var sKey = node.sequenceKey;
-            keys.report = [];
-            if (!(sKey in keys.reported)) {
-                keys.report = [sKey];
-                keys.reported[sKey] = true;
+        this._configurationSubscription = this._configuration$
+            .subscribe(function (configuration) {
+            if (configuration.keyPlay) {
+                _this._keyPlayHandler.enable();
             }
-            return keys;
-        }, { report: [], reported: {} })
-            .filter(function (keys) {
-            return keys.report.length > 0;
-        })
-            .mergeMap(function (keys) {
-            return _this._navigator.apiV3.sequenceViewAdd$(keys.report)
-                .catch(function (error, caught) {
-                console.error("Failed to report sequence stats (" + keys.report + ")", error);
-                return Observable_1.Observable.empty();
-            });
-        })
-            .subscribe(function () { });
-        this._imageSubscription = this._navigator.stateService.currentNode$
-            .map(function (node) {
-            return node.key;
-        })
-            .buffer(this._navigator.stateService.currentNode$.debounceTime(5000))
-            .scan(function (keys, newKeys) {
-            keys.report = [];
-            for (var _i = 0, newKeys_1 = newKeys; _i < newKeys_1.length; _i++) {
-                var key = newKeys_1[_i];
-                if (!(key in keys.reported)) {
-                    keys.report.push(key);
-                    keys.reported[key] = true;
-                }
+            else {
+                _this._keyPlayHandler.disable();
             }
-            return keys;
-        }, { report: [], reported: {} })
-            .filter(function (keys) {
-            return keys.report.length > 0;
-        })
-            .mergeMap(function (keys) {
-            return _this._navigator.apiV3.imageViewAdd$(keys.report)
-                .catch(function (error, caught) {
-                console.error("Failed to report image stats (" + keys.report + ")", error);
-                return Observable_1.Observable.empty();
-            });
-        })
-            .subscribe(function () { });
+            if (configuration.keySequenceNavigation) {
+                _this._keySequenceNavigationHandler.enable();
+            }
+            else {
+                _this._keySequenceNavigationHandler.disable();
+            }
+            if (configuration.keySpatialNavigation) {
+                _this._keySpatialNavigationHandler.enable();
+            }
+            else {
+                _this._keySpatialNavigationHandler.disable();
+            }
+            if (configuration.keyZoom) {
+                _this._keyZoomHandler.enable();
+            }
+            else {
+                _this._keyZoomHandler.disable();
+            }
+        });
     };
-    StatsComponent.prototype._deactivate = function () {
-        this._sequenceSubscription.unsubscribe();
-        this._imageSubscription.unsubscribe();
+    KeyboardComponent.prototype._deactivate = function () {
+        this._configurationSubscription.unsubscribe();
+        this._keyPlayHandler.disable();
+        this._keySequenceNavigationHandler.disable();
+        this._keySpatialNavigationHandler.disable();
+        this._keyZoomHandler.disable();
     };
-    StatsComponent.prototype._getDefaultConfiguration = function () {
-        return {};
+    KeyboardComponent.prototype._getDefaultConfiguration = function () {
+        return { keyPlay: true, keySequenceNavigation: true, keySpatialNavigation: true, keyZoom: true };
     };
-    StatsComponent.componentName = "stats";
-    return StatsComponent;
+    KeyboardComponent.componentName = "keyboard";
+    return KeyboardComponent;
 }(Component_1.Component));
-exports.StatsComponent = StatsComponent;
-Component_1.ComponentService.register(StatsComponent);
-exports.default = StatsComponent;
+exports.KeyboardComponent = KeyboardComponent;
+Component_1.ComponentService.register(KeyboardComponent);
+exports.default = KeyboardComponent;
+
+},{"../../Component":291,"../../Geo":294}],333:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var MarkerComponent_1 = require("./MarkerComponent");
+Object.defineProperty(exports, "MarkerComponent", { enumerable: true, get: function () { return MarkerComponent_1.MarkerComponent; } });
+var SimpleMarker_1 = require("./marker/SimpleMarker");
+Object.defineProperty(exports, "SimpleMarker", { enumerable: true, get: function () { return SimpleMarker_1.SimpleMarker; } });
+var CircleMarker_1 = require("./marker/CircleMarker");
+Object.defineProperty(exports, "CircleMarker", { enumerable: true, get: function () { return CircleMarker_1.CircleMarker; } });
 
-},{"../Component":226,"rxjs/Observable":29,"rxjs/add/operator/buffer":49,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":73}],253:[function(require,module,exports){
+},{"./MarkerComponent":334,"./marker/CircleMarker":338,"./marker/SimpleMarker":340}],334:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
         d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var vd = require("virtual-dom");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/share");
-var Component_1 = require("../../Component");
-/**
- * @class DirectionComponent
- * @classdesc Component showing navigation arrows for steps and turns.
- */
-var DirectionComponent = (function (_super) {
-    __extends(DirectionComponent, _super);
-    function DirectionComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._renderer = new Component_1.DirectionDOMRenderer(_this.defaultConfiguration, container.element);
-        _this._hoveredKeySubject$ = new Subject_1.Subject();
-        _this._hoveredKey$ = _this._hoveredKeySubject$.share();
-        return _this;
-    }
-    Object.defineProperty(DirectionComponent.prototype, "hoveredKey$", {
-        /**
-         * Get hovered key observable.
-         *
-         * @description An observable emitting the key of the node for the direction
-         * arrow that is being hovered. When the mouse leaves a direction arrow null
-         * is emitted.
-         *
-         * @returns {Observable<string>}
-         */
-        get: function () {
-            return this._hoveredKey$;
-        },
-        enumerable: true,
-        configurable: true
-    });
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.MarkerComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var THREE = require("three");
+var when = require("when");
+var Component_1 = require("../../Component");
+var Render_1 = require("../../Render");
+var Graph_1 = require("../../Graph");
+var Geo_1 = require("../../Geo");
+/**
+ * @class MarkerComponent
+ *
+ * @classdesc Component for showing and editing 3D marker objects.
+ *
+ * The `add` method is used for adding new markers or replacing
+ * markers already in the set.
+ *
+ * If a marker already in the set has the same
+ * id as one of the markers added, the old marker will be removed and
+ * the added marker will take its place.
+ *
+ * It is not possible to update markers in the set by updating any properties
+ * directly on the marker object. Markers need to be replaced by
+ * re-adding them for updates to geographic position or configuration
+ * to be reflected.
+ *
+ * Markers added to the marker component can be either interactive
+ * or non-interactive. Different marker types define their behavior.
+ * Markers with interaction support can be configured with options
+ * to respond to dragging inside the viewer and be detected when
+ * retrieving markers from pixel points with the `getMarkerIdAt` method.
+ *
+ * To retrive and use the marker component
+ *
+ * @example
+ * ```
+ * var viewer = new Mapillary.Viewer(
+ *     "<element-id>",
+ *     "<client-id>",
+ *     "<my key>",
+ *     { component: { marker: true } });
+ *
+ * var markerComponent = viewer.getComponent("marker");
+ * ```
+ */
+var MarkerComponent = /** @class */ (function (_super) {
+    __extends(MarkerComponent, _super);
+    /** @ignore */
+    function MarkerComponent(name, container, navigator) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._relativeGroundAltitude = -2;
+        _this._geoCoords = new Geo_1.GeoCoords();
+        _this._graphCalculator = new Graph_1.GraphCalculator();
+        _this._markerScene = new Component_1.MarkerScene();
+        _this._markerSet = new Component_1.MarkerSet();
+        _this._viewportCoords = new Geo_1.ViewportCoords();
+        return _this;
+    }
+    /**
+     * Add markers to the marker set or replace markers in the marker set.
+     *
+     * @description If a marker already in the set has the same
+     * id as one of the markers added, the old marker will be removed
+     * the added marker will take its place.
+     *
+     * Any marker inside the visible bounding bbox
+     * will be initialized and placed in the viewer.
+     *
+     * @param {Array<Marker>} markers - Markers to add.
+     *
+     * @example ```markerComponent.add([marker1, marker2]);```
+     */
+    MarkerComponent.prototype.add = function (markers) {
+        this._markerSet.add(markers);
+    };
     /**
-     * Set highlight key.
+     * Returns the marker in the marker set with the specified id, or
+     * undefined if the id matches no marker.
      *
-     * @description The arrow pointing towards the node corresponding to the
-     * highlight key will be highlighted.
+     * @param {string} markerId - Id of the marker.
+     *
+     * @example ```var marker = markerComponent.get("markerId");```
      *
-     * @param {string} highlightKey Key of node to be highlighted if existing
-     * among arrows.
      */
-    DirectionComponent.prototype.setHighlightKey = function (highlightKey) {
-        this.configure({ highlightKey: highlightKey });
+    MarkerComponent.prototype.get = function (markerId) {
+        return this._markerSet.get(markerId);
     };
     /**
-     * Set min width of container element.
+     * Returns an array of all markers.
      *
-     * @description  Set min width of the non transformed container element holding
-     * the navigation arrows. If the min width is larger than the max width the
-     * min width value will be used.
+     * @example ```var markers = markerComponent.getAll();```
+     */
+    MarkerComponent.prototype.getAll = function () {
+        return this._markerSet.getAll();
+    };
+    /**
+     * Returns the id of the interactive marker closest to the current camera
+     * position at the specified point.
      *
-     * The container element is automatically resized when the resize
-     * method on the Viewer class is called.
+     * @description Notice that the pixelPoint argument requires x, y
+     * coordinates from pixel space.
      *
-     * @param {number} minWidth
+     * With this function, you can use the coordinates provided by mouse
+     * events to get information out of the marker component.
+     *
+     * If no interactive geometry of an interactive marker exist at the pixel
+     * point, `null` will be returned.
+     *
+     * @param {Array<number>} pixelPoint - Pixel coordinates on the viewer element.
+     * @returns {string} Id of the interactive marker closest to the camera. If no
+     * interactive marker exist at the pixel point, `null` will be returned.
+     *
+     * @example
+     * ```
+     * markerComponent.getMarkerIdAt([100, 100])
+     *     .then((markerId) => { console.log(markerId); });
+     * ```
      */
-    DirectionComponent.prototype.setMinWidth = function (minWidth) {
-        this.configure({ minWidth: minWidth });
+    MarkerComponent.prototype.getMarkerIdAt = function (pixelPoint) {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            _this._container.renderService.renderCamera$.pipe(operators_1.first(), operators_1.map(function (render) {
+                var viewport = _this._viewportCoords
+                    .canvasToViewport(pixelPoint[0], pixelPoint[1], _this._container.element);
+                var id = _this._markerScene.intersectObjects(viewport, render.perspective);
+                return id;
+            }))
+                .subscribe(function (id) {
+                resolve(id);
+            }, function (error) {
+                reject(error);
+            });
+        });
     };
     /**
-     * Set max width of container element.
+     * Check if a marker exist in the marker set.
      *
-     * @description Set max width of the non transformed container element holding
-     * the navigation arrows. If the min width is larger than the max width the
-     * min width value will be used.
+     * @param {string} markerId - Id of the marker.
      *
-     * The container element is automatically resized when the resize
-     * method on the Viewer class is called.
+     * @example ```var markerExists = markerComponent.has("markerId");```
+     */
+    MarkerComponent.prototype.has = function (markerId) {
+        return this._markerSet.has(markerId);
+    };
+    /**
+     * Remove markers with the specified ids from the marker set.
      *
-     * @param {number} minWidth
+     * @param {Array<string>} markerIds - Ids for markers to remove.
+     *
+     * @example ```markerComponent.remove(["id-1", "id-2"]);```
      */
-    DirectionComponent.prototype.setMaxWidth = function (maxWidth) {
-        this.configure({ maxWidth: maxWidth });
+    MarkerComponent.prototype.remove = function (markerIds) {
+        this._markerSet.remove(markerIds);
     };
-    /** @inheritdoc */
-    DirectionComponent.prototype.resize = function () {
-        this._renderer.resize(this._container.element);
+    /**
+     * Remove all markers from the marker set.
+     *
+     * @example ```markerComponent.removeAll();```
+     */
+    MarkerComponent.prototype.removeAll = function () {
+        this._markerSet.removeAll();
     };
-    DirectionComponent.prototype._activate = function () {
+    MarkerComponent.prototype._activate = function () {
         var _this = this;
-        this._configurationSubscription = this._configuration$
-            .subscribe(function (configuration) {
-            _this._renderer.setConfiguration(configuration);
+        var groundAltitude$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state.camera.position.z + _this._relativeGroundAltitude;
+        }), operators_1.distinctUntilChanged(function (a1, a2) {
+            return Math.abs(a1 - a2) < 0.01;
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        var geoInitiated$ = rxjs_1.combineLatest(groundAltitude$, this._navigator.stateService.reference$).pipe(operators_1.first(), operators_1.map(function () { }), operators_1.publishReplay(1), operators_1.refCount());
+        var clampedConfiguration$ = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return { visibleBBoxSize: Math.max(1, Math.min(200, configuration.visibleBBoxSize)) };
+        }));
+        var currentlatLon$ = this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) { return node.latLon; }), operators_1.publishReplay(1), operators_1.refCount());
+        var visibleBBox$ = rxjs_1.combineLatest(clampedConfiguration$, currentlatLon$).pipe(operators_1.map(function (_a) {
+            var configuration = _a[0], latLon = _a[1];
+            return _this._graphCalculator
+                .boundingBoxCorners(latLon, configuration.visibleBBoxSize / 2);
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        var visibleMarkers$ = rxjs_1.combineLatest(rxjs_1.concat(rxjs_1.of(this._markerSet), this._markerSet.changed$), visibleBBox$).pipe(operators_1.map(function (_a) {
+            var set = _a[0], bbox = _a[1];
+            return set.search(bbox);
+        }));
+        this._setChangedSubscription = geoInitiated$.pipe(operators_1.switchMap(function () {
+            return visibleMarkers$.pipe(operators_1.withLatestFrom(_this._navigator.stateService.reference$, groundAltitude$));
+        }))
+            .subscribe(function (_a) {
+            var markers = _a[0], reference = _a[1], alt = _a[2];
+            var geoCoords = _this._geoCoords;
+            var markerScene = _this._markerScene;
+            var sceneMarkers = markerScene.markers;
+            var markersToRemove = Object.assign({}, sceneMarkers);
+            for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) {
+                var marker = markers_1[_i];
+                if (marker.id in sceneMarkers) {
+                    delete markersToRemove[marker.id];
+                }
+                else {
+                    var point3d = geoCoords
+                        .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
+                    markerScene.add(marker, point3d);
+                }
+            }
+            for (var id in markersToRemove) {
+                if (!markersToRemove.hasOwnProperty(id)) {
+                    continue;
+                }
+                markerScene.remove(id);
+            }
         });
-        this._nodeSubscription = this._navigator.stateService.currentNode$
-            .do(function (node) {
-            _this._container.domRenderer.render$.next({ name: _this._name, vnode: vd.h("div", {}, []) });
-            _this._renderer.setNode(node);
-        })
-            .withLatestFrom(this._configuration$)
-            .switchMap(function (nc) {
-            var node = nc[0];
-            var configuration = nc[1];
-            return node.spatialEdges$
-                .withLatestFrom(configuration.distinguishSequence ?
-                _this._navigator.graphService
-                    .cacheSequence$(node.sequenceKey)
-                    .catch(function (error, caught) {
-                    console.error("Failed to cache sequence (" + node.sequenceKey + ")", error);
-                    return Observable_1.Observable.empty();
-                }) :
-                Observable_1.Observable.of(null));
-        })
-            .subscribe(function (es) {
-            _this._renderer.setEdges(es[0], es[1]);
+        this._markersUpdatedSubscription = geoInitiated$.pipe(operators_1.switchMap(function () {
+            return _this._markerSet.updated$.pipe(operators_1.withLatestFrom(visibleBBox$, _this._navigator.stateService.reference$, groundAltitude$));
+        }))
+            .subscribe(function (_a) {
+            var markers = _a[0], _b = _a[1], sw = _b[0], ne = _b[1], reference = _a[2], alt = _a[3];
+            var geoCoords = _this._geoCoords;
+            var markerScene = _this._markerScene;
+            for (var _i = 0, markers_2 = markers; _i < markers_2.length; _i++) {
+                var marker = markers_2[_i];
+                var exists = markerScene.has(marker.id);
+                var visible = marker.latLon.lat > sw.lat &&
+                    marker.latLon.lat < ne.lat &&
+                    marker.latLon.lon > sw.lon &&
+                    marker.latLon.lon < ne.lon;
+                if (visible) {
+                    var point3d = geoCoords
+                        .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
+                    markerScene.add(marker, point3d);
+                }
+                else if (!visible && exists) {
+                    markerScene.remove(marker.id);
+                }
+            }
         });
-        this._renderCameraSubscription = this._container.renderService.renderCameraFrame$
-            .do(function (renderCamera) {
-            _this._renderer.setRenderCamera(renderCamera);
-        })
-            .map(function (renderCamera) {
-            return _this._renderer;
-        })
-            .filter(function (renderer) {
-            return renderer.needsRender;
-        })
-            .map(function (renderer) {
-            return { name: _this._name, vnode: renderer.render(_this._navigator) };
-        })
-            .subscribe(this._container.domRenderer.render$);
-        this._hoveredKeySubscription = Observable_1.Observable
-            .combineLatest([
-            this._container.domRenderer.element$,
-            this._container.renderService.renderCamera$,
-            this._container.mouseService.mouseMove$.startWith(null),
-            this._container.mouseService.mouseUp$.startWith(null),
-        ], function (e, rc, mm, mu) {
-            return e;
-        })
-            .map(function (element) {
-            var elements = element.getElementsByClassName("DirectionsPerspective");
-            for (var i = 0; i < elements.length; i++) {
-                var hovered = elements.item(i).querySelector(":hover");
-                if (hovered != null && hovered.hasAttribute("data-key")) {
-                    return hovered.getAttribute("data-key");
+        this._referenceSubscription = this._navigator.stateService.reference$.pipe(operators_1.skip(1), operators_1.withLatestFrom(groundAltitude$))
+            .subscribe(function (_a) {
+            var reference = _a[0], alt = _a[1];
+            var geoCoords = _this._geoCoords;
+            var markerScene = _this._markerScene;
+            for (var _i = 0, _b = markerScene.getAll(); _i < _b.length; _i++) {
+                var marker = _b[_i];
+                var point3d = geoCoords
+                    .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
+                markerScene.update(marker.id, point3d);
+            }
+        });
+        this._adjustHeightSubscription = groundAltitude$.pipe(operators_1.skip(1), operators_1.withLatestFrom(this._navigator.stateService.reference$, currentlatLon$))
+            .subscribe(function (_a) {
+            var alt = _a[0], reference = _a[1], latLon = _a[2];
+            var geoCoords = _this._geoCoords;
+            var markerScene = _this._markerScene;
+            var position = geoCoords
+                .geodeticToEnu(latLon.lat, latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
+            for (var _i = 0, _b = markerScene.getAll(); _i < _b.length; _i++) {
+                var marker = _b[_i];
+                var point3d = geoCoords
+                    .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
+                var distanceX = point3d[0] - position[0];
+                var distanceY = point3d[1] - position[1];
+                var groundDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY);
+                if (groundDistance > 50) {
+                    continue;
                 }
+                markerScene.lerpAltitude(marker.id, alt, Math.min(1, Math.max(0, 1.2 - 1.2 * groundDistance / 50)));
             }
-            return null;
-        })
-            .distinctUntilChanged()
-            .subscribe(this._hoveredKeySubject$);
+        });
+        this._renderSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            var scene = _this._markerScene;
+            return {
+                name: _this._name,
+                render: {
+                    frameId: frame.id,
+                    needsRender: scene.needsRender,
+                    render: scene.render.bind(scene),
+                    stage: Render_1.GLRenderStage.Foreground,
+                },
+            };
+        }))
+            .subscribe(this._container.glRenderer.render$);
+        var hoveredMarkerId$ = rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._container.mouseService.mouseMove$).pipe(operators_1.map(function (_a) {
+            var render = _a[0], event = _a[1];
+            var element = _this._container.element;
+            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
+            var viewport = _this._viewportCoords.canvasToViewport(canvasX, canvasY, element);
+            var markerId = _this._markerScene.intersectObjects(viewport, render.perspective);
+            return markerId;
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        var draggingStarted$ = this._container.mouseService
+            .filtered$(this._name, this._container.mouseService.mouseDragStart$).pipe(operators_1.map(function (event) {
+            return true;
+        }));
+        var draggingStopped$ = this._container.mouseService
+            .filtered$(this._name, this._container.mouseService.mouseDragEnd$).pipe(operators_1.map(function (event) {
+            return false;
+        }));
+        var filteredDragging$ = rxjs_1.merge(draggingStarted$, draggingStopped$).pipe(operators_1.startWith(false));
+        this._dragEventSubscription = rxjs_1.merge(draggingStarted$.pipe(operators_1.withLatestFrom(hoveredMarkerId$)), rxjs_1.combineLatest(draggingStopped$, rxjs_1.of(null))).pipe(operators_1.startWith([false, null]), operators_1.pairwise())
+            .subscribe(function (_a) {
+            var previous = _a[0], current = _a[1];
+            var dragging = current[0];
+            var eventType = dragging ? MarkerComponent.dragstart : MarkerComponent.dragend;
+            var id = dragging ? current[1] : previous[1];
+            var marker = _this._markerScene.get(id);
+            var markerEvent = { marker: marker, target: _this, type: eventType };
+            _this.fire(eventType, markerEvent);
+        });
+        var mouseDown$ = rxjs_1.merge(this._container.mouseService.mouseDown$.pipe(operators_1.map(function (event) { return true; })), this._container.mouseService.documentMouseUp$.pipe(operators_1.map(function (event) { return false; }))).pipe(operators_1.startWith(false));
+        this._mouseClaimSubscription = rxjs_1.combineLatest(this._container.mouseService.active$, hoveredMarkerId$.pipe(operators_1.distinctUntilChanged()), mouseDown$, filteredDragging$).pipe(operators_1.map(function (_a) {
+            var active = _a[0], markerId = _a[1], mouseDown = _a[2], filteredDragging = _a[3];
+            return (!active && markerId != null && mouseDown) || filteredDragging;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (claim) {
+            if (claim) {
+                _this._container.mouseService.claimMouse(_this._name, 1);
+                _this._container.mouseService.claimWheel(_this._name, 1);
+            }
+            else {
+                _this._container.mouseService.unclaimMouse(_this._name);
+                _this._container.mouseService.unclaimWheel(_this._name);
+            }
+        });
+        var offset$ = this._container.mouseService
+            .filtered$(this._name, this._container.mouseService.mouseDragStart$).pipe(operators_1.withLatestFrom(hoveredMarkerId$, this._container.renderService.renderCamera$), operators_1.map(function (_a) {
+            var e = _a[0], id = _a[1], r = _a[2];
+            var marker = _this._markerScene.get(id);
+            var element = _this._container.element;
+            var _b = _this._viewportCoords.projectToCanvas(marker.geometry.position.toArray(), element, r.perspective), groundCanvasX = _b[0], groundCanvasY = _b[1];
+            var _c = _this._viewportCoords.canvasPosition(e, element), canvasX = _c[0], canvasY = _c[1];
+            var offset = [canvasX - groundCanvasX, canvasY - groundCanvasY];
+            return [marker, offset, r];
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._updateMarkerSubscription = this._container.mouseService
+            .filtered$(this._name, this._container.mouseService.mouseDrag$).pipe(operators_1.withLatestFrom(offset$, this._navigator.stateService.reference$, clampedConfiguration$))
+            .subscribe(function (_a) {
+            var event = _a[0], _b = _a[1], marker = _b[0], offset = _b[1], render = _b[2], reference = _a[2], configuration = _a[3];
+            if (!_this._markerScene.has(marker.id)) {
+                return;
+            }
+            var element = _this._container.element;
+            var _c = _this._viewportCoords.canvasPosition(event, element), canvasX = _c[0], canvasY = _c[1];
+            var groundX = canvasX - offset[0];
+            var groundY = canvasY - offset[1];
+            var _d = _this._viewportCoords
+                .canvasToViewport(groundX, groundY, element), viewportX = _d[0], viewportY = _d[1];
+            var direction = new THREE.Vector3(viewportX, viewportY, 1)
+                .unproject(render.perspective)
+                .sub(render.perspective.position)
+                .normalize();
+            var distance = Math.min(_this._relativeGroundAltitude / direction.z, configuration.visibleBBoxSize / 2 - 0.1);
+            if (distance < 0) {
+                return;
+            }
+            var intersection = direction
+                .clone()
+                .multiplyScalar(distance)
+                .add(render.perspective.position);
+            intersection.z = render.perspective.position.z + _this._relativeGroundAltitude;
+            var _e = _this._geoCoords
+                .enuToGeodetic(intersection.x, intersection.y, intersection.z, reference.lat, reference.lon, reference.alt), lat = _e[0], lon = _e[1];
+            _this._markerScene.update(marker.id, intersection.toArray(), { lat: lat, lon: lon });
+            _this._markerSet.update(marker);
+            var markerEvent = { marker: marker, target: _this, type: MarkerComponent.changed };
+            _this.fire(MarkerComponent.changed, markerEvent);
+        });
     };
-    DirectionComponent.prototype._deactivate = function () {
-        this._configurationSubscription.unsubscribe();
-        this._nodeSubscription.unsubscribe();
-        this._renderCameraSubscription.unsubscribe();
-        this._hoveredKeySubscription.unsubscribe();
+    MarkerComponent.prototype._deactivate = function () {
+        this._adjustHeightSubscription.unsubscribe();
+        this._dragEventSubscription.unsubscribe();
+        this._markersUpdatedSubscription.unsubscribe();
+        this._mouseClaimSubscription.unsubscribe();
+        this._referenceSubscription.unsubscribe();
+        this._renderSubscription.unsubscribe();
+        this._setChangedSubscription.unsubscribe();
+        this._updateMarkerSubscription.unsubscribe();
+        this._markerScene.clear();
     };
-    DirectionComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            distinguishSequence: false,
-            maxWidth: 460,
-            minWidth: 260,
-        };
+    MarkerComponent.prototype._getDefaultConfiguration = function () {
+        return { visibleBBoxSize: 100 };
     };
-    /** @inheritdoc */
-    DirectionComponent.componentName = "direction";
-    return DirectionComponent;
+    MarkerComponent.componentName = "marker";
+    /**
+     * Fired when the position of a marker is changed.
+     * @event
+     * @type {IMarkerEvent} markerEvent - Marker event data.
+     * @example
+     * ```
+     * markerComponent.on("changed", function(e) {
+     *     console.log(e.marker.id, e.marker.latLon);
+     * });
+     * ```
+     */
+    MarkerComponent.changed = "changed";
+    /**
+     * Fired when a marker drag interaction starts.
+     * @event
+     * @type {IMarkerEvent} markerEvent - Marker event data.
+     * @example
+     * ```
+     * markerComponent.on("dragstart", function(e) {
+     *     console.log(e.marker.id, e.marker.latLon);
+     * });
+     * ```
+     */
+    MarkerComponent.dragstart = "dragstart";
+    /**
+     * Fired when a marker drag interaction ends.
+     * @event
+     * @type {IMarkerEvent} markerEvent - Marker event data.
+     * @example
+     * ```
+     * markerComponent.on("dragend", function(e) {
+     *     console.log(e.marker.id, e.marker.latLon);
+     * });
+     * ```
+     */
+    MarkerComponent.dragend = "dragend";
+    return MarkerComponent;
 }(Component_1.Component));
-exports.DirectionComponent = DirectionComponent;
-Component_1.ComponentService.register(DirectionComponent);
-exports.default = DirectionComponent;
+exports.MarkerComponent = MarkerComponent;
+Component_1.ComponentService.register(MarkerComponent);
+exports.default = MarkerComponent;
+
 
-},{"../../Component":226,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/share":74,"virtual-dom":182}],254:[function(require,module,exports){
+},{"../../Component":291,"../../Geo":294,"../../Graph":295,"../../Render":297,"rxjs":43,"rxjs/operators":241,"three":242,"when":288}],335:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var Geo_1 = require("../../Geo");
-/**
- * @class DirectionDOMCalculator
- * @classdesc Helper class for calculating DOM CSS properties.
- */
-var DirectionDOMCalculator = (function () {
-    function DirectionDOMCalculator(configuration, element) {
-        this._spatial = new Geo_1.Spatial();
-        this._minThresholdWidth = 320;
-        this._maxThresholdWidth = 1480;
-        this._minThresholdHeight = 240;
-        this._maxThresholdHeight = 820;
-        this._configure(configuration);
-        this._resize(element);
-        this._reset();
+exports.MarkerScene = void 0;
+var THREE = require("three");
+var MarkerScene = /** @class */ (function () {
+    function MarkerScene(scene, raycaster) {
+        this._needsRender = false;
+        this._interactiveObjects = [];
+        this._markers = {};
+        this._objectMarkers = {};
+        this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster();
+        this._scene = !!scene ? scene : new THREE.Scene();
     }
-    Object.defineProperty(DirectionDOMCalculator.prototype, "minWidth", {
-        get: function () {
-            return this._minWidth;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "maxWidth", {
-        get: function () {
-            return this._maxWidth;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerWidth", {
-        get: function () {
-            return this._containerWidth;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerWidthCss", {
-        get: function () {
-            return this._containerWidthCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerMarginCss", {
-        get: function () {
-            return this._containerMarginCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerLeftCss", {
-        get: function () {
-            return this._containerLeftCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerHeight", {
-        get: function () {
-            return this._containerHeight;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerHeightCss", {
-        get: function () {
-            return this._containerHeightCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerBottomCss", {
-        get: function () {
-            return this._containerBottomCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleSize", {
-        get: function () {
-            return this._stepCircleSize;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleSizeCss", {
-        get: function () {
-            return this._stepCircleSizeCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleMarginCss", {
-        get: function () {
-            return this._stepCircleMarginCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "turnCircleSize", {
-        get: function () {
-            return this._turnCircleSize;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "turnCircleSizeCss", {
+    Object.defineProperty(MarkerScene.prototype, "markers", {
         get: function () {
-            return this._turnCircleSizeCss;
+            return this._markers;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "outerRadius", {
+    Object.defineProperty(MarkerScene.prototype, "needsRender", {
         get: function () {
-            return this._outerRadius;
+            return this._needsRender;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "innerRadius", {
+    MarkerScene.prototype.add = function (marker, position) {
+        if (marker.id in this._markers) {
+            this._dispose(marker.id);
+        }
+        marker.createGeometry(position);
+        this._scene.add(marker.geometry);
+        this._markers[marker.id] = marker;
+        for (var _i = 0, _a = marker.getInteractiveObjects(); _i < _a.length; _i++) {
+            var interactiveObject = _a[_i];
+            this._interactiveObjects.push(interactiveObject);
+            this._objectMarkers[interactiveObject.uuid] = marker.id;
+        }
+        this._needsRender = true;
+    };
+    MarkerScene.prototype.clear = function () {
+        for (var id in this._markers) {
+            if (!this._markers.hasOwnProperty) {
+                continue;
+            }
+            this._dispose(id);
+        }
+        this._needsRender = true;
+    };
+    MarkerScene.prototype.get = function (id) {
+        return this._markers[id];
+    };
+    MarkerScene.prototype.getAll = function () {
+        var _this = this;
+        return Object
+            .keys(this._markers)
+            .map(function (id) { return _this._markers[id]; });
+    };
+    MarkerScene.prototype.has = function (id) {
+        return id in this._markers;
+    };
+    MarkerScene.prototype.intersectObjects = function (_a, camera) {
+        var viewportX = _a[0], viewportY = _a[1];
+        this._raycaster.setFromCamera(new THREE.Vector2(viewportX, viewportY), camera);
+        var intersects = this._raycaster.intersectObjects(this._interactiveObjects);
+        for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) {
+            var intersect = intersects_1[_i];
+            if (intersect.object.uuid in this._objectMarkers) {
+                return this._objectMarkers[intersect.object.uuid];
+            }
+        }
+        return null;
+    };
+    MarkerScene.prototype.lerpAltitude = function (id, alt, alpha) {
+        if (!(id in this._markers)) {
+            return;
+        }
+        this._markers[id].lerpAltitude(alt, alpha);
+        this._needsRender = true;
+    };
+    MarkerScene.prototype.remove = function (id) {
+        if (!(id in this._markers)) {
+            return;
+        }
+        this._dispose(id);
+        this._needsRender = true;
+    };
+    MarkerScene.prototype.render = function (perspectiveCamera, renderer) {
+        renderer.render(this._scene, perspectiveCamera);
+        this._needsRender = false;
+    };
+    MarkerScene.prototype.update = function (id, position, latLon) {
+        if (!(id in this._markers)) {
+            return;
+        }
+        var marker = this._markers[id];
+        marker.updatePosition(position, latLon);
+        this._needsRender = true;
+    };
+    MarkerScene.prototype._dispose = function (id) {
+        var marker = this._markers[id];
+        this._scene.remove(marker.geometry);
+        for (var _i = 0, _a = marker.getInteractiveObjects(); _i < _a.length; _i++) {
+            var interactiveObject = _a[_i];
+            var index = this._interactiveObjects.indexOf(interactiveObject);
+            if (index !== -1) {
+                this._interactiveObjects.splice(index, 1);
+            }
+            else {
+                console.warn("Object does not exist (" + interactiveObject.id + ") for " + id);
+            }
+            delete this._objectMarkers[interactiveObject.uuid];
+        }
+        marker.disposeGeometry();
+        delete this._markers[id];
+    };
+    return MarkerScene;
+}());
+exports.MarkerScene = MarkerScene;
+exports.default = MarkerScene;
+
+},{"three":242}],336:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.MarkerSet = void 0;
+var rxjs_1 = require("rxjs");
+var Geo_1 = require("../../Geo");
+var MarkerSet = /** @class */ (function () {
+    function MarkerSet() {
+        this._hash = {};
+        this._index = new Geo_1.GeoRBush(16);
+        this._indexChanged$ = new rxjs_1.Subject();
+        this._updated$ = new rxjs_1.Subject();
+    }
+    Object.defineProperty(MarkerSet.prototype, "changed$", {
         get: function () {
-            return this._innerRadius;
+            return this._indexChanged$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "shadowOffset", {
+    Object.defineProperty(MarkerSet.prototype, "updated$", {
         get: function () {
-            return this._shadowOffset;
+            return this._updated$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    /**
-     * Configures the min and max width values.
-     *
-     * @param {IDirectionConfiguration} configuration Configuration
-     * with min and max width values.
-     */
-    DirectionDOMCalculator.prototype.configure = function (configuration) {
-        this._configure(configuration);
-        this._reset();
-    };
-    /**
-     * Resizes all properties according to the width and height
-     * of the element.
-     *
-     * @param {HTMLElement} element The container element from which to extract
-     * the width and height.
-     */
-    DirectionDOMCalculator.prototype.resize = function (element) {
-        this._resize(element);
-        this._reset();
-    };
-    /**
-     * Calculates the coordinates on the unit circle for an angle.
-     *
-     * @param {number} angle Angle in radians.
-     * @returns {Array<number>} The x and y coordinates on the unit circle.
-     */
-    DirectionDOMCalculator.prototype.angleToCoordinates = function (angle) {
-        return [Math.cos(angle), Math.sin(angle)];
+    MarkerSet.prototype.add = function (markers) {
+        var updated = [];
+        var hash = this._hash;
+        var index = this._index;
+        for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) {
+            var marker = markers_1[_i];
+            var id = marker.id;
+            if (id in hash) {
+                index.remove(hash[id]);
+                updated.push(marker);
+            }
+            var item = {
+                lat: marker.latLon.lat,
+                lon: marker.latLon.lon,
+                marker: marker,
+            };
+            hash[id] = item;
+            index.insert(item);
+        }
+        if (updated.length > 0) {
+            this._updated$.next(updated);
+        }
+        if (markers.length > updated.length) {
+            this._indexChanged$.next(this);
+        }
     };
-    /**
-     * Calculates the coordinates on the unit circle for the
-     * relative angle between the first and second angle.
-     *
-     * @param {number} first Angle in radians.
-     * @param {number} second Angle in radians.
-     * @returns {Array<number>} The x and y coordinates on the unit circle
-     * for the relative angle between the first and second angle.
-     */
-    DirectionDOMCalculator.prototype.relativeAngleToCoordiantes = function (first, second) {
-        var relativeAngle = this._spatial.wrapAngle(first - second);
-        return this.angleToCoordinates(relativeAngle);
+    MarkerSet.prototype.has = function (id) {
+        return id in this._hash;
     };
-    DirectionDOMCalculator.prototype._configure = function (configuration) {
-        this._minWidth = configuration.minWidth;
-        this._maxWidth = this._getMaxWidth(configuration.minWidth, configuration.maxWidth);
+    MarkerSet.prototype.get = function (id) {
+        return this.has(id) ? this._hash[id].marker : undefined;
     };
-    DirectionDOMCalculator.prototype._resize = function (element) {
-        this._elementWidth = element.offsetWidth;
-        this._elementHeight = element.offsetHeight;
+    MarkerSet.prototype.getAll = function () {
+        return this._index
+            .all()
+            .map(function (indexItem) {
+            return indexItem.marker;
+        });
     };
-    DirectionDOMCalculator.prototype._reset = function () {
-        this._containerWidth = this._getContainerWidth(this._elementWidth, this._elementHeight);
-        this._containerHeight = this._getContainerHeight(this.containerWidth);
-        this._stepCircleSize = this._getStepCircleDiameter(this._containerHeight);
-        this._turnCircleSize = this._getTurnCircleDiameter(this.containerHeight);
-        this._outerRadius = this._getOuterRadius(this._containerHeight);
-        this._innerRadius = this._getInnerRadius(this._containerHeight);
-        this._shadowOffset = 3;
-        this._containerWidthCss = this._numberToCssPixels(this._containerWidth);
-        this._containerMarginCss = this._numberToCssPixels(-0.5 * this._containerWidth);
-        this._containerLeftCss = this._numberToCssPixels(Math.floor(0.5 * this._elementWidth));
-        this._containerHeightCss = this._numberToCssPixels(this._containerHeight);
-        this._containerBottomCss = this._numberToCssPixels(Math.floor(-0.08 * this._containerHeight));
-        this._stepCircleSizeCss = this._numberToCssPixels(this._stepCircleSize);
-        this._stepCircleMarginCss = this._numberToCssPixels(-0.5 * this._stepCircleSize);
-        this._turnCircleSizeCss = this._numberToCssPixels(this._turnCircleSize);
+    MarkerSet.prototype.remove = function (ids) {
+        var hash = this._hash;
+        var index = this._index;
+        var changed = false;
+        for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
+            var id = ids_1[_i];
+            if (!(id in hash)) {
+                continue;
+            }
+            var item = hash[id];
+            index.remove(item);
+            delete hash[id];
+            changed = true;
+        }
+        if (changed) {
+            this._indexChanged$.next(this);
+        }
     };
-    DirectionDOMCalculator.prototype._getContainerWidth = function (elementWidth, elementHeight) {
-        var relativeWidth = (elementWidth - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth);
-        var relativeHeight = (elementHeight - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight);
-        var coeff = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));
-        coeff = 0.04 * Math.round(25 * coeff);
-        return this._minWidth + coeff * (this._maxWidth - this._minWidth);
+    MarkerSet.prototype.removeAll = function () {
+        this._hash = {};
+        this._index.clear();
+        this._indexChanged$.next(this);
     };
-    DirectionDOMCalculator.prototype._getContainerHeight = function (containerWidth) {
-        return 0.77 * containerWidth;
+    MarkerSet.prototype.search = function (_a) {
+        var sw = _a[0], ne = _a[1];
+        return this._index
+            .search({
+            maxX: ne.lat,
+            maxY: ne.lon,
+            minX: sw.lat,
+            minY: sw.lon,
+        })
+            .map(function (indexItem) {
+            return indexItem.marker;
+        });
     };
-    DirectionDOMCalculator.prototype._getStepCircleDiameter = function (containerHeight) {
-        return 0.34 * containerHeight;
+    MarkerSet.prototype.update = function (marker) {
+        var hash = this._hash;
+        var index = this._index;
+        var id = marker.id;
+        if (!(id in hash)) {
+            return;
+        }
+        index.remove(hash[id]);
+        var item = {
+            lat: marker.latLon.lat,
+            lon: marker.latLon.lon,
+            marker: marker,
+        };
+        hash[id] = item;
+        index.insert(item);
     };
-    DirectionDOMCalculator.prototype._getTurnCircleDiameter = function (containerHeight) {
-        return 0.3 * containerHeight;
+    return MarkerSet;
+}());
+exports.MarkerSet = MarkerSet;
+exports.default = MarkerSet;
+
+},{"../../Geo":294,"rxjs":43}],337:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}],338:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     };
-    DirectionDOMCalculator.prototype._getOuterRadius = function (containerHeight) {
-        return 0.31 * containerHeight;
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    DirectionDOMCalculator.prototype._getInnerRadius = function (containerHeight) {
-        return 0.125 * containerHeight;
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CircleMarker = void 0;
+var THREE = require("three");
+var Component_1 = require("../../../Component");
+/**
+ * @class CircleMarker
+ *
+ * @classdesc Non-interactive marker with a flat circle shape. The circle
+ * marker can not be configured to be interactive.
+ *
+ * Circle marker properties can not be updated after creation.
+ *
+ * To create and add one `CircleMarker` with default configuration
+ * and one with configuration use
+ *
+ * @example
+ * ```
+ * var defaultMarker = new Mapillary.MarkerComponent.CircleMarker(
+ *     "id-1",
+ *     { lat: 0, lon: 0, });
+ *
+ * var configuredMarker = new Mapillary.MarkerComponent.CircleMarker(
+ *     "id-2",
+ *     { lat: 0, lon: 0, },
+ *     {
+ *         color: "#0Ff",
+ *         opacity: 0.3,
+ *         radius: 0.7,
+ *     });
+ *
+ * markerComponent.add([defaultMarker, configuredMarker]);
+ * ```
+ */
+var CircleMarker = /** @class */ (function (_super) {
+    __extends(CircleMarker, _super);
+    function CircleMarker(id, latLon, options) {
+        var _this = _super.call(this, id, latLon) || this;
+        options = !!options ? options : {};
+        _this._color = options.color != null ? options.color : 0xffffff;
+        _this._opacity = options.opacity != null ? options.opacity : 0.4;
+        _this._radius = options.radius != null ? options.radius : 1;
+        return _this;
+    }
+    CircleMarker.prototype._createGeometry = function (position) {
+        var circle = new THREE.Mesh(new THREE.CircleGeometry(this._radius, 16), new THREE.MeshBasicMaterial({
+            color: this._color,
+            opacity: this._opacity,
+            transparent: true,
+        }));
+        circle.up.fromArray([0, 0, 1]);
+        circle.renderOrder = -1;
+        var group = new THREE.Object3D();
+        group.add(circle);
+        group.position.fromArray(position);
+        this._geometry = group;
     };
-    DirectionDOMCalculator.prototype._numberToCssPixels = function (value) {
-        return value + "px";
+    CircleMarker.prototype._disposeGeometry = function () {
+        for (var _i = 0, _a = this._geometry.children; _i < _a.length; _i++) {
+            var mesh = _a[_i];
+            mesh.geometry.dispose();
+            mesh.material.dispose();
+        }
     };
-    DirectionDOMCalculator.prototype._getMaxWidth = function (value, minWidth) {
-        return value > minWidth ? value : minWidth;
+    CircleMarker.prototype._getInteractiveObjects = function () {
+        return [];
     };
-    return DirectionDOMCalculator;
-}());
-exports.DirectionDOMCalculator = DirectionDOMCalculator;
-exports.default = DirectionDOMCalculator;
+    return CircleMarker;
+}(Component_1.Marker));
+exports.CircleMarker = CircleMarker;
+exports.default = CircleMarker;
 
-},{"../../Geo":229}],255:[function(require,module,exports){
+},{"../../../Component":291,"three":242}],339:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
-var vd = require("virtual-dom");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-var Geo_1 = require("../../Geo");
+exports.Marker = void 0;
 /**
- * @class DirectionDOMRenderer
- * @classdesc DOM renderer for direction arrows.
+ * @class Marker
+ *
+ * @classdesc Represents an abstract marker class that should be extended
+ * by marker implementations used in the marker component.
  */
-var DirectionDOMRenderer = (function () {
-    function DirectionDOMRenderer(configuration, element) {
-        this._isEdge = false;
-        this._spatial = new Geo_1.Spatial();
-        this._calculator = new Component_1.DirectionDOMCalculator(configuration, element);
-        this._node = null;
-        this._rotation = { phi: 0, theta: 0 };
-        this._epsilon = 0.5 * Math.PI / 180;
-        this._highlightKey = null;
-        this._distinguishSequence = false;
-        this._needsRender = false;
-        this._stepEdges = [];
-        this._turnEdges = [];
-        this._panoEdges = [];
-        this._sequenceEdgeKeys = [];
-        this._stepDirections = [
-            Edge_1.EdgeDirection.StepForward,
-            Edge_1.EdgeDirection.StepBackward,
-            Edge_1.EdgeDirection.StepLeft,
-            Edge_1.EdgeDirection.StepRight,
-        ];
-        this._turnDirections = [
-            Edge_1.EdgeDirection.TurnLeft,
-            Edge_1.EdgeDirection.TurnRight,
-            Edge_1.EdgeDirection.TurnU,
-        ];
-        this._turnNames = {};
-        this._turnNames[Edge_1.EdgeDirection.TurnLeft] = "TurnLeft";
-        this._turnNames[Edge_1.EdgeDirection.TurnRight] = "TurnRight";
-        this._turnNames[Edge_1.EdgeDirection.TurnU] = "TurnAround";
-        // detects IE 8-11, then Edge 20+.
-        var isIE = !!document.documentMode;
-        this._isEdge = !isIE && !!window.StyleMedia;
+var Marker = /** @class */ (function () {
+    function Marker(id, latLon) {
+        this._id = id;
+        this._latLon = latLon;
     }
-    Object.defineProperty(DirectionDOMRenderer.prototype, "needsRender", {
+    Object.defineProperty(Marker.prototype, "id", {
         /**
-         * Get needs render.
+         * Get id.
+         * @returns {string} The id of the marker.
+         */
+        get: function () {
+            return this._id;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Marker.prototype, "geometry", {
+        /**
+         * Get geometry.
          *
-         * @returns {boolean} Value indicating whether render should be called.
+         * @ignore
          */
         get: function () {
-            return this._needsRender;
+            return this._geometry;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    /**
-     * Renders virtual DOM elements.
-     *
-     * @description Calling render resets the needs render property.
-     */
-    DirectionDOMRenderer.prototype.render = function (navigator) {
-        this._needsRender = false;
-        var rotation = this._rotation;
-        var steps = [];
-        var turns = [];
-        if (this._node.pano) {
-            steps = steps.concat(this._createPanoArrows(navigator, rotation));
+    Object.defineProperty(Marker.prototype, "latLon", {
+        /**
+         * Get lat lon.
+         * @returns {ILatLon} The geographic coordinates of the marker.
+         */
+        get: function () {
+            return this._latLon;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /** @ignore */
+    Marker.prototype.createGeometry = function (position) {
+        if (!!this._geometry) {
+            return;
         }
-        else {
-            steps = steps.concat(this._createPerspectiveToPanoArrows(navigator, rotation));
-            steps = steps.concat(this._createStepArrows(navigator, rotation));
-            turns = turns.concat(this._createTurnArrows(navigator));
+        this._createGeometry(position);
+        // update matrix world if raycasting occurs before first render
+        this._geometry.updateMatrixWorld(true);
+    };
+    /** @ignore */
+    Marker.prototype.disposeGeometry = function () {
+        if (!this._geometry) {
+            return;
         }
-        return this._getContainer(steps, turns, rotation);
+        this._disposeGeometry();
+        this._geometry = undefined;
+    };
+    /** @ignore */
+    Marker.prototype.getInteractiveObjects = function () {
+        if (!this._geometry) {
+            return [];
+        }
+        return this._getInteractiveObjects();
+    };
+    /** @ignore */
+    Marker.prototype.lerpAltitude = function (alt, alpha) {
+        if (!this._geometry) {
+            return;
+        }
+        this._geometry.position.z = (1 - alpha) * this._geometry.position.z + alpha * alt;
+    };
+    /** @ignore */
+    Marker.prototype.updatePosition = function (position, latLon) {
+        if (!!latLon) {
+            this._latLon.lat = latLon.lat;
+            this._latLon.lon = latLon.lon;
+        }
+        if (!this._geometry) {
+            return;
+        }
+        this._geometry.position.fromArray(position);
+        this._geometry.updateMatrixWorld(true);
+    };
+    return Marker;
+}());
+exports.Marker = Marker;
+exports.default = Marker;
+
+},{}],340:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SimpleMarker = void 0;
+var THREE = require("three");
+var Component_1 = require("../../../Component");
+/**
+ * @class SimpleMarker
+ *
+ * @classdesc Interactive marker with ice cream shape. The sphere
+ * inside the ice cream can be configured to be interactive.
+ *
+ * Simple marker properties can not be updated after creation.
+ *
+ * To create and add one `SimpleMarker` with default configuration
+ * (non-interactive) and one interactive with configuration use
+ *
+ * @example
+ * ```
+ * var defaultMarker = new Mapillary.MarkerComponent.SimpleMarker(
+ *     "id-1",
+ *     { lat: 0, lon: 0, });
+ *
+ * var interactiveMarker = new Mapillary.MarkerComponent.SimpleMarker(
+ *     "id-2",
+ *     { lat: 0, lon: 0, },
+ *     {
+ *         ballColor: "#00f",
+ *         ballOpacity: 0.5,
+ *         color: "#00f",
+ *         interactive: true,
+ *         opacity: 0.3,
+ *         radius: 0.7,
+ *     });
+ *
+ * markerComponent.add([defaultMarker, interactiveMarker]);
+ * ```
+ */
+var SimpleMarker = /** @class */ (function (_super) {
+    __extends(SimpleMarker, _super);
+    function SimpleMarker(id, latLon, options) {
+        var _this = _super.call(this, id, latLon) || this;
+        options = !!options ? options : {};
+        _this._ballColor = options.ballColor != null ? options.ballColor : 0xff0000;
+        _this._ballOpacity = options.ballOpacity != null ? options.ballOpacity : 0.8;
+        _this._circleToRayAngle = 2;
+        _this._color = options.color != null ? options.color : 0xff0000;
+        _this._interactive = !!options.interactive;
+        _this._opacity = options.opacity != null ? options.opacity : 0.4;
+        _this._radius = options.radius != null ? options.radius : 1;
+        return _this;
+    }
+    SimpleMarker.prototype._createGeometry = function (position) {
+        var radius = this._radius;
+        var cone = new THREE.Mesh(this._markerGeometry(radius, 8, 8), new THREE.MeshBasicMaterial({
+            color: this._color,
+            opacity: this._opacity,
+            transparent: true,
+        }));
+        cone.renderOrder = 1;
+        var ball = new THREE.Mesh(new THREE.SphereGeometry(radius / 2, 8, 8), new THREE.MeshBasicMaterial({
+            color: this._ballColor,
+            opacity: this._ballOpacity,
+            transparent: true,
+        }));
+        ball.position.z = this._markerHeight(radius);
+        var group = new THREE.Object3D();
+        group.add(ball);
+        group.add(cone);
+        group.position.fromArray(position);
+        this._geometry = group;
     };
-    DirectionDOMRenderer.prototype.setEdges = function (edgeStatus, sequence) {
-        this._setEdges(edgeStatus, sequence);
-        this._setNeedsRender();
+    SimpleMarker.prototype._disposeGeometry = function () {
+        for (var _i = 0, _a = this._geometry.children; _i < _a.length; _i++) {
+            var mesh = _a[_i];
+            mesh.geometry.dispose();
+            mesh.material.dispose();
+        }
     };
-    /**
-     * Set node for which to show edges.
-     *
-     * @param {Node} node
-     */
-    DirectionDOMRenderer.prototype.setNode = function (node) {
-        this._node = node;
-        this._clearEdges();
-        this._setNeedsRender();
+    SimpleMarker.prototype._getInteractiveObjects = function () {
+        return this._interactive ? [this._geometry.children[0]] : [];
     };
-    /**
-     * Set the render camera to use for calculating rotations.
-     *
-     * @param {RenderCamera} renderCamera
-     */
-    DirectionDOMRenderer.prototype.setRenderCamera = function (renderCamera) {
-        var rotation = renderCamera.rotation;
-        if (Math.abs(rotation.phi - this._rotation.phi) < this._epsilon) {
-            return;
-        }
-        this._rotation = rotation;
-        this._setNeedsRender();
+    SimpleMarker.prototype._markerHeight = function (radius) {
+        var t = Math.tan(Math.PI - this._circleToRayAngle);
+        return radius * Math.sqrt(1 + t * t);
     };
-    /**
-     * Set configuration values.
-     *
-     * @param {IDirectionConfiguration} configuration
-     */
-    DirectionDOMRenderer.prototype.setConfiguration = function (configuration) {
-        var needsRender = false;
-        if (this._highlightKey !== configuration.highlightKey ||
-            this._distinguishSequence !== configuration.distinguishSequence) {
-            this._highlightKey = configuration.highlightKey;
-            this._distinguishSequence = configuration.distinguishSequence;
-            needsRender = true;
-        }
-        if (this._calculator.minWidth !== configuration.minWidth ||
-            this._calculator.maxWidth !== configuration.maxWidth) {
-            this._calculator.configure(configuration);
-            needsRender = true;
+    SimpleMarker.prototype._markerGeometry = function (radius, widthSegments, heightSegments) {
+        var geometry = new THREE.Geometry();
+        widthSegments = Math.max(3, Math.floor(widthSegments) || 8);
+        heightSegments = Math.max(2, Math.floor(heightSegments) || 6);
+        var height = this._markerHeight(radius);
+        var vertices = [];
+        for (var y = 0; y <= heightSegments; ++y) {
+            var verticesRow = [];
+            for (var x = 0; x <= widthSegments; ++x) {
+                var u = x / widthSegments * Math.PI * 2;
+                var v = y / heightSegments * Math.PI;
+                var r = void 0;
+                if (v < this._circleToRayAngle) {
+                    r = radius;
+                }
+                else {
+                    var t = Math.tan(v - this._circleToRayAngle);
+                    r = radius * Math.sqrt(1 + t * t);
+                }
+                var vertex = new THREE.Vector3();
+                vertex.x = r * Math.cos(u) * Math.sin(v);
+                vertex.y = r * Math.sin(u) * Math.sin(v);
+                vertex.z = r * Math.cos(v) + height;
+                geometry.vertices.push(vertex);
+                verticesRow.push(geometry.vertices.length - 1);
+            }
+            vertices.push(verticesRow);
         }
-        if (needsRender) {
-            this._setNeedsRender();
+        for (var y = 0; y < heightSegments; ++y) {
+            for (var x = 0; x < widthSegments; ++x) {
+                var v1 = vertices[y][x + 1];
+                var v2 = vertices[y][x];
+                var v3 = vertices[y + 1][x];
+                var v4 = vertices[y + 1][x + 1];
+                var n1 = geometry.vertices[v1].clone().normalize();
+                var n2 = geometry.vertices[v2].clone().normalize();
+                var n3 = geometry.vertices[v3].clone().normalize();
+                var n4 = geometry.vertices[v4].clone().normalize();
+                geometry.faces.push(new THREE.Face3(v1, v2, v4, [n1, n2, n4]));
+                geometry.faces.push(new THREE.Face3(v2, v3, v4, [n2.clone(), n3, n4.clone()]));
+            }
         }
+        geometry.computeFaceNormals();
+        geometry.boundingSphere = new THREE.Sphere(new THREE.Vector3(), radius + height);
+        return geometry;
     };
-    /**
-     * Detect the element's width and height and resize
-     * elements accordingly.
-     *
-     * @param {HTMLElement} element Viewer container element.
-     */
-    DirectionDOMRenderer.prototype.resize = function (element) {
-        this._calculator.resize(element);
-        this._setNeedsRender();
-    };
-    DirectionDOMRenderer.prototype._setNeedsRender = function () {
-        if (this._node != null) {
-            this._needsRender = true;
-        }
+    return SimpleMarker;
+}(Component_1.Marker));
+exports.SimpleMarker = SimpleMarker;
+exports.default = SimpleMarker;
+
+},{"../../../Component":291,"three":242}],341:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     };
-    DirectionDOMRenderer.prototype._clearEdges = function () {
-        this._stepEdges = [];
-        this._turnEdges = [];
-        this._panoEdges = [];
-        this._sequenceEdgeKeys = [];
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    DirectionDOMRenderer.prototype._setEdges = function (edgeStatus, sequence) {
-        this._stepEdges = [];
-        this._turnEdges = [];
-        this._panoEdges = [];
-        this._sequenceEdgeKeys = [];
-        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-            var edge = _a[_i];
-            var direction = edge.data.direction;
-            if (this._stepDirections.indexOf(direction) > -1) {
-                this._stepEdges.push(edge);
-                continue;
-            }
-            if (this._turnDirections.indexOf(direction) > -1) {
-                this._turnEdges.push(edge);
-                continue;
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.BounceHandler = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+/**
+ * The `BounceHandler` ensures that the viewer bounces back to the image
+ * when drag panning outside of the image edge.
+ */
+var BounceHandler = /** @class */ (function (_super) {
+    __extends(BounceHandler, _super);
+    function BounceHandler(component, container, navigator, viewportCoords, spatial) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._spatial = spatial;
+        _this._viewportCoords = viewportCoords;
+        return _this;
+    }
+    BounceHandler.prototype._enable = function () {
+        var _this = this;
+        var inTransition$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state.alpha < 1;
+        }), operators_1.distinctUntilChanged());
+        this._bounceSubscription = rxjs_1.combineLatest(inTransition$, this._navigator.stateService.inTranslation$, this._container.mouseService.active$, this._container.touchService.active$).pipe(operators_1.map(function (noForce) {
+            return noForce[0] || noForce[1] || noForce[2] || noForce[3];
+        }), operators_1.distinctUntilChanged(), operators_1.switchMap(function (noForce) {
+            return noForce ?
+                rxjs_1.empty() :
+                rxjs_1.combineLatest(_this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$.pipe(operators_1.first()));
+        }), operators_1.withLatestFrom(this._navigator.panService.panNodes$))
+            .subscribe(function (_a) {
+            var _b = _a[0], render = _b[0], transform = _b[1], nts = _a[1];
+            if (!transform.hasValidScale && render.camera.focal < 0.1) {
+                return;
             }
-            if (edge.data.direction === Edge_1.EdgeDirection.Pano) {
-                this._panoEdges.push(edge);
+            if (render.perspective.aspect === 0 || render.perspective.aspect === Number.POSITIVE_INFINITY) {
+                return;
             }
-        }
-        if (this._distinguishSequence && sequence != null) {
-            var edges = this._panoEdges
-                .concat(this._stepEdges)
-                .concat(this._turnEdges);
-            for (var _b = 0, edges_1 = edges; _b < edges_1.length; _b++) {
-                var edge = edges_1[_b];
-                var edgeKey = edge.to;
-                for (var _c = 0, _d = sequence.keys; _c < _d.length; _c++) {
-                    var sequenceKey = _d[_c];
-                    if (sequenceKey === edgeKey) {
-                        this._sequenceEdgeKeys.push(edgeKey);
-                        break;
+            var distances = Component_1.ImageBoundary.viewportDistances(transform, render.perspective, _this._viewportCoords);
+            var basic = _this._viewportCoords.viewportToBasic(0, 0, transform, render.perspective);
+            if ((basic[0] < 0 || basic[0] > 1) && nts.length > 0) {
+                distances[0] = distances[2] = 0;
+            }
+            for (var _i = 0, nts_1 = nts; _i < nts_1.length; _i++) {
+                var _c = nts_1[_i], t = _c[1];
+                var d = Component_1.ImageBoundary.viewportDistances(t, render.perspective, _this._viewportCoords);
+                for (var i = 1; i < distances.length; i += 2) {
+                    if (d[i] < distances[i]) {
+                        distances[i] = d[i];
                     }
                 }
             }
-        }
-    };
-    DirectionDOMRenderer.prototype._createPanoArrows = function (navigator, rotation) {
-        var arrows = [];
-        for (var _i = 0, _a = this._panoEdges; _i < _a.length; _i++) {
-            var panoEdge = _a[_i];
-            arrows.push(this._createVNodeByKey(navigator, panoEdge.to, panoEdge.data.worldMotionAzimuth, rotation, this._calculator.outerRadius, "DirectionsArrowPano"));
-        }
-        for (var _b = 0, _c = this._stepEdges; _b < _c.length; _b++) {
-            var stepEdge = _c[_b];
-            arrows.push(this._createPanoToPerspectiveArrow(navigator, stepEdge.to, stepEdge.data.worldMotionAzimuth, rotation, stepEdge.data.direction));
-        }
-        return arrows;
+            if (Math.max.apply(Math, distances) < 0.01) {
+                return;
+            }
+            var horizontalDistance = distances[1] - distances[3];
+            var verticalDistance = distances[0] - distances[2];
+            var currentDirection = _this._viewportCoords
+                .unprojectFromViewport(0, 0, render.perspective)
+                .sub(render.perspective.position);
+            var directionPhi = _this._viewportCoords
+                .unprojectFromViewport(horizontalDistance, 0, render.perspective)
+                .sub(render.perspective.position);
+            var directionTheta = _this._viewportCoords
+                .unprojectFromViewport(0, verticalDistance, render.perspective)
+                .sub(render.perspective.position);
+            var phi = (horizontalDistance > 0 ? 1 : -1) * directionPhi.angleTo(currentDirection);
+            var theta = (verticalDistance > 0 ? 1 : -1) * directionTheta.angleTo(currentDirection);
+            var threshold = Math.PI / 60;
+            var coeff = 1e-1;
+            phi = _this._spatial.clamp(coeff * phi, -threshold, threshold);
+            theta = _this._spatial.clamp(coeff * theta, -threshold, threshold);
+            _this._navigator.stateService.rotateUnbounded({ phi: phi, theta: theta });
+        });
     };
-    DirectionDOMRenderer.prototype._createPanoToPerspectiveArrow = function (navigator, key, azimuth, rotation, direction) {
-        var threshold = Math.PI / 8;
-        var relativePhi = rotation.phi;
-        switch (direction) {
-            case Edge_1.EdgeDirection.StepBackward:
-                relativePhi = rotation.phi - Math.PI;
-                break;
-            case Edge_1.EdgeDirection.StepLeft:
-                relativePhi = rotation.phi + Math.PI / 2;
-                break;
-            case Edge_1.EdgeDirection.StepRight:
-                relativePhi = rotation.phi - Math.PI / 2;
-                break;
-            default:
-                break;
-        }
-        if (Math.abs(this._spatial.wrapAngle(azimuth - relativePhi)) < threshold) {
-            return this._createVNodeByKey(navigator, key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowStep");
-        }
-        return this._createVNodeDisabled(key, azimuth, rotation);
+    BounceHandler.prototype._disable = function () {
+        this._bounceSubscription.unsubscribe();
     };
-    DirectionDOMRenderer.prototype._createPerspectiveToPanoArrows = function (navigator, rotation) {
-        var arrows = [];
-        for (var _i = 0, _a = this._panoEdges; _i < _a.length; _i++) {
-            var panoEdge = _a[_i];
-            arrows.push(this._createVNodeByKey(navigator, panoEdge.to, panoEdge.data.worldMotionAzimuth, rotation, this._calculator.innerRadius, "DirectionsArrowPano", true));
-        }
-        return arrows;
+    BounceHandler.prototype._getConfiguration = function () {
+        return {};
     };
-    DirectionDOMRenderer.prototype._createStepArrows = function (navigator, rotation) {
-        var arrows = [];
-        for (var _i = 0, _a = this._stepEdges; _i < _a.length; _i++) {
-            var stepEdge = _a[_i];
-            arrows.push(this._createVNodeByDirection(navigator, stepEdge.to, stepEdge.data.worldMotionAzimuth, rotation, stepEdge.data.direction));
-        }
-        return arrows;
+    return BounceHandler;
+}(Component_1.HandlerBase));
+exports.BounceHandler = BounceHandler;
+exports.default = BounceHandler;
+
+},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],342:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     };
-    DirectionDOMRenderer.prototype._createTurnArrows = function (navigator) {
-        var turns = [];
-        for (var _i = 0, _a = this._turnEdges; _i < _a.length; _i++) {
-            var turnEdge = _a[_i];
-            var direction = turnEdge.data.direction;
-            var name_1 = this._turnNames[direction];
-            turns.push(this._createVNodeByTurn(navigator, turnEdge.to, name_1, direction));
-        }
-        return turns;
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    DirectionDOMRenderer.prototype._createVNodeByKey = function (navigator, key, azimuth, rotation, offset, className, shiftVertically) {
-        var onClick = function (e) {
-            navigator.moveToKey$(key)
-                .subscribe(function (node) { return; }, function (error) { console.error(error); });
-        };
-        return this._createVNode(key, azimuth, rotation, offset, className, "DirectionsCircle", onClick, shiftVertically);
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DoubleClickZoomHandler = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+/**
+ * The `DoubleClickZoomHandler` allows the user to zoom the viewer image at a point by double clicking.
+ *
+ * @example
+ * ```
+ * var mouseComponent = viewer.getComponent("mouse");
+ *
+ * mouseComponent.doubleClickZoom.disable();
+ * mouseComponent.doubleClickZoom.enable();
+ *
+ * var isEnabled = mouseComponent.doubleClickZoom.isEnabled;
+ * ```
+ */
+var DoubleClickZoomHandler = /** @class */ (function (_super) {
+    __extends(DoubleClickZoomHandler, _super);
+    /** @ignore */
+    function DoubleClickZoomHandler(component, container, navigator, viewportCoords) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._viewportCoords = viewportCoords;
+        return _this;
+    }
+    DoubleClickZoomHandler.prototype._enable = function () {
+        var _this = this;
+        this._zoomSubscription = rxjs_1.merge(this._container.mouseService
+            .filtered$(this._component.name, this._container.mouseService.dblClick$), this._container.touchService.doubleTap$.pipe(operators_1.map(function (e) {
+            var touch = e.touches[0];
+            return { clientX: touch.clientX, clientY: touch.clientY, shiftKey: e.shiftKey };
+        }))).pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$))
+            .subscribe(function (_a) {
+            var event = _a[0], render = _a[1], transform = _a[2];
+            var element = _this._container.element;
+            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
+            var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective);
+            var reference = transform.projectBasic(unprojected.toArray());
+            var delta = !!event.shiftKey ? -1 : 1;
+            _this._navigator.stateService.zoomIn(delta, reference);
+        });
     };
-    DirectionDOMRenderer.prototype._createVNodeByDirection = function (navigator, key, azimuth, rotation, direction) {
-        var onClick = function (e) {
-            navigator.moveDir$(direction)
-                .subscribe(function (node) { return; }, function (error) { console.error(error); });
-        };
-        return this._createVNode(key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowStep", "DirectionsCircle", onClick);
+    DoubleClickZoomHandler.prototype._disable = function () {
+        this._zoomSubscription.unsubscribe();
     };
-    DirectionDOMRenderer.prototype._createVNodeByTurn = function (navigator, key, className, direction) {
-        var onClick = function (e) {
-            navigator.moveDir$(direction)
-                .subscribe(function (node) { return; }, function (error) { console.error(error); });
-        };
-        var style = {
-            height: this._calculator.turnCircleSizeCss,
-            transform: "rotate(0)",
-            width: this._calculator.turnCircleSizeCss,
-        };
-        switch (direction) {
-            case Edge_1.EdgeDirection.TurnLeft:
-                style.left = "5px";
-                style.top = "5px";
-                break;
-            case Edge_1.EdgeDirection.TurnRight:
-                style.right = "5px";
-                style.top = "5px";
-                break;
-            case Edge_1.EdgeDirection.TurnU:
-                style.left = "5px";
-                style.bottom = "5px";
-                break;
-            default:
-                break;
-        }
-        var circleProperties = {
-            attributes: {
-                "data-key": key,
-            },
-            onclick: onClick,
-            style: style,
-        };
-        var circleClassName = "TurnCircle";
-        if (this._sequenceEdgeKeys.indexOf(key) > -1) {
-            circleClassName += "Sequence";
-        }
-        if (this._highlightKey === key) {
-            circleClassName += "Highlight";
-        }
-        var turn = vd.h("div." + className, {}, []);
-        return vd.h("div." + circleClassName, circleProperties, [turn]);
+    DoubleClickZoomHandler.prototype._getConfiguration = function (enable) {
+        return { doubleClickZoom: enable };
     };
-    DirectionDOMRenderer.prototype._createVNodeDisabled = function (key, azimuth, rotation) {
-        return this._createVNode(key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowDisabled", "DirectionsCircleDisabled");
+    return DoubleClickZoomHandler;
+}(Component_1.HandlerBase));
+exports.DoubleClickZoomHandler = DoubleClickZoomHandler;
+exports.default = DoubleClickZoomHandler;
+
+},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],343:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     };
-    DirectionDOMRenderer.prototype._createVNode = function (key, azimuth, rotation, radius, className, circleClassName, onClick, shiftVertically) {
-        var translation = this._calculator.angleToCoordinates(azimuth - rotation.phi);
-        // rotate 90 degrees clockwise and flip over X-axis
-        var translationX = Math.round(-radius * translation[1] + 0.5 * this._calculator.containerWidth);
-        var translationY = Math.round(-radius * translation[0] + 0.5 * this._calculator.containerHeight);
-        var shadowTranslation = this._calculator.relativeAngleToCoordiantes(azimuth, rotation.phi);
-        var shadowOffset = this._calculator.shadowOffset;
-        var shadowTranslationX = -shadowOffset * shadowTranslation[1];
-        var shadowTranslationY = shadowOffset * shadowTranslation[0];
-        var filter = "drop-shadow(" + shadowTranslationX + "px " + shadowTranslationY + "px 1px rgba(0,0,0,0.8))";
-        var properties = {
-            style: {
-                "-webkit-filter": filter,
-                filter: filter,
-            },
-        };
-        var chevron = vd.h("div." + className, properties, []);
-        var azimuthDeg = -this._spatial.radToDeg(azimuth - rotation.phi);
-        var circleTransform = shiftVertically ?
-            "translate(" + translationX + "px, " + translationY + "px) rotate(" + azimuthDeg + "deg) translateZ(-0.01px)" :
-            "translate(" + translationX + "px, " + translationY + "px) rotate(" + azimuthDeg + "deg)";
-        var circleProperties = {
-            attributes: { "data-key": key },
-            onclick: onClick,
-            style: {
-                height: this._calculator.stepCircleSizeCss,
-                marginLeft: this._calculator.stepCircleMarginCss,
-                marginTop: this._calculator.stepCircleMarginCss,
-                transform: circleTransform,
-                width: this._calculator.stepCircleSizeCss,
-            },
-        };
-        if (this._sequenceEdgeKeys.indexOf(key) > -1) {
-            circleClassName += "Sequence";
-        }
-        if (this._highlightKey === key) {
-            circleClassName += "Highlight";
-        }
-        return vd.h("div." + circleClassName, circleProperties, [chevron]);
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    DirectionDOMRenderer.prototype._getContainer = function (steps, turns, rotation) {
-        // edge does not handle hover on perspective transforms.
-        var transform = this._isEdge ?
-            "rotateX(60deg)" :
-            "perspective(" + this._calculator.containerWidthCss + ") rotateX(60deg)";
-        var properties = {
-            oncontextmenu: function (event) { event.preventDefault(); },
-            style: {
-                bottom: this._calculator.containerBottomCss,
-                height: this._calculator.containerHeightCss,
-                left: this._calculator.containerLeftCss,
-                marginLeft: this._calculator.containerMarginCss,
-                transform: transform,
-                width: this._calculator.containerWidthCss,
-            },
-        };
-        return vd.h("div.DirectionsPerspective", properties, turns.concat(steps));
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DragPanHandler = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+/**
+ * The `DragPanHandler` allows the user to pan the viewer image by clicking and dragging the cursor.
+ *
+ * @example
+ * ```
+ * var mouseComponent = viewer.getComponent("mouse");
+ *
+ * mouseComponent.dragPan.disable();
+ * mouseComponent.dragPan.enable();
+ *
+ * var isEnabled = mouseComponent.dragPan.isEnabled;
+ * ```
+ */
+var DragPanHandler = /** @class */ (function (_super) {
+    __extends(DragPanHandler, _super);
+    /** @ignore */
+    function DragPanHandler(component, container, navigator, viewportCoords, spatial) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._spatial = spatial;
+        _this._viewportCoords = viewportCoords;
+        return _this;
+    }
+    DragPanHandler.prototype._enable = function () {
+        var _this = this;
+        var draggingStarted$ = this._container.mouseService
+            .filtered$(this._component.name, this._container.mouseService.mouseDragStart$).pipe(operators_1.map(function () {
+            return true;
+        }), operators_1.share());
+        var draggingStopped$ = this._container.mouseService
+            .filtered$(this._component.name, this._container.mouseService.mouseDragEnd$).pipe(operators_1.map(function () {
+            return false;
+        }), operators_1.share());
+        this._activeMouseSubscription = rxjs_1.merge(draggingStarted$, draggingStopped$)
+            .subscribe(this._container.mouseService.activate$);
+        var documentMouseMove$ = rxjs_1.merge(draggingStarted$, draggingStopped$).pipe(operators_1.switchMap(function (dragging) {
+            return dragging ?
+                _this._container.mouseService.documentMouseMove$ :
+                rxjs_1.empty();
+        }));
+        this._preventDefaultSubscription = rxjs_1.merge(documentMouseMove$, this._container.touchService.touchMove$)
+            .subscribe(function (event) {
+            event.preventDefault(); // prevent selection of content outside the viewer
+        });
+        var touchMovingStarted$ = this._container.touchService.singleTouchDragStart$.pipe(operators_1.map(function () {
+            return true;
+        }));
+        var touchMovingStopped$ = this._container.touchService.singleTouchDragEnd$.pipe(operators_1.map(function () {
+            return false;
+        }));
+        this._activeTouchSubscription = rxjs_1.merge(touchMovingStarted$, touchMovingStopped$)
+            .subscribe(this._container.touchService.activate$);
+        var rotation$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state.currentNode.fullPano || frame.state.nodesAhead < 1;
+        }), operators_1.distinctUntilChanged(), operators_1.switchMap(function (enable) {
+            if (!enable) {
+                return rxjs_1.empty();
+            }
+            var mouseDrag$ = Component_1.MouseOperator.filteredPairwiseMouseDrag$(_this._component.name, _this._container.mouseService);
+            var singleTouchDrag$ = rxjs_1.merge(_this._container.touchService.singleTouchDragStart$, _this._container.touchService.singleTouchDrag$, _this._container.touchService.singleTouchDragEnd$.pipe(operators_1.map(function () { return null; }))).pipe(operators_1.map(function (event) {
+                return event != null && event.touches.length > 0 ?
+                    event.touches[0] : null;
+            }), operators_1.pairwise(), operators_1.filter(function (pair) {
+                return pair[0] != null && pair[1] != null;
+            }));
+            return rxjs_1.merge(mouseDrag$, singleTouchDrag$);
+        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, this._navigator.panService.panNodes$), operators_1.map(function (_a) {
+            var events = _a[0], render = _a[1], transform = _a[2], nts = _a[3];
+            var previousEvent = events[0];
+            var event = events[1];
+            var movementX = event.clientX - previousEvent.clientX;
+            var movementY = event.clientY - previousEvent.clientY;
+            var element = _this._container.element;
+            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
+            var currentDirection = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective)
+                .sub(render.perspective.position);
+            var directionX = _this._viewportCoords.unprojectFromCanvas(canvasX - movementX, canvasY, element, render.perspective)
+                .sub(render.perspective.position);
+            var directionY = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY - movementY, element, render.perspective)
+                .sub(render.perspective.position);
+            var phi = (movementX > 0 ? 1 : -1) * directionX.angleTo(currentDirection);
+            var theta = (movementY > 0 ? -1 : 1) * directionY.angleTo(currentDirection);
+            var distances = Component_1.ImageBoundary.viewportDistances(transform, render.perspective, _this._viewportCoords);
+            for (var _i = 0, nts_1 = nts; _i < nts_1.length; _i++) {
+                var _c = nts_1[_i], t = _c[1];
+                var d = Component_1.ImageBoundary.viewportDistances(t, render.perspective, _this._viewportCoords);
+                for (var i = 0; i < distances.length; i++) {
+                    if (d[i] < distances[i]) {
+                        distances[i] = d[i];
+                    }
+                }
+            }
+            if (distances[0] > 0 && theta < 0) {
+                theta /= Math.max(1, 2e2 * distances[0]);
+            }
+            if (distances[2] > 0 && theta > 0) {
+                theta /= Math.max(1, 2e2 * distances[2]);
+            }
+            if (distances[1] > 0 && phi < 0) {
+                phi /= Math.max(1, 2e2 * distances[1]);
+            }
+            if (distances[3] > 0 && phi > 0) {
+                phi /= Math.max(1, 2e2 * distances[3]);
+            }
+            return { phi: phi, theta: theta };
+        }), operators_1.share());
+        this._rotateWithoutInertiaSubscription = rotation$
+            .subscribe(function (rotation) {
+            _this._navigator.stateService.rotateWithoutInertia(rotation);
+        });
+        this._rotateSubscription = rotation$.pipe(operators_1.scan(function (rotationBuffer, rotation) {
+            _this._drainBuffer(rotationBuffer);
+            rotationBuffer.push([Date.now(), rotation]);
+            return rotationBuffer;
+        }, []), operators_1.sample(rxjs_1.merge(this._container.mouseService.filtered$(this._component.name, this._container.mouseService.mouseDragEnd$), this._container.touchService.singleTouchDragEnd$)), operators_1.map(function (rotationBuffer) {
+            var drainedBuffer = _this._drainBuffer(rotationBuffer.slice());
+            var rotation = { phi: 0, theta: 0 };
+            for (var _i = 0, drainedBuffer_1 = drainedBuffer; _i < drainedBuffer_1.length; _i++) {
+                var bufferedRotation = drainedBuffer_1[_i];
+                rotation.phi += bufferedRotation[1].phi;
+                rotation.theta += bufferedRotation[1].theta;
+            }
+            var count = drainedBuffer.length;
+            if (count > 0) {
+                rotation.phi /= count;
+                rotation.theta /= count;
+            }
+            var threshold = Math.PI / 18;
+            rotation.phi = _this._spatial.clamp(rotation.phi, -threshold, threshold);
+            rotation.theta = _this._spatial.clamp(rotation.theta, -threshold, threshold);
+            return rotation;
+        }))
+            .subscribe(function (rotation) {
+            _this._navigator.stateService.rotate(rotation);
+        });
     };
-    return DirectionDOMRenderer;
-}());
-exports.DirectionDOMRenderer = DirectionDOMRenderer;
-exports.default = DirectionDOMRenderer;
+    DragPanHandler.prototype._disable = function () {
+        this._activeMouseSubscription.unsubscribe();
+        this._activeTouchSubscription.unsubscribe();
+        this._preventDefaultSubscription.unsubscribe();
+        this._rotateSubscription.unsubscribe();
+        this._rotateWithoutInertiaSubscription.unsubscribe();
+        this._activeMouseSubscription = null;
+        this._activeTouchSubscription = null;
+        this._preventDefaultSubscription = null;
+        this._rotateSubscription = null;
+    };
+    DragPanHandler.prototype._getConfiguration = function (enable) {
+        return { dragPan: enable };
+    };
+    DragPanHandler.prototype._drainBuffer = function (buffer) {
+        var cutoff = 50;
+        var now = Date.now();
+        while (buffer.length > 0 && now - buffer[0][0] > cutoff) {
+            buffer.shift();
+        }
+        return buffer;
+    };
+    return DragPanHandler;
+}(Component_1.HandlerBase));
+exports.DragPanHandler = DragPanHandler;
+exports.default = DragPanHandler;
 
-},{"../../Component":226,"../../Edge":227,"../../Geo":229,"virtual-dom":182}],256:[function(require,module,exports){
+},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],344:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -22811,760 +34916,611 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/catch");
-require("rxjs/add/operator/combineLatest");
-require("rxjs/add/operator/debounceTime");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/pairwise");
-require("rxjs/add/operator/publish");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/skipWhile");
-require("rxjs/add/operator/startWith");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/takeUntil");
-require("rxjs/add/operator/withLatestFrom");
+exports.EarthControlHandler = void 0;
+var THREE = require("three");
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var Component_1 = require("../../Component");
-var Render_1 = require("../../Render");
-var Tiles_1 = require("../../Tiles");
-var Utils_1 = require("../../Utils");
-var ImagePlaneComponent = (function (_super) {
-    __extends(ImagePlaneComponent, _super);
-    function ImagePlaneComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._imageTileLoader = new Tiles_1.ImageTileLoader(Utils_1.Urls.tileScheme, Utils_1.Urls.tileDomain, Utils_1.Urls.origin);
-        _this._roiCalculator = new Tiles_1.RegionOfInterestCalculator();
-        _this._rendererOperation$ = new Subject_1.Subject();
-        _this._rendererCreator$ = new Subject_1.Subject();
-        _this._rendererDisposer$ = new Subject_1.Subject();
-        _this._renderer$ = _this._rendererOperation$
-            .scan(function (renderer, operation) {
-            return operation(renderer);
-        }, null)
-            .filter(function (renderer) {
-            return renderer != null;
-        })
-            .distinctUntilChanged(undefined, function (renderer) {
-            return renderer.frameId;
-        });
-        _this._rendererCreator$
-            .map(function () {
-            return function (renderer) {
-                if (renderer != null) {
-                    throw new Error("Multiple image plane states can not be created at the same time");
-                }
-                return new Component_1.ImagePlaneGLRenderer();
-            };
-        })
-            .subscribe(_this._rendererOperation$);
-        _this._rendererDisposer$
-            .map(function () {
-            return function (renderer) {
-                renderer.dispose();
-                return null;
-            };
-        })
-            .subscribe(_this._rendererOperation$);
+var State_1 = require("../../State");
+var EarthControlHandler = /** @class */ (function (_super) {
+    __extends(EarthControlHandler, _super);
+    function EarthControlHandler(component, container, navigator, viewportCoords, spatial) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._spatial = spatial;
+        _this._viewportCoords = viewportCoords;
         return _this;
     }
-    ImagePlaneComponent.prototype._activate = function () {
+    EarthControlHandler.prototype._enable = function () {
         var _this = this;
-        this._rendererSubscription = this._renderer$
-            .map(function (renderer) {
-            var renderHash = {
-                name: _this._name,
-                render: {
-                    frameId: renderer.frameId,
-                    needsRender: renderer.needsRender,
-                    render: renderer.render.bind(renderer),
-                    stage: Render_1.GLRenderStage.Background,
-                },
-            };
-            renderer.clearNeedsRender();
-            return renderHash;
-        })
-            .subscribe(this._container.glRenderer.render$);
-        this._rendererCreator$.next(null);
-        this._stateSubscription = this._navigator.stateService.currentState$
-            .map(function (frame) {
-            return function (renderer) {
-                renderer.updateFrame(frame);
-                return renderer;
-            };
-        })
-            .subscribe(this._rendererOperation$);
-        var textureProvider$ = this._navigator.stateService.currentState$
-            .distinctUntilChanged(undefined, function (frame) {
-            return frame.state.currentNode.key;
-        })
-            .combineLatest(this._configuration$)
-            .filter(function (args) {
-            return args[1].imageTiling === true;
-        })
-            .map(function (args) {
-            return args[0];
-        })
-            .withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$)
-            .map(function (args) {
-            var state = args[0].state;
-            var renderer = args[1];
-            var viewportSize = args[2];
-            var currentNode = state.currentNode;
-            var currentTransform = state.currentTransform;
-            var tileSize = Math.max(viewportSize.width, viewportSize.height) > 1024 ? 1024 : 512;
-            return new Tiles_1.TextureProvider(currentNode.key, currentTransform.basicWidth, currentTransform.basicHeight, tileSize, currentNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer);
-        })
-            .publishReplay(1)
-            .refCount();
-        this._textureProviderSubscription = textureProvider$.subscribe(function () { });
-        this._setTextureProviderSubscription = textureProvider$
-            .map(function (provider) {
-            return function (renderer) {
-                renderer.setTextureProvider(provider.key, provider);
-                return renderer;
-            };
-        })
-            .subscribe(this._rendererOperation$);
-        this._abortTextureProviderSubscription = textureProvider$
-            .pairwise()
-            .subscribe(function (pair) {
-            var previous = pair[0];
-            previous.abort();
+        var earth$ = this._navigator.stateService.state$.pipe(operators_1.map(function (state) {
+            return state === State_1.State.Earth;
+        }), operators_1.share());
+        this._preventDefaultSubscription = earth$.pipe(operators_1.switchMap(function (earth) {
+            return earth ?
+                _this._container.mouseService.mouseWheel$ :
+                rxjs_1.empty();
+        }))
+            .subscribe(function (event) {
+            event.preventDefault();
         });
-        var roiTrigger$ = this._container.renderService.renderCameraFrame$
-            .map(function (renderCamera) {
-            return [
-                renderCamera.camera.position.clone(),
-                renderCamera.camera.lookat.clone(),
-                renderCamera.zoom.valueOf()
-            ];
-        })
-            .pairwise()
-            .skipWhile(function (pls) {
-            return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0;
-        })
-            .map(function (pls) {
-            var samePosition = pls[0][0].equals(pls[1][0]);
-            var sameLookat = pls[0][1].equals(pls[1][1]);
-            var sameZoom = pls[0][2] === pls[1][2];
-            return samePosition && sameLookat && sameZoom;
-        })
-            .distinctUntilChanged()
-            .filter(function (stalled) {
-            return stalled;
-        })
-            .switchMap(function (stalled) {
-            return _this._container.renderService.renderCameraFrame$
-                .first();
-        })
-            .withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$);
-        this._setRegionOfInterestSubscription = textureProvider$
-            .switchMap(function (provider) {
-            return roiTrigger$
-                .map(function (args) {
-                return [
-                    _this._roiCalculator.computeRegionOfInterest(args[0], args[1], args[2]),
-                    provider,
-                ];
-            });
-        })
-            .filter(function (args) {
-            return !args[1].disposed;
-        })
-            .subscribe(function (args) {
-            var roi = args[0];
-            var provider = args[1];
-            provider.setRegionOfInterest(roi);
+        this._truckSubscription = earth$.pipe(operators_1.switchMap(function (earth) {
+            if (!earth) {
+                return rxjs_1.empty();
+            }
+            return Component_1.MouseOperator.filteredPairwiseMouseDrag$(_this._component.name, _this._container.mouseService).pipe(operators_1.filter(function (_a) {
+                var e1 = _a[0], e2 = _a[1];
+                return !(e1.ctrlKey && e2.ctrlKey);
+            }));
+        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
+            var _b = _a[0], previous = _b[0], current = _b[1], render = _a[1], transform = _a[2];
+            var planeNormal = [0, 0, 1];
+            var planePoint = transform.unprojectBasic([0.5, 0.5], 0);
+            planePoint[2] -= 2;
+            var currentIntersection = _this._planeIntersection(current, planeNormal, planePoint, render.perspective, _this._container.element);
+            var previousIntersection = _this._planeIntersection(previous, planeNormal, planePoint, render.perspective, _this._container.element);
+            if (!currentIntersection || !previousIntersection) {
+                return null;
+            }
+            var direction = new THREE.Vector3()
+                .subVectors(currentIntersection, previousIntersection)
+                .multiplyScalar(-1)
+                .toArray();
+            return direction;
+        }), operators_1.filter(function (direction) {
+            return !!direction;
+        }))
+            .subscribe(function (direction) {
+            _this._navigator.stateService.truck(direction);
         });
-        var hasTexture$ = textureProvider$
-            .switchMap(function (provider) {
-            return provider.hasTexture$;
-        })
-            .startWith(false)
-            .publishReplay(1)
-            .refCount();
-        this._hasTextureSubscription = hasTexture$.subscribe(function () { });
-        var nodeImage$ = this._navigator.stateService.currentNode$
-            .debounceTime(1000)
-            .withLatestFrom(hasTexture$)
-            .filter(function (args) {
-            return !args[1];
-        })
-            .map(function (args) {
-            return args[0];
-        })
-            .filter(function (node) {
-            return node.pano ?
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
-        })
-            .switchMap(function (node) {
-            var baseImageSize = node.pano ?
-                Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.baseImageSize;
-            if (Math.max(node.image.width, node.image.height) > baseImageSize) {
-                return Observable_1.Observable.empty();
+        this._orbitSubscription = earth$.pipe(operators_1.switchMap(function (earth) {
+            if (!earth) {
+                return rxjs_1.empty();
             }
-            var image$ = node
-                .cacheImage$(Utils_1.Settings.maxImageSize)
-                .map(function (n) {
-                return [n.image, n];
-            });
-            return image$
-                .takeUntil(hasTexture$
-                .filter(function (hasTexture) {
-                return hasTexture;
-            }))
-                .catch(function (error, caught) {
-                console.error("Failed to fetch high res image (" + node.key + ")", error);
-                return Observable_1.Observable.empty();
-            });
-        })
-            .publish()
-            .refCount();
-        this._updateBackgroundSubscription = nodeImage$
-            .withLatestFrom(textureProvider$)
-            .subscribe(function (args) {
-            if (args[0][1].key !== args[1].key ||
-                args[1].disposed) {
-                return;
+            return Component_1.MouseOperator.filteredPairwiseMouseDrag$(_this._component.name, _this._container.mouseService).pipe(operators_1.filter(function (_a) {
+                var e1 = _a[0], e2 = _a[1];
+                return e1.ctrlKey && e2.ctrlKey;
+            }));
+        }), operators_1.map(function (_a) {
+            var previous = _a[0], current = _a[1];
+            var _b = _this._eventToViewport(current, _this._container.element), currentX = _b[0], currentY = _b[1];
+            var _c = _this._eventToViewport(previous, _this._container.element), previousX = _c[0], previousY = _c[1];
+            var phi = (previousX - currentX) * Math.PI;
+            var theta = (currentY - previousY) * Math.PI / 2;
+            return { phi: phi, theta: theta };
+        }))
+            .subscribe(function (rotation) {
+            _this._navigator.stateService.orbit(rotation);
+        });
+        this._dollySubscription = earth$.pipe(operators_1.switchMap(function (earth) {
+            if (!earth) {
+                return rxjs_1.empty();
+            }
+            return _this._container.mouseService
+                .filteredWheel$(_this._component.name, _this._container.mouseService.mouseWheel$);
+        }), operators_1.map(function (event) {
+            var delta = event.deltaY;
+            if (event.deltaMode === 1) {
+                delta = 40 * delta;
             }
-            args[1].updateBackground(args[0][0]);
+            else if (event.deltaMode === 2) {
+                delta = 800 * delta;
+            }
+            var canvasSize = _this._viewportCoords.containerToCanvas(_this._container.element);
+            return -delta / canvasSize[1];
+        }))
+            .subscribe(function (delta) {
+            _this._navigator.stateService.dolly(delta);
         });
-        this._updateTextureImageSubscription = nodeImage$
-            .map(function (imn) {
-            return function (renderer) {
-                renderer.updateTextureImage(imn[0], imn[1]);
-                return renderer;
-            };
-        })
-            .subscribe(this._rendererOperation$);
     };
-    ImagePlaneComponent.prototype._deactivate = function () {
-        this._rendererDisposer$.next(null);
-        this._abortTextureProviderSubscription.unsubscribe();
-        this._hasTextureSubscription.unsubscribe();
-        this._rendererSubscription.unsubscribe();
-        this._setRegionOfInterestSubscription.unsubscribe();
-        this._setTextureProviderSubscription.unsubscribe();
-        this._stateSubscription.unsubscribe();
-        this._textureProviderSubscription.unsubscribe();
-        this._updateBackgroundSubscription.unsubscribe();
-        this._updateTextureImageSubscription.unsubscribe();
+    EarthControlHandler.prototype._disable = function () {
+        this._dollySubscription.unsubscribe();
+        this._orbitSubscription.unsubscribe();
+        this._preventDefaultSubscription.unsubscribe();
+        this._truckSubscription.unsubscribe();
     };
-    ImagePlaneComponent.prototype._getDefaultConfiguration = function () {
-        return { imageTiling: false };
+    EarthControlHandler.prototype._getConfiguration = function () {
+        return {};
     };
-    ImagePlaneComponent.componentName = "imagePlane";
-    return ImagePlaneComponent;
-}(Component_1.Component));
-exports.ImagePlaneComponent = ImagePlaneComponent;
-Component_1.ComponentService.register(ImagePlaneComponent);
-exports.default = ImagePlaneComponent;
+    EarthControlHandler.prototype._eventToViewport = function (event, element) {
+        var previousCanvas = this._viewportCoords.canvasPosition(event, element);
+        return this._viewportCoords.canvasToViewport(previousCanvas[0], previousCanvas[1], element);
+    };
+    EarthControlHandler.prototype._planeIntersection = function (event, planeNormal, planePoint, camera, element) {
+        var _a = this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1];
+        var direction = this._viewportCoords
+            .unprojectFromCanvas(canvasX, canvasY, element, camera)
+            .sub(camera.position)
+            .normalize();
+        if (Math.abs(this._spatial.angleToPlane(direction.toArray(), planeNormal)) < Math.PI / 90) {
+            return null;
+        }
+        var l0 = camera.position.clone();
+        var n = new THREE.Vector3().fromArray(planeNormal);
+        var p0 = new THREE.Vector3().fromArray(planePoint);
+        var d = new THREE.Vector3().subVectors(p0, l0).dot(n) / direction.clone().dot(n);
+        var intersection = new THREE.Vector3().addVectors(l0, direction.multiplyScalar(d));
+        if (this._viewportCoords.worldToCamera(intersection.toArray(), camera)[2] > 0) {
+            return null;
+        }
+        return intersection;
+    };
+    return EarthControlHandler;
+}(Component_1.HandlerBase));
+exports.EarthControlHandler = EarthControlHandler;
+exports.default = EarthControlHandler;
 
-},{"../../Component":226,"../../Render":232,"../../Tiles":234,"../../Utils":235,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/operator/catch":52,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/pairwise":69,"rxjs/add/operator/publish":71,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/skipWhile":77,"rxjs/add/operator/startWith":78,"rxjs/add/operator/switchMap":79,"rxjs/add/operator/takeUntil":81,"rxjs/add/operator/withLatestFrom":83}],257:[function(require,module,exports){
+},{"../../Component":291,"../../State":298,"rxjs":43,"rxjs/operators":241,"three":242}],345:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var Component_1 = require("../../Component");
-var ImagePlaneFactory = (function () {
-    function ImagePlaneFactory(imagePlaneDepth, imageSphereRadius) {
-        this._imagePlaneDepth = imagePlaneDepth != null ? imagePlaneDepth : 200;
-        this._imageSphereRadius = imageSphereRadius != null ? imageSphereRadius : 200;
+
+},{}],346:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.viewportDistances = void 0;
+var Geo_1 = require("../../../src/Geo");
+function basicBoundaryPoints(pointsPerSide) {
+    var points = [];
+    var os = [[0, 0], [1, 0], [1, 1], [0, 1]];
+    var ds = [[1, 0], [0, 1], [-1, 0], [0, -1]];
+    for (var side = 0; side < 4; ++side) {
+        var o = os[side];
+        var d = ds[side];
+        for (var i = 0; i < pointsPerSide; ++i) {
+            points.push([o[0] + d[0] * i / pointsPerSide,
+                o[1] + d[1] * i / pointsPerSide]);
+        }
+    }
+    return points;
+}
+function insideViewport(x, y) {
+    return x >= -1 && x <= 1 && y >= -1 && y <= 1;
+}
+function insideBasic(x, y) {
+    return x >= 0 && x <= 1 && y >= 0 && y <= 1;
+}
+function viewportDistances(transform, perspective, viewportCoords) {
+    var boundaryPointsBasic = basicBoundaryPoints(100);
+    var boundaryPointsViewport = boundaryPointsBasic
+        .map(function (basic) {
+        return viewportCoords.basicToViewportSafe(basic[0], basic[1], transform, perspective);
+    });
+    var visibleBoundaryPoints = [];
+    var viewportSides = [
+        { x: -1, y: 1 },
+        { x: 1, y: 1 },
+        { x: 1, y: -1 },
+        { x: -1, y: -1 }
+    ];
+    var intersections = [false, false, false, false];
+    for (var i = 0; i < boundaryPointsViewport.length; i++) {
+        var p1 = boundaryPointsViewport[i];
+        var p2 = boundaryPointsViewport[(i + 1) % boundaryPointsViewport.length];
+        if (p1 === null) {
+            continue;
+        }
+        if (p2 === null) {
+            if (insideViewport(p1[0], p1[1])) {
+                visibleBoundaryPoints.push(p1);
+            }
+            continue;
+        }
+        var x1 = p1[0], y1 = p1[1];
+        var x2 = p2[0], y2 = p2[1];
+        if (insideViewport(x1, y1)) {
+            if (insideViewport(x2, y2)) {
+                visibleBoundaryPoints.push(p1);
+            }
+            else {
+                for (var side = 0; side < 4; side++) {
+                    var s1 = { p1: { x: x1, y: y1 }, p2: { x: x2, y: y2 } };
+                    var s2 = { p1: viewportSides[side], p2: viewportSides[(side + 1) % 4] };
+                    var intersecting = Geo_1.Lines.segmentsIntersect(s1, s2);
+                    if (intersecting) {
+                        var intersection = Geo_1.Lines.segmentIntersection(s1, s2);
+                        visibleBoundaryPoints.push(p1, [intersection.x, intersection.y]);
+                        intersections[side] = true;
+                    }
+                }
+            }
+        }
     }
-    ImagePlaneFactory.prototype.createMesh = function (node, transform) {
-        var mesh = node.pano ?
-            this._createImageSphere(node, transform) :
-            this._createImagePlane(node, transform);
-        return mesh;
-    };
-    ImagePlaneFactory.prototype._createImageSphere = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createSphereMaterialParameters(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var mesh = this._useMesh(transform, node) ?
-            new THREE.Mesh(this._getImageSphereGeo(transform, node), material) :
-            new THREE.Mesh(this._getFlatImageSphereGeo(transform), material);
-        return mesh;
-    };
-    ImagePlaneFactory.prototype._createImagePlane = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createPlaneMaterialParameters(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var geometry = this._useMesh(transform, node) ?
-            this._getImagePlaneGeo(transform, node) :
-            this._getFlatImagePlaneGeo(transform);
-        return new THREE.Mesh(geometry, material);
-    };
-    ImagePlaneFactory.prototype._createSphereMaterialParameters = function (transform, texture) {
-        var gpano = transform.gpano;
-        var halfCroppedWidth = (gpano.FullPanoWidthPixels - gpano.CroppedAreaImageWidthPixels) / 2;
-        var phiShift = 2 * Math.PI * (gpano.CroppedAreaLeftPixels - halfCroppedWidth) / gpano.FullPanoWidthPixels;
-        var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;
-        var halfCroppedHeight = (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels) / 2;
-        var thetaShift = Math.PI * (halfCroppedHeight - gpano.CroppedAreaTopPixels) / gpano.FullPanoHeightPixels;
-        var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.ImagePlaneShaders.equirectangular.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                opacity: {
-                    type: "f",
-                    value: 1,
-                },
-                phiLength: {
-                    type: "f",
-                    value: phiLength,
-                },
-                phiShift: {
-                    type: "f",
-                    value: phiShift,
-                },
-                projectorMat: {
-                    type: "m4",
-                    value: transform.rt,
-                },
-                projectorTex: {
-                    type: "t",
-                    value: texture,
-                },
-                thetaLength: {
-                    type: "f",
-                    value: thetaLength,
-                },
-                thetaShift: {
-                    type: "f",
-                    value: thetaShift,
-                },
-            },
-            vertexShader: Component_1.ImagePlaneShaders.equirectangular.vertex,
-        };
-        return materialParameters;
-    };
-    ImagePlaneFactory.prototype._createPlaneMaterialParameters = function (transform, texture) {
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.ImagePlaneShaders.perspective.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                bbox: {
-                    type: "v4",
-                    value: new THREE.Vector4(0, 0, 1, 1),
-                },
-                opacity: {
-                    type: "f",
-                    value: 1,
-                },
-                projectorMat: {
-                    type: "m4",
-                    value: transform.projectorMatrix(),
-                },
-                projectorTex: {
-                    type: "t",
-                    value: texture,
-                },
-            },
-            vertexShader: Component_1.ImagePlaneShaders.perspective.vertex,
-        };
-        return materialParameters;
-    };
-    ImagePlaneFactory.prototype._createTexture = function (image) {
-        var texture = new THREE.Texture(image);
-        texture.minFilter = THREE.LinearFilter;
-        texture.needsUpdate = true;
-        return texture;
-    };
-    ImagePlaneFactory.prototype._useMesh = function (transform, node) {
-        return node.mesh.vertices.length && transform.hasValidScale;
-    };
-    ImagePlaneFactory.prototype._getImageSphereGeo = function (transform, node) {
-        var t = new THREE.Matrix4().getInverse(transform.srt);
-        // push everything at least 5 meters in front of the camera
-        var minZ = 5.0 * transform.scale;
-        var maxZ = this._imageSphereRadius * transform.scale;
-        var vertices = node.mesh.vertices;
-        var numVertices = vertices.length / 3;
-        var positions = new Float32Array(vertices.length);
-        for (var i = 0; i < numVertices; ++i) {
-            var index = 3 * i;
-            var x = vertices[index + 0];
-            var y = vertices[index + 1];
-            var z = vertices[index + 2];
-            var l = Math.sqrt(x * x + y * y + z * z);
-            var boundedL = Math.max(minZ, Math.min(l, maxZ));
-            var factor = boundedL / l;
-            var p = new THREE.Vector3(x * factor, y * factor, z * factor);
-            p.applyMatrix4(t);
-            positions[index + 0] = p.x;
-            positions[index + 1] = p.y;
-            positions[index + 2] = p.z;
+    var _a = viewportCoords.viewportToBasic(-1, 1, transform, perspective), topLeftBasicX = _a[0], topLeftBasicY = _a[1];
+    var _b = viewportCoords.viewportToBasic(1, 1, transform, perspective), topRightBasicX = _b[0], topRightBasicY = _b[1];
+    var _c = viewportCoords.viewportToBasic(1, -1, transform, perspective), bottomRightBasicX = _c[0], bottomRightBasicY = _c[1];
+    var _d = viewportCoords.viewportToBasic(-1, -1, transform, perspective), bottomLeftBasicX = _d[0], bottomLeftBasicY = _d[1];
+    if (insideBasic(topLeftBasicX, topLeftBasicY)) {
+        intersections[3] = intersections[0] = true;
+    }
+    if (insideBasic(topRightBasicX, topRightBasicY)) {
+        intersections[0] = intersections[1] = true;
+    }
+    if (insideBasic(bottomRightBasicX, bottomRightBasicY)) {
+        intersections[1] = intersections[2] = true;
+    }
+    if (insideBasic(bottomLeftBasicX, bottomLeftBasicY)) {
+        intersections[2] = intersections[3] = true;
+    }
+    var maximums = [-1, -1, 1, 1];
+    for (var _i = 0, visibleBoundaryPoints_1 = visibleBoundaryPoints; _i < visibleBoundaryPoints_1.length; _i++) {
+        var visibleBoundaryPoint = visibleBoundaryPoints_1[_i];
+        var x = visibleBoundaryPoint[0];
+        var y = visibleBoundaryPoint[1];
+        if (x > maximums[1]) {
+            maximums[1] = x;
         }
-        var faces = node.mesh.faces;
-        var indices = new Uint16Array(faces.length);
-        for (var i = 0; i < faces.length; ++i) {
-            indices[i] = faces[i];
+        if (x < maximums[3]) {
+            maximums[3] = x;
         }
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
-    };
-    ImagePlaneFactory.prototype._getImagePlaneGeo = function (transform, node) {
-        var t = new THREE.Matrix4().getInverse(transform.srt);
-        // push everything at least 5 meters in front of the camera
-        var minZ = 5.0 * transform.scale;
-        var maxZ = this._imagePlaneDepth * transform.scale;
-        var vertices = node.mesh.vertices;
-        var numVertices = vertices.length / 3;
-        var positions = new Float32Array(vertices.length);
-        for (var i = 0; i < numVertices; ++i) {
-            var index = 3 * i;
-            var x = vertices[index + 0];
-            var y = vertices[index + 1];
-            var z = vertices[index + 2];
-            var boundedZ = Math.max(minZ, Math.min(z, maxZ));
-            var factor = boundedZ / z;
-            var p = new THREE.Vector3(x * factor, y * factor, boundedZ);
-            p.applyMatrix4(t);
-            positions[index + 0] = p.x;
-            positions[index + 1] = p.y;
-            positions[index + 2] = p.z;
+        if (y > maximums[0]) {
+            maximums[0] = y;
         }
-        var faces = node.mesh.faces;
-        var indices = new Uint16Array(faces.length);
-        for (var i = 0; i < faces.length; ++i) {
-            indices[i] = faces[i];
+        if (y < maximums[2]) {
+            maximums[2] = y;
         }
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
-    };
-    ImagePlaneFactory.prototype._getFlatImageSphereGeo = function (transform) {
-        var gpano = transform.gpano;
-        var phiStart = 2 * Math.PI * gpano.CroppedAreaLeftPixels / gpano.FullPanoWidthPixels;
-        var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;
-        var thetaStart = Math.PI *
-            (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels - gpano.CroppedAreaTopPixels) /
-            gpano.FullPanoHeightPixels;
-        var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;
-        var geometry = new THREE.SphereGeometry(this._imageSphereRadius, 20, 40, phiStart - Math.PI / 2, phiLength, thetaStart, thetaLength);
-        geometry.applyMatrix(new THREE.Matrix4().getInverse(transform.rt));
-        return geometry;
-    };
-    ImagePlaneFactory.prototype._getFlatImagePlaneGeo = function (transform) {
-        var width = transform.width;
-        var height = transform.height;
-        var size = Math.max(width, height);
-        var dx = width / 2.0 / size;
-        var dy = height / 2.0 / size;
-        var vertices = [];
-        vertices.push(transform.unprojectSfM([-dx, -dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([dx, -dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([dx, dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([-dx, dy], this._imagePlaneDepth));
-        var positions = new Float32Array(12);
-        for (var i = 0; i < vertices.length; i++) {
-            var index = 3 * i;
-            positions[index + 0] = vertices[i][0];
-            positions[index + 1] = vertices[i][1];
-            positions[index + 2] = vertices[i][2];
+    }
+    var boundary = [1, 1, -1, -1];
+    var distances = [];
+    for (var side = 0; side < 4; side++) {
+        if (intersections[side]) {
+            distances.push(0);
+            continue;
         }
-        var indices = new Uint16Array(6);
-        indices[0] = 0;
-        indices[1] = 1;
-        indices[2] = 3;
-        indices[3] = 1;
-        indices[4] = 2;
-        indices[5] = 3;
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
-    };
-    return ImagePlaneFactory;
-}());
-exports.ImagePlaneFactory = ImagePlaneFactory;
-exports.default = ImagePlaneFactory;
+        distances.push(Math.abs(boundary[side] - maximums[side]));
+    }
+    return distances;
+}
+exports.viewportDistances = viewportDistances;
 
-},{"../../Component":226,"three":176}],258:[function(require,module,exports){
+},{"../../../src/Geo":294}],347:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../typings/index.d.ts" />
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.MouseComponent = void 0;
 var Component_1 = require("../../Component");
 var Geo_1 = require("../../Geo");
-var ImagePlaneGLRenderer = (function () {
-    function ImagePlaneGLRenderer() {
-        this._imagePlaneFactory = new Component_1.ImagePlaneFactory();
-        this._imagePlaneScene = new Component_1.ImagePlaneScene();
-        this._alpha = 0;
-        this._alphaOld = 0;
-        this._fadeOutSpeed = 0.05;
-        this._lastCamera = new Geo_1.Camera();
-        this._epsilon = 0.000001;
-        this._currentKey = null;
-        this._previousKey = null;
-        this._providerDisposers = {};
-        this._frameId = 0;
-        this._needsRender = false;
+/**
+ * @class MouseComponent
+ *
+ * @classdesc Component handling mouse and touch events for camera movement.
+ *
+ * To retrive and use the mouse component
+ *
+ * @example
+ * ```
+ * var viewer = new Mapillary.Viewer(
+ *     "<element-id>",
+ *     "<client-id>",
+ *     "<my key>");
+ *
+ * var mouseComponent = viewer.getComponent("mouse");
+ * ```
+ */
+var MouseComponent = /** @class */ (function (_super) {
+    __extends(MouseComponent, _super);
+    /** @ignore */
+    function MouseComponent(name, container, navigator) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        var spatial = new Geo_1.Spatial();
+        var viewportCoords = new Geo_1.ViewportCoords();
+        _this._bounceHandler = new Component_1.BounceHandler(_this, container, navigator, viewportCoords, spatial);
+        _this._doubleClickZoomHandler = new Component_1.DoubleClickZoomHandler(_this, container, navigator, viewportCoords);
+        _this._dragPanHandler = new Component_1.DragPanHandler(_this, container, navigator, viewportCoords, spatial);
+        _this._earthControlHandler = new Component_1.EarthControlHandler(_this, container, navigator, viewportCoords, spatial);
+        _this._scrollZoomHandler = new Component_1.ScrollZoomHandler(_this, container, navigator, viewportCoords);
+        _this._touchZoomHandler = new Component_1.TouchZoomHandler(_this, container, navigator, viewportCoords);
+        return _this;
     }
-    Object.defineProperty(ImagePlaneGLRenderer.prototype, "frameId", {
+    Object.defineProperty(MouseComponent.prototype, "doubleClickZoom", {
+        /**
+         * Get double click zoom.
+         *
+         * @returns {DoubleClickZoomHandler} The double click zoom handler.
+         */
         get: function () {
-            return this._frameId;
+            return this._doubleClickZoomHandler;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(ImagePlaneGLRenderer.prototype, "needsRender", {
+    Object.defineProperty(MouseComponent.prototype, "dragPan", {
+        /**
+         * Get drag pan.
+         *
+         * @returns {DragPanHandler} The drag pan handler.
+         */
         get: function () {
-            return this._needsRender;
+            return this._dragPanHandler;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    ImagePlaneGLRenderer.prototype.indicateNeedsRender = function () {
-        this._needsRender = true;
-    };
-    ImagePlaneGLRenderer.prototype.updateFrame = function (frame) {
-        this._updateFrameId(frame.id);
-        this._needsRender = this._updateAlpha(frame.state.alpha) || this._needsRender;
-        this._needsRender = this._updateAlphaOld(frame.state.alpha) || this._needsRender;
-        this._needsRender = this._updateImagePlanes(frame.state) || this._needsRender;
-    };
-    ImagePlaneGLRenderer.prototype.setTextureProvider = function (key, provider) {
+    Object.defineProperty(MouseComponent.prototype, "scrollZoom", {
+        /**
+         * Get scroll zoom.
+         *
+         * @returns {ScrollZoomHandler} The scroll zoom handler.
+         */
+        get: function () {
+            return this._scrollZoomHandler;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseComponent.prototype, "touchZoom", {
+        /**
+         * Get touch zoom.
+         *
+         * @returns {TouchZoomHandler} The touch zoom handler.
+         */
+        get: function () {
+            return this._touchZoomHandler;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    MouseComponent.prototype._activate = function () {
         var _this = this;
-        if (key !== this._currentKey) {
-            return;
-        }
-        var createdSubscription = provider.textureCreated$
-            .subscribe(function (texture) {
-            _this._updateTexture(texture);
-        });
-        var updatedSubscription = provider.textureUpdated$
-            .subscribe(function (updated) {
-            _this._needsRender = true;
-        });
-        var dispose = function () {
-            createdSubscription.unsubscribe();
-            updatedSubscription.unsubscribe();
-            provider.dispose();
-        };
-        if (key in this._providerDisposers) {
-            var disposeProvider = this._providerDisposers[key];
-            disposeProvider();
-            delete this._providerDisposers[key];
-        }
-        this._providerDisposers[key] = dispose;
-    };
-    ImagePlaneGLRenderer.prototype._updateTexture = function (texture) {
-        this._needsRender = true;
-        for (var _i = 0, _a = this._imagePlaneScene.imagePlanes; _i < _a.length; _i++) {
-            var plane = _a[_i];
-            var material = plane.material;
-            var oldTexture = material.uniforms.projectorTex.value;
-            material.uniforms.projectorTex.value = null;
-            oldTexture.dispose();
-            material.uniforms.projectorTex.value = texture;
-        }
-    };
-    ImagePlaneGLRenderer.prototype.updateTextureImage = function (image, node) {
-        if (this._currentKey !== node.key) {
-            return;
-        }
-        this._needsRender = true;
-        for (var _i = 0, _a = this._imagePlaneScene.imagePlanes; _i < _a.length; _i++) {
-            var plane = _a[_i];
-            var material = plane.material;
-            var texture = material.uniforms.projectorTex.value;
-            texture.image = image;
-            texture.needsUpdate = true;
-        }
+        this._bounceHandler.enable();
+        this._earthControlHandler.enable();
+        this._configurationSubscription = this._configuration$
+            .subscribe(function (configuration) {
+            if (configuration.doubleClickZoom) {
+                _this._doubleClickZoomHandler.enable();
+            }
+            else {
+                _this._doubleClickZoomHandler.disable();
+            }
+            if (configuration.dragPan) {
+                _this._dragPanHandler.enable();
+            }
+            else {
+                _this._dragPanHandler.disable();
+            }
+            if (configuration.scrollZoom) {
+                _this._scrollZoomHandler.enable();
+            }
+            else {
+                _this._scrollZoomHandler.disable();
+            }
+            if (configuration.touchZoom) {
+                _this._touchZoomHandler.enable();
+            }
+            else {
+                _this._touchZoomHandler.disable();
+            }
+        });
+        this._container.mouseService.claimMouse(this._name, 0);
     };
-    ImagePlaneGLRenderer.prototype.render = function (perspectiveCamera, renderer) {
-        var planeAlpha = this._imagePlaneScene.imagePlanesOld.length ? 1 : this._alpha;
-        for (var _i = 0, _a = this._imagePlaneScene.imagePlanes; _i < _a.length; _i++) {
-            var plane = _a[_i];
-            plane.material.uniforms.opacity.value = planeAlpha;
-        }
-        for (var _b = 0, _c = this._imagePlaneScene.imagePlanesOld; _b < _c.length; _b++) {
-            var plane = _c[_b];
-            plane.material.uniforms.opacity.value = this._alphaOld;
-        }
-        renderer.render(this._imagePlaneScene.scene, perspectiveCamera);
-        renderer.render(this._imagePlaneScene.sceneOld, perspectiveCamera);
-        for (var _d = 0, _e = this._imagePlaneScene.imagePlanes; _d < _e.length; _d++) {
-            var plane = _e[_d];
-            plane.material.uniforms.opacity.value = this._alpha;
-        }
-        renderer.render(this._imagePlaneScene.scene, perspectiveCamera);
+    MouseComponent.prototype._deactivate = function () {
+        this._container.mouseService.unclaimMouse(this._name);
+        this._configurationSubscription.unsubscribe();
+        this._bounceHandler.disable();
+        this._doubleClickZoomHandler.disable();
+        this._dragPanHandler.disable();
+        this._earthControlHandler.disable();
+        this._scrollZoomHandler.disable();
+        this._touchZoomHandler.disable();
     };
-    ImagePlaneGLRenderer.prototype.clearNeedsRender = function () {
-        this._needsRender = false;
+    MouseComponent.prototype._getDefaultConfiguration = function () {
+        return { doubleClickZoom: false, dragPan: true, scrollZoom: true, touchZoom: true };
     };
-    ImagePlaneGLRenderer.prototype.dispose = function () {
-        this._imagePlaneScene.clear();
+    /** @inheritdoc */
+    MouseComponent.componentName = "mouse";
+    return MouseComponent;
+}(Component_1.Component));
+exports.MouseComponent = MouseComponent;
+Component_1.ComponentService.register(MouseComponent);
+exports.default = MouseComponent;
+
+},{"../../Component":291,"../../Geo":294}],348:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     };
-    ImagePlaneGLRenderer.prototype._updateFrameId = function (frameId) {
-        this._frameId = frameId;
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    ImagePlaneGLRenderer.prototype._updateAlpha = function (alpha) {
-        if (alpha === this._alpha) {
-            return false;
-        }
-        this._alpha = alpha;
-        return true;
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ScrollZoomHandler = void 0;
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+/**
+ * The `ScrollZoomHandler` allows the user to zoom the viewer image by scrolling.
+ *
+ * @example
+ * ```
+ * var mouseComponent = viewer.getComponent("mouse");
+ *
+ * mouseComponent.scrollZoom.disable();
+ * mouseComponent.scrollZoom.enable();
+ *
+ * var isEnabled = mouseComponent.scrollZoom.isEnabled;
+ * ```
+ */
+var ScrollZoomHandler = /** @class */ (function (_super) {
+    __extends(ScrollZoomHandler, _super);
+    /** @ignore */
+    function ScrollZoomHandler(component, container, navigator, viewportCoords) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._viewportCoords = viewportCoords;
+        return _this;
+    }
+    ScrollZoomHandler.prototype._enable = function () {
+        var _this = this;
+        this._container.mouseService.claimWheel(this._component.name, 0);
+        this._preventDefaultSubscription = this._container.mouseService.mouseWheel$
+            .subscribe(function (event) {
+            event.preventDefault();
+        });
+        this._zoomSubscription = this._container.mouseService
+            .filteredWheel$(this._component.name, this._container.mouseService.mouseWheel$).pipe(operators_1.withLatestFrom(this._navigator.stateService.currentState$, function (w, f) {
+            return [w, f];
+        }), operators_1.filter(function (args) {
+            var state = args[1].state;
+            return state.currentNode.fullPano || state.nodesAhead < 1;
+        }), operators_1.map(function (args) {
+            return args[0];
+        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, function (w, r, t) {
+            return [w, r, t];
+        }))
+            .subscribe(function (args) {
+            var event = args[0];
+            var render = args[1];
+            var transform = args[2];
+            var element = _this._container.element;
+            var _a = _this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1];
+            var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective);
+            var reference = transform.projectBasic(unprojected.toArray());
+            var deltaY = event.deltaY;
+            if (event.deltaMode === 1) {
+                deltaY = 40 * deltaY;
+            }
+            else if (event.deltaMode === 2) {
+                deltaY = 800 * deltaY;
+            }
+            var canvasSize = _this._viewportCoords.containerToCanvas(element);
+            var zoom = -3 * deltaY / canvasSize[1];
+            _this._navigator.stateService.zoomIn(zoom, reference);
+        });
     };
-    ImagePlaneGLRenderer.prototype._updateAlphaOld = function (alpha) {
-        if (alpha < 1 || this._alphaOld === 0) {
-            return false;
-        }
-        this._alphaOld = Math.max(0, this._alphaOld - this._fadeOutSpeed);
-        return true;
+    ScrollZoomHandler.prototype._disable = function () {
+        this._container.mouseService.unclaimWheel(this._component.name);
+        this._preventDefaultSubscription.unsubscribe();
+        this._zoomSubscription.unsubscribe();
+        this._preventDefaultSubscription = null;
+        this._zoomSubscription = null;
     };
-    ImagePlaneGLRenderer.prototype._updateImagePlanes = function (state) {
-        if (state.currentNode == null || state.currentNode.key === this._currentKey) {
-            return false;
-        }
-        var previousKey = state.previousNode != null ? state.previousNode.key : null;
-        var currentKey = state.currentNode.key;
-        if (this._previousKey !== previousKey &&
-            this._previousKey !== currentKey &&
-            this._previousKey in this._providerDisposers) {
-            var disposeProvider = this._providerDisposers[this._previousKey];
-            disposeProvider();
-            delete this._providerDisposers[this._previousKey];
-        }
-        if (previousKey != null) {
-            if (previousKey !== this._currentKey && previousKey !== this._previousKey) {
-                var previousMesh = this._imagePlaneFactory.createMesh(state.previousNode, state.previousTransform);
-                this._imagePlaneScene.updateImagePlanes([previousMesh]);
-            }
-            this._previousKey = previousKey;
-        }
-        this._currentKey = currentKey;
-        var currentMesh = this._imagePlaneFactory.createMesh(state.currentNode, state.currentTransform);
-        this._imagePlaneScene.updateImagePlanes([currentMesh]);
-        this._alphaOld = 1;
-        return true;
+    ScrollZoomHandler.prototype._getConfiguration = function (enable) {
+        return { scrollZoom: enable };
     };
-    return ImagePlaneGLRenderer;
-}());
-exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer;
-exports.default = ImagePlaneGLRenderer;
+    return ScrollZoomHandler;
+}(Component_1.HandlerBase));
+exports.ScrollZoomHandler = ScrollZoomHandler;
+exports.default = ScrollZoomHandler;
 
-},{"../../Component":226,"../../Geo":229}],259:[function(require,module,exports){
+},{"../../Component":291,"rxjs/operators":241}],349:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../typings/index.d.ts" />
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var ImagePlaneScene = (function () {
-    function ImagePlaneScene() {
-        this.scene = new THREE.Scene();
-        this.sceneOld = new THREE.Scene();
-        this.imagePlanes = [];
-        this.imagePlanesOld = [];
-    }
-    ImagePlaneScene.prototype.updateImagePlanes = function (planes) {
-        this._dispose(this.imagePlanesOld, this.sceneOld);
-        for (var _i = 0, _a = this.imagePlanes; _i < _a.length; _i++) {
-            var plane = _a[_i];
-            this.scene.remove(plane);
-            this.sceneOld.add(plane);
-        }
-        for (var _b = 0, planes_1 = planes; _b < planes_1.length; _b++) {
-            var plane = planes_1[_b];
-            this.scene.add(plane);
-        }
-        this.imagePlanesOld = this.imagePlanes;
-        this.imagePlanes = planes;
-    };
-    ImagePlaneScene.prototype.addImagePlanes = function (planes) {
-        for (var _i = 0, planes_2 = planes; _i < planes_2.length; _i++) {
-            var plane = planes_2[_i];
-            this.scene.add(plane);
-            this.imagePlanes.push(plane);
-        }
-    };
-    ImagePlaneScene.prototype.addImagePlanesOld = function (planes) {
-        for (var _i = 0, planes_3 = planes; _i < planes_3.length; _i++) {
-            var plane = planes_3[_i];
-            this.sceneOld.add(plane);
-            this.imagePlanesOld.push(plane);
-        }
-    };
-    ImagePlaneScene.prototype.setImagePlanes = function (planes) {
-        this._clear();
-        this.addImagePlanes(planes);
-    };
-    ImagePlaneScene.prototype.setImagePlanesOld = function (planes) {
-        this._clearOld();
-        this.addImagePlanesOld(planes);
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     };
-    ImagePlaneScene.prototype.clear = function () {
-        this._clear();
-        this._clearOld();
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    ImagePlaneScene.prototype._clear = function () {
-        this._dispose(this.imagePlanes, this.scene);
-        this.imagePlanes.length = 0;
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TouchZoomHandler = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+/**
+ * The `TouchZoomHandler` allows the user to zoom the viewer image by pinching on a touchscreen.
+ *
+ * @example
+ * ```
+ * var mouseComponent = viewer.getComponent("mouse");
+ *
+ * mouseComponent.touchZoom.disable();
+ * mouseComponent.touchZoom.enable();
+ *
+ * var isEnabled = mouseComponent.touchZoom.isEnabled;
+ * ```
+ */
+var TouchZoomHandler = /** @class */ (function (_super) {
+    __extends(TouchZoomHandler, _super);
+    /** @ignore */
+    function TouchZoomHandler(component, container, navigator, viewportCoords) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._viewportCoords = viewportCoords;
+        return _this;
+    }
+    TouchZoomHandler.prototype._enable = function () {
+        var _this = this;
+        this._preventDefaultSubscription = this._container.touchService.pinch$
+            .subscribe(function (pinch) {
+            pinch.originalEvent.preventDefault();
+        });
+        var pinchStarted$ = this._container.touchService.pinchStart$.pipe(operators_1.map(function (event) {
+            return true;
+        }));
+        var pinchStopped$ = this._container.touchService.pinchEnd$.pipe(operators_1.map(function (event) {
+            return false;
+        }));
+        this._activeSubscription = rxjs_1.merge(pinchStarted$, pinchStopped$)
+            .subscribe(this._container.touchService.activate$);
+        this._zoomSubscription = this._container.touchService.pinch$.pipe(operators_1.withLatestFrom(this._navigator.stateService.currentState$), operators_1.filter(function (args) {
+            var state = args[1].state;
+            return state.currentNode.fullPano || state.nodesAhead < 1;
+        }), operators_1.map(function (args) {
+            return args[0];
+        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$))
+            .subscribe(function (_a) {
+            var pinch = _a[0], render = _a[1], transform = _a[2];
+            var element = _this._container.element;
+            var _b = _this._viewportCoords.canvasPosition(pinch, element), canvasX = _b[0], canvasY = _b[1];
+            var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective);
+            var reference = transform.projectBasic(unprojected.toArray());
+            var _c = _this._viewportCoords.containerToCanvas(element), canvasWidth = _c[0], canvasHeight = _c[1];
+            var zoom = 3 * pinch.distanceChange / Math.min(canvasWidth, canvasHeight);
+            _this._navigator.stateService.zoomIn(zoom, reference);
+        });
     };
-    ImagePlaneScene.prototype._clearOld = function () {
-        this._dispose(this.imagePlanesOld, this.sceneOld);
-        this.imagePlanesOld.length = 0;
+    TouchZoomHandler.prototype._disable = function () {
+        this._activeSubscription.unsubscribe();
+        this._preventDefaultSubscription.unsubscribe();
+        this._zoomSubscription.unsubscribe();
+        this._preventDefaultSubscription = null;
+        this._zoomSubscription = null;
     };
-    ImagePlaneScene.prototype._dispose = function (planes, scene) {
-        for (var _i = 0, planes_4 = planes; _i < planes_4.length; _i++) {
-            var plane = planes_4[_i];
-            scene.remove(plane);
-            plane.geometry.dispose();
-            plane.material.dispose();
-            var texture = plane.material.uniforms.projectorTex.value;
-            if (texture != null) {
-                texture.dispose();
-            }
-        }
+    TouchZoomHandler.prototype._getConfiguration = function (enable) {
+        return { touchZoom: enable };
     };
-    return ImagePlaneScene;
-}());
-exports.ImagePlaneScene = ImagePlaneScene;
-exports.default = ImagePlaneScene;
+    return TouchZoomHandler;
+}(Component_1.HandlerBase));
+exports.TouchZoomHandler = TouchZoomHandler;
+exports.default = TouchZoomHandler;
 
-},{"three":176}],260:[function(require,module,exports){
+},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],350:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
+var Popup_1 = require("./popup/Popup");
+Object.defineProperty(exports, "Popup", { enumerable: true, get: function () { return Popup_1.Popup; } });
+var PopupComponent_1 = require("./PopupComponent");
+Object.defineProperty(exports, "PopupComponent", { enumerable: true, get: function () { return PopupComponent_1.PopupComponent; } });
 
-var path = require("path");
-var ImagePlaneShaders = (function () {
-    function ImagePlaneShaders() {
-    }
-    ImagePlaneShaders.equirectangular = {
-        fragment: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lon = atan(b.x, b.z);\n    float x = (lon - phiShift) / phiLength + 0.5;\n    float y = (lat - thetaShift) / thetaLength + 0.5;\n    vec4 baseColor = texture2D(projectorTex, vec2(x, y));\n    baseColor.a = opacity;\n    gl_FragColor = baseColor;\n}",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
-    };
-    ImagePlaneShaders.perspective = {
-        fragment: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform vec4 bbox;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.w;\n    float y = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if (x > bbox[0] && y > bbox[1] && x < bbox[2] && y < bbox[3]) {\n        baseColor = texture2D(projectorTex, vec2(x, y));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
-    };
-    return ImagePlaneShaders;
-}());
-exports.ImagePlaneShaders = ImagePlaneShaders;
-
-},{"path":22}],261:[function(require,module,exports){
+},{"./PopupComponent":351,"./popup/Popup":352}],351:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -23572,462 +35528,663 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/observable/fromEvent");
-require("rxjs/add/observable/of");
-require("rxjs/add/observable/zip");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/withLatestFrom");
-require("rxjs/add/operator/zip");
-var State_1 = require("../../State");
-var Render_1 = require("../../Render");
-var Utils_1 = require("../../Utils");
+exports.PopupComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var Component_1 = require("../../Component");
-var SliderState = (function () {
-    function SliderState() {
-        this._imagePlaneFactory = new Component_1.ImagePlaneFactory();
-        this._imagePlaneScene = new Component_1.ImagePlaneScene();
-        this._currentKey = null;
-        this._previousKey = null;
-        this._currentPano = false;
-        this._frameId = 0;
-        this._glNeedsRender = false;
-        this._domNeedsRender = true;
-        this._curtain = 1;
+var Utils_1 = require("../../Utils");
+/**
+ * @class PopupComponent
+ *
+ * @classdesc Component for showing HTML popup objects.
+ *
+ * The `add` method is used for adding new popups. Popups are removed by reference.
+ *
+ * It is not possible to update popups in the set by updating any properties
+ * directly on the popup object. Popups need to be replaced by
+ * removing them and creating new ones with relevant changed properties and
+ * adding those instead.
+ *
+ * Popups are only relevant to a single image because they are based on
+ * 2D basic image coordinates. Popups related to a certain image should
+ * be removed when the viewer is moved to another node.
+ *
+ * To retrive and use the popup component
+ *
+ * @example
+ * ```
+ * var viewer = new Mapillary.Viewer(
+ *     "<element-id>",
+ *     "<client-id>",
+ *     "<my key>",
+ *     { component: { popup: true } });
+ *
+ * var popupComponent = viewer.getComponent("popup");
+ * ```
+ */
+var PopupComponent = /** @class */ (function (_super) {
+    __extends(PopupComponent, _super);
+    /** @ignore */
+    function PopupComponent(name, container, navigator, dom) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._dom = !!dom ? dom : new Utils_1.DOM();
+        _this._popups = [];
+        _this._added$ = new rxjs_1.Subject();
+        _this._popups$ = new rxjs_1.Subject();
+        return _this;
     }
-    Object.defineProperty(SliderState.prototype, "frameId", {
-        get: function () {
-            return this._frameId;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderState.prototype, "curtain", {
-        get: function () {
-            return this._curtain;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderState.prototype, "glNeedsRender", {
-        get: function () {
-            return this._glNeedsRender;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderState.prototype, "domNeedsRender", {
-        get: function () {
-            return this._domNeedsRender;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderState.prototype, "sliderVisible", {
-        get: function () {
-            return this._sliderVisible;
-        },
-        set: function (value) {
-            this._sliderVisible = value;
-            this._domNeedsRender = true;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderState.prototype, "disabled", {
-        get: function () {
-            return this._currentKey == null ||
-                this._previousKey == null ||
-                this._currentPano;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    SliderState.prototype.update = function (frame) {
-        this._updateFrameId(frame.id);
-        var needsRender = this._updateImagePlanes(frame.state);
-        this._domNeedsRender = needsRender || this._domNeedsRender;
-        needsRender = this._updateCurtain(frame.state.alpha) || needsRender;
-        this._glNeedsRender = needsRender || this._glNeedsRender;
-    };
-    SliderState.prototype.updateTexture = function (image, node) {
-        var imagePlanes = node.key === this._currentKey ?
-            this._imagePlaneScene.imagePlanes :
-            node.key === this._previousKey ?
-                this._imagePlaneScene.imagePlanesOld :
-                [];
-        if (imagePlanes.length === 0) {
-            return;
-        }
-        this._glNeedsRender = true;
-        for (var _i = 0, imagePlanes_1 = imagePlanes; _i < imagePlanes_1.length; _i++) {
-            var plane = imagePlanes_1[_i];
-            var material = plane.material;
-            var texture = material.uniforms.projectorTex.value;
-            texture.image = image;
-            texture.needsUpdate = true;
+    /**
+     * Add popups to the popups set.
+     *
+     * @description Adding a new popup never replaces an old one
+     * because they are stored by reference. Adding an already
+     * existing popup has no effect.
+     *
+     * @param {Array<Popup>} popups - Popups to add.
+     *
+     * @example ```popupComponent.add([popup1, popup2]);```
+     */
+    PopupComponent.prototype.add = function (popups) {
+        for (var _i = 0, popups_1 = popups; _i < popups_1.length; _i++) {
+            var popup = popups_1[_i];
+            if (this._popups.indexOf(popup) !== -1) {
+                continue;
+            }
+            this._popups.push(popup);
+            if (this._activated) {
+                popup.setParentContainer(this._popupContainer);
+            }
         }
+        this._added$.next(popups);
+        this._popups$.next(this._popups);
     };
-    SliderState.prototype.render = function (perspectiveCamera, renderer) {
-        if (!this.disabled) {
-            renderer.render(this._imagePlaneScene.sceneOld, perspectiveCamera);
+    /**
+     * Returns an array of all popups.
+     *
+     * @example ```var popups = popupComponent.getAll();```
+     */
+    PopupComponent.prototype.getAll = function () {
+        return this._popups.slice();
+    };
+    /**
+     * Remove popups based on reference from the popup set.
+     *
+     * @param {Array<Popup>} popups - Popups to remove.
+     *
+     * @example ```popupComponent.remove([popup1, popup2]);```
+     */
+    PopupComponent.prototype.remove = function (popups) {
+        for (var _i = 0, popups_2 = popups; _i < popups_2.length; _i++) {
+            var popup = popups_2[_i];
+            this._remove(popup);
         }
-        renderer.render(this._imagePlaneScene.scene, perspectiveCamera);
+        this._popups$.next(this._popups);
     };
-    SliderState.prototype.dispose = function () {
-        this._imagePlaneScene.clear();
+    /**
+     * Remove all popups from the popup set.
+     *
+     * @example ```popupComponent.removeAll();```
+     */
+    PopupComponent.prototype.removeAll = function () {
+        for (var _i = 0, _a = this._popups.slice(); _i < _a.length; _i++) {
+            var popup = _a[_i];
+            this._remove(popup);
+        }
+        this._popups$.next(this._popups);
     };
-    SliderState.prototype.clearGLNeedsRender = function () {
-        this._glNeedsRender = false;
+    PopupComponent.prototype._activate = function () {
+        var _this = this;
+        this._popupContainer = this._dom.createElement("div", "mapillary-js-popup-container", this._container.element);
+        for (var _i = 0, _a = this._popups; _i < _a.length; _i++) {
+            var popup = _a[_i];
+            popup.setParentContainer(this._popupContainer);
+        }
+        this._updateAllSubscription = rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._container.renderService.size$, this._navigator.stateService.currentTransform$)
+            .subscribe(function (_a) {
+            var renderCamera = _a[0], size = _a[1], transform = _a[2];
+            for (var _i = 0, _b = _this._popups; _i < _b.length; _i++) {
+                var popup = _b[_i];
+                popup.update(renderCamera, size, transform);
+            }
+        });
+        var changed$ = this._popups$.pipe(operators_1.startWith(this._popups), operators_1.switchMap(function (popups) {
+            return rxjs_1.from(popups).pipe(operators_1.mergeMap(function (popup) {
+                return popup.changed$;
+            }));
+        }), operators_1.map(function (popup) {
+            return [popup];
+        }));
+        this._updateAddedChangedSubscription = rxjs_1.merge(this._added$, changed$).pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._container.renderService.size$, this._navigator.stateService.currentTransform$))
+            .subscribe(function (_a) {
+            var popups = _a[0], renderCamera = _a[1], size = _a[2], transform = _a[3];
+            for (var _i = 0, popups_3 = popups; _i < popups_3.length; _i++) {
+                var popup = popups_3[_i];
+                popup.update(renderCamera, size, transform);
+            }
+        });
     };
-    SliderState.prototype.clearDomNeedsRender = function () {
-        this._domNeedsRender = false;
+    PopupComponent.prototype._deactivate = function () {
+        this._updateAllSubscription.unsubscribe();
+        this._updateAddedChangedSubscription.unsubscribe();
+        for (var _i = 0, _a = this._popups; _i < _a.length; _i++) {
+            var popup = _a[_i];
+            popup.remove();
+        }
+        this._container.element.removeChild(this._popupContainer);
+        delete this._popupContainer;
     };
-    SliderState.prototype._updateFrameId = function (frameId) {
-        this._frameId = frameId;
+    PopupComponent.prototype._getDefaultConfiguration = function () {
+        return {};
     };
-    SliderState.prototype._updateImagePlanes = function (state) {
-        if (state.currentNode == null) {
+    PopupComponent.prototype._remove = function (popup) {
+        var index = this._popups.indexOf(popup);
+        if (index === -1) {
             return;
         }
-        var needsRender = false;
-        if (state.previousNode != null && this._previousKey !== state.previousNode.key) {
-            needsRender = true;
-            this._previousKey = state.previousNode.key;
-            this._imagePlaneScene.setImagePlanesOld([
-                this._imagePlaneFactory.createMesh(state.previousNode, state.previousTransform),
-            ]);
+        var removed = this._popups.splice(index, 1)[0];
+        if (this._activated) {
+            removed.remove();
+        }
+    };
+    PopupComponent.componentName = "popup";
+    return PopupComponent;
+}(Component_1.Component));
+exports.PopupComponent = PopupComponent;
+Component_1.ComponentService.register(PopupComponent);
+exports.default = PopupComponent;
+
+},{"../../Component":291,"../../Utils":301,"rxjs":43,"rxjs/operators":241}],352:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Popup = void 0;
+var rxjs_1 = require("rxjs");
+var Geo_1 = require("../../../Geo");
+var Utils_1 = require("../../../Utils");
+var Viewer_1 = require("../../../Viewer");
+/**
+ * @class Popup
+ *
+ * @classdesc Popup instance for rendering custom HTML content
+ * on top of images. Popups are based on 2D basic image coordinates
+ * (see the {@link Viewer} class documentation for more information about coordinate
+ * systems) and a certain popup is therefore only relevant to a single image.
+ * Popups related to a certain image should be removed when moving
+ * to another image.
+ *
+ * A popup must have both its content and its point or rect set to be
+ * rendered. Popup options can not be updated after creation but the
+ * basic point or rect as well as its content can be changed by calling
+ * the appropriate methods.
+ *
+ * To create and add one `Popup` with default configuration
+ * (tooltip visuals and automatic float) and one with specific options
+ * use
+ *
+ * @example
+ * ```
+ * var defaultSpan = document.createElement('span');
+ * defaultSpan.innerHTML = 'hello default';
+ *
+ * var defaultPopup = new Mapillary.PopupComponent.Popup();
+ * defaultPopup.setDOMContent(defaultSpan);
+ * defaultPopup.setBasicPoint([0.3, 0.3]);
+ *
+ * var cleanSpan = document.createElement('span');
+ * cleanSpan.innerHTML = 'hello clean';
+ *
+ * var cleanPopup = new Mapillary.PopupComponent.Popup({
+ *     clean: true,
+ *     float: Mapillary.Alignment.Top,
+ *     offset: 10,
+ *     opacity: 0.7,
+ * });
+ *
+ * cleanPopup.setDOMContent(cleanSpan);
+ * cleanPopup.setBasicPoint([0.6, 0.6]);
+ *
+ * popupComponent.add([defaultPopup, cleanPopup]);
+ * ```
+ *
+ * @description Implementation of API methods and API documentation inspired
+ * by/used from https://github.com/mapbox/mapbox-gl-js/blob/v0.38.0/src/ui/popup.js
+ */
+var Popup = /** @class */ (function () {
+    function Popup(options, viewportCoords, dom) {
+        this._options = {};
+        options = !!options ? options : {};
+        this._options.capturePointer = options.capturePointer === false ?
+            options.capturePointer : true;
+        this._options.clean = options.clean;
+        this._options.float = options.float;
+        this._options.offset = options.offset;
+        this._options.opacity = options.opacity;
+        this._options.position = options.position;
+        this._dom = !!dom ? dom : new Utils_1.DOM();
+        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
+        this._notifyChanged$ = new rxjs_1.Subject();
+    }
+    Object.defineProperty(Popup.prototype, "changed$", {
+        /**
+         * @description Internal observable used by the component to
+         * render the popup when its position or content has changed.
+         * @ignore
+         */
+        get: function () {
+            return this._notifyChanged$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * @description Internal method used by the component to
+     * remove all references to the popup.
+     * @ignore
+     */
+    Popup.prototype.remove = function () {
+        if (this._content && this._content.parentNode) {
+            this._content.parentNode.removeChild(this._content);
         }
-        if (this._currentKey !== state.currentNode.key) {
-            needsRender = true;
-            this._currentKey = state.currentNode.key;
-            this._currentPano = state.currentNode.pano;
-            this._imagePlaneScene.setImagePlanes([
-                this._imagePlaneFactory.createMesh(state.currentNode, state.currentTransform),
-            ]);
-            if (!this.disabled) {
-                this._updateBbox();
-            }
+        if (this._container) {
+            this._container.parentNode.removeChild(this._container);
+            delete this._container;
         }
-        return needsRender;
-    };
-    SliderState.prototype._updateCurtain = function (alpha) {
-        if (this.disabled ||
-            Math.abs(this._curtain - alpha) < 0.001) {
-            return false;
+        if (this._parentContainer) {
+            delete this._parentContainer;
         }
-        this._curtain = alpha;
-        this._updateBbox();
-        return true;
     };
-    SliderState.prototype._updateBbox = function () {
-        for (var _i = 0, _a = this._imagePlaneScene.imagePlanes; _i < _a.length; _i++) {
-            var plane = _a[_i];
-            var shaderMaterial = plane.material;
-            var bbox = shaderMaterial.uniforms.bbox.value;
-            bbox.z = this._curtain;
-        }
+    /**
+     * Sets a 2D basic image coordinates point to the popup's anchor, and
+     * moves the popup to it.
+     *
+     * @description Overwrites any previously set point or rect.
+     *
+     * @param {Array<number>} basicPoint - Point in 2D basic image coordinates.
+     *
+     * @example
+     * ```
+     * var popup = new Mapillary.PopupComponent.Popup();
+     * popup.setText('hello image');
+     * popup.setBasicPoint([0.3, 0.3]);
+     *
+     * popupComponent.add([popup]);
+     * ```
+     */
+    Popup.prototype.setBasicPoint = function (basicPoint) {
+        this._point = basicPoint.slice();
+        this._rect = null;
+        this._notifyChanged$.next(this);
     };
-    return SliderState;
-}());
-var SliderComponent = (function (_super) {
-    __extends(SliderComponent, _super);
     /**
-     * Create a new slider component instance.
-     * @class SliderComponent
+     * Sets a 2D basic image coordinates rect to the popup's anchor, and
+     * moves the popup to it.
+     *
+     * @description Overwrites any previously set point or rect.
+     *
+     * @param {Array<number>} basicRect - Rect in 2D basic image
+     * coordinates ([topLeftX, topLeftY, bottomRightX, bottomRightY]) .
+     *
+     * @example
+     * ```
+     * var popup = new Mapillary.PopupComponent.Popup();
+     * popup.setText('hello image');
+     * popup.setBasicRect([0.3, 0.3, 0.5, 0.6]);
+     *
+     * popupComponent.add([popup]);
+     * ```
      */
-    function SliderComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._sliderStateOperation$ = new Subject_1.Subject();
-        _this._sliderStateCreator$ = new Subject_1.Subject();
-        _this._sliderStateDisposer$ = new Subject_1.Subject();
-        _this._sliderState$ = _this._sliderStateOperation$
-            .scan(function (sliderState, operation) {
-            return operation(sliderState);
-        }, null)
-            .filter(function (sliderState) {
-            return sliderState != null;
-        })
-            .distinctUntilChanged(undefined, function (sliderState) {
-            return sliderState.frameId;
-        });
-        _this._sliderStateCreator$
-            .map(function () {
-            return function (sliderState) {
-                if (sliderState != null) {
-                    throw new Error("Multiple slider states can not be created at the same time");
-                }
-                return new SliderState();
-            };
-        })
-            .subscribe(_this._sliderStateOperation$);
-        _this._sliderStateDisposer$
-            .map(function () {
-            return function (sliderState) {
-                sliderState.dispose();
-                return null;
-            };
-        })
-            .subscribe(_this._sliderStateOperation$);
-        return _this;
-    }
+    Popup.prototype.setBasicRect = function (basicRect) {
+        this._rect = basicRect.slice();
+        this._point = null;
+        this._notifyChanged$.next(this);
+    };
     /**
-     * Set the image keys.
+     * Sets the popup's content to the element provided as a DOM node.
+     *
+     * @param {Node} htmlNode - A DOM node to be used as content for the popup.
+     *
+     * @example
+     * ```
+     * var div = document.createElement('div');
+     * div.innerHTML = 'hello image';
      *
-     * Configures the component to show the image planes for the supplied image keys.
+     * var popup = new Mapillary.PopupComponent.Popup();
+     * popup.setDOMContent(div);
+     * popup.setBasicPoint([0.3, 0.3]);
      *
-     * @param {keys} ISliderKeys - Slider keys object specifying the images to be shown in the foreground and the background.
+     * popupComponent.add([popup]);
+     * ```
      */
-    SliderComponent.prototype.setKeys = function (keys) {
-        this.configure({ keys: keys });
+    Popup.prototype.setDOMContent = function (htmlNode) {
+        if (this._content && this._content.parentNode) {
+            this._content.parentNode.removeChild(this._content);
+        }
+        var className = "mapillaryjs-popup-content" +
+            (this._options.clean === true ? "-clean" : "") +
+            (this._options.capturePointer === true ? " mapillaryjs-popup-capture-pointer" : "");
+        this._content = this._dom.createElement("div", className, this._container);
+        this._content.appendChild(htmlNode);
+        this._notifyChanged$.next(this);
     };
     /**
-     * Set the initial position.
+     * Sets the popup's content to the HTML provided as a string.
      *
-     * Configures the intial position of the slider. The inital position value will be used when the component is activated.
+     * @description This method does not perform HTML filtering or sanitization,
+     * and must be used only with trusted content. Consider Popup#setText if the
+     * content is an untrusted text string.
      *
-     * @param {number} initialPosition - Initial slider position.
+     * @param {string} html - A string representing HTML content for the popup.
+     *
+     * @example
+     * ```
+     * var popup = new Mapillary.PopupComponent.Popup();
+     * popup.setHTML('<div>hello image</div>');
+     * popup.setBasicPoint([0.3, 0.3]);
+     *
+     * popupComponent.add([popup]);
+     * ```
      */
-    SliderComponent.prototype.setInitialPosition = function (initialPosition) {
-        this.configure({ initialPosition: initialPosition });
+    Popup.prototype.setHTML = function (html) {
+        var frag = this._dom.document.createDocumentFragment();
+        var temp = this._dom.createElement("body");
+        var child;
+        temp.innerHTML = html;
+        while (true) {
+            child = temp.firstChild;
+            if (!child) {
+                break;
+            }
+            frag.appendChild(child);
+        }
+        this.setDOMContent(frag);
     };
     /**
-     * Set the value controlling if the slider is visible.
+     * Sets the popup's content to a string of text.
      *
-     * @param {boolean} sliderVisible - Value indicating if the slider should be visible or not.
+     * @description This function creates a Text node in the DOM, so it cannot insert raw HTML.
+     * Use this method for security against XSS if the popup content is user-provided.
+     *
+     * @param {string} text - Textual content for the popup.
+     *
+     * @example
+     * ```
+     * var popup = new Mapillary.PopupComponent.Popup();
+     * popup.setText('hello image');
+     * popup.setBasicPoint([0.3, 0.3]);
+     *
+     * popupComponent.add([popup]);
+     * ```
      */
-    SliderComponent.prototype.setSliderVisible = function (sliderVisible) {
-        this.configure({ sliderVisible: sliderVisible });
+    Popup.prototype.setText = function (text) {
+        this.setDOMContent(this._dom.document.createTextNode(text));
     };
-    SliderComponent.prototype._activate = function () {
-        var _this = this;
-        this._sliderContainer = this._createElement("div", "mapillary-js-slider-container", this._container.element);
-        this._sliderWrapper = this._createElement("div", "SliderWrapper", this._sliderContainer);
-        this._sliderControl = this._createElement("input", "SliderControl", this._sliderWrapper);
-        this._sliderControl.setAttribute("type", "range");
-        this._sliderControl.setAttribute("min", "0");
-        this._sliderControl.setAttribute("max", "1000");
-        this._sliderControl.style.visibility = "hidden";
-        this._moveToHandler = function (e) {
-            var curtain = Number(e.target.value) / 1000;
-            _this._navigator.stateService.moveTo(curtain);
-        };
-        this._sliderControl.addEventListener("input", this._moveToHandler);
-        this._sliderControl.addEventListener("change", this._moveToHandler);
-        Observable_1.Observable
-            .combineLatest(this._navigator.stateService.state$, this._configuration$)
-            .first()
-            .subscribe(function (_a) {
-            var state = _a[0], configuration = _a[1];
-            if (state === State_1.State.Traversing) {
-                _this._navigator.stateService.wait();
-                var position = configuration.initialPosition != null ? configuration.initialPosition : 1;
-                _this._sliderControl.value = (1000 * position).toString();
-                _this._navigator.stateService.moveTo(position);
+    /**
+     * @description Internal method for attaching the popup to
+     * its parent container so that it is rendered in the DOM tree.
+     * @ignore
+     */
+    Popup.prototype.setParentContainer = function (parentContainer) {
+        this._parentContainer = parentContainer;
+    };
+    /**
+     * @description Internal method for updating the rendered
+     * position of the popup called by the popup component.
+     * @ignore
+     */
+    Popup.prototype.update = function (renderCamera, size, transform) {
+        var _a;
+        if (!this._parentContainer || !this._content) {
+            return;
+        }
+        if (!this._point && !this._rect) {
+            return;
+        }
+        if (!this._container) {
+            this._container = this._dom.createElement("div", "mapillaryjs-popup", this._parentContainer);
+            var showTip = this._options.clean !== true &&
+                this._options.float !== Viewer_1.Alignment.Center;
+            if (showTip) {
+                var tipClassName = "mapillaryjs-popup-tip" +
+                    (this._options.capturePointer === true ? " mapillaryjs-popup-capture-pointer" : "");
+                this._tip = this._dom.createElement("div", tipClassName, this._container);
+                this._dom.createElement("div", "mapillaryjs-popup-tip-inner", this._tip);
             }
-        });
-        this._glRenderSubscription = this._sliderState$
-            .map(function (sliderState) {
-            var renderHash = {
-                name: _this._name,
-                render: {
-                    frameId: sliderState.frameId,
-                    needsRender: sliderState.glNeedsRender,
-                    render: sliderState.render.bind(sliderState),
-                    stage: Render_1.GLRenderStage.Background,
-                },
-            };
-            sliderState.clearGLNeedsRender();
-            return renderHash;
-        })
-            .subscribe(this._container.glRenderer.render$);
-        this._domRenderSubscription = this._sliderState$
-            .filter(function (sliderState) {
-            return sliderState.domNeedsRender;
-        })
-            .subscribe(function (sliderState) {
-            _this._sliderControl.value = (1000 * sliderState.curtain).toString();
-            var visibility = sliderState.disabled || !sliderState.sliderVisible ? "hidden" : "visible";
-            _this._sliderControl.style.visibility = visibility;
-            sliderState.clearDomNeedsRender();
-        });
-        this._sliderStateCreator$.next(null);
-        this._stateSubscription = this._navigator.stateService.currentState$
-            .map(function (frame) {
-            return function (sliderState) {
-                sliderState.update(frame);
-                return sliderState;
-            };
-        })
-            .subscribe(this._sliderStateOperation$);
-        this._setSliderVisibleSubscription = this._configuration$
-            .map(function (configuration) {
-            return configuration.sliderVisible == null || configuration.sliderVisible;
-        })
-            .distinctUntilChanged()
-            .map(function (sliderVisible) {
-            return function (sliderState) {
-                sliderState.sliderVisible = sliderVisible;
-                return sliderState;
-            };
-        })
-            .subscribe(this._sliderStateOperation$);
-        this._setKeysSubscription = this._configuration$
-            .filter(function (configuration) {
-            return configuration.keys != null;
-        })
-            .switchMap(function (configuration) {
-            return Observable_1.Observable
-                .zip(_this._catchCacheNode$(configuration.keys.background), _this._catchCacheNode$(configuration.keys.foreground))
-                .map(function (nodes) {
-                return { background: nodes[0], foreground: nodes[1] };
-            })
-                .zip(_this._navigator.stateService.currentState$.first())
-                .map(function (nf) {
-                return { nodes: nf[0], state: nf[1].state };
-            });
-        })
-            .subscribe(function (co) {
-            if (co.state.currentNode != null &&
-                co.state.previousNode != null &&
-                co.state.currentNode.key === co.nodes.foreground.key &&
-                co.state.previousNode.key === co.nodes.background.key) {
-                return;
+            this._container.appendChild(this._content);
+            this._parentContainer.appendChild(this._container);
+            if (this._options.opacity != null) {
+                this._container.style.opacity = this._options.opacity.toString();
             }
-            if (co.state.currentNode.key === co.nodes.background.key) {
-                _this._navigator.stateService.setNodes([co.nodes.foreground]);
-                return;
+        }
+        var pointPixel = null;
+        var position = this._alignmentToPopupAligment(this._options.position);
+        var float = this._alignmentToPopupAligment(this._options.float);
+        var classList = this._container.classList;
+        if (this._point != null) {
+            pointPixel =
+                this._viewportCoords.basicToCanvasSafe(this._point[0], this._point[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
+        }
+        else {
+            var alignments = ["center", "top", "bottom", "left", "right", "top-left", "top-right", "bottom-left", "bottom-right"];
+            var appliedPosition = null;
+            for (var _i = 0, alignments_1 = alignments; _i < alignments_1.length; _i++) {
+                var alignment = alignments_1[_i];
+                if (classList.contains("mapillaryjs-popup-float-" + alignment)) {
+                    appliedPosition = alignment;
+                    break;
+                }
             }
-            if (co.state.currentNode.key === co.nodes.foreground.key &&
-                co.state.trajectory.length === 1) {
-                _this._navigator.stateService.prependNodes([co.nodes.background]);
-                return;
+            _a = this._rectToPixel(this._rect, position, appliedPosition, renderCamera, size, transform), pointPixel = _a[0], position = _a[1];
+            if (!float) {
+                float = position;
             }
-            _this._navigator.stateService.setNodes([co.nodes.background]);
-            _this._navigator.stateService.setNodes([co.nodes.foreground]);
-        }, function (e) {
-            console.error(e);
-        });
-        var previousNode$ = this._navigator.stateService.currentState$
-            .map(function (frame) {
-            return frame.state.previousNode;
-        })
-            .filter(function (node) {
-            return node != null;
-        })
-            .distinctUntilChanged(undefined, function (node) {
-            return node.key;
-        });
-        this._nodeSubscription = Observable_1.Observable
-            .merge(previousNode$, this._navigator.stateService.currentNode$)
-            .filter(function (node) {
-            return node.pano ?
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
-        })
-            .mergeMap(function (node) {
-            var baseImageSize = node.pano ?
-                Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.baseImageSize;
-            if (Math.max(node.image.width, node.image.height) > baseImageSize) {
-                return Observable_1.Observable.empty();
+        }
+        if (pointPixel == null) {
+            this._container.style.display = "none";
+            return;
+        }
+        this._container.style.display = "";
+        if (!float) {
+            var width = this._container.offsetWidth;
+            var height = this._container.offsetHeight;
+            var floats = this._pixelToFloats(pointPixel, size, width, height);
+            float = floats.length === 0 ? "top" : floats.join("-");
+        }
+        var offset = this._normalizeOffset(this._options.offset);
+        pointPixel = [pointPixel[0] + offset[float][0], pointPixel[1] + offset[float][1]];
+        pointPixel = [Math.round(pointPixel[0]), Math.round(pointPixel[1])];
+        var floatTranslate = {
+            "bottom": "translate(-50%,0)",
+            "bottom-left": "translate(-100%,0)",
+            "bottom-right": "translate(0,0)",
+            "center": "translate(-50%,-50%)",
+            "left": "translate(-100%,-50%)",
+            "right": "translate(0,-50%)",
+            "top": "translate(-50%,-100%)",
+            "top-left": "translate(-100%,-100%)",
+            "top-right": "translate(0,-100%)",
+        };
+        for (var key in floatTranslate) {
+            if (!floatTranslate.hasOwnProperty(key)) {
+                continue;
             }
-            return node.cacheImage$(Utils_1.Settings.maxImageSize)
-                .map(function (n) {
-                return [n.image, n];
-            })
-                .catch(function (error, caught) {
-                console.error("Failed to fetch high res slider image (" + node.key + ")", error);
-                return Observable_1.Observable.empty();
-            });
-        })
-            .map(function (_a) {
-            var element = _a[0], node = _a[1];
-            return function (sliderState) {
-                sliderState.updateTexture(element, node);
-                return sliderState;
-            };
-        })
-            .subscribe(this._sliderStateOperation$);
+            classList.remove("mapillaryjs-popup-float-" + key);
+        }
+        classList.add("mapillaryjs-popup-float-" + float);
+        this._container.style.transform = floatTranslate[float] + " translate(" + pointPixel[0] + "px," + pointPixel[1] + "px)";
     };
-    SliderComponent.prototype._deactivate = function () {
-        var _this = this;
-        this._navigator.stateService.state$
-            .first()
-            .subscribe(function (state) {
-            if (state === State_1.State.Waiting) {
-                _this._navigator.stateService.traverse();
+    Popup.prototype._rectToPixel = function (rect, position, appliedPosition, renderCamera, size, transform) {
+        if (!position) {
+            var width = this._container.offsetWidth;
+            var height = this._container.offsetHeight;
+            var floatOffsets = {
+                "bottom": [0, height / 2],
+                "bottom-left": [-width / 2, height / 2],
+                "bottom-right": [width / 2, height / 2],
+                "left": [-width / 2, 0],
+                "right": [width / 2, 0],
+                "top": [0, -height / 2],
+                "top-left": [-width / 2, -height / 2],
+                "top-right": [width / 2, -height / 2],
+            };
+            var automaticPositions = ["top", "bottom", "left", "right"];
+            var largestVisibleArea = [0, null, null];
+            for (var _i = 0, automaticPositions_1 = automaticPositions; _i < automaticPositions_1.length; _i++) {
+                var automaticPosition = automaticPositions_1[_i];
+                var autoPointBasic = this._pointFromRectPosition(rect, automaticPosition);
+                var autoPointPixel = this._viewportCoords.basicToCanvasSafe(autoPointBasic[0], autoPointBasic[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
+                if (autoPointPixel == null) {
+                    continue;
+                }
+                var floatOffset = floatOffsets[automaticPosition];
+                var offsetedPosition = [autoPointPixel[0] + floatOffset[0], autoPointPixel[1] + floatOffset[1]];
+                var staticCoeff = appliedPosition != null && appliedPosition === automaticPosition ? 1 : 0.7;
+                var floats = this._pixelToFloats(offsetedPosition, size, width / staticCoeff, height / (2 * staticCoeff));
+                if (floats.length === 0 &&
+                    autoPointPixel[0] > 0 &&
+                    autoPointPixel[0] < size.width &&
+                    autoPointPixel[1] > 0 &&
+                    autoPointPixel[1] < size.height) {
+                    return [autoPointPixel, automaticPosition];
+                }
+                var minX = Math.max(offsetedPosition[0] - width / 2, 0);
+                var maxX = Math.min(offsetedPosition[0] + width / 2, size.width);
+                var minY = Math.max(offsetedPosition[1] - height / 2, 0);
+                var maxY = Math.min(offsetedPosition[1] + height / 2, size.height);
+                var visibleX = Math.max(0, maxX - minX);
+                var visibleY = Math.max(0, maxY - minY);
+                var visibleArea = staticCoeff * visibleX * visibleY;
+                if (visibleArea > largestVisibleArea[0]) {
+                    largestVisibleArea[0] = visibleArea;
+                    largestVisibleArea[1] = autoPointPixel;
+                    largestVisibleArea[2] = automaticPosition;
+                }
             }
-        });
-        this._sliderStateDisposer$.next(null);
-        this._setKeysSubscription.unsubscribe();
-        this._setSliderVisibleSubscription.unsubscribe();
-        this._stateSubscription.unsubscribe();
-        this._glRenderSubscription.unsubscribe();
-        this._domRenderSubscription.unsubscribe();
-        this._nodeSubscription.unsubscribe();
-        this.configure({ keys: null });
-        this._sliderControl.removeEventListener("input", this._moveToHandler);
-        this._sliderControl.removeEventListener("change", this._moveToHandler);
-        this._container.element.removeChild(this._sliderContainer);
-        this._moveToHandler = null;
-        this._sliderControl = null;
-        this._sliderWrapper = null;
-        this._sliderContainer = null;
+            if (largestVisibleArea[0] > 0) {
+                return [largestVisibleArea[1], largestVisibleArea[2]];
+            }
+        }
+        var pointBasic = this._pointFromRectPosition(rect, position);
+        var pointPixel = this._viewportCoords.basicToCanvasSafe(pointBasic[0], pointBasic[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
+        return [pointPixel, position != null ? position : "top"];
     };
-    SliderComponent.prototype._getDefaultConfiguration = function () {
-        return {};
+    Popup.prototype._alignmentToPopupAligment = function (float) {
+        switch (float) {
+            case Viewer_1.Alignment.Bottom:
+                return "bottom";
+            case Viewer_1.Alignment.BottomLeft:
+                return "bottom-left";
+            case Viewer_1.Alignment.BottomRight:
+                return "bottom-right";
+            case Viewer_1.Alignment.Center:
+                return "center";
+            case Viewer_1.Alignment.Left:
+                return "left";
+            case Viewer_1.Alignment.Right:
+                return "right";
+            case Viewer_1.Alignment.Top:
+                return "top";
+            case Viewer_1.Alignment.TopLeft:
+                return "top-left";
+            case Viewer_1.Alignment.TopRight:
+                return "top-right";
+            default:
+                return null;
+        }
     };
-    SliderComponent.prototype._catchCacheNode$ = function (key) {
-        return this._navigator.graphService.cacheNode$(key)
-            .catch(function (error, caught) {
-            console.error("Failed to cache slider node (" + key + ")", error);
-            return Observable_1.Observable.empty();
-        });
+    Popup.prototype._normalizeOffset = function (offset) {
+        if (offset == null) {
+            return this._normalizeOffset(0);
+        }
+        if (typeof offset === "number") {
+            // input specifies a radius
+            var sideOffset = offset;
+            var sign = sideOffset >= 0 ? 1 : -1;
+            var cornerOffset = sign * Math.round(Math.sqrt(0.5 * Math.pow(sideOffset, 2)));
+            return {
+                "bottom": [0, sideOffset],
+                "bottom-left": [-cornerOffset, cornerOffset],
+                "bottom-right": [cornerOffset, cornerOffset],
+                "center": [0, 0],
+                "left": [-sideOffset, 0],
+                "right": [sideOffset, 0],
+                "top": [0, -sideOffset],
+                "top-left": [-cornerOffset, -cornerOffset],
+                "top-right": [cornerOffset, -cornerOffset],
+            };
+        }
+        else {
+            // input specifes a value for each position
+            return {
+                "bottom": offset.bottom || [0, 0],
+                "bottom-left": offset.bottomLeft || [0, 0],
+                "bottom-right": offset.bottomRight || [0, 0],
+                "center": offset.center || [0, 0],
+                "left": offset.left || [0, 0],
+                "right": offset.right || [0, 0],
+                "top": offset.top || [0, 0],
+                "top-left": offset.topLeft || [0, 0],
+                "top-right": offset.topRight || [0, 0],
+            };
+        }
     };
-    SliderComponent.prototype._createElement = function (tagName, className, container) {
-        var element = document.createElement(tagName);
-        if (!!className) {
-            element.className = className;
+    Popup.prototype._pixelToFloats = function (pointPixel, size, width, height) {
+        var floats = [];
+        if (pointPixel[1] < height) {
+            floats.push("bottom");
         }
-        if (!!container) {
-            container.appendChild(element);
+        else if (pointPixel[1] > size.height - height) {
+            floats.push("top");
         }
-        return element;
+        if (pointPixel[0] < width / 2) {
+            floats.push("right");
+        }
+        else if (pointPixel[0] > size.width - width / 2) {
+            floats.push("left");
+        }
+        return floats;
     };
-    SliderComponent.componentName = "slider";
-    return SliderComponent;
-}(Component_1.Component));
-exports.SliderComponent = SliderComponent;
-Component_1.ComponentService.register(SliderComponent);
-exports.default = SliderComponent;
+    Popup.prototype._pointFromRectPosition = function (rect, position) {
+        var x0 = rect[0];
+        var x1 = rect[0] < rect[2] ? rect[2] : rect[2] + 1;
+        var y0 = rect[1];
+        var y1 = rect[3];
+        switch (position) {
+            case "bottom":
+                return [(x0 + x1) / 2, y1];
+            case "bottom-left":
+                return [x0, y1];
+            case "bottom-right":
+                return [x1, y1];
+            case "center":
+                return [(x0 + x1) / 2, (y0 + y1) / 2];
+            case "left":
+                return [x0, (y0 + y1) / 2];
+            case "right":
+                return [x1, (y0 + y1) / 2];
+            case "top":
+                return [(x0 + x1) / 2, y0];
+            case "top-left":
+                return [x0, y0];
+            case "top-right":
+                return [x1, y0];
+            default:
+                return [(x0 + x1) / 2, y1];
+        }
+    };
+    return Popup;
+}());
+exports.Popup = Popup;
+exports.default = Popup;
 
-},{"../../Component":226,"../../Render":232,"../../State":233,"../../Utils":235,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/fromEvent":42,"rxjs/add/observable/of":45,"rxjs/add/observable/zip":48,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/scan":73,"rxjs/add/operator/switchMap":79,"rxjs/add/operator/withLatestFrom":83,"rxjs/add/operator/zip":84}],262:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var MarkerComponent_1 = require("./MarkerComponent");
-exports.MarkerComponent = MarkerComponent_1.MarkerComponent;
-var SimpleMarker_1 = require("./marker/SimpleMarker");
-exports.SimpleMarker = SimpleMarker_1.SimpleMarker;
-var CircleMarker_1 = require("./marker/CircleMarker");
-exports.CircleMarker = CircleMarker_1.CircleMarker;
 
-},{"./MarkerComponent":263,"./marker/CircleMarker":266,"./marker/SimpleMarker":268}],263:[function(require,module,exports){
+},{"../../../Geo":294,"../../../Utils":301,"../../../Viewer":302,"rxjs":43}],353:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -24035,729 +36192,829 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var when = require("when");
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/map");
+exports.SequenceComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var Component_1 = require("../../Component");
-var Render_1 = require("../../Render");
+var Edge_1 = require("../../Edge");
 var Graph_1 = require("../../Graph");
-var Geo_1 = require("../../Geo");
 /**
- * @class MarkerComponent
- *
- * @classdesc Component for showing and editing 3D marker objects.
- *
- * The `add` method is used for adding new markers or replacing
- * markers already in the set.
- *
- * If a marker already in the set has the same
- * id as one of the markers added, the old marker will be removed and
- * the added marker will take its place.
- *
- * It is not possible to update markers in the set by updating any properties
- * directly on the marker object. Markers need to be replaced by
- * re-adding them for updates to geographic position or configuration
- * to be reflected.
- *
- * Markers added to the marker component can be either interactive
- * or non-interactive. Different marker types define their behavior.
- * Markers with interaction support can be configured with options
- * to respond to dragging inside the viewer and be detected when
- * retrieving markers from pixel points with the `getMarkerIdAt` method.
- *
- * To retrive and use the marker component
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>",
- *     { component: { marker: true } });
- *
- * var markerComponent = viewer.getComponent("marker");
- * ```
+ * @class SequenceComponent
+ * @classdesc Component showing navigation arrows for sequence directions
+ * as well as playing button. Exposes an API to start and stop play.
  */
-var MarkerComponent = (function (_super) {
-    __extends(MarkerComponent, _super);
-    function MarkerComponent(name, container, navigator) {
+var SequenceComponent = /** @class */ (function (_super) {
+    __extends(SequenceComponent, _super);
+    function SequenceComponent(name, container, navigator, renderer, scheduler) {
         var _this = _super.call(this, name, container, navigator) || this;
-        _this._relativeGroundAltitude = -2;
-        _this._geoCoords = new Geo_1.GeoCoords();
-        _this._graphCalculator = new Graph_1.GraphCalculator();
-        _this._markerScene = new Component_1.MarkerScene();
-        _this._markerSet = new Component_1.MarkerSet();
-        _this._viewportCoords = new Geo_1.ViewportCoords();
+        _this._sequenceDOMRenderer = !!renderer ? renderer : new Component_1.SequenceDOMRenderer(container);
+        _this._scheduler = scheduler;
+        _this._containerWidth$ = new rxjs_1.Subject();
+        _this._hoveredKeySubject$ = new rxjs_1.Subject();
+        _this._hoveredKey$ = _this._hoveredKeySubject$.pipe(operators_1.share());
+        _this._navigator.playService.playing$.pipe(operators_1.skip(1), operators_1.withLatestFrom(_this._configuration$))
+            .subscribe(function (_a) {
+            var playing = _a[0], configuration = _a[1];
+            _this.fire(SequenceComponent.playingchanged, playing);
+            if (playing === configuration.playing) {
+                return;
+            }
+            if (playing) {
+                _this.play();
+            }
+            else {
+                _this.stop();
+            }
+        });
+        _this._navigator.playService.direction$.pipe(operators_1.skip(1), operators_1.withLatestFrom(_this._configuration$))
+            .subscribe(function (_a) {
+            var direction = _a[0], configuration = _a[1];
+            if (direction !== configuration.direction) {
+                _this.setDirection(direction);
+            }
+        });
         return _this;
     }
+    Object.defineProperty(SequenceComponent.prototype, "hoveredKey$", {
+        /**
+         * Get hovered key observable.
+         *
+         * @description An observable emitting the key of the node for the direction
+         * arrow that is being hovered. When the mouse leaves a direction arrow null
+         * is emitted.
+         *
+         * @returns {Observable<string>}
+         */
+        get: function () {
+            return this._hoveredKey$;
+        },
+        enumerable: false,
+        configurable: true
+    });
     /**
-     * Add markers to the marker set or replace markers in the marker set.
-     *
-     * @description If a marker already in the set has the same
-     * id as one of the markers added, the old marker will be removed
-     * the added marker will take its place.
-     *
-     * Any marker inside the visible bounding bbox
-     * will be initialized and placed in the viewer.
-     *
-     * @param {Array<Marker>} markers - Markers to add.
+     * Start playing.
      *
-     * @example ```markerComponent.add([marker1, marker2]);```
+     * @fires PlayerComponent#playingchanged
      */
-    MarkerComponent.prototype.add = function (markers) {
-        this._markerSet.add(markers);
+    SequenceComponent.prototype.play = function () {
+        this.configure({ playing: true });
     };
     /**
-     * Returns the marker in the marker set with the specified id, or
-     * undefined if the id matches no marker.
-     *
-     * @param {string} markerId - Id of the marker.
-     *
-     * @example ```var marker = markerComponent.get("markerId");```
+     * Stop playing.
      *
+     * @fires PlayerComponent#playingchanged
      */
-    MarkerComponent.prototype.get = function (markerId) {
-        return this._markerSet.get(markerId);
+    SequenceComponent.prototype.stop = function () {
+        this.configure({ playing: false });
     };
     /**
-     * Returns an array of all markers.
+     * Set the direction to follow when playing.
      *
-     * @example ```var markers = markerComponent.getAll();```
+     * @param {EdgeDirection} direction - The direction that will be followed when playing.
      */
-    MarkerComponent.prototype.getAll = function () {
-        return this._markerSet.getAll();
+    SequenceComponent.prototype.setDirection = function (direction) {
+        this.configure({ direction: direction });
     };
     /**
-     * Returns the id of the interactive marker closest to the current camera
-     * position at the specified point.
-     *
-     * @description Notice that the pixelPoint argument requires x, y
-     * coordinates from pixel space.
-     *
-     * With this function, you can use the coordinates provided by mouse
-     * events to get information out of the marker component.
-     *
-     * If no interactive geometry of an interactive marker exist at the pixel
-     * point, `null` will be returned.
+     * Set highlight key.
      *
-     * @param {Array<number>} pixelPoint - Pixel coordinates on the viewer element.
-     * @returns {string} Id of the interactive marker closest to the camera. If no
-     * interactive marker exist at the pixel point, `null` will be returned.
+     * @description The arrow pointing towards the node corresponding to the
+     * highlight key will be highlighted.
      *
-     * @example
-     * ```
-     * markerComponent.getMarkerIdAt([100, 100])
-     *     .then((markerId) => { console.log(markerId); });
-     * ```
+     * @param {string} highlightKey Key of node to be highlighted if existing.
      */
-    MarkerComponent.prototype.getMarkerIdAt = function (pixelPoint) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._container.renderService.renderCamera$
-                .first()
-                .map(function (render) {
-                var viewport = _this._viewportCoords
-                    .canvasToViewport(pixelPoint[0], pixelPoint[1], _this._container.element);
-                var id = _this._markerScene.intersectObjects(viewport, render.perspective);
-                return id;
-            })
-                .subscribe(function (id) {
-                resolve(id);
-            }, function (error) {
-                reject(error);
-            });
-        });
+    SequenceComponent.prototype.setHighlightKey = function (highlightKey) {
+        this.configure({ highlightKey: highlightKey });
     };
     /**
-     * Check if a marker exist in the marker set.
+     * Set max width of container element.
      *
-     * @param {string} markerId - Id of the marker.
+     * @description Set max width of the container element holding
+     * the sequence navigation elements. If the min width is larger than the
+     * max width the min width value will be used.
      *
-     * @example ```var markerExists = markerComponent.has("markerId");```
+     * The container element is automatically resized when the resize
+     * method on the Viewer class is called.
+     *
+     * @param {number} minWidth
      */
-    MarkerComponent.prototype.has = function (markerId) {
-        return this._markerSet.has(markerId);
+    SequenceComponent.prototype.setMaxWidth = function (maxWidth) {
+        this.configure({ maxWidth: maxWidth });
     };
     /**
-     * Remove markers with the specified ids from the marker set.
+     * Set min width of container element.
      *
-     * @param {Array<string>} markerIds - Ids for markers to remove.
+     * @description Set min width of the container element holding
+     * the sequence navigation elements. If the min width is larger than the
+     * max width the min width value will be used.
      *
-     * @example ```markerComponent.remove(["id-1", "id-2"]);```
+     * The container element is automatically resized when the resize
+     * method on the Viewer class is called.
+     *
+     * @param {number} minWidth
      */
-    MarkerComponent.prototype.remove = function (markerIds) {
-        this._markerSet.remove(markerIds);
+    SequenceComponent.prototype.setMinWidth = function (minWidth) {
+        this.configure({ minWidth: minWidth });
     };
     /**
-     * Remove all markers from the marker set.
+     * Set the value indicating whether the sequence UI elements should be visible.
      *
-     * @example ```markerComponent.removeAll();```
+     * @param {boolean} visible
      */
-    MarkerComponent.prototype.removeAll = function () {
-        this._markerSet.removeAll();
+    SequenceComponent.prototype.setVisible = function (visible) {
+        this.configure({ visible: visible });
     };
-    MarkerComponent.prototype._activate = function () {
+    SequenceComponent.prototype._activate = function () {
         var _this = this;
-        var groundAltitude$ = this._navigator.stateService.currentState$
-            .map(function (frame) {
-            return frame.state.camera.position.z + _this._relativeGroundAltitude;
-        })
-            .distinctUntilChanged(function (a1, a2) {
-            return Math.abs(a1 - a2) < 0.01;
-        })
-            .publishReplay(1)
-            .refCount();
-        var geoInitiated$ = Observable_1.Observable
-            .combineLatest(groundAltitude$, this._navigator.stateService.reference$)
-            .first()
-            .map(function () { })
-            .publishReplay(1)
-            .refCount();
-        var clampedConfiguration$ = this._configuration$
-            .map(function (configuration) {
-            return { visibleBBoxSize: Math.max(1, Math.min(200, configuration.visibleBBoxSize)) };
-        });
-        var currentlatLon$ = this._navigator.stateService.currentNode$
-            .map(function (node) { return node.latLon; })
-            .publishReplay(1)
-            .refCount();
-        var visibleBBox$ = Observable_1.Observable
-            .combineLatest(clampedConfiguration$, currentlatLon$)
-            .map(function (_a) {
-            var configuration = _a[0], latLon = _a[1];
-            return _this._graphCalculator
-                .boundingBoxCorners(latLon, configuration.visibleBBoxSize / 2);
-        })
-            .publishReplay(1)
-            .refCount();
-        var visibleMarkers$ = Observable_1.Observable
-            .combineLatest(Observable_1.Observable
-            .of(this._markerSet)
-            .concat(this._markerSet.changed$), visibleBBox$)
-            .map(function (_a) {
-            var set = _a[0], bbox = _a[1];
-            return set.search(bbox);
-        });
-        this._setChangedSubscription = geoInitiated$
-            .switchMap(function () {
-            return visibleMarkers$
-                .withLatestFrom(_this._navigator.stateService.reference$, groundAltitude$);
-        })
-            .subscribe(function (_a) {
-            var markers = _a[0], reference = _a[1], alt = _a[2];
-            var geoCoords = _this._geoCoords;
-            var markerScene = _this._markerScene;
-            var sceneMarkers = markerScene.markers;
-            var markersToRemove = Object.assign({}, sceneMarkers);
-            for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) {
-                var marker = markers_1[_i];
-                if (marker.id in sceneMarkers) {
-                    delete markersToRemove[marker.id];
-                }
-                else {
-                    var point3d = geoCoords
-                        .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
-                    markerScene.add(marker, point3d);
-                }
-            }
-            for (var id in markersToRemove) {
-                if (!markersToRemove.hasOwnProperty(id)) {
-                    continue;
-                }
-                markerScene.remove(id);
-            }
+        this._sequenceDOMRenderer.activate();
+        var edgeStatus$ = this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
+            return node.sequenceEdges$;
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        var sequence$ = this._navigator.stateService.currentNode$.pipe(operators_1.distinctUntilChanged(undefined, function (node) {
+            return node.sequenceKey;
+        }), operators_1.switchMap(function (node) {
+            return rxjs_1.concat(rxjs_1.of(null), _this._navigator.graphService.cacheSequence$(node.sequenceKey).pipe(operators_1.retry(3), operators_1.catchError(function (e) {
+                console.error("Failed to cache sequence", e);
+                return rxjs_1.of(null);
+            })));
+        }), operators_1.startWith(null), operators_1.publishReplay(1), operators_1.refCount());
+        this._sequenceSubscription = sequence$.subscribe();
+        var rendererKey$ = this._sequenceDOMRenderer.index$.pipe(operators_1.withLatestFrom(sequence$), operators_1.map(function (_a) {
+            var index = _a[0], sequence = _a[1];
+            return sequence != null ? sequence.keys[index] : null;
+        }), operators_1.filter(function (key) {
+            return !!key;
+        }), operators_1.distinctUntilChanged(), operators_1.publish(), operators_1.refCount());
+        this._moveSubscription = rxjs_1.merge(rendererKey$.pipe(operators_1.debounceTime(100, this._scheduler)), rendererKey$.pipe(operators_1.auditTime(400, this._scheduler))).pipe(operators_1.distinctUntilChanged(), operators_1.switchMap(function (key) {
+            return _this._navigator.moveToKey$(key).pipe(operators_1.catchError(function (e) {
+                return rxjs_1.empty();
+            }));
+        }))
+            .subscribe();
+        this._setSequenceGraphModeSubscription = this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.filter(function (changing) {
+            return changing;
+        }))
+            .subscribe(function () {
+            _this._navigator.graphService.setGraphMode(Graph_1.GraphMode.Sequence);
         });
-        this._markersUpdatedSubscription = geoInitiated$
-            .switchMap(function () {
-            return _this._markerSet.updated$
-                .withLatestFrom(visibleBBox$, _this._navigator.stateService.reference$, groundAltitude$);
-        })
-            .subscribe(function (_a) {
-            var markers = _a[0], _b = _a[1], sw = _b[0], ne = _b[1], reference = _a[2], alt = _a[3];
-            var geoCoords = _this._geoCoords;
-            var markerScene = _this._markerScene;
-            for (var _i = 0, markers_2 = markers; _i < markers_2.length; _i++) {
-                var marker = markers_2[_i];
-                var exists = markerScene.has(marker.id);
-                var visible = marker.latLon.lat > sw.lat &&
-                    marker.latLon.lat < ne.lat &&
-                    marker.latLon.lon > sw.lon &&
-                    marker.latLon.lon < ne.lon;
-                if (visible) {
-                    var point3d = geoCoords
-                        .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
-                    markerScene.add(marker, point3d);
-                }
-                else if (!visible && exists) {
-                    markerScene.remove(marker.id);
-                }
-            }
+        this._setSpatialGraphModeSubscription = this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.filter(function (changing) {
+            return !changing;
+        }))
+            .subscribe(function () {
+            _this._navigator.graphService.setGraphMode(Graph_1.GraphMode.Spatial);
         });
-        this._referenceSubscription = this._navigator.stateService.reference$
-            .skip(1)
-            .withLatestFrom(groundAltitude$)
-            .subscribe(function (_a) {
-            var reference = _a[0], alt = _a[1];
-            var geoCoords = _this._geoCoords;
-            var markerScene = _this._markerScene;
-            for (var _i = 0, _b = markerScene.getAll(); _i < _b.length; _i++) {
-                var marker = _b[_i];
-                var point3d = geoCoords
-                    .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
-                markerScene.update(marker.id, point3d);
-            }
+        this._navigator.graphService.graphMode$.pipe(operators_1.switchMap(function (mode) {
+            return mode === Graph_1.GraphMode.Spatial ?
+                _this._navigator.stateService.currentNode$.pipe(operators_1.take(2)) :
+                rxjs_1.empty();
+        }), operators_1.filter(function (node) {
+            return !node.spatialEdges.cached;
+        }), operators_1.switchMap(function (node) {
+            return _this._navigator.graphService.cacheNode$(node.key).pipe(operators_1.catchError(function (e) {
+                return rxjs_1.empty();
+            }));
+        }))
+            .subscribe();
+        this._stopSubscription = this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.filter(function (changing) {
+            return changing;
+        }))
+            .subscribe(function () {
+            _this._navigator.playService.stop();
         });
-        this._adjustHeightSubscription = groundAltitude$
-            .skip(1)
-            .withLatestFrom(this._navigator.stateService.reference$, currentlatLon$)
-            .subscribe(function (_a) {
-            var alt = _a[0], reference = _a[1], latLon = _a[2];
-            var geoCoords = _this._geoCoords;
-            var markerScene = _this._markerScene;
-            var position = geoCoords
-                .geodeticToEnu(latLon.lat, latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
-            for (var _i = 0, _b = markerScene.getAll(); _i < _b.length; _i++) {
-                var marker = _b[_i];
-                var point3d = geoCoords
-                    .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
-                var distanceX = point3d[0] - position[0];
-                var distanceY = point3d[1] - position[1];
-                var groundDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY);
-                if (groundDistance > 50) {
-                    continue;
+        this._cacheSequenceNodesSubscription = rxjs_1.combineLatest(this._navigator.graphService.graphMode$, this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.startWith(false), operators_1.distinctUntilChanged())).pipe(operators_1.withLatestFrom(this._navigator.stateService.currentNode$), operators_1.switchMap(function (_a) {
+            var _b = _a[0], mode = _b[0], changing = _b[1], node = _a[1];
+            return changing && mode === Graph_1.GraphMode.Sequence ?
+                _this._navigator.graphService.cacheSequenceNodes$(node.sequenceKey, node.key).pipe(operators_1.retry(3), operators_1.catchError(function (error) {
+                    console.error("Failed to cache sequence nodes.", error);
+                    return rxjs_1.empty();
+                })) :
+                rxjs_1.empty();
+        }))
+            .subscribe();
+        var position$ = sequence$.pipe(operators_1.switchMap(function (sequence) {
+            if (!sequence) {
+                return rxjs_1.of({ index: null, max: null });
+            }
+            var firstCurrentKey = true;
+            return _this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.startWith(false), operators_1.distinctUntilChanged(), operators_1.switchMap(function (changingPosition) {
+                var skipCount = !changingPosition && firstCurrentKey ? 0 : 1;
+                firstCurrentKey = false;
+                return changingPosition ?
+                    rendererKey$ :
+                    _this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) {
+                        return node.key;
+                    }), operators_1.distinctUntilChanged(), operators_1.skip(skipCount));
+            }), operators_1.map(function (key) {
+                var index = sequence.keys.indexOf(key);
+                if (index === -1) {
+                    return { index: null, max: null };
                 }
-                markerScene.lerpAltitude(marker.id, alt, Math.min(1, Math.max(0, 1.2 - 1.2 * groundDistance / 50)));
-            }
-        });
-        this._renderSubscription = this._navigator.stateService.currentState$
-            .map(function (frame) {
-            var scene = _this._markerScene;
-            return {
-                name: _this._name,
-                render: {
-                    frameId: frame.id,
-                    needsRender: scene.needsRender,
-                    render: scene.render.bind(scene),
-                    stage: Render_1.GLRenderStage.Foreground,
-                },
-            };
-        })
-            .subscribe(this._container.glRenderer.render$);
-        var hoveredMarkerId$ = Observable_1.Observable
-            .combineLatest(this._container.renderService.renderCamera$, this._container.mouseService.mouseMove$)
-            .map(function (_a) {
-            var render = _a[0], event = _a[1];
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
-            var viewport = _this._viewportCoords.canvasToViewport(canvasX, canvasY, element);
-            var markerId = _this._markerScene.intersectObjects(viewport, render.perspective);
-            return markerId;
-        })
-            .publishReplay(1)
-            .refCount();
-        var draggingStarted$ = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDragStart$)
-            .map(function (event) {
-            return true;
-        });
-        var draggingStopped$ = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDragEnd$)
-            .map(function (event) {
-            return false;
+                return { index: index, max: sequence.keys.length - 1 };
+            }));
+        }));
+        this._renderSubscription = rxjs_1.combineLatest(edgeStatus$, this._configuration$, this._containerWidth$, this._sequenceDOMRenderer.changed$.pipe(operators_1.startWith(this._sequenceDOMRenderer)), this._navigator.playService.speed$, position$).pipe(operators_1.map(function (_a) {
+            var edgeStatus = _a[0], configuration = _a[1], containerWidth = _a[2], renderer = _a[3], speed = _a[4], position = _a[5];
+            var vNode = _this._sequenceDOMRenderer
+                .render(edgeStatus, configuration, containerWidth, speed, position.index, position.max, _this, _this._navigator);
+            return { name: _this._name, vnode: vNode };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+        this._setSpeedSubscription = this._sequenceDOMRenderer.speed$
+            .subscribe(function (speed) {
+            _this._navigator.playService.setSpeed(speed);
         });
-        var dragging$ = Observable_1.Observable
-            .merge(draggingStarted$, draggingStopped$)
-            .startWith(false);
-        this._dragEventSubscription = draggingStarted$
-            .withLatestFrom(hoveredMarkerId$)
-            .merge(Observable_1.Observable
-            .combineLatest(draggingStopped$, Observable_1.Observable.of(null)))
-            .startWith([false, null])
-            .pairwise()
-            .subscribe(function (_a) {
-            var previous = _a[0], current = _a[1];
-            var dragging = current[0];
-            var eventType = dragging ? MarkerComponent.dragstart : MarkerComponent.dragend;
-            var id = dragging ? current[1] : previous[1];
-            var marker = _this._markerScene.get(id);
-            var markerEvent = { marker: marker, target: _this, type: eventType };
-            _this.fire(eventType, markerEvent);
+        this._setDirectionSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.direction;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (direction) {
+            _this._navigator.playService.setDirection(direction);
         });
-        this._mouseClaimSubscription = Observable_1.Observable
-            .combineLatest(this._container.mouseService.active$, hoveredMarkerId$, dragging$)
-            .map(function (_a) {
-            var active = _a[0], markerId = _a[1], dragging = _a[2];
-            return (!active && markerId != null) || dragging;
-        })
-            .distinctUntilChanged()
-            .subscribe(function (hovered) {
-            if (hovered) {
-                _this._container.mouseService.claimMouse(_this._name, 1);
+        this._containerWidthSubscription = rxjs_1.combineLatest(this._container.renderService.size$, this._configuration$.pipe(operators_1.distinctUntilChanged(function (value1, value2) {
+            return value1[0] === value2[0] && value1[1] === value2[1];
+        }, function (configuration) {
+            return [configuration.minWidth, configuration.maxWidth];
+        }))).pipe(operators_1.map(function (_a) {
+            var size = _a[0], configuration = _a[1];
+            return _this._sequenceDOMRenderer.getContainerWidth(size, configuration);
+        }))
+            .subscribe(this._containerWidth$);
+        this._playingSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.playing;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (playing) {
+            if (playing) {
+                _this._navigator.playService.play();
             }
             else {
-                _this._container.mouseService.unclaimMouse(_this._name);
+                _this._navigator.playService.stop();
             }
         });
-        var offset$ = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDragStart$)
-            .withLatestFrom(hoveredMarkerId$, this._container.renderService.renderCamera$)
-            .map(function (_a) {
-            var e = _a[0], id = _a[1], r = _a[2];
-            var marker = _this._markerScene.get(id);
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.projectToCanvas(marker.geometry.position.toArray(), element, r.perspective), groundCanvasX = _b[0], groundCanvasY = _b[1];
-            var _c = _this._viewportCoords.canvasPosition(e, element), canvasX = _c[0], canvasY = _c[1];
-            var offset = [canvasX - groundCanvasX, canvasY - groundCanvasY];
-            return [marker, offset, r];
-        })
-            .publishReplay(1)
-            .refCount();
-        this._updateMarkerSubscription = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDrag$)
-            .withLatestFrom(offset$, this._navigator.stateService.reference$, clampedConfiguration$)
-            .subscribe(function (_a) {
-            var event = _a[0], _b = _a[1], marker = _b[0], offset = _b[1], render = _b[2], reference = _a[2], configuration = _a[3];
-            if (!_this._markerScene.has(marker.id)) {
-                return;
-            }
-            var element = _this._container.element;
-            var _c = _this._viewportCoords.canvasPosition(event, element), canvasX = _c[0], canvasY = _c[1];
-            var groundX = canvasX - offset[0];
-            var groundY = canvasY - offset[1];
-            var _d = _this._viewportCoords
-                .canvasToViewport(groundX, groundY, element), viewportX = _d[0], viewportY = _d[1];
-            var direction = new THREE.Vector3(viewportX, viewportY, 1)
-                .unproject(render.perspective)
-                .sub(render.perspective.position)
-                .normalize();
-            var distance = Math.min(_this._relativeGroundAltitude / direction.z, configuration.visibleBBoxSize / 2 - 0.1);
-            if (distance < 0) {
-                return;
-            }
-            var intersection = direction
-                .clone()
-                .multiplyScalar(distance)
-                .add(render.perspective.position);
-            intersection.z = render.perspective.position.z + _this._relativeGroundAltitude;
-            var _e = _this._geoCoords
-                .enuToGeodetic(intersection.x, intersection.y, intersection.z, reference.lat, reference.lon, reference.alt), lat = _e[0], lon = _e[1];
-            _this._markerScene.update(marker.id, intersection.toArray(), { lat: lat, lon: lon });
-            _this._markerSet.update(marker);
-            var markerEvent = { marker: marker, target: _this, type: MarkerComponent.changed };
-            _this.fire(MarkerComponent.changed, markerEvent);
+        this._hoveredKeySubscription = this._sequenceDOMRenderer.mouseEnterDirection$.pipe(operators_1.switchMap(function (direction) {
+            var edgeTo$ = edgeStatus$.pipe(operators_1.map(function (edgeStatus) {
+                for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
+                    var edge = _a[_i];
+                    if (edge.data.direction === direction) {
+                        return edge.to;
+                    }
+                }
+                return null;
+            }), operators_1.takeUntil(_this._sequenceDOMRenderer.mouseLeaveDirection$));
+            return rxjs_1.concat(edgeTo$, rxjs_1.of(null));
+        }), operators_1.distinctUntilChanged())
+            .subscribe(this._hoveredKeySubject$);
+        this._emitHoveredKeySubscription = this._hoveredKey$
+            .subscribe(function (key) {
+            _this.fire(SequenceComponent.hoveredkeychanged, key);
         });
     };
-    MarkerComponent.prototype._deactivate = function () {
-        this._adjustHeightSubscription.unsubscribe();
-        this._dragEventSubscription.unsubscribe();
-        this._markersUpdatedSubscription.unsubscribe();
-        this._mouseClaimSubscription.unsubscribe();
-        this._referenceSubscription.unsubscribe();
+    SequenceComponent.prototype._deactivate = function () {
+        this._emitHoveredKeySubscription.unsubscribe();
         this._renderSubscription.unsubscribe();
-        this._setChangedSubscription.unsubscribe();
-        this._updateMarkerSubscription.unsubscribe();
-        this._markerScene.clear();
+        this._playingSubscription.unsubscribe();
+        this._containerWidthSubscription.unsubscribe();
+        this._hoveredKeySubscription.unsubscribe();
+        this._setSpeedSubscription.unsubscribe();
+        this._setDirectionSubscription.unsubscribe();
+        this._setSequenceGraphModeSubscription.unsubscribe();
+        this._setSpatialGraphModeSubscription.unsubscribe();
+        this._sequenceSubscription.unsubscribe();
+        this._moveSubscription.unsubscribe();
+        this._cacheSequenceNodesSubscription.unsubscribe();
+        this._stopSubscription.unsubscribe();
+        this._sequenceDOMRenderer.deactivate();
     };
-    MarkerComponent.prototype._getDefaultConfiguration = function () {
-        return { visibleBBoxSize: 100 };
+    SequenceComponent.prototype._getDefaultConfiguration = function () {
+        return {
+            direction: Edge_1.EdgeDirection.Next,
+            maxWidth: 108,
+            minWidth: 70,
+            playing: false,
+            visible: true,
+        };
     };
-    MarkerComponent.componentName = "marker";
-    /**
-     * Fired when the position of a marker is changed.
-     * @event
-     * @type {IMarkerEvent} markerEvent - Marker event data.
-     * @example
-     * ```
-     * markerComponent.on("changed", function(e) {
-     *     console.log(e.marker.id, e.marker.latLon);
-     * });
-     * ```
-     */
-    MarkerComponent.changed = "changed";
+    /** @inheritdoc */
+    SequenceComponent.componentName = "sequence";
     /**
-     * Fired when a marker drag interaction starts.
-     * @event
-     * @type {IMarkerEvent} markerEvent - Marker event data.
-     * @example
-     * ```
-     * markerComponent.on("dragstart", function(e) {
-     *     console.log(e.marker.id, e.marker.latLon);
-     * });
-     * ```
+     * Event fired when playing starts or stops.
+     *
+     * @event SequenceComponent#playingchanged
+     * @type {boolean} Indicates whether the player is playing.
      */
-    MarkerComponent.dragstart = "dragstart";
+    SequenceComponent.playingchanged = "playingchanged";
     /**
-     * Fired when a marker drag interaction ends.
-     * @event
-     * @type {IMarkerEvent} markerEvent - Marker event data.
-     * @example
-     * ```
-     * markerComponent.on("dragend", function(e) {
-     *     console.log(e.marker.id, e.marker.latLon);
-     * });
-     * ```
+     * Event fired when the hovered key changes.
+     *
+     * @description Emits the key of the node for the direction
+     * arrow that is being hovered. When the mouse leaves a
+     * direction arrow null is emitted.
+     *
+     * @event SequenceComponent#hoveredkeychanged
+     * @type {string} The hovered key, null if no key is hovered.
      */
-    MarkerComponent.dragend = "dragend";
-    return MarkerComponent;
+    SequenceComponent.hoveredkeychanged = "hoveredkeychanged";
+    return SequenceComponent;
 }(Component_1.Component));
-exports.MarkerComponent = MarkerComponent;
-Component_1.ComponentService.register(MarkerComponent);
-exports.default = MarkerComponent;
+exports.SequenceComponent = SequenceComponent;
+Component_1.ComponentService.register(SequenceComponent);
+exports.default = SequenceComponent;
 
-},{"../../Component":226,"../../Geo":229,"../../Graph":230,"../../Render":232,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"three":176,"when":223}],264:[function(require,module,exports){
+},{"../../Component":291,"../../Edge":292,"../../Graph":295,"rxjs":43,"rxjs/operators":241}],354:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var MarkerScene = (function () {
-    function MarkerScene(scene, raycaster) {
-        this._needsRender = false;
-        this._interactiveObjects = [];
-        this._markers = {};
-        this._objectMarkers = {};
-        this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster();
-        this._scene = !!scene ? scene : new THREE.Scene();
-    }
-    Object.defineProperty(MarkerScene.prototype, "markers", {
+exports.SequenceDOMRenderer = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../../Component");
+var Edge_1 = require("../../Edge");
+var Error_1 = require("../../Error");
+var SequenceDOMRenderer = /** @class */ (function () {
+    function SequenceDOMRenderer(container) {
+        this._container = container;
+        this._minThresholdWidth = 320;
+        this._maxThresholdWidth = 1480;
+        this._minThresholdHeight = 240;
+        this._maxThresholdHeight = 820;
+        this._stepperDefaultWidth = 108;
+        this._controlsDefaultWidth = 88;
+        this._defaultHeight = 30;
+        this._expandControls = false;
+        this._mode = Component_1.SequenceMode.Default;
+        this._speed = 0.5;
+        this._changingSpeed = false;
+        this._index = null;
+        this._changingPosition = false;
+        this._mouseEnterDirection$ = new rxjs_1.Subject();
+        this._mouseLeaveDirection$ = new rxjs_1.Subject();
+        this._notifyChanged$ = new rxjs_1.Subject();
+        this._notifyChangingPositionChanged$ = new rxjs_1.Subject();
+        this._notifySpeedChanged$ = new rxjs_1.Subject();
+        this._notifyIndexChanged$ = new rxjs_1.Subject();
+    }
+    Object.defineProperty(SequenceDOMRenderer.prototype, "changed$", {
         get: function () {
-            return this._markers;
+            return this._notifyChanged$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(MarkerScene.prototype, "needsRender", {
+    Object.defineProperty(SequenceDOMRenderer.prototype, "changingPositionChanged$", {
         get: function () {
-            return this._needsRender;
+            return this._notifyChangingPositionChanged$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    MarkerScene.prototype.add = function (marker, position) {
-        if (marker.id in this._markers) {
-            this._dispose(marker.id);
+    Object.defineProperty(SequenceDOMRenderer.prototype, "speed$", {
+        get: function () {
+            return this._notifySpeedChanged$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(SequenceDOMRenderer.prototype, "index$", {
+        get: function () {
+            return this._notifyIndexChanged$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(SequenceDOMRenderer.prototype, "mouseEnterDirection$", {
+        get: function () {
+            return this._mouseEnterDirection$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(SequenceDOMRenderer.prototype, "mouseLeaveDirection$", {
+        get: function () {
+            return this._mouseLeaveDirection$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    SequenceDOMRenderer.prototype.activate = function () {
+        var _this = this;
+        if (!!this._changingSubscription) {
+            return;
         }
-        marker.createGeometry(position);
-        this._scene.add(marker.geometry);
-        this._markers[marker.id] = marker;
-        for (var _i = 0, _a = marker.getInteractiveObjects(); _i < _a.length; _i++) {
-            var interactiveObject = _a[_i];
-            this._interactiveObjects.push(interactiveObject);
-            this._objectMarkers[interactiveObject.uuid] = marker.id;
+        this._changingSubscription = rxjs_1.merge(this._container.mouseService.documentMouseUp$, this._container.touchService.touchEnd$.pipe(operators_1.filter(function (touchEvent) {
+            return touchEvent.touches.length === 0;
+        })))
+            .subscribe(function (event) {
+            if (_this._changingSpeed) {
+                _this._changingSpeed = false;
+            }
+            if (_this._changingPosition) {
+                _this._setChangingPosition(false);
+            }
+        });
+    };
+    SequenceDOMRenderer.prototype.deactivate = function () {
+        if (!this._changingSubscription) {
+            return;
         }
-        this._needsRender = true;
+        this._changingSpeed = false;
+        this._changingPosition = false;
+        this._expandControls = false;
+        this._mode = Component_1.SequenceMode.Default;
+        this._changingSubscription.unsubscribe();
+        this._changingSubscription = null;
     };
-    MarkerScene.prototype.clear = function () {
-        for (var id in this._markers) {
-            if (!this._markers.hasOwnProperty) {
-                continue;
+    SequenceDOMRenderer.prototype.render = function (edgeStatus, configuration, containerWidth, speed, index, max, component, navigator) {
+        if (configuration.visible === false) {
+            return vd.h("div.SequenceContainer", {}, []);
+        }
+        var stepper = this._createStepper(edgeStatus, configuration, containerWidth, component, navigator);
+        var controls = this._createSequenceControls(containerWidth);
+        var playback = this._createPlaybackControls(containerWidth, speed, component, configuration);
+        var timeline = this._createTimelineControls(containerWidth, index, max);
+        return vd.h("div.SequenceContainer", [stepper, controls, playback, timeline]);
+    };
+    SequenceDOMRenderer.prototype.getContainerWidth = function (size, configuration) {
+        var minWidth = configuration.minWidth;
+        var maxWidth = configuration.maxWidth;
+        if (maxWidth < minWidth) {
+            maxWidth = minWidth;
+        }
+        var relativeWidth = (size.width - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth);
+        var relativeHeight = (size.height - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight);
+        var coeff = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));
+        return minWidth + coeff * (maxWidth - minWidth);
+    };
+    SequenceDOMRenderer.prototype._createPositionInput = function (index, max) {
+        var _this = this;
+        this._index = index;
+        var onPosition = function (e) {
+            _this._index = Number(e.target.value);
+            _this._notifyIndexChanged$.next(_this._index);
+        };
+        var boundingRect = this._container.domContainer.getBoundingClientRect();
+        var width = Math.max(276, Math.min(410, 5 + 0.8 * boundingRect.width)) - 65;
+        var onStart = function (e) {
+            e.stopPropagation();
+            _this._setChangingPosition(true);
+        };
+        var onMove = function (e) {
+            if (_this._changingPosition === true) {
+                e.stopPropagation();
             }
-            this._dispose(id);
+        };
+        var onKeyDown = function (e) {
+            if (e.key === "ArrowDown" || e.key === "ArrowLeft" ||
+                e.key === "ArrowRight" || e.key === "ArrowUp") {
+                e.preventDefault();
+            }
+        };
+        var positionInputProperties = {
+            max: max != null ? max : 1,
+            min: 0,
+            onchange: onPosition,
+            oninput: onPosition,
+            onkeydown: onKeyDown,
+            onmousedown: onStart,
+            onmousemove: onMove,
+            ontouchmove: onMove,
+            ontouchstart: onStart,
+            style: {
+                width: width + "px",
+            },
+            type: "range",
+            value: index != null ? index : 0,
+        };
+        var disabled = index == null || max == null || max <= 1;
+        if (disabled) {
+            positionInputProperties.disabled = "true";
         }
-        this._needsRender = true;
+        var positionInput = vd.h("input.SequencePosition", positionInputProperties, []);
+        var positionContainerClass = disabled ? ".SequencePositionContainerDisabled" : ".SequencePositionContainer";
+        return vd.h("div" + positionContainerClass, [positionInput]);
     };
-    MarkerScene.prototype.get = function (id) {
-        return this._markers[id];
+    SequenceDOMRenderer.prototype._createSpeedInput = function (speed) {
+        var _this = this;
+        this._speed = speed;
+        var onSpeed = function (e) {
+            _this._speed = Number(e.target.value) / 1000;
+            _this._notifySpeedChanged$.next(_this._speed);
+        };
+        var boundingRect = this._container.domContainer.getBoundingClientRect();
+        var width = Math.max(276, Math.min(410, 5 + 0.8 * boundingRect.width)) - 160;
+        var onStart = function (e) {
+            _this._changingSpeed = true;
+            e.stopPropagation();
+        };
+        var onMove = function (e) {
+            if (_this._changingSpeed === true) {
+                e.stopPropagation();
+            }
+        };
+        var onKeyDown = function (e) {
+            if (e.key === "ArrowDown" || e.key === "ArrowLeft" ||
+                e.key === "ArrowRight" || e.key === "ArrowUp") {
+                e.preventDefault();
+            }
+        };
+        var speedInput = vd.h("input.SequenceSpeed", {
+            max: 1000,
+            min: 0,
+            onchange: onSpeed,
+            oninput: onSpeed,
+            onkeydown: onKeyDown,
+            onmousedown: onStart,
+            onmousemove: onMove,
+            ontouchmove: onMove,
+            ontouchstart: onStart,
+            style: {
+                width: width + "px",
+            },
+            type: "range",
+            value: 1000 * speed,
+        }, []);
+        return vd.h("div.SequenceSpeedContainer", [speedInput]);
+    };
+    SequenceDOMRenderer.prototype._createPlaybackControls = function (containerWidth, speed, component, configuration) {
+        var _this = this;
+        if (this._mode !== Component_1.SequenceMode.Playback) {
+            return vd.h("div.SequencePlayback", []);
+        }
+        var switchIcon = vd.h("div.SequenceSwitchIcon.SequenceIconVisible", []);
+        var direction = configuration.direction === Edge_1.EdgeDirection.Next ?
+            Edge_1.EdgeDirection.Prev : Edge_1.EdgeDirection.Next;
+        var playing = configuration.playing;
+        var switchButtonProperties = {
+            onclick: function () {
+                if (!playing) {
+                    component.setDirection(direction);
+                }
+            },
+        };
+        var switchButtonClassName = configuration.playing ? ".SequenceSwitchButtonDisabled" : ".SequenceSwitchButton";
+        var switchButton = vd.h("div" + switchButtonClassName, switchButtonProperties, [switchIcon]);
+        var slowIcon = vd.h("div.SequenceSlowIcon.SequenceIconVisible", []);
+        var slowContainer = vd.h("div.SequenceSlowContainer", [slowIcon]);
+        var fastIcon = vd.h("div.SequenceFastIcon.SequenceIconVisible", []);
+        var fastContainer = vd.h("div.SequenceFastContainer", [fastIcon]);
+        var closeIcon = vd.h("div.SequenceCloseIcon.SequenceIconVisible", []);
+        var closeButtonProperties = {
+            onclick: function () {
+                _this._mode = Component_1.SequenceMode.Default;
+                _this._notifyChanged$.next(_this);
+            },
+        };
+        var closeButton = vd.h("div.SequenceCloseButton", closeButtonProperties, [closeIcon]);
+        var speedInput = this._createSpeedInput(speed);
+        var playbackChildren = [switchButton, slowContainer, speedInput, fastContainer, closeButton];
+        var top = Math.round(containerWidth / this._stepperDefaultWidth * this._defaultHeight + 10);
+        var playbackProperties = { style: { top: top + "px" } };
+        return vd.h("div.SequencePlayback", playbackProperties, playbackChildren);
+    };
+    SequenceDOMRenderer.prototype._createPlayingButton = function (nextKey, prevKey, configuration, component) {
+        var canPlay = configuration.direction === Edge_1.EdgeDirection.Next && nextKey != null ||
+            configuration.direction === Edge_1.EdgeDirection.Prev && prevKey != null;
+        var onclick = configuration.playing ?
+            function (e) { component.stop(); } :
+            canPlay ? function (e) { component.play(); } : null;
+        var buttonProperties = { onclick: onclick };
+        var iconClass = configuration.playing ?
+            "Stop" :
+            canPlay ? "Play" : "PlayDisabled";
+        var iconProperties = { className: iconClass };
+        if (configuration.direction === Edge_1.EdgeDirection.Prev) {
+            iconProperties.style = {
+                transform: "rotate(180deg) translate(50%, 50%)",
+            };
+        }
+        var icon = vd.h("div.SequenceComponentIcon", iconProperties, []);
+        var buttonClass = canPlay ? "SequencePlay" : "SequencePlayDisabled";
+        return vd.h("div." + buttonClass, buttonProperties, [icon]);
+    };
+    SequenceDOMRenderer.prototype._createSequenceControls = function (containerWidth) {
+        var _this = this;
+        var borderRadius = Math.round(8 / this._stepperDefaultWidth * containerWidth);
+        var expanderProperties = {
+            onclick: function () {
+                _this._expandControls = !_this._expandControls;
+                _this._mode = Component_1.SequenceMode.Default;
+                _this._notifyChanged$.next(_this);
+            },
+            style: {
+                "border-bottom-right-radius": borderRadius + "px",
+                "border-top-right-radius": borderRadius + "px",
+            },
+        };
+        var expanderBar = vd.h("div.SequenceExpanderBar", []);
+        var expander = vd.h("div.SequenceExpanderButton", expanderProperties, [expanderBar]);
+        var fastIconClassName = this._mode === Component_1.SequenceMode.Playback ?
+            ".SequenceFastIconGrey.SequenceIconVisible" : ".SequenceFastIcon";
+        var fastIcon = vd.h("div" + fastIconClassName, []);
+        var playbackProperties = {
+            onclick: function () {
+                _this._mode = _this._mode === Component_1.SequenceMode.Playback ?
+                    Component_1.SequenceMode.Default :
+                    Component_1.SequenceMode.Playback;
+                _this._notifyChanged$.next(_this);
+            },
+        };
+        var playback = vd.h("div.SequencePlaybackButton", playbackProperties, [fastIcon]);
+        var timelineIconClassName = this._mode === Component_1.SequenceMode.Timeline ?
+            ".SequenceTimelineIconGrey.SequenceIconVisible" : ".SequenceTimelineIcon";
+        var timelineIcon = vd.h("div" + timelineIconClassName, []);
+        var timelineProperties = {
+            onclick: function () {
+                _this._mode = _this._mode === Component_1.SequenceMode.Timeline ?
+                    Component_1.SequenceMode.Default :
+                    Component_1.SequenceMode.Timeline;
+                _this._notifyChanged$.next(_this);
+            },
+        };
+        var timeline = vd.h("div.SequenceTimelineButton", timelineProperties, [timelineIcon]);
+        var properties = {
+            style: {
+                height: (this._defaultHeight / this._stepperDefaultWidth * containerWidth) + "px",
+                transform: "translate(" + (containerWidth / 2 + 2) + "px, 0)",
+                width: (this._controlsDefaultWidth / this._stepperDefaultWidth * containerWidth) + "px",
+            },
+        };
+        var className = ".SequenceControls" +
+            (this._expandControls ? ".SequenceControlsExpanded" : "");
+        return vd.h("div" + className, properties, [playback, timeline, expander]);
     };
-    MarkerScene.prototype.getAll = function () {
+    SequenceDOMRenderer.prototype._createSequenceArrows = function (nextKey, prevKey, containerWidth, configuration, navigator) {
         var _this = this;
-        return Object
-            .keys(this._markers)
-            .map(function (id) { return _this._markers[id]; });
-    };
-    MarkerScene.prototype.has = function (id) {
-        return id in this._markers;
+        var nextProperties = {
+            onclick: nextKey != null ?
+                function (e) {
+                    navigator.moveDir$(Edge_1.EdgeDirection.Next)
+                        .subscribe(undefined, function (error) {
+                        if (!(error instanceof Error_1.AbortMapillaryError)) {
+                            console.error(error);
+                        }
+                    });
+                } :
+                null,
+            onmouseenter: function (e) { _this._mouseEnterDirection$.next(Edge_1.EdgeDirection.Next); },
+            onmouseleave: function (e) { _this._mouseLeaveDirection$.next(Edge_1.EdgeDirection.Next); },
+        };
+        var borderRadius = Math.round(8 / this._stepperDefaultWidth * containerWidth);
+        var prevProperties = {
+            onclick: prevKey != null ?
+                function (e) {
+                    navigator.moveDir$(Edge_1.EdgeDirection.Prev)
+                        .subscribe(undefined, function (error) {
+                        if (!(error instanceof Error_1.AbortMapillaryError)) {
+                            console.error(error);
+                        }
+                    });
+                } :
+                null,
+            onmouseenter: function (e) { _this._mouseEnterDirection$.next(Edge_1.EdgeDirection.Prev); },
+            onmouseleave: function (e) { _this._mouseLeaveDirection$.next(Edge_1.EdgeDirection.Prev); },
+            style: {
+                "border-bottom-left-radius": borderRadius + "px",
+                "border-top-left-radius": borderRadius + "px",
+            },
+        };
+        var nextClass = this._getStepClassName(Edge_1.EdgeDirection.Next, nextKey, configuration.highlightKey);
+        var prevClass = this._getStepClassName(Edge_1.EdgeDirection.Prev, prevKey, configuration.highlightKey);
+        var nextIcon = vd.h("div.SequenceComponentIcon", []);
+        var prevIcon = vd.h("div.SequenceComponentIcon", []);
+        return [
+            vd.h("div." + prevClass, prevProperties, [prevIcon]),
+            vd.h("div." + nextClass, nextProperties, [nextIcon]),
+        ];
     };
-    MarkerScene.prototype.intersectObjects = function (_a, camera) {
-        var viewportX = _a[0], viewportY = _a[1];
-        this._raycaster.setFromCamera(new THREE.Vector2(viewportX, viewportY), camera);
-        var intersects = this._raycaster.intersectObjects(this._interactiveObjects);
-        for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) {
-            var intersect = intersects_1[_i];
-            if (intersect.object.uuid in this._objectMarkers) {
-                return this._objectMarkers[intersect.object.uuid];
+    SequenceDOMRenderer.prototype._createStepper = function (edgeStatus, configuration, containerWidth, component, navigator) {
+        var nextKey = null;
+        var prevKey = null;
+        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
+            var edge = _a[_i];
+            if (edge.data.direction === Edge_1.EdgeDirection.Next) {
+                nextKey = edge.to;
+            }
+            if (edge.data.direction === Edge_1.EdgeDirection.Prev) {
+                prevKey = edge.to;
             }
         }
-        return null;
-    };
-    MarkerScene.prototype.lerpAltitude = function (id, alt, alpha) {
-        if (!(id in this._markers)) {
-            return;
-        }
-        this._markers[id].lerpAltitude(alt, alpha);
-        this._needsRender = true;
-    };
-    MarkerScene.prototype.remove = function (id) {
-        if (!(id in this._markers)) {
-            return;
-        }
-        this._dispose(id);
-        this._needsRender = true;
+        var playingButton = this._createPlayingButton(nextKey, prevKey, configuration, component);
+        var buttons = this._createSequenceArrows(nextKey, prevKey, containerWidth, configuration, navigator);
+        buttons.splice(1, 0, playingButton);
+        var containerProperties = {
+            oncontextmenu: function (event) { event.preventDefault(); },
+            style: {
+                height: (this._defaultHeight / this._stepperDefaultWidth * containerWidth) + "px",
+                width: containerWidth + "px",
+            },
+        };
+        return vd.h("div.SequenceStepper", containerProperties, buttons);
     };
-    MarkerScene.prototype.render = function (perspectiveCamera, renderer) {
-        renderer.render(this._scene, perspectiveCamera);
-        this._needsRender = false;
+    SequenceDOMRenderer.prototype._createTimelineControls = function (containerWidth, index, max) {
+        var _this = this;
+        if (this._mode !== Component_1.SequenceMode.Timeline) {
+            return vd.h("div.SequenceTimeline", []);
+        }
+        var positionInput = this._createPositionInput(index, max);
+        var closeIcon = vd.h("div.SequenceCloseIcon.SequenceIconVisible", []);
+        var closeButtonProperties = {
+            onclick: function () {
+                _this._mode = Component_1.SequenceMode.Default;
+                _this._notifyChanged$.next(_this);
+            },
+        };
+        var closeButton = vd.h("div.SequenceCloseButton", closeButtonProperties, [closeIcon]);
+        var top = Math.round(containerWidth / this._stepperDefaultWidth * this._defaultHeight + 10);
+        var playbackProperties = { style: { top: top + "px" } };
+        return vd.h("div.SequenceTimeline", playbackProperties, [positionInput, closeButton]);
     };
-    MarkerScene.prototype.update = function (id, position, latLon) {
-        if (!(id in this._markers)) {
-            return;
+    SequenceDOMRenderer.prototype._getStepClassName = function (direction, key, highlightKey) {
+        var className = direction === Edge_1.EdgeDirection.Next ?
+            "SequenceStepNext" :
+            "SequenceStepPrev";
+        if (key == null) {
+            className += "Disabled";
         }
-        var marker = this._markers[id];
-        marker.updatePosition(position, latLon);
-        this._needsRender = true;
-    };
-    MarkerScene.prototype._dispose = function (id) {
-        var marker = this._markers[id];
-        this._scene.remove(marker.geometry);
-        for (var _i = 0, _a = marker.getInteractiveObjects(); _i < _a.length; _i++) {
-            var interactiveObject = _a[_i];
-            var index = this._interactiveObjects.indexOf(interactiveObject);
-            if (index !== -1) {
-                this._interactiveObjects.splice(index, 1);
-            }
-            else {
-                console.warn("Object does not exist (" + interactiveObject.id + ") for " + id);
+        else {
+            if (highlightKey === key) {
+                className += "Highlight";
             }
-            delete this._objectMarkers[interactiveObject.uuid];
         }
-        marker.disposeGeometry();
-        delete this._markers[id];
+        return className;
     };
-    return MarkerScene;
+    SequenceDOMRenderer.prototype._setChangingPosition = function (value) {
+        this._changingPosition = value;
+        this._notifyChangingPositionChanged$.next(value);
+    };
+    return SequenceDOMRenderer;
 }());
-exports.MarkerScene = MarkerScene;
-exports.default = MarkerScene;
+exports.SequenceDOMRenderer = SequenceDOMRenderer;
+exports.default = SequenceDOMRenderer;
 
-},{"three":176}],265:[function(require,module,exports){
+},{"../../Component":291,"../../Edge":292,"../../Error":293,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],355:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
-var rbush = require("rbush");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-var MarkerSet = (function () {
-    function MarkerSet() {
-        this._hash = {};
-        this._index = rbush(16, [".lon", ".lat", ".lon", ".lat"]);
-        this._indexChanged$ = new Subject_1.Subject();
-        this._updated$ = new Subject_1.Subject();
+exports.SequenceMode = void 0;
+var SequenceMode;
+(function (SequenceMode) {
+    SequenceMode[SequenceMode["Default"] = 0] = "Default";
+    SequenceMode[SequenceMode["Playback"] = 1] = "Playback";
+    SequenceMode[SequenceMode["Timeline"] = 2] = "Timeline";
+})(SequenceMode = exports.SequenceMode || (exports.SequenceMode = {}));
+exports.default = SequenceMode;
+
+},{}],356:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Shaders = void 0;
+
+var path = require("path");
+var Shaders = /** @class */ (function () {
+    function Shaders() {
     }
-    Object.defineProperty(MarkerSet.prototype, "changed$", {
-        get: function () {
-            return this._indexChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MarkerSet.prototype, "updated$", {
-        get: function () {
-            return this._updated$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    MarkerSet.prototype.add = function (markers) {
-        var updated = [];
-        var hash = this._hash;
-        var index = this._index;
-        for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) {
-            var marker = markers_1[_i];
-            var id = marker.id;
-            if (id in hash) {
-                index.remove(hash[id]);
-                updated.push(marker);
-            }
-            var item = {
-                lat: marker.latLon.lat,
-                lon: marker.latLon.lon,
-                marker: marker,
-            };
-            hash[id] = item;
-            index.insert(item);
-        }
-        if (updated.length > 0) {
-            this._updated$.next(updated);
-        }
-        if (markers.length > updated.length) {
-            this._indexChanged$.next(this);
-        }
+    Shaders.equirectangular = {
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lon = atan(b.x, b.z);\n    float x = (lon - phiShift) / phiLength + 0.5;\n    float y = (lat - thetaShift) / thetaLength + 0.5;\n    vec4 baseColor = texture2D(projectorTex, vec2(x, y));\n    baseColor.a = opacity;\n    gl_FragColor = baseColor;\n}",
+        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
     };
-    MarkerSet.prototype.has = function (id) {
-        return id in this._hash;
+    Shaders.equirectangularCurtain = {
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float curtain;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lon = atan(b.x, b.z);\n    float x = (lon - phiShift) / phiLength + 0.5;\n    float y = (lat - thetaShift) / thetaLength + 0.5;\n\n    bool inverted = curtain < 0.5;\n\n    float curtainMin = inverted ? curtain + 0.5 : curtain - 0.5;\n    float curtainMax = curtain;\n\n    bool insideCurtain = inverted ?\n        x > curtainMin || x < curtainMax :\n        x > curtainMin && x < curtainMax;\n\n    vec4 baseColor;\n    if (insideCurtain) {\n        baseColor = texture2D(projectorTex, vec2(x, y));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}",
+        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
     };
-    MarkerSet.prototype.get = function (id) {
-        return this.has(id) ? this._hash[id].marker : undefined;
+    Shaders.perspective = {
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.z;\n    float y = vRstq.y / vRstq.z;\n    float r2 = x * x + y * y;\n\n    if (radial_peak > 0. && r2 > radial_peak * sqrt(r2)) {\n        r2 = radial_peak * radial_peak;\n    }\n\n    float d = 1.0 + k1 * r2 + k2 * r2 * r2;\n    float u = scale_x * focal * d * x + 0.5;\n    float v = - scale_y * focal * d * y + 0.5;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}",
+        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
     };
-    MarkerSet.prototype.getAll = function () {
-        return this._index
-            .all()
-            .map(function (indexItem) {
-            return indexItem.marker;
-        });
+    Shaders.perspectiveCurtain = {
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.z;\n    float y = vRstq.y / vRstq.z;\n    float r2 = x * x + y * y;\n\n    if (radial_peak > 0. && r2 > radial_peak * sqrt(r2)) {\n        r2 = radial_peak * radial_peak;\n    }\n\n    float d = 1.0 + k1 * r2 + k2 * r2 * r2;\n    float u = scale_x * focal * d * x + 0.5;\n    float v = - scale_y * focal * d * y + 0.5;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
+        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
     };
-    MarkerSet.prototype.remove = function (ids) {
-        var hash = this._hash;
-        var index = this._index;
-        var changed = false;
-        for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
-            var id = ids_1[_i];
-            if (!(id in hash)) {
-                continue;
-            }
-            var item = hash[id];
-            index.remove(item);
-            delete hash[id];
-            changed = true;
-        }
-        if (changed) {
-            this._indexChanged$.next(this);
-        }
+    Shaders.fisheye = {
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x;\n    float y = vRstq.y;\n    float z = vRstq.z;\n\n    float r = sqrt(x * x + y * y);\n    float theta = atan(r, z);\n\n    if (radial_peak > 0. && theta > radial_peak) {\n        theta = radial_peak;\n    }\n\n    float theta2 = theta * theta;\n    float theta_d = theta * (1.0 + theta2 * (k1 + theta2 * k2));\n    float s = focal * theta_d / r;\n\n    float u = scale_x * s * x + 0.5;\n    float v = -scale_y * s * y + 0.5;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
+        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
     };
-    MarkerSet.prototype.removeAll = function () {
-        this._hash = {};
-        this._index.clear();
-        this._indexChanged$.next(this);
+    Shaders.fisheyeCurtain = {
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x;\n    float y = vRstq.y;\n    float z = vRstq.z;\n\n    float r2 = sqrt(x * x + y * y);\n    float theta = atan(r2, z);\n\n    if (radial_peak > 0. && theta > radial_peak) {\n        theta = radial_peak;\n    }\n\n    float theta2 = theta * theta;\n    float theta_d = theta * (1.0 + theta2 * (k1 + theta2 * k2));\n    float s = focal * theta_d / r2;\n\n    float u = scale_x * s * x + 0.5;\n    float v = -scale_y * s * y + 0.5;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
+        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
     };
-    MarkerSet.prototype.search = function (_a) {
-        var sw = _a[0], ne = _a[1];
-        return this._index
-            .search({ maxX: ne.lon, maxY: ne.lat, minX: sw.lon, minY: sw.lat })
-            .map(function (indexItem) {
-            return indexItem.marker;
-        });
+    Shaders.perspectiveDistorted = {
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float u = vRstq.x / vRstq.w;\n    float v = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
+        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n",
     };
-    MarkerSet.prototype.update = function (marker) {
-        var hash = this._hash;
-        var index = this._index;
-        var id = marker.id;
-        if (!(id in hash)) {
-            return;
-        }
-        index.remove(hash[id]);
-        var item = {
-            lat: marker.latLon.lat,
-            lon: marker.latLon.lon,
-            marker: marker,
-        };
-        hash[id] = item;
-        index.insert(item);
+    Shaders.perspectiveDistortedCurtain = {
+        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float u = vRstq.x / vRstq.w;\n    float v = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
+        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n",
     };
-    return MarkerSet;
+    return Shaders;
 }());
-exports.MarkerSet = MarkerSet;
-exports.default = MarkerSet;
+exports.Shaders = Shaders;
+
 
-},{"rbush":25,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73}],266:[function(require,module,exports){
+},{"path":39}],357:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -24765,686 +37022,1410 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var Component_1 = require("../../../Component");
+exports.SliderComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../Component");
+var Geo_1 = require("../../Geo");
+var State_1 = require("../../State");
+var Render_1 = require("../../Render");
+var Tiles_1 = require("../../Tiles");
+var Utils_1 = require("../../Utils");
 /**
- * @class CircleMarker
+ * @class SliderComponent
  *
- * @classdesc Non-interactive marker with a flat circle shape. The circle
- * marker can not be configured to be interactive.
+ * @classdesc Component for comparing pairs of images. Renders
+ * a slider for adjusting the curtain of the first image.
  *
- * Circle marker properties can not be updated after creation.
+ * Deactivate the sequence, direction and image plane
+ * components when activating the slider component to avoid
+ * interfering UI elements.
  *
- * To create and add one `CircleMarker` with default configuration
- * and one with configuration use
+ * To retrive and use the slider component
  *
  * @example
  * ```
- * var defaultMarker = new Mapillary.MarkerComponent.CircleMarker(
- *     "id-1",
- *     { lat: 0, lon: 0, });
+ * var viewer = new Mapillary.Viewer(
+ *     "<element-id>",
+ *     "<client-id>",
+ *     "<my key>");
  *
- * var configuredMarker = new Mapillary.MarkerComponent.CircleMarker(
- *     "id-2",
- *     { lat: 0, lon: 0, },
- *     {
- *         color: "#0Ff",
- *         opacity: 0.3,
- *         radius: 0.7,
- *     });
+ * viewer.deactivateComponent("imagePlane");
+ * viewer.deactivateComponent("direction");
+ * viewer.deactivateComponent("sequence");
  *
- * markerComponent.add([defaultMarker, configuredMarker]);
+ * viewer.activateComponent("slider");
+ *
+ * var sliderComponent = viewer.getComponent("slider");
  * ```
  */
-var CircleMarker = (function (_super) {
-    __extends(CircleMarker, _super);
-    function CircleMarker(id, latLon, options) {
-        var _this = _super.call(this, id, latLon) || this;
-        options = !!options ? options : {};
-        _this._color = options.color != null ? options.color : 0xffffff;
-        _this._opacity = options.opacity != null ? options.opacity : 0.4;
-        _this._radius = options.radius != null ? options.radius : 1;
+var SliderComponent = /** @class */ (function (_super) {
+    __extends(SliderComponent, _super);
+    /** @ignore */
+    function SliderComponent(name, container, navigator, viewportCoords) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
+        _this._domRenderer = new Component_1.SliderDOMRenderer(container);
+        _this._imageTileLoader = new Tiles_1.ImageTileLoader(Utils_1.Urls.tileScheme, Utils_1.Urls.tileDomain, Utils_1.Urls.origin);
+        _this._roiCalculator = new Tiles_1.RegionOfInterestCalculator();
+        _this._spatial = new Geo_1.Spatial();
+        _this._glRendererOperation$ = new rxjs_1.Subject();
+        _this._glRendererCreator$ = new rxjs_1.Subject();
+        _this._glRendererDisposer$ = new rxjs_1.Subject();
+        _this._glRenderer$ = _this._glRendererOperation$.pipe(operators_1.scan(function (glRenderer, operation) {
+            return operation(glRenderer);
+        }, null), operators_1.filter(function (glRenderer) {
+            return glRenderer != null;
+        }), operators_1.distinctUntilChanged(undefined, function (glRenderer) {
+            return glRenderer.frameId;
+        }));
+        _this._glRendererCreator$.pipe(operators_1.map(function () {
+            return function (glRenderer) {
+                if (glRenderer != null) {
+                    throw new Error("Multiple slider states can not be created at the same time");
+                }
+                return new Component_1.SliderGLRenderer();
+            };
+        }))
+            .subscribe(_this._glRendererOperation$);
+        _this._glRendererDisposer$.pipe(operators_1.map(function () {
+            return function (glRenderer) {
+                glRenderer.dispose();
+                return null;
+            };
+        }))
+            .subscribe(_this._glRendererOperation$);
         return _this;
     }
-    CircleMarker.prototype._createGeometry = function (position) {
-        var circle = new THREE.Mesh(new THREE.CircleGeometry(this._radius, 16), new THREE.MeshBasicMaterial({
-            color: this._color,
-            opacity: this._opacity,
-            transparent: true,
+    /**
+     * Set the initial position.
+     *
+     * @description Configures the intial position of the slider.
+     * The inital position value will be used when the component
+     * is activated.
+     *
+     * @param {number} initialPosition - Initial slider position.
+     */
+    SliderComponent.prototype.setInitialPosition = function (initialPosition) {
+        this.configure({ initialPosition: initialPosition });
+    };
+    /**
+     * Set the image keys.
+     *
+     * @description Configures the component to show the image
+     * planes for the supplied image keys.
+     *
+     * @param {ISliderKeys} keys - Slider keys object specifying
+     * the images to be shown in the foreground and the background.
+     */
+    SliderComponent.prototype.setKeys = function (keys) {
+        this.configure({ keys: keys });
+    };
+    /**
+     * Set the slider mode.
+     *
+     * @description Configures the mode for transitions between
+     * image pairs.
+     *
+     * @param {SliderMode} mode - Slider mode to be set.
+     */
+    SliderComponent.prototype.setSliderMode = function (mode) {
+        this.configure({ mode: mode });
+    };
+    /**
+     * Set the value controlling if the slider is visible.
+     *
+     * @param {boolean} sliderVisible - Value indicating if
+     * the slider should be visible or not.
+     */
+    SliderComponent.prototype.setSliderVisible = function (sliderVisible) {
+        this.configure({ sliderVisible: sliderVisible });
+    };
+    SliderComponent.prototype._activate = function () {
+        var _this = this;
+        this._modeSubcription = this._domRenderer.mode$
+            .subscribe(function (mode) {
+            _this.setSliderMode(mode);
+        });
+        this._glRenderSubscription = this._glRenderer$.pipe(operators_1.map(function (glRenderer) {
+            var renderHash = {
+                name: _this._name,
+                render: {
+                    frameId: glRenderer.frameId,
+                    needsRender: glRenderer.needsRender,
+                    render: glRenderer.render.bind(glRenderer),
+                    stage: Render_1.GLRenderStage.Background,
+                },
+            };
+            return renderHash;
+        }))
+            .subscribe(this._container.glRenderer.render$);
+        var position$ = rxjs_1.concat(this.configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.initialPosition != null ?
+                configuration.initialPosition : 1;
+        }), operators_1.first()), this._domRenderer.position$);
+        var mode$ = this.configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.mode;
+        }), operators_1.distinctUntilChanged());
+        var motionless$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state.motionless;
+        }), operators_1.distinctUntilChanged());
+        var fullPano$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state.currentNode.fullPano;
+        }), operators_1.distinctUntilChanged());
+        var sliderVisible$ = rxjs_1.combineLatest(this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.sliderVisible;
+        })), this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return !(frame.state.currentNode == null ||
+                frame.state.previousNode == null ||
+                (frame.state.currentNode.pano && !frame.state.currentNode.fullPano) ||
+                (frame.state.previousNode.pano && !frame.state.previousNode.fullPano) ||
+                (frame.state.currentNode.fullPano && !frame.state.previousNode.fullPano));
+        }), operators_1.distinctUntilChanged())).pipe(operators_1.map(function (_a) {
+            var sliderVisible = _a[0], enabledState = _a[1];
+            return sliderVisible && enabledState;
+        }), operators_1.distinctUntilChanged());
+        this._waitSubscription = rxjs_1.combineLatest(mode$, motionless$, fullPano$, sliderVisible$).pipe(operators_1.withLatestFrom(this._navigator.stateService.state$))
+            .subscribe(function (_a) {
+            var _b = _a[0], mode = _b[0], motionless = _b[1], fullPano = _b[2], sliderVisible = _b[3], state = _a[1];
+            var interactive = sliderVisible &&
+                (motionless || mode === Component_1.SliderMode.Stationary || fullPano);
+            if (interactive && state !== State_1.State.WaitingInteractively) {
+                _this._navigator.stateService.waitInteractively();
+            }
+            else if (!interactive && state !== State_1.State.Waiting) {
+                _this._navigator.stateService.wait();
+            }
+        });
+        this._moveSubscription = rxjs_1.combineLatest(position$, mode$, motionless$, fullPano$, sliderVisible$)
+            .subscribe(function (_a) {
+            var position = _a[0], mode = _a[1], motionless = _a[2], fullPano = _a[3], sliderVisible = _a[4];
+            if (motionless || mode === Component_1.SliderMode.Stationary || fullPano) {
+                _this._navigator.stateService.moveTo(1);
+            }
+            else {
+                _this._navigator.stateService.moveTo(position);
+            }
+        });
+        this._domRenderSubscription = rxjs_1.combineLatest(position$, mode$, motionless$, fullPano$, sliderVisible$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
+            var position = _a[0], mode = _a[1], motionless = _a[2], fullPano = _a[3], sliderVisible = _a[4], size = _a[5];
+            return {
+                name: _this._name,
+                vnode: _this._domRenderer.render(position, mode, motionless, fullPano, sliderVisible),
+            };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+        this._glRendererCreator$.next(null);
+        this._updateCurtainSubscription = rxjs_1.combineLatest(position$, fullPano$, sliderVisible$, this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$).pipe(operators_1.map(function (_a) {
+            var position = _a[0], fullPano = _a[1], visible = _a[2], render = _a[3], transform = _a[4];
+            if (!fullPano) {
+                return visible ? position : 1;
+            }
+            var basicMin = _this._viewportCoords.viewportToBasic(-1.15, 0, transform, render.perspective);
+            var basicMax = _this._viewportCoords.viewportToBasic(1.15, 0, transform, render.perspective);
+            var shiftedMax = basicMax[0] < basicMin[0] ? basicMax[0] + 1 : basicMax[0];
+            var basicPosition = basicMin[0] + position * (shiftedMax - basicMin[0]);
+            return basicPosition > 1 ? basicPosition - 1 : basicPosition;
+        }), operators_1.map(function (position) {
+            return function (glRenderer) {
+                glRenderer.updateCurtain(position);
+                return glRenderer;
+            };
+        }))
+            .subscribe(this._glRendererOperation$);
+        this._stateSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentState$, mode$).pipe(operators_1.map(function (_a) {
+            var frame = _a[0], mode = _a[1];
+            return function (glRenderer) {
+                glRenderer.update(frame, mode);
+                return glRenderer;
+            };
+        }))
+            .subscribe(this._glRendererOperation$);
+        this._setKeysSubscription = this._configuration$.pipe(operators_1.filter(function (configuration) {
+            return configuration.keys != null;
+        }), operators_1.switchMap(function (configuration) {
+            return rxjs_1.zip(rxjs_1.zip(_this._catchCacheNode$(configuration.keys.background), _this._catchCacheNode$(configuration.keys.foreground)).pipe(operators_1.map(function (nodes) {
+                return { background: nodes[0], foreground: nodes[1] };
+            })), _this._navigator.stateService.currentState$.pipe(operators_1.first())).pipe(operators_1.map(function (nf) {
+                return { nodes: nf[0], state: nf[1].state };
+            }));
+        }))
+            .subscribe(function (co) {
+            if (co.state.currentNode != null &&
+                co.state.previousNode != null &&
+                co.state.currentNode.key === co.nodes.foreground.key &&
+                co.state.previousNode.key === co.nodes.background.key) {
+                return;
+            }
+            if (co.state.currentNode.key === co.nodes.background.key) {
+                _this._navigator.stateService.setNodes([co.nodes.foreground]);
+                return;
+            }
+            if (co.state.currentNode.key === co.nodes.foreground.key &&
+                co.state.trajectory.length === 1) {
+                _this._navigator.stateService.prependNodes([co.nodes.background]);
+                return;
+            }
+            _this._navigator.stateService.setNodes([co.nodes.background]);
+            _this._navigator.stateService.setNodes([co.nodes.foreground]);
+        }, function (e) {
+            console.error(e);
+        });
+        var previousNode$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state.previousNode;
+        }), operators_1.filter(function (node) {
+            return node != null;
+        }), operators_1.distinctUntilChanged(undefined, function (node) {
+            return node.key;
+        }));
+        var textureProvider$ = this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
+            return frame.state.currentNode.key;
+        }), operators_1.withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$), operators_1.map(function (_a) {
+            var frame = _a[0], renderer = _a[1], size = _a[2];
+            var state = frame.state;
+            var viewportSize = Math.max(size.width, size.height);
+            var currentNode = state.currentNode;
+            var currentTransform = state.currentTransform;
+            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
+            return new Tiles_1.TextureProvider(currentNode.key, currentTransform.basicWidth, currentTransform.basicHeight, tileSize, currentNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer);
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._textureProviderSubscription = textureProvider$.subscribe(function () { });
+        this._setTextureProviderSubscription = textureProvider$.pipe(operators_1.map(function (provider) {
+            return function (renderer) {
+                renderer.setTextureProvider(provider.key, provider);
+                return renderer;
+            };
+        }))
+            .subscribe(this._glRendererOperation$);
+        this._setTileSizeSubscription = this._container.renderService.size$.pipe(operators_1.switchMap(function (size) {
+            return rxjs_1.combineLatest(textureProvider$, rxjs_1.of(size)).pipe(operators_1.first());
+        }))
+            .subscribe(function (_a) {
+            var provider = _a[0], size = _a[1];
+            var viewportSize = Math.max(size.width, size.height);
+            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
+            provider.setTileSize(tileSize);
+        });
+        this._abortTextureProviderSubscription = textureProvider$.pipe(operators_1.pairwise())
+            .subscribe(function (pair) {
+            var previous = pair[0];
+            previous.abort();
+        });
+        var roiTrigger$ = rxjs_1.combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.pipe(operators_1.debounceTime(250))).pipe(operators_1.map(function (_a) {
+            var camera = _a[0], size = _a[1];
+            return [
+                camera.camera.position.clone(),
+                camera.camera.lookat.clone(),
+                camera.zoom.valueOf(),
+                size.height.valueOf(),
+                size.width.valueOf()
+            ];
+        }), operators_1.pairwise(), operators_1.skipWhile(function (pls) {
+            return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0;
+        }), operators_1.map(function (pls) {
+            var samePosition = pls[0][0].equals(pls[1][0]);
+            var sameLookat = pls[0][1].equals(pls[1][1]);
+            var sameZoom = pls[0][2] === pls[1][2];
+            var sameHeight = pls[0][3] === pls[1][3];
+            var sameWidth = pls[0][4] === pls[1][4];
+            return samePosition && sameLookat && sameZoom && sameHeight && sameWidth;
+        }), operators_1.distinctUntilChanged(), operators_1.filter(function (stalled) {
+            return stalled;
+        }), operators_1.switchMap(function (stalled) {
+            return _this._container.renderService.renderCameraFrame$.pipe(operators_1.first());
+        }), operators_1.withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$));
+        this._setRegionOfInterestSubscription = textureProvider$.pipe(operators_1.switchMap(function (provider) {
+            return roiTrigger$.pipe(operators_1.map(function (_a) {
+                var camera = _a[0], size = _a[1], transform = _a[2];
+                return [
+                    _this._roiCalculator.computeRegionOfInterest(camera, size, transform),
+                    provider,
+                ];
+            }));
+        }), operators_1.filter(function (args) {
+            return !args[1].disposed;
+        }))
+            .subscribe(function (args) {
+            var roi = args[0];
+            var provider = args[1];
+            provider.setRegionOfInterest(roi);
+        });
+        var hasTexture$ = textureProvider$.pipe(operators_1.switchMap(function (provider) {
+            return provider.hasTexture$;
+        }), operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount());
+        this._hasTextureSubscription = hasTexture$.subscribe(function () { });
+        var nodeImage$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
+            return frame.state.nodesAhead === 0;
+        }), operators_1.map(function (frame) {
+            return frame.state.currentNode;
+        }), operators_1.distinctUntilChanged(undefined, function (node) {
+            return node.key;
+        }), operators_1.debounceTime(1000), operators_1.withLatestFrom(hasTexture$), operators_1.filter(function (args) {
+            return !args[1];
+        }), operators_1.map(function (args) {
+            return args[0];
+        }), operators_1.filter(function (node) {
+            return node.pano ?
+                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
+                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
+        }), operators_1.switchMap(function (node) {
+            var baseImageSize = node.pano ?
+                Utils_1.Settings.basePanoramaSize :
+                Utils_1.Settings.baseImageSize;
+            if (Math.max(node.image.width, node.image.height) > baseImageSize) {
+                return rxjs_1.empty();
+            }
+            var image$ = node
+                .cacheImage$(Utils_1.Settings.maxImageSize).pipe(operators_1.map(function (n) {
+                return [n.image, n];
+            }));
+            return image$.pipe(operators_1.takeUntil(hasTexture$.pipe(operators_1.filter(function (hasTexture) {
+                return hasTexture;
+            }))), operators_1.catchError(function (error, caught) {
+                console.error("Failed to fetch high res image (" + node.key + ")", error);
+                return rxjs_1.empty();
+            }));
+        })).pipe(operators_1.publish(), operators_1.refCount());
+        this._updateBackgroundSubscription = nodeImage$.pipe(operators_1.withLatestFrom(textureProvider$))
+            .subscribe(function (args) {
+            if (args[0][1].key !== args[1].key ||
+                args[1].disposed) {
+                return;
+            }
+            args[1].updateBackground(args[0][0]);
+        });
+        this._updateTextureImageSubscription = nodeImage$.pipe(operators_1.map(function (imn) {
+            return function (renderer) {
+                renderer.updateTextureImage(imn[0], imn[1]);
+                return renderer;
+            };
+        }))
+            .subscribe(this._glRendererOperation$);
+        var textureProviderPrev$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
+            return !!frame.state.previousNode;
+        }), operators_1.distinctUntilChanged(undefined, function (frame) {
+            return frame.state.previousNode.key;
+        }), operators_1.withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$), operators_1.map(function (_a) {
+            var frame = _a[0], renderer = _a[1], size = _a[2];
+            var state = frame.state;
+            var viewportSize = Math.max(size.width, size.height);
+            var previousNode = state.previousNode;
+            var previousTransform = state.previousTransform;
+            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
+            return new Tiles_1.TextureProvider(previousNode.key, previousTransform.basicWidth, previousTransform.basicHeight, tileSize, previousNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer);
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._textureProviderSubscriptionPrev = textureProviderPrev$.subscribe(function () { });
+        this._setTextureProviderSubscriptionPrev = textureProviderPrev$.pipe(operators_1.map(function (provider) {
+            return function (renderer) {
+                renderer.setTextureProviderPrev(provider.key, provider);
+                return renderer;
+            };
+        }))
+            .subscribe(this._glRendererOperation$);
+        this._setTileSizeSubscriptionPrev = this._container.renderService.size$.pipe(operators_1.switchMap(function (size) {
+            return rxjs_1.combineLatest(textureProviderPrev$, rxjs_1.of(size)).pipe(operators_1.first());
+        }))
+            .subscribe(function (_a) {
+            var provider = _a[0], size = _a[1];
+            var viewportSize = Math.max(size.width, size.height);
+            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
+            provider.setTileSize(tileSize);
+        });
+        this._abortTextureProviderSubscriptionPrev = textureProviderPrev$.pipe(operators_1.pairwise())
+            .subscribe(function (pair) {
+            var previous = pair[0];
+            previous.abort();
+        });
+        var roiTriggerPrev$ = rxjs_1.combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.pipe(operators_1.debounceTime(250))).pipe(operators_1.map(function (_a) {
+            var camera = _a[0], size = _a[1];
+            return [
+                camera.camera.position.clone(),
+                camera.camera.lookat.clone(),
+                camera.zoom.valueOf(),
+                size.height.valueOf(),
+                size.width.valueOf()
+            ];
+        }), operators_1.pairwise(), operators_1.skipWhile(function (pls) {
+            return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0;
+        }), operators_1.map(function (pls) {
+            var samePosition = pls[0][0].equals(pls[1][0]);
+            var sameLookat = pls[0][1].equals(pls[1][1]);
+            var sameZoom = pls[0][2] === pls[1][2];
+            var sameHeight = pls[0][3] === pls[1][3];
+            var sameWidth = pls[0][4] === pls[1][4];
+            return samePosition && sameLookat && sameZoom && sameHeight && sameWidth;
+        }), operators_1.distinctUntilChanged(), operators_1.filter(function (stalled) {
+            return stalled;
+        }), operators_1.switchMap(function (stalled) {
+            return _this._container.renderService.renderCameraFrame$.pipe(operators_1.first());
+        }), operators_1.withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$));
+        this._setRegionOfInterestSubscriptionPrev = textureProviderPrev$.pipe(operators_1.switchMap(function (provider) {
+            return roiTriggerPrev$.pipe(operators_1.map(function (_a) {
+                var camera = _a[0], size = _a[1], transform = _a[2];
+                return [
+                    _this._roiCalculator.computeRegionOfInterest(camera, size, transform),
+                    provider,
+                ];
+            }));
+        }), operators_1.filter(function (args) {
+            return !args[1].disposed;
+        }), operators_1.withLatestFrom(this._navigator.stateService.currentState$))
+            .subscribe(function (_a) {
+            var _b = _a[0], roi = _b[0], provider = _b[1], frame = _a[1];
+            var shiftedRoi = null;
+            if (frame.state.previousNode.fullPano) {
+                if (frame.state.currentNode.fullPano) {
+                    var currentViewingDirection = _this._spatial.viewingDirection(frame.state.currentNode.rotation);
+                    var previousViewingDirection = _this._spatial.viewingDirection(frame.state.previousNode.rotation);
+                    var directionDiff = _this._spatial.angleBetweenVector2(currentViewingDirection.x, currentViewingDirection.y, previousViewingDirection.x, previousViewingDirection.y);
+                    var shift = directionDiff / (2 * Math.PI);
+                    var bbox = {
+                        maxX: _this._spatial.wrap(roi.bbox.maxX + shift, 0, 1),
+                        maxY: roi.bbox.maxY,
+                        minX: _this._spatial.wrap(roi.bbox.minX + shift, 0, 1),
+                        minY: roi.bbox.minY,
+                    };
+                    shiftedRoi = {
+                        bbox: bbox,
+                        pixelHeight: roi.pixelHeight,
+                        pixelWidth: roi.pixelWidth,
+                    };
+                }
+                else {
+                    var currentViewingDirection = _this._spatial.viewingDirection(frame.state.currentNode.rotation);
+                    var previousViewingDirection = _this._spatial.viewingDirection(frame.state.previousNode.rotation);
+                    var directionDiff = _this._spatial.angleBetweenVector2(currentViewingDirection.x, currentViewingDirection.y, previousViewingDirection.x, previousViewingDirection.y);
+                    var shiftX = directionDiff / (2 * Math.PI);
+                    var a1 = _this._spatial.angleToPlane(currentViewingDirection.toArray(), [0, 0, 1]);
+                    var a2 = _this._spatial.angleToPlane(previousViewingDirection.toArray(), [0, 0, 1]);
+                    var shiftY = (a2 - a1) / (2 * Math.PI);
+                    var currentTransform = frame.state.currentTransform;
+                    var size = Math.max(currentTransform.basicWidth, currentTransform.basicHeight);
+                    var hFov = size > 0 ?
+                        2 * Math.atan(0.5 * currentTransform.basicWidth / (size * currentTransform.focal)) :
+                        Math.PI / 3;
+                    var vFov = size > 0 ?
+                        2 * Math.atan(0.5 * currentTransform.basicHeight / (size * currentTransform.focal)) :
+                        Math.PI / 3;
+                    var spanningWidth = hFov / (2 * Math.PI);
+                    var spanningHeight = vFov / Math.PI;
+                    var basicWidth = (roi.bbox.maxX - roi.bbox.minX) * spanningWidth;
+                    var basicHeight = (roi.bbox.maxY - roi.bbox.minY) * spanningHeight;
+                    var pixelWidth = roi.pixelWidth * spanningWidth;
+                    var pixelHeight = roi.pixelHeight * spanningHeight;
+                    var zoomShiftX = (roi.bbox.minX + roi.bbox.maxX) / 2 - 0.5;
+                    var zoomShiftY = (roi.bbox.minY + roi.bbox.maxY) / 2 - 0.5;
+                    var minX = 0.5 + shiftX + spanningWidth * zoomShiftX - basicWidth / 2;
+                    var maxX = 0.5 + shiftX + spanningWidth * zoomShiftX + basicWidth / 2;
+                    var minY = 0.5 + shiftY + spanningHeight * zoomShiftY - basicHeight / 2;
+                    var maxY = 0.5 + shiftY + spanningHeight * zoomShiftY + basicHeight / 2;
+                    var bbox = {
+                        maxX: _this._spatial.wrap(maxX, 0, 1),
+                        maxY: maxY,
+                        minX: _this._spatial.wrap(minX, 0, 1),
+                        minY: minY,
+                    };
+                    shiftedRoi = {
+                        bbox: bbox,
+                        pixelHeight: pixelHeight,
+                        pixelWidth: pixelWidth,
+                    };
+                }
+            }
+            else {
+                var currentBasicAspect = frame.state.currentTransform.basicAspect;
+                var previousBasicAspect = frame.state.previousTransform.basicAspect;
+                var _c = _this._getBasicCorners(currentBasicAspect, previousBasicAspect), _d = _c[0], cornerMinX = _d[0], cornerMinY = _d[1], _e = _c[1], cornerMaxX = _e[0], cornerMaxY = _e[1];
+                var basicWidth = cornerMaxX - cornerMinX;
+                var basicHeight = cornerMaxY - cornerMinY;
+                var pixelWidth = roi.pixelWidth / basicWidth;
+                var pixelHeight = roi.pixelHeight / basicHeight;
+                var minX = (basicWidth - 1) / (2 * basicWidth) + roi.bbox.minX / basicWidth;
+                var maxX = (basicWidth - 1) / (2 * basicWidth) + roi.bbox.maxX / basicWidth;
+                var minY = (basicHeight - 1) / (2 * basicHeight) + roi.bbox.minY / basicHeight;
+                var maxY = (basicHeight - 1) / (2 * basicHeight) + roi.bbox.maxY / basicHeight;
+                var bbox = {
+                    maxX: maxX,
+                    maxY: maxY,
+                    minX: minX,
+                    minY: minY,
+                };
+                _this._clipBoundingBox(bbox);
+                shiftedRoi = {
+                    bbox: bbox,
+                    pixelHeight: pixelHeight,
+                    pixelWidth: pixelWidth,
+                };
+            }
+            provider.setRegionOfInterest(shiftedRoi);
+        });
+        var hasTexturePrev$ = textureProviderPrev$.pipe(operators_1.switchMap(function (provider) {
+            return provider.hasTexture$;
+        }), operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount());
+        this._hasTextureSubscriptionPrev = hasTexturePrev$.subscribe(function () { });
+        var nodeImagePrev$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
+            return frame.state.nodesAhead === 0 && !!frame.state.previousNode;
+        }), operators_1.map(function (frame) {
+            return frame.state.previousNode;
+        }), operators_1.distinctUntilChanged(undefined, function (node) {
+            return node.key;
+        }), operators_1.debounceTime(1000), operators_1.withLatestFrom(hasTexturePrev$), operators_1.filter(function (args) {
+            return !args[1];
+        }), operators_1.map(function (args) {
+            return args[0];
+        }), operators_1.filter(function (node) {
+            return node.pano ?
+                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
+                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
+        }), operators_1.switchMap(function (node) {
+            var baseImageSize = node.pano ?
+                Utils_1.Settings.basePanoramaSize :
+                Utils_1.Settings.baseImageSize;
+            if (Math.max(node.image.width, node.image.height) > baseImageSize) {
+                return rxjs_1.empty();
+            }
+            var image$ = node
+                .cacheImage$(Utils_1.Settings.maxImageSize).pipe(operators_1.map(function (n) {
+                return [n.image, n];
+            }));
+            return image$.pipe(operators_1.takeUntil(hasTexturePrev$.pipe(operators_1.filter(function (hasTexture) {
+                return hasTexture;
+            }))), operators_1.catchError(function (error, caught) {
+                console.error("Failed to fetch high res image (" + node.key + ")", error);
+                return rxjs_1.empty();
+            }));
+        })).pipe(operators_1.publish(), operators_1.refCount());
+        this._updateBackgroundSubscriptionPrev = nodeImagePrev$.pipe(operators_1.withLatestFrom(textureProviderPrev$))
+            .subscribe(function (args) {
+            if (args[0][1].key !== args[1].key ||
+                args[1].disposed) {
+                return;
+            }
+            args[1].updateBackground(args[0][0]);
+        });
+        this._updateTextureImageSubscriptionPrev = nodeImagePrev$.pipe(operators_1.map(function (imn) {
+            return function (renderer) {
+                renderer.updateTextureImage(imn[0], imn[1]);
+                return renderer;
+            };
+        }))
+            .subscribe(this._glRendererOperation$);
+    };
+    SliderComponent.prototype._deactivate = function () {
+        var _this = this;
+        this._waitSubscription.unsubscribe();
+        this._navigator.stateService.state$.pipe(operators_1.first())
+            .subscribe(function (state) {
+            if (state !== State_1.State.Traversing) {
+                _this._navigator.stateService.traverse();
+            }
+        });
+        this._glRendererDisposer$.next(null);
+        this._domRenderer.deactivate();
+        this._modeSubcription.unsubscribe();
+        this._setKeysSubscription.unsubscribe();
+        this._stateSubscription.unsubscribe();
+        this._glRenderSubscription.unsubscribe();
+        this._domRenderSubscription.unsubscribe();
+        this._moveSubscription.unsubscribe();
+        this._updateCurtainSubscription.unsubscribe();
+        this._textureProviderSubscription.unsubscribe();
+        this._setTextureProviderSubscription.unsubscribe();
+        this._setTileSizeSubscription.unsubscribe();
+        this._abortTextureProviderSubscription.unsubscribe();
+        this._setRegionOfInterestSubscription.unsubscribe();
+        this._hasTextureSubscription.unsubscribe();
+        this._updateBackgroundSubscription.unsubscribe();
+        this._updateTextureImageSubscription.unsubscribe();
+        this._textureProviderSubscriptionPrev.unsubscribe();
+        this._setTextureProviderSubscriptionPrev.unsubscribe();
+        this._setTileSizeSubscriptionPrev.unsubscribe();
+        this._abortTextureProviderSubscriptionPrev.unsubscribe();
+        this._setRegionOfInterestSubscriptionPrev.unsubscribe();
+        this._hasTextureSubscriptionPrev.unsubscribe();
+        this._updateBackgroundSubscriptionPrev.unsubscribe();
+        this._updateTextureImageSubscriptionPrev.unsubscribe();
+        this.configure({ keys: null });
+    };
+    SliderComponent.prototype._getDefaultConfiguration = function () {
+        return {
+            initialPosition: 1,
+            mode: Component_1.SliderMode.Motion,
+            sliderVisible: true,
+        };
+    };
+    SliderComponent.prototype._catchCacheNode$ = function (key) {
+        return this._navigator.graphService.cacheNode$(key).pipe(operators_1.catchError(function (error, caught) {
+            console.error("Failed to cache slider node (" + key + ")", error);
+            return rxjs_1.empty();
         }));
-        circle.up.fromArray([0, 0, 1]);
-        circle.renderOrder = -1;
-        var group = new THREE.Object3D();
-        group.add(circle);
-        group.position.fromArray(position);
-        this._geometry = group;
     };
-    CircleMarker.prototype._disposeGeometry = function () {
-        for (var _i = 0, _a = this._geometry.children; _i < _a.length; _i++) {
-            var mesh = _a[_i];
-            mesh.geometry.dispose();
-            mesh.material.dispose();
+    SliderComponent.prototype._getBasicCorners = function (currentAspect, previousAspect) {
+        var offsetX;
+        var offsetY;
+        if (currentAspect > previousAspect) {
+            offsetX = 0.5;
+            offsetY = 0.5 * currentAspect / previousAspect;
         }
+        else {
+            offsetX = 0.5 * previousAspect / currentAspect;
+            offsetY = 0.5;
+        }
+        return [[0.5 - offsetX, 0.5 - offsetY], [0.5 + offsetX, 0.5 + offsetY]];
     };
-    CircleMarker.prototype._getInteractiveObjects = function () {
-        return [];
+    SliderComponent.prototype._clipBoundingBox = function (bbox) {
+        bbox.minX = Math.max(0, Math.min(1, bbox.minX));
+        bbox.maxX = Math.max(0, Math.min(1, bbox.maxX));
+        bbox.minY = Math.max(0, Math.min(1, bbox.minY));
+        bbox.maxY = Math.max(0, Math.min(1, bbox.maxY));
     };
-    return CircleMarker;
-}(Component_1.Marker));
-exports.CircleMarker = CircleMarker;
-exports.default = CircleMarker;
+    SliderComponent.componentName = "slider";
+    return SliderComponent;
+}(Component_1.Component));
+exports.SliderComponent = SliderComponent;
+Component_1.ComponentService.register(SliderComponent);
+exports.default = SliderComponent;
 
-},{"../../../Component":226,"three":176}],267:[function(require,module,exports){
+
+},{"../../Component":291,"../../Geo":294,"../../Render":297,"../../State":298,"../../Tiles":300,"../../Utils":301,"rxjs":43,"rxjs/operators":241}],358:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * @class Marker
- *
- * @classdesc Represents an abstract marker class that should be extended
- * by marker implementations used in the marker component.
- */
-var Marker = (function () {
-    function Marker(id, latLon) {
-        this._id = id;
-        this._latLon = latLon;
+exports.SliderDOMRenderer = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../../Component");
+var SliderDOMRenderer = /** @class */ (function () {
+    function SliderDOMRenderer(container) {
+        this._container = container;
+        this._interacting = false;
+        this._notifyModeChanged$ = new rxjs_1.Subject();
+        this._notifyPositionChanged$ = new rxjs_1.Subject();
+        this._stopInteractionSubscription = null;
     }
-    Object.defineProperty(Marker.prototype, "id", {
-        /**
-         * Get id.
-         * @returns {string} The id of the marker.
-         */
+    Object.defineProperty(SliderDOMRenderer.prototype, "mode$", {
         get: function () {
-            return this._id;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Marker.prototype, "geometry", {
-        get: function () {
-            return this._geometry;
+            return this._notifyModeChanged$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(Marker.prototype, "latLon", {
-        /**
-         * Get lat lon.
-         * @returns {ILatLon} The geographic coordinates of the marker.
-         */
+    Object.defineProperty(SliderDOMRenderer.prototype, "position$", {
         get: function () {
-            return this._latLon;
+            return this._notifyPositionChanged$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Marker.prototype.createGeometry = function (position) {
-        if (!!this._geometry) {
+    SliderDOMRenderer.prototype.activate = function () {
+        var _this = this;
+        if (!!this._stopInteractionSubscription) {
             return;
         }
-        this._createGeometry(position);
-        // update matrix world if raycasting occurs before first render
-        this._geometry.updateMatrixWorld(true);
+        this._stopInteractionSubscription = rxjs_1.merge(this._container.mouseService.documentMouseUp$, this._container.touchService.touchEnd$.pipe(operators_1.filter(function (touchEvent) {
+            return touchEvent.touches.length === 0;
+        })))
+            .subscribe(function (event) {
+            if (_this._interacting) {
+                _this._interacting = false;
+            }
+        });
     };
-    Marker.prototype.disposeGeometry = function () {
-        if (!this._geometry) {
+    SliderDOMRenderer.prototype.deactivate = function () {
+        if (!this._stopInteractionSubscription) {
             return;
         }
-        this._disposeGeometry();
-        this._geometry = undefined;
+        this._interacting = false;
+        this._stopInteractionSubscription.unsubscribe();
+        this._stopInteractionSubscription = null;
     };
-    Marker.prototype.getInteractiveObjects = function () {
-        if (!this._geometry) {
-            return [];
+    SliderDOMRenderer.prototype.render = function (position, mode, motionless, pano, visible) {
+        var children = [];
+        if (visible) {
+            children.push(vd.h("div.SliderBorder", []));
+            var modeVisible = !(motionless || pano);
+            if (modeVisible) {
+                children.push(this._createModeButton(mode));
+                children.push(this._createModeButton2d(mode));
+            }
+            children.push(this._createPositionInput(position, modeVisible));
         }
-        return this._getInteractiveObjects();
+        var boundingRect = this._container.domContainer.getBoundingClientRect();
+        var width = Math.max(215, Math.min(400, boundingRect.width - 100));
+        return vd.h("div.SliderContainer", { style: { width: width + "px" } }, children);
     };
-    Marker.prototype.lerpAltitude = function (alt, alpha) {
-        if (!this._geometry) {
-            return;
-        }
-        this._geometry.position.z = (1 - alpha) * this._geometry.position.z + alpha * alt;
+    SliderDOMRenderer.prototype._createModeButton = function (mode) {
+        var _this = this;
+        var properties = {
+            onclick: function () {
+                if (mode === Component_1.SliderMode.Motion) {
+                    return;
+                }
+                _this._notifyModeChanged$.next(Component_1.SliderMode.Motion);
+            },
+        };
+        var className = mode === Component_1.SliderMode.Stationary ?
+            "SliderModeButtonDisabled" :
+            "SliderModeButton";
+        return vd.h("div." + className, properties, [vd.h("div.SliderModeIcon", [])]);
     };
-    Marker.prototype.updatePosition = function (position, latLon) {
-        if (!!latLon) {
-            this._latLon.lat = latLon.lat;
-            this._latLon.lon = latLon.lon;
-        }
-        if (!this._geometry) {
-            return;
-        }
-        this._geometry.position.fromArray(position);
-        this._geometry.updateMatrixWorld(true);
+    SliderDOMRenderer.prototype._createModeButton2d = function (mode) {
+        var _this = this;
+        var properties = {
+            onclick: function () {
+                if (mode === Component_1.SliderMode.Stationary) {
+                    return;
+                }
+                _this._notifyModeChanged$.next(Component_1.SliderMode.Stationary);
+            },
+        };
+        var className = mode === Component_1.SliderMode.Motion ?
+            "SliderModeButton2dDisabled" :
+            "SliderModeButton2d";
+        return vd.h("div." + className, properties, [vd.h("div.SliderModeIcon2d", [])]);
     };
-    return Marker;
+    SliderDOMRenderer.prototype._createPositionInput = function (position, modeVisible) {
+        var _this = this;
+        var onChange = function (e) {
+            _this._notifyPositionChanged$.next(Number(e.target.value) / 1000);
+        };
+        var onStart = function (e) {
+            _this._interacting = true;
+            e.stopPropagation();
+        };
+        var onMove = function (e) {
+            if (_this._interacting) {
+                e.stopPropagation();
+            }
+        };
+        var onKeyDown = function (e) {
+            if (e.key === "ArrowDown" || e.key === "ArrowLeft" ||
+                e.key === "ArrowRight" || e.key === "ArrowUp") {
+                e.preventDefault();
+            }
+        };
+        var boundingRect = this._container.domContainer.getBoundingClientRect();
+        var width = Math.max(215, Math.min(400, boundingRect.width - 105)) - 84 + (modeVisible ? 0 : 52);
+        var positionInput = vd.h("input.SliderPosition", {
+            max: 1000,
+            min: 0,
+            onchange: onChange,
+            oninput: onChange,
+            onkeydown: onKeyDown,
+            onmousedown: onStart,
+            onmousemove: onMove,
+            ontouchmove: onMove,
+            ontouchstart: onStart,
+            style: {
+                width: width + "px",
+            },
+            type: "range",
+            value: 1000 * position,
+        }, []);
+        return vd.h("div.SliderPositionContainer", [positionInput]);
+    };
+    return SliderDOMRenderer;
 }());
-exports.Marker = Marker;
-exports.default = Marker;
+exports.SliderDOMRenderer = SliderDOMRenderer;
+exports.default = SliderDOMRenderer;
 
-},{}],268:[function(require,module,exports){
+},{"../../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],359:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../../typings/index.d.ts" />
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
 Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var Component_1 = require("../../../Component");
-/**
- * @class SimpleMarker
- *
- * @classdesc Interactive marker with ice cream shape. The sphere
- * inside the ice cream can be configured to be interactive.
- *
- * Simple marker properties can not be updated after creation.
- *
- * To create and add one `SimpleMarker` with default configuration
- * (non-interactive) and one interactive with configuration use
- *
- * @example
- * ```
- * var defaultMarker = new Mapillary.MarkerComponent.SimpleMarker(
- *     "id-1",
- *     { lat: 0, lon: 0, });
- *
- * var interactiveMarker = new Mapillary.MarkerComponent.SimpleMarker(
- *     "id-2",
- *     { lat: 0, lon: 0, },
- *     {
- *         ballColor: "#00f",
- *         ballOpacity: 0.5,
- *         color: "#00f",
- *         interactive: true,
- *         opacity: 0.3,
- *         radius: 0.7,
- *     });
- *
- * markerComponent.add([defaultMarker, interactiveMarker]);
- * ```
- */
-var SimpleMarker = (function (_super) {
-    __extends(SimpleMarker, _super);
-    function SimpleMarker(id, latLon, options) {
-        var _this = _super.call(this, id, latLon) || this;
-        options = !!options ? options : {};
-        _this._ballColor = options.ballColor != null ? options.ballColor : 0xff0000;
-        _this._ballOpacity = options.ballOpacity != null ? options.ballOpacity : 0.8;
-        _this._circleToRayAngle = 2;
-        _this._color = options.color != null ? options.color : 0xff0000;
-        _this._interactive = !!options.interactive;
-        _this._opacity = options.opacity != null ? options.opacity : 0.4;
-        _this._radius = options.radius != null ? options.radius : 1;
-        return _this;
+exports.SliderGLRenderer = void 0;
+var Component_1 = require("../../Component");
+var Geo_1 = require("../../Geo");
+var SliderGLRenderer = /** @class */ (function () {
+    function SliderGLRenderer() {
+        this._factory = new Component_1.MeshFactory();
+        this._scene = new Component_1.MeshScene();
+        this._spatial = new Geo_1.Spatial();
+        this._currentKey = null;
+        this._previousKey = null;
+        this._disabled = false;
+        this._curtain = 1;
+        this._frameId = 0;
+        this._needsRender = false;
+        this._mode = null;
+        this._currentProviderDisposers = {};
+        this._previousProviderDisposers = {};
     }
-    SimpleMarker.prototype._createGeometry = function (position) {
-        var radius = this._radius;
-        var cone = new THREE.Mesh(this._markerGeometry(radius, 8, 8), new THREE.MeshBasicMaterial({
-            color: this._color,
-            opacity: this._opacity,
-            shading: THREE.SmoothShading,
-            transparent: true,
-        }));
-        cone.renderOrder = 1;
-        var ball = new THREE.Mesh(new THREE.SphereGeometry(radius / 2, 8, 8), new THREE.MeshBasicMaterial({
-            color: this._ballColor,
-            opacity: this._ballOpacity,
-            shading: THREE.SmoothShading,
-            transparent: true,
-        }));
-        ball.position.z = this._markerHeight(radius);
-        var group = new THREE.Object3D();
-        group.add(ball);
-        group.add(cone);
-        group.position.fromArray(position);
-        this._geometry = group;
+    Object.defineProperty(SliderGLRenderer.prototype, "disabled", {
+        get: function () {
+            return this._disabled;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(SliderGLRenderer.prototype, "frameId", {
+        get: function () {
+            return this._frameId;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(SliderGLRenderer.prototype, "needsRender", {
+        get: function () {
+            return this._needsRender;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    SliderGLRenderer.prototype.setTextureProvider = function (key, provider) {
+        this._setTextureProvider(key, this._currentKey, provider, this._currentProviderDisposers, this._updateTexture.bind(this));
     };
-    SimpleMarker.prototype._disposeGeometry = function () {
-        for (var _i = 0, _a = this._geometry.children; _i < _a.length; _i++) {
-            var mesh = _a[_i];
-            mesh.geometry.dispose();
-            mesh.material.dispose();
+    SliderGLRenderer.prototype.setTextureProviderPrev = function (key, provider) {
+        this._setTextureProvider(key, this._previousKey, provider, this._previousProviderDisposers, this._updateTexturePrev.bind(this));
+    };
+    SliderGLRenderer.prototype.update = function (frame, mode) {
+        this._updateFrameId(frame.id);
+        this._updateImagePlanes(frame.state, mode);
+    };
+    SliderGLRenderer.prototype.updateCurtain = function (curtain) {
+        if (this._curtain === curtain) {
+            return;
         }
+        this._curtain = curtain;
+        this._updateCurtain();
+        this._needsRender = true;
     };
-    SimpleMarker.prototype._getInteractiveObjects = function () {
-        return this._interactive ? [this._geometry.children[0]] : [];
+    SliderGLRenderer.prototype.updateTexture = function (image, node) {
+        var planes = node.key === this._currentKey ?
+            this._scene.planes :
+            node.key === this._previousKey ?
+                this._scene.planesOld :
+                {};
+        if (Object.keys(planes).length === 0) {
+            return;
+        }
+        this._needsRender = true;
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            var material = plane.material;
+            var texture = material.uniforms.projectorTex.value;
+            texture.image = image;
+            texture.needsUpdate = true;
+        }
     };
-    SimpleMarker.prototype._markerHeight = function (radius) {
-        var t = Math.tan(Math.PI - this._circleToRayAngle);
-        return radius * Math.sqrt(1 + t * t);
+    SliderGLRenderer.prototype.updateTextureImage = function (image, node) {
+        if (this._currentKey !== node.key) {
+            return;
+        }
+        this._needsRender = true;
+        var planes = this._scene.planes;
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            var material = plane.material;
+            var texture = material.uniforms.projectorTex.value;
+            texture.image = image;
+            texture.needsUpdate = true;
+        }
     };
-    SimpleMarker.prototype._markerGeometry = function (radius, widthSegments, heightSegments) {
-        var geometry = new THREE.Geometry();
-        widthSegments = Math.max(3, Math.floor(widthSegments) || 8);
-        heightSegments = Math.max(2, Math.floor(heightSegments) || 6);
-        var height = this._markerHeight(radius);
-        var vertices = [];
-        for (var y = 0; y <= heightSegments; ++y) {
-            var verticesRow = [];
-            for (var x = 0; x <= widthSegments; ++x) {
-                var u = x / widthSegments * Math.PI * 2;
-                var v = y / heightSegments * Math.PI;
-                var r = void 0;
-                if (v < this._circleToRayAngle) {
-                    r = radius;
-                }
-                else {
-                    var t = Math.tan(v - this._circleToRayAngle);
-                    r = radius * Math.sqrt(1 + t * t);
-                }
-                var vertex = new THREE.Vector3();
-                vertex.x = r * Math.cos(u) * Math.sin(v);
-                vertex.y = r * Math.sin(u) * Math.sin(v);
-                vertex.z = r * Math.cos(v) + height;
-                geometry.vertices.push(vertex);
-                verticesRow.push(geometry.vertices.length - 1);
+    SliderGLRenderer.prototype.render = function (perspectiveCamera, renderer) {
+        if (!this.disabled) {
+            renderer.render(this._scene.sceneOld, perspectiveCamera);
+        }
+        renderer.render(this._scene.scene, perspectiveCamera);
+        this._needsRender = false;
+    };
+    SliderGLRenderer.prototype.dispose = function () {
+        this._scene.clear();
+        for (var key in this._currentProviderDisposers) {
+            if (!this._currentProviderDisposers.hasOwnProperty(key)) {
+                continue;
             }
-            vertices.push(verticesRow);
+            this._currentProviderDisposers[key]();
         }
-        for (var y = 0; y < heightSegments; ++y) {
-            for (var x = 0; x < widthSegments; ++x) {
-                var v1 = vertices[y][x + 1];
-                var v2 = vertices[y][x];
-                var v3 = vertices[y + 1][x];
-                var v4 = vertices[y + 1][x + 1];
-                var n1 = geometry.vertices[v1].clone().normalize();
-                var n2 = geometry.vertices[v2].clone().normalize();
-                var n3 = geometry.vertices[v3].clone().normalize();
-                var n4 = geometry.vertices[v4].clone().normalize();
-                geometry.faces.push(new THREE.Face3(v1, v2, v4, [n1, n2, n4]));
-                geometry.faces.push(new THREE.Face3(v2, v3, v4, [n2.clone(), n3, n4.clone()]));
+        for (var key in this._previousProviderDisposers) {
+            if (!this._previousProviderDisposers.hasOwnProperty(key)) {
+                continue;
             }
+            this._previousProviderDisposers[key]();
         }
-        geometry.computeFaceNormals();
-        geometry.boundingSphere = new THREE.Sphere(new THREE.Vector3(), radius + height);
-        return geometry;
+        this._currentProviderDisposers = {};
+        this._previousProviderDisposers = {};
     };
-    return SimpleMarker;
-}(Component_1.Marker));
-exports.SimpleMarker = SimpleMarker;
-exports.default = SimpleMarker;
-
-},{"../../../Component":226,"three":176}],269:[function(require,module,exports){
-"use strict";
-/// <reference path="../../../typings/index.d.ts" />
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    SliderGLRenderer.prototype._getBasicCorners = function (currentAspect, previousAspect) {
+        var offsetX;
+        var offsetY;
+        if (currentAspect > previousAspect) {
+            offsetX = 0.5;
+            offsetY = 0.5 * currentAspect / previousAspect;
+        }
+        else {
+            offsetX = 0.5 * previousAspect / currentAspect;
+            offsetY = 0.5;
+        }
+        return [[0.5 - offsetX, 0.5 - offsetY], [0.5 + offsetX, 0.5 + offsetY]];
     };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("rxjs/Observable");
-var Component_1 = require("../../Component");
-/**
- * The `BounceHandler` ensures that the viewer bounces back to the image
- * when drag panning outside of the image edge.
- */
-var BounceHandler = (function (_super) {
-    __extends(BounceHandler, _super);
-    function BounceHandler(component, container, navigator, viewportCoords, spatial) {
-        var _this = _super.call(this, component, container, navigator, viewportCoords) || this;
-        _this._spatial = spatial;
-        _this._basicDistanceThreshold = 1e-3;
-        _this._basicRotationThreshold = 5e-2;
-        _this._bounceCoeff = 1e-1;
-        return _this;
-    }
-    BounceHandler.prototype._enable = function () {
+    SliderGLRenderer.prototype._setDisabled = function (state) {
+        this._disabled = state.currentNode == null ||
+            state.previousNode == null ||
+            (state.currentNode.pano && !state.currentNode.fullPano) ||
+            (state.previousNode.pano && !state.previousNode.fullPano) ||
+            (state.currentNode.fullPano && !state.previousNode.fullPano);
+    };
+    SliderGLRenderer.prototype._setTextureProvider = function (key, originalKey, provider, providerDisposers, updateTexture) {
         var _this = this;
-        var inTransition$ = this._navigator.stateService.currentState$
-            .map(function (frame) {
-            return frame.state.alpha < 1;
+        if (key !== originalKey) {
+            return;
+        }
+        var createdSubscription = provider.textureCreated$
+            .subscribe(updateTexture);
+        var updatedSubscription = provider.textureUpdated$
+            .subscribe(function (updated) {
+            _this._needsRender = true;
         });
-        this._bounceSubscription = Observable_1.Observable
-            .combineLatest(inTransition$, this._navigator.stateService.inTranslation$, this._container.mouseService.active$, this._container.touchService.active$)
-            .map(function (noForce) {
-            return noForce[0] || noForce[1] || noForce[2] || noForce[3];
-        })
-            .distinctUntilChanged()
-            .switchMap(function (noForce) {
-            return noForce ?
-                Observable_1.Observable.empty() :
-                Observable_1.Observable.combineLatest(_this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$.first());
-        })
-            .subscribe(function (args) {
-            var renderCamera = args[0];
-            var perspectiveCamera = renderCamera.perspective;
-            var transform = args[1];
-            if (!transform.hasValidScale && renderCamera.camera.focal < 0.1) {
-                return;
-            }
-            if (renderCamera.perspective.aspect === 0 || renderCamera.perspective.aspect === Number.POSITIVE_INFINITY) {
-                return;
-            }
-            var distanceThreshold = _this._basicDistanceThreshold / Math.pow(2, renderCamera.zoom);
-            var basicCenter = _this._viewportCoords.viewportToBasic(0, 0, transform, perspectiveCamera);
-            if (Math.abs(basicCenter[0] - 0.5) < distanceThreshold && Math.abs(basicCenter[1] - 0.5) < distanceThreshold) {
-                return;
-            }
-            var basicDistances = _this._viewportCoords.getBasicDistances(transform, perspectiveCamera);
-            var basicX = 0;
-            var basicY = 0;
-            if (basicDistances[0] < distanceThreshold && basicDistances[1] < distanceThreshold &&
-                basicDistances[2] < distanceThreshold && basicDistances[3] < distanceThreshold) {
-                return;
+        var dispose = function () {
+            createdSubscription.unsubscribe();
+            updatedSubscription.unsubscribe();
+            provider.dispose();
+        };
+        if (key in providerDisposers) {
+            var disposeProvider = providerDisposers[key];
+            disposeProvider();
+            delete providerDisposers[key];
+        }
+        providerDisposers[key] = dispose;
+    };
+    SliderGLRenderer.prototype._updateCurtain = function () {
+        var planes = this._scene.planes;
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
             }
-            if (Math.abs(basicDistances[0] - basicDistances[2]) < distanceThreshold &&
-                Math.abs(basicDistances[1] - basicDistances[3]) < distanceThreshold) {
-                return;
+            var plane = planes[key];
+            var shaderMaterial = plane.material;
+            if (!!shaderMaterial.uniforms.curtain) {
+                shaderMaterial.uniforms.curtain.value = this._curtain;
             }
-            var coeff = _this._bounceCoeff;
-            if (basicDistances[1] > 0 && basicDistances[3] === 0) {
-                basicX = -coeff * basicDistances[1];
+        }
+    };
+    SliderGLRenderer.prototype._updateFrameId = function (frameId) {
+        this._frameId = frameId;
+    };
+    SliderGLRenderer.prototype._updateImagePlanes = function (state, mode) {
+        var currentChanged = state.currentNode != null && this._currentKey !== state.currentNode.key;
+        var previousChanged = state.previousNode != null && this._previousKey !== state.previousNode.key;
+        var modeChanged = this._mode !== mode;
+        if (!(currentChanged || previousChanged || modeChanged)) {
+            return;
+        }
+        this._setDisabled(state);
+        this._needsRender = true;
+        this._mode = mode;
+        var motionless = state.motionless || mode === Component_1.SliderMode.Stationary || state.currentNode.pano;
+        if (this.disabled || previousChanged) {
+            if (this._previousKey in this._previousProviderDisposers) {
+                this._previousProviderDisposers[this._previousKey]();
+                delete this._previousProviderDisposers[this._previousKey];
             }
-            else if (basicDistances[1] === 0 && basicDistances[3] > 0) {
-                basicX = coeff * basicDistances[3];
+        }
+        if (this.disabled) {
+            this._scene.setImagePlanesOld({});
+        }
+        else {
+            if (previousChanged || modeChanged) {
+                var previousNode = state.previousNode;
+                this._previousKey = previousNode.key;
+                var elements = state.currentTransform.rt.elements;
+                var translation = [elements[12], elements[13], elements[14]];
+                var currentAspect = state.currentTransform.basicAspect;
+                var previousAspect = state.previousTransform.basicAspect;
+                var textureScale = currentAspect > previousAspect ?
+                    [1, previousAspect / currentAspect] :
+                    [currentAspect / previousAspect, 1];
+                var rotation = state.currentNode.rotation;
+                var width = state.currentNode.width;
+                var height = state.currentNode.height;
+                if (previousNode.fullPano) {
+                    rotation = state.previousNode.rotation;
+                    translation = this._spatial
+                        .rotate(this._spatial
+                        .opticalCenter(state.currentNode.rotation, translation)
+                        .toArray(), rotation)
+                        .multiplyScalar(-1)
+                        .toArray();
+                    width = state.previousNode.width;
+                    height = state.previousNode.height;
+                }
+                var transform = new Geo_1.Transform(state.currentNode.orientation, width, height, state.currentNode.focal, state.currentNode.scale, previousNode.gpano, rotation, translation, previousNode.image, textureScale);
+                var mesh = undefined;
+                if (previousNode.fullPano) {
+                    mesh = this._factory.createMesh(previousNode, motionless || state.currentNode.fullPano ? transform : state.previousTransform);
+                }
+                else {
+                    if (motionless) {
+                        var _a = this._getBasicCorners(currentAspect, previousAspect), _b = _a[0], basicX0 = _b[0], basicY0 = _b[1], _c = _a[1], basicX1 = _c[0], basicY1 = _c[1];
+                        mesh = this._factory.createFlatMesh(state.previousNode, transform, basicX0, basicX1, basicY0, basicY1);
+                    }
+                    else {
+                        mesh = this._factory.createMesh(state.previousNode, state.previousTransform);
+                    }
+                }
+                var previousPlanes = {};
+                previousPlanes[previousNode.key] = mesh;
+                this._scene.setImagePlanesOld(previousPlanes);
             }
-            else if (basicDistances[1] > 0 && basicDistances[3] > 0) {
-                basicX = coeff * (basicDistances[3] - basicDistances[1]) / 2;
+        }
+        if (currentChanged || modeChanged) {
+            if (this._currentKey in this._currentProviderDisposers) {
+                this._currentProviderDisposers[this._currentKey]();
+                delete this._currentProviderDisposers[this._currentKey];
             }
-            if (basicDistances[0] > 0 && basicDistances[2] === 0) {
-                basicY = coeff * basicDistances[0];
+            this._currentKey = state.currentNode.key;
+            var planes = {};
+            if (state.currentNode.fullPano) {
+                planes[state.currentNode.key] = this._factory.createCurtainMesh(state.currentNode, state.currentTransform);
             }
-            else if (basicDistances[0] === 0 && basicDistances[2] > 0) {
-                basicY = -coeff * basicDistances[2];
+            else if (state.currentNode.pano && !state.currentNode.fullPano) {
+                planes[state.currentNode.key] = this._factory.createMesh(state.currentNode, state.currentTransform);
             }
-            else if (basicDistances[0] > 0 && basicDistances[2] > 0) {
-                basicY = coeff * (basicDistances[0] - basicDistances[2]) / 2;
+            else {
+                if (motionless) {
+                    planes[state.currentNode.key] = this._factory.createDistortedCurtainMesh(state.currentNode, state.currentTransform);
+                }
+                else {
+                    planes[state.currentNode.key] = this._factory.createCurtainMesh(state.currentNode, state.currentTransform);
+                }
             }
-            var rotationThreshold = _this._basicRotationThreshold;
-            basicX = _this._spatial.clamp(basicX, -rotationThreshold, rotationThreshold);
-            basicY = _this._spatial.clamp(basicY, -rotationThreshold, rotationThreshold);
-            _this._navigator.stateService.rotateBasicUnbounded([basicX, basicY]);
-        });
+            this._scene.setImagePlanes(planes);
+            this._updateCurtain();
+        }
     };
-    BounceHandler.prototype._disable = function () {
-        this._bounceSubscription.unsubscribe();
+    SliderGLRenderer.prototype._updateTexture = function (texture) {
+        this._needsRender = true;
+        var planes = this._scene.planes;
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            var material = plane.material;
+            var oldTexture = material.uniforms.projectorTex.value;
+            material.uniforms.projectorTex.value = null;
+            oldTexture.dispose();
+            material.uniforms.projectorTex.value = texture;
+        }
     };
-    BounceHandler.prototype._getConfiguration = function (enable) {
-        return {};
+    SliderGLRenderer.prototype._updateTexturePrev = function (texture) {
+        this._needsRender = true;
+        var planes = this._scene.planesOld;
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            var material = plane.material;
+            var oldTexture = material.uniforms.projectorTex.value;
+            material.uniforms.projectorTex.value = null;
+            oldTexture.dispose();
+            material.uniforms.projectorTex.value = texture;
+        }
     };
-    return BounceHandler;
-}(Component_1.MouseHandlerBase));
-exports.BounceHandler = BounceHandler;
-exports.default = BounceHandler;
+    return SliderGLRenderer;
+}());
+exports.SliderGLRenderer = SliderGLRenderer;
+exports.default = SliderGLRenderer;
 
-},{"../../Component":226,"rxjs/Observable":29}],270:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("rxjs/Observable");
-var Component_1 = require("../../Component");
-/**
- * The `DoubleClickZoomHandler` allows the user to zoom the viewer photo at a point by double clicking.
- *
- * @example
- * ```
- * var mouseComponent = viewer.getComponent("mouse");
- *
- * mouseComponent.doubleClickZoom.disable();
- * mouseComponent.doubleClickZoom.enable();
- *
- * var isEnabled = mouseComponent.doubleClickZoom.isEnabled;
- * ```
- */
-var DoubleClickZoomHandler = (function (_super) {
-    __extends(DoubleClickZoomHandler, _super);
-    function DoubleClickZoomHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    DoubleClickZoomHandler.prototype._enable = function () {
-        var _this = this;
-        this._zoomSubscription = Observable_1.Observable
-            .merge(this._container.mouseService
-            .filtered$(this._component.name, this._container.mouseService.dblClick$), this._container.touchService.doubleTap$
-            .map(function (e) {
-            var touch = e.touches[0];
-            return { clientX: touch.clientX, clientY: touch.clientY, shiftKey: e.shiftKey };
-        }))
-            .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$)
-            .subscribe(function (_a) {
-            var event = _a[0], render = _a[1], transform = _a[2];
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
-            var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective);
-            var reference = transform.projectBasic(unprojected.toArray());
-            var delta = !!event.shiftKey ? -1 : 1;
-            _this._navigator.stateService.zoomIn(delta, reference);
-        });
-    };
-    DoubleClickZoomHandler.prototype._disable = function () {
-        this._zoomSubscription.unsubscribe();
-    };
-    DoubleClickZoomHandler.prototype._getConfiguration = function (enable) {
-        return { doubleClickZoom: enable };
-    };
-    return DoubleClickZoomHandler;
-}(Component_1.MouseHandlerBase));
-exports.DoubleClickZoomHandler = DoubleClickZoomHandler;
-exports.default = DoubleClickZoomHandler;
 
-},{"../../Component":226,"rxjs/Observable":29}],271:[function(require,module,exports){
+},{"../../Component":291,"../../Geo":294}],360:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../typings/index.d.ts" />
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
 Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var Observable_1 = require("rxjs/Observable");
-var Component_1 = require("../../Component");
-/**
- * The `DragPanHandler` allows the user to pan the viewer photo by clicking and dragging the cursor.
- *
- * @example
- * ```
- * var mouseComponent = viewer.getComponent("mouse");
- *
- * mouseComponent.dragPan.disable();
- * mouseComponent.dragPan.enable();
- *
- * var isEnabled = mouseComponent.dragPan.isEnabled;
- * ```
- */
-var DragPanHandler = (function (_super) {
-    __extends(DragPanHandler, _super);
-    function DragPanHandler(component, container, navigator, viewportCoords, spatial) {
-        var _this = _super.call(this, component, container, navigator, viewportCoords) || this;
-        _this._spatial = spatial;
-        _this._basicRotationThreshold = 5e-2;
-        _this._forceCoeff = 2e-1;
-        return _this;
+exports.CameraVisualizationMode = void 0;
+var CameraVisualizationMode;
+(function (CameraVisualizationMode) {
+    CameraVisualizationMode[CameraVisualizationMode["Default"] = 0] = "Default";
+    CameraVisualizationMode[CameraVisualizationMode["Cluster"] = 1] = "Cluster";
+    CameraVisualizationMode[CameraVisualizationMode["ConnectedComponent"] = 2] = "ConnectedComponent";
+    CameraVisualizationMode[CameraVisualizationMode["Sequence"] = 3] = "Sequence";
+})(CameraVisualizationMode = exports.CameraVisualizationMode || (exports.CameraVisualizationMode = {}));
+exports.default = CameraVisualizationMode;
+
+},{}],361:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var CameraVisualizationMode_1 = require("./CameraVisualizationMode");
+Object.defineProperty(exports, "CameraVisualizationMode", { enumerable: true, get: function () { return CameraVisualizationMode_1.CameraVisualizationMode; } });
+
+},{"./CameraVisualizationMode":360}],362:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SpatialDataCache = void 0;
+var geohash = require("latlon-geohash");
+var pako = require("pako");
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Error_1 = require("../../Error");
+var Utils_1 = require("../../Utils");
+var SpatialDataCache = /** @class */ (function () {
+    function SpatialDataCache(graphService) {
+        this._graphService = graphService;
+        this._tiles = {};
+        this._cacheRequests = {};
+        this._clusterReconstructions = {};
+        this._clusterReconstructionTiles = {};
+        this._tileClusters = {};
+        this._cachingTiles$ = {};
+        this._cachingClusterReconstructions$ = {};
     }
-    DragPanHandler.prototype._enable = function () {
+    SpatialDataCache.prototype.cacheClusterReconstructions$ = function (hash) {
         var _this = this;
-        var draggingStarted$ = this._container.mouseService
-            .filtered$(this._component.name, this._container.mouseService.mouseDragStart$)
-            .map(function (event) {
-            return true;
-        });
-        var draggingStopped$ = this._container.mouseService
-            .filtered$(this._component.name, this._container.mouseService.mouseDragEnd$)
-            .map(function (event) {
-            return false;
-        });
-        this._activeMouseSubscription = Observable_1.Observable
-            .merge(draggingStarted$, draggingStopped$)
-            .subscribe(this._container.mouseService.activate$);
-        this._preventDefaultSubscription = Observable_1.Observable
-            .merge(draggingStarted$, draggingStopped$)
-            .switchMap(function (dragging) {
-            return dragging ?
-                _this._container.mouseService.documentMouseMove$ :
-                Observable_1.Observable.empty();
+        if (!this.hasTile(hash)) {
+            throw new Error("Cannot cache reconstructions of a non-existing tile.");
+        }
+        if (this.hasClusterReconstructions(hash)) {
+            throw new Error("Cannot cache reconstructions that already exists.");
+        }
+        if (this.isCachingClusterReconstructions(hash)) {
+            return this._cachingClusterReconstructions$[hash];
+        }
+        var clusterKeys = this.getTile(hash)
+            .filter(function (nd) {
+            return !!nd.clusterKey;
         })
-            .merge(this._container.touchService.touchMove$)
-            .subscribe(function (event) {
-            event.preventDefault(); // prevent selection of content outside the viewer
-        });
-        var touchMovingStarted$ = this._container.touchService.singleTouchDragStart$
-            .map(function (event) {
-            return true;
-        });
-        var touchMovingStopped$ = this._container.touchService.singleTouchDragEnd$
-            .map(function (event) {
-            return false;
-        });
-        this._activeTouchSubscription = Observable_1.Observable
-            .merge(touchMovingStarted$, touchMovingStopped$)
-            .subscribe(this._container.touchService.activate$);
-        this._rotateBasicSubscription = this._navigator.stateService.currentState$
-            .map(function (frame) {
-            return frame.state.currentNode.fullPano || frame.state.nodesAhead < 1;
+            .map(function (nd) {
+            return nd.clusterKey;
         })
-            .distinctUntilChanged()
-            .switchMap(function (enable) {
-            if (!enable) {
-                return Observable_1.Observable.empty();
+            .filter(function (v, i, a) {
+            return a.indexOf(v) === i;
+        });
+        this._tileClusters[hash] = clusterKeys;
+        this._cacheRequests[hash] = [];
+        this._cachingClusterReconstructions$[hash] = rxjs_1.from(clusterKeys).pipe(operators_1.mergeMap(function (key) {
+            if (_this._hasClusterReconstruction(key)) {
+                return rxjs_1.of(_this._getClusterReconstruction(key));
+            }
+            return _this._getClusterReconstruction$(key, _this._cacheRequests[hash])
+                .pipe(operators_1.catchError(function (error) {
+                if (error instanceof Error_1.AbortMapillaryError) {
+                    return rxjs_1.empty();
+                }
+                console.error(error);
+                return rxjs_1.empty();
+            }));
+        }, 6), operators_1.filter(function () {
+            return hash in _this._tileClusters;
+        }), operators_1.tap(function (reconstruction) {
+            if (!_this._hasClusterReconstruction(reconstruction.key)) {
+                _this._clusterReconstructions[reconstruction.key] = reconstruction;
             }
-            var mouseDrag$ = Observable_1.Observable
-                .merge(_this._container.mouseService.filtered$(_this._component.name, _this._container.mouseService.mouseDragStart$), _this._container.mouseService.filtered$(_this._component.name, _this._container.mouseService.mouseDrag$), _this._container.mouseService.filtered$(_this._component.name, _this._container.mouseService.mouseDragEnd$)
-                .map(function (e) { return null; }))
-                .pairwise()
-                .filter(function (pair) {
-                return pair[0] != null && pair[1] != null;
+            if (!(reconstruction.key in _this._clusterReconstructionTiles)) {
+                _this._clusterReconstructionTiles[reconstruction.key] = [];
+            }
+            if (_this._clusterReconstructionTiles[reconstruction.key].indexOf(hash) === -1) {
+                _this._clusterReconstructionTiles[reconstruction.key].push(hash);
+            }
+        }), operators_1.finalize(function () {
+            if (hash in _this._cachingClusterReconstructions$) {
+                delete _this._cachingClusterReconstructions$[hash];
+            }
+            if (hash in _this._cacheRequests) {
+                delete _this._cacheRequests[hash];
+            }
+        }), operators_1.publish(), operators_1.refCount());
+        return this._cachingClusterReconstructions$[hash];
+    };
+    SpatialDataCache.prototype.cacheTile$ = function (hash) {
+        var _this = this;
+        if (hash.length !== 8) {
+            throw new Error("Hash needs to be level 8.");
+        }
+        if (this.hasTile(hash)) {
+            throw new Error("Cannot cache tile that already exists.");
+        }
+        if (this.isCachingTile(hash)) {
+            return this._cachingTiles$[hash];
+        }
+        var bounds = geohash.bounds(hash);
+        var sw = { lat: bounds.sw.lat, lon: bounds.sw.lon };
+        var ne = { lat: bounds.ne.lat, lon: bounds.ne.lon };
+        this._cachingTiles$[hash] = this._graphService.cacheBoundingBox$(sw, ne).pipe(operators_1.catchError(function (error) {
+            console.error(error);
+            return rxjs_1.empty();
+        }), operators_1.map(function (nodes) {
+            return nodes
+                .map(function (n) {
+                return _this._createNodeData(n);
             });
-            var singleTouchDrag$ = Observable_1.Observable
-                .merge(_this._container.touchService.singleTouchDragStart$, _this._container.touchService.singleTouchDrag$, _this._container.touchService.singleTouchDragEnd$.map(function (t) { return null; }))
-                .map(function (event) {
-                return event != null && event.touches.length > 0 ?
-                    event.touches[0] : null;
+        }), operators_1.filter(function () {
+            return !(hash in _this._tiles);
+        }), operators_1.tap(function (nodeData) {
+            var _a;
+            _this._tiles[hash] = [];
+            (_a = _this._tiles[hash]).push.apply(_a, nodeData);
+            delete _this._cachingTiles$[hash];
+        }), operators_1.finalize(function () {
+            if (hash in _this._cachingTiles$) {
+                delete _this._cachingTiles$[hash];
+            }
+        }), operators_1.publish(), operators_1.refCount());
+        return this._cachingTiles$[hash];
+    };
+    SpatialDataCache.prototype.isCachingClusterReconstructions = function (hash) {
+        return hash in this._cachingClusterReconstructions$;
+    };
+    SpatialDataCache.prototype.isCachingTile = function (hash) {
+        return hash in this._cachingTiles$;
+    };
+    SpatialDataCache.prototype.hasClusterReconstructions = function (hash) {
+        if (hash in this._cachingClusterReconstructions$ ||
+            !(hash in this._tileClusters)) {
+            return false;
+        }
+        for (var _i = 0, _a = this._tileClusters[hash]; _i < _a.length; _i++) {
+            var key = _a[_i];
+            if (!(key in this._clusterReconstructions)) {
+                return false;
+            }
+        }
+        return true;
+    };
+    SpatialDataCache.prototype.hasTile = function (hash) {
+        return !(hash in this._cachingTiles$) && hash in this._tiles;
+    };
+    SpatialDataCache.prototype.getClusterReconstructions = function (hash) {
+        var _this = this;
+        return hash in this._tileClusters ?
+            this._tileClusters[hash]
+                .map(function (key) {
+                return _this._clusterReconstructions[key];
             })
-                .pairwise()
-                .filter(function (pair) {
-                return pair[0] != null && pair[1] != null;
-            });
-            return Observable_1.Observable
-                .merge(mouseDrag$, singleTouchDrag$);
-        })
-            .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, this._navigator.stateService.currentCamera$)
-            .map(function (_a) {
-            var events = _a[0], render = _a[1], transform = _a[2], c = _a[3];
-            var camera = c.clone();
-            var previousEvent = events[0];
-            var event = events[1];
-            var movementX = event.clientX - previousEvent.clientX;
-            var movementY = event.clientY - previousEvent.clientY;
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
-            var currentDirection = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective)
-                .sub(render.perspective.position);
-            var directionX = _this._viewportCoords.unprojectFromCanvas(canvasX - movementX, canvasY, element, render.perspective)
-                .sub(render.perspective.position);
-            var directionY = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY - movementY, element, render.perspective)
-                .sub(render.perspective.position);
-            var deltaPhi = (movementX > 0 ? 1 : -1) * directionX.angleTo(currentDirection);
-            var deltaTheta = (movementY > 0 ? -1 : 1) * directionY.angleTo(currentDirection);
-            var upQuaternion = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1));
-            var upQuaternionInverse = upQuaternion.clone().inverse();
-            var offset = new THREE.Vector3();
-            offset.copy(camera.lookat).sub(camera.position);
-            offset.applyQuaternion(upQuaternion);
-            var length = offset.length();
-            var phi = Math.atan2(offset.y, offset.x);
-            phi += deltaPhi;
-            var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
-            theta += deltaTheta;
-            theta = Math.max(0.01, Math.min(Math.PI - 0.01, theta));
-            offset.x = Math.sin(theta) * Math.cos(phi);
-            offset.y = Math.sin(theta) * Math.sin(phi);
-            offset.z = Math.cos(theta);
-            offset.applyQuaternion(upQuaternionInverse);
-            var lookat = new THREE.Vector3().copy(camera.position).add(offset.multiplyScalar(length));
-            var basic = transform.projectBasic(lookat.toArray());
-            var original = transform.projectBasic(camera.lookat.toArray());
-            var x = basic[0] - original[0];
-            var y = basic[1] - original[1];
-            if (Math.abs(x) > 1) {
-                x = 0;
-            }
-            else if (x > 0.5) {
-                x = x - 1;
-            }
-            else if (x < -0.5) {
-                x = x + 1;
-            }
-            var rotationThreshold = _this._basicRotationThreshold;
-            x = _this._spatial.clamp(x, -rotationThreshold, rotationThreshold);
-            y = _this._spatial.clamp(y, -rotationThreshold, rotationThreshold);
-            if (transform.fullPano) {
-                return [x, y];
-            }
-            var pixelDistances = _this._viewportCoords.getPixelDistances(_this._container.element, transform, render.perspective);
-            var coeff = _this._forceCoeff;
-            if (pixelDistances[0] > 0 && y < 0 && basic[1] < 0.5) {
-                y /= Math.max(1, coeff * pixelDistances[0]);
-            }
-            if (pixelDistances[1] > 0 && x > 0 && basic[0] > 0.5) {
-                x /= Math.max(1, coeff * pixelDistances[1]);
-            }
-            if (pixelDistances[2] > 0 && y > 0 && basic[1] > 0.5) {
-                y /= Math.max(1, coeff * pixelDistances[2]);
-            }
-            if (pixelDistances[3] > 0 && x < 0 && basic[0] < 0.5) {
-                x /= Math.max(1, coeff * pixelDistances[3]);
-            }
-            return [x, y];
-        })
-            .subscribe(function (basicRotation) {
-            _this._navigator.stateService.rotateBasic(basicRotation);
-        });
+                .filter(function (reconstruction) {
+                return !!reconstruction;
+            }) :
+            [];
     };
-    DragPanHandler.prototype._disable = function () {
-        this._activeMouseSubscription.unsubscribe();
-        this._activeTouchSubscription.unsubscribe();
-        this._preventDefaultSubscription.unsubscribe();
-        this._rotateBasicSubscription.unsubscribe();
-        this._activeMouseSubscription = null;
-        this._activeTouchSubscription = null;
-        this._preventDefaultSubscription = null;
-        this._rotateBasicSubscription = null;
+    SpatialDataCache.prototype.getTile = function (hash) {
+        return hash in this._tiles ? this._tiles[hash] : [];
     };
-    DragPanHandler.prototype._getConfiguration = function (enable) {
-        return { dragPan: enable };
+    SpatialDataCache.prototype.uncache = function (keepHashes) {
+        for (var _i = 0, _a = Object.keys(this._cacheRequests); _i < _a.length; _i++) {
+            var hash = _a[_i];
+            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
+                continue;
+            }
+            for (var _b = 0, _c = this._cacheRequests[hash]; _b < _c.length; _b++) {
+                var request = _c[_b];
+                request.abort();
+            }
+            delete this._cacheRequests[hash];
+        }
+        for (var _d = 0, _e = Object.keys(this._tileClusters); _d < _e.length; _d++) {
+            var hash = _e[_d];
+            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
+                continue;
+            }
+            for (var _f = 0, _g = this._tileClusters[hash]; _f < _g.length; _f++) {
+                var key = _g[_f];
+                if (!(key in this._clusterReconstructionTiles)) {
+                    continue;
+                }
+                var index = this._clusterReconstructionTiles[key].indexOf(hash);
+                if (index === -1) {
+                    continue;
+                }
+                this._clusterReconstructionTiles[key].splice(index, 1);
+                if (this._clusterReconstructionTiles[key].length > 0) {
+                    continue;
+                }
+                delete this._clusterReconstructionTiles[key];
+                delete this._clusterReconstructions[key];
+            }
+            delete this._tileClusters[hash];
+        }
+        for (var _h = 0, _j = Object.keys(this._tiles); _h < _j.length; _h++) {
+            var hash = _j[_h];
+            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
+                continue;
+            }
+            delete this._tiles[hash];
+        }
     };
-    return DragPanHandler;
-}(Component_1.MouseHandlerBase));
-exports.DragPanHandler = DragPanHandler;
-exports.default = DragPanHandler;
+    SpatialDataCache.prototype._createNodeData = function (node) {
+        return {
+            alt: node.alt,
+            cameraProjection: node.cameraProjection,
+            clusterKey: node.clusterKey,
+            focal: node.focal,
+            gpano: node.gpano,
+            height: node.height,
+            k1: node.ck1,
+            k2: node.ck2,
+            key: node.key,
+            lat: node.latLon.lat,
+            lon: node.latLon.lon,
+            mergeCC: node.mergeCC,
+            orientation: node.orientation,
+            originalLat: node.originalLatLon.lat,
+            originalLon: node.originalLatLon.lon,
+            rotation: [node.rotation[0], node.rotation[1], node.rotation[2]],
+            scale: node.scale,
+            sequenceKey: node.sequenceKey,
+            width: node.width,
+        };
+    };
+    SpatialDataCache.prototype._getClusterReconstruction = function (key) {
+        return this._clusterReconstructions[key];
+    };
+    SpatialDataCache.prototype._getClusterReconstruction$ = function (key, requests) {
+        return rxjs_1.Observable.create(function (subscriber) {
+            var xhr = new XMLHttpRequest();
+            xhr.open("GET", Utils_1.Urls.clusterReconstruction(key), true);
+            xhr.responseType = "arraybuffer";
+            xhr.timeout = 15000;
+            xhr.onload = function () {
+                if (!xhr.response) {
+                    subscriber.error(new Error("Cluster reconstruction retreival failed (" + key + ")"));
+                }
+                else {
+                    var inflated = pako.inflate(xhr.response, { to: "string" });
+                    var reconstructions = JSON.parse(inflated);
+                    if (reconstructions.length < 1) {
+                        subscriber.error(new Error("No cluster reconstruction exists (" + key + ")"));
+                    }
+                    var reconstruction = reconstructions[0];
+                    reconstruction.key = key;
+                    subscriber.next(reconstruction);
+                    subscriber.complete();
+                }
+            };
+            xhr.onerror = function () {
+                subscriber.error(new Error("Failed to get cluster reconstruction (" + key + ")"));
+            };
+            xhr.ontimeout = function () {
+                subscriber.error(new Error("Cluster reconstruction request timed out (" + key + ")"));
+            };
+            xhr.onabort = function () {
+                subscriber.error(new Error_1.AbortMapillaryError("Cluster reconstruction request was aborted (" + key + ")"));
+            };
+            requests.push(xhr);
+            xhr.send(null);
+        });
+    };
+    SpatialDataCache.prototype._hasClusterReconstruction = function (key) {
+        return key in this._clusterReconstructions;
+    };
+    return SpatialDataCache;
+}());
+exports.SpatialDataCache = SpatialDataCache;
+exports.default = SpatialDataCache;
 
-},{"../../Component":226,"rxjs/Observable":29,"three":176}],272:[function(require,module,exports){
+},{"../../Error":293,"../../Utils":301,"latlon-geohash":21,"pako":23,"rxjs":43,"rxjs/operators":241}],363:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -25452,376 +38433,917 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs/add/observable/merge");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/withLatestFrom");
+exports.SpatialDataComponent = void 0;
+var geohash = require("latlon-geohash");
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var Component_1 = require("../../Component");
 var Geo_1 = require("../../Geo");
-/**
- * @class MouseComponent
- *
- * @classdesc Component handling mouse and touch events for camera movement.
- */
-var MouseComponent = (function (_super) {
-    __extends(MouseComponent, _super);
-    function MouseComponent(name, container, navigator) {
+var Render_1 = require("../../Render");
+var PlayService_1 = require("../../viewer/PlayService");
+var State_1 = require("../../state/State");
+var CameraVisualizationMode_1 = require("./CameraVisualizationMode");
+var SpatialDataComponent = /** @class */ (function (_super) {
+    __extends(SpatialDataComponent, _super);
+    function SpatialDataComponent(name, container, navigator) {
         var _this = _super.call(this, name, container, navigator) || this;
-        var spatial = new Geo_1.Spatial();
-        var viewportCoords = new Geo_1.ViewportCoords();
-        _this._spatial = spatial;
-        _this._viewportCoords = viewportCoords;
-        _this._bounceHandler = new Component_1.BounceHandler(_this, container, navigator, viewportCoords, spatial);
-        _this._doubleClickZoomHandler = new Component_1.DoubleClickZoomHandler(_this, container, navigator, viewportCoords);
-        _this._dragPanHandler = new Component_1.DragPanHandler(_this, container, navigator, viewportCoords, spatial);
-        _this._scrollZoomHandler = new Component_1.ScrollZoomHandler(_this, container, navigator, viewportCoords);
-        _this._touchZoomHandler = new Component_1.TouchZoomHandler(_this, container, navigator, viewportCoords);
+        _this._cache = new Component_1.SpatialDataCache(navigator.graphService);
+        _this._scene = new Component_1.SpatialDataScene(_this._getDefaultConfiguration());
+        _this._viewportCoords = new Geo_1.ViewportCoords();
+        _this._geoCoords = new Geo_1.GeoCoords();
         return _this;
     }
-    Object.defineProperty(MouseComponent.prototype, "doubleClickZoom", {
-        /**
-         * Get double click zoom.
-         *
-         * @returns {DoubleClickZoomHandler} The double click zoom handler.
-         */
-        get: function () {
-            return this._doubleClickZoomHandler;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseComponent.prototype, "dragPan", {
-        /**
-         * Get drag pan.
-         *
-         * @returns {DragPanHandler} The drag pan handler.
-         */
-        get: function () {
-            return this._dragPanHandler;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseComponent.prototype, "scrollZoom", {
-        /**
-         * Get scroll zoom.
-         *
-         * @returns {ScrollZoomHandler} The scroll zoom handler.
-         */
-        get: function () {
-            return this._scrollZoomHandler;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseComponent.prototype, "touchZoom", {
-        /**
-         * Get touch zoom.
-         *
-         * @returns {TouchZoomHandler} The touch zoom handler.
-         */
-        get: function () {
-            return this._touchZoomHandler;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    MouseComponent.prototype._activate = function () {
+    SpatialDataComponent.prototype._activate = function () {
         var _this = this;
-        this._bounceHandler.enable();
-        this._configurationSubscription = this._configuration$
-            .subscribe(function (configuration) {
-            if (configuration.doubleClickZoom) {
-                _this._doubleClickZoomHandler.enable();
+        this._earthControlsSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.earthControls;
+        }), operators_1.distinctUntilChanged(), operators_1.withLatestFrom(this._navigator.stateService.state$))
+            .subscribe(function (_a) {
+            var earth = _a[0], state = _a[1];
+            if (earth && state !== State_1.default.Earth) {
+                _this._navigator.stateService.earth();
             }
-            else {
-                _this._doubleClickZoomHandler.disable();
+            else if (!earth && state === State_1.default.Earth) {
+                _this._navigator.stateService.traverse();
             }
-            if (configuration.dragPan) {
-                _this._dragPanHandler.enable();
+        });
+        var direction$ = this._container.renderService.bearing$.pipe(operators_1.map(function (bearing) {
+            var direction = "";
+            if (bearing > 292.5 || bearing <= 67.5) {
+                direction += "n";
+            }
+            if (bearing > 112.5 && bearing <= 247.5) {
+                direction += "s";
+            }
+            if (bearing > 22.5 && bearing <= 157.5) {
+                direction += "e";
+            }
+            if (bearing > 202.5 && bearing <= 337.5) {
+                direction += "w";
+            }
+            return direction;
+        }), operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
+        var hash$ = this._navigator.stateService.reference$.pipe(operators_1.tap(function () {
+            _this._scene.uncache();
+        }), operators_1.switchMap(function () {
+            return _this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) {
+                return geohash.encode(node.latLon.lat, node.latLon.lon, 8);
+            }), operators_1.distinctUntilChanged());
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        var sequencePlay$ = rxjs_1.combineLatest(this._navigator.playService.playing$, this._navigator.playService.speed$).pipe(operators_1.map(function (_a) {
+            var playing = _a[0], speed = _a[1];
+            return playing && speed > PlayService_1.default.sequenceSpeed;
+        }), operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
+        var hashes$ = rxjs_1.combineLatest(this._navigator.stateService.state$.pipe(operators_1.map(function (state) {
+            return state === State_1.default.Earth;
+        }), operators_1.distinctUntilChanged()), hash$, sequencePlay$, direction$).pipe(operators_1.distinctUntilChanged(function (_a, _b) {
+            var e1 = _a[0], h1 = _a[1], s1 = _a[2], d1 = _a[3];
+            var e2 = _b[0], h2 = _b[1], s2 = _b[2], d2 = _b[3];
+            if (e1 !== e2) {
+                return false;
+            }
+            if (e1) {
+                return h1 === h2 && s1 === s2;
+            }
+            return h1 === h2 && s1 === s2 && d1 === d2;
+        }), operators_1.concatMap(function (_a) {
+            var earth = _a[0], hash = _a[1], sequencePlay = _a[2], direction = _a[3];
+            if (earth) {
+                return sequencePlay ?
+                    rxjs_1.of([hash]) :
+                    rxjs_1.of(_this._adjacentComponent(hash, 4));
+            }
+            return sequencePlay ?
+                rxjs_1.of([hash, geohash.neighbours(hash)[direction]]) :
+                rxjs_1.of(_this._computeTiles(hash, direction));
+        }), operators_1.publish(), operators_1.refCount());
+        var tile$ = hashes$.pipe(operators_1.switchMap(function (hashes) {
+            return rxjs_1.from(hashes).pipe(operators_1.mergeMap(function (h) {
+                var t$ = _this._cache.hasTile(h) ?
+                    rxjs_1.of(_this._cache.getTile(h)) :
+                    _this._cache.cacheTile$(h);
+                return rxjs_1.combineLatest(rxjs_1.of(h), t$);
+            }, 6));
+        }), operators_1.publish(), operators_1.refCount());
+        this._addTileSubscription = tile$.pipe(operators_1.withLatestFrom(this._navigator.stateService.reference$))
+            .subscribe(function (_a) {
+            var hash = _a[0][0], reference = _a[1];
+            if (_this._scene.hasTile(hash)) {
+                return;
             }
-            else {
-                _this._dragPanHandler.disable();
+            _this._scene.addTile(_this._computeTileBBox(hash, reference), hash);
+        });
+        this._addNodeSubscription = tile$.pipe(operators_1.withLatestFrom(this._navigator.stateService.reference$))
+            .subscribe(function (_a) {
+            var _b = _a[0], hash = _b[0], datas = _b[1], reference = _a[1];
+            for (var _i = 0, datas_1 = datas; _i < datas_1.length; _i++) {
+                var data = datas_1[_i];
+                if (_this._scene.hasNode(data.key, hash)) {
+                    continue;
+                }
+                _this._scene.addNode(data, _this._createTransform(data, reference), _this._computeOriginalPosition(data, reference), hash);
             }
-            if (configuration.scrollZoom) {
-                _this._scrollZoomHandler.enable();
+        });
+        this._addReconstructionSubscription = tile$.pipe(operators_1.concatMap(function (_a) {
+            var hash = _a[0];
+            var reconstructions$;
+            if (_this._cache.hasClusterReconstructions(hash)) {
+                reconstructions$ = rxjs_1.from(_this._cache.getClusterReconstructions(hash));
             }
-            else {
-                _this._scrollZoomHandler.disable();
+            else if (_this._cache.isCachingClusterReconstructions(hash)) {
+                reconstructions$ = _this._cache.cacheClusterReconstructions$(hash).pipe(operators_1.last(null, {}), operators_1.switchMap(function () {
+                    return rxjs_1.from(_this._cache.getClusterReconstructions(hash));
+                }));
             }
-            if (configuration.touchZoom) {
-                _this._touchZoomHandler.enable();
+            else if (_this._cache.hasTile(hash)) {
+                reconstructions$ = _this._cache.cacheClusterReconstructions$(hash);
             }
             else {
-                _this._touchZoomHandler.disable();
+                reconstructions$ = rxjs_1.empty();
+            }
+            return rxjs_1.combineLatest(rxjs_1.of(hash), reconstructions$);
+        }), operators_1.withLatestFrom(this._navigator.stateService.reference$))
+            .subscribe(function (_a) {
+            var _b = _a[0], hash = _b[0], reconstruction = _b[1], reference = _a[1];
+            if (_this._scene.hasClusterReconstruction(reconstruction.key, hash)) {
+                return;
             }
+            _this._scene.addClusterReconstruction(reconstruction, _this._computeTranslation(reconstruction, reference), hash);
         });
-        this._container.mouseService.claimMouse(this._name, 0);
+        this._cameraVisibilitySubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.camerasVisible;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (visible) {
+            _this._scene.setCameraVisibility(visible);
+        });
+        this._pointVisibilitySubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.pointsVisible;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (visible) {
+            _this._scene.setPointVisibility(visible);
+        });
+        this._positionVisibilitySubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.positionsVisible;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (visible) {
+            _this._scene.setPositionVisibility(visible);
+        });
+        this._tileVisibilitySubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.tilesVisible;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (visible) {
+            _this._scene.setTileVisibility(visible);
+        });
+        this._ccToModeSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.connectedComponents === true ?
+                CameraVisualizationMode_1.default.ConnectedComponent :
+                CameraVisualizationMode_1.default.Default;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (mode) {
+            _this.configure({ cameraVisualizationMode: mode });
+        });
+        this._cameraVisualizationModeSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
+            return configuration.cameraVisualizationMode;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (mode) {
+            _this._scene.setCameraVisualizationMode(mode);
+        });
+        this._uncacheSubscription = hash$
+            .subscribe(function (hash) {
+            var keepHashes = _this._adjacentComponent(hash, 4);
+            _this._scene.uncache(keepHashes);
+            _this._cache.uncache(keepHashes);
+        });
+        this._moveSubscription = this._navigator.playService.playing$.pipe(operators_1.switchMap(function (playing) {
+            return playing ?
+                rxjs_1.empty() :
+                _this._container.mouseService.dblClick$;
+        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$), operators_1.switchMap(function (_a) {
+            var event = _a[0], render = _a[1];
+            var element = _this._container.element;
+            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
+            var viewport = _this._viewportCoords.canvasToViewport(canvasX, canvasY, element);
+            var key = _this._scene.intersectObjects(viewport, render.perspective);
+            return !!key ?
+                _this._navigator.moveToKey$(key).pipe(operators_1.catchError(function () {
+                    return rxjs_1.empty();
+                })) :
+                rxjs_1.empty();
+        }))
+            .subscribe();
+        this._renderSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            var scene = _this._scene;
+            return {
+                name: _this._name,
+                render: {
+                    frameId: frame.id,
+                    needsRender: scene.needsRender,
+                    render: scene.render.bind(scene),
+                    stage: Render_1.GLRenderStage.Foreground,
+                },
+            };
+        }))
+            .subscribe(this._container.glRenderer.render$);
     };
-    MouseComponent.prototype._deactivate = function () {
-        this._container.mouseService.unclaimMouse(this._name);
-        this._configurationSubscription.unsubscribe();
-        this._bounceHandler.disable();
-        this._doubleClickZoomHandler.disable();
-        this._dragPanHandler.disable();
-        this._scrollZoomHandler.disable();
-        this._touchZoomHandler.disable();
+    SpatialDataComponent.prototype._deactivate = function () {
+        var _this = this;
+        this._cache.uncache();
+        this._scene.uncache();
+        this._addNodeSubscription.unsubscribe();
+        this._addReconstructionSubscription.unsubscribe();
+        this._addTileSubscription.unsubscribe();
+        this._cameraVisibilitySubscription.unsubscribe();
+        this._earthControlsSubscription.unsubscribe();
+        this._moveSubscription.unsubscribe();
+        this._pointVisibilitySubscription.unsubscribe();
+        this._positionVisibilitySubscription.unsubscribe();
+        this._renderSubscription.unsubscribe();
+        this._tileVisibilitySubscription.unsubscribe();
+        this._uncacheSubscription.unsubscribe();
+        this._cameraVisualizationModeSubscription.unsubscribe();
+        this._ccToModeSubscription.unsubscribe();
+        this._navigator.stateService.state$.pipe(operators_1.first())
+            .subscribe(function (state) {
+            if (state === State_1.default.Earth) {
+                _this._navigator.stateService.traverse();
+            }
+        });
     };
-    MouseComponent.prototype._getDefaultConfiguration = function () {
-        return { doubleClickZoom: true, dragPan: true, scrollZoom: true, touchZoom: true };
+    SpatialDataComponent.prototype._getDefaultConfiguration = function () {
+        return {
+            cameraVisualizationMode: CameraVisualizationMode_1.default.Default,
+            camerasVisible: false,
+            connectedComponents: false,
+            pointsVisible: true,
+            positionsVisible: false,
+            tilesVisible: false,
+        };
     };
-    /** @inheritdoc */
-    MouseComponent.componentName = "mouse";
-    return MouseComponent;
+    SpatialDataComponent.prototype._adjacentComponent = function (hash, depth) {
+        var hashSet = new Set();
+        hashSet.add(hash);
+        this._adjacentComponentRecursive(hashSet, [hash], 0, depth);
+        return this._setToArray(hashSet);
+    };
+    SpatialDataComponent.prototype._adjacentComponentRecursive = function (hashSet, currentHashes, currentDepth, maxDepth) {
+        if (currentDepth === maxDepth) {
+            return;
+        }
+        var neighbours = [];
+        for (var _i = 0, currentHashes_1 = currentHashes; _i < currentHashes_1.length; _i++) {
+            var hash = currentHashes_1[_i];
+            var hashNeighbours = geohash.neighbours(hash);
+            for (var direction in hashNeighbours) {
+                if (!hashNeighbours.hasOwnProperty(direction)) {
+                    continue;
+                }
+                neighbours.push(hashNeighbours[direction]);
+            }
+        }
+        var newHashes = [];
+        for (var _a = 0, neighbours_1 = neighbours; _a < neighbours_1.length; _a++) {
+            var neighbour = neighbours_1[_a];
+            if (!hashSet.has(neighbour)) {
+                hashSet.add(neighbour);
+                newHashes.push(neighbour);
+            }
+        }
+        this._adjacentComponentRecursive(hashSet, newHashes, currentDepth + 1, maxDepth);
+    };
+    SpatialDataComponent.prototype._computeOriginalPosition = function (data, reference) {
+        return this._geoCoords.geodeticToEnu(data.originalLat, data.originalLon, data.alt, reference.lat, reference.lon, reference.alt);
+    };
+    SpatialDataComponent.prototype._computeTileBBox = function (hash, reference) {
+        var bounds = geohash.bounds(hash);
+        var sw = this._geoCoords.geodeticToEnu(bounds.sw.lat, bounds.sw.lon, 0, reference.lat, reference.lon, reference.alt);
+        var ne = this._geoCoords.geodeticToEnu(bounds.ne.lat, bounds.ne.lon, 0, reference.lat, reference.lon, reference.alt);
+        return [sw, ne];
+    };
+    SpatialDataComponent.prototype._createTransform = function (data, reference) {
+        var translation = Geo_1.Geo.computeTranslation({ alt: data.alt, lat: data.lat, lon: data.lon }, data.rotation, reference);
+        var transform = new Geo_1.Transform(data.orientation, data.width, data.height, data.focal, data.scale, data.gpano, data.rotation, translation, undefined, undefined, data.k1, data.k2, data.cameraProjection);
+        return transform;
+    };
+    SpatialDataComponent.prototype._computeTiles = function (hash, direction) {
+        var hashSet = new Set();
+        var directions = ["n", "ne", "e", "se", "s", "sw", "w", "nw"];
+        this._computeTilesRecursive(hashSet, hash, direction, directions, 0, 2);
+        return this._setToArray(hashSet);
+    };
+    SpatialDataComponent.prototype._computeTilesRecursive = function (hashSet, currentHash, direction, directions, currentDepth, maxDepth) {
+        hashSet.add(currentHash);
+        if (currentDepth === maxDepth) {
+            return;
+        }
+        var neighbours = geohash.neighbours(currentHash);
+        var directionIndex = directions.indexOf(direction);
+        var length = directions.length;
+        var directionNeighbours = [
+            neighbours[directions[this._modulo((directionIndex - 1), length)]],
+            neighbours[direction],
+            neighbours[directions[this._modulo((directionIndex + 1), length)]],
+        ];
+        for (var _i = 0, directionNeighbours_1 = directionNeighbours; _i < directionNeighbours_1.length; _i++) {
+            var directionNeighbour = directionNeighbours_1[_i];
+            this._computeTilesRecursive(hashSet, directionNeighbour, direction, directions, currentDepth + 1, maxDepth);
+        }
+    };
+    SpatialDataComponent.prototype._computeTranslation = function (reconstruction, reference) {
+        return this._geoCoords.geodeticToEnu(reconstruction.reference_lla.latitude, reconstruction.reference_lla.longitude, reconstruction.reference_lla.altitude, reference.lat, reference.lon, reference.alt);
+    };
+    SpatialDataComponent.prototype._modulo = function (a, n) {
+        return ((a % n) + n) % n;
+    };
+    SpatialDataComponent.prototype._setToArray = function (s) {
+        var a = [];
+        s.forEach(function (value) {
+            a.push(value);
+        });
+        return a;
+    };
+    SpatialDataComponent.componentName = "spatialData";
+    return SpatialDataComponent;
 }(Component_1.Component));
-exports.MouseComponent = MouseComponent;
-Component_1.ComponentService.register(MouseComponent);
-exports.default = MouseComponent;
+exports.SpatialDataComponent = SpatialDataComponent;
+Component_1.ComponentService.register(SpatialDataComponent);
+exports.default = SpatialDataComponent;
 
-},{"../../Component":226,"../../Geo":229,"rxjs/add/observable/merge":44,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/withLatestFrom":83}],273:[function(require,module,exports){
+},{"../../Component":291,"../../Geo":294,"../../Render":297,"../../state/State":449,"../../viewer/PlayService":481,"./CameraVisualizationMode":360,"latlon-geohash":21,"rxjs":43,"rxjs/operators":241}],364:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var MouseHandlerBase = (function () {
-    function MouseHandlerBase(component, container, navigator, viewportCoords) {
-        this._component = component;
-        this._container = container;
-        this._navigator = navigator;
-        this._viewportCoords = viewportCoords;
-        this._enabled = false;
-    }
-    Object.defineProperty(MouseHandlerBase.prototype, "isEnabled", {
-        /**
-         * Returns a Boolean indicating whether the interaction is enabled.
-         *
-         * @returns {boolean} `true` if the interaction is enabled.
-         */
+exports.SpatialDataScene = void 0;
+var THREE = require("three");
+var CameraVisualizationMode_1 = require("./CameraVisualizationMode");
+var SpatialDataScene = /** @class */ (function () {
+    function SpatialDataScene(configuration, scene, raycaster) {
+        this._scene = !!scene ? scene : new THREE.Scene();
+        this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster(undefined, undefined, 0.8);
+        this._cameraColors = {};
+        this._needsRender = false;
+        this._interactiveObjects = [];
+        this._nodes = {};
+        this._tiles = {};
+        this._tileClusterReconstructions = {};
+        this._clusterReconstructions = {};
+        this._cameraVisualizationMode = !!configuration.cameraVisualizationMode ?
+            configuration.cameraVisualizationMode :
+            CameraVisualizationMode_1.default.Default;
+        if (this._cameraVisualizationMode === CameraVisualizationMode_1.default.Default &&
+            configuration.connectedComponents === true) {
+            this._cameraVisualizationMode = CameraVisualizationMode_1.default.ConnectedComponent;
+        }
+        this._camerasVisible = configuration.camerasVisible;
+        this._pointsVisible = configuration.pointsVisible;
+        this._positionsVisible = configuration.positionsVisible;
+        this._tilesVisible = configuration.tilesVisible;
+    }
+    Object.defineProperty(SpatialDataScene.prototype, "needsRender", {
         get: function () {
-            return this._enabled;
+            return this._needsRender;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    /**
-     * Enables the interaction.
-     *
-     * @example ```mouseComponent.<handler-name>.enable();```
-     */
-    MouseHandlerBase.prototype.enable = function () {
-        if (this._enabled || !this._component.activated) {
+    SpatialDataScene.prototype.addClusterReconstruction = function (reconstruction, translation, hash) {
+        if (this.hasClusterReconstruction(reconstruction.key, hash)) {
             return;
         }
-        this._enable();
-        this._enabled = true;
-        this._component.configure(this._getConfiguration(true));
+        var key = reconstruction.key;
+        if (!(key in this._clusterReconstructions)) {
+            this._clusterReconstructions[key] = {
+                points: new THREE.Object3D(),
+                tiles: [],
+            };
+            this._clusterReconstructions[key].points.visible = this._pointsVisible;
+            this._clusterReconstructions[key].points.add(this._createClusterPoints(reconstruction, translation));
+            this._scene.add(this._clusterReconstructions[key].points);
+        }
+        if (this._clusterReconstructions[key].tiles.indexOf(hash) === -1) {
+            this._clusterReconstructions[key].tiles.push(hash);
+        }
+        if (!(hash in this._tileClusterReconstructions)) {
+            this._tileClusterReconstructions[hash] = {
+                keys: [],
+            };
+        }
+        if (this._tileClusterReconstructions[hash].keys.indexOf(key) === -1) {
+            this._tileClusterReconstructions[hash].keys.push(key);
+        }
+        this._needsRender = true;
     };
-    /**
-     * Disables the interaction.
-     *
-     * @example ```mouseComponent.<handler-name>.disable();```
-     */
-    MouseHandlerBase.prototype.disable = function () {
-        if (!this._enabled) {
+    SpatialDataScene.prototype.addNode = function (data, transform, originalPosition, hash) {
+        var key = data.key;
+        var clusterKey = data.clusterKey;
+        var sequenceKey = data.sequenceKey;
+        var connectedComponent = !!data.mergeCC ? data.mergeCC.toString() : "";
+        if (this.hasNode(key, hash)) {
             return;
         }
-        this._disable();
-        this._enabled = false;
-        if (this._component.activated) {
-            this._component.configure(this._getConfiguration(false));
+        if (!(hash in this._nodes)) {
+            this._nodes[hash] = {
+                cameraKeys: {},
+                cameras: new THREE.Object3D(),
+                clusters: {},
+                connectedComponents: {},
+                keys: [],
+                positions: new THREE.Object3D(),
+                sequences: {},
+            };
+            this._nodes[hash].cameras.visible = this._camerasVisible;
+            this._nodes[hash].positions.visible = this._positionsVisible;
+            this._scene.add(this._nodes[hash].cameras, this._nodes[hash].positions);
+        }
+        if (!(connectedComponent in this._nodes[hash].connectedComponents)) {
+            this._nodes[hash].connectedComponents[connectedComponent] = [];
+        }
+        if (!(clusterKey in this._nodes[hash].clusters)) {
+            this._nodes[hash].clusters[clusterKey] = [];
+        }
+        if (!(sequenceKey in this._nodes[hash].sequences)) {
+            this._nodes[hash].sequences[sequenceKey] = [];
+        }
+        var camera = this._createCamera(transform);
+        this._nodes[hash].cameras.add(camera);
+        for (var _i = 0, _a = camera.children; _i < _a.length; _i++) {
+            var child = _a[_i];
+            this._nodes[hash].cameraKeys[child.uuid] = key;
+            this._interactiveObjects.push(child);
+        }
+        this._nodes[hash].connectedComponents[connectedComponent].push(camera);
+        this._nodes[hash].clusters[clusterKey].push(camera);
+        this._nodes[hash].sequences[sequenceKey].push(camera);
+        var id = this._getId(clusterKey, connectedComponent, sequenceKey, this._cameraVisualizationMode);
+        var color = this._getColor(id, this._cameraVisualizationMode);
+        this._setCameraColor(color, camera);
+        this._nodes[hash].positions.add(this._createPosition(transform, originalPosition));
+        this._nodes[hash].keys.push(key);
+        this._needsRender = true;
+    };
+    SpatialDataScene.prototype.addTile = function (tileBBox, hash) {
+        if (this.hasTile(hash)) {
+            return;
         }
+        var sw = tileBBox[0];
+        var ne = tileBBox[1];
+        var geometry = new THREE.Geometry();
+        geometry.vertices.push(new THREE.Vector3().fromArray(sw), new THREE.Vector3(sw[0], ne[1], (sw[2] + ne[2]) / 2), new THREE.Vector3().fromArray(ne), new THREE.Vector3(ne[0], sw[1], (sw[2] + ne[2]) / 2), new THREE.Vector3().fromArray(sw));
+        var tile = new THREE.Line(geometry, new THREE.LineBasicMaterial());
+        this._tiles[hash] = new THREE.Object3D();
+        this._tiles[hash].visible = this._tilesVisible;
+        this._tiles[hash].add(tile);
+        this._scene.add(this._tiles[hash]);
+        this._needsRender = true;
     };
-    return MouseHandlerBase;
-}());
-exports.MouseHandlerBase = MouseHandlerBase;
-exports.default = MouseHandlerBase;
-
-},{}],274:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    SpatialDataScene.prototype.uncache = function (keepHashes) {
+        for (var _i = 0, _a = Object.keys(this._tileClusterReconstructions); _i < _a.length; _i++) {
+            var hash = _a[_i];
+            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
+                continue;
+            }
+            this._disposeReconstruction(hash);
+        }
+        for (var _b = 0, _c = Object.keys(this._nodes); _b < _c.length; _b++) {
+            var hash = _c[_b];
+            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
+                continue;
+            }
+            this._disposeNodes(hash);
+        }
+        for (var _d = 0, _e = Object.keys(this._tiles); _d < _e.length; _d++) {
+            var hash = _e[_d];
+            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
+                continue;
+            }
+            this._disposeTile(hash);
+        }
+        this._needsRender = true;
     };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Component_1 = require("../../Component");
-/**
- * The `ScrollZoomHandler` allows the user to zoom the viewer photo by scrolling.
- *
- * @example
- * ```
- * var mouseComponent = viewer.getComponent("mouse");
- *
- * mouseComponent.scrollZoom.disable();
- * mouseComponent.scrollZoom.enable();
- *
- * var isEnabled = mouseComponent.scrollZoom.isEnabled;
- * ```
- */
-var ScrollZoomHandler = (function (_super) {
-    __extends(ScrollZoomHandler, _super);
-    function ScrollZoomHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    ScrollZoomHandler.prototype._enable = function () {
-        var _this = this;
-        this._preventDefaultSubscription = this._container.mouseService.mouseWheel$
-            .subscribe(function (event) {
-            event.preventDefault();
-        });
-        this._zoomSubscription = this._container.mouseService
-            .filtered$(this._component.name, this._container.mouseService.mouseWheel$)
-            .withLatestFrom(this._navigator.stateService.currentState$, function (w, f) {
-            return [w, f];
-        })
-            .filter(function (args) {
-            var state = args[1].state;
-            return state.currentNode.fullPano || state.nodesAhead < 1;
-        })
-            .map(function (args) {
-            return args[0];
-        })
-            .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, function (w, r, t) {
-            return [w, r, t];
-        })
-            .subscribe(function (args) {
-            var event = args[0];
-            var render = args[1];
-            var transform = args[2];
-            var element = _this._container.element;
-            var _a = _this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1];
-            var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective);
-            var reference = transform.projectBasic(unprojected.toArray());
-            var deltaY = event.deltaY;
-            if (event.deltaMode === 1) {
-                deltaY = 40 * deltaY;
+    SpatialDataScene.prototype.hasClusterReconstruction = function (key, hash) {
+        return key in this._clusterReconstructions &&
+            this._clusterReconstructions[key].tiles.indexOf(hash) !== -1;
+    };
+    SpatialDataScene.prototype.hasTile = function (hash) {
+        return hash in this._tiles;
+    };
+    SpatialDataScene.prototype.hasNode = function (key, hash) {
+        return hash in this._nodes && this._nodes[hash].keys.indexOf(key) !== -1;
+    };
+    SpatialDataScene.prototype.intersectObjects = function (_a, camera) {
+        var viewportX = _a[0], viewportY = _a[1];
+        if (!this._camerasVisible) {
+            return null;
+        }
+        this._raycaster.setFromCamera(new THREE.Vector2(viewportX, viewportY), camera);
+        var intersects = this._raycaster.intersectObjects(this._interactiveObjects);
+        for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) {
+            var intersect = intersects_1[_i];
+            for (var hash in this._nodes) {
+                if (!this._nodes.hasOwnProperty(hash)) {
+                    continue;
+                }
+                if (intersect.object.uuid in this._nodes[hash].cameraKeys) {
+                    return this._nodes[hash].cameraKeys[intersect.object.uuid];
+                }
             }
-            else if (event.deltaMode === 2) {
-                deltaY = 800 * deltaY;
+        }
+        return null;
+    };
+    SpatialDataScene.prototype.setCameraVisibility = function (visible) {
+        if (visible === this._camerasVisible) {
+            return;
+        }
+        for (var hash in this._nodes) {
+            if (!this._nodes.hasOwnProperty(hash)) {
+                continue;
             }
-            var canvasSize = _this._viewportCoords.containerToCanvas(element);
-            var zoom = -3 * deltaY / canvasSize[1];
-            _this._navigator.stateService.zoomIn(zoom, reference);
-        });
+            this._nodes[hash].cameras.visible = visible;
+        }
+        this._camerasVisible = visible;
+        this._needsRender = true;
     };
-    ScrollZoomHandler.prototype._disable = function () {
-        this._preventDefaultSubscription.unsubscribe();
-        this._zoomSubscription.unsubscribe();
-        this._preventDefaultSubscription = null;
-        this._zoomSubscription = null;
+    SpatialDataScene.prototype.setPointVisibility = function (visible) {
+        if (visible === this._pointsVisible) {
+            return;
+        }
+        for (var key in this._clusterReconstructions) {
+            if (!this._clusterReconstructions.hasOwnProperty(key)) {
+                continue;
+            }
+            this._clusterReconstructions[key].points.visible = visible;
+        }
+        this._pointsVisible = visible;
+        this._needsRender = true;
     };
-    ScrollZoomHandler.prototype._getConfiguration = function (enable) {
-        return { scrollZoom: enable };
+    SpatialDataScene.prototype.setPositionVisibility = function (visible) {
+        if (visible === this._positionsVisible) {
+            return;
+        }
+        for (var hash in this._nodes) {
+            if (!this._nodes.hasOwnProperty(hash)) {
+                continue;
+            }
+            this._nodes[hash].positions.visible = visible;
+        }
+        this._positionsVisible = visible;
+        this._needsRender = true;
     };
-    return ScrollZoomHandler;
-}(Component_1.MouseHandlerBase));
-exports.ScrollZoomHandler = ScrollZoomHandler;
-exports.default = ScrollZoomHandler;
-
-},{"../../Component":226}],275:[function(require,module,exports){
-"use strict";
-/// <reference path="../../../typings/index.d.ts" />
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    SpatialDataScene.prototype.setTileVisibility = function (visible) {
+        if (visible === this._tilesVisible) {
+            return;
+        }
+        for (var hash in this._tiles) {
+            if (!this._tiles.hasOwnProperty(hash)) {
+                continue;
+            }
+            this._tiles[hash].visible = visible;
+        }
+        this._tilesVisible = visible;
+        this._needsRender = true;
     };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("rxjs/Observable");
-var Component_1 = require("../../Component");
-/**
- * The `TouchZoomHandler` allows the user to zoom the viewer photo by pinching on a touchscreen.
- *
- * @example
- * ```
- * var mouseComponent = viewer.getComponent("mouse");
- *
- * mouseComponent.touchZoom.disable();
- * mouseComponent.touchZoom.enable();
- *
- * var isEnabled = mouseComponent.touchZoom.isEnabled;
- * ```
- */
-var TouchZoomHandler = (function (_super) {
-    __extends(TouchZoomHandler, _super);
-    function TouchZoomHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    TouchZoomHandler.prototype._enable = function () {
-        var _this = this;
-        this._preventDefaultSubscription = this._container.touchService.pinch$
-            .subscribe(function (pinch) {
-            pinch.originalEvent.preventDefault();
-        });
-        var pinchStarted$ = this._container.touchService.pinchStart$
-            .map(function (event) {
-            return true;
+    SpatialDataScene.prototype.setCameraVisualizationMode = function (mode) {
+        if (mode === this._cameraVisualizationMode) {
+            return;
+        }
+        for (var hash in this._nodes) {
+            if (!this._nodes.hasOwnProperty(hash)) {
+                continue;
+            }
+            var cameras = undefined;
+            if (mode === CameraVisualizationMode_1.default.Cluster) {
+                cameras = this._nodes[hash].clusters;
+            }
+            else if (mode === CameraVisualizationMode_1.default.ConnectedComponent) {
+                cameras = this._nodes[hash].connectedComponents;
+            }
+            else if (mode === CameraVisualizationMode_1.default.Sequence) {
+                cameras = this._nodes[hash].sequences;
+            }
+            else {
+                for (var _i = 0, _a = this._nodes[hash].cameras.children; _i < _a.length; _i++) {
+                    var child = _a[_i];
+                    var color = this._getColor("", mode);
+                    this._setCameraColor(color, child);
+                }
+                continue;
+            }
+            for (var id in cameras) {
+                if (!cameras.hasOwnProperty(id)) {
+                    continue;
+                }
+                var color = this._getColor(id, mode);
+                for (var _b = 0, _c = cameras[id]; _b < _c.length; _b++) {
+                    var camera = _c[_b];
+                    this._setCameraColor(color, camera);
+                }
+            }
+        }
+        this._cameraVisualizationMode = mode;
+        this._needsRender = true;
+    };
+    SpatialDataScene.prototype.render = function (perspectiveCamera, renderer) {
+        renderer.render(this._scene, perspectiveCamera);
+        this._needsRender = false;
+    };
+    SpatialDataScene.prototype._arrayToFloatArray = function (a, columns) {
+        var n = a.length;
+        var f = new Float32Array(n * columns);
+        for (var i = 0; i < n; i++) {
+            var item = a[i];
+            var index = 3 * i;
+            f[index + 0] = item[0];
+            f[index + 1] = item[1];
+            f[index + 2] = item[2];
+        }
+        return f;
+    };
+    SpatialDataScene.prototype._createAxis = function (transform) {
+        var north = transform.unprojectBasic([0.5, 0], 0.22);
+        var south = transform.unprojectBasic([0.5, 1], 0.16);
+        var axis = new THREE.BufferGeometry();
+        axis.setAttribute("position", new THREE.BufferAttribute(this._arrayToFloatArray([north, south], 3), 3));
+        return new THREE.Line(axis, new THREE.LineBasicMaterial());
+    };
+    SpatialDataScene.prototype._createCamera = function (transform) {
+        return !!transform.gpano ?
+            this._createPanoCamera(transform) :
+            this._createPrespectiveCamera(transform);
+    };
+    SpatialDataScene.prototype._createDiagonals = function (transform, depth) {
+        var origin = transform.unprojectBasic([0, 0], 0, true);
+        var topLeft = transform.unprojectBasic([0, 0], depth, true);
+        var topRight = transform.unprojectBasic([1, 0], depth, true);
+        var bottomRight = transform.unprojectBasic([1, 1], depth, true);
+        var bottomLeft = transform.unprojectBasic([0, 1], depth, true);
+        var vertices = [
+            origin, topLeft,
+            origin, topRight,
+            origin, bottomRight,
+            origin, bottomLeft,
+        ];
+        var diagonals = new THREE.BufferGeometry();
+        diagonals.setAttribute("position", new THREE.BufferAttribute(this._arrayToFloatArray(vertices, 3), 3));
+        return new THREE.LineSegments(diagonals, new THREE.LineBasicMaterial());
+    };
+    SpatialDataScene.prototype._createFrame = function (transform, depth) {
+        var vertices2d = [];
+        vertices2d.push.apply(vertices2d, this._subsample([0, 1], [0, 0], 20));
+        vertices2d.push.apply(vertices2d, this._subsample([0, 0], [1, 0], 20));
+        vertices2d.push.apply(vertices2d, this._subsample([1, 0], [1, 1], 20));
+        var vertices3d = vertices2d
+            .map(function (basic) {
+            return transform.unprojectBasic(basic, depth, true);
         });
-        var pinchStopped$ = this._container.touchService.pinchEnd$
-            .map(function (event) {
-            return false;
+        var frame = new THREE.BufferGeometry();
+        frame.setAttribute("position", new THREE.BufferAttribute(this._arrayToFloatArray(vertices3d, 3), 3));
+        return new THREE.Line(frame, new THREE.LineBasicMaterial());
+    };
+    SpatialDataScene.prototype._createLatitude = function (basicY, numVertices, transform) {
+        var positions = new Float32Array((numVertices + 1) * 3);
+        for (var i = 0; i <= numVertices; i++) {
+            var position = transform.unprojectBasic([i / numVertices, basicY], 0.16);
+            var index = 3 * i;
+            positions[index + 0] = position[0];
+            positions[index + 1] = position[1];
+            positions[index + 2] = position[2];
+        }
+        var latitude = new THREE.BufferGeometry();
+        latitude.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        return new THREE.Line(latitude, new THREE.LineBasicMaterial());
+    };
+    SpatialDataScene.prototype._createLongitude = function (basicX, numVertices, transform) {
+        var positions = new Float32Array((numVertices + 1) * 3);
+        for (var i = 0; i <= numVertices; i++) {
+            var position = transform.unprojectBasic([basicX, i / numVertices], 0.16);
+            var index = 3 * i;
+            positions[index + 0] = position[0];
+            positions[index + 1] = position[1];
+            positions[index + 2] = position[2];
+        }
+        var latitude = new THREE.BufferGeometry();
+        latitude.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        return new THREE.Line(latitude, new THREE.LineBasicMaterial());
+    };
+    SpatialDataScene.prototype._createPanoCamera = function (transform) {
+        var camera = new THREE.Object3D();
+        camera.children.push(this._createAxis(transform));
+        camera.children.push(this._createLatitude(0.5, 10, transform));
+        camera.children.push(this._createLongitude(0, 6, transform));
+        camera.children.push(this._createLongitude(0.25, 6, transform));
+        camera.children.push(this._createLongitude(0.5, 6, transform));
+        camera.children.push(this._createLongitude(0.75, 6, transform));
+        return camera;
+    };
+    SpatialDataScene.prototype._createClusterPoints = function (reconstruction, translation) {
+        var points = Object
+            .keys(reconstruction.points)
+            .map(function (key) {
+            return reconstruction.points[key];
         });
-        this._activeSubscription = Observable_1.Observable
-            .merge(pinchStarted$, pinchStopped$)
-            .subscribe(this._container.touchService.activate$);
-        this._zoomSubscription = this._container.touchService.pinch$
-            .withLatestFrom(this._navigator.stateService.currentState$)
-            .filter(function (args) {
-            var state = args[1].state;
-            return state.currentNode.fullPano || state.nodesAhead < 1;
-        })
-            .map(function (args) {
-            return args[0];
-        })
-            .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$)
-            .subscribe(function (_a) {
-            var pinch = _a[0], render = _a[1], transform = _a[2];
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.canvasPosition(pinch, element), canvasX = _b[0], canvasY = _b[1];
-            var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective);
-            var reference = transform.projectBasic(unprojected.toArray());
-            var _c = _this._viewportCoords.containerToCanvas(element), canvasWidth = _c[0], canvasHeight = _c[1];
-            var zoom = 3 * pinch.distanceChange / Math.min(canvasWidth, canvasHeight);
-            _this._navigator.stateService.zoomIn(zoom, reference);
+        var numPoints = points.length;
+        var positions = new Float32Array(numPoints * 3);
+        var colors = new Float32Array(numPoints * 3);
+        for (var i = 0; i < numPoints; i++) {
+            var index = 3 * i;
+            var coords = points[i].coordinates;
+            var point = new THREE.Vector3(coords[0], coords[1], coords[2])
+                .add(new THREE.Vector3().fromArray(translation));
+            positions[index + 0] = point.x;
+            positions[index + 1] = point.y;
+            positions[index + 2] = point.z;
+            var color = points[i].color;
+            colors[index + 0] = color[0] / 255.0;
+            colors[index + 1] = color[1] / 255.0;
+            colors[index + 2] = color[2] / 255.0;
+        }
+        var geometry = new THREE.BufferGeometry();
+        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        geometry.setAttribute("color", new THREE.BufferAttribute(colors, 3));
+        var material = new THREE.PointsMaterial({
+            size: 0.1,
+            vertexColors: true,
         });
+        return new THREE.Points(geometry, material);
     };
-    TouchZoomHandler.prototype._disable = function () {
-        this._activeSubscription.unsubscribe();
-        this._preventDefaultSubscription.unsubscribe();
-        this._zoomSubscription.unsubscribe();
-        this._preventDefaultSubscription = null;
-        this._zoomSubscription = null;
+    SpatialDataScene.prototype._createPosition = function (transform, originalPosition) {
+        var computedPosition = transform.unprojectBasic([0, 0], 0);
+        var vertices = [originalPosition, computedPosition];
+        var geometry = new THREE.BufferGeometry();
+        geometry.setAttribute("position", new THREE.BufferAttribute(this._arrayToFloatArray(vertices, 3), 3));
+        return new THREE.Line(geometry, new THREE.LineBasicMaterial({ color: new THREE.Color(1, 0, 0) }));
+    };
+    SpatialDataScene.prototype._createPrespectiveCamera = function (transform) {
+        var depth = 0.2;
+        var camera = new THREE.Object3D();
+        camera.children.push(this._createDiagonals(transform, depth));
+        camera.children.push(this._createFrame(transform, depth));
+        return camera;
     };
-    TouchZoomHandler.prototype._getConfiguration = function (enable) {
-        return { touchZoom: enable };
+    SpatialDataScene.prototype._disposeCameras = function (hash) {
+        var tileCameras = this._nodes[hash].cameras;
+        for (var _i = 0, _a = tileCameras.children.slice(); _i < _a.length; _i++) {
+            var camera = _a[_i];
+            for (var _b = 0, _c = camera.children; _b < _c.length; _b++) {
+                var child = _c[_b];
+                child.geometry.dispose();
+                child.material.dispose();
+                var index = this._interactiveObjects.indexOf(child);
+                if (index !== -1) {
+                    this._interactiveObjects.splice(index, 1);
+                }
+                else {
+                    console.warn("Object does not exist (" + child.id + ") for " + hash);
+                }
+            }
+            tileCameras.remove(camera);
+        }
+        this._scene.remove(tileCameras);
     };
-    return TouchZoomHandler;
-}(Component_1.MouseHandlerBase));
-exports.TouchZoomHandler = TouchZoomHandler;
-exports.default = TouchZoomHandler;
+    SpatialDataScene.prototype._disposePoints = function (hash) {
+        for (var _i = 0, _a = this._tileClusterReconstructions[hash].keys; _i < _a.length; _i++) {
+            var key = _a[_i];
+            if (!(key in this._clusterReconstructions)) {
+                continue;
+            }
+            var index = this._clusterReconstructions[key].tiles.indexOf(hash);
+            if (index === -1) {
+                continue;
+            }
+            this._clusterReconstructions[key].tiles.splice(index, 1);
+            if (this._clusterReconstructions[key].tiles.length > 0) {
+                continue;
+            }
+            for (var _b = 0, _c = this._clusterReconstructions[key].points.children.slice(); _b < _c.length; _b++) {
+                var points = _c[_b];
+                points.geometry.dispose();
+                points.material.dispose();
+            }
+            this._scene.remove(this._clusterReconstructions[key].points);
+            delete this._clusterReconstructions[key];
+        }
+    };
+    SpatialDataScene.prototype._disposePositions = function (hash) {
+        var tilePositions = this._nodes[hash].positions;
+        for (var _i = 0, _a = tilePositions.children.slice(); _i < _a.length; _i++) {
+            var position = _a[_i];
+            position.geometry.dispose();
+            position.material.dispose();
+            tilePositions.remove(position);
+        }
+        this._scene.remove(tilePositions);
+    };
+    SpatialDataScene.prototype._disposeNodes = function (hash) {
+        this._disposeCameras(hash);
+        this._disposePositions(hash);
+        delete this._nodes[hash];
+    };
+    SpatialDataScene.prototype._disposeReconstruction = function (hash) {
+        this._disposePoints(hash);
+        delete this._tileClusterReconstructions[hash];
+    };
+    SpatialDataScene.prototype._disposeTile = function (hash) {
+        var tile = this._tiles[hash];
+        for (var _i = 0, _a = tile.children.slice(); _i < _a.length; _i++) {
+            var line = _a[_i];
+            line.geometry.dispose();
+            line.material.dispose();
+            tile.remove(line);
+        }
+        this._scene.remove(tile);
+        delete this._tiles[hash];
+    };
+    SpatialDataScene.prototype._getColor = function (id, mode) {
+        return mode !== CameraVisualizationMode_1.default.Default && id.length > 0 ?
+            this._getCameraColor(id) :
+            "#FFFFFF";
+    };
+    SpatialDataScene.prototype._getCameraColor = function (id) {
+        if (!(id in this._cameraColors)) {
+            this._cameraColors[id] = this._randomColor();
+        }
+        return this._cameraColors[id];
+    };
+    SpatialDataScene.prototype._getId = function (clusterKey, connectedComponent, sequenceKey, mode) {
+        switch (mode) {
+            case CameraVisualizationMode_1.default.Cluster:
+                return clusterKey;
+            case CameraVisualizationMode_1.default.ConnectedComponent:
+                return connectedComponent;
+            case CameraVisualizationMode_1.default.Sequence:
+                return sequenceKey;
+            default:
+                return "";
+        }
+    };
+    SpatialDataScene.prototype._interpolate = function (a, b, alpha) {
+        return a + alpha * (b - a);
+    };
+    SpatialDataScene.prototype._randomColor = function () {
+        return "hsl(" + Math.floor(360 * Math.random()) + ", 100%, 65%)";
+    };
+    SpatialDataScene.prototype._setCameraColor = function (color, camera) {
+        for (var _i = 0, _a = camera.children; _i < _a.length; _i++) {
+            var child = _a[_i];
+            child.material.color = new THREE.Color(color);
+        }
+    };
+    SpatialDataScene.prototype._subsample = function (p1, p2, subsamples) {
+        if (subsamples < 1) {
+            return [p1, p2];
+        }
+        var samples = [];
+        for (var i = 0; i <= subsamples + 1; i++) {
+            var p = [];
+            for (var j = 0; j < 3; j++) {
+                p.push(this._interpolate(p1[j], p2[j], i / (subsamples + 1)));
+            }
+            samples.push(p);
+        }
+        return samples;
+    };
+    return SpatialDataScene;
+}());
+exports.SpatialDataScene = SpatialDataScene;
+exports.default = SpatialDataScene;
 
-},{"../../Component":226,"rxjs/Observable":29}],276:[function(require,module,exports){
+},{"./CameraVisualizationMode":360,"three":242}],365:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var Popup_1 = require("./popup/Popup");
-exports.Popup = Popup_1.Popup;
-var PopupComponent_1 = require("./PopupComponent");
-exports.PopupComponent = PopupComponent_1.PopupComponent;
 
-},{"./PopupComponent":277,"./popup/Popup":278}],277:[function(require,module,exports){
+},{}],366:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var GeometryTagError_1 = require("./error/GeometryTagError");
+Object.defineProperty(exports, "GeometryTagError", { enumerable: true, get: function () { return GeometryTagError_1.GeometryTagError; } });
+var PointGeometry_1 = require("./geometry/PointGeometry");
+Object.defineProperty(exports, "PointGeometry", { enumerable: true, get: function () { return PointGeometry_1.PointGeometry; } });
+var PointsGeometry_1 = require("./geometry/PointsGeometry");
+Object.defineProperty(exports, "PointsGeometry", { enumerable: true, get: function () { return PointsGeometry_1.PointsGeometry; } });
+var RectGeometry_1 = require("./geometry/RectGeometry");
+Object.defineProperty(exports, "RectGeometry", { enumerable: true, get: function () { return RectGeometry_1.RectGeometry; } });
+var PolygonGeometry_1 = require("./geometry/PolygonGeometry");
+Object.defineProperty(exports, "PolygonGeometry", { enumerable: true, get: function () { return PolygonGeometry_1.PolygonGeometry; } });
+var OutlineTag_1 = require("./tag/OutlineTag");
+Object.defineProperty(exports, "OutlineTag", { enumerable: true, get: function () { return OutlineTag_1.OutlineTag; } });
+var ExtremePointTag_1 = require("./tag/ExtremePointTag");
+Object.defineProperty(exports, "ExtremePointTag", { enumerable: true, get: function () { return ExtremePointTag_1.ExtremePointTag; } });
+var SpotTag_1 = require("./tag/SpotTag");
+Object.defineProperty(exports, "SpotTag", { enumerable: true, get: function () { return SpotTag_1.SpotTag; } });
+var TagDomain_1 = require("./tag/TagDomain");
+Object.defineProperty(exports, "TagDomain", { enumerable: true, get: function () { return TagDomain_1.TagDomain; } });
+var TagComponent_1 = require("./TagComponent");
+Object.defineProperty(exports, "TagComponent", { enumerable: true, get: function () { return TagComponent_1.TagComponent; } });
+var TagMode_1 = require("./TagMode");
+Object.defineProperty(exports, "TagMode", { enumerable: true, get: function () { return TagMode_1.TagMode; } });
+
+},{"./TagComponent":367,"./TagMode":370,"./error/GeometryTagError":374,"./geometry/PointGeometry":376,"./geometry/PointsGeometry":377,"./geometry/PolygonGeometry":378,"./geometry/RectGeometry":379,"./tag/ExtremePointTag":394,"./tag/OutlineTag":398,"./tag/SpotTag":401,"./tag/TagDomain":403}],367:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -25829,26 +39351,39 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
+exports.TagComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var when = require("when");
 var Component_1 = require("../../Component");
+var Geo_1 = require("../../Geo");
+var Render_1 = require("../../Render");
 /**
- * @class PopupComponent
+ * @class TagComponent
  *
- * @classdesc Component for showing HTML popup objects.
+ * @classdesc Component for showing and editing tags with different
+ * geometries composed from 2D basic image coordinates (see the
+ * {@link Viewer} class documentation for more information about coordinate
+ * systems).
  *
- * The `add` method is used for adding new popups. Popups are removed by reference.
+ * The `add` method is used for adding new tags or replacing
+ * tags already in the set. Tags are removed by id.
  *
- * It is not possible to update popups in the set by updating any properties
- * directly on the popup object. Popups need to be replaced by
- * removing them and creating new ones with relevant changed properties and
- * adding those instead.
+ * If a tag already in the set has the same
+ * id as one of the tags added, the old tag will be removed and
+ * the added tag will take its place.
  *
- * Popups are only relevant to a single image because they are based on
- * 2D basic image coordinates. Popups related to a certain image should
+ * The tag component mode can be set to either be non interactive or
+ * to be in creating mode of a certain geometry type.
+ *
+ * The tag properties can be updated at any time and the change will
+ * be visibile immediately.
+ *
+ * Tags are only relevant to a single image because they are based on
+ * 2D basic image coordinates. Tags related to a certain image should
  * be removed when the viewer is moved to another node.
  *
- * To retrive and use the popup component
+ * To retrive and use the tag component
  *
  * @example
  * ```
@@ -25856,611 +39391,1052 @@ var Component_1 = require("../../Component");
  *     "<element-id>",
  *     "<client-id>",
  *     "<my key>",
- *     { component: { popup: true } });
+ *     { component: { tag: true } });
  *
- * var popupComponent = viewer.getComponent("popup");
+ * var tagComponent = viewer.getComponent("tag");
  * ```
  */
-var PopupComponent = (function (_super) {
-    __extends(PopupComponent, _super);
-    function PopupComponent(name, container, navigator) {
+var TagComponent = /** @class */ (function (_super) {
+    __extends(TagComponent, _super);
+    /** @ignore */
+    function TagComponent(name, container, navigator) {
         var _this = _super.call(this, name, container, navigator) || this;
-        _this._popups = [];
-        _this._added$ = new Subject_1.Subject();
-        _this._popups$ = new Subject_1.Subject();
+        _this._tagDomRenderer = new Component_1.TagDOMRenderer();
+        _this._tagScene = new Component_1.TagScene();
+        _this._tagSet = new Component_1.TagSet();
+        _this._tagCreator = new Component_1.TagCreator(_this, navigator);
+        _this._viewportCoords = new Geo_1.ViewportCoords();
+        _this._createHandlers = {
+            "CreatePoint": new Component_1.CreatePointHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
+            "CreatePoints": new Component_1.CreatePointsHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
+            "CreatePolygon": new Component_1.CreatePolygonHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
+            "CreateRect": new Component_1.CreateRectHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
+            "CreateRectDrag": new Component_1.CreateRectDragHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
+            "Default": undefined,
+        };
+        _this._editVertexHandler = new Component_1.EditVertexHandler(_this, container, navigator, _this._viewportCoords, _this._tagSet);
+        _this._renderTags$ = _this._tagSet.changed$.pipe(operators_1.map(function (tagSet) {
+            var tags = tagSet.getAll();
+            // ensure that tags are always rendered in the same order
+            // to avoid hover tracking problems on first resize.
+            tags.sort(function (t1, t2) {
+                var id1 = t1.tag.id;
+                var id2 = t2.tag.id;
+                if (id1 < id2) {
+                    return -1;
+                }
+                if (id1 > id2) {
+                    return 1;
+                }
+                return 0;
+            });
+            return tags;
+        }), operators_1.share());
+        _this._tagChanged$ = _this._renderTags$.pipe(operators_1.switchMap(function (tags) {
+            return rxjs_1.from(tags).pipe(operators_1.mergeMap(function (tag) {
+                return rxjs_1.merge(tag.tag.changed$, tag.tag.geometryChanged$);
+            }));
+        }), operators_1.share());
+        _this._renderTagGLChanged$ = _this._renderTags$.pipe(operators_1.switchMap(function (tags) {
+            return rxjs_1.from(tags).pipe(operators_1.mergeMap(function (tag) {
+                return tag.glObjectsChanged$;
+            }));
+        }), operators_1.share());
+        _this._createGeometryChanged$ = _this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return tag != null ?
+                tag.geometryChanged$ :
+                rxjs_1.empty();
+        }), operators_1.share());
+        _this._createGLObjectsChanged$ = _this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return tag != null ?
+                tag.glObjectsChanged$ :
+                rxjs_1.empty();
+        }), operators_1.share());
+        _this._creatingConfiguration$ = _this._configuration$.pipe(operators_1.distinctUntilChanged(function (c1, c2) {
+            return c1.mode === c2.mode;
+        }, function (configuration) {
+            return {
+                createColor: configuration.createColor,
+                mode: configuration.mode,
+            };
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        _this._creatingConfiguration$
+            .subscribe(function (configuration) {
+            _this.fire(TagComponent.modechanged, configuration.mode);
+        });
         return _this;
     }
     /**
-     * Add popups to the popups set.
+     * Add tags to the tag set or replace tags in the tag set.
      *
-     * @description Adding a new popup never replaces an old one
-     * because they are stored by reference. Adding an already
-     * existing popup has no effect.
+     * @description If a tag already in the set has the same
+     * id as one of the tags added, the old tag will be removed
+     * the added tag will take its place.
      *
-     * @param {Array<Popup>} popups - Popups to add.
+     * @param {Array<Tag>} tags - Tags to add.
      *
-     * @example ```popupComponent.add([popup1, popup2]);```
+     * @example ```tagComponent.add([tag1, tag2]);```
      */
-    PopupComponent.prototype.add = function (popups) {
-        for (var _i = 0, popups_1 = popups; _i < popups_1.length; _i++) {
-            var popup = popups_1[_i];
-            if (this._popups.indexOf(popup) !== -1) {
-                continue;
-            }
-            this._popups.push(popup);
-            if (this._activated) {
-                popup.setParentContainer(this._popupContainer);
-            }
+    TagComponent.prototype.add = function (tags) {
+        var _this = this;
+        if (this._activated) {
+            this._navigator.stateService.currentTransform$.pipe(operators_1.first())
+                .subscribe(function (transform) {
+                _this._tagSet.add(tags, transform);
+                var renderTags = tags
+                    .map(function (tag) {
+                    return _this._tagSet.get(tag.id);
+                });
+                _this._tagScene.add(renderTags);
+            });
+        }
+        else {
+            this._tagSet.addDeactivated(tags);
         }
-        this._added$.next(popups);
-        this._popups$.next(this._popups);
     };
     /**
-     * Returns an array of all popups.
+     * Calculate the smallest rectangle containing all the points
+     * in the points geometry.
      *
-     * @example ```var popups = popupComponent.getAll();```
+     * @description The result may be different depending on if the
+     * current node is an equirectangular panorama or not. If the
+     * current node is an equirectangular panorama the rectangle may
+     * wrap the horizontal border of the image.
+     *
+     * @returns {Promise<Array<number>>} Promise to the rectangle
+     * on the format specified for the {@link RectGeometry} in basic
+     * coordinates.
      */
-    PopupComponent.prototype.getAll = function () {
-        return this._popups.slice();
+    TagComponent.prototype.calculateRect = function (geometry) {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            _this._navigator.stateService.currentTransform$.pipe(operators_1.first(), operators_1.map(function (transform) {
+                return geometry.getRect2d(transform);
+            }))
+                .subscribe(function (rect) {
+                resolve(rect);
+            }, function (error) {
+                reject(error);
+            });
+        });
     };
     /**
-     * Remove popups based on reference from the popup set.
+     * Force the creation of a geometry programatically using its
+     * current vertices.
      *
-     * @param {Array<Popup>} popups - Popups to remove.
+     * @description The method only has an effect when the tag
+     * mode is either of the following modes:
      *
-     * @example ```popupComponent.remove([popup1, popup2]);```
+     * TagMode.CreatePoints
+     * TagMode.CreatePolygon
+     * TagMode.CreateRect
+     * TagMode.CreateRectDrag
+     *
+     * In the case of points or polygon creation, only the created
+     * vertices are used, i.e. the mouse position is disregarded.
+     *
+     * In the case of rectangle creation the position of the mouse
+     * at the time of the method call is used as one of the vertices
+     * defining the rectangle.
+     *
+     * @fires TagComponent.geometrycreated
+     *
+     * @example
+     * ```
+     * tagComponent.on("geometrycreated", function(geometry) {
+     *     console.log(geometry);
+     * });
+     *
+     * tagComponent.create();
+     * ```
      */
-    PopupComponent.prototype.remove = function (popups) {
-        for (var _i = 0, popups_2 = popups; _i < popups_2.length; _i++) {
-            var popup = popups_2[_i];
-            this._remove(popup);
+    TagComponent.prototype.create = function () {
+        this._tagCreator.replayedTag$.pipe(operators_1.first(), operators_1.filter(function (tag) {
+            return !!tag;
+        }))
+            .subscribe(function (tag) {
+            tag.create();
+        });
+    };
+    /**
+     * Change the current tag mode.
+     *
+     * @description Change the tag mode to one of the create modes for creating new geometries.
+     *
+     * @param {TagMode} mode - New tag mode.
+     *
+     * @fires TagComponent#modechanged
+     *
+     * @example ```tagComponent.changeMode(Mapillary.TagComponent.TagMode.CreateRect);```
+     */
+    TagComponent.prototype.changeMode = function (mode) {
+        this.configure({ mode: mode });
+    };
+    /**
+     * Returns the tag in the tag set with the specified id, or
+     * undefined if the id matches no tag.
+     *
+     * @param {string} tagId - Id of the tag.
+     *
+     * @example ```var tag = tagComponent.get("tagId");```
+     */
+    TagComponent.prototype.get = function (tagId) {
+        if (this._activated) {
+            var renderTag = this._tagSet.get(tagId);
+            return renderTag !== undefined ? renderTag.tag : undefined;
+        }
+        else {
+            return this._tagSet.getDeactivated(tagId);
         }
-        this._popups$.next(this._popups);
     };
     /**
-     * Remove all popups from the popup set.
+     * Returns an array of all tags.
      *
-     * @example ```popupComponent.removeAll();```
+     * @example ```var tags = tagComponent.getAll();```
      */
-    PopupComponent.prototype.removeAll = function () {
-        for (var _i = 0, _a = this._popups.slice(); _i < _a.length; _i++) {
-            var popup = _a[_i];
-            this._remove(popup);
+    TagComponent.prototype.getAll = function () {
+        if (this.activated) {
+            return this._tagSet
+                .getAll()
+                .map(function (renderTag) {
+                return renderTag.tag;
+            });
+        }
+        else {
+            return this._tagSet.getAllDeactivated();
         }
-        this._popups$.next(this._popups);
     };
-    PopupComponent.prototype._activate = function () {
+    /**
+     * Returns an array of tag ids for tags that contain the specified point.
+     *
+     * @description The pixel point must lie inside the polygon or rectangle
+     * of an added tag for the tag id to be returned. Tag ids for
+     * tags that do not have a fill will also be returned if the point is inside
+     * the geometry of the tag. Tags with point geometries can not be retrieved.
+     *
+     * No tag ids will be returned for polygons rendered in cropped panoramas or
+     * rectangles rendered in panoramas.
+     *
+     * Notice that the pixelPoint argument requires x, y coordinates from pixel space.
+     *
+     * With this function, you can use the coordinates provided by mouse
+     * events to get information out of the tag component.
+     *
+     * If no tag at exist the pixel point, an empty array will be returned.
+     *
+     * @param {Array<number>} pixelPoint - Pixel coordinates on the viewer element.
+     * @returns {Promise<Array<string>>} Promise to the ids of the tags that
+     * contain the specified pixel point.
+     *
+     * @example
+     * ```
+     * tagComponent.getTagIdsAt([100, 100])
+     *     .then((tagIds) => { console.log(tagIds); });
+     * ```
+     */
+    TagComponent.prototype.getTagIdsAt = function (pixelPoint) {
         var _this = this;
-        this._popupContainer = document.createElement("div");
-        this._popupContainer.className = "mapillary-js-popup-container";
-        this._container.element.appendChild(this._popupContainer);
-        for (var _i = 0, _a = this._popups; _i < _a.length; _i++) {
-            var popup = _a[_i];
-            popup.setParentContainer(this._popupContainer);
-        }
-        this._updateAllSubscription = Observable_1.Observable
-            .combineLatest(this._container.renderService.renderCamera$, this._container.renderService.size$, this._navigator.stateService.currentTransform$)
-            .subscribe(function (_a) {
-            var renderCamera = _a[0], size = _a[1], transform = _a[2];
-            for (var _i = 0, _b = _this._popups; _i < _b.length; _i++) {
-                var popup = _b[_i];
-                popup.update(renderCamera, size, transform);
-            }
-        });
-        var changed$ = this._popups$
-            .startWith(this._popups)
-            .switchMap(function (popups) {
-            return Observable_1.Observable
-                .from(popups)
-                .mergeMap(function (popup) {
-                return popup.changed$;
+        return when.promise(function (resolve, reject) {
+            _this._container.renderService.renderCamera$.pipe(operators_1.first(), operators_1.map(function (render) {
+                var viewport = _this._viewportCoords
+                    .canvasToViewport(pixelPoint[0], pixelPoint[1], _this._container.element);
+                var ids = _this._tagScene.intersectObjects(viewport, render.perspective);
+                return ids;
+            }))
+                .subscribe(function (ids) {
+                resolve(ids);
+            }, function (error) {
+                reject(error);
             });
-        })
-            .map(function (popup) {
-            return [popup];
-        });
-        this._updateAddedChangedSubscription = this._added$
-            .merge(changed$)
-            .withLatestFrom(this._container.renderService.renderCamera$, this._container.renderService.size$, this._navigator.stateService.currentTransform$)
-            .subscribe(function (_a) {
-            var popups = _a[0], renderCamera = _a[1], size = _a[2], transform = _a[3];
-            for (var _i = 0, popups_3 = popups; _i < popups_3.length; _i++) {
-                var popup = popups_3[_i];
-                popup.update(renderCamera, size, transform);
-            }
         });
     };
-    PopupComponent.prototype._deactivate = function () {
-        this._updateAllSubscription.unsubscribe();
-        this._updateAddedChangedSubscription.unsubscribe();
-        for (var _i = 0, _a = this._popups; _i < _a.length; _i++) {
-            var popup = _a[_i];
-            popup.remove();
-        }
-        this._container.element.removeChild(this._popupContainer);
-        delete this._popupContainer;
-    };
-    PopupComponent.prototype._getDefaultConfiguration = function () {
-        return {};
+    /**
+     * Check if a tag exist in the tag set.
+     *
+     * @param {string} tagId - Id of the tag.
+     *
+     * @example ```var tagExists = tagComponent.has("tagId");```
+     */
+    TagComponent.prototype.has = function (tagId) {
+        return this._activated ? this._tagSet.has(tagId) : this._tagSet.hasDeactivated(tagId);
     };
-    PopupComponent.prototype._remove = function (popup) {
-        var index = this._popups.indexOf(popup);
-        if (index === -1) {
-            return;
-        }
-        var removed = this._popups.splice(index, 1)[0];
+    /**
+     * Remove tags with the specified ids from the tag set.
+     *
+     * @param {Array<string>} tagIds - Ids for tags to remove.
+     *
+     * @example ```tagComponent.remove(["id-1", "id-2"]);```
+     */
+    TagComponent.prototype.remove = function (tagIds) {
         if (this._activated) {
-            removed.remove();
+            this._tagSet.remove(tagIds);
+            this._tagScene.remove(tagIds);
         }
-    };
-    PopupComponent.componentName = "popup";
-    return PopupComponent;
-}(Component_1.Component));
-exports.PopupComponent = PopupComponent;
-Component_1.ComponentService.register(PopupComponent);
-exports.default = PopupComponent;
-
-},{"../../Component":226,"rxjs/Observable":29,"rxjs/Subject":34}],278:[function(require,module,exports){
-"use strict";
-/// <reference path="../../../../typings/index.d.ts" />
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("rxjs/Subject");
-var Geo_1 = require("../../../Geo");
-var Viewer_1 = require("../../../Viewer");
-/**
- * @class Popup
- *
- * @classdesc Popup instance for rendering custom HTML content
- * on top of images. Popups are based on 2D basic image coordinates
- * (see the {@link Viewer} class documentation for more information about coordinate
- * systems) and a certain popup is therefore only relevant to a single image.
- * Popups related to a certain image should be removed when moving
- * to another image.
- *
- * A popup must have both its content and its point or rect set to be
- * rendered. Popup options can not be updated after creation but the
- * basic point or rect as well as its content can be changed by calling
- * the appropriate methods.
- *
- * To create and add one `Popup` with default configuration
- * (tooltip visuals and automatic float) and one with specific options
- * use
- *
- * @example
- * ```
- * var defaultSpan = document.createElement('span');
- * defaultSpan.innerHTML = 'hello default';
- *
- * var defaultPopup = new Mapillary.PopupComponent.Popup();
- * defaultPopup.setDOMContent(defaultSpan);
- * defaultPopup.setBasicPoint([0.3, 0.3]);
- *
- * var cleanSpan = document.createElement('span');
- * cleanSpan.innerHTML = 'hello clean';
- *
- * var cleanPopup = new Mapillary.PopupComponent.Popup({
- *     clean: true,
- *     float: Mapillary.Alignment.Top,
- *     offset: 10,
- *     opacity: 0.7,
- * });
- *
- * cleanPopup.setDOMContent(cleanSpan);
- * cleanPopup.setBasicPoint([0.6, 0.6]);
- *
- * popupComponent.add([defaultPopup, cleanPopup]);
- * ```
- *
- * @description Implementation of API methods and API documentation inspired
- * by/used from https://github.com/mapbox/mapbox-gl-js/blob/v0.38.0/src/ui/popup.js
- */
-var Popup = (function () {
-    function Popup(options, viewportCoords) {
-        this._options = {};
-        if (!!options) {
-            this._options.clean = options.clean;
-            this._options.float = options.float;
-            this._options.offset = options.offset;
-            this._options.opacity = options.opacity;
-            this._options.position = options.position;
+        else {
+            this._tagSet.removeDeactivated(tagIds);
         }
-        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
-        this._notifyChanged$ = new Subject_1.Subject();
-    }
-    Object.defineProperty(Popup.prototype, "changed$", {
-        /**
-         * @ignore
-         *
-         * @description Internal observable used by the component to
-         * render the popup when its position or content has changed.
-         */
-        get: function () {
-            return this._notifyChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
+    };
     /**
-     * @ignore
+     * Remove all tags from the tag set.
      *
-     * @description Internal method used by the component to
-     * remove all references to the popup.
+     * @example ```tagComponent.removeAll();```
      */
-    Popup.prototype.remove = function () {
-        if (this._content && this._content.parentNode) {
-            this._content.parentNode.removeChild(this._content);
+    TagComponent.prototype.removeAll = function () {
+        if (this._activated) {
+            this._tagSet.removeAll();
+            this._tagScene.removeAll();
         }
-        if (this._container) {
-            this._container.parentNode.removeChild(this._container);
-            delete this._container;
+        else {
+            this._tagSet.removeAllDeactivated();
         }
-        if (this._parentContainer) {
-            delete this._parentContainer;
+    };
+    TagComponent.prototype._activate = function () {
+        var _this = this;
+        this._editVertexHandler.enable();
+        var handlerGeometryCreated$ = rxjs_1.from(Object.keys(this._createHandlers)).pipe(operators_1.map(function (key) {
+            return _this._createHandlers[key];
+        }), operators_1.filter(function (handler) {
+            return !!handler;
+        }), operators_1.mergeMap(function (handler) {
+            return handler.geometryCreated$;
+        }), operators_1.share());
+        this._fireGeometryCreatedSubscription = handlerGeometryCreated$
+            .subscribe(function (geometry) {
+            _this.fire(TagComponent.geometrycreated, geometry);
+        });
+        this._fireCreateGeometryEventSubscription = this._tagCreator.tag$.pipe(operators_1.skipWhile(function (tag) {
+            return tag == null;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (tag) {
+            var eventType = tag != null ?
+                TagComponent.creategeometrystart :
+                TagComponent.creategeometryend;
+            _this.fire(eventType, _this);
+        });
+        this._handlerStopCreateSubscription = handlerGeometryCreated$
+            .subscribe(function () {
+            _this.changeMode(Component_1.TagMode.Default);
+        });
+        this._handlerEnablerSubscription = this._creatingConfiguration$
+            .subscribe(function (configuration) {
+            _this._disableCreateHandlers();
+            var mode = Component_1.TagMode[configuration.mode];
+            var handler = _this._createHandlers[mode];
+            if (!!handler) {
+                handler.enable();
+            }
+        });
+        this._fireTagsChangedSubscription = this._renderTags$
+            .subscribe(function () {
+            _this.fire(TagComponent.tagschanged, _this);
+        });
+        this._stopCreateSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return tag != null ?
+                tag.aborted$.pipe(operators_1.map(function () { return null; })) :
+                rxjs_1.empty();
+        }))
+            .subscribe(function () { _this.changeMode(Component_1.TagMode.Default); });
+        this._setGLCreateTagSubscription = this._tagCreator.tag$
+            .subscribe(function (tag) {
+            if (_this._tagScene.hasCreateTag()) {
+                _this._tagScene.removeCreateTag();
+            }
+            if (tag != null) {
+                _this._tagScene.addCreateTag(tag);
+            }
+        });
+        this._createGLObjectsChangedSubscription = this._createGLObjectsChanged$
+            .subscribe(function (tag) {
+            _this._tagScene.updateCreateTagObjects(tag);
+        });
+        this._updateGLObjectsSubscription = this._renderTagGLChanged$
+            .subscribe(function (tag) {
+            _this._tagScene.updateObjects(tag);
+        });
+        this._updateTagSceneSubscription = this._tagChanged$
+            .subscribe(function () {
+            _this._tagScene.update();
+        });
+        this._domSubscription = rxjs_1.combineLatest(this._renderTags$.pipe(operators_1.startWith([]), operators_1.tap(function () {
+            _this._container.domRenderer.render$.next({
+                name: _this._name,
+                vnode: _this._tagDomRenderer.clear(),
+            });
+        })), this._container.renderService.renderCamera$, this._container.spriteService.spriteAtlas$, this._container.renderService.size$, this._tagChanged$.pipe(operators_1.startWith(null)), rxjs_1.merge(this._tagCreator.tag$, this._createGeometryChanged$).pipe(operators_1.startWith(null))).pipe(operators_1.map(function (_a) {
+            var renderTags = _a[0], rc = _a[1], atlas = _a[2], size = _a[3], ct = _a[5];
+            return {
+                name: _this._name,
+                vnode: _this._tagDomRenderer.render(renderTags, ct, atlas, rc.perspective, size),
+            };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+        this._glSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
+            var tagScene = _this._tagScene;
+            return {
+                name: _this._name,
+                render: {
+                    frameId: frame.id,
+                    needsRender: tagScene.needsRender,
+                    render: tagScene.render.bind(tagScene),
+                    stage: Render_1.GLRenderStage.Foreground,
+                },
+            };
+        }))
+            .subscribe(this._container.glRenderer.render$);
+        this._navigator.stateService.currentTransform$.pipe(operators_1.first())
+            .subscribe(function (transform) {
+            _this._tagSet.activate(transform);
+            _this._tagScene.add(_this._tagSet.getAll());
+        });
+    };
+    TagComponent.prototype._deactivate = function () {
+        this._editVertexHandler.disable();
+        this._disableCreateHandlers();
+        this._tagScene.clear();
+        this._tagSet.deactivate();
+        this._tagCreator.delete$.next(null);
+        this._updateGLObjectsSubscription.unsubscribe();
+        this._updateTagSceneSubscription.unsubscribe();
+        this._stopCreateSubscription.unsubscribe();
+        this._setGLCreateTagSubscription.unsubscribe();
+        this._createGLObjectsChangedSubscription.unsubscribe();
+        this._domSubscription.unsubscribe();
+        this._glSubscription.unsubscribe();
+        this._fireCreateGeometryEventSubscription.unsubscribe();
+        this._fireGeometryCreatedSubscription.unsubscribe();
+        this._fireTagsChangedSubscription.unsubscribe();
+        this._handlerStopCreateSubscription.unsubscribe();
+        this._handlerEnablerSubscription.unsubscribe();
+        this._container.element.classList.remove("component-tag-create");
+    };
+    TagComponent.prototype._getDefaultConfiguration = function () {
+        return {
+            createColor: 0xFFFFFF,
+            indicatePointsCompleter: true,
+            mode: Component_1.TagMode.Default,
+        };
+    };
+    TagComponent.prototype._disableCreateHandlers = function () {
+        var createHandlers = this._createHandlers;
+        for (var key in createHandlers) {
+            if (!createHandlers.hasOwnProperty(key)) {
+                continue;
+            }
+            var handler = createHandlers[key];
+            if (!!handler) {
+                handler.disable();
+            }
         }
     };
+    /** @inheritdoc */
+    TagComponent.componentName = "tag";
     /**
-     * Sets a 2D basic image coordinates point to the popup's anchor, and
-     * moves the popup to it.
+     * Event fired when an interaction to create a geometry ends.
      *
-     * @description Overwrites any previously set point or rect.
-     *
-     * @param {Array<number>} basicPoint - Point in 2D basic image coordinates.
+     * @description A create interaction can by a geometry being created
+     * or by the creation being aborted.
      *
+     * @event TagComponent#creategeometryend
+     * @type {TagComponent} Tag component.
      * @example
      * ```
-     * var popup = new Mapillary.PopupComponent.Popup();
-     * popup.setText('hello image');
-     * popup.setBasicPoint([0.3, 0.3]);
-     *
-     * popupComponent.add([popup]);
+     * tagComponent.on("creategeometryend", function(component) {
+     *     console.log(component);
+     * });
      * ```
      */
-    Popup.prototype.setBasicPoint = function (basicPoint) {
-        this._point = basicPoint.slice();
-        this._rect = null;
-        this._notifyChanged$.next(this);
-    };
+    TagComponent.creategeometryend = "creategeometryend";
     /**
-     * Sets a 2D basic image coordinates rect to the popup's anchor, and
-     * moves the popup to it.
-     *
-     * @description Overwrites any previously set point or rect.
+     * Event fired when an interaction to create a geometry starts.
      *
-     * @param {Array<number>} basicRect - Rect in 2D basic image
-     * coordinates ([topLeftX, topLeftY, bottomRightX, bottomRightY]) .
+     * @description A create interaction starts when the first vertex
+     * is created in the geometry.
      *
+     * @event TagComponent#creategeometrystart
+     * @type {TagComponent} Tag component.
      * @example
      * ```
-     * var popup = new Mapillary.PopupComponent.Popup();
-     * popup.setText('hello image');
-     * popup.setBasicRect([0.3, 0.3, 0.5, 0.6]);
-     *
-     * popupComponent.add([popup]);
+     * tagComponent.on("creategeometrystart", function(component) {
+     *     console.log(component);
+     * });
      * ```
      */
-    Popup.prototype.setBasicRect = function (basicRect) {
-        this._rect = basicRect.slice();
-        this._point = null;
-        this._notifyChanged$.next(this);
-    };
+    TagComponent.creategeometrystart = "creategeometrystart";
     /**
-     * Sets the popup's content to the element provided as a DOM node.
-     *
-     * @param {Node} htmlNode - A DOM node to be used as content for the popup.
+     * Event fired when the create mode is changed.
      *
+     * @event TagComponent#modechanged
+     * @type {TagMode} Tag mode
      * @example
      * ```
-     * var div = document.createElement('div');
-     * div.innerHTML = 'hello image';
-     *
-     * var popup = new Mapillary.PopupComponent.Popup();
-     * popup.setDOMContent(div);
-     * popup.setBasicPoint([0.3, 0.3]);
-     *
-     * popupComponent.add([popup]);
+     * tagComponent.on("modechanged", function(mode) {
+     *     console.log(mode);
+     * });
      * ```
      */
-    Popup.prototype.setDOMContent = function (htmlNode) {
-        if (this._content && this._content.parentNode) {
-            this._content.parentNode.removeChild(this._content);
-        }
-        var className = "mapillaryjs-popup-content" + (this._options.clean === true ? "-clean" : "");
-        this._content = this._createElement("div", className, this._container);
-        this._content.appendChild(htmlNode);
-        this._notifyChanged$.next(this);
-    };
+    TagComponent.modechanged = "modechanged";
     /**
-     * Sets the popup's content to the HTML provided as a string.
-     *
-     * @description This method does not perform HTML filtering or sanitization,
-     * and must be used only with trusted content. Consider Popup#setText if the
-     * content is an untrusted text string.
-     *
-     * @param {string} html - A string representing HTML content for the popup.
+     * Event fired when a geometry has been created.
      *
+     * @event TagComponent#geometrycreated
+     * @type {Geometry} Created geometry.
      * @example
      * ```
-     * var popup = new Mapillary.PopupComponent.Popup();
-     * popup.setHTML('<div>hello image</div>');
-     * popup.setBasicPoint([0.3, 0.3]);
-     *
-     * popupComponent.add([popup]);
+     * tagComponent.on("geometrycreated", function(geometry) {
+     *     console.log(geometry);
+     * });
      * ```
      */
-    Popup.prototype.setHTML = function (html) {
-        var frag = document.createDocumentFragment();
-        var temp = document.createElement("body");
-        var child;
-        temp.innerHTML = html;
-        while (true) {
-            child = temp.firstChild;
-            if (!child) {
-                break;
-            }
-            frag.appendChild(child);
-        }
-        this.setDOMContent(frag);
-    };
+    TagComponent.geometrycreated = "geometrycreated";
     /**
-     * Sets the popup's content to a string of text.
-     *
-     * @description This function creates a Text node in the DOM, so it cannot insert raw HTML.
-     * Use this method for security against XSS if the popup content is user-provided.
-     *
-     * @param {string} text - Textual content for the popup.
+     * Event fired when the tags collection has changed.
      *
+     * @event TagComponent#tagschanged
+     * @type {TagComponent} Tag component.
      * @example
      * ```
-     * var popup = new Mapillary.PopupComponent.Popup();
-     * popup.setText('hello image');
-     * popup.setBasicPoint([0.3, 0.3]);
-     *
-     * popupComponent.add([popup]);
+     * tagComponent.on("tagschanged", function(component) {
+     *     console.log(component.getAll());
+     * });
      * ```
      */
-    Popup.prototype.setText = function (text) {
-        this.setDOMContent(document.createTextNode(text));
+    TagComponent.tagschanged = "tagschanged";
+    return TagComponent;
+}(Component_1.Component));
+exports.TagComponent = TagComponent;
+Component_1.ComponentService.register(TagComponent);
+exports.default = TagComponent;
+
+},{"../../Component":291,"../../Geo":294,"../../Render":297,"rxjs":43,"rxjs/operators":241,"when":288}],368:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TagCreator = void 0;
+var operators_1 = require("rxjs/operators");
+var rxjs_1 = require("rxjs");
+var Component_1 = require("../../Component");
+var TagCreator = /** @class */ (function () {
+    function TagCreator(component, navigator) {
+        this._component = component;
+        this._navigator = navigator;
+        this._tagOperation$ = new rxjs_1.Subject();
+        this._createPoints$ = new rxjs_1.Subject();
+        this._createPolygon$ = new rxjs_1.Subject();
+        this._createRect$ = new rxjs_1.Subject();
+        this._delete$ = new rxjs_1.Subject();
+        this._tag$ = this._tagOperation$.pipe(operators_1.scan(function (tag, operation) {
+            return operation(tag);
+        }, null), operators_1.share());
+        this._replayedTag$ = this._tag$.pipe(operators_1.publishReplay(1), operators_1.refCount());
+        this._replayedTag$.subscribe();
+        this._createPoints$.pipe(operators_1.withLatestFrom(this._component.configuration$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
+            var coord = _a[0], conf = _a[1], transform = _a[2];
+            return function () {
+                var geometry = new Component_1.PointsGeometry([
+                    [coord[0], coord[1]],
+                    [coord[0], coord[1]],
+                ]);
+                return new Component_1.ExtremePointCreateTag(geometry, {
+                    color: conf.createColor,
+                    indicateCompleter: conf.indicatePointsCompleter,
+                }, transform);
+            };
+        }))
+            .subscribe(this._tagOperation$);
+        this._createRect$.pipe(operators_1.withLatestFrom(this._component.configuration$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
+            var coord = _a[0], conf = _a[1], transform = _a[2];
+            return function () {
+                var geometry = new Component_1.RectGeometry([
+                    coord[0],
+                    coord[1],
+                    coord[0],
+                    coord[1],
+                ]);
+                return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform);
+            };
+        }))
+            .subscribe(this._tagOperation$);
+        this._createPolygon$.pipe(operators_1.withLatestFrom(this._component.configuration$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
+            var coord = _a[0], conf = _a[1], transform = _a[2];
+            return function () {
+                var geometry = new Component_1.PolygonGeometry([
+                    [coord[0], coord[1]],
+                    [coord[0], coord[1]],
+                    [coord[0], coord[1]],
+                ]);
+                return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform);
+            };
+        }))
+            .subscribe(this._tagOperation$);
+        this._delete$.pipe(operators_1.map(function () {
+            return function () {
+                return null;
+            };
+        }))
+            .subscribe(this._tagOperation$);
+    }
+    Object.defineProperty(TagCreator.prototype, "createRect$", {
+        get: function () {
+            return this._createRect$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TagCreator.prototype, "createPolygon$", {
+        get: function () {
+            return this._createPolygon$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TagCreator.prototype, "createPoints$", {
+        get: function () {
+            return this._createPoints$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TagCreator.prototype, "delete$", {
+        get: function () {
+            return this._delete$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TagCreator.prototype, "tag$", {
+        get: function () {
+            return this._tag$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TagCreator.prototype, "replayedTag$", {
+        get: function () {
+            return this._replayedTag$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    return TagCreator;
+}());
+exports.TagCreator = TagCreator;
+exports.default = TagCreator;
+
+},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],369:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TagDOMRenderer = void 0;
+var vd = require("virtual-dom");
+var TagDOMRenderer = /** @class */ (function () {
+    function TagDOMRenderer() {
+    }
+    TagDOMRenderer.prototype.render = function (tags, createTag, atlas, camera, size) {
+        var vNodes = [];
+        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
+            var tag = tags_1[_i];
+            vNodes = vNodes.concat(tag.getDOMObjects(atlas, camera, size));
+        }
+        if (createTag != null) {
+            vNodes = vNodes.concat(createTag.getDOMObjects(camera, size));
+        }
+        return vd.h("div.TagContainer", {}, vNodes);
+    };
+    TagDOMRenderer.prototype.clear = function () {
+        return vd.h("div", {}, []);
     };
+    return TagDOMRenderer;
+}());
+exports.TagDOMRenderer = TagDOMRenderer;
+
+},{"virtual-dom":247}],370:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TagMode = void 0;
+/**
+ * Enumeration for tag modes
+ * @enum {number}
+ * @readonly
+ * @description Modes for the interaction in the tag component.
+ */
+var TagMode;
+(function (TagMode) {
     /**
-     * @ignore
-     *
-     * @description Internal method for attaching the popup to
-     * its parent container so that it is rendered in the DOM tree.
+     * Disables creating tags.
      */
-    Popup.prototype.setParentContainer = function (parentContainer) {
-        this._parentContainer = parentContainer;
-    };
+    TagMode[TagMode["Default"] = 0] = "Default";
     /**
-     * @ignore
+     * Create a point geometry through a click.
+     */
+    TagMode[TagMode["CreatePoint"] = 1] = "CreatePoint";
+    /**
+     * Create a points geometry through clicks.
+     */
+    TagMode[TagMode["CreatePoints"] = 2] = "CreatePoints";
+    /**
+     * Create a polygon geometry through clicks.
+     */
+    TagMode[TagMode["CreatePolygon"] = 3] = "CreatePolygon";
+    /**
+     * Create a rect geometry through clicks.
+     */
+    TagMode[TagMode["CreateRect"] = 4] = "CreateRect";
+    /**
+     * Create a rect geometry through drag.
      *
-     * @description Internal method for updating the rendered
-     * position of the popup called by the popup component.
+     * @description Claims the mouse which results in mouse handlers like
+     * drag pan and scroll zoom becoming inactive.
      */
-    Popup.prototype.update = function (renderCamera, size, transform) {
-        if (!this._parentContainer || !this._content) {
-            return;
+    TagMode[TagMode["CreateRectDrag"] = 5] = "CreateRectDrag";
+})(TagMode = exports.TagMode || (exports.TagMode = {}));
+exports.default = TagMode;
+
+},{}],371:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TagOperation = void 0;
+var TagOperation;
+(function (TagOperation) {
+    TagOperation[TagOperation["None"] = 0] = "None";
+    TagOperation[TagOperation["Centroid"] = 1] = "Centroid";
+    TagOperation[TagOperation["Vertex"] = 2] = "Vertex";
+})(TagOperation = exports.TagOperation || (exports.TagOperation = {}));
+exports.default = TagOperation;
+
+},{}],372:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TagScene = void 0;
+var THREE = require("three");
+var TagScene = /** @class */ (function () {
+    function TagScene(scene, raycaster) {
+        this._createTag = null;
+        this._needsRender = false;
+        this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster();
+        this._scene = !!scene ? scene : new THREE.Scene();
+        this._objectTags = {};
+        this._retrievableObjects = [];
+        this._tags = {};
+    }
+    Object.defineProperty(TagScene.prototype, "needsRender", {
+        get: function () {
+            return this._needsRender;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    TagScene.prototype.add = function (tags) {
+        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
+            var tag = tags_1[_i];
+            if (tag.tag.id in this._tags) {
+                this._remove(tag.tag.id);
+            }
+            this._add(tag);
         }
-        if (!this._point && !this._rect) {
-            return;
+        this._needsRender = true;
+    };
+    TagScene.prototype.addCreateTag = function (tag) {
+        for (var _i = 0, _a = tag.glObjects; _i < _a.length; _i++) {
+            var object = _a[_i];
+            this._scene.add(object);
         }
-        if (!this._container) {
-            this._container = this._createElement("div", "mapillaryjs-popup", this._parentContainer);
-            var showTip = this._options.clean !== true &&
-                this._options.float !== Viewer_1.Alignment.Center;
-            if (showTip) {
-                this._tip = this._createElement("div", "mapillaryjs-popup-tip", this._container);
-                this._createElement("div", "mapillaryjs-popup-tip-inner", this._tip);
+        this._createTag = { tag: tag, objects: tag.glObjects };
+        this._needsRender = true;
+    };
+    TagScene.prototype.clear = function () {
+        for (var _i = 0, _a = Object.keys(this._tags); _i < _a.length; _i++) {
+            var id = _a[_i];
+            this._remove(id);
+        }
+        this._needsRender = false;
+    };
+    TagScene.prototype.get = function (id) {
+        return this.has(id) ? this._tags[id].tag : undefined;
+    };
+    TagScene.prototype.has = function (id) {
+        return id in this._tags;
+    };
+    TagScene.prototype.hasCreateTag = function () {
+        return this._createTag != null;
+    };
+    TagScene.prototype.intersectObjects = function (_a, camera) {
+        var viewportX = _a[0], viewportY = _a[1];
+        this._raycaster.setFromCamera(new THREE.Vector2(viewportX, viewportY), camera);
+        var intersects = this._raycaster.intersectObjects(this._retrievableObjects);
+        var intersectedIds = [];
+        for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) {
+            var intersect = intersects_1[_i];
+            if (intersect.object.uuid in this._objectTags) {
+                intersectedIds.push(this._objectTags[intersect.object.uuid]);
             }
-            this._container.appendChild(this._content);
-            this._parentContainer.appendChild(this._container);
-            if (this._options.opacity != null) {
-                this._container.style.opacity = this._options.opacity.toString();
+        }
+        return intersectedIds;
+    };
+    TagScene.prototype.remove = function (ids) {
+        for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
+            var id = ids_1[_i];
+            this._remove(id);
+        }
+        this._needsRender = true;
+    };
+    TagScene.prototype.removeAll = function () {
+        for (var _i = 0, _a = Object.keys(this._tags); _i < _a.length; _i++) {
+            var id = _a[_i];
+            this._remove(id);
+        }
+        this._needsRender = true;
+    };
+    TagScene.prototype.removeCreateTag = function () {
+        if (this._createTag == null) {
+            return;
+        }
+        for (var _i = 0, _a = this._createTag.objects; _i < _a.length; _i++) {
+            var object = _a[_i];
+            this._scene.remove(object);
+        }
+        this._createTag.tag.dispose();
+        this._createTag = null;
+        this._needsRender = true;
+    };
+    TagScene.prototype.render = function (perspectiveCamera, renderer) {
+        renderer.render(this._scene, perspectiveCamera);
+        this._needsRender = false;
+    };
+    TagScene.prototype.update = function () {
+        this._needsRender = true;
+    };
+    TagScene.prototype.updateCreateTagObjects = function (tag) {
+        if (this._createTag.tag !== tag) {
+            throw new Error("Create tags do not have the same reference.");
+        }
+        for (var _i = 0, _a = this._createTag.objects; _i < _a.length; _i++) {
+            var object = _a[_i];
+            this._scene.remove(object);
+        }
+        for (var _b = 0, _c = tag.glObjects; _b < _c.length; _b++) {
+            var object = _c[_b];
+            this._scene.add(object);
+        }
+        this._createTag.objects = tag.glObjects;
+        this._needsRender = true;
+    };
+    TagScene.prototype.updateObjects = function (tag) {
+        var id = tag.tag.id;
+        if (this._tags[id].tag !== tag) {
+            throw new Error("Tags do not have the same reference.");
+        }
+        var tagObjects = this._tags[id];
+        this._removeObjects(tagObjects);
+        delete this._tags[id];
+        this._add(tag);
+        this._needsRender = true;
+    };
+    TagScene.prototype._add = function (tag) {
+        var id = tag.tag.id;
+        var tagObjects = { tag: tag, objects: [], retrievableObjects: [] };
+        this._tags[id] = tagObjects;
+        for (var _i = 0, _a = tag.getGLObjects(); _i < _a.length; _i++) {
+            var object = _a[_i];
+            tagObjects.objects.push(object);
+            this._scene.add(object);
+        }
+        for (var _b = 0, _c = tag.getRetrievableObjects(); _b < _c.length; _b++) {
+            var retrievableObject = _c[_b];
+            tagObjects.retrievableObjects.push(retrievableObject);
+            this._retrievableObjects.push(retrievableObject);
+            this._objectTags[retrievableObject.uuid] = tag.tag.id;
+        }
+    };
+    TagScene.prototype._remove = function (id) {
+        var tagObjects = this._tags[id];
+        this._removeObjects(tagObjects);
+        tagObjects.tag.dispose();
+        delete this._tags[id];
+    };
+    TagScene.prototype._removeObjects = function (tagObjects) {
+        for (var _i = 0, _a = tagObjects.objects; _i < _a.length; _i++) {
+            var object = _a[_i];
+            this._scene.remove(object);
+        }
+        for (var _b = 0, _c = tagObjects.retrievableObjects; _b < _c.length; _b++) {
+            var retrievableObject = _c[_b];
+            var index = this._retrievableObjects.indexOf(retrievableObject);
+            if (index !== -1) {
+                this._retrievableObjects.splice(index, 1);
             }
         }
-        var pointPixel = null;
-        var position = this._alignmentToPopupAligment(this._options.position);
-        var float = this._alignmentToPopupAligment(this._options.float);
-        if (this._point != null) {
-            pointPixel =
-                this._viewportCoords.basicToCanvasSafe(this._point[0], this._point[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
+    };
+    return TagScene;
+}());
+exports.TagScene = TagScene;
+exports.default = TagScene;
+
+},{"three":242}],373:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TagSet = void 0;
+var rxjs_1 = require("rxjs");
+var Component_1 = require("../../Component");
+var ExtremePointTag_1 = require("./tag/ExtremePointTag");
+var ExtremePointRenderTag_1 = require("./tag/ExtremePointRenderTag");
+var TagSet = /** @class */ (function () {
+    function TagSet() {
+        this._active = false;
+        this._hash = {};
+        this._hashDeactivated = {};
+        this._notifyChanged$ = new rxjs_1.Subject();
+    }
+    Object.defineProperty(TagSet.prototype, "active", {
+        get: function () {
+            return this._active;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(TagSet.prototype, "changed$", {
+        get: function () {
+            return this._notifyChanged$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    TagSet.prototype.activate = function (transform) {
+        if (this._active) {
+            return;
         }
-        else {
-            _a = this._rectToPixel(this._rect, position, renderCamera, size, transform), pointPixel = _a[0], position = _a[1];
-            if (!float) {
-                float = position;
+        for (var id in this._hashDeactivated) {
+            if (!this._hashDeactivated.hasOwnProperty(id)) {
+                continue;
             }
+            var tag = this._hashDeactivated[id];
+            this._add(tag, transform);
         }
-        if (pointPixel == null) {
-            this._container.style.visibility = "hidden";
+        this._hashDeactivated = {};
+        this._active = true;
+        this._notifyChanged$.next(this);
+    };
+    TagSet.prototype.deactivate = function () {
+        if (!this._active) {
             return;
         }
-        this._container.style.visibility = "visible";
-        if (!float) {
-            var width = this._container.offsetWidth;
-            var height = this._container.offsetHeight;
-            var floats = this._pixelToFloats(pointPixel, size, width, height);
-            float = floats.length === 0 ? "bottom" : floats.join("-");
-        }
-        if (!!this._options.offset) {
-            var offset = this._options.offset;
-            var sign = offset >= 0 ? 1 : -1;
-            var cornerOffset = sign * Math.round(Math.sqrt(0.5 * Math.pow(offset, 2)));
-            var floatOffset = {
-                "bottom": [0, offset],
-                "bottom-left": [-cornerOffset, cornerOffset],
-                "bottom-right": [cornerOffset, cornerOffset],
-                "center": [0, 0],
-                "left": [-offset, 0],
-                "right": [offset, 0],
-                "top": [0, -offset],
-                "top-left": [-cornerOffset, -cornerOffset],
-                "top-right": [cornerOffset, -cornerOffset],
-            };
-            pointPixel = [pointPixel[0] + floatOffset[float][0], pointPixel[1] + floatOffset[float][1]];
-        }
-        pointPixel = [Math.round(pointPixel[0]), Math.round(pointPixel[1])];
-        var floatTranslate = {
-            "bottom": "translate(-50%,0)",
-            "bottom-left": "translate(-100%,0)",
-            "bottom-right": "translate(0,0)",
-            "center": "translate(-50%,-50%)",
-            "left": "translate(-100%,-50%)",
-            "right": "translate(0,-50%)",
-            "top": "translate(-50%,-100%)",
-            "top-left": "translate(-100%,-100%)",
-            "top-right": "translate(0,-100%)",
-        };
-        var classList = this._container.classList;
-        for (var key in floatTranslate) {
-            if (!floatTranslate.hasOwnProperty(key)) {
+        for (var id in this._hash) {
+            if (!this._hash.hasOwnProperty(id)) {
                 continue;
             }
-            classList.remove("mapillaryjs-popup-float-" + key);
+            this._hashDeactivated[id] = this._hash[id].tag;
         }
-        classList.add("mapillaryjs-popup-float-" + float);
-        this._container.style.transform = floatTranslate[float] + " translate(" + pointPixel[0] + "px," + pointPixel[1] + "px)";
-        var _a;
+        this._hash = {};
+        this._active = false;
     };
-    Popup.prototype._createElement = function (tagName, className, container) {
-        var element = document.createElement(tagName);
-        if (!!className) {
-            element.className = className;
-        }
-        if (!!container) {
-            container.appendChild(element);
+    TagSet.prototype.add = function (tags, transform) {
+        this._assertActivationState(true);
+        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
+            var tag = tags_1[_i];
+            this._add(tag, transform);
         }
-        return element;
+        this._notifyChanged$.next(this);
     };
-    Popup.prototype._rectToPixel = function (rect, position, renderCamera, size, transform) {
-        if (!position) {
-            var width = this._container.offsetWidth;
-            var height = this._container.offsetHeight;
-            var floatOffsets = {
-                "bottom": [0, height / 2],
-                "bottom-left": [-width / 2, height / 2],
-                "bottom-right": [width / 2, height / 2],
-                "left": [-width / 2, 0],
-                "right": [width / 2, 0],
-                "top": [0, -height / 2],
-                "top-left": [-width / 2, -height / 2],
-                "top-right": [width / 2, -height / 2],
-            };
-            var automaticPositions = ["bottom", "top", "left", "right"];
-            var largestVisibleArea = [0, null, null];
-            for (var _i = 0, automaticPositions_1 = automaticPositions; _i < automaticPositions_1.length; _i++) {
-                var automaticPosition = automaticPositions_1[_i];
-                var pointBasic_1 = this._pointFromRectPosition(rect, automaticPosition);
-                var pointPixel = this._viewportCoords.basicToCanvasSafe(pointBasic_1[0], pointBasic_1[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
-                if (pointPixel == null) {
-                    continue;
-                }
-                var floatOffset = floatOffsets[automaticPosition];
-                var offsetedPosition = [pointPixel[0] + floatOffset[0], pointPixel[1] + floatOffset[1]];
-                var floats = this._pixelToFloats(offsetedPosition, size, width, height / 2);
-                if (floats.length === 0 &&
-                    pointPixel[0] > 0 &&
-                    pointPixel[0] < size.width &&
-                    pointPixel[1] > 0 &&
-                    pointPixel[1] < size.height) {
-                    return [pointPixel, automaticPosition];
-                }
-                var minX = Math.max(offsetedPosition[0] - width / 2, 0);
-                var maxX = Math.min(offsetedPosition[0] + width / 2, size.width);
-                var minY = Math.max(offsetedPosition[1] - height / 2, 0);
-                var maxY = Math.min(offsetedPosition[1] + height / 2, size.height);
-                var visibleX = Math.max(0, maxX - minX);
-                var visibleY = Math.max(0, maxY - minY);
-                var visibleArea = visibleX * visibleY;
-                if (visibleArea > largestVisibleArea[0]) {
-                    largestVisibleArea[0] = visibleArea;
-                    largestVisibleArea[1] = pointPixel;
-                    largestVisibleArea[2] = automaticPosition;
-                }
+    TagSet.prototype.addDeactivated = function (tags) {
+        this._assertActivationState(false);
+        for (var _i = 0, tags_2 = tags; _i < tags_2.length; _i++) {
+            var tag = tags_2[_i];
+            if (!(tag instanceof Component_1.OutlineTag ||
+                tag instanceof Component_1.SpotTag ||
+                tag instanceof ExtremePointTag_1.default)) {
+                throw new Error("Tag type not supported");
             }
-            if (largestVisibleArea[0] > 0) {
-                return [largestVisibleArea[1], largestVisibleArea[2]];
+            this._hashDeactivated[tag.id] = tag;
+        }
+    };
+    TagSet.prototype.get = function (id) {
+        return this.has(id) ? this._hash[id] : undefined;
+    };
+    TagSet.prototype.getAll = function () {
+        var hash = this._hash;
+        return Object.keys(hash)
+            .map(function (id) {
+            return hash[id];
+        });
+    };
+    TagSet.prototype.getAllDeactivated = function () {
+        var hashDeactivated = this._hashDeactivated;
+        return Object.keys(hashDeactivated)
+            .map(function (id) {
+            return hashDeactivated[id];
+        });
+    };
+    TagSet.prototype.getDeactivated = function (id) {
+        return this.hasDeactivated(id) ? this._hashDeactivated[id] : undefined;
+    };
+    TagSet.prototype.has = function (id) {
+        return id in this._hash;
+    };
+    TagSet.prototype.hasDeactivated = function (id) {
+        return id in this._hashDeactivated;
+    };
+    TagSet.prototype.remove = function (ids) {
+        this._assertActivationState(true);
+        var hash = this._hash;
+        for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
+            var id = ids_1[_i];
+            if (!(id in hash)) {
+                continue;
             }
+            delete hash[id];
         }
-        var pointBasic = this._pointFromRectPosition(rect, position);
-        var pointCanvas = this._viewportCoords.basicToCanvasSafe(pointBasic[0], pointBasic[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
-        return [pointCanvas, position != null ? position : "bottom"];
+        this._notifyChanged$.next(this);
     };
-    Popup.prototype._alignmentToPopupAligment = function (float) {
-        switch (float) {
-            case Viewer_1.Alignment.Bottom:
-                return "bottom";
-            case Viewer_1.Alignment.BottomLeft:
-                return "bottom-left";
-            case Viewer_1.Alignment.BottomRight:
-                return "bottom-right";
-            case Viewer_1.Alignment.Center:
-                return "center";
-            case Viewer_1.Alignment.Left:
-                return "left";
-            case Viewer_1.Alignment.Right:
-                return "right";
-            case Viewer_1.Alignment.Top:
-                return "top";
-            case Viewer_1.Alignment.TopLeft:
-                return "top-left";
-            case Viewer_1.Alignment.TopRight:
-                return "top-right";
-            default:
-                return null;
+    TagSet.prototype.removeAll = function () {
+        this._assertActivationState(true);
+        this._hash = {};
+        this._notifyChanged$.next(this);
+    };
+    TagSet.prototype.removeAllDeactivated = function () {
+        this._assertActivationState(false);
+        this._hashDeactivated = {};
+    };
+    TagSet.prototype.removeDeactivated = function (ids) {
+        this._assertActivationState(false);
+        var hashDeactivated = this._hashDeactivated;
+        for (var _i = 0, ids_2 = ids; _i < ids_2.length; _i++) {
+            var id = ids_2[_i];
+            if (!(id in hashDeactivated)) {
+                continue;
+            }
+            delete hashDeactivated[id];
         }
     };
-    Popup.prototype._pixelToFloats = function (pointPixel, size, width, height) {
-        var floats = [];
-        if (pointPixel[1] < height) {
-            floats.push("bottom");
+    TagSet.prototype._add = function (tag, transform) {
+        if (tag instanceof Component_1.OutlineTag) {
+            this._hash[tag.id] = new Component_1.OutlineRenderTag(tag, transform);
         }
-        else if (pointPixel[1] > size.height - height) {
-            floats.push("top");
+        else if (tag instanceof Component_1.SpotTag) {
+            this._hash[tag.id] = new Component_1.SpotRenderTag(tag, transform);
         }
-        if (pointPixel[0] < width / 2) {
-            floats.push("right");
+        else if (tag instanceof ExtremePointTag_1.default) {
+            this._hash[tag.id] = new ExtremePointRenderTag_1.default(tag, transform);
         }
-        else if (pointPixel[0] > size.width - width / 2) {
-            floats.push("left");
+        else {
+            throw new Error("Tag type not supported");
         }
-        return floats;
     };
-    Popup.prototype._pointFromRectPosition = function (rect, position) {
-        switch (position) {
-            case "bottom":
-                return [(rect[0] + rect[2]) / 2, rect[3]];
-            case "bottom-left":
-                return [rect[0], rect[3]];
-            case "bottom-right":
-                return [rect[2], rect[3]];
-            case "center":
-                return [(rect[0] + rect[2]) / 2, (rect[1] + rect[3]) / 2];
-            case "left":
-                return [rect[0], (rect[1] + rect[3]) / 2];
-            case "right":
-                return [rect[2], (rect[1] + rect[3]) / 2];
-            case "top":
-                return [(rect[0] + rect[2]) / 2, rect[1]];
-            case "top-left":
-                return [rect[0], rect[1]];
-            case "top-right":
-                return [rect[2], rect[1]];
-            default:
-                return [(rect[0] + rect[2]) / 2, rect[3]];
+    TagSet.prototype._assertActivationState = function (should) {
+        if (should !== this._active) {
+            throw new Error("Tag set not in correct state for operation.");
         }
     };
-    return Popup;
+    return TagSet;
 }());
-exports.Popup = Popup;
-exports.default = Popup;
+exports.TagSet = TagSet;
+exports.default = TagSet;
 
-},{"../../../Geo":229,"../../../Viewer":236,"rxjs/Subject":34}],279:[function(require,module,exports){
+},{"../../Component":291,"./tag/ExtremePointRenderTag":393,"./tag/ExtremePointTag":394,"rxjs":43}],374:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -26468,516 +40444,390 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/observable/of");
-require("rxjs/add/operator/bufferCount");
-require("rxjs/add/operator/concat");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/finally");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/share");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/takeUntil");
-require("rxjs/add/operator/withLatestFrom");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
+exports.GeometryTagError = void 0;
+var Error_1 = require("../../../Error");
+var GeometryTagError = /** @class */ (function (_super) {
+    __extends(GeometryTagError, _super);
+    function GeometryTagError(message) {
+        var _this = _super.call(this, message != null ? message : "The provided geometry value is incorrect") || this;
+        Object.setPrototypeOf(_this, GeometryTagError.prototype);
+        _this.name = "GeometryTagError";
+        return _this;
+    }
+    return GeometryTagError;
+}(Error_1.MapillaryError));
+exports.GeometryTagError = GeometryTagError;
+exports.default = Error_1.MapillaryError;
+
+},{"../../../Error":293}],375:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Geometry = void 0;
+var rxjs_1 = require("rxjs");
 /**
- * @class SequenceComponent
- * @classdesc Component showing navigation arrows for sequence directions
- * as well as playing button. Exposes an API to start and stop play.
+ * @class Geometry
+ * @abstract
+ * @classdesc Represents a geometry.
  */
-var SequenceComponent = (function (_super) {
-    __extends(SequenceComponent, _super);
-    function SequenceComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._nodesAhead = 5;
-        _this._configurationOperation$ = new Subject_1.Subject();
-        _this._sequenceDOMRenderer = new Component_1.SequenceDOMRenderer(container.element);
-        _this._sequenceDOMInteraction = new Component_1.SequenceDOMInteraction();
-        _this._containerWidth$ = new Subject_1.Subject();
-        _this._hoveredKeySubject$ = new Subject_1.Subject();
-        _this._hoveredKey$ = _this._hoveredKeySubject$.share();
-        _this._edgeStatus$ = _this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
-            return node.sequenceEdges$;
-        })
-            .publishReplay(1)
-            .refCount();
-        return _this;
+var Geometry = /** @class */ (function () {
+    /**
+     * Create a geometry.
+     *
+     * @constructor
+     * @ignore
+     */
+    function Geometry() {
+        this._notifyChanged$ = new rxjs_1.Subject();
     }
-    Object.defineProperty(SequenceComponent.prototype, "hoveredKey$", {
+    Object.defineProperty(Geometry.prototype, "changed$", {
         /**
-         * Get hovered key observable.
+         * Get changed observable.
          *
-         * @description An observable emitting the key of the node for the direction
-         * arrow that is being hovered. When the mouse leaves a direction arrow null
-         * is emitted.
+         * @description Emits the geometry itself every time the geometry
+         * has changed.
          *
-         * @returns {Observable<string>}
+         * @returns {Observable<Geometry>} Observable emitting the geometry instance.
+         * @ignore
          */
         get: function () {
-            return this._hoveredKey$;
+            return this._notifyChanged$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    /**
-     * Start playing.
-     *
-     * @fires PlayerComponent#playingchanged
-     */
-    SequenceComponent.prototype.play = function () {
-        this.configure({ playing: true });
-    };
-    /**
-     * Stop playing.
-     *
-     * @fires PlayerComponent#playingchanged
-     */
-    SequenceComponent.prototype.stop = function () {
-        this.configure({ playing: false });
+    return Geometry;
+}());
+exports.Geometry = Geometry;
+exports.default = Geometry;
+
+},{"rxjs":43}],376:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     };
-    /**
-     * Set the direction to follow when playing.
-     *
-     * @param {EdgeDirection} direction - The direction that will be followed when playing.
-     */
-    SequenceComponent.prototype.setDirection = function (direction) {
-        this.configure({ direction: direction });
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.PointGeometry = void 0;
+var Component_1 = require("../../../Component");
+/**
+ * @class PointGeometry
+ *
+ * @classdesc Represents a point geometry in the 2D basic image coordinate system.
+ *
+ * @example
+ * ```
+ * var basicPoint = [0.5, 0.7];
+ * var pointGeometry = new Mapillary.TagComponent.PointGeometry(basicPoint);
+ * ```
+ */
+var PointGeometry = /** @class */ (function (_super) {
+    __extends(PointGeometry, _super);
     /**
-     * Set highlight key.
+     * Create a point geometry.
      *
-     * @description The arrow pointing towards the node corresponding to the
-     * highlight key will be highlighted.
+     * @constructor
+     * @param {Array<number>} point - An array representing the basic coordinates of
+     * the point.
      *
-     * @param {string} highlightKey Key of node to be highlighted if existing.
+     * @throws {GeometryTagError} Point coordinates must be valid basic coordinates.
      */
-    SequenceComponent.prototype.setHighlightKey = function (highlightKey) {
-        this.configure({ highlightKey: highlightKey });
-    };
+    function PointGeometry(point) {
+        var _this = _super.call(this) || this;
+        var x = point[0];
+        var y = point[1];
+        if (x < 0 || x > 1 || y < 0 || y > 1) {
+            throw new Component_1.GeometryTagError("Basic coordinates must be on the interval [0, 1].");
+        }
+        _this._point = point.slice();
+        return _this;
+    }
+    Object.defineProperty(PointGeometry.prototype, "point", {
+        /**
+         * Get point property.
+         * @returns {Array<number>} Array representing the basic coordinates of the point.
+         */
+        get: function () {
+            return this._point;
+        },
+        enumerable: false,
+        configurable: true
+    });
     /**
-     * Set max width of container element.
-     *
-     * @description Set max width of the container element holding
-     * the sequence navigation elements. If the min width is larger than the
-     * max width the min width value will be used.
-     *
-     * The container element is automatically resized when the resize
-     * method on the Viewer class is called.
+     * Get the 2D basic coordinates for the centroid of the point, i.e. the 2D
+     * basic coordinates of the point itself.
      *
-     * @param {number} minWidth
+     * @returns {Array<number>} 2D basic coordinates representing the centroid.
+     * @ignore
      */
-    SequenceComponent.prototype.setMaxWidth = function (maxWidth) {
-        this.configure({ maxWidth: maxWidth });
+    PointGeometry.prototype.getCentroid2d = function () {
+        return this._point.slice();
     };
     /**
-     * Set min width of container element.
-     *
-     * @description Set min width of the container element holding
-     * the sequence navigation elements. If the min width is larger than the
-     * max width the min width value will be used.
-     *
-     * The container element is automatically resized when the resize
-     * method on the Viewer class is called.
+     * Get the 3D world coordinates for the centroid of the point, i.e. the 3D
+     * world coordinates of the point itself.
      *
-     * @param {number} minWidth
+     * @param {Transform} transform - The transform of the node related to the point.
+     * @returns {Array<number>} 3D world coordinates representing the centroid.
+     * @ignore
      */
-    SequenceComponent.prototype.setMinWidth = function (minWidth) {
-        this.configure({ minWidth: minWidth });
+    PointGeometry.prototype.getCentroid3d = function (transform) {
+        return transform.unprojectBasic(this._point, 200);
     };
     /**
-     * Set the value indicating whether the sequence UI elements should be visible.
+     * Set the centroid of the point, i.e. the point coordinates.
      *
-     * @param {boolean} visible
+     * @param {Array<number>} value - The new value of the centroid.
+     * @param {Transform} transform - The transform of the node related to the point.
+     * @ignore
      */
-    SequenceComponent.prototype.setVisible = function (visible) {
-        this.configure({ visible: visible });
-    };
-    /** @inheritdoc */
-    SequenceComponent.prototype.resize = function () {
-        var _this = this;
-        this._configuration$
-            .first()
-            .map(function (configuration) {
-            return _this._sequenceDOMRenderer.getContainerWidth(_this._container.element, configuration);
-        })
-            .subscribe(function (containerWidth) {
-            _this._containerWidth$.next(containerWidth);
-        });
-    };
-    SequenceComponent.prototype._activate = function () {
-        var _this = this;
-        this._renderSubscription = Observable_1.Observable
-            .combineLatest(this._edgeStatus$, this._configuration$, this._containerWidth$)
-            .map(function (ec) {
-            var edgeStatus = ec[0];
-            var configuration = ec[1];
-            var containerWidth = ec[2];
-            var vNode = _this._sequenceDOMRenderer
-                .render(edgeStatus, configuration, containerWidth, _this, _this._sequenceDOMInteraction, _this._navigator);
-            return { name: _this._name, vnode: vNode };
-        })
-            .subscribe(this._container.domRenderer.render$);
-        this._containerWidthSubscription = this._configuration$
-            .distinctUntilChanged(function (value1, value2) {
-            return value1[0] === value2[0] && value1[1] === value2[1];
-        }, function (configuration) {
-            return [configuration.minWidth, configuration.maxWidth];
-        })
-            .map(function (configuration) {
-            return _this._sequenceDOMRenderer.getContainerWidth(_this._container.element, configuration);
-        })
-            .subscribe(this._containerWidth$);
-        this._configurationSubscription = this._configurationOperation$
-            .scan(function (configuration, operation) {
-            return operation(configuration);
-        }, { playing: false })
-            .finally(function () {
-            if (_this._playingSubscription != null) {
-                _this._navigator.stateService.cutNodes();
-                _this._stop();
-            }
-        })
-            .subscribe(function () { });
-        this._configuration$
-            .map(function (newConfiguration) {
-            return function (configuration) {
-                if (newConfiguration.playing !== configuration.playing) {
-                    _this._navigator.stateService.cutNodes();
-                    if (newConfiguration.playing) {
-                        _this._play();
-                    }
-                    else {
-                        _this._stop();
-                    }
-                }
-                configuration.playing = newConfiguration.playing;
-                return configuration;
-            };
-        })
-            .subscribe(this._configurationOperation$);
-        this._stopSubscription = this._configuration$
-            .switchMap(function (configuration) {
-            var edgeStatus$ = configuration.playing ?
-                _this._edgeStatus$ :
-                Observable_1.Observable.empty();
-            var edgeDirection$ = Observable_1.Observable
-                .of(configuration.direction);
-            return Observable_1.Observable
-                .combineLatest(edgeStatus$, edgeDirection$);
-        })
-            .map(function (ne) {
-            var edgeStatus = ne[0];
-            var direction = ne[1];
-            if (!edgeStatus.cached) {
-                return true;
-            }
-            for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-                var edge = _a[_i];
-                if (edge.data.direction === direction) {
-                    return true;
-                }
-            }
-            return false;
-        })
-            .filter(function (hasEdge) {
-            return !hasEdge;
-        })
-            .map(function (hasEdge) {
-            return { playing: false };
-        })
-            .subscribe(this._configurationSubject$);
-        this._hoveredKeySubscription = this._sequenceDOMInteraction.mouseEnterDirection$
-            .switchMap(function (direction) {
-            return _this._edgeStatus$
-                .map(function (edgeStatus) {
-                for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-                    var edge = _a[_i];
-                    if (edge.data.direction === direction) {
-                        return edge.to;
-                    }
-                }
-                return null;
-            })
-                .takeUntil(_this._sequenceDOMInteraction.mouseLeaveDirection$)
-                .concat(Observable_1.Observable.of(null));
-        })
-            .distinctUntilChanged()
-            .subscribe(this._hoveredKeySubject$);
-    };
-    SequenceComponent.prototype._deactivate = function () {
-        this._stopSubscription.unsubscribe();
-        this._renderSubscription.unsubscribe();
-        this._configurationSubscription.unsubscribe();
-        this._containerWidthSubscription.unsubscribe();
-        this._hoveredKeySubscription.unsubscribe();
-        this.stop();
-    };
-    SequenceComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            direction: Edge_1.EdgeDirection.Next,
-            maxWidth: 117,
-            minWidth: 70,
-            playing: false,
-            visible: true,
-        };
+    PointGeometry.prototype.setCentroid2d = function (value, transform) {
+        var changed = [
+            Math.max(0, Math.min(1, value[0])),
+            Math.max(0, Math.min(1, value[1])),
+        ];
+        this._point[0] = changed[0];
+        this._point[1] = changed[1];
+        this._notifyChanged$.next(this);
     };
-    SequenceComponent.prototype._play = function () {
-        var _this = this;
-        this._playingSubscription = this._navigator.stateService.currentState$
-            .filter(function (frame) {
-            return frame.state.nodesAhead < _this._nodesAhead;
-        })
-            .map(function (frame) {
-            return frame.state.lastNode;
-        })
-            .distinctUntilChanged(undefined, function (lastNode) {
-            return lastNode.key;
-        })
-            .withLatestFrom(this._configuration$, function (lastNode, configuration) {
-            return [lastNode, configuration.direction];
-        })
-            .switchMap(function (nd) {
-            return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(nd[1]) > -1 ?
-                nd[0].sequenceEdges$ :
-                nd[0].spatialEdges$)
-                .filter(function (status) {
-                return status.cached;
-            })
-                .zip(Observable_1.Observable.of(nd[1]), function (status, direction) {
-                return [status, direction];
-            });
-        })
-            .map(function (ed) {
-            var direction = ed[1];
-            for (var _i = 0, _a = ed[0].edges; _i < _a.length; _i++) {
-                var edge = _a[_i];
-                if (edge.data.direction === direction) {
-                    return edge.to;
-                }
-            }
-            return null;
-        })
-            .filter(function (key) {
-            return key != null;
-        })
-            .switchMap(function (key) {
-            return _this._navigator.graphService.cacheNode$(key);
-        })
-            .subscribe(function (node) {
-            _this._navigator.stateService.appendNodes([node]);
-        }, function (error) {
-            console.error(error);
-            _this.stop();
-        });
-        this._clearSubscription = this._navigator.stateService.currentNode$
-            .bufferCount(1, 7)
-            .subscribe(function (nodes) {
-            _this._navigator.stateService.clearPriorNodes();
-        });
-        this.fire(SequenceComponent.playingchanged, true);
+    return PointGeometry;
+}(Component_1.Geometry));
+exports.PointGeometry = PointGeometry;
+exports.default = PointGeometry;
+
+},{"../../../Component":291}],377:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     };
-    SequenceComponent.prototype._stop = function () {
-        this._playingSubscription.unsubscribe();
-        this._playingSubscription = null;
-        this._clearSubscription.unsubscribe();
-        this._clearSubscription = null;
-        this.fire(SequenceComponent.playingchanged, false);
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    /** @inheritdoc */
-    SequenceComponent.componentName = "sequence";
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.PointsGeometry = void 0;
+var Component_1 = require("../../../Component");
+/**
+ * @class PointsGeometry
+ *
+ * @classdesc Represents a point set in the 2D basic image coordinate system.
+ *
+ * @example
+ * ```
+ * var points = [[0.5, 0.3], [0.7, 0.3], [0.6, 0.5]];
+ * var pointsGeometry = new Mapillary.TagComponent.PointsGeometry(points);
+ * ```
+ */
+var PointsGeometry = /** @class */ (function (_super) {
+    __extends(PointsGeometry, _super);
     /**
-     * Event fired when playing starts or stops.
+     * Create a points geometry.
+     *
+     * @constructor
+     * @param {Array<Array<number>>} points - Array of 2D points on the basic coordinate
+     * system. The number of points must be greater than or equal to two.
      *
-     * @event PlayerComponent#playingchanged
-     * @type {boolean} Indicates whether the player is playing.
+     * @throws {GeometryTagError} Point coordinates must be valid basic coordinates.
      */
-    SequenceComponent.playingchanged = "playingchanged";
-    return SequenceComponent;
-}(Component_1.Component));
-exports.SequenceComponent = SequenceComponent;
-Component_1.ComponentService.register(SequenceComponent);
-exports.default = SequenceComponent;
-
-},{"../../Component":226,"../../Edge":227,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/of":45,"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/concat":54,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/share":74,"rxjs/add/operator/switchMap":79,"rxjs/add/operator/takeUntil":81,"rxjs/add/operator/withLatestFrom":83}],280:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("rxjs/Subject");
-var SequenceDOMInteraction = (function () {
-    function SequenceDOMInteraction() {
-        this._mouseEnterDirection$ = new Subject_1.Subject();
-        this._mouseLeaveDirection$ = new Subject_1.Subject();
+    function PointsGeometry(points) {
+        var _this = _super.call(this) || this;
+        var pointsLength = points.length;
+        if (pointsLength < 2) {
+            throw new Component_1.GeometryTagError("A points geometry must have two or more positions.");
+        }
+        _this._points = [];
+        for (var _i = 0, points_1 = points; _i < points_1.length; _i++) {
+            var point = points_1[_i];
+            if (point[0] < 0 || point[0] > 1 ||
+                point[1] < 0 || point[1] > 1) {
+                throw new Component_1.GeometryTagError("Basic coordinates of points must be on the interval [0, 1].");
+            }
+            _this._points.push(point.slice());
+        }
+        return _this;
     }
-    Object.defineProperty(SequenceDOMInteraction.prototype, "mouseEnterDirection$", {
-        get: function () {
-            return this._mouseEnterDirection$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SequenceDOMInteraction.prototype, "mouseLeaveDirection$", {
+    Object.defineProperty(PointsGeometry.prototype, "points", {
+        /**
+         * Get points property.
+         * @returns {Array<Array<number>>} Array of 2d points.
+         */
         get: function () {
-            return this._mouseLeaveDirection$;
+            return this._points;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    return SequenceDOMInteraction;
-}());
-exports.SequenceDOMInteraction = SequenceDOMInteraction;
-exports.default = SequenceDOMInteraction;
-
-},{"rxjs/Subject":34}],281:[function(require,module,exports){
-"use strict";
-/// <reference path="../../../typings/index.d.ts" />
-Object.defineProperty(exports, "__esModule", { value: true });
-var vd = require("virtual-dom");
-var Edge_1 = require("../../Edge");
-var SequenceDOMRenderer = (function () {
-    function SequenceDOMRenderer(element) {
-        this._minThresholdWidth = 320;
-        this._maxThresholdWidth = 1480;
-        this._minThresholdHeight = 240;
-        this._maxThresholdHeight = 820;
-    }
-    SequenceDOMRenderer.prototype.render = function (edgeStatus, configuration, containerWidth, component, interaction, navigator) {
-        if (configuration.visible === false) {
-            return vd.h("div.SequenceContainer", {}, []);
-        }
-        var nextKey = null;
-        var prevKey = null;
-        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-            var edge = _a[_i];
-            if (edge.data.direction === Edge_1.EdgeDirection.Next) {
-                nextKey = edge.to;
-            }
-            if (edge.data.direction === Edge_1.EdgeDirection.Prev) {
-                prevKey = edge.to;
-            }
-        }
-        var playingButton = this._createPlayingButton(nextKey, prevKey, configuration, component);
-        var arrows = this._createSequenceArrows(nextKey, prevKey, configuration, interaction, navigator);
-        var containerProperties = {
-            oncontextmenu: function (event) { event.preventDefault(); },
-            style: { height: (0.27 * containerWidth) + "px", width: containerWidth + "px" },
-        };
-        return vd.h("div.SequenceContainer", containerProperties, arrows.concat([playingButton]));
+    /**
+     * Add a point to the point set.
+     *
+     * @param {Array<number>} point - Point to add.
+     * @ignore
+     */
+    PointsGeometry.prototype.addPoint2d = function (point) {
+        var clamped = [
+            Math.max(0, Math.min(1, point[0])),
+            Math.max(0, Math.min(1, point[1])),
+        ];
+        this._points.push(clamped);
+        this._notifyChanged$.next(this);
     };
-    SequenceDOMRenderer.prototype.getContainerWidth = function (element, configuration) {
-        var elementWidth = element.offsetWidth;
-        var elementHeight = element.offsetHeight;
-        var minWidth = configuration.minWidth;
-        var maxWidth = configuration.maxWidth;
-        if (maxWidth < minWidth) {
-            maxWidth = minWidth;
+    /**
+     * Get the coordinates of a point from the point set representation of the geometry.
+     *
+     * @param {number} index - Point index.
+     * @returns {Array<number>} Array representing the 2D basic coordinates of the point.
+     * @ignore
+     */
+    PointsGeometry.prototype.getPoint2d = function (index) {
+        return this._points[index].slice();
+    };
+    /**
+     * Remove a point from the point set.
+     *
+     * @param {number} index - The index of the point to remove.
+     * @ignore
+     */
+    PointsGeometry.prototype.removePoint2d = function (index) {
+        if (index < 0 ||
+            index >= this._points.length ||
+            this._points.length < 3) {
+            throw new Component_1.GeometryTagError("Index for removed point must be valid.");
         }
-        var relativeWidth = (elementWidth - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth);
-        var relativeHeight = (elementHeight - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight);
-        var coeff = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));
-        return minWidth + coeff * (maxWidth - minWidth);
+        this._points.splice(index, 1);
+        this._notifyChanged$.next(this);
     };
-    SequenceDOMRenderer.prototype._createPlayingButton = function (nextKey, prevKey, configuration, component) {
-        var canPlay = configuration.direction === Edge_1.EdgeDirection.Next && nextKey != null ||
-            configuration.direction === Edge_1.EdgeDirection.Prev && prevKey != null;
-        var onclick = configuration.playing ?
-            function (e) { component.stop(); } :
-            canPlay ? function (e) { component.play(); } : null;
-        var buttonProperties = {
-            onclick: onclick,
-            style: {},
-        };
-        var iconClass = configuration.playing ?
-            "Stop" :
-            canPlay ? "Play" : "PlayDisabled";
-        var icon = vd.h("div.SequenceComponentIcon", { className: iconClass }, []);
-        var buttonClass = canPlay ? "SequencePlay" : "SequencePlayDisabled";
-        return vd.h("div." + buttonClass, buttonProperties, [icon]);
+    /** @ignore */
+    PointsGeometry.prototype.setVertex2d = function (index, value, transform) {
+        this.setPoint2d(index, value, transform);
     };
-    SequenceDOMRenderer.prototype._createSequenceArrows = function (nextKey, prevKey, configuration, interaction, navigator) {
-        var nextProperties = {
-            onclick: nextKey != null ?
-                function (e) {
-                    navigator.moveDir$(Edge_1.EdgeDirection.Next)
-                        .subscribe(function (node) { return; }, function (error) { console.error(error); });
-                } :
-                null,
-            onmouseenter: function (e) { interaction.mouseEnterDirection$.next(Edge_1.EdgeDirection.Next); },
-            onmouseleave: function (e) { interaction.mouseLeaveDirection$.next(Edge_1.EdgeDirection.Next); },
-            style: {},
-        };
-        var prevProperties = {
-            onclick: prevKey != null ?
-                function (e) {
-                    navigator.moveDir$(Edge_1.EdgeDirection.Prev)
-                        .subscribe(function (node) { return; }, function (error) { console.error(error); });
-                } :
-                null,
-            onmouseenter: function (e) { interaction.mouseEnterDirection$.next(Edge_1.EdgeDirection.Prev); },
-            onmouseleave: function (e) { interaction.mouseLeaveDirection$.next(Edge_1.EdgeDirection.Prev); },
-            style: {},
-        };
-        var nextClass = this._getStepClassName(Edge_1.EdgeDirection.Next, nextKey, configuration.highlightKey);
-        var prevClass = this._getStepClassName(Edge_1.EdgeDirection.Prev, prevKey, configuration.highlightKey);
-        var nextIcon = vd.h("div.SequenceComponentIcon", []);
-        var prevIcon = vd.h("div.SequenceComponentIcon", []);
-        return [
-            vd.h("div." + nextClass, nextProperties, [nextIcon]),
-            vd.h("div." + prevClass, prevProperties, [prevIcon]),
+    /** @ignore */
+    PointsGeometry.prototype.setPoint2d = function (index, value, transform) {
+        var changed = [
+            Math.max(0, Math.min(1, value[0])),
+            Math.max(0, Math.min(1, value[1])),
         ];
+        this._points[index] = changed;
+        this._notifyChanged$.next(this);
     };
-    SequenceDOMRenderer.prototype._getStepClassName = function (direction, key, highlightKey) {
-        var className = direction === Edge_1.EdgeDirection.Next ?
-            "SequenceStepNext" :
-            "SequenceStepPrev";
-        if (key == null) {
-            className += "Disabled";
+    /** @ignore */
+    PointsGeometry.prototype.getPoints3d = function (transform) {
+        return this._getPoints3d(this._points, transform);
+    };
+    /** @ignore */
+    PointsGeometry.prototype.getPoint3d = function (index, transform) {
+        return transform.unprojectBasic(this._points[index], 200);
+    };
+    /** @ignore */
+    PointsGeometry.prototype.getPoints2d = function () {
+        return this._points.slice();
+    };
+    /** @ignore */
+    PointsGeometry.prototype.getCentroid2d = function (transform) {
+        if (!transform) {
+            throw new Component_1.GeometryTagError("Get centroid must be called with a transform for points geometries.");
         }
-        else {
-            if (highlightKey === key) {
-                className += "Highlight";
+        var _a = this.getRect2d(transform), minX = _a[0], minY = _a[1], maxX = _a[2], maxY = _a[3];
+        var centroidX = minX < maxX ?
+            (minX + maxX) / 2 :
+            ((minX + maxX + 1) / 2) % 1;
+        var centroidY = (minY + maxY) / 2;
+        return [centroidX, centroidY];
+    };
+    /** @ignore */
+    PointsGeometry.prototype.getCentroid3d = function (transform) {
+        var centroid2d = this.getCentroid2d();
+        return transform.unprojectBasic(centroid2d, 200);
+    };
+    /** @ignore */
+    PointsGeometry.prototype.getRect2d = function (transform) {
+        var minX = 1;
+        var maxX = 0;
+        var minY = 1;
+        var maxY = 0;
+        var points = this._points;
+        for (var _i = 0, points_2 = points; _i < points_2.length; _i++) {
+            var point = points_2[_i];
+            if (point[0] < minX) {
+                minX = point[0];
+            }
+            if (point[0] > maxX) {
+                maxX = point[0];
+            }
+            if (point[1] < minY) {
+                minY = point[1];
+            }
+            if (point[1] > maxY) {
+                maxY = point[1];
+            }
+        }
+        if (transform.fullPano) {
+            var indices = [];
+            for (var i = 0; i < points.length; i++) {
+                indices[i] = i;
+            }
+            indices.sort(function (a, b) {
+                return points[a][0] < points[b][0] ?
+                    -1 :
+                    points[a][0] > points[b][0] ?
+                        1 :
+                        a < b ? -1 : 1;
+            });
+            var maxDistanceX = points[indices[0]][0] + 1 - points[indices[indices.length - 1]][0];
+            var leftMostIndex = 0;
+            for (var i = 0; i < indices.length - 1; i++) {
+                var index1 = indices[i];
+                var index2 = indices[i + 1];
+                var distanceX = points[index2][0] - points[index1][0];
+                if (distanceX > maxDistanceX) {
+                    maxDistanceX = distanceX;
+                    leftMostIndex = i + 1;
+                }
+            }
+            if (leftMostIndex > 0) {
+                minX = points[indices[leftMostIndex]][0];
+                maxX = points[indices[leftMostIndex - 1]][0];
             }
         }
-        return className;
+        return [minX, minY, maxX, maxY];
     };
-    return SequenceDOMRenderer;
-}());
-exports.SequenceDOMRenderer = SequenceDOMRenderer;
-exports.default = SequenceDOMRenderer;
-
-},{"../../Edge":227,"virtual-dom":182}],282:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var GeometryTagError_1 = require("./error/GeometryTagError");
-exports.GeometryTagError = GeometryTagError_1.GeometryTagError;
-var PointGeometry_1 = require("./geometry/PointGeometry");
-exports.PointGeometry = PointGeometry_1.PointGeometry;
-var RectGeometry_1 = require("./geometry/RectGeometry");
-exports.RectGeometry = RectGeometry_1.RectGeometry;
-var PolygonGeometry_1 = require("./geometry/PolygonGeometry");
-exports.PolygonGeometry = PolygonGeometry_1.PolygonGeometry;
-var OutlineTag_1 = require("./tag/OutlineTag");
-exports.OutlineTag = OutlineTag_1.OutlineTag;
-var SpotTag_1 = require("./tag/SpotTag");
-exports.SpotTag = SpotTag_1.SpotTag;
-var TagComponent_1 = require("./TagComponent");
-exports.TagComponent = TagComponent_1.TagComponent;
-var TagMode_1 = require("./TagMode");
-exports.TagMode = TagMode_1.TagMode;
+    /** @ignore */
+    PointsGeometry.prototype.setCentroid2d = function (value, transform) {
+        throw new Error("Not implemented");
+    };
+    PointsGeometry.prototype._getPoints3d = function (points2d, transform) {
+        return points2d
+            .map(function (point) {
+            return transform.unprojectBasic(point, 200);
+        });
+    };
+    return PointsGeometry;
+}(Component_1.Geometry));
+exports.PointsGeometry = PointsGeometry;
+exports.default = PointsGeometry;
 
-},{"./TagComponent":283,"./TagMode":286,"./error/GeometryTagError":290,"./geometry/PointGeometry":292,"./geometry/PolygonGeometry":293,"./geometry/RectGeometry":294,"./tag/OutlineTag":298,"./tag/SpotTag":301}],283:[function(require,module,exports){
+},{"../../../Component":291}],378:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -26985,1182 +40835,1238 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var when = require("when");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/observable/empty");
-require("rxjs/add/observable/from");
-require("rxjs/add/observable/merge");
-require("rxjs/add/observable/of");
-require("rxjs/add/operator/combineLatest");
-require("rxjs/add/operator/concat");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/share");
-require("rxjs/add/operator/skip");
-require("rxjs/add/operator/skipUntil");
-require("rxjs/add/operator/startWith");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/take");
-require("rxjs/add/operator/takeUntil");
-require("rxjs/add/operator/withLatestFrom");
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-var Render_1 = require("../../Render");
+exports.PolygonGeometry = void 0;
+var Component_1 = require("../../../Component");
 /**
- * @class TagComponent
- *
- * @classdesc Component for showing and editing tags with different
- * geometries composed from 2D basic image coordinates (see the
- * {@link Viewer} class documentation for more information about coordinate
- * systems).
- *
- * The `add` method is used for adding new tags or replacing
- * tags already in the set. Tags are removed by id.
- *
- * If a tag already in the set has the same
- * id as one of the tags added, the old tag will be removed and
- * the added tag will take its place.
- *
- * The tag component mode can be set to either be non interactive or
- * to be in creating mode of a certain geometry type.
- *
- * The tag properties can be updated at any time and the change will
- * be visibile immediately.
- *
- * Tags are only relevant to a single image because they are based on
- * 2D basic image coordinates. Tags related to a certain image should
- * be removed when the viewer is moved to another node.
+ * @class PolygonGeometry
  *
- * To retrive and use the tag component
+ * @classdesc Represents a polygon geometry in the 2D basic image coordinate system.
+ * All polygons and holes provided to the constructor needs to be closed.
  *
  * @example
  * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>",
- *     { component: { tag: true } });
- *
- * var tagComponent = viewer.getComponent("tag");
+ * var basicPolygon = [[0.5, 0.3], [0.7, 0.3], [0.6, 0.5], [0.5, 0.3]];
+ * var polygonGeometry = new Mapillary.TagComponent.PolygonGeometry(basicPolygon);
  * ```
  */
-var TagComponent = (function (_super) {
-    __extends(TagComponent, _super);
-    function TagComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._tagDomRenderer = new Component_1.TagDOMRenderer();
-        _this._tagScene = new Component_1.TagScene();
-        _this._tagSet = new Component_1.TagSet();
-        _this._tagCreator = new Component_1.TagCreator(_this, navigator);
-        _this._viewportCoords = new Geo_1.ViewportCoords();
-        _this._renderTags$ = _this._tagSet.changed$
-            .map(function (tagSet) {
-            var tags = tagSet.getAll();
-            // ensure that tags are always rendered in the same order
-            // to avoid hover tracking problems on first resize.
-            tags.sort(function (t1, t2) {
-                var id1 = t1.tag.id;
-                var id2 = t2.tag.id;
-                if (id1 < id2) {
-                    return -1;
-                }
-                if (id1 > id2) {
-                    return 1;
+var PolygonGeometry = /** @class */ (function (_super) {
+    __extends(PolygonGeometry, _super);
+    /**
+     * Create a polygon geometry.
+     *
+     * @constructor
+     * @param {Array<Array<number>>} polygon - Array of polygon vertices. Must be closed.
+     * @param {Array<Array<Array<number>>>} [holes] - Array of arrays of hole vertices.
+     * Each array of holes vertices must be closed.
+     *
+     * @throws {GeometryTagError} Polygon coordinates must be valid basic coordinates.
+     */
+    function PolygonGeometry(polygon, holes) {
+        var _this = _super.call(this) || this;
+        var polygonLength = polygon.length;
+        if (polygonLength < 3) {
+            throw new Component_1.GeometryTagError("A polygon must have three or more positions.");
+        }
+        if (polygon[0][0] !== polygon[polygonLength - 1][0] ||
+            polygon[0][1] !== polygon[polygonLength - 1][1]) {
+            throw new Component_1.GeometryTagError("First and last positions must be equivalent.");
+        }
+        _this._polygon = [];
+        for (var _i = 0, polygon_1 = polygon; _i < polygon_1.length; _i++) {
+            var vertex = polygon_1[_i];
+            if (vertex[0] < 0 || vertex[0] > 1 ||
+                vertex[1] < 0 || vertex[1] > 1) {
+                throw new Component_1.GeometryTagError("Basic coordinates of polygon must be on the interval [0, 1].");
+            }
+            _this._polygon.push(vertex.slice());
+        }
+        _this._holes = [];
+        if (holes == null) {
+            return _this;
+        }
+        for (var i = 0; i < holes.length; i++) {
+            var hole = holes[i];
+            var holeLength = hole.length;
+            if (holeLength < 3) {
+                throw new Component_1.GeometryTagError("A polygon hole must have three or more positions.");
+            }
+            if (hole[0][0] !== hole[holeLength - 1][0] ||
+                hole[0][1] !== hole[holeLength - 1][1]) {
+                throw new Component_1.GeometryTagError("First and last positions of hole must be equivalent.");
+            }
+            _this._holes.push([]);
+            for (var _a = 0, hole_1 = hole; _a < hole_1.length; _a++) {
+                var vertex = hole_1[_a];
+                if (vertex[0] < 0 || vertex[0] > 1 ||
+                    vertex[1] < 0 || vertex[1] > 1) {
+                    throw new Component_1.GeometryTagError("Basic coordinates of hole must be on the interval [0, 1].");
                 }
-                return 0;
-            });
-            return tags;
-        })
-            .share();
-        _this._tagChanged$ = _this._renderTags$
-            .switchMap(function (tags) {
-            return Observable_1.Observable
-                .from(tags)
-                .mergeMap(function (tag) {
-                return Observable_1.Observable
-                    .merge(tag.tag.changed$, tag.tag.geometryChanged$);
-            });
-        })
-            .share();
-        _this._renderTagGLChanged$ = _this._renderTags$
-            .switchMap(function (tags) {
-            return Observable_1.Observable
-                .from(tags)
-                .mergeMap(function (tag) {
-                return tag.glObjectsChanged$;
-            });
-        })
-            .share();
-        _this._tagInterationInitiated$ = _this._renderTags$
-            .switchMap(function (tags) {
-            return Observable_1.Observable
-                .from(tags)
-                .mergeMap(function (tag) {
-                return tag.interact$
-                    .map(function (interaction) {
-                    return interaction.tag.id;
-                });
-            });
-        })
-            .share();
-        _this._tagInteractionAbort$ = Observable_1.Observable
-            .merge(_this._container.mouseService.documentMouseUp$)
-            .map(function (e) { })
-            .share();
-        _this._activeTag$ = _this._renderTags$
-            .switchMap(function (tags) {
-            return Observable_1.Observable
-                .from(tags)
-                .mergeMap(function (tag) {
-                return tag.interact$;
-            });
-        })
-            .merge(_this._tagInteractionAbort$
-            .map(function () {
-            return { offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: null };
-        }))
-            .share();
-        _this._createGeometryChanged$ = _this._tagCreator.tag$
-            .switchMap(function (tag) {
-            return tag != null ?
-                tag.geometryChanged$ :
-                Observable_1.Observable.empty();
-        })
-            .share();
-        _this._createGLObjectsChanged$ = _this._tagCreator.tag$
-            .switchMap(function (tag) {
-            return tag != null ?
-                tag.glObjectsChanged$ :
-                Observable_1.Observable.empty();
-        })
-            .share();
-        _this._tagCreated$ = _this._tagCreator.tag$
-            .switchMap(function (tag) {
-            return tag != null ?
-                tag.created$ :
-                Observable_1.Observable.empty();
-        })
-            .share();
-        _this._vertexGeometryCreated$ = _this._tagCreated$
-            .map(function (tag) {
-            return tag.geometry;
-        })
-            .share();
-        _this._pointGeometryCreated$ = new Subject_1.Subject();
-        _this._geometryCreated$ = Observable_1.Observable
-            .merge(_this._vertexGeometryCreated$, _this._pointGeometryCreated$)
-            .share();
-        _this._basicClick$ = _this._container.mouseService.staticClick$
-            .withLatestFrom(_this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$, function (event, renderCamera, transform) {
-            return [event, renderCamera, transform];
-        })
-            .map(function (ert) {
-            var event = ert[0];
-            var camera = ert[1];
-            var transform = ert[2];
-            var basic = _this._mouseEventToBasic(event, _this._container.element, camera, transform);
-            return basic;
-        })
-            .share();
-        _this._validBasicClick$ = _this._basicClick$
-            .filter(function (basic) {
-            var x = basic[0];
-            var y = basic[1];
-            return 0 <= x && x <= 1 && 0 <= y && y <= 1;
-        })
-            .share();
-        _this._creatingConfiguration$ = _this._configuration$
-            .distinctUntilChanged(function (c1, c2) {
-            return c1.mode === c2.mode;
-        }, function (configuration) {
-            return {
-                createColor: configuration.createColor,
-                mode: configuration.mode,
-            };
-        })
-            .publishReplay(1)
-            .refCount();
-        _this._creating$ = _this._creatingConfiguration$
-            .map(function (configuration) {
-            return configuration.mode !== Component_1.TagMode.Default;
-        })
-            .publishReplay(1)
-            .refCount();
-        _this._creatingConfiguration$
-            .subscribe(function (configuration) {
-            _this.fire(TagComponent.modechanged, configuration.mode);
-        });
+                _this._holes[i].push(vertex.slice());
+            }
+        }
         return _this;
     }
+    Object.defineProperty(PolygonGeometry.prototype, "polygon", {
+        /**
+         * Get polygon property.
+         * @returns {Array<Array<number>>} Closed 2d polygon.
+         */
+        get: function () {
+            return this._polygon;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(PolygonGeometry.prototype, "holes", {
+        /**
+         * Get holes property.
+         * @returns {Array<Array<Array<number>>>} Holes of 2d polygon.
+         */
+        get: function () {
+            return this._holes;
+        },
+        enumerable: false,
+        configurable: true
+    });
     /**
-     * Add tags to the tag set or replace tags in the tag set.
+     * Add a vertex to the polygon by appending it after the last vertex.
      *
-     * @description If a tag already in the set has the same
-     * id as one of the tags added, the old tag will be removed
-     * the added tag will take its place.
+     * @param {Array<number>} vertex - Vertex to add.
+     * @ignore
+     */
+    PolygonGeometry.prototype.addVertex2d = function (vertex) {
+        var clamped = [
+            Math.max(0, Math.min(1, vertex[0])),
+            Math.max(0, Math.min(1, vertex[1])),
+        ];
+        this._polygon.splice(this._polygon.length - 1, 0, clamped);
+        this._notifyChanged$.next(this);
+    };
+    /**
+     * Get the coordinates of a vertex from the polygon representation of the geometry.
      *
-     * @param {Array<Tag>} tags - Tags to add.
+     * @param {number} index - Vertex index.
+     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
+     * @ignore
+     */
+    PolygonGeometry.prototype.getVertex2d = function (index) {
+        return this._polygon[index].slice();
+    };
+    /**
+     * Remove a vertex from the polygon.
      *
-     * @example ```tagComponent.add([tag1, tag2]);```
+     * @param {number} index - The index of the vertex to remove.
+     * @ignore
      */
-    TagComponent.prototype.add = function (tags) {
-        var _this = this;
-        if (this._activated) {
-            this._navigator.stateService.currentTransform$
-                .first()
-                .subscribe(function (transform) {
-                _this._tagSet.add(tags, transform);
-                var renderTags = tags
-                    .map(function (tag) {
-                    return _this._tagSet.get(tag.id);
-                });
-                _this._tagScene.add(renderTags);
-            });
+    PolygonGeometry.prototype.removeVertex2d = function (index) {
+        if (index < 0 ||
+            index >= this._polygon.length ||
+            this._polygon.length < 4) {
+            throw new Component_1.GeometryTagError("Index for removed vertex must be valid.");
+        }
+        if (index > 0 && index < this._polygon.length - 1) {
+            this._polygon.splice(index, 1);
         }
         else {
-            this._tagSet.addDeactivated(tags);
+            this._polygon.splice(0, 1);
+            this._polygon.pop();
+            var closing = this._polygon[0].slice();
+            this._polygon.push(closing);
+        }
+        this._notifyChanged$.next(this);
+    };
+    /** @ignore */
+    PolygonGeometry.prototype.setVertex2d = function (index, value, transform) {
+        var changed = [
+            Math.max(0, Math.min(1, value[0])),
+            Math.max(0, Math.min(1, value[1])),
+        ];
+        if (index === 0 || index === this._polygon.length - 1) {
+            this._polygon[0] = changed.slice();
+            this._polygon[this._polygon.length - 1] = changed.slice();
+        }
+        else {
+            this._polygon[index] = changed.slice();
+        }
+        this._notifyChanged$.next(this);
+    };
+    /** @ignore */
+    PolygonGeometry.prototype.setCentroid2d = function (value, transform) {
+        var xs = this._polygon.map(function (point) { return point[0]; });
+        var ys = this._polygon.map(function (point) { return point[1]; });
+        var minX = Math.min.apply(Math, xs);
+        var maxX = Math.max.apply(Math, xs);
+        var minY = Math.min.apply(Math, ys);
+        var maxY = Math.max.apply(Math, ys);
+        var centroid = this.getCentroid2d();
+        var minTranslationX = -minX;
+        var maxTranslationX = 1 - maxX;
+        var minTranslationY = -minY;
+        var maxTranslationY = 1 - maxY;
+        var translationX = Math.max(minTranslationX, Math.min(maxTranslationX, value[0] - centroid[0]));
+        var translationY = Math.max(minTranslationY, Math.min(maxTranslationY, value[1] - centroid[1]));
+        for (var _i = 0, _a = this._polygon; _i < _a.length; _i++) {
+            var point = _a[_i];
+            point[0] += translationX;
+            point[1] += translationY;
         }
+        this._notifyChanged$.next(this);
+    };
+    /** @ignore */
+    PolygonGeometry.prototype.getPoints3d = function (transform) {
+        return this._getPoints3d(this._subsample(this._polygon), transform);
+    };
+    /** @ignore */
+    PolygonGeometry.prototype.getVertex3d = function (index, transform) {
+        return transform.unprojectBasic(this._polygon[index], 200);
+    };
+    /** @ignore */
+    PolygonGeometry.prototype.getVertices2d = function () {
+        return this._polygon.slice();
+    };
+    /** @ignore */
+    PolygonGeometry.prototype.getVertices3d = function (transform) {
+        return this._getPoints3d(this._polygon, transform);
     };
     /**
-     * Change the current tag mode.
-     *
-     * @description Change the tag mode to one of the create modes for creating new geometries.
-     *
-     * @param {TagMode} mode - New tag mode.
+     * Get a polygon representation of the 3D coordinates for the vertices of each hole
+     * of the geometry. Line segments between vertices will possibly be subsampled
+     * resulting in a larger number of points than the total number of vertices.
      *
-     * @fires TagComponent#modechanged
+     * @param {Transform} transform - The transform of the node related to the geometry.
+     * @returns {Array<Array<Array<number>>>} Array of hole polygons in 3D world coordinates
+     * representing the vertices of each hole of the geometry.
+     * @ignore
+     */
+    PolygonGeometry.prototype.getHolePoints3d = function (transform) {
+        var _this = this;
+        return this._holes
+            .map(function (hole2d) {
+            return _this._getPoints3d(_this._subsample(hole2d), transform);
+        });
+    };
+    /**
+     * Get a polygon representation of the 3D coordinates for the vertices of each hole
+     * of the geometry.
      *
-     * @example ```tagComponent.changeMode(Mapillary.TagComponent.TagMode.CreateRect);```
+     * @param {Transform} transform - The transform of the node related to the geometry.
+     * @returns {Array<Array<Array<number>>>} Array of hole polygons in 3D world coordinates
+     * representing the vertices of each hole of the geometry.
+     * @ignore
      */
-    TagComponent.prototype.changeMode = function (mode) {
-        this.configure({ mode: mode });
+    PolygonGeometry.prototype.getHoleVertices3d = function (transform) {
+        var _this = this;
+        return this._holes
+            .map(function (hole2d) {
+            return _this._getPoints3d(hole2d, transform);
+        });
+    };
+    /** @ignore */
+    PolygonGeometry.prototype.getCentroid2d = function () {
+        var polygon = this._polygon;
+        var area = 0;
+        var centroidX = 0;
+        var centroidY = 0;
+        for (var i = 0; i < polygon.length - 1; i++) {
+            var xi = polygon[i][0];
+            var yi = polygon[i][1];
+            var xi1 = polygon[i + 1][0];
+            var yi1 = polygon[i + 1][1];
+            var a = xi * yi1 - xi1 * yi;
+            area += a;
+            centroidX += (xi + xi1) * a;
+            centroidY += (yi + yi1) * a;
+        }
+        area /= 2;
+        centroidX /= 6 * area;
+        centroidY /= 6 * area;
+        return [centroidX, centroidY];
+    };
+    /** @ignore */
+    PolygonGeometry.prototype.getCentroid3d = function (transform) {
+        var centroid2d = this.getCentroid2d();
+        return transform.unprojectBasic(centroid2d, 200);
+    };
+    /** @ignore */
+    PolygonGeometry.prototype.get3dDomainTriangles3d = function (transform) {
+        var _this = this;
+        return this._triangulate(this._project(this._polygon, transform), this.getVertices3d(transform), this._holes
+            .map(function (hole2d) {
+            return _this._project(hole2d, transform);
+        }), this.getHoleVertices3d(transform));
+    };
+    /** @ignore */
+    PolygonGeometry.prototype.getTriangles3d = function (transform) {
+        var _this = this;
+        if (transform.fullPano) {
+            return this._triangulatePano(this._polygon.slice(), this.holes.slice(), transform);
+        }
+        var points2d = this._project(this._subsample(this._polygon), transform);
+        var points3d = this.getPoints3d(transform);
+        var holes2d = this._holes
+            .map(function (hole) {
+            return _this._project(_this._subsample(hole), transform);
+        });
+        var holes3d = this.getHolePoints3d(transform);
+        return this._triangulate(points2d, points3d, holes2d, holes3d);
+    };
+    /** @ignore */
+    PolygonGeometry.prototype.getPoleOfInaccessibility2d = function () {
+        return this._getPoleOfInaccessibility2d(this._polygon.slice());
+    };
+    /** @ignore */
+    PolygonGeometry.prototype.getPoleOfInaccessibility3d = function (transform) {
+        var pole2d = this._getPoleOfInaccessibility2d(this._polygon.slice());
+        return transform.unprojectBasic(pole2d, 200);
+    };
+    PolygonGeometry.prototype._getPoints3d = function (points2d, transform) {
+        return points2d
+            .map(function (point) {
+            return transform.unprojectBasic(point, 200);
+        });
+    };
+    return PolygonGeometry;
+}(Component_1.VertexGeometry));
+exports.PolygonGeometry = PolygonGeometry;
+exports.default = PolygonGeometry;
+
+},{"../../../Component":291}],379:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.RectGeometry = void 0;
+var Component_1 = require("../../../Component");
+/**
+ * @class RectGeometry
+ *
+ * @classdesc Represents a rectangle geometry in the 2D basic image coordinate system.
+ *
+ * @example
+ * ```
+ * var basicRect = [0.5, 0.3, 0.7, 0.4];
+ * var rectGeometry = new Mapillary.TagComponent.RectGeometry(basicRect);
+ * ```
+ */
+var RectGeometry = /** @class */ (function (_super) {
+    __extends(RectGeometry, _super);
     /**
-     * Returns the tag in the tag set with the specified id, or
-     * undefined if the id matches no tag.
+     * Create a rectangle geometry.
      *
-     * @param {string} tagId - Id of the tag.
+     * @constructor
+     * @param {Array<number>} rect - An array representing the top-left and bottom-right
+     * corners of the rectangle in basic coordinates. Ordered according to [x0, y0, x1, y1].
      *
-     * @example ```var tag = tagComponent.get("tagId");```
+     * @throws {GeometryTagError} Rectangle coordinates must be valid basic coordinates.
      */
-    TagComponent.prototype.get = function (tagId) {
-        if (this._activated) {
-            var renderTag = this._tagSet.get(tagId);
-            return renderTag !== undefined ? renderTag.tag : undefined;
+    function RectGeometry(rect) {
+        var _this = _super.call(this) || this;
+        if (rect[1] > rect[3]) {
+            throw new Component_1.GeometryTagError("Basic Y coordinates values can not be inverted.");
         }
-        else {
-            return this._tagSet.getDeactivated(tagId);
+        for (var _i = 0, rect_1 = rect; _i < rect_1.length; _i++) {
+            var coord = rect_1[_i];
+            if (coord < 0 || coord > 1) {
+                throw new Component_1.GeometryTagError("Basic coordinates must be on the interval [0, 1].");
+            }
         }
-    };
+        _this._anchorIndex = undefined;
+        _this._rect = rect.slice(0, 4);
+        _this._inverted = _this._rect[0] > _this._rect[2];
+        return _this;
+    }
+    Object.defineProperty(RectGeometry.prototype, "anchorIndex", {
+        /**
+         * Get anchor index property.
+         *
+         * @returns {number} Index representing the current anchor property if
+         * achoring indexing has been initialized. If anchor indexing has not been
+         * initialized or has been terminated undefined will be returned.
+         * @ignore
+         */
+        get: function () {
+            return this._anchorIndex;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RectGeometry.prototype, "inverted", {
+        /**
+         * Get inverted property.
+         *
+         * @returns {boolean} Boolean determining whether the rect geometry is
+         * inverted. For panoramas the rect geometrye may be inverted.
+         * @ignore
+         */
+        get: function () {
+            return this._inverted;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RectGeometry.prototype, "rect", {
+        /**
+         * Get rect property.
+         *
+         * @returns {Array<number>} Array representing the top-left and bottom-right
+         * corners of the rectangle in basic coordinates.
+         */
+        get: function () {
+            return this._rect;
+        },
+        enumerable: false,
+        configurable: true
+    });
     /**
-     * Returns an array of all tags.
+     * Initialize anchor indexing to enable setting opposite vertex.
      *
-     * @example ```var tags = tagComponent.getAll();```
+     * @param {number} [index] - The index of the vertex to use as anchor.
+     *
+     * @throws {Error} If anchor indexing has already been initialized.
+     * @throws {Error} If index is not valid (0 to 3).
+     * @ignore
      */
-    TagComponent.prototype.getAll = function () {
-        if (this.activated) {
-            return this._tagSet
-                .getAll()
-                .map(function (renderTag) {
-                return renderTag.tag;
-            });
+    RectGeometry.prototype.initializeAnchorIndexing = function (index) {
+        if (this._anchorIndex !== undefined) {
+            throw new Error("Anchor indexing is already initialized.");
         }
-        else {
-            return this._tagSet.getAllDeactivated();
+        if (index < 0 || index > 3) {
+            throw new Error("Invalid anchor index: " + index + ".");
         }
+        this._anchorIndex = index === undefined ? 0 : index;
     };
     /**
-     * Returns an array of tag ids for tags that contain the specified point.
-     *
-     * @description The pixel point must lie inside the polygon or rectangle
-     * of an added tag for the tag id to be returned. Tag ids for
-     * tags that do not have a fill will also be returned if the point is inside
-     * the geometry of the tag. Tags with point geometries can not be retrieved.
-     *
-     * No tag ids will be returned for panoramas.
-     *
-     * Notice that the pixelPoint argument requires x, y coordinates from pixel space.
-     *
-     * With this function, you can use the coordinates provided by mouse
-     * events to get information out of the tag component.
-     *
-     * If no tag at exist the pixel point, an empty array will be returned.
-     *
-     * @param {Array<number>} pixelPoint - Pixel coordinates on the viewer element.
-     * @returns {Array<string>} Ids of the tags that contain the specified pixel point.
-     *
-     * @example
-     * ```
-     * tagComponent.getTagIdsAt([100, 100])
-     *     .then((tagIds) => { console.log(tagIds); });
-     * ```
-     */
-    TagComponent.prototype.getTagIdsAt = function (pixelPoint) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._container.renderService.renderCamera$
-                .first()
-                .map(function (render) {
-                var viewport = _this._viewportCoords
-                    .canvasToViewport(pixelPoint[0], pixelPoint[1], _this._container.element);
-                var ids = _this._tagScene.intersectObjects(viewport, render.perspective);
-                return ids;
-            })
-                .subscribe(function (ids) {
-                resolve(ids);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Check if a tag exist in the tag set.
-     *
-     * @param {string} tagId - Id of the tag.
-     *
-     * @example ```var tagExists = tagComponent.has("tagId");```
+     * Terminate anchor indexing to disable setting pposite vertex.
+     * @ignore
      */
-    TagComponent.prototype.has = function (tagId) {
-        return this._activated ? this._tagSet.has(tagId) : this._tagSet.hasDeactivated(tagId);
+    RectGeometry.prototype.terminateAnchorIndexing = function () {
+        this._anchorIndex = undefined;
     };
     /**
-     * Remove tags with the specified ids from the tag set.
+     * Set the value of the vertex opposite to the anchor in the polygon
+     * representation of the rectangle.
      *
-     * @param {Array<string>} tagIds - Ids for tags to remove.
+     * @description Setting the opposite vertex may change the anchor index.
      *
-     * @example ```tagComponent.remove(["id-1", "id-2"]);```
-     */
-    TagComponent.prototype.remove = function (tagIds) {
-        if (this._activated) {
-            this._tagSet.remove(tagIds);
-            this._tagScene.remove(tagIds);
-        }
-        else {
-            this._tagSet.removeDeactivated(tagIds);
-        }
-    };
-    /**
-     * Remove all tags from the tag set.
+     * @param {Array<number>} opposite - The new value of the vertex opposite to the anchor.
+     * @param {Transform} transform - The transform of the node related to the rectangle.
      *
-     * @example ```tagComponent.removeAll();```
+     * @throws {Error} When anchor indexing has not been initialized.
+     * @ignore
      */
-    TagComponent.prototype.removeAll = function () {
-        if (this._activated) {
-            this._tagSet.removeAll();
-            this._tagScene.removeAll();
+    RectGeometry.prototype.setOppositeVertex2d = function (opposite, transform) {
+        if (this._anchorIndex === undefined) {
+            throw new Error("Anchor indexing needs to be initialized.");
         }
-        else {
-            this._tagSet.removeAllDeactivated();
-        }
-    };
-    TagComponent.prototype._activate = function () {
-        var _this = this;
-        this._preventDefaultSubscription = this._activeTag$
-            .switchMap(function (interaction) {
-            return interaction.tag != null ?
-                _this._container.mouseService.documentMouseMove$ :
-                Observable_1.Observable.empty();
-        })
-            .subscribe(function (event) {
-            event.preventDefault(); // prevent selection of content outside the viewer
-        });
-        this._geometryCreatedEventSubscription = this._geometryCreated$
-            .subscribe(function (geometry) {
-            _this.fire(TagComponent.geometrycreated, geometry);
-        });
-        this._tagsChangedEventSubscription = this._renderTags$
-            .subscribe(function (tags) {
-            _this.fire(TagComponent.tagschanged, _this);
-        });
-        var transformChanged$ = this.configuration$
-            .switchMap(function (configuration) {
-            return configuration.mode !== Component_1.TagMode.Default ?
-                _this._navigator.stateService.currentTransform$
-                    .map(function (n) { return null; }) :
-                Observable_1.Observable.empty();
-        })
-            .publishReplay(1)
-            .refCount();
-        this._deleteCreatingSubscription = transformChanged$
-            .skip(1)
-            .subscribe(function () {
-            _this._tagCreator.delete$.next(null);
-        });
-        var tagAborted$ = this._tagCreator.tag$
-            .switchMap(function (tag) {
-            return tag != null ?
-                tag.aborted$
-                    .map(function (t) { return null; }) :
-                Observable_1.Observable.empty();
-        });
-        var tagCreated$ = this._tagCreated$
-            .map(function (t) { return null; });
-        var pointGeometryCreated$ = this._pointGeometryCreated$
-            .map(function (p) { return null; });
-        this._stopCreateSubscription = Observable_1.Observable
-            .merge(tagAborted$, tagCreated$, pointGeometryCreated$)
-            .subscribe(function () { _this.changeMode(Component_1.TagMode.Default); });
-        var creatingStarted$ = Observable_1.Observable
-            .combineLatest(this._creatingConfiguration$, transformChanged$)
-            .map(function (_a) {
-            var configuration = _a[0];
-            return configuration;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._createSubscription = creatingStarted$
-            .switchMap(function (configuration) {
-            return configuration.mode === Component_1.TagMode.CreateRect ||
-                configuration.mode === Component_1.TagMode.CreatePolygon ?
-                _this._validBasicClick$.take(1) :
-                Observable_1.Observable.empty();
-        })
-            .subscribe(this._tagCreator.create$);
-        this._createPointSubscription = creatingStarted$
-            .switchMap(function (configuration) {
-            return configuration.mode === Component_1.TagMode.CreatePoint ?
-                _this._validBasicClick$.take(1) :
-                Observable_1.Observable.empty();
-        })
-            .map(function (basic) {
-            return new Component_1.PointGeometry(basic);
-        })
-            .subscribe(this._pointGeometryCreated$);
-        var containerMouseMove$ = Observable_1.Observable
-            .merge(this._container.mouseService.mouseMove$, this._container.mouseService.domMouseMove$)
-            .share();
-        this._setCreateVertexSubscription = Observable_1.Observable
-            .combineLatest(containerMouseMove$, this._tagCreator.tag$, this._container.renderService.renderCamera$)
-            .filter(function (etr) {
-            return etr[1] != null;
-        })
-            .withLatestFrom(this._navigator.stateService.currentTransform$, function (etr, transform) {
-            return [etr[0], etr[1], etr[2], transform];
-        })
-            .subscribe(function (etrt) {
-            var event = etrt[0];
-            var tag = etrt[1];
-            var camera = etrt[2];
-            var transform = etrt[3];
-            var basic = _this._mouseEventToBasic(event, _this._container.element, camera, transform);
-            if (tag.geometry instanceof Component_1.RectGeometry) {
-                tag.geometry.setVertex2d(3, basic, transform);
-            }
-            else if (tag.geometry instanceof Component_1.PolygonGeometry) {
-                tag.geometry.setVertex2d(tag.geometry.polygon.length - 2, basic, transform);
+        var changed = [
+            Math.max(0, Math.min(1, opposite[0])),
+            Math.max(0, Math.min(1, opposite[1])),
+        ];
+        var original = this._rect.slice();
+        var anchor = this._anchorIndex === 0 ? [original[0], original[3]] :
+            this._anchorIndex === 1 ? [original[0], original[1]] :
+                this._anchorIndex === 2 ? [original[2], original[1]] :
+                    [original[2], original[3]];
+        if (transform.fullPano) {
+            var deltaX = this._anchorIndex < 2 ?
+                changed[0] - original[2] :
+                changed[0] - original[0];
+            if (!this._inverted && this._anchorIndex < 2 && changed[0] < 0.25 && original[2] > 0.75 && deltaX < -0.5) {
+                // right side passes boundary rightward
+                this._inverted = true;
+                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
+            }
+            else if (!this._inverted && this._anchorIndex >= 2 && changed[0] < 0.25 && original[2] > 0.75 && deltaX < -0.5) {
+                // left side passes right side and boundary rightward
+                this._inverted = true;
+                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
+            }
+            else if (this._inverted && this._anchorIndex >= 2 && changed[0] < 0.25 && original[0] > 0.75 && deltaX < -0.5) {
+                this._inverted = false;
+                if (anchor[0] > changed[0]) {
+                    // left side passes boundary rightward
+                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
+                }
+                else {
+                    // left side passes right side and boundary rightward
+                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
+                }
             }
-        });
-        this._addPointSubscription = creatingStarted$
-            .switchMap(function (configuration) {
-            return configuration.mode === Component_1.TagMode.CreateRect || configuration.mode === Component_1.TagMode.CreatePolygon ?
-                _this._basicClick$.skipUntil(_this._validBasicClick$).skip(1) :
-                Observable_1.Observable.empty();
-        })
-            .withLatestFrom(this._tagCreator.tag$, function (basic, tag) {
-            return [basic, tag];
-        })
-            .subscribe(function (bt) {
-            var basic = bt[0];
-            var tag = bt[1];
-            tag.addPoint(basic);
-        });
-        this._containerClassListSubscription = this._creating$
-            .subscribe(function (creating) {
-            if (creating) {
-                _this._container.element.classList.add("component-tag-create");
+            else if (!this._inverted && this._anchorIndex >= 2 && changed[0] > 0.75 && original[0] < 0.25 && deltaX > 0.5) {
+                // left side passes boundary leftward
+                this._inverted = true;
+                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
+            }
+            else if (!this._inverted && this._anchorIndex < 2 && changed[0] > 0.75 && original[0] < 0.25 && deltaX > 0.5) {
+                // right side passes left side and boundary leftward
+                this._inverted = true;
+                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
+            }
+            else if (this._inverted && this._anchorIndex < 2 && changed[0] > 0.75 && original[2] < 0.25 && deltaX > 0.5) {
+                this._inverted = false;
+                if (anchor[0] > changed[0]) {
+                    // right side passes boundary leftward
+                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
+                }
+                else {
+                    // right side passes left side and boundary leftward
+                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
+                }
+            }
+            else if (this._inverted && this._anchorIndex < 2 && changed[0] > original[0]) {
+                // inverted and right side passes left side completing a loop
+                this._inverted = false;
+                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
+            }
+            else if (this._inverted && this._anchorIndex >= 2 && changed[0] < original[2]) {
+                // inverted and left side passes right side completing a loop
+                this._inverted = false;
+                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
+            }
+            else if (this._inverted) {
+                // if still inverted only top and bottom can switch
+                if (this._anchorIndex < 2) {
+                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
+                }
+                else {
+                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
+                }
             }
             else {
-                _this._container.element.classList.remove("component-tag-create");
+                // if still not inverted treat as non full pano
+                if (anchor[0] <= changed[0] && anchor[1] > changed[1]) {
+                    this._anchorIndex = 0;
+                }
+                else if (anchor[0] <= changed[0] && anchor[1] <= changed[1]) {
+                    this._anchorIndex = 1;
+                }
+                else if (anchor[0] > changed[0] && anchor[1] <= changed[1]) {
+                    this._anchorIndex = 2;
+                }
+                else {
+                    this._anchorIndex = 3;
+                }
             }
-        });
-        this._deleteCreatedSubscription = this._creating$
-            .subscribe(function (creating) {
-            _this._tagCreator.delete$.next(null);
-        });
-        this._setGLCreateTagSubscription = this._tagCreator.tag$
-            .subscribe(function (tag) {
-            if (_this._tagScene.hasCreateTag()) {
-                _this._tagScene.removeCreateTag();
+            var rect = [];
+            if (this._anchorIndex === 0) {
+                rect[0] = anchor[0];
+                rect[1] = changed[1];
+                rect[2] = changed[0];
+                rect[3] = anchor[1];
+            }
+            else if (this._anchorIndex === 1) {
+                rect[0] = anchor[0];
+                rect[1] = anchor[1];
+                rect[2] = changed[0];
+                rect[3] = changed[1];
+            }
+            else if (this._anchorIndex === 2) {
+                rect[0] = changed[0];
+                rect[1] = anchor[1];
+                rect[2] = anchor[0];
+                rect[3] = changed[1];
             }
-            if (tag != null) {
-                _this._tagScene.addCreateTag(tag);
+            else {
+                rect[0] = changed[0];
+                rect[1] = changed[1];
+                rect[2] = anchor[0];
+                rect[3] = anchor[1];
             }
-        });
-        this._createGLObjectsChangedSubscription = this._createGLObjectsChanged$
-            .subscribe(function (tag) {
-            _this._tagScene.updateCreateTagObjects(tag);
-        });
-        this._claimMouseSubscription = this._tagInterationInitiated$
-            .switchMap(function (id) {
-            return containerMouseMove$
-                .takeUntil(_this._tagInteractionAbort$)
-                .take(1);
-        })
-            .subscribe(function (e) {
-            _this._container.mouseService.claimMouse(_this._name, 1);
-        });
-        this._mouseDragSubscription = this._activeTag$
-            .withLatestFrom(containerMouseMove$, function (a, e) {
-            return [a, e];
-        })
-            .switchMap(function (args) {
-            var activeTag = args[0];
-            var mouseMove = args[1];
-            if (activeTag.operation === Component_1.TagOperation.None) {
-                return Observable_1.Observable.empty();
-            }
-            var mouseDrag$ = Observable_1.Observable
-                .of(mouseMove)
-                .concat(_this._container.mouseService
-                .filtered$(_this._name, _this._container.mouseService.domMouseDrag$)
-                .filter(function (event) {
-                return _this._viewportCoords.insideElement(event, _this._container.element);
-            }));
-            return Observable_1.Observable
-                .combineLatest(mouseDrag$, _this._container.renderService.renderCamera$)
-                .withLatestFrom(Observable_1.Observable.of(activeTag), _this._navigator.stateService.currentTransform$, function (ec, a, t) {
-                return [ec[0], ec[1], a, t];
-            });
-        })
-            .subscribe(function (args) {
-            var mouseEvent = args[0];
-            var renderCamera = args[1];
-            var activeTag = args[2];
-            var transform = args[3];
-            if (activeTag.operation === Component_1.TagOperation.None) {
-                return;
+            if (!this._inverted && rect[0] > rect[2] ||
+                this._inverted && rect[0] < rect[2]) {
+                rect[0] = original[0];
+                rect[2] = original[2];
             }
-            var basic = _this._mouseEventToBasic(mouseEvent, _this._container.element, renderCamera, transform, activeTag.offsetX, activeTag.offsetY);
-            if (activeTag.operation === Component_1.TagOperation.Centroid) {
-                activeTag.tag.geometry.setCentroid2d(basic, transform);
+            if (rect[1] > rect[3]) {
+                rect[1] = original[1];
+                rect[3] = original[3];
             }
-            else if (activeTag.operation === Component_1.TagOperation.Vertex) {
-                var vertexGeometry = activeTag.tag.geometry;
-                vertexGeometry.setVertex2d(activeTag.vertexIndex, basic, transform);
+            this._rect[0] = rect[0];
+            this._rect[1] = rect[1];
+            this._rect[2] = rect[2];
+            this._rect[3] = rect[3];
+        }
+        else {
+            if (anchor[0] <= changed[0] && anchor[1] > changed[1]) {
+                this._anchorIndex = 0;
             }
-        });
-        this._unclaimMouseSubscription = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.domMouseDragEnd$)
-            .subscribe(function (e) {
-            _this._container.mouseService.unclaimMouse(_this._name);
-        });
-        this._updateGLObjectsSubscription = this._renderTagGLChanged$
-            .subscribe(function (tag) {
-            _this._tagScene.updateObjects(tag);
-        });
-        this._updateTagSceneSubscription = this._tagChanged$
-            .subscribe(function (tag) {
-            _this._tagScene.update();
-        });
-        this._domSubscription = this._renderTags$
-            .startWith([])
-            .do(function (tags) {
-            _this._container.domRenderer.render$.next({
-                name: _this._name,
-                vnode: _this._tagDomRenderer.clear(),
-            });
-        })
-            .combineLatest(this._container.renderService.renderCamera$, this._container.spriteService.spriteAtlas$, this._container.renderService.size$, this._tagChanged$.startWith(null), this._tagCreator.tag$.merge(this._createGeometryChanged$).startWith(null), function (renderTags, rc, atlas, size, tag, ct) {
-            return [rc, atlas, size, renderTags, tag, ct];
-        })
-            .map(function (args) {
-            return {
-                name: _this._name,
-                vnode: _this._tagDomRenderer.render(args[3], args[5], args[1], args[0].perspective, args[2]),
-            };
-        })
-            .subscribe(this._container.domRenderer.render$);
-        this._glSubscription = this._navigator.stateService.currentState$
-            .map(function (frame) {
-            var tagScene = _this._tagScene;
-            return {
-                name: _this._name,
-                render: {
-                    frameId: frame.id,
-                    needsRender: tagScene.needsRender,
-                    render: tagScene.render.bind(tagScene),
-                    stage: Render_1.GLRenderStage.Foreground,
-                },
-            };
-        })
-            .subscribe(this._container.glRenderer.render$);
-        this._navigator.stateService.currentTransform$
-            .first()
-            .subscribe(function (transform) {
-            _this._tagSet.activate(transform);
-            _this._tagScene.add(_this._tagSet.getAll());
-        });
-    };
-    TagComponent.prototype._deactivate = function () {
-        this._tagScene.clear();
-        this._tagSet.deactivate();
-        this._tagCreator.delete$.next(null);
-        this._claimMouseSubscription.unsubscribe();
-        this._mouseDragSubscription.unsubscribe();
-        this._unclaimMouseSubscription.unsubscribe();
-        this._updateGLObjectsSubscription.unsubscribe();
-        this._updateTagSceneSubscription.unsubscribe();
-        this._stopCreateSubscription.unsubscribe();
-        this._deleteCreatingSubscription.unsubscribe();
-        this._createSubscription.unsubscribe();
-        this._createPointSubscription.unsubscribe();
-        this._setCreateVertexSubscription.unsubscribe();
-        this._addPointSubscription.unsubscribe();
-        this._deleteCreatedSubscription.unsubscribe();
-        this._setGLCreateTagSubscription.unsubscribe();
-        this._createGLObjectsChangedSubscription.unsubscribe();
-        this._preventDefaultSubscription.unsubscribe();
-        this._containerClassListSubscription.unsubscribe();
-        this._domSubscription.unsubscribe();
-        this._glSubscription.unsubscribe();
-        this._geometryCreatedEventSubscription.unsubscribe();
-        this._tagsChangedEventSubscription.unsubscribe();
-        this._container.element.classList.remove("component-tag-create");
-    };
-    TagComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            createColor: 0xFFFFFF,
-            mode: Component_1.TagMode.Default,
-        };
-    };
-    TagComponent.prototype._mouseEventToBasic = function (event, element, camera, transform, offsetX, offsetY) {
-        offsetX = offsetX != null ? offsetX : 0;
-        offsetY = offsetY != null ? offsetY : 0;
-        var _a = this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1];
-        var basic = this._viewportCoords.canvasToBasic(canvasX - offsetX, canvasY - offsetY, element, transform, camera.perspective);
-        return basic;
+            else if (anchor[0] <= changed[0] && anchor[1] <= changed[1]) {
+                this._anchorIndex = 1;
+            }
+            else if (anchor[0] > changed[0] && anchor[1] <= changed[1]) {
+                this._anchorIndex = 2;
+            }
+            else {
+                this._anchorIndex = 3;
+            }
+            var rect = [];
+            if (this._anchorIndex === 0) {
+                rect[0] = anchor[0];
+                rect[1] = changed[1];
+                rect[2] = changed[0];
+                rect[3] = anchor[1];
+            }
+            else if (this._anchorIndex === 1) {
+                rect[0] = anchor[0];
+                rect[1] = anchor[1];
+                rect[2] = changed[0];
+                rect[3] = changed[1];
+            }
+            else if (this._anchorIndex === 2) {
+                rect[0] = changed[0];
+                rect[1] = anchor[1];
+                rect[2] = anchor[0];
+                rect[3] = changed[1];
+            }
+            else {
+                rect[0] = changed[0];
+                rect[1] = changed[1];
+                rect[2] = anchor[0];
+                rect[3] = anchor[1];
+            }
+            if (rect[0] > rect[2]) {
+                rect[0] = original[0];
+                rect[2] = original[2];
+            }
+            if (rect[1] > rect[3]) {
+                rect[1] = original[1];
+                rect[3] = original[3];
+            }
+            this._rect[0] = rect[0];
+            this._rect[1] = rect[1];
+            this._rect[2] = rect[2];
+            this._rect[3] = rect[3];
+        }
+        this._notifyChanged$.next(this);
     };
-    /** @inheritdoc */
-    TagComponent.componentName = "tag";
-    /**
-     * Event fired when the create mode is changed.
-     *
-     * @event TagComponent#modechanged
-     * @type {TagMode} Tag mode
-     * @example
-     * ```
-     * tagComponent.on("modechanged", function(mode) {
-     *     console.log(mode);
-     * });
-     * ```
-     */
-    TagComponent.modechanged = "modechanged";
     /**
-     * Event fired when a geometry has been created.
+     * Set the value of a vertex in the polygon representation of the rectangle.
      *
-     * @event TagComponent#geometrycreated
-     * @type {Geometry} Created geometry.
-     * @example
-     * ```
-     * tagComponent.on("geometrycreated", function(geometry) {
-     *     console.log(geometry);
-     * });
-     * ```
-     */
-    TagComponent.geometrycreated = "geometrycreated";
-    /**
-     * Event fired when the tags collection has changed.
+     * @description The polygon is defined to have the first vertex at the
+     * bottom-left corner with the rest of the vertices following in clockwise order.
      *
-     * @event TagComponent#tagschanged
-     * @type {TagComponent} Tag component.
-     * @example
-     * ```
-     * tagComponent.on("tagschanged", function(component) {
-     *     console.log(component.getAll());
-     * });
-     * ```
+     * @param {number} index - The index of the vertex to be set.
+     * @param {Array<number>} value - The new value of the vertex.
+     * @param {Transform} transform - The transform of the node related to the rectangle.
+     * @ignore
      */
-    TagComponent.tagschanged = "tagschanged";
-    return TagComponent;
-}(Component_1.Component));
-exports.TagComponent = TagComponent;
-Component_1.ComponentService.register(TagComponent);
-exports.default = TagComponent;
-
-},{"../../Component":226,"../../Geo":229,"../../Render":232,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/empty":40,"rxjs/add/observable/from":41,"rxjs/add/observable/merge":44,"rxjs/add/observable/of":45,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/concat":54,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/share":74,"rxjs/add/operator/skip":75,"rxjs/add/operator/skipUntil":76,"rxjs/add/operator/startWith":78,"rxjs/add/operator/switchMap":79,"rxjs/add/operator/take":80,"rxjs/add/operator/takeUntil":81,"rxjs/add/operator/withLatestFrom":83,"when":223}],284:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/share");
-require("rxjs/add/operator/withLatestFrom");
-var Component_1 = require("../../Component");
-var TagCreator = (function () {
-    function TagCreator(component, navigator) {
-        this._component = component;
-        this._navigator = navigator;
-        this._tagOperation$ = new Subject_1.Subject();
-        this._create$ = new Subject_1.Subject();
-        this._delete$ = new Subject_1.Subject();
-        this._tag$ = this._tagOperation$
-            .scan(function (tag, operation) {
-            return operation(tag);
-        }, null)
-            .share();
-        this._create$
-            .withLatestFrom(this._component.configuration$, this._navigator.stateService.currentTransform$)
-            .map(function (_a) {
-            var coord = _a[0], conf = _a[1], transform = _a[2];
-            return function (tag) {
-                if (conf.mode === Component_1.TagMode.CreateRect) {
-                    var geometry = new Component_1.RectGeometry([
-                        coord[0],
-                        coord[1],
-                        coord[0],
-                        coord[1],
-                    ]);
-                    return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform);
+    RectGeometry.prototype.setVertex2d = function (index, value, transform) {
+        var original = this._rect.slice();
+        var changed = [
+            Math.max(0, Math.min(1, value[0])),
+            Math.max(0, Math.min(1, value[1])),
+        ];
+        var rect = [];
+        if (index === 0) {
+            rect[0] = changed[0];
+            rect[1] = original[1];
+            rect[2] = original[2];
+            rect[3] = changed[1];
+        }
+        else if (index === 1) {
+            rect[0] = changed[0];
+            rect[1] = changed[1];
+            rect[2] = original[2];
+            rect[3] = original[3];
+        }
+        else if (index === 2) {
+            rect[0] = original[0];
+            rect[1] = changed[1];
+            rect[2] = changed[0];
+            rect[3] = original[3];
+        }
+        else if (index === 3) {
+            rect[0] = original[0];
+            rect[1] = original[1];
+            rect[2] = changed[0];
+            rect[3] = changed[1];
+        }
+        if (transform.fullPano) {
+            var passingBoundaryLeftward = index < 2 && changed[0] > 0.75 && original[0] < 0.25 ||
+                index >= 2 && this._inverted && changed[0] > 0.75 && original[2] < 0.25;
+            var passingBoundaryRightward = index < 2 && this._inverted && changed[0] < 0.25 && original[0] > 0.75 ||
+                index >= 2 && changed[0] < 0.25 && original[2] > 0.75;
+            if (passingBoundaryLeftward || passingBoundaryRightward) {
+                this._inverted = !this._inverted;
+            }
+            else {
+                if (rect[0] - original[0] < -0.25) {
+                    rect[0] = original[0];
                 }
-                else if (conf.mode === Component_1.TagMode.CreatePolygon) {
-                    var geometry = new Component_1.PolygonGeometry([
-                        [coord[0], coord[1]],
-                        [coord[0], coord[1]],
-                        [coord[0], coord[1]],
-                    ]);
-                    return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform);
+                if (rect[2] - original[2] > 0.25) {
+                    rect[2] = original[2];
                 }
-                return null;
-            };
-        })
-            .subscribe(this._tagOperation$);
-        this._delete$
-            .map(function () {
-            return function (tag) {
-                return null;
-            };
-        })
-            .subscribe(this._tagOperation$);
-    }
-    Object.defineProperty(TagCreator.prototype, "create$", {
-        get: function () {
-            return this._create$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TagCreator.prototype, "delete$", {
-        get: function () {
-            return this._delete$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TagCreator.prototype, "tag$", {
-        get: function () {
-            return this._tag$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return TagCreator;
-}());
-exports.TagCreator = TagCreator;
-exports.default = TagCreator;
-
-},{"../../Component":226,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":73,"rxjs/add/operator/share":74,"rxjs/add/operator/withLatestFrom":83}],285:[function(require,module,exports){
-"use strict";
-/// <reference path="../../../typings/index.d.ts" />
-Object.defineProperty(exports, "__esModule", { value: true });
-var vd = require("virtual-dom");
-var TagDOMRenderer = (function () {
-    function TagDOMRenderer() {
-    }
-    TagDOMRenderer.prototype.render = function (tags, createTag, atlas, camera, size) {
-        var vNodes = [];
-        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
-            var tag = tags_1[_i];
-            vNodes = vNodes.concat(tag.getDOMObjects(atlas, camera, size));
+            }
+            if (!this._inverted && rect[0] > rect[2] ||
+                this._inverted && rect[0] < rect[2]) {
+                rect[0] = original[0];
+                rect[2] = original[2];
+            }
+        }
+        else {
+            if (rect[0] > rect[2]) {
+                rect[0] = original[0];
+                rect[2] = original[2];
+            }
+        }
+        if (rect[1] > rect[3]) {
+            rect[1] = original[1];
+            rect[3] = original[3];
+        }
+        this._rect[0] = rect[0];
+        this._rect[1] = rect[1];
+        this._rect[2] = rect[2];
+        this._rect[3] = rect[3];
+        this._notifyChanged$.next(this);
+    };
+    /** @ignore */
+    RectGeometry.prototype.setCentroid2d = function (value, transform) {
+        var original = this._rect.slice();
+        var x0 = original[0];
+        var x1 = this._inverted ? original[2] + 1 : original[2];
+        var y0 = original[1];
+        var y1 = original[3];
+        var centerX = x0 + (x1 - x0) / 2;
+        var centerY = y0 + (y1 - y0) / 2;
+        var translationX = 0;
+        if (transform.gpano != null &&
+            transform.gpano.CroppedAreaImageWidthPixels === transform.gpano.FullPanoWidthPixels) {
+            translationX = this._inverted ? value[0] + 1 - centerX : value[0] - centerX;
+        }
+        else {
+            var minTranslationX = -x0;
+            var maxTranslationX = 1 - x1;
+            translationX = Math.max(minTranslationX, Math.min(maxTranslationX, value[0] - centerX));
+        }
+        var minTranslationY = -y0;
+        var maxTranslationY = 1 - y1;
+        var translationY = Math.max(minTranslationY, Math.min(maxTranslationY, value[1] - centerY));
+        this._rect[0] = original[0] + translationX;
+        this._rect[1] = original[1] + translationY;
+        this._rect[2] = original[2] + translationX;
+        this._rect[3] = original[3] + translationY;
+        if (this._rect[0] < 0) {
+            this._rect[0] += 1;
+            this._inverted = !this._inverted;
         }
-        if (createTag != null) {
-            vNodes = vNodes.concat(createTag.getDOMObjects(camera, size));
+        else if (this._rect[0] > 1) {
+            this._rect[0] -= 1;
+            this._inverted = !this._inverted;
         }
-        return vd.h("div.TagContainer", {}, vNodes);
-    };
-    TagDOMRenderer.prototype.clear = function () {
-        return vd.h("div", {}, []);
+        if (this._rect[2] < 0) {
+            this._rect[2] += 1;
+            this._inverted = !this._inverted;
+        }
+        else if (this._rect[2] > 1) {
+            this._rect[2] -= 1;
+            this._inverted = !this._inverted;
+        }
+        this._notifyChanged$.next(this);
     };
-    return TagDOMRenderer;
-}());
-exports.TagDOMRenderer = TagDOMRenderer;
-
-},{"virtual-dom":182}],286:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * Enumeration for tag modes
- * @enum {number}
- * @readonly
- * @description Modes for the interaction in the tag component.
- */
-var TagMode;
-(function (TagMode) {
     /**
-     * Disables creating tags.
+     * Get the 3D coordinates for the vertices of the rectangle with
+     * interpolated points along the lines.
+     *
+     * @param {Transform} transform - The transform of the node related to
+     * the rectangle.
+     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates
+     * representing the rectangle.
+     * @ignore
      */
-    TagMode[TagMode["Default"] = 0] = "Default";
+    RectGeometry.prototype.getPoints3d = function (transform) {
+        return this._getPoints2d()
+            .map(function (point) {
+            return transform.unprojectBasic(point, 200);
+        });
+    };
     /**
-     * Create a point geometry through a click.
+     * Get the coordinates of a vertex from the polygon representation of the geometry.
+     *
+     * @description The first vertex represents the bottom-left corner with the rest of
+     * the vertices following in clockwise order. The method shifts the right side
+     * coordinates of the rectangle by one unit to ensure that the vertices are ordered
+     * clockwise.
+     *
+     * @param {number} index - Vertex index.
+     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
+     * @ignore
      */
-    TagMode[TagMode["CreatePoint"] = 1] = "CreatePoint";
+    RectGeometry.prototype.getVertex2d = function (index) {
+        return this._rectToVertices2d(this._rect)[index];
+    };
     /**
-     * Create a polygon geometry through clicks.
+     * Get the coordinates of a vertex from the polygon representation of the geometry.
+     *
+     * @description The first vertex represents the bottom-left corner with the rest of
+     * the vertices following in clockwise order. The coordinates will not be shifted
+     * so they may not appear in clockwise order when layed out on the plane.
+     *
+     * @param {number} index - Vertex index.
+     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
+     * @ignore
      */
-    TagMode[TagMode["CreatePolygon"] = 2] = "CreatePolygon";
+    RectGeometry.prototype.getNonAdjustedVertex2d = function (index) {
+        return this._rectToNonAdjustedVertices2d(this._rect)[index];
+    };
     /**
-     * Create a rect geometry through clicks.
+     * Get a vertex from the polygon representation of the 3D coordinates for the
+     * vertices of the geometry.
+     *
+     * @description The first vertex represents the bottom-left corner with the rest of
+     * the vertices following in clockwise order.
+     *
+     * @param {number} index - Vertex index.
+     * @param {Transform} transform - The transform of the node related to the geometry.
+     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing
+     * the vertices of the geometry.
+     * @ignore
      */
-    TagMode[TagMode["CreateRect"] = 3] = "CreateRect";
-})(TagMode = exports.TagMode || (exports.TagMode = {}));
-exports.default = TagMode;
-
-},{}],287:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var TagOperation;
-(function (TagOperation) {
-    TagOperation[TagOperation["None"] = 0] = "None";
-    TagOperation[TagOperation["Centroid"] = 1] = "Centroid";
-    TagOperation[TagOperation["Vertex"] = 2] = "Vertex";
-})(TagOperation = exports.TagOperation || (exports.TagOperation = {}));
-exports.default = TagOperation;
-
-},{}],288:[function(require,module,exports){
-"use strict";
-/// <reference path="../../../typings/index.d.ts" />
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var TagScene = (function () {
-    function TagScene(scene, raycaster) {
-        this._createTag = null;
-        this._needsRender = false;
-        this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster();
-        this._scene = !!scene ? scene : new THREE.Scene();
-        this._objectTags = {};
-        this._retrievableObjects = [];
-        this._tags = {};
-    }
-    Object.defineProperty(TagScene.prototype, "needsRender", {
-        get: function () {
-            return this._needsRender;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    TagScene.prototype.add = function (tags) {
-        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
-            var tag = tags_1[_i];
-            if (tag.tag.id in this._tags) {
-                this._remove(tag.tag.id);
-            }
-            this._add(tag);
-        }
-        this._needsRender = true;
-    };
-    TagScene.prototype.addCreateTag = function (tag) {
-        for (var _i = 0, _a = tag.glObjects; _i < _a.length; _i++) {
-            var object = _a[_i];
-            this._scene.add(object);
-        }
-        this._createTag = { tag: tag, objects: tag.glObjects };
-        this._needsRender = true;
-    };
-    TagScene.prototype.clear = function () {
-        for (var _i = 0, _a = Object.keys(this._tags); _i < _a.length; _i++) {
-            var id = _a[_i];
-            this._remove(id);
-        }
-        this._needsRender = false;
-    };
-    TagScene.prototype.get = function (id) {
-        return this.has(id) ? this._tags[id].tag : undefined;
-    };
-    TagScene.prototype.has = function (id) {
-        return id in this._tags;
-    };
-    TagScene.prototype.hasCreateTag = function () {
-        return this._createTag != null;
+    RectGeometry.prototype.getVertex3d = function (index, transform) {
+        return transform.unprojectBasic(this._rectToVertices2d(this._rect)[index], 200);
     };
-    TagScene.prototype.intersectObjects = function (_a, camera) {
-        var viewportX = _a[0], viewportY = _a[1];
-        this._raycaster.setFromCamera(new THREE.Vector2(viewportX, viewportY), camera);
-        var intersects = this._raycaster.intersectObjects(this._retrievableObjects);
-        var intersectedIds = [];
-        for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) {
-            var intersect = intersects_1[_i];
-            if (intersect.object.uuid in this._objectTags) {
-                intersectedIds.push(this._objectTags[intersect.object.uuid]);
-            }
-        }
-        return intersectedIds;
+    /**
+     * Get a polygon representation of the 2D basic coordinates for the vertices of the rectangle.
+     *
+     * @description The first vertex represents the bottom-left corner with the rest of
+     * the vertices following in clockwise order.
+     *
+     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates representing
+     * the rectangle vertices.
+     * @ignore
+     */
+    RectGeometry.prototype.getVertices2d = function () {
+        return this._rectToVertices2d(this._rect);
     };
-    TagScene.prototype.remove = function (ids) {
-        for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
-            var id = ids_1[_i];
-            this._remove(id);
-        }
-        this._needsRender = true;
+    /**
+     * Get a polygon representation of the 3D coordinates for the vertices of the rectangle.
+     *
+     * @description The first vertex represents the bottom-left corner with the rest of
+     * the vertices following in clockwise order.
+     *
+     * @param {Transform} transform - The transform of the node related to the rectangle.
+     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing
+     * the rectangle vertices.
+     * @ignore
+     */
+    RectGeometry.prototype.getVertices3d = function (transform) {
+        return this._rectToVertices2d(this._rect)
+            .map(function (vertex) {
+            return transform.unprojectBasic(vertex, 200);
+        });
     };
-    TagScene.prototype.removeAll = function () {
-        for (var _i = 0, _a = Object.keys(this._tags); _i < _a.length; _i++) {
-            var id = _a[_i];
-            this._remove(id);
-        }
-        this._needsRender = true;
+    /** @ignore */
+    RectGeometry.prototype.getCentroid2d = function () {
+        var rect = this._rect;
+        var x0 = rect[0];
+        var x1 = this._inverted ? rect[2] + 1 : rect[2];
+        var y0 = rect[1];
+        var y1 = rect[3];
+        var centroidX = (x0 + x1) / 2;
+        var centroidY = (y0 + y1) / 2;
+        return [centroidX, centroidY];
     };
-    TagScene.prototype.removeCreateTag = function () {
-        if (this._createTag == null) {
-            return;
-        }
-        for (var _i = 0, _a = this._createTag.objects; _i < _a.length; _i++) {
-            var object = _a[_i];
-            this._scene.remove(object);
-        }
-        this._createTag.tag.dispose();
-        this._createTag = null;
-        this._needsRender = true;
+    /** @ignore */
+    RectGeometry.prototype.getCentroid3d = function (transform) {
+        var centroid2d = this.getCentroid2d();
+        return transform.unprojectBasic(centroid2d, 200);
     };
-    TagScene.prototype.render = function (perspectiveCamera, renderer) {
-        renderer.render(this._scene, perspectiveCamera);
-        this._needsRender = false;
+    /**
+     * @ignore
+     */
+    RectGeometry.prototype.getPoleOfInaccessibility2d = function () {
+        return this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));
     };
-    TagScene.prototype.update = function () {
-        this._needsRender = true;
+    /** @ignore */
+    RectGeometry.prototype.getPoleOfInaccessibility3d = function (transform) {
+        var pole2d = this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));
+        return transform.unprojectBasic(pole2d, 200);
     };
-    TagScene.prototype.updateCreateTagObjects = function (tag) {
-        if (this._createTag.tag !== tag) {
-            throw new Error("Create tags do not have the same reference.");
-        }
-        for (var _i = 0, _a = this._createTag.objects; _i < _a.length; _i++) {
-            var object = _a[_i];
-            this._scene.remove(object);
-        }
-        for (var _b = 0, _c = tag.glObjects; _b < _c.length; _b++) {
-            var object = _c[_b];
-            this._scene.add(object);
-        }
-        this._createTag.objects = tag.glObjects;
-        this._needsRender = true;
+    /** @ignore */
+    RectGeometry.prototype.getTriangles3d = function (transform) {
+        return transform.fullPano ?
+            [] :
+            this._triangulate(this._project(this._getPoints2d(), transform), this.getPoints3d(transform));
     };
-    TagScene.prototype.updateObjects = function (tag) {
-        var id = tag.tag.id;
-        if (this._tags[id].tag !== tag) {
-            throw new Error("Tags do not have the same reference.");
+    /**
+     * Check if a particular bottom-right value is valid according to the current
+     * rectangle coordinates.
+     *
+     * @param {Array<number>} bottomRight - The bottom-right coordinates to validate
+     * @returns {boolean} Value indicating whether the provided bottom-right coordinates
+     * are valid.
+     * @ignore
+     */
+    RectGeometry.prototype.validate = function (bottomRight) {
+        var rect = this._rect;
+        if (!this._inverted && bottomRight[0] < rect[0] ||
+            bottomRight[0] - rect[2] > 0.25 ||
+            bottomRight[1] < rect[1]) {
+            return false;
         }
-        var tagObjects = this._tags[id];
-        this._removeObjects(tagObjects);
-        delete this._tags[id];
-        this._add(tag);
-        this._needsRender = true;
+        return true;
     };
-    TagScene.prototype._add = function (tag) {
-        var id = tag.tag.id;
-        var tagObjects = { tag: tag, objects: [], retrievableObjects: [] };
-        this._tags[id] = tagObjects;
-        for (var _i = 0, _a = tag.getGLObjects(); _i < _a.length; _i++) {
-            var object = _a[_i];
-            tagObjects.objects.push(object);
-            this._scene.add(object);
-        }
-        for (var _b = 0, _c = tag.getRetrievableObjects(); _b < _c.length; _b++) {
-            var retrievableObject = _c[_b];
-            tagObjects.retrievableObjects.push(retrievableObject);
-            this._retrievableObjects.push(retrievableObject);
-            this._objectTags[retrievableObject.uuid] = tag.tag.id;
+    /**
+     * Get the 2D coordinates for the vertices of the rectangle with
+     * interpolated points along the lines.
+     *
+     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates
+     * representing the rectangle.
+     */
+    RectGeometry.prototype._getPoints2d = function () {
+        var vertices2d = this._rectToVertices2d(this._rect);
+        var sides = vertices2d.length - 1;
+        var sections = 10;
+        var points2d = [];
+        for (var i = 0; i < sides; ++i) {
+            var startX = vertices2d[i][0];
+            var startY = vertices2d[i][1];
+            var endX = vertices2d[i + 1][0];
+            var endY = vertices2d[i + 1][1];
+            var intervalX = (endX - startX) / (sections - 1);
+            var intervalY = (endY - startY) / (sections - 1);
+            for (var j = 0; j < sections; ++j) {
+                var point = [
+                    startX + j * intervalX,
+                    startY + j * intervalY,
+                ];
+                points2d.push(point);
+            }
         }
+        return points2d;
     };
-    TagScene.prototype._remove = function (id) {
-        var tagObjects = this._tags[id];
-        this._removeObjects(tagObjects);
-        tagObjects.tag.dispose();
-        delete this._tags[id];
+    /**
+     * Convert the top-left, bottom-right representation of a rectangle to a polygon
+     * representation of the vertices starting at the bottom-left corner going
+     * clockwise.
+     *
+     * @description The method shifts the right side coordinates of the rectangle
+     * by one unit to ensure that the vertices are ordered clockwise.
+     *
+     * @param {Array<number>} rect - Top-left, bottom-right representation of a
+     * rectangle.
+     * @returns {Array<Array<number>>} Polygon representation of the vertices of the
+     * rectangle.
+     */
+    RectGeometry.prototype._rectToVertices2d = function (rect) {
+        return [
+            [rect[0], rect[3]],
+            [rect[0], rect[1]],
+            [this._inverted ? rect[2] + 1 : rect[2], rect[1]],
+            [this._inverted ? rect[2] + 1 : rect[2], rect[3]],
+            [rect[0], rect[3]],
+        ];
     };
-    TagScene.prototype._removeObjects = function (tagObjects) {
-        for (var _i = 0, _a = tagObjects.objects; _i < _a.length; _i++) {
-            var object = _a[_i];
-            this._scene.remove(object);
-        }
-        for (var _b = 0, _c = tagObjects.retrievableObjects; _b < _c.length; _b++) {
-            var retrievableObject = _c[_b];
-            var index = this._retrievableObjects.indexOf(retrievableObject);
-            if (index !== -1) {
-                this._retrievableObjects.splice(index, 1);
-            }
-        }
+    /**
+     * Convert the top-left, bottom-right representation of a rectangle to a polygon
+     * representation of the vertices starting at the bottom-left corner going
+     * clockwise.
+     *
+     * @description The first vertex represents the bottom-left corner with the rest of
+     * the vertices following in clockwise order. The coordinates will not be shifted
+     * to ensure that the vertices are ordered clockwise when layed out on the plane.
+     *
+     * @param {Array<number>} rect - Top-left, bottom-right representation of a
+     * rectangle.
+     * @returns {Array<Array<number>>} Polygon representation of the vertices of the
+     * rectangle.
+     */
+    RectGeometry.prototype._rectToNonAdjustedVertices2d = function (rect) {
+        return [
+            [rect[0], rect[3]],
+            [rect[0], rect[1]],
+            [rect[2], rect[1]],
+            [rect[2], rect[3]],
+            [rect[0], rect[3]],
+        ];
     };
-    return TagScene;
-}());
-exports.TagScene = TagScene;
-exports.default = TagScene;
+    return RectGeometry;
+}(Component_1.VertexGeometry));
+exports.RectGeometry = RectGeometry;
+exports.default = RectGeometry;
 
-},{"three":176}],289:[function(require,module,exports){
+},{"../../../Component":291}],380:[function(require,module,exports){
 "use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+var __spreadArrays = (this && this.__spreadArrays) || function () {
+    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
+    for (var r = Array(s), k = 0, i = 0; i < il; i++)
+        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
+            r[k] = a[j];
+    return r;
+};
 Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/share");
-var Component_1 = require("../../Component");
-var TagSet = (function () {
-    function TagSet() {
-        this._active = false;
-        this._hash = {};
-        this._hashDeactivated = {};
-        this._notifyChanged$ = new Subject_1.Subject();
+exports.VertexGeometry = void 0;
+var earcut_1 = require("earcut");
+var martinez = require("martinez-polygon-clipping");
+var polylabel = require("@mapbox/polylabel");
+var THREE = require("three");
+var Component_1 = require("../../../Component");
+/**
+ * @class VertexGeometry
+ * @abstract
+ * @classdesc Represents a vertex geometry.
+ */
+var VertexGeometry = /** @class */ (function (_super) {
+    __extends(VertexGeometry, _super);
+    /**
+     * Create a vertex geometry.
+     *
+     * @constructor
+     * @ignore
+     */
+    function VertexGeometry() {
+        var _this = _super.call(this) || this;
+        _this._subsampleThreshold = 0.005;
+        return _this;
     }
-    Object.defineProperty(TagSet.prototype, "active", {
-        get: function () {
-            return this._active;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TagSet.prototype, "changed$", {
-        get: function () {
-            return this._notifyChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    TagSet.prototype.activate = function (transform) {
-        if (this._active) {
-            return;
-        }
-        for (var id in this._hashDeactivated) {
-            if (!this._hashDeactivated.hasOwnProperty(id)) {
-                continue;
+    /**
+     * Finds the polygon pole of inaccessibility, the most distant internal
+     * point from the polygon outline.
+     *
+     * @param {Array<Array<number>>} points2d - 2d points of outline to triangulate.
+     * @returns {Array<number>} Point of inaccessibility.
+     * @ignore
+     */
+    VertexGeometry.prototype._getPoleOfInaccessibility2d = function (points2d) {
+        var pole2d = polylabel([points2d], 3e-2);
+        return pole2d;
+    };
+    VertexGeometry.prototype._project = function (points2d, transform) {
+        var camera = this._createCamera(transform.upVector().toArray(), transform.unprojectSfM([0, 0], 0), transform.unprojectSfM([0, 0], 10));
+        return this._deunproject(points2d, transform, camera);
+    };
+    VertexGeometry.prototype._subsample = function (points2d, threshold) {
+        if (threshold === void 0) { threshold = this._subsampleThreshold; }
+        var subsampled = [];
+        var length = points2d.length;
+        for (var index = 0; index < length; index++) {
+            var p1 = points2d[index];
+            var p2 = points2d[(index + 1) % length];
+            subsampled.push(p1);
+            var dist = Math.sqrt(Math.pow((p2[0] - p1[0]), 2) + Math.pow((p2[1] - p1[1]), 2));
+            var subsamples = Math.floor(dist / threshold);
+            var coeff = 1 / (subsamples + 1);
+            for (var i = 1; i <= subsamples; i++) {
+                var alpha = i * coeff;
+                var subsample = [
+                    (1 - alpha) * p1[0] + alpha * p2[0],
+                    (1 - alpha) * p1[1] + alpha * p2[1],
+                ];
+                subsampled.push(subsample);
             }
-            var tag = this._hashDeactivated[id];
-            this._add(tag, transform);
         }
-        this._hashDeactivated = {};
-        this._active = true;
-        this._notifyChanged$.next(this);
+        return subsampled;
     };
-    TagSet.prototype.deactivate = function () {
-        if (!this._active) {
-            return;
+    /**
+     * Triangulates a 2d polygon and returns the triangle
+     * representation as a flattened array of 3d points.
+     *
+     * @param {Array<Array<number>>} points2d - 2d points of outline to triangulate.
+     * @param {Array<Array<number>>} points3d - 3d points of outline corresponding to the 2d points.
+     * @param {Array<Array<Array<number>>>} [holes2d] - 2d points of holes to triangulate.
+     * @param {Array<Array<Array<number>>>} [holes3d] - 3d points of holes corresponding to the 2d points.
+     * @returns {Array<number>} Flattened array of 3d points ordered based on the triangles.
+     * @ignore
+     */
+    VertexGeometry.prototype._triangulate = function (points2d, points3d, holes2d, holes3d) {
+        var data = [points2d.slice(0, -1)];
+        for (var _i = 0, _a = holes2d != null ? holes2d : []; _i < _a.length; _i++) {
+            var hole2d = _a[_i];
+            data.push(hole2d.slice(0, -1));
         }
-        for (var id in this._hash) {
-            if (!this._hash.hasOwnProperty(id)) {
-                continue;
-            }
-            this._hashDeactivated[id] = this._hash[id].tag;
+        var points = points3d.slice(0, -1);
+        for (var _b = 0, _c = holes3d != null ? holes3d : []; _b < _c.length; _b++) {
+            var hole3d = _c[_b];
+            points = points.concat(hole3d.slice(0, -1));
         }
-        this._hash = {};
-        this._active = false;
-    };
-    TagSet.prototype.add = function (tags, transform) {
-        this._assertActivationState(true);
-        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
-            var tag = tags_1[_i];
-            this._add(tag, transform);
+        var flattened = earcut_1.default.flatten(data);
+        var indices = earcut_1.default(flattened.vertices, flattened.holes, flattened.dimensions);
+        var triangles = [];
+        for (var i = 0; i < indices.length; ++i) {
+            var point = points[indices[i]];
+            triangles.push(point[0]);
+            triangles.push(point[1]);
+            triangles.push(point[2]);
         }
-        this._notifyChanged$.next(this);
+        return triangles;
     };
-    TagSet.prototype.addDeactivated = function (tags) {
-        this._assertActivationState(false);
-        for (var _i = 0, tags_2 = tags; _i < tags_2.length; _i++) {
-            var tag = tags_2[_i];
-            if (!(tag instanceof Component_1.OutlineTag || tag instanceof Component_1.SpotTag)) {
-                throw new Error("Tag type not supported");
+    VertexGeometry.prototype._triangulatePano = function (points2d, holes2d, transform) {
+        var triangles = [];
+        var epsilon = 1e-9;
+        var subareasX = 3;
+        var subareasY = 3;
+        for (var x = 0; x < subareasX; x++) {
+            for (var y = 0; y < subareasY; y++) {
+                var epsilonX0 = x === 0 ? -epsilon : epsilon;
+                var epsilonY0 = y === 0 ? -epsilon : epsilon;
+                var x0 = x / subareasX + epsilonX0;
+                var y0 = y / subareasY + epsilonY0;
+                var x1 = (x + 1) / subareasX + epsilon;
+                var y1 = (y + 1) / subareasY + epsilon;
+                var bbox2d = [
+                    [x0, y0],
+                    [x0, y1],
+                    [x1, y1],
+                    [x1, y0],
+                    [x0, y0],
+                ];
+                var lookat2d = [
+                    (2 * x + 1) / (2 * subareasX),
+                    (2 * y + 1) / (2 * subareasY),
+                ];
+                triangles.push.apply(triangles, this._triangulateSubarea(points2d, holes2d, bbox2d, lookat2d, transform));
             }
-            this._hashDeactivated[tag.id] = tag;
         }
+        return triangles;
     };
-    TagSet.prototype.get = function (id) {
-        return this.has(id) ? this._hash[id] : undefined;
-    };
-    TagSet.prototype.getAll = function () {
-        var hash = this._hash;
-        return Object.keys(hash)
-            .map(function (id) {
-            return hash[id];
-        });
-    };
-    TagSet.prototype.getAllDeactivated = function () {
-        var hashDeactivated = this._hashDeactivated;
-        return Object.keys(hashDeactivated)
-            .map(function (id) {
-            return hashDeactivated[id];
+    VertexGeometry.prototype._unproject = function (points2d, transform, distance) {
+        if (distance === void 0) { distance = 200; }
+        return points2d
+            .map(function (point) {
+            return transform.unprojectBasic(point, distance);
         });
     };
-    TagSet.prototype.getDeactivated = function (id) {
-        return this.hasDeactivated(id) ? this._hashDeactivated[id] : undefined;
-    };
-    TagSet.prototype.has = function (id) {
-        return id in this._hash;
+    VertexGeometry.prototype._createCamera = function (upVector, position, lookAt) {
+        var camera = new THREE.Camera();
+        camera.up.copy(new THREE.Vector3().fromArray(upVector));
+        camera.position.copy(new THREE.Vector3().fromArray(position));
+        camera.lookAt(new THREE.Vector3().fromArray(lookAt));
+        camera.updateMatrix();
+        camera.updateMatrixWorld(true);
+        return camera;
     };
-    TagSet.prototype.hasDeactivated = function (id) {
-        return id in this._hashDeactivated;
+    VertexGeometry.prototype._deunproject = function (points2d, transform, camera) {
+        return points2d
+            .map(function (point2d) {
+            var pointWorld = transform.unprojectBasic(point2d, 10000);
+            var pointCamera = new THREE.Vector3(pointWorld[0], pointWorld[1], pointWorld[2])
+                .applyMatrix4(camera.matrixWorldInverse);
+            return [pointCamera.x / pointCamera.z, pointCamera.y / pointCamera.z];
+        });
     };
-    TagSet.prototype.remove = function (ids) {
-        this._assertActivationState(true);
-        var hash = this._hash;
-        for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
-            var id = ids_1[_i];
-            if (!(id in hash)) {
-                continue;
-            }
-            delete hash[id];
+    VertexGeometry.prototype._triangulateSubarea = function (points2d, holes2d, bbox2d, lookat2d, transform) {
+        var intersections = martinez.intersection(__spreadArrays([points2d], holes2d), [bbox2d]);
+        if (!intersections) {
+            return [];
         }
-        this._notifyChanged$.next(this);
+        var triangles = [];
+        var threshold = this._subsampleThreshold;
+        var camera = this._createCamera(transform.upVector().toArray(), transform.unprojectSfM([0, 0], 0), transform.unprojectBasic(lookat2d, 10));
+        for (var _i = 0, intersections_1 = intersections; _i < intersections_1.length; _i++) {
+            var intersection = intersections_1[_i];
+            var subsampledPolygon2d = this._subsample(intersection[0], threshold);
+            var polygon2d = this._deunproject(subsampledPolygon2d, transform, camera);
+            var polygon3d = this._unproject(subsampledPolygon2d, transform);
+            var polygonHoles2d = [];
+            var polygonHoles3d = [];
+            for (var i = 1; i < intersection.length; i++) {
+                var subsampledHole2d = this._subsample(intersection[i], threshold);
+                var hole2d = this._deunproject(subsampledHole2d, transform, camera);
+                var hole3d = this._unproject(subsampledHole2d, transform);
+                polygonHoles2d.push(hole2d);
+                polygonHoles3d.push(hole3d);
+            }
+            triangles.push.apply(triangles, this._triangulate(polygon2d, polygon3d, polygonHoles2d, polygonHoles3d));
+        }
+        return triangles;
     };
-    TagSet.prototype.removeAll = function () {
-        this._assertActivationState(true);
-        this._hash = {};
-        this._notifyChanged$.next(this);
+    return VertexGeometry;
+}(Component_1.Geometry));
+exports.VertexGeometry = VertexGeometry;
+exports.default = VertexGeometry;
+
+},{"../../../Component":291,"@mapbox/polylabel":1,"earcut":8,"martinez-polygon-clipping":22,"three":242}],381:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     };
-    TagSet.prototype.removeAllDeactivated = function () {
-        this._assertActivationState(false);
-        this._hashDeactivated = {};
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    TagSet.prototype.removeDeactivated = function (ids) {
-        this._assertActivationState(false);
-        var hashDeactivated = this._hashDeactivated;
-        for (var _i = 0, ids_2 = ids; _i < ids_2.length; _i++) {
-            var id = ids_2[_i];
-            if (!(id in hashDeactivated)) {
-                continue;
-            }
-            delete hashDeactivated[id];
-        }
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CreateHandlerBase = void 0;
+var operators_1 = require("rxjs/operators");
+var rxjs_1 = require("rxjs");
+var Component_1 = require("../../../Component");
+var CreateHandlerBase = /** @class */ (function (_super) {
+    __extends(CreateHandlerBase, _super);
+    function CreateHandlerBase(component, container, navigator, viewportCoords, tagCreator) {
+        var _this = _super.call(this, component, container, navigator, viewportCoords) || this;
+        _this._tagCreator = tagCreator;
+        _this._geometryCreated$ = new rxjs_1.Subject();
+        return _this;
+    }
+    Object.defineProperty(CreateHandlerBase.prototype, "geometryCreated$", {
+        get: function () {
+            return this._geometryCreated$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    CreateHandlerBase.prototype._enable = function () {
+        this._enableCreate();
+        this._container.element.classList.add("component-tag-create");
     };
-    TagSet.prototype._add = function (tag, transform) {
-        if (tag instanceof Component_1.OutlineTag) {
-            this._hash[tag.id] = new Component_1.OutlineRenderTag(tag, transform);
-        }
-        else if (tag instanceof Component_1.SpotTag) {
-            this._hash[tag.id] = new Component_1.SpotRenderTag(tag, transform);
-        }
-        else {
-            throw new Error("Tag type not supported");
-        }
+    CreateHandlerBase.prototype._disable = function () {
+        this._container.element.classList.remove("component-tag-create");
+        this._disableCreate();
     };
-    TagSet.prototype._assertActivationState = function (should) {
-        if (should !== this._active) {
-            throw new Error("Tag set not in correct state for operation.");
-        }
+    CreateHandlerBase.prototype._validateBasic = function (basic) {
+        var x = basic[0];
+        var y = basic[1];
+        return 0 <= x && x <= 1 && 0 <= y && y <= 1;
     };
-    return TagSet;
-}());
-exports.TagSet = TagSet;
-exports.default = TagSet;
+    CreateHandlerBase.prototype._mouseEventToBasic$ = function (mouseEvent$) {
+        var _this = this;
+        return mouseEvent$.pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
+            var event = _a[0], camera = _a[1], transform = _a[2];
+            return _this._mouseEventToBasic(event, _this._container.element, camera, transform);
+        }));
+    };
+    return CreateHandlerBase;
+}(Component_1.TagHandlerBase));
+exports.CreateHandlerBase = CreateHandlerBase;
+exports.default = CreateHandlerBase;
 
-},{"../../Component":226,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":73,"rxjs/add/operator/share":74}],290:[function(require,module,exports){
+},{"../../../Component":291,"rxjs":43,"rxjs/operators":241}],382:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -28168,64 +42074,86 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var Error_1 = require("../../../Error");
-var GeometryTagError = (function (_super) {
-    __extends(GeometryTagError, _super);
-    function GeometryTagError(message) {
-        var _this = _super.call(this, message != null ? message : "The provided geometry value is incorrect") || this;
-        _this.name = "GeometryTagError";
-        return _this;
+exports.CreatePointHandler = void 0;
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../../Component");
+var CreatePointHandler = /** @class */ (function (_super) {
+    __extends(CreatePointHandler, _super);
+    function CreatePointHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
     }
-    return GeometryTagError;
-}(Error_1.MapillaryError));
-exports.GeometryTagError = GeometryTagError;
-exports.default = Error_1.MapillaryError;
+    CreatePointHandler.prototype._enableCreate = function () {
+        this._container.mouseService.deferPixels(this._name, 4);
+        this._geometryCreatedSubscription = this._mouseEventToBasic$(this._container.mouseService.proximateClick$).pipe(operators_1.filter(this._validateBasic), operators_1.map(function (basic) {
+            return new Component_1.PointGeometry(basic);
+        }))
+            .subscribe(this._geometryCreated$);
+    };
+    CreatePointHandler.prototype._disableCreate = function () {
+        this._container.mouseService.undeferPixels(this._name);
+        this._geometryCreatedSubscription.unsubscribe();
+    };
+    CreatePointHandler.prototype._getNameExtension = function () {
+        return "create-point";
+    };
+    return CreatePointHandler;
+}(Component_1.CreateHandlerBase));
+exports.CreatePointHandler = CreatePointHandler;
+exports.default = CreatePointHandler;
 
-},{"../../../Error":228}],291:[function(require,module,exports){
+},{"../../../Component":291,"rxjs/operators":241}],383:[function(require,module,exports){
 "use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
 Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("rxjs/Subject");
-/**
- * @class Geometry
- * @abstract
- * @classdesc Represents a geometry.
- */
-var Geometry = (function () {
-    /**
-     * Create a geometry.
-     *
-     * @constructor
-     */
-    function Geometry() {
-        this._notifyChanged$ = new Subject_1.Subject();
+exports.CreatePointsHandler = void 0;
+var Component_1 = require("../../../Component");
+var CreatePointsHandler = /** @class */ (function (_super) {
+    __extends(CreatePointsHandler, _super);
+    function CreatePointsHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
     }
-    Object.defineProperty(Geometry.prototype, "changed$", {
-        /**
-         * Get changed observable.
-         *
-         * @description Emits the geometry itself every time the geometry
-         * has changed.
-         *
-         * @returns {Observable<Geometry>} Observable emitting the geometry instance.
-         * @ignore
-         */
+    Object.defineProperty(CreatePointsHandler.prototype, "_create$", {
         get: function () {
-            return this._notifyChanged$;
+            return this._tagCreator.createPoints$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    return Geometry;
-}());
-exports.Geometry = Geometry;
-exports.default = Geometry;
+    CreatePointsHandler.prototype._addPoint = function (tag, basicPoint) {
+        tag.geometry.addPoint2d(basicPoint);
+    };
+    CreatePointsHandler.prototype._getNameExtension = function () {
+        return "create-points";
+    };
+    CreatePointsHandler.prototype._setVertex2d = function (tag, basicPoint, transform) {
+        tag.geometry.setPoint2d((tag.geometry).points.length - 1, basicPoint, transform);
+    };
+    return CreatePointsHandler;
+}(Component_1.CreateVertexHandler));
+exports.CreatePointsHandler = CreatePointsHandler;
+exports.default = CreatePointsHandler;
 
-},{"rxjs/Subject":34}],292:[function(require,module,exports){
+},{"../../../Component":291}],384:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -28233,94 +42161,43 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.CreatePolygonHandler = void 0;
 var Component_1 = require("../../../Component");
-/**
- * @class PointGeometry
- *
- * @classdesc Represents a point geometry in the 2D basic image coordinate system.
- *
- * @example
- * ```
- * var basicPoint = [0.5, 0.7];
- * var pointGeometry = new Mapillary.TagComponent.PointGeometry(basicPoint);
- * ```
- */
-var PointGeometry = (function (_super) {
-    __extends(PointGeometry, _super);
-    /**
-     * Create a point geometry.
-     *
-     * @constructor
-     * @param {Array<number>} point - An array representing the basic coordinates of
-     * the point.
-     *
-     * @throws {GeometryTagError} Point coordinates must be valid basic coordinates.
-     */
-    function PointGeometry(point) {
-        var _this = _super.call(this) || this;
-        var x = point[0];
-        var y = point[1];
-        if (x < 0 || x > 1 || y < 0 || y > 1) {
-            throw new Component_1.GeometryTagError("Basic coordinates must be on the interval [0, 1].");
-        }
-        _this._point = point.slice();
-        return _this;
+var CreatePolygonHandler = /** @class */ (function (_super) {
+    __extends(CreatePolygonHandler, _super);
+    function CreatePolygonHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
     }
-    Object.defineProperty(PointGeometry.prototype, "point", {
-        /**
-         * Get point property.
-         * @returns {Array<number>} Array representing the basic coordinates of the point.
-         */
+    Object.defineProperty(CreatePolygonHandler.prototype, "_create$", {
         get: function () {
-            return this._point;
+            return this._tagCreator.createPolygon$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    /**
-     * Get the 2D basic coordinates for the centroid of the point, i.e. the 2D
-     * basic coordinates of the point itself.
-     *
-     * @returns {Array<number>} 2D basic coordinates representing the centroid.
-     */
-    PointGeometry.prototype.getCentroid2d = function () {
-        return this._point.slice();
+    CreatePolygonHandler.prototype._addPoint = function (tag, basicPoint) {
+        tag.addPoint(basicPoint);
     };
-    /**
-     * Get the 3D world coordinates for the centroid of the point, i.e. the 3D
-     * world coordinates of the point itself.
-     *
-     * @param {Transform} transform - The transform of the node related to the point.
-     * @returns {Array<number>} 3D world coordinates representing the centroid.
-     */
-    PointGeometry.prototype.getCentroid3d = function (transform) {
-        return transform.unprojectBasic(this._point, 200);
+    CreatePolygonHandler.prototype._getNameExtension = function () {
+        return "create-polygon";
     };
-    /**
-     * Set the centroid of the point, i.e. the point coordinates.
-     *
-     * @param {Array<number>} value - The new value of the centroid.
-     * @param {Transform} transform - The transform of the node related to the point.
-     */
-    PointGeometry.prototype.setCentroid2d = function (value, transform) {
-        var changed = [
-            Math.max(0, Math.min(1, value[0])),
-            Math.max(0, Math.min(1, value[1])),
-        ];
-        this._point[0] = changed[0];
-        this._point[1] = changed[1];
-        this._notifyChanged$.next(this);
+    CreatePolygonHandler.prototype._setVertex2d = function (tag, basicPoint, transform) {
+        tag.geometry.setVertex2d(tag.geometry.polygon.length - 2, basicPoint, transform);
     };
-    return PointGeometry;
-}(Component_1.Geometry));
-exports.PointGeometry = PointGeometry;
+    return CreatePolygonHandler;
+}(Component_1.CreateVertexHandler));
+exports.CreatePolygonHandler = CreatePolygonHandler;
+exports.default = CreatePolygonHandler;
 
-},{"../../../Component":226}],293:[function(require,module,exports){
+},{"../../../Component":291}],385:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -28328,271 +42205,347 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.CreateRectDragHandler = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var Component_1 = require("../../../Component");
-/**
- * @class PolygonGeometry
- *
- * @classdesc Represents a polygon geometry in the 2D basic image coordinate system.
- * All polygons and holes provided to the constructor needs to be closed.
- *
- * @example
- * ```
- * var basicPolygon = [[0.5, 0.3], [0.7, 0.3], [0.6, 0.5], [0.5, 0.3]];
- * var polygonGeometry = new Mapillary.TagComponent.PointGeometry(basicPolygon);
- * ```
- */
-var PolygonGeometry = (function (_super) {
-    __extends(PolygonGeometry, _super);
-    /**
-     * Create a polygon geometry.
-     *
-     * @constructor
-     * @param {Array<Array<number>>} polygon - Array of polygon vertices. Must be closed.
-     * @param {Array<Array<Array<number>>>} [holes] - Array of arrays of hole vertices.
-     * Each array of holes vertices must be closed.
-     *
-     * @throws {GeometryTagError} Polygon coordinates must be valid basic coordinates.
-     */
-    function PolygonGeometry(polygon, holes) {
-        var _this = _super.call(this) || this;
-        var polygonLength = polygon.length;
-        if (polygonLength < 3) {
-            throw new Component_1.GeometryTagError("A polygon must have three or more positions.");
-        }
-        if (polygon[0][0] !== polygon[polygonLength - 1][0] ||
-            polygon[0][1] !== polygon[polygonLength - 1][1]) {
-            throw new Component_1.GeometryTagError("First and last positions must be equivalent.");
-        }
-        _this._polygon = [];
-        for (var _i = 0, polygon_1 = polygon; _i < polygon_1.length; _i++) {
-            var vertex = polygon_1[_i];
-            if (vertex[0] < 0 || vertex[0] > 1 ||
-                vertex[1] < 0 || vertex[1] > 1) {
-                throw new Component_1.GeometryTagError("Basic coordinates of polygon must be on the interval [0, 1].");
-            }
-            _this._polygon.push(vertex.slice());
-        }
-        _this._holes = [];
-        if (holes == null) {
-            return _this;
-        }
-        for (var i = 0; i < holes.length; i++) {
-            var hole = holes[i];
-            var holeLength = hole.length;
-            if (holeLength < 3) {
-                throw new Component_1.GeometryTagError("A polygon hole must have three or more positions.");
-            }
-            if (hole[0][0] !== hole[holeLength - 1][0] ||
-                hole[0][1] !== hole[holeLength - 1][1]) {
-                throw new Component_1.GeometryTagError("First and last positions of hole must be equivalent.");
-            }
-            _this._holes.push([]);
-            for (var _a = 0, hole_1 = hole; _a < hole_1.length; _a++) {
-                var vertex = hole_1[_a];
-                if (vertex[0] < 0 || vertex[0] > 1 ||
-                    vertex[1] < 0 || vertex[1] > 1) {
-                    throw new Component_1.GeometryTagError("Basic coordinates of hole must be on the interval [0, 1].");
-                }
-                _this._holes[i].push(vertex.slice());
+var CreateRectDragHandler = /** @class */ (function (_super) {
+    __extends(CreateRectDragHandler, _super);
+    function CreateRectDragHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    CreateRectDragHandler.prototype._enableCreate = function () {
+        var _this = this;
+        this._container.mouseService.claimMouse(this._name, 2);
+        this._deleteSubscription = this._navigator.stateService.currentTransform$.pipe(operators_1.map(function (transform) { return null; }), operators_1.skip(1))
+            .subscribe(this._tagCreator.delete$);
+        this._createSubscription = this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseDragStart$)).pipe(operators_1.filter(this._validateBasic))
+            .subscribe(this._tagCreator.createRect$);
+        this._initializeAnchorIndexingSubscription = this._tagCreator.tag$.pipe(operators_1.filter(function (tag) {
+            return !!tag;
+        }))
+            .subscribe(function (tag) {
+            tag.geometry.initializeAnchorIndexing();
+        });
+        var basicMouse$ = rxjs_1.combineLatest(rxjs_1.merge(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseMove$), this._container.mouseService.filtered$(this._name, this._container.mouseService.domMouseMove$)), this._container.renderService.renderCamera$).pipe(operators_1.withLatestFrom(this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
+            var _b = _a[0], event = _b[0], camera = _b[1], transform = _a[1];
+            return _this._mouseEventToBasic(event, _this._container.element, camera, transform);
+        }));
+        this._setVertexSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return !!tag ?
+                rxjs_1.combineLatest(rxjs_1.of(tag), basicMouse$, _this._navigator.stateService.currentTransform$) :
+                rxjs_1.empty();
+        }))
+            .subscribe(function (_a) {
+            var tag = _a[0], basicPoint = _a[1], transform = _a[2];
+            tag.geometry.setOppositeVertex2d(basicPoint, transform);
+        });
+        var basicMouseDragEnd$ = this._container.mouseService.mouseDragEnd$.pipe(operators_1.withLatestFrom(this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseDrag$)).pipe(operators_1.filter(this._validateBasic)), function (event, basicPoint) {
+            return basicPoint;
+        }), operators_1.share());
+        this._addPointSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return !!tag ?
+                rxjs_1.combineLatest(rxjs_1.of(tag), basicMouseDragEnd$) :
+                rxjs_1.empty();
+        }))
+            .subscribe(function (_a) {
+            var tag = _a[0], basicPoint = _a[1];
+            var rectGeometry = tag.geometry;
+            if (!rectGeometry.validate(basicPoint)) {
+                basicPoint = rectGeometry.getNonAdjustedVertex2d(3);
             }
-        }
-        return _this;
+            tag.addPoint(basicPoint);
+        });
+        this._geometryCreatedSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return !!tag ?
+                tag.created$.pipe(operators_1.map(function (t) {
+                    return t.geometry;
+                })) :
+                rxjs_1.empty();
+        }))
+            .subscribe(this._geometryCreated$);
+    };
+    CreateRectDragHandler.prototype._disableCreate = function () {
+        this._container.mouseService.unclaimMouse(this._name);
+        this._tagCreator.delete$.next(null);
+        this._addPointSubscription.unsubscribe();
+        this._createSubscription.unsubscribe();
+        this._deleteSubscription.unsubscribe();
+        this._geometryCreatedSubscription.unsubscribe();
+        this._initializeAnchorIndexingSubscription.unsubscribe();
+        this._setVertexSubscription.unsubscribe();
+    };
+    CreateRectDragHandler.prototype._getNameExtension = function () {
+        return "create-rect-drag";
+    };
+    return CreateRectDragHandler;
+}(Component_1.CreateHandlerBase));
+exports.CreateRectDragHandler = CreateRectDragHandler;
+exports.default = CreateRectDragHandler;
+
+},{"../../../Component":291,"rxjs":43,"rxjs/operators":241}],386:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CreateRectHandler = void 0;
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../../Component");
+var CreateRectHandler = /** @class */ (function (_super) {
+    __extends(CreateRectHandler, _super);
+    function CreateRectHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
     }
-    Object.defineProperty(PolygonGeometry.prototype, "polygon", {
-        /**
-         * Get polygon property.
-         * @returns {Array<Array<number>>} Closed 2d polygon.
-         */
-        get: function () {
-            return this._polygon;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(PolygonGeometry.prototype, "holes", {
-        /**
-         * Get holes property.
-         * @returns {Array<Array<Array<number>>>} Holes of 2d polygon.
-         */
+    Object.defineProperty(CreateRectHandler.prototype, "_create$", {
         get: function () {
-            return this._holes;
+            return this._tagCreator.createRect$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    /**
-     * Add a vertex to the polygon by appending it after the last vertex.
-     *
-     * @param {Array<number>} vertex - Vertex to add.
-     */
-    PolygonGeometry.prototype.addVertex2d = function (vertex) {
-        var clamped = [
-            Math.max(0, Math.min(1, vertex[0])),
-            Math.max(0, Math.min(1, vertex[1])),
-        ];
-        this._polygon.splice(this._polygon.length - 1, 0, clamped);
-        this._notifyChanged$.next(this);
-    };
-    /**
-     * Get the coordinates of a vertex from the polygon representation of the geometry.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order.
-     *
-     * @param {number} index - Vertex index.
-     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
-     */
-    PolygonGeometry.prototype.getVertex2d = function (index) {
-        return this._polygon[index].slice();
-    };
-    /**
-     * Remove a vertex from the polygon.
-     *
-     * @param {number} index - The index of the vertex to remove.
-     */
-    PolygonGeometry.prototype.removeVertex2d = function (index) {
-        if (index < 0 ||
-            index >= this._polygon.length ||
-            this._polygon.length < 4) {
-            throw new Component_1.GeometryTagError("Index for removed vertex must be valid.");
-        }
-        if (index > 0 && index < this._polygon.length - 1) {
-            this._polygon.splice(index, 1);
-        }
-        else {
-            this._polygon.splice(0, 1);
-            this._polygon.pop();
-            var closing = this._polygon[0].slice();
-            this._polygon.push(closing);
+    CreateRectHandler.prototype._addPoint = function (tag, basicPoint) {
+        var rectGeometry = tag.geometry;
+        if (!rectGeometry.validate(basicPoint)) {
+            basicPoint = rectGeometry.getNonAdjustedVertex2d(3);
         }
-        this._notifyChanged$.next(this);
+        tag.addPoint(basicPoint);
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.setVertex2d = function (index, value, transform) {
-        var changed = [
-            Math.max(0, Math.min(1, value[0])),
-            Math.max(0, Math.min(1, value[1])),
-        ];
-        if (index === 0 || index === this._polygon.length - 1) {
-            this._polygon[0] = changed.slice();
-            this._polygon[this._polygon.length - 1] = changed.slice();
-        }
-        else {
-            this._polygon[index] = changed.slice();
-        }
-        this._notifyChanged$.next(this);
+    CreateRectHandler.prototype._enable = function () {
+        _super.prototype._enable.call(this);
+        this._initializeAnchorIndexingSubscription = this._tagCreator.tag$.pipe(operators_1.filter(function (tag) {
+            return !!tag;
+        }))
+            .subscribe(function (tag) {
+            tag.geometry.initializeAnchorIndexing();
+        });
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.setCentroid2d = function (value, transform) {
-        var xs = this._polygon.map(function (point) { return point[0]; });
-        var ys = this._polygon.map(function (point) { return point[1]; });
-        var minX = Math.min.apply(Math, xs);
-        var maxX = Math.max.apply(Math, xs);
-        var minY = Math.min.apply(Math, ys);
-        var maxY = Math.max.apply(Math, ys);
-        var centroid = this.getCentroid2d();
-        var minTranslationX = -minX;
-        var maxTranslationX = 1 - maxX;
-        var minTranslationY = -minY;
-        var maxTranslationY = 1 - maxY;
-        var translationX = Math.max(minTranslationX, Math.min(maxTranslationX, value[0] - centroid[0]));
-        var translationY = Math.max(minTranslationY, Math.min(maxTranslationY, value[1] - centroid[1]));
-        for (var _i = 0, _a = this._polygon; _i < _a.length; _i++) {
-            var point = _a[_i];
-            point[0] += translationX;
-            point[1] += translationY;
-        }
-        this._notifyChanged$.next(this);
+    CreateRectHandler.prototype._disable = function () {
+        _super.prototype._disable.call(this);
+        this._initializeAnchorIndexingSubscription.unsubscribe();
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getPoints3d = function (transform) {
-        return this.getVertices3d(transform);
+    CreateRectHandler.prototype._getNameExtension = function () {
+        return "create-rect";
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getVertex3d = function (index, transform) {
-        return transform.unprojectBasic(this._polygon[index], 200);
+    CreateRectHandler.prototype._setVertex2d = function (tag, basicPoint, transform) {
+        tag.geometry.setOppositeVertex2d(basicPoint, transform);
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getVertices2d = function () {
-        return this._polygon.slice();
+    return CreateRectHandler;
+}(Component_1.CreateVertexHandler));
+exports.CreateRectHandler = CreateRectHandler;
+exports.default = CreateRectHandler;
+
+},{"../../../Component":291,"rxjs/operators":241}],387:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getVertices3d = function (transform) {
-        return this._polygon
-            .map(function (point) {
-            return transform.unprojectBasic(point, 200);
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CreateVertexHandler = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../../Component");
+var CreateVertexHandler = /** @class */ (function (_super) {
+    __extends(CreateVertexHandler, _super);
+    function CreateVertexHandler() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    CreateVertexHandler.prototype._enableCreate = function () {
+        var _this = this;
+        this._container.mouseService.deferPixels(this._name, 4);
+        var transformChanged$ = this._navigator.stateService.currentTransform$.pipe(operators_1.map(function () { }), operators_1.publishReplay(1), operators_1.refCount());
+        this._deleteSubscription = transformChanged$.pipe(operators_1.skip(1))
+            .subscribe(this._tagCreator.delete$);
+        var basicClick$ = this._mouseEventToBasic$(this._container.mouseService.proximateClick$).pipe(operators_1.share());
+        this._createSubscription = transformChanged$.pipe(operators_1.switchMap(function () {
+            return basicClick$.pipe(operators_1.filter(_this._validateBasic), operators_1.take(1));
+        }))
+            .subscribe(this._create$);
+        this._setVertexSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return !!tag ?
+                rxjs_1.combineLatest(rxjs_1.of(tag), rxjs_1.merge(_this._container.mouseService.mouseMove$, _this._container.mouseService.domMouseMove$), _this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$) :
+                rxjs_1.empty();
+        }))
+            .subscribe(function (_a) {
+            var tag = _a[0], event = _a[1], camera = _a[2], transform = _a[3];
+            var basicPoint = _this._mouseEventToBasic(event, _this._container.element, camera, transform);
+            _this._setVertex2d(tag, basicPoint, transform);
+        });
+        this._addPointSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return !!tag ?
+                rxjs_1.combineLatest(rxjs_1.of(tag), basicClick$) :
+                rxjs_1.empty();
+        }))
+            .subscribe(function (_a) {
+            var tag = _a[0], basicPoint = _a[1];
+            _this._addPoint(tag, basicPoint);
         });
+        this._geometryCreateSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
+            return !!tag ?
+                tag.created$.pipe(operators_1.map(function (t) {
+                    return t.geometry;
+                })) :
+                rxjs_1.empty();
+        }))
+            .subscribe(this._geometryCreated$);
     };
-    /**
-     * Get a polygon representation of the 3D coordinates for the vertices of each hole
-     * of the geometry.
-     *
-     * @param {Transform} transform - The transform of the node related to the geometry.
-     * @returns {Array<Array<Array<number>>>} Array of hole polygons in 3D world coordinates
-     * representing the vertices of each hole of the geometry.
-     */
-    PolygonGeometry.prototype.getHoleVertices3d = function (transform) {
-        var holes3d = [];
-        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
-            var hole = _a[_i];
-            var hole3d = hole
-                .map(function (point) {
-                return transform.unprojectBasic(point, 200);
-            });
-            holes3d.push(hole3d);
-        }
-        return holes3d;
+    CreateVertexHandler.prototype._disableCreate = function () {
+        this._container.mouseService.undeferPixels(this._name);
+        this._tagCreator.delete$.next(null);
+        this._addPointSubscription.unsubscribe();
+        this._createSubscription.unsubscribe();
+        this._deleteSubscription.unsubscribe();
+        this._geometryCreateSubscription.unsubscribe();
+        this._setVertexSubscription.unsubscribe();
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getCentroid2d = function () {
-        var polygon = this._polygon;
-        var area = 0;
-        var centroidX = 0;
-        var centroidY = 0;
-        for (var i = 0; i < polygon.length - 1; i++) {
-            var xi = polygon[i][0];
-            var yi = polygon[i][1];
-            var xi1 = polygon[i + 1][0];
-            var yi1 = polygon[i + 1][1];
-            var a = xi * yi1 - xi1 * yi;
-            area += a;
-            centroidX += (xi + xi1) * a;
-            centroidY += (yi + yi1) * a;
-        }
-        area /= 2;
-        centroidX /= 6 * area;
-        centroidY /= 6 * area;
-        return [centroidX, centroidY];
+    return CreateVertexHandler;
+}(Component_1.CreateHandlerBase));
+exports.CreateVertexHandler = CreateVertexHandler;
+exports.default = CreateVertexHandler;
+
+},{"../../../Component":291,"rxjs":43,"rxjs/operators":241}],388:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getCentroid3d = function (transform) {
-        var centroid2d = this.getCentroid2d();
-        return transform.unprojectBasic(centroid2d, 200);
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getTriangles3d = function (transform) {
-        return this._triangulate(this._polygon, this.getPoints3d(transform), this._holes, this.getHoleVertices3d(transform));
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.EditVertexHandler = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Component_1 = require("../../../Component");
+var EditVertexHandler = /** @class */ (function (_super) {
+    __extends(EditVertexHandler, _super);
+    function EditVertexHandler(component, container, navigator, viewportCoords, tagSet) {
+        var _this = _super.call(this, component, container, navigator, viewportCoords) || this;
+        _this._tagSet = tagSet;
+        return _this;
+    }
+    EditVertexHandler.prototype._enable = function () {
+        var _this = this;
+        var interaction$ = this._tagSet.changed$.pipe(operators_1.map(function (tagSet) {
+            return tagSet.getAll();
+        }), operators_1.switchMap(function (tags) {
+            return rxjs_1.from(tags).pipe(operators_1.mergeMap(function (tag) {
+                return tag.interact$;
+            }));
+        }), operators_1.switchMap(function (interaction) {
+            return rxjs_1.concat(rxjs_1.of(interaction), _this._container.mouseService.documentMouseUp$.pipe(operators_1.map(function () {
+                return { offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: null };
+            }), operators_1.first()));
+        }), operators_1.share());
+        var mouseMove$ = rxjs_1.merge(this._container.mouseService.mouseMove$, this._container.mouseService.domMouseMove$).pipe(operators_1.share());
+        this._claimMouseSubscription = interaction$.pipe(operators_1.switchMap(function (interaction) {
+            return !!interaction.tag ? _this._container.mouseService.domMouseDragStart$ : rxjs_1.empty();
+        }))
+            .subscribe(function () {
+            _this._container.mouseService.claimMouse(_this._name, 3);
+        });
+        this._cursorSubscription = interaction$.pipe(operators_1.map(function (interaction) {
+            return interaction.cursor;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (cursor) {
+            var interactionCursors = ["crosshair", "move", "nesw-resize", "nwse-resize"];
+            for (var _i = 0, interactionCursors_1 = interactionCursors; _i < interactionCursors_1.length; _i++) {
+                var interactionCursor = interactionCursors_1[_i];
+                _this._container.element.classList.remove("component-tag-edit-" + interactionCursor);
+            }
+            if (!!cursor) {
+                _this._container.element.classList.add("component-tag-edit-" + cursor);
+            }
+        });
+        this._unclaimMouseSubscription = this._container.mouseService
+            .filtered$(this._name, this._container.mouseService.domMouseDragEnd$)
+            .subscribe(function (e) {
+            _this._container.mouseService.unclaimMouse(_this._name);
+        });
+        this._preventDefaultSubscription = interaction$.pipe(operators_1.switchMap(function (interaction) {
+            return !!interaction.tag ?
+                _this._container.mouseService.documentMouseMove$ :
+                rxjs_1.empty();
+        }))
+            .subscribe(function (event) {
+            event.preventDefault(); // prevent selection of content outside the viewer
+        });
+        this._updateGeometrySubscription = interaction$.pipe(operators_1.switchMap(function (interaction) {
+            if (interaction.operation === Component_1.TagOperation.None || !interaction.tag) {
+                return rxjs_1.empty();
+            }
+            var mouseDrag$ = _this._container.mouseService
+                .filtered$(_this._name, _this._container.mouseService.domMouseDrag$).pipe(operators_1.filter(function (event) {
+                return _this._viewportCoords.insideElement(event, _this._container.element);
+            }));
+            return rxjs_1.combineLatest(mouseDrag$, _this._container.renderService.renderCamera$).pipe(operators_1.withLatestFrom(rxjs_1.of(interaction), _this._navigator.stateService.currentTransform$, function (_a, i, transform) {
+                var event = _a[0], render = _a[1];
+                return [event, render, i, transform];
+            }));
+        }))
+            .subscribe(function (_a) {
+            var mouseEvent = _a[0], renderCamera = _a[1], interaction = _a[2], transform = _a[3];
+            var basic = _this._mouseEventToBasic(mouseEvent, _this._container.element, renderCamera, transform, interaction.offsetX, interaction.offsetY);
+            var geometry = interaction.tag.geometry;
+            if (interaction.operation === Component_1.TagOperation.Centroid) {
+                geometry.setCentroid2d(basic, transform);
+            }
+            else if (interaction.operation === Component_1.TagOperation.Vertex) {
+                geometry.setVertex2d(interaction.vertexIndex, basic, transform);
+            }
+        });
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getPoleOfAccessibility2d = function () {
-        return this._getPoleOfInaccessibility2d(this._polygon.slice());
+    EditVertexHandler.prototype._disable = function () {
+        this._claimMouseSubscription.unsubscribe();
+        this._cursorSubscription.unsubscribe();
+        this._preventDefaultSubscription.unsubscribe();
+        this._unclaimMouseSubscription.unsubscribe();
+        this._updateGeometrySubscription.unsubscribe();
     };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getPoleOfAccessibility3d = function (transform) {
-        var pole2d = this._getPoleOfInaccessibility2d(this._polygon.slice());
-        return transform.unprojectBasic(pole2d, 200);
+    EditVertexHandler.prototype._getNameExtension = function () {
+        return "edit-vertex";
     };
-    return PolygonGeometry;
-}(Component_1.VertexGeometry));
-exports.PolygonGeometry = PolygonGeometry;
-exports.default = PolygonGeometry;
+    return EditVertexHandler;
+}(Component_1.TagHandlerBase));
+exports.EditVertexHandler = EditVertexHandler;
+exports.default = EditVertexHandler;
+
 
-},{"../../../Component":226}],294:[function(require,module,exports){
+},{"../../../Component":291,"rxjs":43,"rxjs/operators":241}],389:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -28600,359 +42553,441 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.TagHandlerBase = void 0;
 var Component_1 = require("../../../Component");
-/**
- * @class RectGeometry
- *
- * @classdesc Represents a rectangle geometry in the 2D basic image coordinate system.
- *
- * @example
- * ```
- * var basicRect = [0.5, 0.3, 0.7, 0.4];
- * var rectGeometry = new Mapillary.TagComponent.RectGeometry(basicRect);
- * ```
- */
-var RectGeometry = (function (_super) {
-    __extends(RectGeometry, _super);
-    /**
-     * Create a rectangle geometry.
-     *
-     * @constructor
-     * @param {Array<number>} rect - An array representing the top-left and bottom-right
-     * corners of the rectangle in basic coordinates. Ordered according to [x0, y0, x1, y1].
-     *
-     * @throws {GeometryTagError} Rectangle coordinates must be valid basic coordinates.
-     */
-    function RectGeometry(rect) {
-        var _this = _super.call(this) || this;
-        if (rect[1] > rect[3]) {
-            throw new Component_1.GeometryTagError("Basic Y coordinates values can not be inverted.");
-        }
-        for (var _i = 0, rect_1 = rect; _i < rect_1.length; _i++) {
-            var coord = rect_1[_i];
-            if (coord < 0 || coord > 1) {
-                throw new Component_1.GeometryTagError("Basic coordinates must be on the interval [0, 1].");
-            }
-        }
-        _this._rect = rect.slice(0, 4);
-        if (_this._rect[0] > _this._rect[2]) {
-            _this._inverted = true;
-        }
+var TagHandlerBase = /** @class */ (function (_super) {
+    __extends(TagHandlerBase, _super);
+    function TagHandlerBase(component, container, navigator, viewportCoords) {
+        var _this = _super.call(this, component, container, navigator) || this;
+        _this._name = _this._component.name + "-" + _this._getNameExtension();
+        _this._viewportCoords = viewportCoords;
         return _this;
     }
-    Object.defineProperty(RectGeometry.prototype, "rect", {
-        /**
-         * Get rect property.
-         * @returns {Array<number>} Array representing the top-left and bottom-right
-         * corners of the rectangle in basic coordinates.
-         */
+    TagHandlerBase.prototype._getConfiguration = function (enable) {
+        return {};
+    };
+    TagHandlerBase.prototype._mouseEventToBasic = function (event, element, camera, transform, offsetX, offsetY) {
+        offsetX = offsetX != null ? offsetX : 0;
+        offsetY = offsetY != null ? offsetY : 0;
+        var _a = this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1];
+        var basic = this._viewportCoords.canvasToBasic(canvasX - offsetX, canvasY - offsetY, element, transform, camera.perspective);
+        return basic;
+    };
+    return TagHandlerBase;
+}(Component_1.HandlerBase));
+exports.TagHandlerBase = TagHandlerBase;
+exports.default = TagHandlerBase;
+
+
+},{"../../../Component":291}],390:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}],391:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CreateTag = void 0;
+var operators_1 = require("rxjs/operators");
+var THREE = require("three");
+var rxjs_1 = require("rxjs");
+var Geo_1 = require("../../../Geo");
+var CreateTag = /** @class */ (function () {
+    function CreateTag(geometry, transform, viewportCoords) {
+        var _this = this;
+        this._geometry = geometry;
+        this._transform = transform;
+        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
+        this._aborted$ = new rxjs_1.Subject();
+        this._created$ = new rxjs_1.Subject();
+        this._glObjectsChanged$ = new rxjs_1.Subject();
+        this._geometryChangedSubscription = this._geometry.changed$
+            .subscribe(function () {
+            _this._onGeometryChanged();
+            _this._glObjectsChanged$.next(_this);
+        });
+    }
+    Object.defineProperty(CreateTag.prototype, "geometry", {
         get: function () {
-            return this._rect;
+            return this._geometry;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    /**
-     * Set the value of a vertex in the polygon representation of the rectangle.
-     *
-     * @description The polygon is defined to have the first vertex at the
-     * bottom-left corner with the rest of the vertices following in clockwise order.
-     *
-     * @param {number} index - The index of the vertex to be set.
-     * @param {Array<number>} value - The new value of the vertex.
-     * @param {Transform} transform - The transform of the node related to the rectangle.
-     */
-    RectGeometry.prototype.setVertex2d = function (index, value, transform) {
-        var original = this._rect.slice();
-        var changed = [
-            Math.max(0, Math.min(1, value[0])),
-            Math.max(0, Math.min(1, value[1])),
-        ];
-        var rect = [];
-        if (index === 0) {
-            rect[0] = changed[0];
-            rect[1] = original[1];
-            rect[2] = original[2];
-            rect[3] = changed[1];
-        }
-        else if (index === 1) {
-            rect[0] = changed[0];
-            rect[1] = changed[1];
-            rect[2] = original[2];
-            rect[3] = original[3];
-        }
-        else if (index === 2) {
-            rect[0] = original[0];
-            rect[1] = changed[1];
-            rect[2] = changed[0];
-            rect[3] = original[3];
-        }
-        else if (index === 3) {
-            rect[0] = original[0];
-            rect[1] = original[1];
-            rect[2] = changed[0];
-            rect[3] = changed[1];
-        }
-        if (transform.gpano) {
-            var passingBoundaryLeft = index < 2 && changed[0] > 0.75 && original[0] < 0.25 ||
-                index >= 2 && this._inverted && changed[0] > 0.75 && original[2] < 0.25;
-            var passingBoundaryRight = index < 2 && this._inverted && changed[0] < 0.25 && original[0] > 0.75 ||
-                index >= 2 && changed[0] < 0.25 && original[2] > 0.75;
-            if (passingBoundaryLeft || passingBoundaryRight) {
-                this._inverted = !this._inverted;
-            }
-            else {
-                if (rect[0] - original[0] < -0.25) {
-                    rect[0] = original[0];
-                }
-                if (rect[2] - original[2] > 0.25) {
-                    rect[2] = original[2];
-                }
-            }
-            if (!this._inverted && rect[0] > rect[2] ||
-                this._inverted && rect[0] < rect[2]) {
-                rect[0] = original[0];
-                rect[2] = original[2];
-            }
-        }
-        else {
-            if (rect[0] > rect[2]) {
-                rect[0] = original[0];
-                rect[2] = original[2];
-            }
-        }
-        if (rect[1] > rect[3]) {
-            rect[1] = original[1];
-            rect[3] = original[3];
-        }
-        this._rect[0] = rect[0];
-        this._rect[1] = rect[1];
-        this._rect[2] = rect[2];
-        this._rect[3] = rect[3];
-        this._notifyChanged$.next(this);
+    Object.defineProperty(CreateTag.prototype, "glObjects", {
+        get: function () {
+            return this._glObjects;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(CreateTag.prototype, "aborted$", {
+        get: function () {
+            return this._aborted$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(CreateTag.prototype, "created$", {
+        get: function () {
+            return this._created$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(CreateTag.prototype, "glObjectsChanged$", {
+        get: function () {
+            return this._glObjectsChanged$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(CreateTag.prototype, "geometryChanged$", {
+        get: function () {
+            var _this = this;
+            return this._geometry.changed$.pipe(operators_1.map(function () {
+                return _this;
+            }));
+        },
+        enumerable: false,
+        configurable: true
+    });
+    CreateTag.prototype.dispose = function () {
+        this._geometryChangedSubscription.unsubscribe();
     };
-    /** @inheritdoc */
-    RectGeometry.prototype.setCentroid2d = function (value, transform) {
-        var original = this._rect.slice();
-        var x0 = original[0];
-        var x1 = this._inverted ? original[2] + 1 : original[2];
-        var y0 = original[1];
-        var y1 = original[3];
-        var centerX = x0 + (x1 - x0) / 2;
-        var centerY = y0 + (y1 - y0) / 2;
-        var translationX = 0;
-        if (transform.gpano != null &&
-            transform.gpano.CroppedAreaImageWidthPixels === transform.gpano.FullPanoWidthPixels) {
-            translationX = this._inverted ? value[0] + 1 - centerX : value[0] - centerX;
-        }
-        else {
-            var minTranslationX = -x0;
-            var maxTranslationX = 1 - x1;
-            translationX = Math.max(minTranslationX, Math.min(maxTranslationX, value[0] - centerX));
-        }
-        var minTranslationY = -y0;
-        var maxTranslationY = 1 - y1;
-        var translationY = Math.max(minTranslationY, Math.min(maxTranslationY, value[1] - centerY));
-        this._rect[0] = original[0] + translationX;
-        this._rect[1] = original[1] + translationY;
-        this._rect[2] = original[2] + translationX;
-        this._rect[3] = original[3] + translationY;
-        if (this._rect[0] < 0) {
-            this._rect[0] += 1;
-            this._inverted = !this._inverted;
-        }
-        else if (this._rect[0] > 1) {
-            this._rect[0] -= 1;
-            this._inverted = !this._inverted;
-        }
-        if (this._rect[2] < 0) {
-            this._rect[2] += 1;
-            this._inverted = !this._inverted;
+    CreateTag.prototype._canvasToTransform = function (canvas) {
+        var canvasX = Math.round(canvas[0]);
+        var canvasY = Math.round(canvas[1]);
+        var transform = "translate(-50%,-50%) translate(" + canvasX + "px," + canvasY + "px)";
+        return transform;
+    };
+    CreateTag.prototype._colorToBackground = function (color) {
+        return "#" + ("000000" + color.toString(16)).substr(-6);
+    };
+    CreateTag.prototype._createOutine = function (polygon3d, color) {
+        var positions = this._getLinePositions(polygon3d);
+        var geometry = new THREE.BufferGeometry();
+        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        var material = new THREE.LineBasicMaterial({
+            color: color,
+            linewidth: 1,
+        });
+        return new THREE.Line(geometry, material);
+    };
+    CreateTag.prototype._disposeLine = function (line) {
+        if (line == null) {
+            return;
         }
-        else if (this._rect[2] > 1) {
-            this._rect[2] -= 1;
-            this._inverted = !this._inverted;
+        line.geometry.dispose();
+        line.material.dispose();
+    };
+    CreateTag.prototype._getLinePositions = function (polygon3d) {
+        var length = polygon3d.length;
+        var positions = new Float32Array(length * 3);
+        for (var i = 0; i < length; ++i) {
+            var index = 3 * i;
+            var position = polygon3d[i];
+            positions[index] = position[0];
+            positions[index + 1] = position[1];
+            positions[index + 2] = position[2];
         }
-        this._notifyChanged$.next(this);
+        return positions;
     };
-    /**
-     * Get the 3D coordinates for the vertices of the rectangle with
-     * interpolated points along the lines.
-     *
-     * @param {Transform} transform - The transform of the node related to
-     * the rectangle.
-     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates
-     * representing the rectangle.
-     */
-    RectGeometry.prototype.getPoints3d = function (transform) {
-        return this._getPoints2d(transform)
-            .map(function (point) {
-            return transform.unprojectBasic(point, 200);
-        });
+    return CreateTag;
+}());
+exports.CreateTag = CreateTag;
+exports.default = CreateTag;
+
+},{"../../../Geo":294,"rxjs":43,"rxjs/operators":241,"three":242}],392:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     };
-    /**
-     * Get the coordinates of a vertex from the polygon representation of the geometry.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order.
-     *
-     * @param {number} index - Vertex index.
-     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
-     */
-    RectGeometry.prototype.getVertex2d = function (index) {
-        return this._rectToVertices2d(this._rect)[index];
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    /**
-     * Get a vertex from the polygon representation of the 3D coordinates for the
-     * vertices of the geometry.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order.
-     *
-     * @param {number} index - Vertex index.
-     * @param {Transform} transform - The transform of the node related to the geometry.
-     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing
-     * the vertices of the geometry.
-     */
-    RectGeometry.prototype.getVertex3d = function (index, transform) {
-        return transform.unprojectBasic(this._rectToVertices2d(this._rect)[index], 200);
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ExtremePointCreateTag = void 0;
+var vd = require("virtual-dom");
+var Tag_1 = require("../Tag");
+var Component_1 = require("../../../Component");
+var ExtremePointCreateTag = /** @class */ (function (_super) {
+    __extends(ExtremePointCreateTag, _super);
+    function ExtremePointCreateTag(geometry, options, transform, viewportCoords) {
+        var _this = _super.call(this, geometry, transform, viewportCoords) || this;
+        _this._options = {
+            color: options.color == null ? 0xFFFFFF : options.color,
+            indicateCompleter: options.indicateCompleter == null ? true : options.indicateCompleter,
+        };
+        _this._rectGeometry = new Tag_1.RectGeometry(_this._geometry.getRect2d(transform));
+        _this._createGlObjects();
+        return _this;
+    }
+    ExtremePointCreateTag.prototype.create = function () {
+        if (this._geometry.points.length < 3) {
+            return;
+        }
+        this._geometry.removePoint2d(this._geometry.points.length - 1);
+        this._created$.next(this);
     };
-    /**
-     * Get a polygon representation of the 2D basic coordinates for the vertices of the rectangle.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order.
-     *
-     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates representing
-     * the rectangle vertices.
-     */
-    RectGeometry.prototype.getVertices2d = function () {
-        return this._rectToVertices2d(this._rect);
+    ExtremePointCreateTag.prototype.dispose = function () {
+        _super.prototype.dispose.call(this);
+        this._disposeObjects();
     };
-    /**
-     * Get a polygon representation of the 3D coordinates for the vertices of the rectangle.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order.
-     *
-     * @param {Transform} transform - The transform of the node related to the rectangle.
-     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing
-     * the rectangle vertices.
-     */
-    RectGeometry.prototype.getVertices3d = function (transform) {
-        return this._rectToVertices2d(this._rect)
-            .map(function (vertex) {
-            return transform.unprojectBasic(vertex, 200);
-        });
+    ExtremePointCreateTag.prototype.getDOMObjects = function (camera, size) {
+        var _this = this;
+        var container = {
+            offsetHeight: size.height, offsetWidth: size.width,
+        };
+        var vNodes = [];
+        var points2d = this._geometry.getPoints2d();
+        var length = points2d.length;
+        var _loop_1 = function (index) {
+            var nonModifiedIndex = index;
+            var _a = points2d[index], pointX = _a[0], pointY = _a[1];
+            var pointCanvas = this_1._viewportCoords.basicToCanvasSafe(pointX, pointY, container, this_1._transform, camera);
+            if (!pointCanvas) {
+                return "continue";
+            }
+            var abort = function (e) {
+                e.stopPropagation();
+                _this._aborted$.next(_this);
+            };
+            var remove = function (e) {
+                e.stopPropagation();
+                _this._geometry.removePoint2d(nonModifiedIndex);
+            };
+            var transform = this_1._canvasToTransform(pointCanvas);
+            var completerProperties = {
+                onclick: index === 0 && length < 3 ? abort : remove,
+                style: { transform: transform },
+            };
+            vNodes.push(vd.h("div.TagInteractor", completerProperties, []));
+            var background = this_1._colorToBackground(this_1._options.color);
+            var pointProperties = {
+                style: {
+                    background: background,
+                    transform: transform,
+                },
+            };
+            vNodes.push(vd.h("div.TagVertex", pointProperties, []));
+        };
+        var this_1 = this;
+        for (var index = 0; index < length - 1; index++) {
+            _loop_1(index);
+        }
+        if (length > 2 && this._options.indicateCompleter === true) {
+            var _a = this._geometry.getCentroid2d(this._transform), centroidX = _a[0], centroidY = _a[1];
+            var centroidCanvas = this._viewportCoords.basicToCanvasSafe(centroidX, centroidY, container, this._transform, camera);
+            if (!!centroidCanvas) {
+                var complete = function (e) {
+                    e.stopPropagation();
+                    _this._geometry.removePoint2d(_this._geometry.points.length - 1);
+                    _this._created$.next(_this);
+                };
+                var transform = this._canvasToTransform(centroidCanvas);
+                var completerProperties = {
+                    onclick: complete,
+                    style: { transform: transform },
+                };
+                vNodes.push(vd.h("div.TagCompleter.TagLarger", completerProperties, []));
+                var pointProperties = {
+                    style: {
+                        background: this._colorToBackground(this._options.color),
+                        transform: transform,
+                    },
+                };
+                vNodes.push(vd.h("div.TagVertex.TagLarger", pointProperties, []));
+                var dotProperties = {
+                    style: {
+                        transform: transform,
+                    },
+                };
+                vNodes.push(vd.h("div.TagDot", dotProperties, []));
+            }
+        }
+        return vNodes;
     };
-    /** @inheritdoc */
-    RectGeometry.prototype.getCentroid2d = function () {
-        var rect = this._rect;
-        var x0 = rect[0];
-        var x1 = this._inverted ? rect[2] + 1 : rect[2];
-        var y0 = rect[1];
-        var y1 = rect[3];
-        var centroidX = x0 + (x1 - x0) / 2;
-        var centroidY = y0 + (y1 - y0) / 2;
-        return [centroidX, centroidY];
+    ExtremePointCreateTag.prototype._onGeometryChanged = function () {
+        this._disposeObjects();
+        this._rectGeometry = new Tag_1.RectGeometry(this._geometry.getRect2d(this._transform));
+        this._createGlObjects();
     };
-    /** @inheritdoc */
-    RectGeometry.prototype.getCentroid3d = function (transform) {
-        var centroid2d = this.getCentroid2d();
-        return transform.unprojectBasic(centroid2d, 200);
+    ExtremePointCreateTag.prototype._createGlObjects = function () {
+        this._glObjects = [];
+        var polygon3d = this._rectGeometry.getPoints3d(this._transform);
+        this._outline = this._createOutine(polygon3d, this._options.color);
+        this._glObjects.push(this._outline);
     };
-    /** @inheritdoc */
-    RectGeometry.prototype.getPoleOfAccessibility2d = function () {
-        return this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));
+    ExtremePointCreateTag.prototype._disposeObjects = function () {
+        this._disposeLine(this._outline);
+        this._outline = null;
+        this._glObjects = null;
     };
-    /** @inheritdoc */
-    RectGeometry.prototype.getPoleOfAccessibility3d = function (transform) {
-        var pole2d = this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));
-        return transform.unprojectBasic(pole2d, 200);
+    return ExtremePointCreateTag;
+}(Component_1.CreateTag));
+exports.ExtremePointCreateTag = ExtremePointCreateTag;
+
+
+},{"../../../Component":291,"../Tag":366,"virtual-dom":247}],393:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     };
-    /** @inheritdoc */
-    RectGeometry.prototype.getTriangles3d = function (transform) {
-        return this._triangulate(this._rectToVertices2d(this._rect), this.getVertices3d(transform));
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    /**
-     * Check if a particular bottom-right value is valid according to the current
-     * rectangle coordinates.
-     *
-     * @param {Array<number>} bottomRight - The bottom-right coordinates to validate
-     * @returns {boolean} Value indicating whether the provided bottom-right coordinates
-     * are valid.
-     */
-    RectGeometry.prototype.validate = function (bottomRight) {
-        var rect = this._rect;
-        if (!this._inverted && bottomRight[0] < rect[0] ||
-            bottomRight[0] - rect[2] > 0.25 ||
-            bottomRight[1] < rect[1]) {
-            return false;
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ExtremePointRenderTag = void 0;
+var THREE = require("three");
+var vd = require("virtual-dom");
+var Component_1 = require("../../../Component");
+/**
+ * @class OutlineRenderTag
+ * @classdesc Tag visualizing the properties of an OutlineTag.
+ */
+var ExtremePointRenderTag = /** @class */ (function (_super) {
+    __extends(ExtremePointRenderTag, _super);
+    function ExtremePointRenderTag(tag, transform) {
+        var _this = _super.call(this, tag, transform) || this;
+        _this._rectGeometry = new Component_1.RectGeometry(_this._tag.geometry.getRect2d(transform));
+        _this._fill = !transform.gpano ?
+            _this._createFill() : null;
+        _this._outline = _this._tag.lineWidth >= 1 ?
+            _this._createOutline() :
+            null;
+        return _this;
+    }
+    ExtremePointRenderTag.prototype.dispose = function () {
+        _super.prototype.dispose.call(this);
+        this._disposeFill();
+        this._disposeOutline();
+    };
+    ExtremePointRenderTag.prototype.getDOMObjects = function (atlas, camera, size) {
+        var vNodes = [];
+        var container = {
+            offsetHeight: size.height, offsetWidth: size.width,
+        };
+        if (!this._tag.editable) {
+            return vNodes;
         }
-        return true;
+        var lineColor = this._colorToCss(this._tag.lineColor);
+        var points2d = this._tag.geometry.getPoints2d();
+        for (var i = 0; i < points2d.length; i++) {
+            var _a = points2d[i], vertexBasicX = _a[0], vertexBasicY = _a[1];
+            var vertexCanvas = this._viewportCoords.basicToCanvasSafe(vertexBasicX, vertexBasicY, container, this._transform, camera);
+            if (vertexCanvas == null) {
+                continue;
+            }
+            var cursor = "crosshair";
+            var interact = this._interact(Component_1.TagOperation.Vertex, cursor, i);
+            var vertexCanvasX = Math.round(vertexCanvas[0]);
+            var vertexCanvasY = Math.round(vertexCanvas[1]);
+            var transform = "translate(-50%, -50%) translate(" + vertexCanvasX + "px," + vertexCanvasY + "px)";
+            var properties = {
+                onmousedown: interact,
+                style: { background: lineColor, transform: transform, cursor: cursor },
+            };
+            vNodes.push(vd.h("div.TagResizer", properties, []));
+            if (!this._tag.indicateVertices) {
+                continue;
+            }
+            var pointProperties = {
+                style: { background: lineColor, transform: transform },
+            };
+            vNodes.push(vd.h("div.TagVertex", pointProperties, []));
+        }
+        return vNodes;
     };
-    /**
-     * Get the 2D coordinates for the vertices of the rectangle with
-     * interpolated points along the lines.
-     *
-     * @param {Transform} transform - The transform of the node related to
-     * the rectangle.
-     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates
-     * representing the rectangle.
-     */
-    RectGeometry.prototype._getPoints2d = function (transform) {
-        var vertices2d = this._rectToVertices2d(this._rect);
-        var sides = vertices2d.length - 1;
-        var sections = 10;
-        var points2d = [];
-        for (var i = 0; i < sides; ++i) {
-            var startX = vertices2d[i][0];
-            var startY = vertices2d[i][1];
-            var endX = vertices2d[i + 1][0];
-            var endY = vertices2d[i + 1][1];
-            var intervalX = (endX - startX) / (sections - 1);
-            var intervalY = (endY - startY) / (sections - 1);
-            for (var j = 0; j < sections; ++j) {
-                var point = [
-                    startX + j * intervalX,
-                    startY + j * intervalY,
-                ];
-                points2d.push(point);
+    ExtremePointRenderTag.prototype.getGLObjects = function () {
+        var glObjects = [];
+        if (this._fill != null) {
+            glObjects.push(this._fill);
+        }
+        if (this._outline != null) {
+            glObjects.push(this._outline);
+        }
+        return glObjects;
+    };
+    ExtremePointRenderTag.prototype.getRetrievableObjects = function () {
+        return this._fill != null ? [this._fill] : [];
+    };
+    ExtremePointRenderTag.prototype._onGeometryChanged = function () {
+        this._rectGeometry = new Component_1.RectGeometry(this._tag.geometry.getRect2d(this._transform));
+        if (this._fill != null) {
+            this._updateFillGeometry();
+        }
+        if (this._outline != null) {
+            this._updateOulineGeometry();
+        }
+    };
+    ExtremePointRenderTag.prototype._onTagChanged = function () {
+        var glObjectsChanged = false;
+        if (this._fill != null) {
+            this._updateFillMaterial(this._fill.material);
+        }
+        if (this._outline == null) {
+            if (this._tag.lineWidth >= 1) {
+                this._outline = this._createOutline();
+                glObjectsChanged = true;
             }
         }
-        return points2d;
+        else {
+            this._updateOutlineMaterial();
+        }
+        return glObjectsChanged;
     };
-    /**
-     * Convert the top-left, bottom-right representation of a rectangle to a polygon
-     * representation of the vertices starting at the bottom-right corner going
-     * clockwise.
-     *
-     * @param {Array<number>} rect - Top-left, bottom-right representation of a
-     * rectangle.
-     * @returns {Array<Array<number>>} Polygon representation of the vertices of the
-     * rectangle.
-     */
-    RectGeometry.prototype._rectToVertices2d = function (rect) {
-        return [
-            [rect[0], rect[3]],
-            [rect[0], rect[1]],
-            [this._inverted ? rect[2] + 1 : rect[2], rect[1]],
-            [this._inverted ? rect[2] + 1 : rect[2], rect[3]],
-            [rect[0], rect[3]],
-        ];
+    ExtremePointRenderTag.prototype._getPoints3d = function () {
+        return this._rectGeometry.getPoints3d(this._transform);
     };
-    return RectGeometry;
-}(Component_1.VertexGeometry));
-exports.RectGeometry = RectGeometry;
-exports.default = RectGeometry;
+    ExtremePointRenderTag.prototype._getTriangles = function () {
+        return this._rectGeometry.getTriangles3d(this._transform);
+    };
+    ExtremePointRenderTag.prototype._updateFillMaterial = function (material) {
+        material.color = new THREE.Color(this._tag.fillColor);
+        material.opacity = this._tag.fillOpacity;
+        material.needsUpdate = true;
+    };
+    ExtremePointRenderTag.prototype._updateLineBasicMaterial = function (material) {
+        material.color = new THREE.Color(this._tag.lineColor);
+        material.linewidth = Math.max(this._tag.lineWidth, 1);
+        material.visible = this._tag.lineWidth >= 1 && this._tag.lineOpacity > 0;
+        material.opacity = this._tag.lineOpacity;
+        material.transparent = this._tag.lineOpacity < 1;
+        material.needsUpdate = true;
+    };
+    ExtremePointRenderTag.prototype._updateOutlineMaterial = function () {
+        var material = this._outline.material;
+        this._updateLineBasicMaterial(material);
+    };
+    return ExtremePointRenderTag;
+}(Component_1.OutlineRenderTagBase));
+exports.ExtremePointRenderTag = ExtremePointRenderTag;
+exports.default = ExtremePointRenderTag;
+
 
-},{"../../../Component":226}],295:[function(require,module,exports){
+},{"../../../Component":291,"three":242,"virtual-dom":247}],394:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -28960,152 +42995,270 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var earcut = require("earcut");
-var polylabel = require("@mapbox/polylabel");
+exports.ExtremePointTag = void 0;
 var Component_1 = require("../../../Component");
 /**
- * @class VertexGeometry
- * @abstract
- * @classdesc Represents a vertex geometry.
+ * @class ExtremePointTag
+ *
+ * @classdesc Tag holding properties for visualizing a extreme points
+ * and their outline.
+ *
+ * @example
+ * ```
+ * var geometry = new Mapillary.TagComponent.PointsGeometry([[0.3, 0.3], [0.5, 0.4]]);
+ * var tag = new Mapillary.TagComponent.ExtremePointTag(
+ *     "id-1",
+ *     geometry
+ *     { editable: true, lineColor: 0xff0000 });
+ *
+ * tagComponent.add([tag]);
+ * ```
  */
-var VertexGeometry = (function (_super) {
-    __extends(VertexGeometry, _super);
+var ExtremePointTag = /** @class */ (function (_super) {
+    __extends(ExtremePointTag, _super);
     /**
-     * Create a vertex geometry.
+     * Create an extreme point tag.
      *
+     * @override
      * @constructor
+     * @param {string} id - Unique identifier of the tag.
+     * @param {PointsGeometry} geometry - Geometry defining points of tag.
+     * @param {IExtremePointTagOptions} options - Options defining the visual appearance and
+     * behavior of the extreme point tag.
      */
-    function VertexGeometry() {
-        return _super.call(this) || this;
-    }
-    /**
-     * Finds the polygon pole of inaccessibility, the most distant internal
-     * point from the polygon outline.
-     *
-     * @param {Array<Array<number>>} points2d - 2d points of outline to triangulate.
-     * @returns {Array<number>} Point of inaccessibility.
-     * @ignore
-     */
-    VertexGeometry.prototype._getPoleOfInaccessibility2d = function (points2d) {
-        var pole2d = polylabel([points2d], 3e-2);
-        return pole2d;
-    };
-    /**
-     * Triangulates a 2d polygon and returns the triangle
-     * representation as a flattened array of 3d points.
-     *
-     * @param {Array<Array<number>>} points2d - 2d points of outline to triangulate.
-     * @param {Array<Array<number>>} points3d - 3d points of outline corresponding to the 2d points.
-     * @param {Array<Array<Array<number>>>} [holes2d] - 2d points of holes to triangulate.
-     * @param {Array<Array<Array<number>>>} [holes3d] - 3d points of holes corresponding to the 2d points.
-     * @returns {Array<number>} Flattened array of 3d points ordered based on the triangles.
-     * @ignore
-     */
-    VertexGeometry.prototype._triangulate = function (points2d, points3d, holes2d, holes3d) {
-        var data = [points2d.slice(0, -1)];
-        for (var _i = 0, _a = holes2d != null ? holes2d : []; _i < _a.length; _i++) {
-            var hole2d = _a[_i];
-            data.push(hole2d.slice(0, -1));
-        }
-        var points = points3d.slice(0, -1);
-        for (var _b = 0, _c = holes3d != null ? holes3d : []; _b < _c.length; _b++) {
-            var hole3d = _c[_b];
-            points = points.concat(hole3d.slice(0, -1));
-        }
-        var flattened = earcut.flatten(data);
-        var indices = earcut(flattened.vertices, flattened.holes, flattened.dimensions);
-        var triangles = [];
-        for (var i = 0; i < indices.length; ++i) {
-            var point = points[indices[i]];
-            triangles.push(point[0]);
-            triangles.push(point[1]);
-            triangles.push(point[2]);
-        }
-        return triangles;
-    };
-    return VertexGeometry;
-}(Component_1.Geometry));
-exports.VertexGeometry = VertexGeometry;
-exports.default = VertexGeometry;
-
-},{"../../../Component":226,"@mapbox/polylabel":1,"earcut":8}],296:[function(require,module,exports){
-"use strict";
-/// <reference path="../../../../typings/index.d.ts" />
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var vd = require("virtual-dom");
-var Subject_1 = require("rxjs/Subject");
-var Component_1 = require("../../../Component");
-var Geo_1 = require("../../../Geo");
-var OutlineCreateTag = (function () {
-    function OutlineCreateTag(geometry, options, transform, viewportCoords) {
-        var _this = this;
-        this._geometry = geometry;
-        this._options = { color: options.color == null ? 0xFFFFFF : options.color };
-        this._transform = transform;
-        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
-        this._outline = this._createOutine();
-        this._glObjects = [this._outline];
-        this._aborted$ = new Subject_1.Subject();
-        this._created$ = new Subject_1.Subject();
-        this._glObjectsChanged$ = new Subject_1.Subject();
-        this._geometryChangedSubscription = this._geometry.changed$
-            .subscribe(function (vertexGeometry) {
-            _this._disposeOutline();
-            _this._outline = _this._createOutine();
-            _this._glObjects = [_this._outline];
-            _this._glObjectsChanged$.next(_this);
-        });
+    function ExtremePointTag(id, geometry, options) {
+        var _this = _super.call(this, id, geometry) || this;
+        options = !!options ? options : {};
+        _this._editable = options.editable == null ? false : options.editable;
+        _this._fillColor = options.fillColor == null ? 0xFFFFFF : options.fillColor;
+        _this._fillOpacity = options.fillOpacity == null ? 0.0 : options.fillOpacity;
+        _this._indicateVertices = options.indicateVertices == null ? true : options.indicateVertices;
+        _this._lineColor = options.lineColor == null ? 0xFFFFFF : options.lineColor;
+        _this._lineOpacity = options.lineOpacity == null ? 1 : options.lineOpacity;
+        _this._lineWidth = options.lineWidth == null ? 1 : options.lineWidth;
+        return _this;
     }
-    Object.defineProperty(OutlineCreateTag.prototype, "geometry", {
+    Object.defineProperty(ExtremePointTag.prototype, "editable", {
+        /**
+         * Get editable property.
+         * @returns {boolean} Value indicating if tag is editable.
+         */
         get: function () {
-            return this._geometry;
+            return this._editable;
         },
-        enumerable: true,
+        /**
+         * Set editable property.
+         * @param {boolean}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._editable = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineCreateTag.prototype, "glObjects", {
+    Object.defineProperty(ExtremePointTag.prototype, "fillColor", {
+        /**
+         * Get fill color property.
+         * @returns {number}
+         */
         get: function () {
-            return this._glObjects;
+            return this._fillColor;
         },
-        enumerable: true,
+        /**
+         * Set fill color property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._fillColor = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineCreateTag.prototype, "aborted$", {
+    Object.defineProperty(ExtremePointTag.prototype, "fillOpacity", {
+        /**
+         * Get fill opacity property.
+         * @returns {number}
+         */
         get: function () {
-            return this._aborted$;
+            return this._fillOpacity;
         },
-        enumerable: true,
+        /**
+         * Set fill opacity property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._fillOpacity = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineCreateTag.prototype, "created$", {
+    Object.defineProperty(ExtremePointTag.prototype, "geometry", {
+        /** @inheritdoc */
         get: function () {
-            return this._created$;
+            return this._geometry;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineCreateTag.prototype, "glObjectsChanged$", {
+    Object.defineProperty(ExtremePointTag.prototype, "indicateVertices", {
+        /**
+         * Get indicate vertices property.
+         * @returns {boolean} Value indicating if vertices should be indicated
+         * when tag is editable.
+         */
         get: function () {
-            return this._glObjectsChanged$;
+            return this._indicateVertices;
         },
-        enumerable: true,
+        /**
+         * Set indicate vertices property.
+         * @param {boolean}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._indicateVertices = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineCreateTag.prototype, "geometryChanged$", {
+    Object.defineProperty(ExtremePointTag.prototype, "lineColor", {
+        /**
+         * Get line color property.
+         * @returns {number}
+         */
         get: function () {
-            var _this = this;
-            return this._geometry.changed$
-                .map(function (geometry) {
-                return _this;
-            });
+            return this._lineColor;
         },
-        enumerable: true,
+        /**
+         * Set line color property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._lineColor = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(ExtremePointTag.prototype, "lineOpacity", {
+        /**
+         * Get line opacity property.
+         * @returns {number}
+         */
+        get: function () {
+            return this._lineOpacity;
+        },
+        /**
+         * Set line opacity property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._lineOpacity = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(ExtremePointTag.prototype, "lineWidth", {
+        /**
+         * Get line width property.
+         * @returns {number}
+         */
+        get: function () {
+            return this._lineWidth;
+        },
+        /**
+         * Set line width property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._lineWidth = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
         configurable: true
     });
+    /**
+     * Set options for tag.
+     *
+     * @description Sets all the option properties provided and keeps
+     * the rest of the values as is.
+     *
+     * @param {IExtremePointTagOptions} options - Extreme point tag options
+     *
+     * @fires {Tag#changed}
+     */
+    ExtremePointTag.prototype.setOptions = function (options) {
+        this._editable = options.editable == null ? this._editable : options.editable;
+        this._indicateVertices = options.indicateVertices == null ? this._indicateVertices : options.indicateVertices;
+        this._lineColor = options.lineColor == null ? this._lineColor : options.lineColor;
+        this._lineWidth = options.lineWidth == null ? this._lineWidth : options.lineWidth;
+        this._fillColor = options.fillColor == null ? this._fillColor : options.fillColor;
+        this._fillOpacity = options.fillOpacity == null ? this._fillOpacity : options.fillOpacity;
+        this._notifyChanged$.next(this);
+    };
+    return ExtremePointTag;
+}(Component_1.Tag));
+exports.ExtremePointTag = ExtremePointTag;
+exports.default = ExtremePointTag;
+
+},{"../../../Component":291}],395:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.OutlineCreateTag = void 0;
+var vd = require("virtual-dom");
+var Component_1 = require("../../../Component");
+var OutlineCreateTag = /** @class */ (function (_super) {
+    __extends(OutlineCreateTag, _super);
+    function OutlineCreateTag(geometry, options, transform, viewportCoords) {
+        var _this = _super.call(this, geometry, transform, viewportCoords) || this;
+        _this._options = { color: options.color == null ? 0xFFFFFF : options.color };
+        _this._createGlObjects();
+        return _this;
+    }
+    OutlineCreateTag.prototype.create = function () {
+        if (this._geometry instanceof Component_1.RectGeometry) {
+            this._created$.next(this);
+        }
+        else if (this._geometry instanceof Component_1.PolygonGeometry) {
+            var polygonGeometry = this._geometry;
+            polygonGeometry.removeVertex2d(polygonGeometry.polygon.length - 2);
+            this._created$.next(this);
+        }
+    };
     OutlineCreateTag.prototype.dispose = function () {
-        this._disposeOutline();
-        this._geometryChangedSubscription.unsubscribe();
+        _super.prototype.dispose.call(this);
+        this._disposeLine(this._outline);
+        this._disposeObjects();
     };
     OutlineCreateTag.prototype.getDOMObjects = function (camera, size) {
         var _this = this;
@@ -29118,7 +43271,9 @@ var OutlineCreateTag = (function () {
             _this._aborted$.next(_this);
         };
         if (this._geometry instanceof Component_1.RectGeometry) {
-            var _a = this._geometry.getVertex2d(1), basicX = _a[0], basicY = _a[1];
+            var anchorIndex = this._geometry.anchorIndex;
+            var vertexIndex = anchorIndex === undefined ? 1 : anchorIndex;
+            var _a = this._geometry.getVertex2d(vertexIndex), basicX = _a[0], basicY = _a[1];
             var canvasPoint = this._viewportCoords.basicToCanvasSafe(basicX, basicY, container, this._transform, camera);
             if (canvasPoint != null) {
                 var background = this._colorToBackground(this._options.color);
@@ -29205,60 +43360,37 @@ var OutlineCreateTag = (function () {
             polygonGeometry.addVertex2d(point);
         }
     };
-    OutlineCreateTag.prototype._canvasToTransform = function (canvas) {
-        var canvasX = Math.round(canvas[0]);
-        var canvasY = Math.round(canvas[1]);
-        var transform = "translate(-50%,-50%) translate(" + canvasX + "px," + canvasY + "px)";
-        return transform;
-    };
-    OutlineCreateTag.prototype._colorToBackground = function (color) {
-        return "#" + ("000000" + color.toString(16)).substr(-6);
-    };
-    OutlineCreateTag.prototype._createOutine = function () {
-        var polygon3d = this._geometry.getPoints3d(this._transform);
-        var positions = this._getLinePositions(polygon3d);
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        var material = new THREE.LineBasicMaterial({
-            color: this._options.color,
-            linewidth: 1,
-        });
-        return new THREE.Line(geometry, material);
+    OutlineCreateTag.prototype._onGeometryChanged = function () {
+        this._disposeLine(this._outline);
+        this._disposeObjects();
+        this._createGlObjects();
     };
-    OutlineCreateTag.prototype._disposeOutline = function () {
-        if (this._outline == null) {
-            return;
-        }
-        var line = this._outline;
-        line.geometry.dispose();
-        line.material.dispose();
+    OutlineCreateTag.prototype._disposeObjects = function () {
         this._outline = null;
         this._glObjects = [];
     };
-    OutlineCreateTag.prototype._getLinePositions = function (polygon3d) {
-        var length = polygon3d.length;
-        var positions = new Float32Array(length * 3);
-        for (var i = 0; i < length; ++i) {
-            var index = 3 * i;
-            var position = polygon3d[i];
-            positions[index] = position[0];
-            positions[index + 1] = position[1];
-            positions[index + 2] = position[2];
-        }
-        return positions;
+    OutlineCreateTag.prototype._createGlObjects = function () {
+        var polygon3d = this._geometry instanceof Component_1.RectGeometry ?
+            this._geometry.getPoints3d(this._transform) :
+            this._geometry.getVertices3d(this._transform);
+        this._outline = this._createOutine(polygon3d, this._options.color);
+        this._glObjects = [this._outline];
     };
     return OutlineCreateTag;
-}());
+}(Component_1.CreateTag));
 exports.OutlineCreateTag = OutlineCreateTag;
 exports.default = OutlineCreateTag;
 
-},{"../../../Component":226,"../../../Geo":229,"rxjs/Subject":34,"three":176,"virtual-dom":182}],297:[function(require,module,exports){
+
+},{"../../../Component":291,"virtual-dom":247}],396:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -29266,6 +43398,7 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.OutlineRenderTag = void 0;
 var THREE = require("three");
 var vd = require("virtual-dom");
 var Component_1 = require("../../../Component");
@@ -29273,60 +43406,30 @@ var Component_1 = require("../../../Component");
  * @class OutlineRenderTag
  * @classdesc Tag visualizing the properties of an OutlineTag.
  */
-var OutlineRenderTag = (function (_super) {
+var OutlineRenderTag = /** @class */ (function (_super) {
     __extends(OutlineRenderTag, _super);
     function OutlineRenderTag(tag, transform) {
         var _this = _super.call(this, tag, transform) || this;
         _this._fill = !transform.gpano ?
             _this._createFill() :
-            null;
+            transform.fullPano &&
+                tag.domain === Component_1.TagDomain.TwoDimensional &&
+                tag.geometry instanceof Component_1.PolygonGeometry ?
+                _this._createFill() :
+                null;
         _this._holes = _this._tag.lineWidth >= 1 ?
             _this._createHoles() :
             [];
         _this._outline = _this._tag.lineWidth >= 1 ?
             _this._createOutline() :
             null;
-        _this._geometryChangedSubscription = _this._tag.geometry.changed$
-            .subscribe(function (geometry) {
-            if (_this._fill != null) {
-                _this._updateFillGeometry();
-            }
-            if (_this._holes.length > 0) {
-                _this._updateHoleGeometries();
-            }
-            if (_this._outline != null) {
-                _this._updateOulineGeometry();
-            }
-        });
-        _this._changedSubscription = _this._tag.changed$
-            .subscribe(function (changedTag) {
-            var glObjectsChanged = false;
-            if (_this._fill != null) {
-                _this._updateFillMaterial(_this._fill.material);
-            }
-            if (_this._outline == null) {
-                if (_this._tag.lineWidth >= 1) {
-                    _this._holes = _this._createHoles();
-                    _this._outline = _this._createOutline();
-                    glObjectsChanged = true;
-                }
-            }
-            else {
-                _this._updateHoleMaterials();
-                _this._updateOutlineMaterial();
-            }
-            if (glObjectsChanged) {
-                _this._glObjectsChanged$.next(_this);
-            }
-        });
         return _this;
     }
     OutlineRenderTag.prototype.dispose = function () {
+        _super.prototype.dispose.call(this);
         this._disposeFill();
         this._disposeHoles();
         this._disposeOutline();
-        this._changedSubscription.unsubscribe();
-        this._geometryChangedSubscription.unsubscribe();
     };
     OutlineRenderTag.prototype.getDOMObjects = function (atlas, camera, size) {
         var _this = this;
@@ -29339,10 +43442,10 @@ var OutlineRenderTag = (function (_super) {
         if (this._tag.icon != null && (isRect || isPerspective)) {
             var _a = this._tag.geometry instanceof Component_1.RectGeometry ?
                 this._tag.geometry.getVertex2d(this._tag.iconIndex) :
-                this._tag.geometry.getPoleOfAccessibility2d(), iconBasicX = _a[0], iconBasicY = _a[1];
+                this._tag.geometry.getPoleOfInaccessibility2d(), iconBasicX = _a[0], iconBasicY = _a[1];
             var iconCanvas = this._viewportCoords.basicToCanvasSafe(iconBasicX, iconBasicY, container, this._transform, camera);
             if (iconCanvas != null) {
-                var interact = function (e) {
+                var interact = function () {
                     _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag });
                 };
                 if (atlas.loaded) {
@@ -29366,7 +43469,7 @@ var OutlineRenderTag = (function (_super) {
         else if (this._tag.text != null && (isRect || isPerspective)) {
             var _b = this._tag.geometry instanceof Component_1.RectGeometry ?
                 this._tag.geometry.getVertex2d(3) :
-                this._tag.geometry.getPoleOfAccessibility2d(), textBasicX = _b[0], textBasicY = _b[1];
+                this._tag.geometry.getPoleOfInaccessibility2d(), textBasicX = _b[0], textBasicY = _b[1];
             var textCanvas = this._viewportCoords.basicToCanvasSafe(textBasicX, textBasicY, container, this._transform, camera);
             if (textCanvas != null) {
                 var textCanvasX = Math.round(textCanvas[0]);
@@ -29374,7 +43477,7 @@ var OutlineRenderTag = (function (_super) {
                 var transform = this._tag.geometry instanceof Component_1.RectGeometry ?
                     "translate(" + textCanvasX + "px," + textCanvasY + "px)" :
                     "translate(-50%, -50%) translate(" + textCanvasX + "px," + textCanvasY + "px)";
-                var interact = function (e) {
+                var interact = function () {
                     _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag });
                 };
                 var properties = {
@@ -29396,7 +43499,7 @@ var OutlineRenderTag = (function (_super) {
             var _c = this._tag.geometry.getCentroid2d(), centroidBasicX = _c[0], centroidBasicY = _c[1];
             var centroidCanvas = this._viewportCoords.basicToCanvasSafe(centroidBasicX, centroidBasicY, container, this._transform, camera);
             if (centroidCanvas != null) {
-                var interact = this._interact(Component_1.TagOperation.Centroid);
+                var interact = this._interact(Component_1.TagOperation.Centroid, "move");
                 var centroidCanvasX = Math.round(centroidCanvas[0]);
                 var centroidCanvasY = Math.round(centroidCanvas[1]);
                 var transform = "translate(-50%, -50%) translate(" + centroidCanvasX + "px," + centroidCanvasY + "px)";
@@ -29419,17 +43522,17 @@ var OutlineRenderTag = (function (_super) {
             if (vertexCanvas == null) {
                 continue;
             }
-            var interact = this._interact(Component_1.TagOperation.Vertex, i);
+            var cursor = isRect ?
+                i % 2 === 0 ? "nesw-resize" : "nwse-resize" :
+                "crosshair";
+            var interact = this._interact(Component_1.TagOperation.Vertex, cursor, i);
             var vertexCanvasX = Math.round(vertexCanvas[0]);
             var vertexCanvasY = Math.round(vertexCanvas[1]);
             var transform = "translate(-50%, -50%) translate(" + vertexCanvasX + "px," + vertexCanvasY + "px)";
             var properties = {
                 onmousedown: interact,
-                style: { background: lineColor, transform: transform },
+                style: { background: lineColor, transform: transform, cursor: cursor },
             };
-            if (isRect) {
-                properties.style.cursor = i % 2 === 0 ? "nesw-resize" : "nwse-resize";
-            }
             vNodes.push(vd.h("div.TagResizer", properties, []));
             if (!this._tag.indicateVertices) {
                 continue;
@@ -29458,24 +43561,62 @@ var OutlineRenderTag = (function (_super) {
     OutlineRenderTag.prototype.getRetrievableObjects = function () {
         return this._fill != null ? [this._fill] : [];
     };
-    OutlineRenderTag.prototype._colorToCss = function (color) {
-        return "#" + ("000000" + color.toString(16)).substr(-6);
+    OutlineRenderTag.prototype._onGeometryChanged = function () {
+        if (this._fill != null) {
+            this._updateFillGeometry();
+        }
+        if (this._holes.length > 0) {
+            this._updateHoleGeometries();
+        }
+        if (this._outline != null) {
+            this._updateOulineGeometry();
+        }
     };
-    OutlineRenderTag.prototype._createFill = function () {
-        var triangles = this._tag.geometry.getTriangles3d(this._transform);
-        var positions = new Float32Array(triangles);
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.computeBoundingSphere();
-        var material = new THREE.MeshBasicMaterial({ side: THREE.DoubleSide, transparent: true });
-        this._updateFillMaterial(material);
-        return new THREE.Mesh(geometry, material);
+    OutlineRenderTag.prototype._onTagChanged = function () {
+        var glObjectsChanged = false;
+        if (this._fill != null) {
+            this._updateFillMaterial(this._fill.material);
+        }
+        if (this._outline == null) {
+            if (this._tag.lineWidth >= 1) {
+                this._holes = this._createHoles();
+                this._outline = this._createOutline();
+                glObjectsChanged = true;
+            }
+        }
+        else {
+            this._updateHoleMaterials();
+            this._updateOutlineMaterial();
+        }
+        return glObjectsChanged;
+    };
+    OutlineRenderTag.prototype._getPoints3d = function () {
+        return this._in3dDomain() ?
+            this._tag.geometry.getVertices3d(this._transform) :
+            this._tag.geometry.getPoints3d(this._transform);
+    };
+    OutlineRenderTag.prototype._getTriangles = function () {
+        return this._in3dDomain() ?
+            this._tag.geometry.get3dDomainTriangles3d(this._transform) :
+            this._tag.geometry.getTriangles3d(this._transform);
+    };
+    OutlineRenderTag.prototype._updateFillMaterial = function (material) {
+        material.color = new THREE.Color(this._tag.fillColor);
+        material.opacity = this._tag.fillOpacity;
+        material.needsUpdate = true;
+    };
+    OutlineRenderTag.prototype._updateLineBasicMaterial = function (material) {
+        material.color = new THREE.Color(this._tag.lineColor);
+        material.linewidth = Math.max(this._tag.lineWidth, 1);
+        material.visible = this._tag.lineWidth >= 1 && this._tag.lineOpacity > 0;
+        material.opacity = this._tag.lineOpacity;
+        material.transparent = this._tag.lineOpacity < 1;
+        material.needsUpdate = true;
     };
     OutlineRenderTag.prototype._createHoles = function () {
         var holes = [];
         if (this._tag.geometry instanceof Component_1.PolygonGeometry) {
-            var polygonGeometry = this._tag.geometry;
-            var holes3d = polygonGeometry.getHoleVertices3d(this._transform);
+            var holes3d = this._getHoles3d();
             for (var _i = 0, holes3d_1 = holes3d; _i < holes3d_1.length; _i++) {
                 var holePoints3d = holes3d_1[_i];
                 var hole = this._createLine(holePoints3d);
@@ -29484,10 +43625,105 @@ var OutlineRenderTag = (function (_super) {
         }
         return holes;
     };
-    OutlineRenderTag.prototype._createLine = function (points3d) {
+    OutlineRenderTag.prototype._disposeHoles = function () {
+        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
+            var hole = _a[_i];
+            hole.geometry.dispose();
+            hole.material.dispose();
+        }
+        this._holes = [];
+    };
+    OutlineRenderTag.prototype._getHoles3d = function () {
+        var polygonGeometry = this._tag.geometry;
+        return this._in3dDomain() ?
+            polygonGeometry.getHoleVertices3d(this._transform) :
+            polygonGeometry.getHolePoints3d(this._transform);
+    };
+    OutlineRenderTag.prototype._in3dDomain = function () {
+        return this._tag.geometry instanceof Component_1.PolygonGeometry && this._tag.domain === Component_1.TagDomain.ThreeDimensional;
+    };
+    OutlineRenderTag.prototype._updateHoleGeometries = function () {
+        var holes3d = this._getHoles3d();
+        if (holes3d.length !== this._holes.length) {
+            throw new Error("Changing the number of holes is not supported.");
+        }
+        for (var i = 0; i < this._holes.length; i++) {
+            var holePoints3d = holes3d[i];
+            var hole = this._holes[i];
+            this._updateLine(hole, holePoints3d);
+        }
+    };
+    OutlineRenderTag.prototype._updateHoleMaterials = function () {
+        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
+            var hole = _a[_i];
+            this._updateLineBasicMaterial(hole.material);
+        }
+    };
+    OutlineRenderTag.prototype._updateOutlineMaterial = function () {
+        this._updateLineBasicMaterial(this._outline.material);
+    };
+    return OutlineRenderTag;
+}(Component_1.OutlineRenderTagBase));
+exports.OutlineRenderTag = OutlineRenderTag;
+
+
+},{"../../../Component":291,"three":242,"virtual-dom":247}],397:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.OutlineRenderTagBase = void 0;
+var THREE = require("three");
+var Component_1 = require("../../../Component");
+var OutlineRenderTagBase = /** @class */ (function (_super) {
+    __extends(OutlineRenderTagBase, _super);
+    function OutlineRenderTagBase(tag, transform) {
+        var _this = _super.call(this, tag, transform) || this;
+        _this._geometryChangedSubscription = _this._tag.geometry.changed$
+            .subscribe(function () {
+            _this._onGeometryChanged();
+        });
+        _this._changedSubscription = _this._tag.changed$
+            .subscribe(function () {
+            var glObjectsChanged = _this._onTagChanged();
+            if (glObjectsChanged) {
+                _this._glObjectsChanged$.next(_this);
+            }
+        });
+        return _this;
+    }
+    OutlineRenderTagBase.prototype.dispose = function () {
+        this._changedSubscription.unsubscribe();
+        this._geometryChangedSubscription.unsubscribe();
+    };
+    OutlineRenderTagBase.prototype._colorToCss = function (color) {
+        return "#" + ("000000" + color.toString(16)).substr(-6);
+    };
+    OutlineRenderTagBase.prototype._createFill = function () {
+        var triangles = this._getTriangles();
+        var positions = new Float32Array(triangles);
+        var geometry = new THREE.BufferGeometry();
+        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        geometry.computeBoundingSphere();
+        var material = new THREE.MeshBasicMaterial({ side: THREE.DoubleSide, transparent: true });
+        this._updateFillMaterial(material);
+        return new THREE.Mesh(geometry, material);
+    };
+    OutlineRenderTagBase.prototype._createLine = function (points3d) {
         var positions = this._getLinePositions(points3d);
         var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
+        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
         geometry.computeBoundingSphere();
         var material = new THREE.LineBasicMaterial();
         this._updateLineBasicMaterial(material);
@@ -29495,11 +43731,10 @@ var OutlineRenderTag = (function (_super) {
         line.renderOrder = 1;
         return line;
     };
-    OutlineRenderTag.prototype._createOutline = function () {
-        var points3d = this._tag.geometry.getPoints3d(this._transform);
-        return this._createLine(points3d);
+    OutlineRenderTagBase.prototype._createOutline = function () {
+        return this._createLine(this._getPoints3d());
     };
-    OutlineRenderTag.prototype._disposeFill = function () {
+    OutlineRenderTagBase.prototype._disposeFill = function () {
         if (this._fill == null) {
             return;
         }
@@ -29507,15 +43742,7 @@ var OutlineRenderTag = (function (_super) {
         this._fill.material.dispose();
         this._fill = null;
     };
-    OutlineRenderTag.prototype._disposeHoles = function () {
-        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
-            var hole = _a[_i];
-            hole.geometry.dispose();
-            hole.material.dispose();
-        }
-        this._holes = [];
-    };
-    OutlineRenderTag.prototype._disposeOutline = function () {
+    OutlineRenderTagBase.prototype._disposeOutline = function () {
         if (this._outline == null) {
             return;
         }
@@ -29523,7 +43750,7 @@ var OutlineRenderTag = (function (_super) {
         this._outline.material.dispose();
         this._outline = null;
     };
-    OutlineRenderTag.prototype._getLinePositions = function (points3d) {
+    OutlineRenderTagBase.prototype._getLinePositions = function (points3d) {
         var length = points3d.length;
         var positions = new Float32Array(length * 3);
         for (var i = 0; i < length; ++i) {
@@ -29535,12 +43762,13 @@ var OutlineRenderTag = (function (_super) {
         }
         return positions;
     };
-    OutlineRenderTag.prototype._interact = function (operation, vertexIndex) {
+    OutlineRenderTagBase.prototype._interact = function (operation, cursor, vertexIndex) {
         var _this = this;
         return function (e) {
             var offsetX = e.offsetX - e.target.offsetWidth / 2;
             var offsetY = e.offsetY - e.target.offsetHeight / 2;
             _this._interact$.next({
+                cursor: cursor,
                 offsetX: offsetX,
                 offsetY: offsetY,
                 operation: operation,
@@ -29549,8 +43777,8 @@ var OutlineRenderTag = (function (_super) {
             });
         };
     };
-    OutlineRenderTag.prototype._updateFillGeometry = function () {
-        var triangles = this._tag.geometry.getTriangles3d(this._transform);
+    OutlineRenderTagBase.prototype._updateFillGeometry = function () {
+        var triangles = this._getTriangles();
         var positions = new Float32Array(triangles);
         var geometry = this._fill.geometry;
         var attribute = geometry.getAttribute("position");
@@ -29558,37 +43786,13 @@ var OutlineRenderTag = (function (_super) {
             attribute.set(positions);
             attribute.needsUpdate = true;
         }
-        else {
-            geometry.removeAttribute("position");
-            geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        }
-        geometry.computeBoundingSphere();
-    };
-    OutlineRenderTag.prototype._updateFillMaterial = function (material) {
-        material.color = new THREE.Color(this._tag.fillColor);
-        material.opacity = this._tag.fillOpacity;
-        material.needsUpdate = true;
-    };
-    OutlineRenderTag.prototype._updateHoleGeometries = function () {
-        var polygonGeometry = this._tag.geometry;
-        var holes3d = polygonGeometry.getHoleVertices3d(this._transform);
-        if (holes3d.length !== this._holes.length) {
-            throw new Error("Changing the number of holes is not supported.");
-        }
-        for (var i = 0; i < this._holes.length; i++) {
-            var holePoints3d = holes3d[i];
-            var hole = this._holes[i];
-            this._updateLine(hole, holePoints3d);
-        }
-    };
-    OutlineRenderTag.prototype._updateHoleMaterials = function () {
-        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
-            var hole = _a[_i];
-            var material = hole.material;
-            this._updateLineBasicMaterial(material);
+        else {
+            geometry.removeAttribute("position");
+            geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
         }
+        geometry.computeBoundingSphere();
     };
-    OutlineRenderTag.prototype._updateLine = function (line, points3d) {
+    OutlineRenderTagBase.prototype._updateLine = function (line, points3d) {
         var positions = this._getLinePositions(points3d);
         var geometry = line.geometry;
         var attribute = geometry.getAttribute("position");
@@ -29596,32 +43800,24 @@ var OutlineRenderTag = (function (_super) {
         attribute.needsUpdate = true;
         geometry.computeBoundingSphere();
     };
-    OutlineRenderTag.prototype._updateOulineGeometry = function () {
-        var points3d = this._tag.geometry.getPoints3d(this._transform);
-        this._updateLine(this._outline, points3d);
-    };
-    OutlineRenderTag.prototype._updateOutlineMaterial = function () {
-        var material = this._outline.material;
-        this._updateLineBasicMaterial(material);
-    };
-    OutlineRenderTag.prototype._updateLineBasicMaterial = function (material) {
-        material.color = new THREE.Color(this._tag.lineColor);
-        material.linewidth = Math.max(this._tag.lineWidth, 1);
-        material.visible = this._tag.lineWidth >= 1 && this._tag.lineOpacity > 0;
-        material.opacity = this._tag.lineOpacity;
-        material.transparent = this._tag.lineOpacity < 1;
-        material.needsUpdate = true;
+    OutlineRenderTagBase.prototype._updateOulineGeometry = function () {
+        this._updateLine(this._outline, this._getPoints3d());
     };
-    return OutlineRenderTag;
+    return OutlineRenderTagBase;
 }(Component_1.RenderTag));
-exports.OutlineRenderTag = OutlineRenderTag;
+exports.OutlineRenderTagBase = OutlineRenderTagBase;
+exports.default = OutlineRenderTagBase;
+
 
-},{"../../../Component":226,"three":176,"virtual-dom":182}],298:[function(require,module,exports){
+},{"../../../Component":291,"three":242}],398:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -29629,7 +43825,8 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("rxjs/Subject");
+exports.OutlineTag = void 0;
+var rxjs_1 = require("rxjs");
 var Component_1 = require("../../../Component");
 var Viewer_1 = require("../../../Viewer");
 /**
@@ -29648,7 +43845,7 @@ var Viewer_1 = require("../../../Viewer");
  * tagComponent.add([tag]);
  * ```
  */
-var OutlineTag = (function (_super) {
+var OutlineTag = /** @class */ (function (_super) {
     __extends(OutlineTag, _super);
     /**
      * Create an outline tag.
@@ -29663,7 +43860,11 @@ var OutlineTag = (function (_super) {
     function OutlineTag(id, geometry, options) {
         var _this = _super.call(this, id, geometry) || this;
         options = !!options ? options : {};
-        _this._editable = options.editable == null ? false : options.editable;
+        var domain = options.domain != null && geometry instanceof Component_1.PolygonGeometry ?
+            options.domain : Component_1.TagDomain.TwoDimensional;
+        var twoDimensionalPolygon = _this._twoDimensionalPolygon(domain, geometry);
+        _this._domain = domain;
+        _this._editable = options.editable == null || twoDimensionalPolygon ? false : options.editable;
         _this._fillColor = options.fillColor == null ? 0xFFFFFF : options.fillColor;
         _this._fillOpacity = options.fillOpacity == null ? 0.0 : options.fillOpacity;
         _this._icon = options.icon === undefined ? null : options.icon;
@@ -29675,7 +43876,7 @@ var OutlineTag = (function (_super) {
         _this._lineWidth = options.lineWidth == null ? 1 : options.lineWidth;
         _this._text = options.text === undefined ? null : options.text;
         _this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor;
-        _this._click$ = new Subject_1.Subject();
+        _this._click$ = new rxjs_1.Subject();
         _this._click$
             .subscribe(function (t) {
             _this.fire(OutlineTag.click, _this);
@@ -29694,7 +43895,21 @@ var OutlineTag = (function (_super) {
         get: function () {
             return this._click$;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(OutlineTag.prototype, "domain", {
+        /**
+         * Get domain property.
+         *
+         * @description Readonly property that can only be set in constructor.
+         *
+         * @returns Value indicating the domain of the tag.
+         */
+        get: function () {
+            return this._domain;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(OutlineTag.prototype, "editable", {
@@ -29712,10 +43927,13 @@ var OutlineTag = (function (_super) {
          * @fires Tag#changed
          */
         set: function (value) {
+            if (this._twoDimensionalPolygon(this._domain, this._geometry)) {
+                return;
+            }
             this._editable = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(OutlineTag.prototype, "fillColor", {
@@ -29736,7 +43954,7 @@ var OutlineTag = (function (_super) {
             this._fillColor = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(OutlineTag.prototype, "fillOpacity", {
@@ -29757,7 +43975,7 @@ var OutlineTag = (function (_super) {
             this._fillOpacity = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(OutlineTag.prototype, "geometry", {
@@ -29765,7 +43983,7 @@ var OutlineTag = (function (_super) {
         get: function () {
             return this._geometry;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(OutlineTag.prototype, "icon", {
@@ -29786,7 +44004,7 @@ var OutlineTag = (function (_super) {
             this._icon = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(OutlineTag.prototype, "iconFloat", {
@@ -29807,7 +44025,7 @@ var OutlineTag = (function (_super) {
             this._iconFloat = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(OutlineTag.prototype, "iconIndex", {
@@ -29828,7 +44046,7 @@ var OutlineTag = (function (_super) {
             this._iconIndex = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(OutlineTag.prototype, "indicateVertices", {
@@ -29850,7 +44068,7 @@ var OutlineTag = (function (_super) {
             this._indicateVertices = value;
             this._notifyChanged$.next(this);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(OutlineTag.prototype, "lineColor", {
@@ -29862,298 +44080,1381 @@ var OutlineTag = (function (_super) {
             return this._lineColor;
         },
         /**
-         * Set line color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
+         * Set line color property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._lineColor = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(OutlineTag.prototype, "lineOpacity", {
+        /**
+         * Get line opacity property.
+         * @returns {number}
+         */
+        get: function () {
+            return this._lineOpacity;
+        },
+        /**
+         * Set line opacity property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._lineOpacity = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(OutlineTag.prototype, "lineWidth", {
+        /**
+         * Get line width property.
+         * @returns {number}
+         */
+        get: function () {
+            return this._lineWidth;
+        },
+        /**
+         * Set line width property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._lineWidth = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(OutlineTag.prototype, "text", {
+        /**
+         * Get text property.
+         * @returns {string}
+         */
+        get: function () {
+            return this._text;
+        },
+        /**
+         * Set text property.
+         * @param {string}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._text = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(OutlineTag.prototype, "textColor", {
+        /**
+         * Get text color property.
+         * @returns {number}
+         */
+        get: function () {
+            return this._textColor;
+        },
+        /**
+         * Set text color property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._textColor = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * Set options for tag.
+     *
+     * @description Sets all the option properties provided and keeps
+     * the rest of the values as is.
+     *
+     * @param {IOutlineTagOptions} options - Outline tag options
+     *
+     * @fires {Tag#changed}
+     */
+    OutlineTag.prototype.setOptions = function (options) {
+        var twoDimensionalPolygon = this._twoDimensionalPolygon(this._domain, this._geometry);
+        this._editable = twoDimensionalPolygon || options.editable == null ? this._editable : options.editable;
+        this._icon = options.icon === undefined ? this._icon : options.icon;
+        this._iconFloat = options.iconFloat == null ? this._iconFloat : options.iconFloat;
+        this._iconIndex = options.iconIndex == null ? this._iconIndex : options.iconIndex;
+        this._indicateVertices = options.indicateVertices == null ? this._indicateVertices : options.indicateVertices;
+        this._lineColor = options.lineColor == null ? this._lineColor : options.lineColor;
+        this._lineWidth = options.lineWidth == null ? this._lineWidth : options.lineWidth;
+        this._fillColor = options.fillColor == null ? this._fillColor : options.fillColor;
+        this._fillOpacity = options.fillOpacity == null ? this._fillOpacity : options.fillOpacity;
+        this._text = options.text === undefined ? this._text : options.text;
+        this._textColor = options.textColor == null ? this._textColor : options.textColor;
+        this._notifyChanged$.next(this);
+    };
+    OutlineTag.prototype._twoDimensionalPolygon = function (domain, geometry) {
+        return domain !== Component_1.TagDomain.ThreeDimensional && geometry instanceof Component_1.PolygonGeometry;
+    };
+    /**
+     * Event fired when the icon of the outline tag is clicked.
+     *
+     * @event OutlineTag#click
+     * @type {OutlineTag} The tag instance that was clicked.
+     */
+    OutlineTag.click = "click";
+    return OutlineTag;
+}(Component_1.Tag));
+exports.OutlineTag = OutlineTag;
+exports.default = OutlineTag;
+
+},{"../../../Component":291,"../../../Viewer":302,"rxjs":43}],399:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.RenderTag = void 0;
+var rxjs_1 = require("rxjs");
+var Geo_1 = require("../../../Geo");
+var RenderTag = /** @class */ (function () {
+    function RenderTag(tag, transform, viewportCoords) {
+        this._tag = tag;
+        this._transform = transform;
+        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
+        this._glObjectsChanged$ = new rxjs_1.Subject();
+        this._interact$ = new rxjs_1.Subject();
+    }
+    Object.defineProperty(RenderTag.prototype, "glObjectsChanged$", {
+        get: function () {
+            return this._glObjectsChanged$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderTag.prototype, "interact$", {
+        get: function () {
+            return this._interact$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderTag.prototype, "tag", {
+        get: function () {
+            return this._tag;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    return RenderTag;
+}());
+exports.RenderTag = RenderTag;
+exports.default = RenderTag;
+
+},{"../../../Geo":294,"rxjs":43}],400:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SpotRenderTag = void 0;
+var vd = require("virtual-dom");
+var Component_1 = require("../../../Component");
+var Viewer_1 = require("../../../Viewer");
+/**
+ * @class SpotRenderTag
+ * @classdesc Tag visualizing the properties of a SpotTag.
+ */
+var SpotRenderTag = /** @class */ (function (_super) {
+    __extends(SpotRenderTag, _super);
+    function SpotRenderTag() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    SpotRenderTag.prototype.dispose = function () { };
+    SpotRenderTag.prototype.getDOMObjects = function (atlas, camera, size) {
+        var _this = this;
+        var tag = this._tag;
+        var container = {
+            offsetHeight: size.height, offsetWidth: size.width,
+        };
+        var vNodes = [];
+        var _a = tag.geometry.getCentroid2d(), centroidBasicX = _a[0], centroidBasicY = _a[1];
+        var centroidCanvas = this._viewportCoords.basicToCanvasSafe(centroidBasicX, centroidBasicY, container, this._transform, camera);
+        if (centroidCanvas != null) {
+            var interactNone = function (e) {
+                _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: tag });
+            };
+            var canvasX = Math.round(centroidCanvas[0]);
+            var canvasY = Math.round(centroidCanvas[1]);
+            if (tag.icon != null) {
+                if (atlas.loaded) {
+                    var sprite = atlas.getDOMSprite(tag.icon, Viewer_1.Alignment.Bottom);
+                    var iconTransform = "translate(" + canvasX + "px," + (canvasY + 8) + "px)";
+                    var properties = {
+                        onmousedown: interactNone,
+                        style: {
+                            pointerEvents: "all",
+                            transform: iconTransform,
+                        },
+                    };
+                    vNodes.push(vd.h("div", properties, [sprite]));
+                }
+            }
+            else if (tag.text != null) {
+                var textTransform = "translate(-50%,0%) translate(" + canvasX + "px," + (canvasY + 8) + "px)";
+                var properties = {
+                    onmousedown: interactNone,
+                    style: {
+                        color: this._colorToCss(tag.textColor),
+                        transform: textTransform,
+                    },
+                    textContent: tag.text,
+                };
+                vNodes.push(vd.h("span.TagSymbol", properties, []));
+            }
+            var interact = this._interact(Component_1.TagOperation.Centroid, tag, "move");
+            var background = this._colorToCss(tag.color);
+            var transform = "translate(-50%,-50%) translate(" + canvasX + "px," + canvasY + "px)";
+            if (tag.editable) {
+                var interactorProperties = {
+                    onmousedown: interact,
+                    style: {
+                        background: background,
+                        transform: transform,
+                    },
+                };
+                vNodes.push(vd.h("div.TagSpotInteractor", interactorProperties, []));
+            }
+            var pointProperties = {
+                style: {
+                    background: background,
+                    transform: transform,
+                },
+            };
+            vNodes.push(vd.h("div.TagVertex", pointProperties, []));
+        }
+        return vNodes;
+    };
+    SpotRenderTag.prototype.getGLObjects = function () { return []; };
+    SpotRenderTag.prototype.getRetrievableObjects = function () { return []; };
+    SpotRenderTag.prototype._colorToCss = function (color) {
+        return "#" + ("000000" + color.toString(16)).substr(-6);
+    };
+    SpotRenderTag.prototype._interact = function (operation, tag, cursor, vertexIndex) {
+        var _this = this;
+        return function (e) {
+            var offsetX = e.offsetX - e.target.offsetWidth / 2;
+            var offsetY = e.offsetY - e.target.offsetHeight / 2;
+            _this._interact$.next({
+                cursor: cursor,
+                offsetX: offsetX,
+                offsetY: offsetY,
+                operation: operation,
+                tag: tag,
+                vertexIndex: vertexIndex,
+            });
+        };
+    };
+    return SpotRenderTag;
+}(Component_1.RenderTag));
+exports.SpotRenderTag = SpotRenderTag;
+
+
+},{"../../../Component":291,"../../../Viewer":302,"virtual-dom":247}],401:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SpotTag = void 0;
+var Component_1 = require("../../../Component");
+/**
+ * @class SpotTag
+ *
+ * @classdesc Tag holding properties for visualizing the centroid of a geometry.
+ *
+ * @example
+ * ```
+ * var geometry = new Mapillary.TagComponent.PointGeometry([0.3, 0.3]);
+ * var tag = new Mapillary.TagComponent.SpotTag(
+ *     "id-1",
+ *     geometry
+ *     { editable: true, color: 0xff0000 });
+ *
+ * tagComponent.add([tag]);
+ * ```
+ */
+var SpotTag = /** @class */ (function (_super) {
+    __extends(SpotTag, _super);
+    /**
+     * Create a spot tag.
+     *
+     * @override
+     * @constructor
+     * @param {string} id
+     * @param {Geometry} geometry
+     * @param {IOutlineTagOptions} options - Options defining the visual appearance and
+     * behavior of the spot tag.
+     */
+    function SpotTag(id, geometry, options) {
+        var _this = _super.call(this, id, geometry) || this;
+        options = !!options ? options : {};
+        _this._color = options.color == null ? 0xFFFFFF : options.color;
+        _this._editable = options.editable == null ? false : options.editable;
+        _this._icon = options.icon === undefined ? null : options.icon;
+        _this._text = options.text === undefined ? null : options.text;
+        _this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor;
+        return _this;
+    }
+    Object.defineProperty(SpotTag.prototype, "color", {
+        /**
+         * Get color property.
+         * @returns {number} The color of the spot as a hexagonal number;
+         */
+        get: function () {
+            return this._color;
+        },
+        /**
+         * Set color property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._color = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(SpotTag.prototype, "editable", {
+        /**
+         * Get editable property.
+         * @returns {boolean} Value indicating if tag is editable.
+         */
+        get: function () {
+            return this._editable;
+        },
+        /**
+         * Set editable property.
+         * @param {boolean}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._editable = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(SpotTag.prototype, "icon", {
+        /**
+         * Get icon property.
+         * @returns {string}
+         */
+        get: function () {
+            return this._icon;
+        },
+        /**
+         * Set icon property.
+         * @param {string}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._icon = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(SpotTag.prototype, "text", {
+        /**
+         * Get text property.
+         * @returns {string}
+         */
+        get: function () {
+            return this._text;
+        },
+        /**
+         * Set text property.
+         * @param {string}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._text = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(SpotTag.prototype, "textColor", {
+        /**
+         * Get text color property.
+         * @returns {number}
+         */
+        get: function () {
+            return this._textColor;
+        },
+        /**
+         * Set text color property.
+         * @param {number}
+         *
+         * @fires Tag#changed
+         */
+        set: function (value) {
+            this._textColor = value;
+            this._notifyChanged$.next(this);
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * Set options for tag.
+     *
+     * @description Sets all the option properties provided and keps
+     * the rest of the values as is.
+     *
+     * @param {ISpotTagOptions} options - Spot tag options
+     *
+     * @fires {Tag#changed}
+     */
+    SpotTag.prototype.setOptions = function (options) {
+        this._color = options.color == null ? this._color : options.color;
+        this._editable = options.editable == null ? this._editable : options.editable;
+        this._icon = options.icon === undefined ? this._icon : options.icon;
+        this._text = options.text === undefined ? this._text : options.text;
+        this._textColor = options.textColor == null ? this._textColor : options.textColor;
+        this._notifyChanged$.next(this);
+    };
+    return SpotTag;
+}(Component_1.Tag));
+exports.SpotTag = SpotTag;
+exports.default = SpotTag;
+
+},{"../../../Component":291}],402:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Tag = void 0;
+var operators_1 = require("rxjs/operators");
+var rxjs_1 = require("rxjs");
+var Utils_1 = require("../../../Utils");
+/**
+ * @class Tag
+ * @abstract
+ * @classdesc Abstract class representing the basic functionality of for a tag.
+ */
+var Tag = /** @class */ (function (_super) {
+    __extends(Tag, _super);
+    /**
+     * Create a tag.
+     *
+     * @constructor
+     * @param {string} id
+     * @param {Geometry} geometry
+     */
+    function Tag(id, geometry) {
+        var _this = _super.call(this) || this;
+        _this._id = id;
+        _this._geometry = geometry;
+        _this._notifyChanged$ = new rxjs_1.Subject();
+        _this._notifyChanged$
+            .subscribe(function (t) {
+            _this.fire(Tag.changed, _this);
+        });
+        _this._geometry.changed$
+            .subscribe(function (g) {
+            _this.fire(Tag.geometrychanged, _this);
+        });
+        return _this;
+    }
+    Object.defineProperty(Tag.prototype, "id", {
+        /**
+         * Get id property.
+         * @returns {string}
          */
-        set: function (value) {
-            this._lineColor = value;
-            this._notifyChanged$.next(this);
+        get: function () {
+            return this._id;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineTag.prototype, "lineOpacity", {
+    Object.defineProperty(Tag.prototype, "geometry", {
         /**
-         * Get line opacity property.
-         * @returns {number}
+         * Get geometry property.
+         * @returns {Geometry} The geometry of the tag.
          */
         get: function () {
-            return this._lineOpacity;
-        },
-        /**
-         * Set line opacity property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._lineOpacity = value;
-            this._notifyChanged$.next(this);
+            return this._geometry;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineTag.prototype, "lineWidth", {
+    Object.defineProperty(Tag.prototype, "changed$", {
         /**
-         * Get line width property.
-         * @returns {number}
+         * Get changed observable.
+         * @returns {Observable<Tag>}
+         * @ignore
          */
         get: function () {
-            return this._lineWidth;
-        },
-        /**
-         * Set line width property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._lineWidth = value;
-            this._notifyChanged$.next(this);
+            return this._notifyChanged$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineTag.prototype, "text", {
+    Object.defineProperty(Tag.prototype, "geometryChanged$", {
         /**
-         * Get text property.
-         * @returns {string}
+         * Get geometry changed observable.
+         * @returns {Observable<Tag>}
+         * @ignore
          */
         get: function () {
-            return this._text;
-        },
-        /**
-         * Set text property.
-         * @param {string}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._text = value;
-            this._notifyChanged$.next(this);
+            var _this = this;
+            return this._geometry.changed$.pipe(operators_1.map(function (geometry) {
+                return _this;
+            }), operators_1.share());
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(OutlineTag.prototype, "textColor", {
-        /**
-         * Get text color property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._textColor;
-        },
+    /**
+     * Event fired when a property related to the visual appearance of the
+     * tag has changed.
+     *
+     * @event Tag#changed
+     * @type {Tag} The tag instance that has changed.
+     */
+    Tag.changed = "changed";
+    /**
+     * Event fired when the geometry of the tag has changed.
+     *
+     * @event Tag#geometrychanged
+     * @type {Tag} The tag instance whose geometry has changed.
+     */
+    Tag.geometrychanged = "geometrychanged";
+    return Tag;
+}(Utils_1.EventEmitter));
+exports.Tag = Tag;
+exports.default = Tag;
+
+},{"../../../Utils":301,"rxjs":43,"rxjs/operators":241}],403:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TagDomain = void 0;
+/**
+ * Enumeration for tag domains.
+ * @enum {number}
+ * @readonly
+ * @description Defines where lines between two vertices are treated
+ * as straight.
+ *
+ * Only applicable for polygons. For rectangles lines between
+ * vertices are always treated as straight in the distorted 2D
+ * projection and bended in the undistorted 3D space.
+ */
+var TagDomain;
+(function (TagDomain) {
+    /**
+     * Treats lines between two vertices as straight in the
+     * distorted 2D projection, i.e. on the image. If the image
+     * is distorted this will result in bended lines when rendered
+     * in the undistorted 3D space.
+     */
+    TagDomain[TagDomain["TwoDimensional"] = 0] = "TwoDimensional";
+    /**
+     * Treats lines as straight in the undistorted 3D space. If the
+     * image is distorted this will result in bended lines when rendered
+     * on the distorted 2D projection of the image.
+     */
+    TagDomain[TagDomain["ThreeDimensional"] = 1] = "ThreeDimensional";
+})(TagDomain = exports.TagDomain || (exports.TagDomain = {}));
+exports.default = TagDomain;
+
+},{}],404:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ComponentSize = void 0;
+/**
+ * Enumeration for component size.
+ * @enum {number}
+ * @readonly
+ * @description May be used by a component to allow for resizing
+ * of the UI elements rendered by the component.
+ */
+var ComponentSize;
+(function (ComponentSize) {
+    /**
+     * Automatic size. The size of the elements will automatically
+     * change at a predefined threshold.
+     */
+    ComponentSize[ComponentSize["Automatic"] = 0] = "Automatic";
+    /**
+     * Large size. The size of the elements will be fixed until another
+     * component size is configured.
+     */
+    ComponentSize[ComponentSize["Large"] = 1] = "Large";
+    /**
+     * Small size. The size of the elements will be fixed until another
+     * component size is configured.
+     */
+    ComponentSize[ComponentSize["Small"] = 2] = "Small";
+})(ComponentSize = exports.ComponentSize || (exports.ComponentSize = {}));
+exports.default = ComponentSize;
+
+},{}],405:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.HandlerBase = void 0;
+var HandlerBase = /** @class */ (function () {
+    /** @ignore */
+    function HandlerBase(component, container, navigator) {
+        this._component = component;
+        this._container = container;
+        this._navigator = navigator;
+        this._enabled = false;
+    }
+    Object.defineProperty(HandlerBase.prototype, "isEnabled", {
         /**
-         * Set text color property.
-         * @param {number}
+         * Returns a Boolean indicating whether the interaction is enabled.
          *
-         * @fires Tag#changed
+         * @returns {boolean} `true` if the interaction is enabled.
          */
-        set: function (value) {
-            this._textColor = value;
-            this._notifyChanged$.next(this);
+        get: function () {
+            return this._enabled;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     /**
-     * Set options for tag.
-     *
-     * @description Sets all the option properties provided and keeps
-     * the rest of the values as is.
-     *
-     * @param {IOutlineTagOptions} options - Outline tag options
+     * Enables the interaction.
      *
-     * @fires {Tag#changed}
+     * @example ```<component-name>.<handler-name>.enable();```
      */
-    OutlineTag.prototype.setOptions = function (options) {
-        this._editable = options.editable == null ? this._editable : options.editable;
-        this._icon = options.icon === undefined ? this._icon : options.icon;
-        this._iconFloat = options.iconFloat == null ? this._iconFloat : options.iconFloat;
-        this._iconIndex = options.iconIndex == null ? this._iconIndex : options.iconIndex;
-        this._indicateVertices = options.indicateVertices == null ? this._indicateVertices : options.indicateVertices;
-        this._lineColor = options.lineColor == null ? this._lineColor : options.lineColor;
-        this._lineWidth = options.lineWidth == null ? this._lineWidth : options.lineWidth;
-        this._fillColor = options.fillColor == null ? this._fillColor : options.fillColor;
-        this._fillOpacity = options.fillOpacity == null ? this._fillOpacity : options.fillOpacity;
-        this._text = options.text === undefined ? this._text : options.text;
-        this._textColor = options.textColor == null ? this._textColor : options.textColor;
-        this._notifyChanged$.next(this);
+    HandlerBase.prototype.enable = function () {
+        if (this._enabled || !this._component.activated) {
+            return;
+        }
+        this._enable();
+        this._enabled = true;
+        this._component.configure(this._getConfiguration(true));
     };
     /**
-     * Event fired when the icon of the outline tag is clicked.
+     * Disables the interaction.
      *
-     * @event OutlineTag#click
-     * @type {OutlineTag} The tag instance that was clicked.
+     * @example ```<component-name>.<handler-name>.disable();```
      */
-    OutlineTag.click = "click";
-    return OutlineTag;
-}(Component_1.Tag));
-exports.OutlineTag = OutlineTag;
-exports.default = OutlineTag;
+    HandlerBase.prototype.disable = function () {
+        if (!this._enabled) {
+            return;
+        }
+        this._disable();
+        this._enabled = false;
+        if (this._component.activated) {
+            this._component.configure(this._getConfiguration(false));
+        }
+    };
+    return HandlerBase;
+}());
+exports.HandlerBase = HandlerBase;
+exports.default = HandlerBase;
 
-},{"../../../Component":226,"../../../Viewer":236,"rxjs/Subject":34}],299:[function(require,module,exports){
+},{}],406:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("rxjs/Subject");
-var Geo_1 = require("../../../Geo");
-var RenderTag = (function () {
-    function RenderTag(tag, transform, viewportCoords) {
-        this._tag = tag;
-        this._transform = transform;
-        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
-        this._glObjectsChanged$ = new Subject_1.Subject();
-        this._interact$ = new Subject_1.Subject();
+exports.MeshFactory = void 0;
+var THREE = require("three");
+var Component_1 = require("../../Component");
+var MeshFactory = /** @class */ (function () {
+    function MeshFactory(imagePlaneDepth, imageSphereRadius) {
+        this._imagePlaneDepth = imagePlaneDepth != null ? imagePlaneDepth : 200;
+        this._imageSphereRadius = imageSphereRadius != null ? imageSphereRadius : 200;
     }
-    Object.defineProperty(RenderTag.prototype, "glObjectsChanged$", {
+    MeshFactory.prototype.createMesh = function (node, transform) {
+        if (node.pano) {
+            return this._createImageSphere(node, transform);
+        }
+        else if (transform.cameraProjection === "fisheye") {
+            return this._createImagePlaneFisheye(node, transform);
+        }
+        else {
+            return this._createImagePlane(node, transform);
+        }
+    };
+    MeshFactory.prototype.createFlatMesh = function (node, transform, basicX0, basicX1, basicY0, basicY1) {
+        var texture = this._createTexture(node.image);
+        var materialParameters = this._createDistortedPlaneMaterialParameters(transform, texture);
+        var material = new THREE.ShaderMaterial(materialParameters);
+        var geometry = this._getFlatImagePlaneGeoFromBasic(transform, basicX0, basicX1, basicY0, basicY1);
+        return new THREE.Mesh(geometry, material);
+    };
+    MeshFactory.prototype.createCurtainMesh = function (node, transform) {
+        if (node.pano && !node.fullPano) {
+            throw new Error("Cropped panoramas cannot have curtain.");
+        }
+        if (node.pano) {
+            return this._createSphereCurtainMesh(node, transform);
+        }
+        else if (transform.cameraProjection === "fisheye") {
+            return this._createCurtainMeshFisheye(node, transform);
+        }
+        else {
+            return this._createCurtainMesh(node, transform);
+        }
+    };
+    MeshFactory.prototype.createDistortedCurtainMesh = function (node, transform) {
+        if (node.pano) {
+            throw new Error("Cropped panoramas cannot have curtain.");
+        }
+        return this._createDistortedCurtainMesh(node, transform);
+    };
+    MeshFactory.prototype._createCurtainMesh = function (node, transform) {
+        var texture = this._createTexture(node.image);
+        var materialParameters = this._createCurtainPlaneMaterialParameters(transform, texture);
+        var material = new THREE.ShaderMaterial(materialParameters);
+        var geometry = this._useMesh(transform, node) ?
+            this._getImagePlaneGeo(transform, node) :
+            this._getRegularFlatImagePlaneGeo(transform);
+        return new THREE.Mesh(geometry, material);
+    };
+    MeshFactory.prototype._createCurtainMeshFisheye = function (node, transform) {
+        var texture = this._createTexture(node.image);
+        var materialParameters = this._createCurtainPlaneMaterialParametersFisheye(transform, texture);
+        var material = new THREE.ShaderMaterial(materialParameters);
+        var geometry = this._useMesh(transform, node) ?
+            this._getImagePlaneGeoFisheye(transform, node) :
+            this._getRegularFlatImagePlaneGeo(transform);
+        return new THREE.Mesh(geometry, material);
+    };
+    MeshFactory.prototype._createDistortedCurtainMesh = function (node, transform) {
+        var texture = this._createTexture(node.image);
+        var materialParameters = this._createDistortedCurtainPlaneMaterialParameters(transform, texture);
+        var material = new THREE.ShaderMaterial(materialParameters);
+        var geometry = this._getRegularFlatImagePlaneGeo(transform);
+        return new THREE.Mesh(geometry, material);
+    };
+    MeshFactory.prototype._createSphereCurtainMesh = function (node, transform) {
+        var texture = this._createTexture(node.image);
+        var materialParameters = this._createCurtainSphereMaterialParameters(transform, texture);
+        var material = new THREE.ShaderMaterial(materialParameters);
+        return this._useMesh(transform, node) ?
+            new THREE.Mesh(this._getImageSphereGeo(transform, node), material) :
+            new THREE.Mesh(this._getFlatImageSphereGeo(transform), material);
+    };
+    MeshFactory.prototype._createImageSphere = function (node, transform) {
+        var texture = this._createTexture(node.image);
+        var materialParameters = this._createSphereMaterialParameters(transform, texture);
+        var material = new THREE.ShaderMaterial(materialParameters);
+        var mesh = this._useMesh(transform, node) ?
+            new THREE.Mesh(this._getImageSphereGeo(transform, node), material) :
+            new THREE.Mesh(this._getFlatImageSphereGeo(transform), material);
+        return mesh;
+    };
+    MeshFactory.prototype._createImagePlane = function (node, transform) {
+        var texture = this._createTexture(node.image);
+        var materialParameters = this._createPlaneMaterialParameters(transform, texture);
+        var material = new THREE.ShaderMaterial(materialParameters);
+        var geometry = this._useMesh(transform, node) ?
+            this._getImagePlaneGeo(transform, node) :
+            this._getRegularFlatImagePlaneGeo(transform);
+        return new THREE.Mesh(geometry, material);
+    };
+    MeshFactory.prototype._createImagePlaneFisheye = function (node, transform) {
+        var texture = this._createTexture(node.image);
+        var materialParameters = this._createPlaneMaterialParametersFisheye(transform, texture);
+        var material = new THREE.ShaderMaterial(materialParameters);
+        var geometry = this._useMesh(transform, node) ?
+            this._getImagePlaneGeoFisheye(transform, node) :
+            this._getRegularFlatImagePlaneGeoFisheye(transform);
+        return new THREE.Mesh(geometry, material);
+    };
+    MeshFactory.prototype._createSphereMaterialParameters = function (transform, texture) {
+        var gpano = transform.gpano;
+        var halfCroppedWidth = (gpano.FullPanoWidthPixels - gpano.CroppedAreaImageWidthPixels) / 2;
+        var phiShift = 2 * Math.PI * (gpano.CroppedAreaLeftPixels - halfCroppedWidth) / gpano.FullPanoWidthPixels;
+        var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;
+        var halfCroppedHeight = (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels) / 2;
+        var thetaShift = Math.PI * (halfCroppedHeight - gpano.CroppedAreaTopPixels) / gpano.FullPanoHeightPixels;
+        var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;
+        var materialParameters = {
+            depthWrite: false,
+            fragmentShader: Component_1.Shaders.equirectangular.fragment,
+            side: THREE.DoubleSide,
+            transparent: true,
+            uniforms: {
+                opacity: { value: 1.0 },
+                phiLength: { value: phiLength },
+                phiShift: { value: phiShift },
+                projectorMat: { value: transform.rt },
+                projectorTex: { value: texture },
+                thetaLength: { value: thetaLength },
+                thetaShift: { value: thetaShift },
+            },
+            vertexShader: Component_1.Shaders.equirectangular.vertex,
+        };
+        return materialParameters;
+    };
+    MeshFactory.prototype._createCurtainSphereMaterialParameters = function (transform, texture) {
+        var gpano = transform.gpano;
+        var halfCroppedWidth = (gpano.FullPanoWidthPixels - gpano.CroppedAreaImageWidthPixels) / 2;
+        var phiShift = 2 * Math.PI * (gpano.CroppedAreaLeftPixels - halfCroppedWidth) / gpano.FullPanoWidthPixels;
+        var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;
+        var halfCroppedHeight = (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels) / 2;
+        var thetaShift = Math.PI * (halfCroppedHeight - gpano.CroppedAreaTopPixels) / gpano.FullPanoHeightPixels;
+        var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;
+        var materialParameters = {
+            depthWrite: false,
+            fragmentShader: Component_1.Shaders.equirectangularCurtain.fragment,
+            side: THREE.DoubleSide,
+            transparent: true,
+            uniforms: {
+                curtain: { value: 1.0 },
+                opacity: { value: 1.0 },
+                phiLength: { value: phiLength },
+                phiShift: { value: phiShift },
+                projectorMat: { value: transform.rt },
+                projectorTex: { value: texture },
+                thetaLength: { value: thetaLength },
+                thetaShift: { value: thetaShift },
+            },
+            vertexShader: Component_1.Shaders.equirectangularCurtain.vertex,
+        };
+        return materialParameters;
+    };
+    MeshFactory.prototype._createPlaneMaterialParameters = function (transform, texture) {
+        var materialParameters = {
+            depthWrite: false,
+            fragmentShader: Component_1.Shaders.perspective.fragment,
+            side: THREE.DoubleSide,
+            transparent: true,
+            uniforms: {
+                focal: { value: transform.focal },
+                k1: { value: transform.ck1 },
+                k2: { value: transform.ck2 },
+                opacity: { value: 1.0 },
+                projectorMat: { value: transform.basicRt },
+                projectorTex: { value: texture },
+                radial_peak: { value: !!transform.radialPeak ? transform.radialPeak : 0.0 },
+                scale_x: { value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth },
+                scale_y: { value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight },
+            },
+            vertexShader: Component_1.Shaders.perspective.vertex,
+        };
+        return materialParameters;
+    };
+    MeshFactory.prototype._createPlaneMaterialParametersFisheye = function (transform, texture) {
+        var materialParameters = {
+            depthWrite: false,
+            fragmentShader: Component_1.Shaders.fisheye.fragment,
+            side: THREE.DoubleSide,
+            transparent: true,
+            uniforms: {
+                focal: { value: transform.focal },
+                k1: { value: transform.ck1 },
+                k2: { value: transform.ck2 },
+                opacity: { value: 1.0 },
+                projectorMat: { value: transform.basicRt },
+                projectorTex: { value: texture },
+                radial_peak: { value: !!transform.radialPeak ? transform.radialPeak : 0.0 },
+                scale_x: { value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth },
+                scale_y: { value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight },
+            },
+            vertexShader: Component_1.Shaders.fisheye.vertex,
+        };
+        return materialParameters;
+    };
+    MeshFactory.prototype._createCurtainPlaneMaterialParametersFisheye = function (transform, texture) {
+        var materialParameters = {
+            depthWrite: false,
+            fragmentShader: Component_1.Shaders.fisheyeCurtain.fragment,
+            side: THREE.DoubleSide,
+            transparent: true,
+            uniforms: {
+                curtain: { value: 1.0 },
+                focal: { value: transform.focal },
+                k1: { value: transform.ck1 },
+                k2: { value: transform.ck2 },
+                opacity: { value: 1.0 },
+                projectorMat: { value: transform.basicRt },
+                projectorTex: { value: texture },
+                radial_peak: { value: !!transform.radialPeak ? transform.radialPeak : 0.0 },
+                scale_x: { value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth },
+                scale_y: { value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight },
+            },
+            vertexShader: Component_1.Shaders.fisheyeCurtain.vertex,
+        };
+        return materialParameters;
+    };
+    MeshFactory.prototype._createCurtainPlaneMaterialParameters = function (transform, texture) {
+        var materialParameters = {
+            depthWrite: false,
+            fragmentShader: Component_1.Shaders.perspectiveCurtain.fragment,
+            side: THREE.DoubleSide,
+            transparent: true,
+            uniforms: {
+                curtain: { value: 1.0 },
+                focal: { value: transform.focal },
+                k1: { value: transform.ck1 },
+                k2: { value: transform.ck2 },
+                opacity: { value: 1.0 },
+                projectorMat: { value: transform.basicRt },
+                projectorTex: { value: texture },
+                radial_peak: { value: !!transform.radialPeak ? transform.radialPeak : 0.0 },
+                scale_x: { value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth },
+                scale_y: { value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight },
+            },
+            vertexShader: Component_1.Shaders.perspectiveCurtain.vertex,
+        };
+        return materialParameters;
+    };
+    MeshFactory.prototype._createDistortedCurtainPlaneMaterialParameters = function (transform, texture) {
+        var materialParameters = {
+            depthWrite: false,
+            fragmentShader: Component_1.Shaders.perspectiveDistortedCurtain.fragment,
+            side: THREE.DoubleSide,
+            transparent: true,
+            uniforms: {
+                curtain: { value: 1.0 },
+                opacity: { value: 1.0 },
+                projectorMat: { value: transform.projectorMatrix() },
+                projectorTex: { value: texture },
+            },
+            vertexShader: Component_1.Shaders.perspectiveDistortedCurtain.vertex,
+        };
+        return materialParameters;
+    };
+    MeshFactory.prototype._createDistortedPlaneMaterialParameters = function (transform, texture) {
+        var materialParameters = {
+            depthWrite: false,
+            fragmentShader: Component_1.Shaders.perspectiveDistorted.fragment,
+            side: THREE.DoubleSide,
+            transparent: true,
+            uniforms: {
+                opacity: { value: 1.0 },
+                projectorMat: { value: transform.projectorMatrix() },
+                projectorTex: { value: texture },
+            },
+            vertexShader: Component_1.Shaders.perspectiveDistorted.vertex,
+        };
+        return materialParameters;
+    };
+    MeshFactory.prototype._createTexture = function (image) {
+        var texture = new THREE.Texture(image);
+        texture.minFilter = THREE.LinearFilter;
+        texture.needsUpdate = true;
+        return texture;
+    };
+    MeshFactory.prototype._useMesh = function (transform, node) {
+        return node.mesh.vertices.length && transform.hasValidScale;
+    };
+    MeshFactory.prototype._getImageSphereGeo = function (transform, node) {
+        var t = new THREE.Matrix4().getInverse(transform.srt);
+        // push everything at least 5 meters in front of the camera
+        var minZ = 5.0 * transform.scale;
+        var maxZ = this._imageSphereRadius * transform.scale;
+        var vertices = node.mesh.vertices;
+        var numVertices = vertices.length / 3;
+        var positions = new Float32Array(vertices.length);
+        for (var i = 0; i < numVertices; ++i) {
+            var index = 3 * i;
+            var x = vertices[index + 0];
+            var y = vertices[index + 1];
+            var z = vertices[index + 2];
+            var l = Math.sqrt(x * x + y * y + z * z);
+            var boundedL = Math.max(minZ, Math.min(l, maxZ));
+            var factor = boundedL / l;
+            var p = new THREE.Vector3(x * factor, y * factor, z * factor);
+            p.applyMatrix4(t);
+            positions[index + 0] = p.x;
+            positions[index + 1] = p.y;
+            positions[index + 2] = p.z;
+        }
+        var faces = node.mesh.faces;
+        var indices = new Uint16Array(faces.length);
+        for (var i = 0; i < faces.length; ++i) {
+            indices[i] = faces[i];
+        }
+        var geometry = new THREE.BufferGeometry();
+        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
+        return geometry;
+    };
+    MeshFactory.prototype._getImagePlaneGeo = function (transform, node) {
+        var undistortionMarginFactor = 3;
+        var t = new THREE.Matrix4().getInverse(transform.srt);
+        // push everything at least 5 meters in front of the camera
+        var minZ = 5.0 * transform.scale;
+        var maxZ = this._imagePlaneDepth * transform.scale;
+        var vertices = node.mesh.vertices;
+        var numVertices = vertices.length / 3;
+        var positions = new Float32Array(vertices.length);
+        for (var i = 0; i < numVertices; ++i) {
+            var index = 3 * i;
+            var x = vertices[index + 0];
+            var y = vertices[index + 1];
+            var z = vertices[index + 2];
+            if (i < 4) {
+                x *= undistortionMarginFactor;
+                y *= undistortionMarginFactor;
+            }
+            var boundedZ = Math.max(minZ, Math.min(z, maxZ));
+            var factor = boundedZ / z;
+            var p = new THREE.Vector3(x * factor, y * factor, boundedZ);
+            p.applyMatrix4(t);
+            positions[index + 0] = p.x;
+            positions[index + 1] = p.y;
+            positions[index + 2] = p.z;
+        }
+        var faces = node.mesh.faces;
+        var indices = new Uint16Array(faces.length);
+        for (var i = 0; i < faces.length; ++i) {
+            indices[i] = faces[i];
+        }
+        var geometry = new THREE.BufferGeometry();
+        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
+        return geometry;
+    };
+    MeshFactory.prototype._getImagePlaneGeoFisheye = function (transform, node) {
+        var t = new THREE.Matrix4().getInverse(transform.srt);
+        // push everything at least 5 meters in front of the camera
+        var minZ = 5.0 * transform.scale;
+        var maxZ = this._imagePlaneDepth * transform.scale;
+        var vertices = node.mesh.vertices;
+        var numVertices = vertices.length / 3;
+        var positions = new Float32Array(vertices.length);
+        for (var i = 0; i < numVertices; ++i) {
+            var index = 3 * i;
+            var x = vertices[index + 0];
+            var y = vertices[index + 1];
+            var z = vertices[index + 2];
+            var l = Math.sqrt(x * x + y * y + z * z);
+            var boundedL = Math.max(minZ, Math.min(l, maxZ));
+            var factor = boundedL / l;
+            var p = new THREE.Vector3(x * factor, y * factor, z * factor);
+            p.applyMatrix4(t);
+            positions[index + 0] = p.x;
+            positions[index + 1] = p.y;
+            positions[index + 2] = p.z;
+        }
+        var faces = node.mesh.faces;
+        var indices = new Uint16Array(faces.length);
+        for (var i = 0; i < faces.length; ++i) {
+            indices[i] = faces[i];
+        }
+        var geometry = new THREE.BufferGeometry();
+        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
+        return geometry;
+    };
+    MeshFactory.prototype._getFlatImageSphereGeo = function (transform) {
+        var gpano = transform.gpano;
+        var phiStart = 2 * Math.PI * gpano.CroppedAreaLeftPixels / gpano.FullPanoWidthPixels;
+        var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;
+        var thetaStart = Math.PI *
+            (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels - gpano.CroppedAreaTopPixels) /
+            gpano.FullPanoHeightPixels;
+        var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;
+        var geometry = new THREE.SphereGeometry(this._imageSphereRadius, 20, 40, phiStart - Math.PI / 2, phiLength, thetaStart, thetaLength);
+        geometry.applyMatrix4(new THREE.Matrix4().getInverse(transform.rt));
+        return geometry;
+    };
+    MeshFactory.prototype._getRegularFlatImagePlaneGeo = function (transform) {
+        var width = transform.width;
+        var height = transform.height;
+        var size = Math.max(width, height);
+        var dx = width / 2.0 / size;
+        var dy = height / 2.0 / size;
+        return this._getFlatImagePlaneGeo(transform, dx, dy);
+    };
+    MeshFactory.prototype._getFlatImagePlaneGeo = function (transform, dx, dy) {
+        var vertices = [];
+        vertices.push(transform.unprojectSfM([-dx, -dy], this._imagePlaneDepth));
+        vertices.push(transform.unprojectSfM([dx, -dy], this._imagePlaneDepth));
+        vertices.push(transform.unprojectSfM([dx, dy], this._imagePlaneDepth));
+        vertices.push(transform.unprojectSfM([-dx, dy], this._imagePlaneDepth));
+        return this._createFlatGeometry(vertices);
+    };
+    MeshFactory.prototype._getRegularFlatImagePlaneGeoFisheye = function (transform) {
+        var width = transform.width;
+        var height = transform.height;
+        var size = Math.max(width, height);
+        var dx = width / 2.0 / size;
+        var dy = height / 2.0 / size;
+        return this._getFlatImagePlaneGeoFisheye(transform, dx, dy);
+    };
+    MeshFactory.prototype._getFlatImagePlaneGeoFisheye = function (transform, dx, dy) {
+        var vertices = [];
+        vertices.push(transform.unprojectSfM([-dx, -dy], this._imagePlaneDepth));
+        vertices.push(transform.unprojectSfM([dx, -dy], this._imagePlaneDepth));
+        vertices.push(transform.unprojectSfM([dx, dy], this._imagePlaneDepth));
+        vertices.push(transform.unprojectSfM([-dx, dy], this._imagePlaneDepth));
+        return this._createFlatGeometry(vertices);
+    };
+    MeshFactory.prototype._getFlatImagePlaneGeoFromBasic = function (transform, basicX0, basicX1, basicY0, basicY1) {
+        var vertices = [];
+        vertices.push(transform.unprojectBasic([basicX0, basicY0], this._imagePlaneDepth));
+        vertices.push(transform.unprojectBasic([basicX1, basicY0], this._imagePlaneDepth));
+        vertices.push(transform.unprojectBasic([basicX1, basicY1], this._imagePlaneDepth));
+        vertices.push(transform.unprojectBasic([basicX0, basicY1], this._imagePlaneDepth));
+        return this._createFlatGeometry(vertices);
+    };
+    MeshFactory.prototype._createFlatGeometry = function (vertices) {
+        var positions = new Float32Array(12);
+        for (var i = 0; i < vertices.length; i++) {
+            var index = 3 * i;
+            positions[index + 0] = vertices[i][0];
+            positions[index + 1] = vertices[i][1];
+            positions[index + 2] = vertices[i][2];
+        }
+        var indices = new Uint16Array(6);
+        indices[0] = 0;
+        indices[1] = 1;
+        indices[2] = 3;
+        indices[3] = 1;
+        indices[4] = 2;
+        indices[5] = 3;
+        var geometry = new THREE.BufferGeometry();
+        geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
+        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
+        return geometry;
+    };
+    return MeshFactory;
+}());
+exports.MeshFactory = MeshFactory;
+exports.default = MeshFactory;
+
+},{"../../Component":291,"three":242}],407:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.MeshScene = void 0;
+var THREE = require("three");
+var MeshScene = /** @class */ (function () {
+    function MeshScene() {
+        this._planes = {};
+        this._planesOld = {};
+        this._planesPeriphery = {};
+        this._scene = new THREE.Scene();
+        this._sceneOld = new THREE.Scene();
+        this._scenePeriphery = new THREE.Scene();
+    }
+    Object.defineProperty(MeshScene.prototype, "planes", {
+        get: function () {
+            return this._planes;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MeshScene.prototype, "planesOld", {
+        get: function () {
+            return this._planesOld;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MeshScene.prototype, "planesPeriphery", {
+        get: function () {
+            return this._planesPeriphery;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MeshScene.prototype, "scene", {
         get: function () {
-            return this._glObjectsChanged$;
+            return this._scene;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(RenderTag.prototype, "interact$", {
+    Object.defineProperty(MeshScene.prototype, "sceneOld", {
         get: function () {
-            return this._interact$;
+            return this._sceneOld;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(RenderTag.prototype, "tag", {
+    Object.defineProperty(MeshScene.prototype, "scenePeriphery", {
         get: function () {
-            return this._tag;
+            return this._scenePeriphery;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    return RenderTag;
-}());
-exports.RenderTag = RenderTag;
-exports.default = RenderTag;
-
-},{"../../../Geo":229,"rxjs/Subject":34}],300:[function(require,module,exports){
-"use strict";
-/// <reference path="../../../../typings/index.d.ts" />
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    MeshScene.prototype.updateImagePlanes = function (planes) {
+        this._dispose(this._planesOld, this.sceneOld);
+        for (var key in this._planes) {
+            if (!this._planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = this._planes[key];
+            this._scene.remove(plane);
+            this._sceneOld.add(plane);
+        }
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            this._scene.add(planes[key]);
+        }
+        this._planesOld = this._planes;
+        this._planes = planes;
     };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var vd = require("virtual-dom");
-var Component_1 = require("../../../Component");
-var Viewer_1 = require("../../../Viewer");
-/**
- * @class SpotRenderTag
- * @classdesc Tag visualizing the properties of a SpotTag.
- */
-var SpotRenderTag = (function (_super) {
-    __extends(SpotRenderTag, _super);
-    function SpotRenderTag() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    SpotRenderTag.prototype.dispose = function () { };
-    SpotRenderTag.prototype.getDOMObjects = function (atlas, camera, size) {
-        var _this = this;
-        var tag = this._tag;
-        var container = {
-            offsetHeight: size.height, offsetWidth: size.width,
-        };
-        var vNodes = [];
-        var _a = tag.geometry.getCentroid2d(), centroidBasicX = _a[0], centroidBasicY = _a[1];
-        var centroidCanvas = this._viewportCoords.basicToCanvasSafe(centroidBasicX, centroidBasicY, container, this._transform, camera);
-        if (centroidCanvas != null) {
-            var interactNone = function (e) {
-                _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: tag });
-            };
-            var canvasX = Math.round(centroidCanvas[0]);
-            var canvasY = Math.round(centroidCanvas[1]);
-            if (tag.icon != null) {
-                if (atlas.loaded) {
-                    var sprite = atlas.getDOMSprite(tag.icon, Viewer_1.Alignment.Bottom);
-                    var transform_1 = "translate(" + canvasX + "px," + (canvasY + 8) + "px)";
-                    var properties = {
-                        onmousedown: interactNone,
-                        style: {
-                            pointerEvents: "all",
-                            transform: transform_1,
-                        },
-                    };
-                    vNodes.push(vd.h("div", properties, [sprite]));
-                }
+    MeshScene.prototype.addImagePlanes = function (planes) {
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
             }
-            else if (tag.text != null) {
-                var transform_2 = "translate(-50%,0%) translate(" + canvasX + "px," + (canvasY + 8) + "px)";
-                var properties = {
-                    onmousedown: interactNone,
-                    style: {
-                        color: this._colorToCss(tag.textColor),
-                        transform: transform_2,
-                    },
-                    textContent: tag.text,
-                };
-                vNodes.push(vd.h("span.TagSymbol", properties, []));
+            var plane = planes[key];
+            this._scene.add(plane);
+            this._planes[key] = plane;
+        }
+    };
+    MeshScene.prototype.addImagePlanesOld = function (planes) {
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
             }
-            var interact = this._interact(Component_1.TagOperation.Centroid, tag);
-            var background = this._colorToCss(tag.color);
-            var transform = "translate(-50%,-50%) translate(" + canvasX + "px," + canvasY + "px)";
-            if (tag.editable) {
-                var interactorProperties = {
-                    onmousedown: interact,
-                    style: {
-                        background: background,
-                        transform: transform,
-                    },
-                };
-                vNodes.push(vd.h("div.TagSpotInteractor", interactorProperties, []));
+            var plane = planes[key];
+            this._sceneOld.add(plane);
+            this._planesOld[key] = plane;
+        }
+    };
+    MeshScene.prototype.setImagePlanes = function (planes) {
+        this._clear();
+        this.addImagePlanes(planes);
+    };
+    MeshScene.prototype.addPeripheryPlanes = function (planes) {
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
             }
-            var pointProperties = {
-                style: {
-                    background: background,
-                    transform: transform,
-                },
-            };
-            vNodes.push(vd.h("div.TagVertex", pointProperties, []));
+            var plane = planes[key];
+            this._scenePeriphery.add(plane);
+            this._planesPeriphery[key] = plane;
         }
-        return vNodes;
     };
-    SpotRenderTag.prototype.getGLObjects = function () { return []; };
-    SpotRenderTag.prototype.getRetrievableObjects = function () { return []; };
-    SpotRenderTag.prototype._colorToCss = function (color) {
-        return "#" + ("000000" + color.toString(16)).substr(-6);
+    MeshScene.prototype.setPeripheryPlanes = function (planes) {
+        this._clearPeriphery();
+        this.addPeripheryPlanes(planes);
     };
-    SpotRenderTag.prototype._interact = function (operation, tag, vertexIndex) {
-        var _this = this;
-        return function (e) {
-            var offsetX = e.offsetX - e.target.offsetWidth / 2;
-            var offsetY = e.offsetY - e.target.offsetHeight / 2;
-            _this._interact$.next({
-                offsetX: offsetX,
-                offsetY: offsetY,
-                operation: operation,
-                tag: tag,
-                vertexIndex: vertexIndex,
-            });
-        };
+    MeshScene.prototype.setImagePlanesOld = function (planes) {
+        this._clearOld();
+        this.addImagePlanesOld(planes);
     };
-    return SpotRenderTag;
-}(Component_1.RenderTag));
-exports.SpotRenderTag = SpotRenderTag;
+    MeshScene.prototype.clear = function () {
+        this._clear();
+        this._clearOld();
+    };
+    MeshScene.prototype._clear = function () {
+        this._dispose(this._planes, this._scene);
+        this._planes = {};
+    };
+    MeshScene.prototype._clearOld = function () {
+        this._dispose(this._planesOld, this._sceneOld);
+        this._planesOld = {};
+    };
+    MeshScene.prototype._clearPeriphery = function () {
+        this._dispose(this._planesPeriphery, this._scenePeriphery);
+        this._planesPeriphery = {};
+    };
+    MeshScene.prototype._dispose = function (planes, scene) {
+        for (var key in planes) {
+            if (!planes.hasOwnProperty(key)) {
+                continue;
+            }
+            var plane = planes[key];
+            scene.remove(plane);
+            plane.geometry.dispose();
+            plane.material.dispose();
+            var texture = plane.material.uniforms.projectorTex.value;
+            if (texture != null) {
+                texture.dispose();
+            }
+        }
+    };
+    return MeshScene;
+}());
+exports.MeshScene = MeshScene;
+exports.default = MeshScene;
 
-},{"../../../Component":226,"../../../Viewer":236,"virtual-dom":182}],301:[function(require,module,exports){
+},{"three":242}],408:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.MouseOperator = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var MouseOperator = /** @class */ (function () {
+    function MouseOperator() {
+    }
+    MouseOperator.filteredPairwiseMouseDrag$ = function (name, mouseService) {
+        return mouseService
+            .filtered$(name, mouseService.mouseDragStart$).pipe(operators_1.switchMap(function (mouseDragStart) {
+            var mouseDragging$ = rxjs_1.concat(rxjs_1.of(mouseDragStart), mouseService
+                .filtered$(name, mouseService.mouseDrag$));
+            var mouseDragEnd$ = mouseService
+                .filtered$(name, mouseService.mouseDragEnd$).pipe(operators_1.map(function () {
+                return null;
+            }));
+            return rxjs_1.merge(mouseDragging$, mouseDragEnd$).pipe(operators_1.takeWhile(function (e) {
+                return !!e;
+            }), operators_1.startWith(null));
+        }), operators_1.pairwise(), operators_1.filter(function (pair) {
+            return pair[0] != null && pair[1] != null;
+        }));
+    };
+    return MouseOperator;
+}());
+exports.MouseOperator = MouseOperator;
+exports.default = MouseOperator;
+
+},{"rxjs":43,"rxjs/operators":241}],409:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -30161,179 +45462,91 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var Component_1 = require("../../../Component");
+exports.ZoomComponent = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var vd = require("virtual-dom");
+var Component_1 = require("../../Component");
+var Geo_1 = require("../../Geo");
+var State_1 = require("../../State");
+var ComponentSize_1 = require("../utils/ComponentSize");
 /**
- * @class SpotTag
+ * @class ZoomComponent
  *
- * @classdesc Tag holding properties for visualizing the centroid of a geometry.
+ * @classdesc Component rendering UI elements used for zooming.
  *
  * @example
  * ```
- * var geometry = new Mapillary.TagComponent.PointGeometry([0.3, 0.3]);
- * var tag = new Mapillary.TagComponent.SpotTag(
- *     "id-1",
- *     geometry
- *     { editable: true, color: 0xff0000 });
+ * var viewer = new Mapillary.Viewer(
+ *     "<element-id>",
+ *     "<client-id>",
+ *     "<my key>");
  *
- * tagComponent.add([tag]);
+ * var zoomComponent = viewer.getComponent("zoom");
+ * zoomComponent.configure({ size: Mapillary.ComponentSize.Small });
  * ```
  */
-var SpotTag = (function (_super) {
-    __extends(SpotTag, _super);
-    /**
-     * Create a spot tag.
-     *
-     * @override
-     * @constructor
-     * @param {string} id
-     * @param {Geometry} geometry
-     * @param {IOutlineTagOptions} options - Options defining the visual appearance and
-     * behavior of the spot tag.
-     */
-    function SpotTag(id, geometry, options) {
-        var _this = _super.call(this, id, geometry) || this;
-        options = !!options ? options : {};
-        _this._color = options.color == null ? 0xFFFFFF : options.color;
-        _this._editable = options.editable == null ? false : options.editable;
-        _this._icon = options.icon === undefined ? null : options.icon;
-        _this._text = options.text === undefined ? null : options.text;
-        _this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor;
+var ZoomComponent = /** @class */ (function (_super) {
+    __extends(ZoomComponent, _super);
+    function ZoomComponent(name, container, navigator) {
+        var _this = _super.call(this, name, container, navigator) || this;
+        _this._viewportCoords = new Geo_1.ViewportCoords();
+        _this._zoomDelta$ = new rxjs_1.Subject();
         return _this;
     }
-    Object.defineProperty(SpotTag.prototype, "color", {
-        /**
-         * Get color property.
-         * @returns {number} The color of the spot as a hexagonal number;
-         */
-        get: function () {
-            return this._color;
-        },
-        /**
-         * Set color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._color = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SpotTag.prototype, "editable", {
-        /**
-         * Get editable property.
-         * @returns {boolean} Value indicating if tag is editable.
-         */
-        get: function () {
-            return this._editable;
-        },
-        /**
-         * Set editable property.
-         * @param {boolean}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._editable = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SpotTag.prototype, "icon", {
-        /**
-         * Get icon property.
-         * @returns {string}
-         */
-        get: function () {
-            return this._icon;
-        },
-        /**
-         * Set icon property.
-         * @param {string}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._icon = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SpotTag.prototype, "text", {
-        /**
-         * Get text property.
-         * @returns {string}
-         */
-        get: function () {
-            return this._text;
-        },
-        /**
-         * Set text property.
-         * @param {string}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._text = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SpotTag.prototype, "textColor", {
-        /**
-         * Get text color property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._textColor;
-        },
-        /**
-         * Set text color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._textColor = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Set options for tag.
-     *
-     * @description Sets all the option properties provided and keps
-     * the rest of the values as is.
-     *
-     * @param {ISpotTagOptions} options - Spot tag options
-     *
-     * @fires {Tag#changed}
-     */
-    SpotTag.prototype.setOptions = function (options) {
-        this._color = options.color == null ? this._color : options.color;
-        this._editable = options.editable == null ? this._editable : options.editable;
-        this._icon = options.icon === undefined ? this._icon : options.icon;
-        this._text = options.text === undefined ? this._text : options.text;
-        this._textColor = options.textColor == null ? this._textColor : options.textColor;
-        this._notifyChanged$.next(this);
+    ZoomComponent.prototype._activate = function () {
+        var _this = this;
+        this._renderSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentState$, this._navigator.stateService.state$, this._configuration$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
+            var frame = _a[0], state = _a[1], configuration = _a[2], size = _a[3];
+            var zoom = frame.state.zoom;
+            var zoomInIcon = vd.h("div.ZoomInIcon", []);
+            var zoomInButton = zoom >= 3 || state === State_1.State.Waiting ?
+                vd.h("div.ZoomInButtonDisabled", [zoomInIcon]) :
+                vd.h("div.ZoomInButton", { onclick: function () { _this._zoomDelta$.next(1); } }, [zoomInIcon]);
+            var zoomOutIcon = vd.h("div.ZoomOutIcon", []);
+            var zoomOutButton = zoom <= 0 || state === State_1.State.Waiting ?
+                vd.h("div.ZoomOutButtonDisabled", [zoomOutIcon]) :
+                vd.h("div.ZoomOutButton", { onclick: function () { _this._zoomDelta$.next(-1); } }, [zoomOutIcon]);
+            var compact = configuration.size === ComponentSize_1.default.Small ||
+                configuration.size === ComponentSize_1.default.Automatic && size.width < 640 ?
+                ".ZoomCompact" : "";
+            return {
+                name: _this._name,
+                vnode: vd.h("div.ZoomContainer" + compact, { oncontextmenu: function (event) { event.preventDefault(); } }, [zoomInButton, zoomOutButton]),
+            };
+        }))
+            .subscribe(this._container.domRenderer.render$);
+        this._zoomSubscription = this._zoomDelta$.pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$))
+            .subscribe(function (_a) {
+            var zoomDelta = _a[0], render = _a[1], transform = _a[2];
+            var unprojected = _this._viewportCoords.unprojectFromViewport(0, 0, render.perspective);
+            var reference = transform.projectBasic(unprojected.toArray());
+            _this._navigator.stateService.zoomIn(zoomDelta, reference);
+        });
     };
-    return SpotTag;
-}(Component_1.Tag));
-exports.SpotTag = SpotTag;
-exports.default = SpotTag;
+    ZoomComponent.prototype._deactivate = function () {
+        this._renderSubscription.unsubscribe();
+        this._zoomSubscription.unsubscribe();
+    };
+    ZoomComponent.prototype._getDefaultConfiguration = function () {
+        return { size: ComponentSize_1.default.Automatic };
+    };
+    ZoomComponent.componentName = "zoom";
+    return ZoomComponent;
+}(Component_1.Component));
+exports.ZoomComponent = ZoomComponent;
+Component_1.ComponentService.register(ZoomComponent);
+exports.default = ZoomComponent;
 
-},{"../../../Component":226}],302:[function(require,module,exports){
+},{"../../Component":291,"../../Geo":294,"../../State":298,"../utils/ComponentSize":404,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],410:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -30341,116 +45554,36 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/share");
-var Utils_1 = require("../../../Utils");
+exports.AbortMapillaryError = void 0;
+var MapillaryError_1 = require("./MapillaryError");
 /**
- * @class Tag
- * @abstract
- * @classdesc Abstract class representing the basic functionality of for a tag.
+ * @class AbortMapillaryError
+ *
+ * @classdesc Error thrown when a move to request has been
+ * aborted before completing because of a subsequent request.
  */
-var Tag = (function (_super) {
-    __extends(Tag, _super);
-    /**
-     * Create a tag.
-     *
-     * @constructor
-     * @param {string} id
-     * @param {Geometry} geometry
-     */
-    function Tag(id, geometry) {
-        var _this = _super.call(this) || this;
-        _this._id = id;
-        _this._geometry = geometry;
-        _this._notifyChanged$ = new Subject_1.Subject();
-        _this._notifyChanged$
-            .subscribe(function (t) {
-            _this.fire(Tag.changed, _this);
-        });
-        _this._geometry.changed$
-            .subscribe(function (g) {
-            _this.fire(Tag.geometrychanged, _this);
-        });
+var AbortMapillaryError = /** @class */ (function (_super) {
+    __extends(AbortMapillaryError, _super);
+    function AbortMapillaryError(message) {
+        var _this = _super.call(this, message != null ? message : "The request was aborted.") || this;
+        Object.setPrototypeOf(_this, AbortMapillaryError.prototype);
+        _this.name = "AbortMapillaryError";
         return _this;
     }
-    Object.defineProperty(Tag.prototype, "id", {
-        /**
-         * Get id property.
-         * @returns {string}
-         */
-        get: function () {
-            return this._id;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Tag.prototype, "geometry", {
-        /**
-         * Get geometry property.
-         * @returns {Geometry} The geometry of the tag.
-         */
-        get: function () {
-            return this._geometry;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Tag.prototype, "changed$", {
-        /**
-         * Get changed observable.
-         * @returns {Observable<Tag>}
-         * @ignore
-         */
-        get: function () {
-            return this._notifyChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Tag.prototype, "geometryChanged$", {
-        /**
-         * Get geometry changed observable.
-         * @returns {Observable<Tag>}
-         * @ignore
-         */
-        get: function () {
-            var _this = this;
-            return this._geometry.changed$
-                .map(function (geometry) {
-                return _this;
-            })
-                .share();
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Event fired when a property related to the visual appearance of the
-     * tag has changed.
-     *
-     * @event Tag#changed
-     * @type {Tag} The tag instance that has changed.
-     */
-    Tag.changed = "changed";
-    /**
-     * Event fired when the geometry of the tag has changed.
-     *
-     * @event Tag#geometrychanged
-     * @type {Tag} The tag instance whose geometry has changed.
-     */
-    Tag.geometrychanged = "geometrychanged";
-    return Tag;
-}(Utils_1.EventEmitter));
-exports.Tag = Tag;
-exports.default = Tag;
+    return AbortMapillaryError;
+}(MapillaryError_1.MapillaryError));
+exports.AbortMapillaryError = AbortMapillaryError;
+exports.default = AbortMapillaryError;
 
-},{"../../../Utils":235,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/share":74}],303:[function(require,module,exports){
+},{"./MapillaryError":413}],411:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -30458,11 +45591,13 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.ArgumentMapillaryError = void 0;
 var MapillaryError_1 = require("./MapillaryError");
-var ArgumentMapillaryError = (function (_super) {
+var ArgumentMapillaryError = /** @class */ (function (_super) {
     __extends(ArgumentMapillaryError, _super);
     function ArgumentMapillaryError(message) {
         var _this = _super.call(this, message != null ? message : "The argument is not valid.") || this;
+        Object.setPrototypeOf(_this, ArgumentMapillaryError.prototype);
         _this.name = "ArgumentMapillaryError";
         return _this;
     }
@@ -30471,12 +45606,15 @@ var ArgumentMapillaryError = (function (_super) {
 exports.ArgumentMapillaryError = ArgumentMapillaryError;
 exports.default = ArgumentMapillaryError;
 
-},{"./MapillaryError":305}],304:[function(require,module,exports){
+},{"./MapillaryError":413}],412:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -30484,11 +45622,13 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.GraphMapillaryError = void 0;
 var MapillaryError_1 = require("./MapillaryError");
-var GraphMapillaryError = (function (_super) {
+var GraphMapillaryError = /** @class */ (function (_super) {
     __extends(GraphMapillaryError, _super);
     function GraphMapillaryError(message) {
         var _this = _super.call(this, message) || this;
+        Object.setPrototypeOf(_this, GraphMapillaryError.prototype);
         _this.name = "GraphMapillaryError";
         return _this;
     }
@@ -30497,12 +45637,15 @@ var GraphMapillaryError = (function (_super) {
 exports.GraphMapillaryError = GraphMapillaryError;
 exports.default = GraphMapillaryError;
 
-},{"./MapillaryError":305}],305:[function(require,module,exports){
+},{"./MapillaryError":413}],413:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -30510,10 +45653,12 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var MapillaryError = (function (_super) {
+exports.MapillaryError = void 0;
+var MapillaryError = /** @class */ (function (_super) {
     __extends(MapillaryError, _super);
     function MapillaryError(message) {
         var _this = _super.call(this, message) || this;
+        Object.setPrototypeOf(_this, MapillaryError.prototype);
         _this.name = "MapillaryError";
         return _this;
     }
@@ -30522,17 +45667,17 @@ var MapillaryError = (function (_super) {
 exports.MapillaryError = MapillaryError;
 exports.default = MapillaryError;
 
-},{}],306:[function(require,module,exports){
+},{}],414:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.Camera = void 0;
 var THREE = require("three");
 /**
  * @class Camera
  *
  * @classdesc Holds information about a camera.
  */
-var Camera = (function () {
+var Camera = /** @class */ (function () {
     /**
      * Create a new camera instance.
      * @param {Transform} [transform] - Optional transform instance.
@@ -30559,7 +45704,7 @@ var Camera = (function () {
         get: function () {
             return this._position;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Camera.prototype, "lookat", {
@@ -30570,7 +45715,7 @@ var Camera = (function () {
         get: function () {
             return this._lookat;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Camera.prototype, "up", {
@@ -30581,7 +45726,7 @@ var Camera = (function () {
         get: function () {
             return this._up;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Camera.prototype, "focal", {
@@ -30598,7 +45743,7 @@ var Camera = (function () {
         set: function (value) {
             this._focal = value;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     /**
@@ -30672,9 +45817,54 @@ var Camera = (function () {
 }());
 exports.Camera = Camera;
 
-},{"three":176}],307:[function(require,module,exports){
+},{"three":242}],415:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.computeProjectedPoints = exports.computeTranslation = void 0;
+var THREE = require("three");
+var Geo_1 = require("../Geo");
+var geoCoords = new Geo_1.GeoCoords();
+var spatial = new Geo_1.Spatial();
+function computeTranslation(position, rotation, reference) {
+    var C = geoCoords.geodeticToEnu(position.lat, position.lon, position.alt, reference.lat, reference.lon, reference.alt);
+    var RC = spatial.rotate(C, rotation);
+    var translation = [-RC.x, -RC.y, -RC.z];
+    return translation;
+}
+exports.computeTranslation = computeTranslation;
+function computeProjectedPoints(transform, basicVertices, basicDirections, pointsPerLine, viewportCoords) {
+    var basicPoints = [];
+    for (var side = 0; side < basicVertices.length; ++side) {
+        var v = basicVertices[side];
+        var d = basicDirections[side];
+        for (var i = 0; i <= pointsPerLine; ++i) {
+            basicPoints.push([v[0] + d[0] * i / pointsPerLine,
+                v[1] + d[1] * i / pointsPerLine]);
+        }
+    }
+    var camera = new THREE.Camera();
+    camera.up.copy(transform.upVector());
+    camera.position.copy(new THREE.Vector3().fromArray(transform.unprojectSfM([0, 0], 0)));
+    camera.lookAt(new THREE.Vector3().fromArray(transform.unprojectSfM([0, 0], 10)));
+    camera.updateMatrix();
+    camera.updateMatrixWorld(true);
+    var projectedPoints = basicPoints
+        .map(function (basicPoint) {
+        var worldPoint = transform.unprojectBasic(basicPoint, 10000);
+        var cameraPoint = viewportCoords.worldToCamera(worldPoint, camera);
+        return [
+            Math.abs(cameraPoint[0] / cameraPoint[2]),
+            Math.abs(cameraPoint[1] / cameraPoint[2]),
+        ];
+    });
+    return projectedPoints;
+}
+exports.computeProjectedPoints = computeProjectedPoints;
+
+},{"../Geo":294,"three":242}],416:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.GeoCoords = void 0;
 /**
  * @class GeoCoords
  *
@@ -30744,7 +45934,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
  * WGS84 to ENU and ENU to WGS84 are two step conversions with ECEF calculated in
  * the first step for both conversions.
  */
-var GeoCoords = (function () {
+var GeoCoords = /** @class */ (function () {
     function GeoCoords() {
         this._wgs84a = 6378137.0;
         this._wgs84b = 6356752.31424518;
@@ -30896,17 +46086,124 @@ var GeoCoords = (function () {
 exports.GeoCoords = GeoCoords;
 exports.default = GeoCoords;
 
-},{}],308:[function(require,module,exports){
+},{}],417:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.GeoRBush = void 0;
+var RBush = require("rbush");
+var GeoRBush = /** @class */ (function (_super) {
+    __extends(GeoRBush, _super);
+    function GeoRBush() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    GeoRBush.prototype.compareMinX = function (a, b) { return a.lat - b.lat; };
+    GeoRBush.prototype.compareMinY = function (a, b) { return a.lon - b.lon; };
+    GeoRBush.prototype.toBBox = function (item) {
+        return { minX: item.lat, minY: item.lon, maxX: item.lat, maxY: item.lon };
+    };
+    return GeoRBush;
+}(RBush));
+exports.GeoRBush = GeoRBush;
+exports.default = GeoRBush;
+
+},{"rbush":42}],418:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.segmentIntersection = exports.segmentsIntersect = void 0;
+function sign(n) {
+    return n > 0 ? 1 : n < 0 ? -1 : 0;
+}
+function colinearPointOnSegment(p, s) {
+    return p.x <= Math.max(s.p1.x, s.p2.x) &&
+        p.x >= Math.min(s.p1.x, s.p2.x) &&
+        p.y >= Math.max(s.p1.y, s.p2.y) &&
+        p.y >= Math.min(s.p1.y, s.p2.y);
+}
+function parallel(s1, s2) {
+    var ux = s1.p2.x - s1.p1.x;
+    var uy = s1.p2.y - s1.p1.y;
+    var vx = s2.p2.x - s2.p1.x;
+    var vy = s2.p2.y - s2.p1.y;
+    var cross = ux * vy - uy * vx;
+    var u2 = ux * ux + uy * uy;
+    var v2 = vx * vx + vy * vy;
+    var epsilon2 = 1e-10;
+    return cross * cross < epsilon2 * u2 * v2;
+}
+function tripletOrientation(p1, p2, p3) {
+    var orientation = (p2.y - p1.y) * (p3.x - p2.x) -
+        (p3.y - p2.y) * (p2.x - p1.x);
+    return sign(orientation);
+}
+function segmentsIntersect(s1, s2) {
+    if (parallel(s1, s2)) {
+        return false;
+    }
+    var o1 = tripletOrientation(s1.p1, s1.p2, s2.p1);
+    var o2 = tripletOrientation(s1.p1, s1.p2, s2.p2);
+    var o3 = tripletOrientation(s2.p1, s2.p2, s1.p1);
+    var o4 = tripletOrientation(s2.p1, s2.p2, s1.p2);
+    if (o1 !== o2 && o3 !== o4) {
+        return true;
+    }
+    if (o1 === 0 && colinearPointOnSegment(s2.p1, s1)) {
+        return true;
+    }
+    if (o2 === 0 && colinearPointOnSegment(s2.p2, s1)) {
+        return true;
+    }
+    if (o3 === 0 && colinearPointOnSegment(s1.p1, s2)) {
+        return true;
+    }
+    if (o4 === 0 && colinearPointOnSegment(s1.p2, s2)) {
+        return true;
+    }
+    return false;
+}
+exports.segmentsIntersect = segmentsIntersect;
+function segmentIntersection(s1, s2) {
+    if (parallel(s1, s2)) {
+        return undefined;
+    }
+    var x1 = s1.p1.x;
+    var x2 = s1.p2.x;
+    var y1 = s1.p1.y;
+    var y2 = s1.p2.y;
+    var x3 = s2.p1.x;
+    var x4 = s2.p2.x;
+    var y3 = s2.p1.y;
+    var y4 = s2.p2.y;
+    var den = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
+    var xNum = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4);
+    var yNum = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4);
+    return { x: xNum / den, y: yNum / den };
+}
+exports.segmentIntersection = segmentIntersection;
+
+},{}],419:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.Spatial = void 0;
 var THREE = require("three");
 /**
  * @class Spatial
  *
  * @classdesc Provides methods for scalar, vector and matrix calculations.
  */
-var Spatial = (function () {
+var Spatial = /** @class */ (function () {
     function Spatial() {
         this._epsilon = 1e-9;
     }
@@ -31079,8 +46376,9 @@ var Spatial = (function () {
         var R2 = this.rotationMatrix(rotation2);
         var R = R1T.multiply(R2);
         var elements = R.elements;
-        // from Tr(R) = 1 + 2*cos(theta)
-        var theta = Math.acos((elements[0] + elements[5] + elements[10] - 1) / 2);
+        // from Tr(R) = 1 + 2 * cos(theta)
+        var tr = elements[0] + elements[5] + elements[10];
+        var theta = Math.acos(Math.max(Math.min((tr - 1) / 2, 1), -1));
         return theta;
     };
     /**
@@ -31099,23 +46397,30 @@ var Spatial = (function () {
         var projection = v.dot(new THREE.Vector3().fromArray(planeNormal));
         return Math.asin(projection / norm);
     };
+    Spatial.prototype.azimuthal = function (direction, up) {
+        var directionVector = new THREE.Vector3().fromArray(direction);
+        var upVector = new THREE.Vector3().fromArray(up);
+        var upProjection = directionVector.clone().dot(upVector);
+        var planeProjection = directionVector.clone().sub(upVector.clone().multiplyScalar(upProjection));
+        return Math.atan2(planeProjection.y, planeProjection.x);
+    };
     /**
      * Calculates the distance between two coordinates
      * (latitude longitude pairs) in meters according to
      * the haversine formula.
      *
-     * @param {number} lat1 - Latitude of the first coordinate.
-     * @param {number} lon1 - Longitude of the first coordinate.
-     * @param {number} lat2 - Latitude of the second coordinate.
-     * @param {number} lon2 - Longitude of the second coordinate.
-     * @returns {number} Distance between lat lon positions.
+     * @param {number} lat1 - Latitude of the first coordinate in degrees.
+     * @param {number} lon1 - Longitude of the first coordinate in degrees.
+     * @param {number} lat2 - Latitude of the second coordinate in degrees.
+     * @param {number} lon2 - Longitude of the second coordinate in degrees.
+     * @returns {number} Distance between lat lon positions in meters.
      */
     Spatial.prototype.distanceFromLatLon = function (lat1, lon1, lat2, lon2) {
         var r = 6371000;
         var dLat = this.degToRad(lat2 - lat1);
         var dLon = this.degToRad(lon2 - lon1);
         var hav = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
-            Math.cos(lat1) * Math.cos(lat2) *
+            Math.cos(this.degToRad(lat1)) * Math.cos(this.degToRad(lat2)) *
                 Math.sin(dLon / 2) * Math.sin(dLon / 2);
         var d = 2 * r * Math.atan2(Math.sqrt(hav), Math.sqrt(1 - hav));
         return d;
@@ -31125,10 +46430,10 @@ var Spatial = (function () {
 exports.Spatial = Spatial;
 exports.default = Spatial;
 
-},{"three":176}],309:[function(require,module,exports){
+},{"three":242}],420:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.Transform = void 0;
 var THREE = require("three");
 /**
  * @class Transform
@@ -31136,31 +46441,68 @@ var THREE = require("three");
  * @classdesc Class used for calculating coordinate transformations
  * and projections.
  */
-var Transform = (function () {
+var Transform = /** @class */ (function () {
     /**
      * Create a new transform instance.
-     * @param {Node} apiNavImIm - Node properties.
-     * @param {HTMLImageElement} image - Node image.
-     * @param {Array<number>} translation - Node translation vector in three dimensions.
-     */
-    function Transform(node, image, translation) {
-        this._orientation = this._getValue(node.orientation, 1);
+     * @param {number} orientation - Image orientation.
+     * @param {number} width - Image height.
+     * @param {number} height - Image width.
+     * @param {number} focal - Focal length.
+     * @param {number} scale - Atomic scale.
+     * @param {IGPano} gpano - Panorama properties.
+     * @param {Array<number>} rotation - Rotation vector in three dimensions.
+     * @param {Array<number>} translation - Translation vector in three dimensions.
+     * @param {HTMLImageElement} image - Image for fallback size calculations.
+     */
+    function Transform(orientation, width, height, focal, scale, gpano, rotation, translation, image, textureScale, ck1, ck2, cameraProjection) {
+        this._orientation = this._getValue(orientation, 1);
         var imageWidth = image != null ? image.width : 4;
         var imageHeight = image != null ? image.height : 3;
         var keepOrientation = this._orientation < 5;
-        this._width = this._getValue(node.width, keepOrientation ? imageWidth : imageHeight);
-        this._height = this._getValue(node.height, keepOrientation ? imageHeight : imageWidth);
+        this._width = this._getValue(width, keepOrientation ? imageWidth : imageHeight);
+        this._height = this._getValue(height, keepOrientation ? imageHeight : imageWidth);
         this._basicAspect = keepOrientation ?
             this._width / this._height :
             this._height / this._width;
-        this._basicWidth = keepOrientation ? node.width : node.height;
-        this._basicHeight = keepOrientation ? node.height : node.width;
-        this._focal = this._getValue(node.focal, 1);
-        this._scale = this._getValue(node.scale, 0);
-        this._gpano = node.gpano != null ? node.gpano : null;
-        this._rt = this._getRt(node.rotation, translation);
+        this._basicWidth = keepOrientation ? width : height;
+        this._basicHeight = keepOrientation ? height : width;
+        this._focal = this._getValue(focal, 1);
+        this._scale = this._getValue(scale, 0);
+        this._gpano = gpano != null ? gpano : null;
+        this._rt = this._getRt(rotation, translation);
         this._srt = this._getSrt(this._rt, this._scale);
+        this._basicRt = this._getBasicRt(this._rt, orientation);
+        this._textureScale = !!textureScale ? textureScale : [1, 1];
+        this._ck1 = !!ck1 ? ck1 : 0;
+        this._ck2 = !!ck2 ? ck2 : 0;
+        this._cameraProjection = !!cameraProjection ?
+            cameraProjection :
+            !!gpano ?
+                "equirectangular" :
+                "perspective";
+        this._radialPeak = this._getRadialPeak(this._ck1, this._ck2);
     }
+    Object.defineProperty(Transform.prototype, "ck1", {
+        get: function () {
+            return this._ck1;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Transform.prototype, "ck2", {
+        get: function () {
+            return this._ck2;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Transform.prototype, "cameraProjection", {
+        get: function () {
+            return this._cameraProjection;
+        },
+        enumerable: false,
+        configurable: true
+    });
     Object.defineProperty(Transform.prototype, "basicAspect", {
         /**
          * Get basic aspect.
@@ -31169,7 +46511,7 @@ var Transform = (function () {
         get: function () {
             return this._basicAspect;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "basicHeight", {
@@ -31185,7 +46527,14 @@ var Transform = (function () {
         get: function () {
             return this._basicHeight;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Transform.prototype, "basicRt", {
+        get: function () {
+            return this._basicRt;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "basicWidth", {
@@ -31201,7 +46550,7 @@ var Transform = (function () {
         get: function () {
             return this._basicWidth;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "focal", {
@@ -31212,7 +46561,7 @@ var Transform = (function () {
         get: function () {
             return this._focal;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "fullPano", {
@@ -31229,7 +46578,7 @@ var Transform = (function () {
                 this._gpano.CroppedAreaImageWidthPixels === this._gpano.FullPanoWidthPixels &&
                 this._gpano.CroppedAreaImageHeightPixels === this._gpano.FullPanoHeightPixels;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "gpano", {
@@ -31240,7 +46589,7 @@ var Transform = (function () {
         get: function () {
             return this._gpano;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "height", {
@@ -31255,7 +46604,7 @@ var Transform = (function () {
         get: function () {
             return this._height;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "orientation", {
@@ -31266,7 +46615,7 @@ var Transform = (function () {
         get: function () {
             return this._orientation;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "rt", {
@@ -31277,7 +46626,7 @@ var Transform = (function () {
         get: function () {
             return this._rt;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "srt", {
@@ -31288,7 +46637,7 @@ var Transform = (function () {
         get: function () {
             return this._srt;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "scale", {
@@ -31299,7 +46648,7 @@ var Transform = (function () {
         get: function () {
             return this._scale;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "hasValidScale", {
@@ -31310,7 +46659,19 @@ var Transform = (function () {
         get: function () {
             return this._scale > 1e-2 && this._scale < 50;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Transform.prototype, "radialPeak", {
+        /**
+         * Get radial peak.
+         * @returns {number} Value indicating the radius where the radial
+         * undistortion function peaks.
+         */
+        get: function () {
+            return this._radialPeak;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Transform.prototype, "width", {
@@ -31325,7 +46686,7 @@ var Transform = (function () {
         get: function () {
             return this._width;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     /**
@@ -31377,12 +46738,15 @@ var Transform = (function () {
      * Unproject basic coordinates to 3D world coordinates.
      *
      * @param {Array<number>} basic - 2D basic coordinates.
-     * @param {Array<number>} distance - Depth to unproject from camera center.
+     * @param {Array<number>} distance - Distance to unproject from camera center.
+     * @param {boolean} [depth] - Treat the distance value as depth from camera center.
+     *                            Only applicable for perspective images. Will be
+     *                            ignored for panoramas.
      * @returns {Array<number>} Unprojected 3D world coordinates.
      */
-    Transform.prototype.unprojectBasic = function (basic, distance) {
+    Transform.prototype.unprojectBasic = function (basic, distance, depth) {
         var sfm = this._basicToSfm(basic);
-        return this.unprojectSfM(sfm, distance);
+        return this.unprojectSfM(sfm, distance, depth);
     };
     /**
      * Project 3D world coordinates to SfM coordinates.
@@ -31399,12 +46763,17 @@ var Transform = (function () {
      * Unproject SfM coordinates to a 3D world coordinates.
      *
      * @param {Array<number>} sfm - 2D SfM coordinates.
-     * @param {Array<number>} distance - Depth to unproject from camera center.
+     * @param {Array<number>} distance - Distance to unproject from camera center.
+     * @param {boolean} [depth] - Treat the distance value as depth from camera center.
+     *                            Only applicable for perspective images. Will be
+     *                            ignored for panoramas.
      * @returns {Array<number>} Unprojected 3D world coordinates.
      */
-    Transform.prototype.unprojectSfM = function (sfm, distance) {
+    Transform.prototype.unprojectSfM = function (sfm, distance, depth) {
         var bearing = this._sfmToBearing(sfm);
-        var v = new THREE.Vector4(distance * bearing[0], distance * bearing[1], distance * bearing[2], 1);
+        var v = depth && !this.gpano ?
+            new THREE.Vector4(distance * bearing[0] / bearing[2], distance * bearing[1] / bearing[2], distance, 1) :
+            new THREE.Vector4(distance * bearing[0], distance * bearing[1], distance * bearing[2], 1);
         v.applyMatrix4(new THREE.Matrix4().getInverse(this._rt));
         return [v.x / v.w, v.y / v.w, v.z / v.w];
     };
@@ -31438,12 +46807,45 @@ var Transform = (function () {
             var z = Math.cos(lat) * Math.cos(lon);
             return [x, y, z];
         }
+        else if (this._cameraProjection === "fisheye") {
+            var _a = [sfm[0] / this._focal, sfm[1] / this._focal], dxn = _a[0], dyn = _a[1];
+            var dTheta = Math.sqrt(dxn * dxn + dyn * dyn);
+            var d = this._distortionFromDistortedRadius(dTheta, this._ck1, this._ck2, this._radialPeak);
+            var theta = dTheta / d;
+            var z = Math.cos(theta);
+            var r = Math.sin(theta);
+            var x = r * dxn / dTheta;
+            var y = r * dyn / dTheta;
+            return [x, y, z];
+        }
         else {
-            var v = new THREE.Vector3(sfm[0], sfm[1], this._focal);
+            var _b = [sfm[0] / this._focal, sfm[1] / this._focal], dxn = _b[0], dyn = _b[1];
+            var dr = Math.sqrt(dxn * dxn + dyn * dyn);
+            var d = this._distortionFromDistortedRadius(dr, this._ck1, this._ck2, this._radialPeak);
+            var xn = dxn / d;
+            var yn = dyn / d;
+            var v = new THREE.Vector3(xn, yn, 1);
             v.normalize();
             return [v.x, v.y, v.z];
         }
     };
+    /** Compute distortion given the distorted radius.
+     *
+     *  Solves for d in the equation
+     *    y = d(x, k1, k2) * x
+     * given the distorted radius, y.
+     */
+    Transform.prototype._distortionFromDistortedRadius = function (distortedRadius, k1, k2, radialPeak) {
+        var d = 1.0;
+        for (var i = 0; i < 10; i++) {
+            var radius = distortedRadius / d;
+            if (radius > radialPeak) {
+                radius = radialPeak;
+            }
+            d = 1 + k1 * Math.pow(radius, 2) + k2 * Math.pow(radius, 4);
+        }
+        return d;
+    };
     /**
      * Transform bearing vector (3D cartesian coordiantes on the unit sphere) to
      * SfM coordinates.
@@ -31477,11 +46879,37 @@ var Transform = (function () {
                 (fullPanoPixel[1] - this.gpano.CroppedAreaTopPixels - this.gpano.CroppedAreaImageHeightPixels / 2) / size,
             ];
         }
+        else if (this._cameraProjection === "fisheye") {
+            if (bearing[2] > 0) {
+                var x = bearing[0], y = bearing[1], z = bearing[2];
+                var r = Math.sqrt(x * x + y * y);
+                var theta = Math.atan2(r, z);
+                if (theta > this._radialPeak) {
+                    theta = this._radialPeak;
+                }
+                var distortion = 1.0 + Math.pow(theta, 2) * (this._ck1 + Math.pow(theta, 2) * this._ck2);
+                var s = this._focal * distortion * theta / r;
+                return [s * x, s * y];
+            }
+            else {
+                return [
+                    bearing[0] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
+                    bearing[1] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
+                ];
+            }
+        }
         else {
             if (bearing[2] > 0) {
+                var _a = [bearing[0] / bearing[2], bearing[1] / bearing[2]], xn = _a[0], yn = _a[1];
+                var r2 = xn * xn + yn * yn;
+                var rp2 = Math.pow(this._radialPeak, 2);
+                if (r2 > rp2) {
+                    r2 = rp2;
+                }
+                var d = 1 + this._ck1 * r2 + this._ck2 * Math.pow(r2, 2);
                 return [
-                    bearing[0] * this._focal / bearing[2],
-                    bearing[1] * this._focal / bearing[2],
+                    this._focal * d * xn,
+                    this._focal * d * yn,
                 ];
             }
             else {
@@ -31626,6 +47054,44 @@ var Transform = (function () {
         srt.scale(new THREE.Vector3(scale, scale, scale));
         return srt;
     };
+    Transform.prototype._getBasicRt = function (rt, orientation) {
+        var axis = new THREE.Vector3(0, 0, 1);
+        var angle = 0;
+        switch (orientation) {
+            case 3:
+                angle = Math.PI;
+                break;
+            case 6:
+                angle = Math.PI / 2;
+                break;
+            case 8:
+                angle = 3 * Math.PI / 2;
+                break;
+            default:
+                break;
+        }
+        return new THREE.Matrix4()
+            .makeRotationAxis(axis, angle)
+            .multiply(rt);
+    };
+    Transform.prototype._getRadialPeak = function (k1, k2) {
+        var a = 5 * k2;
+        var b = 3 * k1;
+        var c = 1;
+        var d = Math.pow(b, 2) - 4 * a * c;
+        if (d < 0) {
+            return undefined;
+        }
+        var root1 = (-b - Math.sqrt(d)) / 2 / a;
+        var root2 = (-b + Math.sqrt(d)) / 2 / a;
+        var minRoot = Math.min(root1, root2);
+        var maxRoot = Math.max(root1, root2);
+        return minRoot > 0 ?
+            Math.sqrt(minRoot) :
+            maxRoot > 0 ?
+                Math.sqrt(maxRoot) :
+                undefined;
+    };
     /**
      * Calculate a transformation matrix from normalized coordinates for
      * texture map coordinates.
@@ -31635,8 +47101,10 @@ var Transform = (function () {
      */
     Transform.prototype._normalizedToTextureMatrix = function () {
         var size = Math.max(this._width, this._height);
-        var w = size / this._width;
-        var h = size / this._height;
+        var scaleX = this._orientation < 5 ? this._textureScale[0] : this._textureScale[1];
+        var scaleY = this._orientation < 5 ? this._textureScale[1] : this._textureScale[0];
+        var w = size / this._width * scaleX;
+        var h = size / this._height * scaleY;
         switch (this._orientation) {
             case 1:
                 return new THREE.Matrix4().set(w, 0, 0, 0.5, 0, -h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
@@ -31654,10 +47122,10 @@ var Transform = (function () {
 }());
 exports.Transform = Transform;
 
-},{"three":176}],310:[function(require,module,exports){
+},{"three":242}],421:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.ViewportCoords = void 0;
 var THREE = require("three");
 /**
  * @class ViewportCoords
@@ -31668,7 +47136,7 @@ var THREE = require("three");
  * Basic coordinates are 2D coordinates on the [0, 1] interval and
  * have the origin point, (0, 0), at the top left corner and the
  * maximum value, (1, 1), at the bottom right corner of the original
- * photo.
+ * image.
  *
  * Viewport coordinates are 2D coordinates on the [-1, 1] interval and
  * have the origin point in the center. The bottom left corner point is
@@ -31681,7 +47149,7 @@ var THREE = require("three");
  *
  * 3D coordinates are in the topocentric world reference frame.
  */
-var ViewportCoords = (function () {
+var ViewportCoords = /** @class */ (function () {
     function ViewportCoords() {
         this._unprojectDepth = 200;
     }
@@ -31719,13 +47187,11 @@ var ViewportCoords = (function () {
      * in front of the camera, otherwise null.
      */
     ViewportCoords.prototype.basicToCanvasSafe = function (basicX, basicY, container, transform, camera) {
-        var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);
-        var pointCamera = this.worldToCamera(point3d, camera);
-        if (pointCamera[2] > 0) {
+        var viewport = this.basicToViewportSafe(basicX, basicY, transform, camera);
+        if (viewport === null) {
             return null;
         }
-        var _a = this.cameraToViewport(pointCamera, camera), viewportX = _a[0], viewportY = _a[1];
-        var canvas = this.viewportToCanvas(viewportX, viewportY, container);
+        var canvas = this.viewportToCanvas(viewport[0], viewport[1], container);
         return canvas;
     };
     /**
@@ -31745,6 +47211,28 @@ var ViewportCoords = (function () {
         var viewport = this.projectToViewport(point3d, camera);
         return viewport;
     };
+    /**
+     * Convert basic coordinates to viewport coordinates safely. If 3D point is
+     * behind camera null will be returned.
+     *
+     * @description Transform origin and camera position needs to be the
+     * equal for reliable return value.
+     *
+     * @param {number} basicX - Basic X coordinate.
+     * @param {number} basicY - Basic Y coordinate.
+     * @param {Transform} transform - Transform of the node to unproject from.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} 2D viewport coordinates.
+     */
+    ViewportCoords.prototype.basicToViewportSafe = function (basicX, basicY, transform, camera) {
+        var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);
+        var pointCamera = this.worldToCamera(point3d, camera);
+        if (pointCamera[2] > 0) {
+            return null;
+        }
+        var viewport = this.projectToViewport(point3d, camera);
+        return viewport;
+    };
     /**
      * Convert camera 3D coordinates to viewport coordinates.
      *
@@ -31939,6 +47427,24 @@ var ViewportCoords = (function () {
         var canvas = this.viewportToCanvas(viewport[0], viewport[1], container);
         return canvas;
     };
+    /**
+     * Project 3D world coordinates to canvas coordinates safely. If 3D
+     * point is behind camera null will be returned.
+     *
+     * @param {Array<number>} point3D - 3D world coordinates.
+     * @param {HTMLElement} container - The viewer container.
+     * @param {THREE.Camera} camera - Camera used in rendering.
+     * @returns {Array<number>} 2D canvas coordinates.
+     */
+    ViewportCoords.prototype.projectToCanvasSafe = function (point3d, container, camera) {
+        var pointCamera = this.worldToCamera(point3d, camera);
+        if (pointCamera[2] > 0) {
+            return null;
+        }
+        var viewport = this.projectToViewport(point3d, camera);
+        var canvas = this.viewportToCanvas(viewport[0], viewport[1], container);
+        return canvas;
+    };
     /**
      * Project 3D world coordinates to viewport coordinates.
      *
@@ -32028,16 +47534,22 @@ var ViewportCoords = (function () {
 exports.ViewportCoords = ViewportCoords;
 exports.default = ViewportCoords;
 
-},{"three":176}],311:[function(require,module,exports){
+
+},{"three":242}],422:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}],423:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.FilterCreator = void 0;
 /**
  * @class Filter
  *
  * @classdesc Represents a class for creating node filters. Implementation and
  * definitions based on https://github.com/mapbox/feature-filter.
  */
-var FilterCreator = (function () {
+var FilterCreator = /** @class */ (function () {
     function FilterCreator() {
     }
     /**
@@ -32116,27 +47628,22 @@ var FilterCreator = (function () {
 exports.FilterCreator = FilterCreator;
 exports.default = FilterCreator;
 
-},{}],312:[function(require,module,exports){
+},{}],424:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
-var rbush = require("rbush");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/from");
-require("rxjs/add/operator/catch");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/finally");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/publish");
+exports.Graph = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var Edge_1 = require("../Edge");
 var Error_1 = require("../Error");
 var Graph_1 = require("../Graph");
+var Geo_1 = require("../Geo");
 /**
  * @class Graph
  *
  * @classdesc Represents a graph of nodes with edges.
  */
-var Graph = (function () {
+var Graph = /** @class */ (function () {
     /**
      * Create a new graph instance.
      *
@@ -32151,14 +47658,16 @@ var Graph = (function () {
         this._apiV3 = apiV3;
         this._cachedNodes = {};
         this._cachedNodeTiles = {};
+        this._cachedSequenceNodes = {};
         this._cachedSpatialEdges = {};
         this._cachedTiles = {};
         this._cachingFill$ = {};
         this._cachingFull$ = {};
+        this._cachingSequenceNodes$ = {};
         this._cachingSequences$ = {};
         this._cachingSpatialArea$ = {};
         this._cachingTiles$ = {};
-        this._changed$ = new Subject_1.Subject();
+        this._changed$ = new rxjs_1.Subject();
         this._defaultAlt = 2;
         this._edgeCalculator = edgeCalculator != null ? edgeCalculator : new Edge_1.EdgeCalculator();
         this._filterCreator = filterCreator != null ? filterCreator : new Graph_1.FilterCreator();
@@ -32169,10 +47678,11 @@ var Graph = (function () {
             {
                 maxSequences: 50,
                 maxUnusedNodes: 100,
+                maxUnusedPreStoredNodes: 30,
                 maxUnusedTiles: 20,
             };
         this._nodes = {};
-        this._nodeIndex = nodeIndex != null ? nodeIndex : rbush(16, [".lat", ".lon", ".lat", ".lon"]);
+        this._nodeIndex = nodeIndex != null ? nodeIndex : new Geo_1.GeoRBush(16);
         this._nodeIndexTiles = {};
         this._nodeToTile = {};
         this._preStored = {};
@@ -32192,9 +47702,86 @@ var Graph = (function () {
         get: function () {
             return this._changed$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
+    /**
+     * Caches the full node data for all images within a bounding
+     * box.
+     *
+     * @description The node assets are not cached.
+     *
+     * @param {ILatLon} sw - South west corner of bounding box.
+     * @param {ILatLon} ne - North east corner of bounding box.
+     * @returns {Observable<Graph>} Observable emitting the full
+     * nodes in the bounding box.
+     */
+    Graph.prototype.cacheBoundingBox$ = function (sw, ne) {
+        var _this = this;
+        var cacheTiles$ = this._graphCalculator.encodeHsFromBoundingBox(sw, ne)
+            .filter(function (h) {
+            return !(h in _this._cachedTiles);
+        })
+            .map(function (h) {
+            return h in _this._cachingTiles$ ?
+                _this._cachingTiles$[h] :
+                _this._cacheTile$(h);
+        });
+        if (cacheTiles$.length === 0) {
+            cacheTiles$.push(rxjs_1.of(this));
+        }
+        return rxjs_1.from(cacheTiles$).pipe(operators_1.mergeAll(), operators_1.last(), operators_1.mergeMap(function (graph) {
+            var nodes = _this._nodeIndex
+                .search({
+                maxX: ne.lat,
+                maxY: ne.lon,
+                minX: sw.lat,
+                minY: sw.lon,
+            })
+                .map(function (item) {
+                return item.node;
+            });
+            var fullNodes = [];
+            var coreNodes = [];
+            for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
+                var node = nodes_1[_i];
+                if (node.full) {
+                    fullNodes.push(node);
+                }
+                else {
+                    coreNodes.push(node.key);
+                }
+            }
+            var coreNodeBatches = [];
+            var batchSize = 200;
+            while (coreNodes.length > 0) {
+                coreNodeBatches.push(coreNodes.splice(0, batchSize));
+            }
+            var fullNodes$ = rxjs_1.of(fullNodes);
+            var fillNodes$ = coreNodeBatches
+                .map(function (batch) {
+                return _this._apiV3.imageByKeyFill$(batch).pipe(operators_1.map(function (imageByKeyFill) {
+                    var filledNodes = [];
+                    for (var fillKey in imageByKeyFill) {
+                        if (!imageByKeyFill.hasOwnProperty(fillKey)) {
+                            continue;
+                        }
+                        if (_this.hasNode(fillKey)) {
+                            var node = _this.getNode(fillKey);
+                            if (!node.full) {
+                                _this._makeFull(node, imageByKeyFill[fillKey]);
+                            }
+                            filledNodes.push(node);
+                        }
+                    }
+                    return filledNodes;
+                }));
+            });
+            return rxjs_1.merge(fullNodes$, rxjs_1.from(fillNodes$).pipe(operators_1.mergeAll()));
+        }), operators_1.reduce(function (acc, value) {
+            return acc.concat(value);
+        }));
+    };
     /**
      * Retrieve and cache node fill properties.
      *
@@ -32219,24 +47806,19 @@ var Graph = (function () {
         if (node.full) {
             throw new Error_1.GraphMapillaryError("Cannot fill node that is already full (" + key + ").");
         }
-        this._cachingFill$[key] = this._apiV3.imageByKeyFill$([key])
-            .do(function (imageByKeyFill) {
+        this._cachingFill$[key] = this._apiV3.imageByKeyFill$([key]).pipe(operators_1.tap(function (imageByKeyFill) {
             if (!node.full) {
                 _this._makeFull(node, imageByKeyFill[key]);
             }
             delete _this._cachingFill$[key];
-        })
-            .map(function (imageByKeyFill) {
+        }), operators_1.map(function (imageByKeyFill) {
             return _this;
-        })
-            .finally(function () {
+        }), operators_1.finalize(function () {
             if (key in _this._cachingFill$) {
                 delete _this._cachingFill$[key];
             }
             _this._changed$.next(_this);
-        })
-            .publish()
-            .refCount();
+        }), operators_1.publish(), operators_1.refCount());
         return this._cachingFill$[key];
     };
     /**
@@ -32256,8 +47838,7 @@ var Graph = (function () {
         if (this.hasNode(key)) {
             throw new Error_1.GraphMapillaryError("Cannot cache full node that already exist in graph (" + key + ").");
         }
-        this._cachingFull$[key] = this._apiV3.imageByKeyFull$([key])
-            .do(function (imageByKeyFull) {
+        this._cachingFull$[key] = this._apiV3.imageByKeyFull$([key]).pipe(operators_1.tap(function (imageByKeyFull) {
             var fn = imageByKeyFull[key];
             if (_this.hasNode(key)) {
                 var node = _this.getNode(key);
@@ -32266,8 +47847,8 @@ var Graph = (function () {
                 }
             }
             else {
-                if (fn.sequence == null || fn.sequence.key == null) {
-                    throw new Error_1.GraphMapillaryError("Node has no sequence (" + key + ").");
+                if (fn.sequence_key == null) {
+                    throw new Error_1.GraphMapillaryError("Node has no sequence key (" + key + ").");
                 }
                 var node = new Graph_1.Node(fn);
                 _this._makeFull(node, fn);
@@ -32276,18 +47857,14 @@ var Graph = (function () {
                 _this._setNode(node);
                 delete _this._cachingFull$[key];
             }
-        })
-            .map(function (imageByKeyFull) {
+        }), operators_1.map(function (imageByKeyFull) {
             return _this;
-        })
-            .finally(function () {
+        }), operators_1.finalize(function () {
             if (key in _this._cachingFull$) {
                 delete _this._cachingFull$[key];
             }
             _this._changed$.next(_this);
-        })
-            .publish()
-            .refCount();
+        }), operators_1.publish(), operators_1.refCount());
         return this._cachingFull$[key];
     };
     /**
@@ -32340,6 +47917,77 @@ var Graph = (function () {
         var edges = this._edgeCalculator.computeSequenceEdges(node, sequence);
         node.cacheSequenceEdges(edges);
     };
+    /**
+     * Retrieve and cache full nodes for all keys in a sequence.
+     *
+     * @param {string} sequenceKey - Key of sequence.
+     * @param {string} referenceNodeKey - Key of node to use as reference
+     * for optimized caching.
+     * @returns {Observable<Graph>} Observable emitting the graph
+     * when the nodes of the sequence has been cached.
+     */
+    Graph.prototype.cacheSequenceNodes$ = function (sequenceKey, referenceNodeKey) {
+        var _this = this;
+        if (!this.hasSequence(sequenceKey)) {
+            throw new Error_1.GraphMapillaryError("Cannot cache sequence nodes of sequence that does not exist in graph (" + sequenceKey + ").");
+        }
+        if (this.hasSequenceNodes(sequenceKey)) {
+            throw new Error_1.GraphMapillaryError("Sequence nodes already cached (" + sequenceKey + ").");
+        }
+        var sequence = this.getSequence(sequenceKey);
+        if (sequence.key in this._cachingSequenceNodes$) {
+            return this._cachingSequenceNodes$[sequence.key];
+        }
+        var batches = [];
+        var keys = sequence.keys.slice();
+        var referenceBatchSize = 50;
+        if (!!referenceNodeKey && keys.length > referenceBatchSize) {
+            var referenceIndex = keys.indexOf(referenceNodeKey);
+            var startIndex = Math.max(0, Math.min(referenceIndex - referenceBatchSize / 2, keys.length - referenceBatchSize));
+            batches.push(keys.splice(startIndex, referenceBatchSize));
+        }
+        var batchSize = 200;
+        while (keys.length > 0) {
+            batches.push(keys.splice(0, batchSize));
+        }
+        var batchesToCache = batches.length;
+        var sequenceNodes$ = rxjs_1.from(batches).pipe(operators_1.mergeMap(function (batch) {
+            return _this._apiV3.imageByKeyFull$(batch).pipe(operators_1.tap(function (imageByKeyFull) {
+                for (var fullKey in imageByKeyFull) {
+                    if (!imageByKeyFull.hasOwnProperty(fullKey)) {
+                        continue;
+                    }
+                    var fn = imageByKeyFull[fullKey];
+                    if (_this.hasNode(fullKey)) {
+                        var node = _this.getNode(fn.key);
+                        if (!node.full) {
+                            _this._makeFull(node, fn);
+                        }
+                    }
+                    else {
+                        if (fn.sequence_key == null) {
+                            console.warn("Sequence missing, discarding node (" + fn.key + ")");
+                        }
+                        var node = new Graph_1.Node(fn);
+                        _this._makeFull(node, fn);
+                        var h = _this._graphCalculator.encodeH(node.originalLatLon, _this._tilePrecision);
+                        _this._preStore(h, node);
+                        _this._setNode(node);
+                    }
+                }
+                batchesToCache--;
+            }), operators_1.map(function (imageByKeyFull) {
+                return _this;
+            }));
+        }, 6), operators_1.last(), operators_1.finalize(function () {
+            delete _this._cachingSequenceNodes$[sequence.key];
+            if (batchesToCache === 0) {
+                _this._cachedSequenceNodes[sequence.key] = true;
+            }
+        }), operators_1.publish(), operators_1.refCount());
+        this._cachingSequenceNodes$[sequence.key] = sequenceNodes$;
+        return sequenceNodes$;
+    };
     /**
      * Retrieve and cache full nodes for a node spatial area.
      *
@@ -32374,8 +48022,7 @@ var Graph = (function () {
         var batchesToCache = batches.length;
         var spatialNodes$ = [];
         var _loop_1 = function (batch) {
-            var spatialNodeBatch$ = this_1._apiV3.imageByKeyFill$(batch)
-                .do(function (imageByKeyFill) {
+            var spatialNodeBatch$ = this_1._apiV3.imageByKeyFill$(batch).pipe(operators_1.tap(function (imageByKeyFill) {
                 for (var fillKey in imageByKeyFill) {
                     if (!imageByKeyFill.hasOwnProperty(fillKey)) {
                         continue;
@@ -32392,11 +48039,9 @@ var Graph = (function () {
                 if (--batchesToCache === 0) {
                     delete _this._cachingSpatialArea$[key];
                 }
-            })
-                .map(function (imageByKeyFill) {
+            }), operators_1.map(function (imageByKeyFill) {
                 return _this;
-            })
-                .catch(function (error) {
+            }), operators_1.catchError(function (error) {
                 for (var _i = 0, batch_1 = batch; _i < batch_1.length; _i++) {
                     var batchKey = batch_1[_i];
                     if (batchKey in spatialArea.all) {
@@ -32410,14 +48055,11 @@ var Graph = (function () {
                     delete _this._cachingSpatialArea$[key];
                 }
                 throw error;
-            })
-                .finally(function () {
+            }), operators_1.finalize(function () {
                 if (Object.keys(spatialArea.cacheNodes).length === 0) {
                     _this._changed$.next(_this);
                 }
-            })
-                .publish()
-                .refCount();
+            }), operators_1.publish(), operators_1.refCount());
             spatialNodes$.push(spatialNodeBatch$);
         };
         var this_1 = this;
@@ -32477,8 +48119,8 @@ var Graph = (function () {
      * Retrieve and cache geohash tiles for a node.
      *
      * @param {string} key - Key of node for which to retrieve tiles.
-     * @returns {Observable<Graph>} Observable emitting the graph
-     * when the tiles required for the node has been cached.
+     * @returns {Array<Observable<Graph>>} Array of observables emitting
+     * the graph for each tile required for the node has been cached.
      * @throws {GraphMapillaryError} When the operation is not valid on the
      * current graph.
      */
@@ -32506,75 +48148,10 @@ var Graph = (function () {
         nodeTiles.cache = [];
         var cacheTiles$ = [];
         var _loop_2 = function (h) {
-            var cacheTile$ = null;
-            if (h in this_2._cachingTiles$) {
-                cacheTile$ = this_2._cachingTiles$[h];
-            }
-            else {
-                cacheTile$ = this_2._apiV3.imagesByH$([h])
-                    .do(function (imagesByH) {
-                    var coreNodes = imagesByH[h];
-                    if (h in _this._cachedTiles) {
-                        return;
-                    }
-                    _this._nodeIndexTiles[h] = [];
-                    _this._cachedTiles[h] = { accessed: new Date().getTime(), nodes: [] };
-                    var hCache = _this._cachedTiles[h].nodes;
-                    var preStored = _this._removeFromPreStore(h);
-                    for (var index in coreNodes) {
-                        if (!coreNodes.hasOwnProperty(index)) {
-                            continue;
-                        }
-                        var coreNode = coreNodes[index];
-                        if (coreNode == null) {
-                            break;
-                        }
-                        if (coreNode.sequence == null ||
-                            coreNode.sequence.key == null) {
-                            console.warn("Sequence missing, discarding (" + coreNode.key + ")");
-                            continue;
-                        }
-                        if (preStored != null && coreNode.key in preStored) {
-                            var node_1 = preStored[coreNode.key];
-                            delete preStored[coreNode.key];
-                            hCache.push(node_1);
-                            var nodeIndexItem_1 = {
-                                lat: node_1.latLon.lat,
-                                lon: node_1.latLon.lon,
-                                node: node_1,
-                            };
-                            _this._nodeIndex.insert(nodeIndexItem_1);
-                            _this._nodeIndexTiles[h].push(nodeIndexItem_1);
-                            _this._nodeToTile[node_1.key] = h;
-                            continue;
-                        }
-                        var node = new Graph_1.Node(coreNode);
-                        hCache.push(node);
-                        var nodeIndexItem = {
-                            lat: node.latLon.lat,
-                            lon: node.latLon.lon,
-                            node: node,
-                        };
-                        _this._nodeIndex.insert(nodeIndexItem);
-                        _this._nodeIndexTiles[h].push(nodeIndexItem);
-                        _this._nodeToTile[node.key] = h;
-                        _this._setNode(node);
-                    }
-                    delete _this._cachingTiles$[h];
-                })
-                    .map(function (imagesByH) {
-                    return _this;
-                })
-                    .catch(function (error) {
-                    delete _this._cachingTiles$[h];
-                    throw error;
-                })
-                    .publish()
-                    .refCount();
-                this_2._cachingTiles$[h] = cacheTile$;
-            }
-            cacheTiles$.push(cacheTile$
-                .do(function (graph) {
+            var cacheTile$ = h in this_2._cachingTiles$ ?
+                this_2._cachingTiles$[h] :
+                this_2._cacheTile$(h);
+            cacheTiles$.push(cacheTile$.pipe(operators_1.tap(function (graph) {
                 var index = nodeTiles.caching.indexOf(h);
                 if (index > -1) {
                     nodeTiles.caching.splice(index, 1);
@@ -32584,8 +48161,7 @@ var Graph = (function () {
                     delete _this._requiredNodeTiles[key];
                     _this._cachedNodeTiles[key] = true;
                 }
-            })
-                .catch(function (error) {
+            }), operators_1.catchError(function (error) {
                 var index = nodeTiles.caching.indexOf(h);
                 if (index > -1) {
                     nodeTiles.caching.splice(index, 1);
@@ -32596,12 +48172,9 @@ var Graph = (function () {
                     _this._cachedNodeTiles[key] = true;
                 }
                 throw error;
-            })
-                .finally(function () {
+            }), operators_1.finalize(function () {
                 _this._changed$.next(_this);
-            })
-                .publish()
-                .refCount());
+            }), operators_1.publish(), operators_1.refCount()));
         };
         var this_2 = this;
         for (var _i = 0, _a = nodeTiles.caching; _i < _a.length; _i++) {
@@ -32666,6 +48239,16 @@ var Graph = (function () {
     Graph.prototype.isCachingSequence = function (sequenceKey) {
         return sequenceKey in this._cachingSequences$;
     };
+    /**
+     * Get a value indicating if the graph is caching sequence nodes.
+     *
+     * @param {string} sequenceKey - Key of sequence.
+     * @returns {boolean} Value indicating if the sequence nodes are
+     * being cached.
+     */
+    Graph.prototype.isCachingSequenceNodes = function (sequenceKey) {
+        return sequenceKey in this._cachingSequenceNodes$;
+    };
     /**
      * Get a value indicating if the graph is caching the tiles
      * required for calculating spatial edges of a node.
@@ -32732,6 +48315,16 @@ var Graph = (function () {
         }
         return hasSequence;
     };
+    /**
+     * Get a value indicating if sequence nodes has been cached in the graph.
+     *
+     * @param {string} sequenceKey - Key of sequence.
+     * @returns {boolean} Value indicating if a sequence nodes has been
+     * cached in the graph.
+     */
+    Graph.prototype.hasSequenceNodes = function (sequenceKey) {
+        return sequenceKey in this._cachedSequenceNodes;
+    };
     /**
      * Get a value indicating if the graph has fully cached
      * all nodes in the spatial area of a node.
@@ -32883,8 +48476,8 @@ var Graph = (function () {
         this._nodes = {};
         this._nodeToTile = {};
         this._preStored = {};
-        for (var _c = 0, nodes_1 = nodes; _c < nodes_1.length; _c++) {
-            var node = nodes_1[_c];
+        for (var _c = 0, nodes_2 = nodes; _c < nodes_2.length; _c++) {
+            var node = nodes_2[_c];
             this._nodes[node.key] = node;
             var h = this._graphCalculator.encodeH(node.originalLatLon, this._tilePrecision);
             this._preStore(h, node);
@@ -32916,12 +48509,15 @@ var Graph = (function () {
      * @param {Array<string>} keepKeys - Keys of nodes to keep in
      * graph unrelated to last access. Tiles related to those keys
      * will also be kept in graph.
+     * @param {string} keepSequenceKey - Optional key of sequence
+     * for which the belonging nodes should not be disposed or
+     * removed from the graph. These nodes may still be uncached if
+     * not specified in keep keys param.
      */
-    Graph.prototype.uncache = function (keepKeys) {
+    Graph.prototype.uncache = function (keepKeys, keepSequenceKey) {
         var keysInUse = {};
         this._addNewKeys(keysInUse, this._cachingFull$);
         this._addNewKeys(keysInUse, this._cachingFill$);
-        this._addNewKeys(keysInUse, this._cachingTiles$);
         this._addNewKeys(keysInUse, this._cachingSpatialArea$);
         this._addNewKeys(keysInUse, this._requiredNodeTiles);
         this._addNewKeys(keysInUse, this._requiredSpatialArea);
@@ -32963,8 +48559,43 @@ var Graph = (function () {
         });
         for (var _b = 0, uncacheHs_1 = uncacheHs; _b < uncacheHs_1.length; _b++) {
             var uncacheH = uncacheHs_1[_b];
-            this._uncacheTile(uncacheH);
+            this._uncacheTile(uncacheH, keepSequenceKey);
         }
+        var potentialPreStored = [];
+        var nonCachedPreStored = [];
+        for (var h in this._preStored) {
+            if (!this._preStored.hasOwnProperty(h) || h in this._cachingTiles$) {
+                continue;
+            }
+            var prestoredNodes = this._preStored[h];
+            for (var key in prestoredNodes) {
+                if (!prestoredNodes.hasOwnProperty(key) || key in keysInUse) {
+                    continue;
+                }
+                if (prestoredNodes[key].sequenceKey === keepSequenceKey) {
+                    continue;
+                }
+                if (key in this._cachedNodes) {
+                    potentialPreStored.push([this._cachedNodes[key], h]);
+                }
+                else {
+                    nonCachedPreStored.push([key, h]);
+                }
+            }
+        }
+        var uncachePreStored = potentialPreStored
+            .sort(function (_a, _b) {
+            var na1 = _a[0], h1 = _a[1];
+            var na2 = _b[0], h2 = _b[1];
+            return na2.accessed - na1.accessed;
+        })
+            .slice(this._configuration.maxUnusedPreStoredNodes)
+            .map(function (_a) {
+            var na = _a[0], h = _a[1];
+            return [na.node.key, h];
+        });
+        this._uncachePreStored(nonCachedPreStored);
+        this._uncachePreStored(uncachePreStored);
         var potentialNodes = [];
         for (var key in this._cachedNodes) {
             if (!this._cachedNodes.hasOwnProperty(key) || key in keysInUse) {
@@ -32992,7 +48623,8 @@ var Graph = (function () {
         var potentialSequences = [];
         for (var sequenceKey in this._sequences) {
             if (!this._sequences.hasOwnProperty(sequenceKey) ||
-                sequenceKey in this._cachingSequences$) {
+                sequenceKey in this._cachingSequences$ ||
+                sequenceKey === keepSequenceKey) {
                 continue;
             }
             potentialSequences.push(this._sequences[sequenceKey]);
@@ -33006,6 +48638,9 @@ var Graph = (function () {
             var sequenceAccess = uncacheSequences_1[_d];
             var sequenceKey = sequenceAccess.sequence.key;
             delete this._sequences[sequenceKey];
+            if (sequenceKey in this._cachedSequenceNodes) {
+                delete this._cachedSequenceNodes[sequenceKey];
+            }
             sequenceAccess.sequence.dispose();
         }
     };
@@ -33024,8 +48659,7 @@ var Graph = (function () {
         if (sequenceKey in this._cachingSequences$) {
             return this._cachingSequences$[sequenceKey];
         }
-        this._cachingSequences$[sequenceKey] = this._apiV3.sequenceByKey$([sequenceKey])
-            .do(function (sequenceByKey) {
+        this._cachingSequences$[sequenceKey] = this._apiV3.sequenceByKey$([sequenceKey]).pipe(operators_1.tap(function (sequenceByKey) {
             if (!(sequenceKey in _this._sequences)) {
                 _this._sequences[sequenceKey] = {
                     accessed: new Date().getTime(),
@@ -33033,20 +48667,74 @@ var Graph = (function () {
                 };
             }
             delete _this._cachingSequences$[sequenceKey];
-        })
-            .map(function (sequenceByKey) {
+        }), operators_1.map(function (sequenceByKey) {
             return _this;
-        })
-            .finally(function () {
+        }), operators_1.finalize(function () {
             if (sequenceKey in _this._cachingSequences$) {
                 delete _this._cachingSequences$[sequenceKey];
             }
             _this._changed$.next(_this);
-        })
-            .publish()
-            .refCount();
+        }), operators_1.publish(), operators_1.refCount());
         return this._cachingSequences$[sequenceKey];
     };
+    Graph.prototype._cacheTile$ = function (h) {
+        var _this = this;
+        this._cachingTiles$[h] = this._apiV3.imagesByH$([h]).pipe(operators_1.tap(function (imagesByH) {
+            var coreNodes = imagesByH[h];
+            if (h in _this._cachedTiles) {
+                return;
+            }
+            _this._nodeIndexTiles[h] = [];
+            _this._cachedTiles[h] = { accessed: new Date().getTime(), nodes: [] };
+            var hCache = _this._cachedTiles[h].nodes;
+            var preStored = _this._removeFromPreStore(h);
+            for (var index in coreNodes) {
+                if (!coreNodes.hasOwnProperty(index)) {
+                    continue;
+                }
+                var coreNode = coreNodes[index];
+                if (coreNode == null) {
+                    break;
+                }
+                if (coreNode.sequence_key == null) {
+                    console.warn("Sequence missing, discarding node (" + coreNode.key + ")");
+                    continue;
+                }
+                if (preStored != null && coreNode.key in preStored) {
+                    var preStoredNode = preStored[coreNode.key];
+                    delete preStored[coreNode.key];
+                    hCache.push(preStoredNode);
+                    var preStoredNodeIndexItem = {
+                        lat: preStoredNode.latLon.lat,
+                        lon: preStoredNode.latLon.lon,
+                        node: preStoredNode,
+                    };
+                    _this._nodeIndex.insert(preStoredNodeIndexItem);
+                    _this._nodeIndexTiles[h].push(preStoredNodeIndexItem);
+                    _this._nodeToTile[preStoredNode.key] = h;
+                    continue;
+                }
+                var node = new Graph_1.Node(coreNode);
+                hCache.push(node);
+                var nodeIndexItem = {
+                    lat: node.latLon.lat,
+                    lon: node.latLon.lon,
+                    node: node,
+                };
+                _this._nodeIndex.insert(nodeIndexItem);
+                _this._nodeIndexTiles[h].push(nodeIndexItem);
+                _this._nodeToTile[node.key] = h;
+                _this._setNode(node);
+            }
+            delete _this._cachingTiles$[h];
+        }), operators_1.map(function (imagesByH) {
+            return _this;
+        }), operators_1.catchError(function (error) {
+            delete _this._cachingTiles$[h];
+            throw error;
+        }), operators_1.publish(), operators_1.refCount());
+        return this._cachingTiles$[h];
+    };
     Graph.prototype._makeFull = function (node, fillNode) {
         if (fillNode.calt == null) {
             fillNode.calt = this._defaultAlt;
@@ -33077,11 +48765,10 @@ var Graph = (function () {
         }
         this._nodes[key] = node;
     };
-    Graph.prototype._uncacheTile = function (h) {
+    Graph.prototype._uncacheTile = function (h, keepSequenceKey) {
         for (var _i = 0, _a = this._cachedTiles[h].nodes; _i < _a.length; _i++) {
             var node = _a[_i];
             var key = node.key;
-            delete this._nodes[key];
             delete this._nodeToTile[key];
             if (key in this._cachedNodes) {
                 delete this._cachedNodes[key];
@@ -33092,7 +48779,17 @@ var Graph = (function () {
             if (key in this._cachedSpatialEdges) {
                 delete this._cachedSpatialEdges[key];
             }
-            node.dispose();
+            if (node.sequenceKey === keepSequenceKey) {
+                this._preStore(h, node);
+                node.uncache();
+            }
+            else {
+                delete this._nodes[key];
+                if (node.sequenceKey in this._cachedSequenceNodes) {
+                    delete this._cachedSequenceNodes[node.sequenceKey];
+                }
+                node.dispose();
+            }
         }
         for (var _b = 0, _c = this._nodeIndexTiles[h]; _b < _c.length; _b++) {
             var nodeIndexItem = _c[_b];
@@ -33101,6 +48798,33 @@ var Graph = (function () {
         delete this._nodeIndexTiles[h];
         delete this._cachedTiles[h];
     };
+    Graph.prototype._uncachePreStored = function (preStored) {
+        var hs = {};
+        for (var _i = 0, preStored_1 = preStored; _i < preStored_1.length; _i++) {
+            var _a = preStored_1[_i], key = _a[0], h = _a[1];
+            if (key in this._nodes) {
+                delete this._nodes[key];
+            }
+            if (key in this._cachedNodes) {
+                delete this._cachedNodes[key];
+            }
+            var node = this._preStored[h][key];
+            if (node.sequenceKey in this._cachedSequenceNodes) {
+                delete this._cachedSequenceNodes[node.sequenceKey];
+            }
+            delete this._preStored[h][key];
+            node.dispose();
+            hs[h] = true;
+        }
+        for (var h in hs) {
+            if (!hs.hasOwnProperty(h)) {
+                continue;
+            }
+            if (Object.keys(this._preStored[h]).length === 0) {
+                delete this._preStored[h];
+            }
+        }
+    };
     Graph.prototype._updateCachedTileAccess = function (key, accessed) {
         if (key in this._nodeToTile) {
             this._cachedTiles[this._nodeToTile[key]].accessed = accessed;
@@ -33116,32 +48840,20 @@ var Graph = (function () {
 exports.Graph = Graph;
 exports.default = Graph;
 
-},{"../Edge":227,"../Error":228,"../Graph":230,"rbush":25,"rxjs/Subject":34,"rxjs/add/observable/from":41,"rxjs/add/operator/catch":52,"rxjs/add/operator/do":59,"rxjs/add/operator/finally":62,"rxjs/add/operator/map":65,"rxjs/add/operator/publish":71}],313:[function(require,module,exports){
+},{"../Edge":292,"../Error":293,"../Geo":294,"../Graph":295,"rxjs":43,"rxjs/operators":241}],425:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.GraphCalculator = void 0;
 var geohash = require("latlon-geohash");
 var THREE = require("three");
+var Error_1 = require("../Error");
 var Geo_1 = require("../Geo");
-var GeoHashDirections = (function () {
-    function GeoHashDirections() {
-    }
-    GeoHashDirections.n = "n";
-    GeoHashDirections.nw = "nw";
-    GeoHashDirections.w = "w";
-    GeoHashDirections.sw = "sw";
-    GeoHashDirections.s = "s";
-    GeoHashDirections.se = "se";
-    GeoHashDirections.e = "e";
-    GeoHashDirections.ne = "ne";
-    return GeoHashDirections;
-}());
 /**
  * @class GraphCalculator
  *
  * @classdesc Represents a calculator for graph entities.
  */
-var GraphCalculator = (function () {
+var GraphCalculator = /** @class */ (function () {
     /**
      * Create a new graph calculator instance.
      *
@@ -33193,31 +48905,57 @@ var GraphCalculator = (function () {
         var t = top < threshold;
         var hs = [h];
         if (t) {
-            hs.push(neighbours[GeoHashDirections.n]);
+            hs.push(neighbours.n);
         }
         if (t && l) {
-            hs.push(neighbours[GeoHashDirections.nw]);
+            hs.push(neighbours.nw);
         }
         if (l) {
-            hs.push(neighbours[GeoHashDirections.w]);
+            hs.push(neighbours.w);
         }
         if (l && b) {
-            hs.push(neighbours[GeoHashDirections.sw]);
+            hs.push(neighbours.sw);
         }
         if (b) {
-            hs.push(neighbours[GeoHashDirections.s]);
+            hs.push(neighbours.s);
         }
         if (b && r) {
-            hs.push(neighbours[GeoHashDirections.se]);
+            hs.push(neighbours.se);
         }
         if (r) {
-            hs.push(neighbours[GeoHashDirections.e]);
+            hs.push(neighbours.e);
         }
         if (r && t) {
-            hs.push(neighbours[GeoHashDirections.ne]);
+            hs.push(neighbours.ne);
         }
         return hs;
     };
+    /**
+     * Encode the minimum set of geohash tiles containing a bounding box.
+     *
+     * @description The current algorithm does expect the bounding box
+     * to be sufficiently small to be contained in an area with the size
+     * of maximally four tiles. Up to nine adjacent tiles may be returned.
+     * The method currently uses the largest side as the threshold leading to
+     * more tiles being returned than needed in edge cases.
+     *
+     * @param {ILatLon} sw - South west corner of bounding box.
+     * @param {ILatLon} ne - North east corner of bounding box.
+     * @param {number} precision - Precision of the encoding.
+     *
+     * @returns {string} The geohash tiles containing the bounding box.
+     */
+    GraphCalculator.prototype.encodeHsFromBoundingBox = function (sw, ne, precision) {
+        if (precision === void 0) { precision = 7; }
+        if (ne.lat <= sw.lat || ne.lon <= sw.lon) {
+            throw new Error_1.GraphMapillaryError("North east needs to be top right of south west");
+        }
+        var centerLat = (sw.lat + ne.lat) / 2;
+        var centerLon = (sw.lon + ne.lon) / 2;
+        var enu = this._geoCoords.geodeticToEnu(ne.lat, ne.lon, 0, centerLat, centerLon, 0);
+        var threshold = Math.max(enu[0], enu[1]);
+        return this.encodeHs({ lat: centerLat, lon: centerLon }, precision, threshold);
+    };
     /**
      * Get the bounding box corners for a circle with radius of a threshold
      * with center in a geodetic position.
@@ -33278,45 +49016,105 @@ var GraphCalculator = (function () {
 exports.GraphCalculator = GraphCalculator;
 exports.default = GraphCalculator;
 
-},{"../Geo":229,"latlon-geohash":21,"three":176}],314:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/catch");
-require("rxjs/add/operator/concat");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/expand");
-require("rxjs/add/operator/finally");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/last");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/publishReplay");
+},{"../Error":293,"../Geo":294,"latlon-geohash":21,"three":242}],426:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.GraphMode = void 0;
+/**
+ * Enumeration for graph modes.
+ * @enum {number}
+ * @readonly
+ * @description Modes for the retrieval and caching performed
+ * by the graph service on the graph.
+ */
+var GraphMode;
+(function (GraphMode) {
+    /**
+     * Caching is performed on sequences only and sequence edges are
+     * calculated. Spatial tiles
+     * are not retrieved and spatial edges are not calculated when
+     * caching nodes. Complete sequences are being cached for requested
+     * nodes within the graph.
+     */
+    GraphMode[GraphMode["Sequence"] = 0] = "Sequence";
+    /**
+     * Caching is performed with emphasis on spatial data. Sequence edges
+     * as well as spatial edges are cached. Sequence data
+     * is still requested but complete sequences are not being cached
+     * for requested nodes.
+     *
+     * This is the initial mode of the graph service.
+     */
+    GraphMode[GraphMode["Spatial"] = 1] = "Spatial";
+})(GraphMode = exports.GraphMode || (exports.GraphMode = {}));
+exports.default = GraphMode;
+
+},{}],427:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.GraphService = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Graph_1 = require("../Graph");
 /**
  * @class GraphService
  *
  * @classdesc Represents a service for graph operations.
  */
-var GraphService = (function () {
+var GraphService = /** @class */ (function () {
     /**
      * Create a new graph service instance.
      *
      * @param {Graph} graph - Graph instance to be operated on.
      */
     function GraphService(graph, imageLoadingService) {
-        this._graph$ = Observable_1.Observable
-            .of(graph)
-            .concat(graph.changed$)
-            .publishReplay(1)
-            .refCount();
+        this._graph$ = rxjs_1.concat(rxjs_1.of(graph), graph.changed$).pipe(operators_1.publishReplay(1), operators_1.refCount());
         this._graph$.subscribe(function () { });
+        this._graphMode = Graph_1.GraphMode.Spatial;
+        this._graphModeSubject$ = new rxjs_1.Subject();
+        this._graphMode$ = this._graphModeSubject$.pipe(operators_1.startWith(this._graphMode), operators_1.publishReplay(1), operators_1.refCount());
+        this._graphMode$.subscribe(function () { });
         this._imageLoadingService = imageLoadingService;
         this._firstGraphSubjects$ = [];
         this._initializeCacheSubscriptions = [];
         this._sequenceSubscriptions = [];
         this._spatialSubscriptions = [];
     }
+    Object.defineProperty(GraphService.prototype, "graphMode$", {
+        /**
+         * Get graph mode observable.
+         *
+         * @description Emits the current graph mode.
+         *
+         * @returns {Observable<GraphMode>} Observable
+         * emitting the current graph mode when it changes.
+         */
+        get: function () {
+            return this._graphMode$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * Cache full nodes in a bounding box.
+     *
+     * @description When called, the full properties of
+     * the node are retrieved. The node cache is not initialized
+     * for any new nodes retrieved and the node assets are not
+     * retrieved, {@link cacheNode$} needs to be called for caching
+     * assets.
+     *
+     * @param {ILatLon} sw - South west corner of bounding box.
+     * @param {ILatLon} ne - North east corner of bounding box.
+     * @return {Observable<Array<Node>>} Observable emitting a single item,
+     * the nodes of the bounding box, when they have all been retrieved.
+     * @throws {Error} Propagates any IO node caching errors to the caller.
+     */
+    GraphService.prototype.cacheBoundingBox$ = function (sw, ne) {
+        return this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) {
+            return graph.cacheBoundingBox$(sw, ne);
+        }));
+    };
     /**
      * Cache a node in the graph and retrieve it.
      *
@@ -33337,50 +49135,40 @@ var GraphService = (function () {
      */
     GraphService.prototype.cacheNode$ = function (key) {
         var _this = this;
-        var firstGraphSubject$ = new Subject_1.Subject();
+        var firstGraphSubject$ = new rxjs_1.Subject();
         this._firstGraphSubjects$.push(firstGraphSubject$);
-        var firstGraph$ = firstGraphSubject$
-            .publishReplay(1)
-            .refCount();
-        var node$ = firstGraph$
-            .map(function (graph) {
+        var firstGraph$ = firstGraphSubject$.pipe(operators_1.publishReplay(1), operators_1.refCount());
+        var node$ = firstGraph$.pipe(operators_1.map(function (graph) {
             return graph.getNode(key);
-        })
-            .mergeMap(function (node) {
+        }), operators_1.mergeMap(function (node) {
             return node.assetsCached ?
-                Observable_1.Observable.of(node) :
+                rxjs_1.of(node) :
                 node.cacheAssets$();
-        })
-            .publishReplay(1)
-            .refCount();
+        }), operators_1.publishReplay(1), operators_1.refCount());
         node$.subscribe(function (node) {
             _this._imageLoadingService.loadnode$.next(node);
         }, function (error) {
             console.error("Failed to cache node (" + key + ")", error);
         });
-        var initializeCacheSubscription = this._graph$
-            .first()
-            .mergeMap(function (graph) {
+        var initializeCacheSubscription = this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) {
             if (graph.isCachingFull(key) || !graph.hasNode(key)) {
                 return graph.cacheFull$(key);
             }
             if (graph.isCachingFill(key) || !graph.getNode(key).full) {
                 return graph.cacheFill$(key);
             }
-            return Observable_1.Observable.of(graph);
-        })
-            .do(function (graph) {
+            return rxjs_1.of(graph);
+        }), operators_1.tap(function (graph) {
             if (!graph.hasInitializedCache(key)) {
                 graph.initializeCache(key);
             }
-        })
-            .finally(function () {
+        }), operators_1.finalize(function () {
             if (initializeCacheSubscription == null) {
                 return;
             }
             _this._removeFromArray(initializeCacheSubscription, _this._initializeCacheSubscriptions);
             _this._removeFromArray(firstGraphSubject$, _this._firstGraphSubjects$);
-        })
+        }))
             .subscribe(function (graph) {
             firstGraphSubject$.next(graph);
             firstGraphSubject$.complete();
@@ -33390,93 +49178,78 @@ var GraphService = (function () {
         if (!initializeCacheSubscription.closed) {
             this._initializeCacheSubscriptions.push(initializeCacheSubscription);
         }
-        var sequenceSubscription = firstGraph$
-            .mergeMap(function (graph) {
+        var graphSequence$ = firstGraph$.pipe(operators_1.mergeMap(function (graph) {
             if (graph.isCachingNodeSequence(key) || !graph.hasNodeSequence(key)) {
                 return graph.cacheNodeSequence$(key);
             }
-            return Observable_1.Observable.of(graph);
-        })
-            .do(function (graph) {
+            return rxjs_1.of(graph);
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        var sequenceSubscription = graphSequence$.pipe(operators_1.tap(function (graph) {
             if (!graph.getNode(key).sequenceEdges.cached) {
                 graph.cacheSequenceEdges(key);
             }
-        })
-            .finally(function () {
+        }), operators_1.finalize(function () {
             if (sequenceSubscription == null) {
                 return;
             }
             _this._removeFromArray(sequenceSubscription, _this._sequenceSubscriptions);
-        })
+        }))
             .subscribe(function (graph) { return; }, function (error) {
             console.error("Failed to cache sequence edges (" + key + ").", error);
         });
         if (!sequenceSubscription.closed) {
             this._sequenceSubscriptions.push(sequenceSubscription);
         }
-        var spatialSubscription = firstGraph$
-            .expand(function (graph) {
-            if (graph.hasTiles(key)) {
-                return Observable_1.Observable.empty();
-            }
-            return Observable_1.Observable
-                .from(graph.cacheTiles$(key))
-                .mergeMap(function (graph$) {
-                return graph$
-                    .mergeMap(function (g) {
-                    if (g.isCachingTiles(key)) {
-                        return Observable_1.Observable.empty();
-                    }
-                    return Observable_1.Observable.of(g);
-                })
-                    .catch(function (error, caught$) {
-                    console.error("Failed to cache tile data (" + key + ").", error);
-                    return Observable_1.Observable.empty();
-                });
-            });
-        })
-            .last()
-            .mergeMap(function (graph) {
-            if (graph.hasSpatialArea(key)) {
-                return Observable_1.Observable.of(graph);
-            }
-            return Observable_1.Observable
-                .from(graph.cacheSpatialArea$(key))
-                .mergeMap(function (graph$) {
-                return graph$
-                    .catch(function (error, caught$) {
-                    console.error("Failed to cache spatial nodes (" + key + ").", error);
-                    return Observable_1.Observable.empty();
-                });
+        if (this._graphMode === Graph_1.GraphMode.Spatial) {
+            var spatialSubscription_1 = firstGraph$.pipe(operators_1.expand(function (graph) {
+                if (graph.hasTiles(key)) {
+                    return rxjs_1.empty();
+                }
+                return rxjs_1.from(graph.cacheTiles$(key)).pipe(operators_1.mergeMap(function (graph$) {
+                    return graph$.pipe(operators_1.mergeMap(function (g) {
+                        if (g.isCachingTiles(key)) {
+                            return rxjs_1.empty();
+                        }
+                        return rxjs_1.of(g);
+                    }), operators_1.catchError(function (error, caught$) {
+                        console.error("Failed to cache tile data (" + key + ").", error);
+                        return rxjs_1.empty();
+                    }));
+                }));
+            }), operators_1.last(), operators_1.mergeMap(function (graph) {
+                if (graph.hasSpatialArea(key)) {
+                    return rxjs_1.of(graph);
+                }
+                return rxjs_1.from(graph.cacheSpatialArea$(key)).pipe(operators_1.mergeMap(function (graph$) {
+                    return graph$.pipe(operators_1.catchError(function (error, caught$) {
+                        console.error("Failed to cache spatial nodes (" + key + ").", error);
+                        return rxjs_1.empty();
+                    }));
+                }));
+            }), operators_1.last(), operators_1.mergeMap(function (graph) {
+                return graph.hasNodeSequence(key) ?
+                    rxjs_1.of(graph) :
+                    graph.cacheNodeSequence$(key);
+            }), operators_1.tap(function (graph) {
+                if (!graph.getNode(key).spatialEdges.cached) {
+                    graph.cacheSpatialEdges(key);
+                }
+            }), operators_1.finalize(function () {
+                if (spatialSubscription_1 == null) {
+                    return;
+                }
+                _this._removeFromArray(spatialSubscription_1, _this._spatialSubscriptions);
+            }))
+                .subscribe(function (graph) { return; }, function (error) {
+                console.error("Failed to cache spatial edges (" + key + ").", error);
             });
-        })
-            .last()
-            .mergeMap(function (graph) {
-            return graph.hasNodeSequence(key) ?
-                Observable_1.Observable.of(graph) :
-                graph.cacheNodeSequence$(key);
-        })
-            .do(function (graph) {
-            if (!graph.getNode(key).spatialEdges.cached) {
-                graph.cacheSpatialEdges(key);
+            if (!spatialSubscription_1.closed) {
+                this._spatialSubscriptions.push(spatialSubscription_1);
             }
-        })
-            .finally(function () {
-            if (spatialSubscription == null) {
-                return;
-            }
-            _this._removeFromArray(spatialSubscription, _this._spatialSubscriptions);
-        })
-            .subscribe(function (graph) { return; }, function (error) {
-            console.error("Failed to cache spatial edges (" + key + ").", error);
-        });
-        if (!spatialSubscription.closed) {
-            this._spatialSubscriptions.push(spatialSubscription);
         }
-        return node$
-            .first(function (node) {
+        return node$.pipe(operators_1.first(function (node) {
             return node.assetsCached;
-        });
+        }));
     };
     /**
      * Cache a sequence in the graph and retrieve it.
@@ -33487,17 +49260,44 @@ var GraphService = (function () {
      * @throws {Error} Propagates any IO node caching errors to the caller.
      */
     GraphService.prototype.cacheSequence$ = function (sequenceKey) {
-        return this._graph$
-            .first()
-            .mergeMap(function (graph) {
+        return this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) {
             if (graph.isCachingSequence(sequenceKey) || !graph.hasSequence(sequenceKey)) {
                 return graph.cacheSequence$(sequenceKey);
             }
-            return Observable_1.Observable.of(graph);
-        })
-            .map(function (graph) {
+            return rxjs_1.of(graph);
+        }), operators_1.map(function (graph) {
             return graph.getSequence(sequenceKey);
-        });
+        }));
+    };
+    /**
+     * Cache a sequence and its nodes in the graph and retrieve the sequence.
+     *
+     * @description Caches a sequence and its assets are cached and
+     * retrieves all nodes belonging to the sequence. The node assets
+     * or edges will not be cached.
+     *
+     * @param {string} sequenceKey - Sequence key.
+     * @param {string} referenceNodeKey - Key of node to use as reference
+     * for optimized caching.
+     * @returns {Observable<Sequence>} Observable emitting a single item,
+     * the sequence, when it has been retrieved, its assets are cached and
+     * all nodes belonging to the sequence has been retrieved.
+     * @throws {Error} Propagates any IO node caching errors to the caller.
+     */
+    GraphService.prototype.cacheSequenceNodes$ = function (sequenceKey, referenceNodeKey) {
+        return this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) {
+            if (graph.isCachingSequence(sequenceKey) || !graph.hasSequence(sequenceKey)) {
+                return graph.cacheSequence$(sequenceKey);
+            }
+            return rxjs_1.of(graph);
+        }), operators_1.mergeMap(function (graph) {
+            if (graph.isCachingSequenceNodes(sequenceKey) || !graph.hasSequenceNodes(sequenceKey)) {
+                return graph.cacheSequenceNodes$(sequenceKey, referenceNodeKey);
+            }
+            return rxjs_1.of(graph);
+        }), operators_1.map(function (graph) {
+            return graph.getSequence(sequenceKey);
+        }));
     };
     /**
      * Set a spatial edge filter on the graph.
@@ -33510,12 +49310,35 @@ var GraphService = (function () {
      */
     GraphService.prototype.setFilter$ = function (filter) {
         this._resetSubscriptions(this._spatialSubscriptions);
-        return this._graph$
-            .first()
-            .do(function (graph) {
+        return this._graph$.pipe(operators_1.first(), operators_1.tap(function (graph) {
             graph.resetSpatialEdges();
             graph.setFilter(filter);
-        });
+        }), operators_1.map(function (graph) {
+            return undefined;
+        }));
+    };
+    /**
+     * Set the graph mode.
+     *
+     * @description If graph mode is set to spatial, caching
+     * is performed with emphasis on spatial edges. If graph
+     * mode is set to sequence no tile data is requested and
+     * no spatial edges are computed.
+     *
+     * When setting graph mode to sequence all spatial
+     * subscriptions are aborted.
+     *
+     * @param {GraphMode} mode - Graph mode to set.
+     */
+    GraphService.prototype.setGraphMode = function (mode) {
+        if (this._graphMode === mode) {
+            return;
+        }
+        if (mode === Graph_1.GraphMode.Sequence) {
+            this._resetSubscriptions(this._spatialSubscriptions);
+        }
+        this._graphMode = mode;
+        this._graphModeSubject$.next(this._graphMode);
     };
     /**
      * Reset the graph.
@@ -33532,11 +49355,11 @@ var GraphService = (function () {
         this._resetSubscriptions(this._initializeCacheSubscriptions);
         this._resetSubscriptions(this._sequenceSubscriptions);
         this._resetSubscriptions(this._spatialSubscriptions);
-        return this._graph$
-            .first()
-            .do(function (graph) {
+        return this._graph$.pipe(operators_1.first(), operators_1.tap(function (graph) {
             graph.reset(keepKeys);
-        });
+        }), operators_1.map(function (graph) {
+            return undefined;
+        }));
     };
     /**
      * Uncache the graph.
@@ -33546,15 +49369,19 @@ var GraphService = (function () {
      * related to those nodes.
      *
      * @param {Array<string>} keepKeys - Keys of nodes to keep in graph.
+     * @param {string} keepSequenceKey - Optional key of sequence
+     * for which the belonging nodes should not be disposed or
+     * removed from the graph. These nodes may still be uncached if
+     * not specified in keep keys param.
      * @return {Observable<Graph>} Observable emitting a single item,
      * the graph, when the graph has been uncached.
      */
-    GraphService.prototype.uncache$ = function (keepKeys) {
-        return this._graph$
-            .first()
-            .do(function (graph) {
-            graph.uncache(keepKeys);
-        });
+    GraphService.prototype.uncache$ = function (keepKeys, keepSequenceKey) {
+        return this._graph$.pipe(operators_1.first(), operators_1.tap(function (graph) {
+            graph.uncache(keepKeys, keepSequenceKey);
+        }), operators_1.map(function (graph) {
+            return undefined;
+        }));
     };
     GraphService.prototype._abortSubjects = function (subjects) {
         for (var _i = 0, _a = subjects.slice(); _i < _a.length; _i++) {
@@ -33583,47 +49410,62 @@ var GraphService = (function () {
 exports.GraphService = GraphService;
 exports.default = GraphService;
 
-},{"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/operator/catch":52,"rxjs/add/operator/concat":54,"rxjs/add/operator/do":59,"rxjs/add/operator/expand":60,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/last":64,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72}],315:[function(require,module,exports){
+},{"../Graph":295,"rxjs":43,"rxjs/operators":241}],428:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("rxjs/Subject");
-var ImageLoadingService = (function () {
+exports.ImageLoadingService = void 0;
+var operators_1 = require("rxjs/operators");
+var rxjs_1 = require("rxjs");
+var ImageLoadingService = /** @class */ (function () {
     function ImageLoadingService() {
-        this._loadnode$ = new Subject_1.Subject();
-        this._loadstatus$ = this._loadnode$
-            .scan(function (nodes, node) {
-            nodes[node.key] = node.loadStatus;
+        this._loadnode$ = new rxjs_1.Subject();
+        this._loadstatus$ = this._loadnode$.pipe(operators_1.scan(function (_a, node) {
+            var nodes = _a[0];
+            var changed = false;
+            if (node.loadStatus.total === 0 || node.loadStatus.loaded === node.loadStatus.total) {
+                if (node.key in nodes) {
+                    delete nodes[node.key];
+                    changed = true;
+                }
+            }
+            else {
+                nodes[node.key] = node.loadStatus;
+                changed = true;
+            }
+            return [nodes, changed];
+        }, [{}, false]), operators_1.filter(function (_a) {
+            var nodes = _a[0], changed = _a[1];
+            return changed;
+        }), operators_1.map(function (_a) {
+            var nodes = _a[0];
             return nodes;
-        }, {})
-            .publishReplay(1)
-            .refCount();
+        }), operators_1.publishReplay(1), operators_1.refCount());
         this._loadstatus$.subscribe(function () { });
     }
     Object.defineProperty(ImageLoadingService.prototype, "loadnode$", {
         get: function () {
             return this._loadnode$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(ImageLoadingService.prototype, "loadstatus$", {
         get: function () {
             return this._loadstatus$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     return ImageLoadingService;
 }());
 exports.ImageLoadingService = ImageLoadingService;
 
-},{"rxjs/Subject":34}],316:[function(require,module,exports){
+},{"rxjs":43,"rxjs/operators":241}],429:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.MeshReader = void 0;
 var Pbf = require("pbf");
-var MeshReader = (function () {
+var MeshReader = /** @class */ (function () {
     function MeshReader() {
     }
     MeshReader.read = function (buffer) {
@@ -33642,11 +49484,11 @@ var MeshReader = (function () {
 }());
 exports.MeshReader = MeshReader;
 
-},{"pbf":23}],317:[function(require,module,exports){
+},{"pbf":40}],430:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/map");
+exports.Node = void 0;
+var operators_1 = require("rxjs/operators");
 /**
  * @class Node
  *
@@ -33655,16 +49497,16 @@ require("rxjs/add/operator/map");
  * Explanation of position and bearing properties:
  *
  * When images are uploaded they will have GPS information in the EXIF, this is what
- * is called `originalLatLon`(@link Node#originalLatLon).
+ * is called `originalLatLon` {@link Node.originalLatLon}.
  *
  * When Structure from Motions has been run for a node a `computedLatLon` that
  * differs from the `originalLatLon` will be created. It is different because
  * GPS positions are not very exact and SfM aligns the camera positions according
- * to the 3D reconstruction (@link Node#computedLatLon).
+ * to the 3D reconstruction {@link Node.computedLatLon}.
  *
  * At last there exist a `latLon` property which evaluates to
  * the `computedLatLon` from SfM if it exists but falls back
- * to the `originalLatLon` from the EXIF GPS otherwise (@link Node#latlon).
+ * to the `originalLatLon` from the EXIF GPS otherwise {@link Node.latLon}.
  *
  * Everything that is done in in the Viewer is based on the SfM positions,
  * i.e. `computedLatLon`. That is why the smooth transitions go in the right
@@ -33676,7 +49518,7 @@ require("rxjs/add/operator/map");
  * The same concept as above also applies to the compass angle (or bearing) properties
  * `originalCa`, `computedCa` and `ca`.
  */
-var Node = (function () {
+var Node = /** @class */ (function () {
     /**
      * Create a new node instance.
      *
@@ -33684,6 +49526,7 @@ var Node = (function () {
      * Nodes can not be added to the library through any API method.
      *
      * @param {ICoreNode} coreNode - Raw core node data.
+     * @ignore
      */
     function Node(core) {
         this._cache = null;
@@ -33701,6 +49544,8 @@ var Node = (function () {
          *
          * @returns {boolean} Value indicating whether all assets have been
          * cached.
+         *
+         * @ignore
          */
         get: function () {
             return this._core != null &&
@@ -33709,7 +49554,7 @@ var Node = (function () {
                 this._cache.image != null &&
                 this._cache.mesh != null;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "alt", {
@@ -33724,7 +49569,7 @@ var Node = (function () {
         get: function () {
             return this._fill.calt;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "ca", {
@@ -33734,12 +49579,27 @@ var Node = (function () {
          * @description If the SfM computed compass angle exists it will
          * be returned, otherwise the original EXIF compass angle.
          *
-         * @returns {number} Compass angle, measured in degrees.
+         * @returns {number} Compass angle, measured in degrees
+         * clockwise with respect to north.
          */
         get: function () {
             return this._fill.cca != null ? this._fill.cca : this._fill.ca;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "cameraProjection", {
+        /**
+         * Get cameraProjection.
+         *
+         * @description Will be undefined if SfM has not been run.
+         *
+         * @returns {number} The camera projection of the image.
+         */
+        get: function () {
+            return this._fill.camera_projection_type;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "capturedAt", {
@@ -33751,7 +49611,66 @@ var Node = (function () {
         get: function () {
             return this._fill.captured_at;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "cameraUuid", {
+        /**
+         * Get camera uuid.
+         *
+         * @description Will be undefined if the camera uuid was not
+         * recorded in the image exif information.
+         *
+         * @returns {string} Universally unique id for camera used
+         * when capturing image.
+         */
+        get: function () {
+            return this._fill.captured_with_camera_uuid;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "clusterKey", {
+        /**
+         * Get clusterKey.
+         *
+         * @returns {string} Unique key of the SfM cluster to which
+         * the node belongs.
+         */
+        get: function () {
+            return this._fill.cluster_key;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "ck1", {
+        /**
+         * Get ck1.
+         *
+         * @description Will not be set if SfM has not been run.
+         *
+         * @returns {number} SfM computed radial distortion parameter
+         * k1.
+         */
+        get: function () {
+            return this._fill.ck1;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "ck2", {
+        /**
+         * Get ck2.
+         *
+         * @description Will not be set if SfM has not been run.
+         *
+         * @returns {number} SfM computed radial distortion parameter
+         * k2.
+         */
+        get: function () {
+            return this._fill.ck2;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "computedCA", {
@@ -33760,12 +49679,13 @@ var Node = (function () {
          *
          * @description Will not be set if SfM has not been run.
          *
-         * @returns {number} SfM computed compass angle, measured in degrees.
+         * @returns {number} SfM computed compass angle, measured
+         * in degrees clockwise with respect to north.
          */
         get: function () {
             return this._fill.cca;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "computedLatLon", {
@@ -33780,7 +49700,7 @@ var Node = (function () {
         get: function () {
             return this._core.cl;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "focal", {
@@ -33794,7 +49714,7 @@ var Node = (function () {
         get: function () {
             return this._fill.cfocal;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "full", {
@@ -33806,11 +49726,13 @@ var Node = (function () {
          *
          * @returns {boolean} Value indicating whether the node has all
          * properties filled.
+         *
+         * @ignore
          */
         get: function () {
             return this._fill != null;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "fullPano", {
@@ -33827,7 +49749,7 @@ var Node = (function () {
                 this._fill.gpano.CroppedAreaImageWidthPixels === this._fill.gpano.FullPanoWidthPixels &&
                 this._fill.gpano.CroppedAreaImageHeightPixels === this._fill.gpano.FullPanoHeightPixels;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "gpano", {
@@ -33841,7 +49763,7 @@ var Node = (function () {
         get: function () {
             return this._fill.gpano;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "height", {
@@ -33854,7 +49776,7 @@ var Node = (function () {
         get: function () {
             return this._fill.height;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "image", {
@@ -33868,7 +49790,22 @@ var Node = (function () {
         get: function () {
             return this._cache.image;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "image$", {
+        /**
+         * Get image$.
+         *
+         * @returns {Observable<HTMLImageElement>} Observable emitting
+         * the cached image when it is updated.
+         *
+         * @ignore
+         */
+        get: function () {
+            return this._cache.image$;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "key", {
@@ -33880,7 +49817,7 @@ var Node = (function () {
         get: function () {
             return this._core.key;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "latLon", {
@@ -33897,7 +49834,7 @@ var Node = (function () {
         get: function () {
             return this._core.cl != null ? this._core.cl : this._core.l;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "loadStatus", {
@@ -33906,11 +49843,13 @@ var Node = (function () {
          *
          * @returns {ILoadStatus} Value indicating the load status
          * of the mesh and image.
+         *
+         * @ignore
          */
         get: function () {
             return this._cache.loadStatus;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "merged", {
@@ -33926,7 +49865,7 @@ var Node = (function () {
                 this._fill.merge_version != null &&
                 this._fill.merge_version > 0;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "mergeCC", {
@@ -33942,7 +49881,7 @@ var Node = (function () {
         get: function () {
             return this._fill.merge_cc;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "mergeVersion", {
@@ -33954,7 +49893,7 @@ var Node = (function () {
         get: function () {
             return this._fill.merge_version;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "mesh", {
@@ -33969,7 +49908,21 @@ var Node = (function () {
         get: function () {
             return this._cache.mesh;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "organizationKey", {
+        /**
+         * Get organizationKey.
+         *
+         * @returns {string} Unique key of the organization to which
+         * the node belongs. If the node does not belong to an
+         * organization the organization key will be undefined.
+         */
+        get: function () {
+            return this._fill.organization_key;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "orientation", {
@@ -33981,7 +49934,7 @@ var Node = (function () {
         get: function () {
             return this._fill.orientation;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "originalCA", {
@@ -33994,7 +49947,7 @@ var Node = (function () {
         get: function () {
             return this._fill.ca;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "originalLatLon", {
@@ -34007,7 +49960,7 @@ var Node = (function () {
         get: function () {
             return this._core.l;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "pano", {
@@ -34021,7 +49974,20 @@ var Node = (function () {
             return this._fill.gpano != null &&
                 this._fill.gpano.FullPanoWidthPixels != null;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "private", {
+        /**
+         * Get private.
+         *
+         * @returns {boolean} Value specifying if image is accessible to
+         * organization members only or to everyone.
+         */
+        get: function () {
+            return this._fill.private;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "projectKey", {
@@ -34029,14 +49995,18 @@ var Node = (function () {
          * Get projectKey.
          *
          * @returns {string} Unique key of the project to which
-         * the node belongs.
+         * the node belongs. If the node does not belong to a
+         * project the project key will be undefined.
+         *
+         * @deprecated This property will be deprecated in favor
+         * of the organization key and private properties.
          */
         get: function () {
             return this._fill.project != null ?
                 this._fill.project.key :
                 null;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "rotation", {
@@ -34050,7 +50020,7 @@ var Node = (function () {
         get: function () {
             return this._fill.c_rotation;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "scale", {
@@ -34064,7 +50034,7 @@ var Node = (function () {
         get: function () {
             return this._fill.atomic_scale;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "sequenceKey", {
@@ -34075,9 +50045,9 @@ var Node = (function () {
          * the node belongs.
          */
         get: function () {
-            return this._core.sequence.key;
+            return this._core.sequence_key;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "sequenceEdges", {
@@ -34086,24 +50056,30 @@ var Node = (function () {
          *
          * @returns {IEdgeStatus} Value describing the status of the
          * sequence edges.
+         *
+         * @ignore
          */
         get: function () {
             return this._cache.sequenceEdges;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "sequenceEdges$", {
         /**
          * Get sequenceEdges$.
          *
+         * @description Internal observable, should not be used as an API.
+         *
          * @returns {Observable<IEdgeStatus>} Observable emitting
          * values describing the status of the sequence edges.
+         *
+         * @ignore
          */
         get: function () {
             return this._cache.sequenceEdges$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "spatialEdges", {
@@ -34112,24 +50088,30 @@ var Node = (function () {
          *
          * @returns {IEdgeStatus} Value describing the status of the
          * spatial edges.
+         *
+         * @ignore
          */
         get: function () {
             return this._cache.spatialEdges;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "spatialEdges$", {
         /**
          * Get spatialEdges$.
          *
+         * @description Internal observable, should not be used as an API.
+         *
          * @returns {Observable<IEdgeStatus>} Observable emitting
          * values describing the status of the spatial edges.
+         *
+         * @ignore
          */
         get: function () {
             return this._cache.spatialEdges$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "userKey", {
@@ -34142,7 +50124,7 @@ var Node = (function () {
         get: function () {
             return this._fill.user.key;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "username", {
@@ -34155,7 +50137,7 @@ var Node = (function () {
         get: function () {
             return this._fill.user.username;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Node.prototype, "width", {
@@ -34168,7 +50150,7 @@ var Node = (function () {
         get: function () {
             return this._fill.width;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     /**
@@ -34179,20 +50161,31 @@ var Node = (function () {
      *
      * @returns {Observable<Node>} Observable emitting this node whenever the
      * load status has changed and when the mesh or image has been fully loaded.
+     *
+     * @ignore
      */
     Node.prototype.cacheAssets$ = function () {
         var _this = this;
-        return this._cache.cacheAssets$(this.key, this.pano, this.merged)
-            .map(function (cache) {
+        return this._cache.cacheAssets$(this.key, this.pano, this.merged).pipe(operators_1.map(function () {
             return _this;
-        });
+        }));
     };
+    /**
+     * Cache the image asset.
+     *
+     * @description Use for caching a differently sized image than
+     * the one currently held by the node.
+     *
+     * @returns {Observable<Node>} Observable emitting this node whenever the
+     * load status has changed and when the mesh or image has been fully loaded.
+     *
+     * @ignore
+     */
     Node.prototype.cacheImage$ = function (imageSize) {
         var _this = this;
-        return this._cache.cacheImage$(this.key, imageSize)
-            .map(function (cache) {
+        return this._cache.cacheImage$(this.key, imageSize).pipe(operators_1.map(function () {
             return _this;
-        });
+        }));
     };
     /**
      * Cache the sequence edges.
@@ -34201,6 +50194,7 @@ var Node = (function () {
      * internally by the library.
      *
      * @param {Array<IEdge>} edges - Sequence edges to cache.
+     * @ignore
      */
     Node.prototype.cacheSequenceEdges = function (edges) {
         this._cache.cacheSequenceEdges(edges);
@@ -34212,6 +50206,7 @@ var Node = (function () {
      * internally by the library.
      *
      * @param {Array<IEdge>} edges - Spatial edges to cache.
+     * @ignore
      */
     Node.prototype.cacheSpatialEdges = function (edges) {
         this._cache.cacheSpatialEdges(edges);
@@ -34220,6 +50215,7 @@ var Node = (function () {
      * Dispose the node.
      *
      * @description Disposes all cached assets.
+     * @ignore
      */
     Node.prototype.dispose = function () {
         if (this._cache != null) {
@@ -34236,6 +50232,7 @@ var Node = (function () {
      * the library.
      *
      * @param {NodeCache} cache - The node cache to set as cache.
+     * @ignore
      */
     Node.prototype.initializeCache = function (cache) {
         if (this._cache != null) {
@@ -34250,6 +50247,7 @@ var Node = (function () {
      * the library.
      *
      * @param {IFillNode} fill - The fill node struct.
+     * @ignore
      */
     Node.prototype.makeFull = function (fill) {
         if (fill == null) {
@@ -34259,12 +50257,16 @@ var Node = (function () {
     };
     /**
      * Reset the sequence edges.
+     *
+     * @ignore
      */
     Node.prototype.resetSequenceEdges = function () {
         this._cache.resetSequenceEdges();
     };
     /**
      * Reset the spatial edges.
+     *
+     * @ignore
      */
     Node.prototype.resetSpatialEdges = function () {
         this._cache.resetSpatialEdges();
@@ -34272,6 +50274,8 @@ var Node = (function () {
     /**
      * Clears the image and mesh assets, aborts
      * any outstanding requests and resets edges.
+     *
+     * @ignore
      */
     Node.prototype.uncache = function () {
         if (this._cache == null) {
@@ -34285,14 +50289,13 @@ var Node = (function () {
 exports.Node = Node;
 exports.default = Node;
 
-},{"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/map":65}],318:[function(require,module,exports){
+},{"rxjs/operators":241}],431:[function(require,module,exports){
 (function (Buffer){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("rxjs/Subject");
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/publishReplay");
+exports.NodeCache = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var Graph_1 = require("../Graph");
 var Utils_1 = require("../Utils");
 /**
@@ -34300,7 +50303,7 @@ var Utils_1 = require("../Utils");
  *
  * @classdesc Represents the cached properties of a node.
  */
-var NodeCache = (function () {
+var NodeCache = /** @class */ (function () {
     /**
      * Create a new node cache instance.
      */
@@ -34311,17 +50314,14 @@ var NodeCache = (function () {
         this._mesh = null;
         this._sequenceEdges = { cached: false, edges: [] };
         this._spatialEdges = { cached: false, edges: [] };
-        this._sequenceEdgesChanged$ = new Subject_1.Subject();
-        this._sequenceEdges$ = this._sequenceEdgesChanged$
-            .startWith(this._sequenceEdges)
-            .publishReplay(1)
-            .refCount();
+        this._imageChanged$ = new rxjs_1.Subject();
+        this._image$ = this._imageChanged$.pipe(operators_1.startWith(null), operators_1.publishReplay(1), operators_1.refCount());
+        this._iamgeSubscription = this._image$.subscribe();
+        this._sequenceEdgesChanged$ = new rxjs_1.Subject();
+        this._sequenceEdges$ = this._sequenceEdgesChanged$.pipe(operators_1.startWith(this._sequenceEdges), operators_1.publishReplay(1), operators_1.refCount());
         this._sequenceEdgesSubscription = this._sequenceEdges$.subscribe(function () { });
-        this._spatialEdgesChanged$ = new Subject_1.Subject();
-        this._spatialEdges$ = this._spatialEdgesChanged$
-            .startWith(this._spatialEdges)
-            .publishReplay(1)
-            .refCount();
+        this._spatialEdgesChanged$ = new rxjs_1.Subject();
+        this._spatialEdges$ = this._spatialEdgesChanged$.pipe(operators_1.startWith(this._spatialEdges), operators_1.publishReplay(1), operators_1.refCount());
         this._spatialEdgesSubscription = this._spatialEdges$.subscribe(function () { });
         this._cachingAssets$ = null;
     }
@@ -34337,7 +50337,20 @@ var NodeCache = (function () {
         get: function () {
             return this._image;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(NodeCache.prototype, "image$", {
+        /**
+         * Get image$.
+         *
+         * @returns {Observable<HTMLImageElement>} Observable emitting
+         * the cached image when it is updated.
+         */
+        get: function () {
+            return this._image$;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(NodeCache.prototype, "loadStatus", {
@@ -34350,7 +50363,7 @@ var NodeCache = (function () {
         get: function () {
             return this._loadStatus;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(NodeCache.prototype, "mesh", {
@@ -34366,7 +50379,7 @@ var NodeCache = (function () {
         get: function () {
             return this._mesh;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(NodeCache.prototype, "sequenceEdges", {
@@ -34379,7 +50392,7 @@ var NodeCache = (function () {
         get: function () {
             return this._sequenceEdges;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(NodeCache.prototype, "sequenceEdges$", {
@@ -34392,7 +50405,7 @@ var NodeCache = (function () {
         get: function () {
             return this._sequenceEdges$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(NodeCache.prototype, "spatialEdges", {
@@ -34405,7 +50418,7 @@ var NodeCache = (function () {
         get: function () {
             return this._spatialEdges;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(NodeCache.prototype, "spatialEdges$", {
@@ -34418,7 +50431,7 @@ var NodeCache = (function () {
         get: function () {
             return this._spatialEdges$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     /**
@@ -34439,8 +50452,8 @@ var NodeCache = (function () {
         var imageSize = pano ?
             Utils_1.Settings.basePanoramaSize :
             Utils_1.Settings.baseImageSize;
-        this._cachingAssets$ = Observable_1.Observable
-            .combineLatest(this._cacheImage$(key, imageSize), this._cacheMesh$(key, merged), function (imageStatus, meshStatus) {
+        this._cachingAssets$ = rxjs_1.combineLatest(this._cacheImage$(key, imageSize), this._cacheMesh$(key, merged)).pipe(operators_1.map(function (_a) {
+            var imageStatus = _a[0], meshStatus = _a[1];
             _this._loadStatus.loaded = 0;
             _this._loadStatus.total = 0;
             if (meshStatus) {
@@ -34454,12 +50467,15 @@ var NodeCache = (function () {
                 _this._loadStatus.total += imageStatus.loaded.total;
             }
             return _this;
-        })
-            .finally(function () {
+        }), operators_1.finalize(function () {
             _this._cachingAssets$ = null;
-        })
-            .publishReplay(1)
-            .refCount();
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._cachingAssets$.pipe(operators_1.first(function (nodeCache) {
+            return !!nodeCache._image;
+        }))
+            .subscribe(function (nodeCache) {
+            _this._imageChanged$.next(_this._image);
+        }, function (error) { });
         return this._cachingAssets$;
     };
     /**
@@ -34475,19 +50491,21 @@ var NodeCache = (function () {
     NodeCache.prototype.cacheImage$ = function (key, imageSize) {
         var _this = this;
         if (this._image != null && imageSize <= Math.max(this._image.width, this._image.height)) {
-            return Observable_1.Observable.of(this);
+            return rxjs_1.of(this);
         }
-        return this._cacheImage$(key, imageSize)
-            .first(function (status) {
+        var cacheImage$ = this._cacheImage$(key, imageSize).pipe(operators_1.first(function (status) {
             return status.object != null;
-        })
-            .do(function (status) {
+        }), operators_1.tap(function (status) {
             _this._disposeImage();
             _this._image = status.object;
-        })
-            .map(function (imageStatus) {
+        }), operators_1.map(function (imageStatus) {
             return _this;
-        });
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        cacheImage$
+            .subscribe(function (nodeCache) {
+            _this._imageChanged$.next(_this._image);
+        }, function (error) { });
+        return cacheImage$;
     };
     /**
      * Cache the sequence edges.
@@ -34514,6 +50532,7 @@ var NodeCache = (function () {
      * all streams.
      */
     NodeCache.prototype.dispose = function () {
+        this._iamgeSubscription.unsubscribe();
         this._sequenceEdgesSubscription.unsubscribe();
         this._spatialEdgesSubscription.unsubscribe();
         this._disposeImage();
@@ -34522,6 +50541,7 @@ var NodeCache = (function () {
         this._loadStatus.total = 0;
         this._sequenceEdges = { cached: false, edges: [] };
         this._spatialEdges = { cached: false, edges: [] };
+        this._imageChanged$.next(null);
         this._sequenceEdgesChanged$.next(this._sequenceEdges);
         this._spatialEdgesChanged$.next(this._spatialEdges);
         this._disposed = true;
@@ -34557,9 +50577,9 @@ var NodeCache = (function () {
      */
     NodeCache.prototype._cacheImage$ = function (key, imageSize) {
         var _this = this;
-        return Observable_1.Observable.create(function (subscriber) {
+        return rxjs_1.Observable.create(function (subscriber) {
             var xmlHTTP = new XMLHttpRequest();
-            xmlHTTP.open("GET", Utils_1.Urls.thumbnail(key, imageSize), true);
+            xmlHTTP.open("GET", Utils_1.Urls.thumbnail(key, imageSize, Utils_1.Urls.origin), true);
             xmlHTTP.responseType = "arraybuffer";
             xmlHTTP.timeout = 15000;
             xmlHTTP.onload = function (pe) {
@@ -34620,7 +50640,7 @@ var NodeCache = (function () {
      */
     NodeCache.prototype._cacheMesh$ = function (key, merged) {
         var _this = this;
-        return Observable_1.Observable.create(function (subscriber) {
+        return rxjs_1.Observable.create(function (subscriber) {
             if (!merged) {
                 subscriber.next(_this._createEmptyMeshLoadStatus());
                 subscriber.complete();
@@ -34692,17 +50712,16 @@ exports.default = NodeCache;
 
 }).call(this,require("buffer").Buffer)
 
-},{"../Graph":230,"../Utils":235,"buffer":7,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/publishReplay":72}],319:[function(require,module,exports){
+},{"../Graph":295,"../Utils":301,"buffer":6,"rxjs":43,"rxjs/operators":241}],432:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
-var _ = require("underscore");
+exports.Sequence = void 0;
 /**
  * @class Sequence
  *
  * @classdesc Represents a sequence of ordered nodes.
  */
-var Sequence = (function () {
+var Sequence = /** @class */ (function () {
     /**
      * Create a new sequene instance.
      *
@@ -34721,7 +50740,7 @@ var Sequence = (function () {
         get: function () {
             return this._key;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Sequence.prototype, "keys", {
@@ -34733,7 +50752,7 @@ var Sequence = (function () {
         get: function () {
             return this._keys;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     /**
@@ -34753,7 +50772,7 @@ var Sequence = (function () {
      * @returns {string} Next key in sequence if it exists, null otherwise.
      */
     Sequence.prototype.findNextKey = function (key) {
-        var i = _.indexOf(this._keys, key);
+        var i = this._keys.indexOf(key);
         if ((i + 1) >= this._keys.length || i === -1) {
             return null;
         }
@@ -34769,7 +50788,7 @@ var Sequence = (function () {
      * @returns {string} Previous key in sequence if it exists, null otherwise.
      */
     Sequence.prototype.findPrevKey = function (key) {
-        var i = _.indexOf(this._keys, key);
+        var i = this._keys.indexOf(key);
         if (i === 0 || i === -1) {
             return null;
         }
@@ -34782,10 +50801,10 @@ var Sequence = (function () {
 exports.Sequence = Sequence;
 exports.default = Sequence;
 
-},{"underscore":178}],320:[function(require,module,exports){
+},{}],433:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.EdgeCalculator = void 0;
 var THREE = require("three");
 var Edge_1 = require("../../Edge");
 var Error_1 = require("../../Error");
@@ -34795,7 +50814,7 @@ var Geo_1 = require("../../Geo");
  *
  * @classdesc Represents a class for calculating node edges.
  */
-var EdgeCalculator = (function () {
+var EdgeCalculator = /** @class */ (function () {
     /**
      * Create a new edge calculator instance.
      *
@@ -34939,8 +50958,7 @@ var EdgeCalculator = (function () {
             if (potentialEdge.sequenceKey == null) {
                 continue;
             }
-            if (potentialEdge.sameSequence ||
-                !potentialEdge.sameMergeCC) {
+            if (potentialEdge.sameSequence) {
                 continue;
             }
             if (nodeFullPano) {
@@ -35385,10 +51403,11 @@ var EdgeCalculator = (function () {
 exports.EdgeCalculator = EdgeCalculator;
 exports.default = EdgeCalculator;
 
-},{"../../Edge":227,"../../Error":228,"../../Geo":229,"three":176}],321:[function(require,module,exports){
+},{"../../Edge":292,"../../Error":293,"../../Geo":294,"three":242}],434:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var EdgeCalculatorCoefficients = (function () {
+exports.EdgeCalculatorCoefficients = void 0;
+var EdgeCalculatorCoefficients = /** @class */ (function () {
     function EdgeCalculatorCoefficients() {
         this.panoPreferredDistance = 2;
         this.panoMotion = 2;
@@ -35411,11 +51430,12 @@ var EdgeCalculatorCoefficients = (function () {
 exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients;
 exports.default = EdgeCalculatorCoefficients;
 
-},{}],322:[function(require,module,exports){
+},{}],435:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.EdgeCalculatorDirections = void 0;
 var Edge_1 = require("../../Edge");
-var EdgeCalculatorDirections = (function () {
+var EdgeCalculatorDirections = /** @class */ (function () {
     function EdgeCalculatorDirections() {
         this.steps = {};
         this.turns = {};
@@ -35484,10 +51504,11 @@ var EdgeCalculatorDirections = (function () {
 }());
 exports.EdgeCalculatorDirections = EdgeCalculatorDirections;
 
-},{"../../Edge":227}],323:[function(require,module,exports){
+},{"../../Edge":292}],436:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var EdgeCalculatorSettings = (function () {
+exports.EdgeCalculatorSettings = void 0;
+var EdgeCalculatorSettings = /** @class */ (function () {
     function EdgeCalculatorSettings() {
         this.panoMinDistance = 0.1;
         this.panoMaxDistance = 20;
@@ -35513,7 +51534,7 @@ var EdgeCalculatorSettings = (function () {
         get: function () {
             return Math.max(this.panoMaxDistance, this.similarMaxDistance, this.stepMaxDistance, this.turnMaxDistance);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     return EdgeCalculatorSettings;
@@ -35521,9 +51542,10 @@ var EdgeCalculatorSettings = (function () {
 exports.EdgeCalculatorSettings = EdgeCalculatorSettings;
 exports.default = EdgeCalculatorSettings;
 
-},{}],324:[function(require,module,exports){
+},{}],437:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.EdgeDirection = void 0;
 /**
  * Enumeration for edge directions
  * @enum {number}
@@ -35579,42 +51601,42 @@ var EdgeDirection;
     EdgeDirection[EdgeDirection["Similar"] = 10] = "Similar";
 })(EdgeDirection = exports.EdgeDirection || (exports.EdgeDirection = {}));
 
-},{}],325:[function(require,module,exports){
+},{}],438:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
-var _ = require("underscore");
+
+},{}],439:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}],440:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DOMRenderer = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var vd = require("virtual-dom");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/combineLatest");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/pluck");
-require("rxjs/add/operator/scan");
+var rxjs_2 = require("rxjs");
 var Render_1 = require("../Render");
-var DOMRenderer = (function () {
+var DOMRenderer = /** @class */ (function () {
     function DOMRenderer(element, renderService, currentFrame$) {
-        this._adaptiveOperation$ = new Subject_1.Subject();
-        this._render$ = new Subject_1.Subject();
-        this._renderAdaptive$ = new Subject_1.Subject();
+        this._adaptiveOperation$ = new rxjs_2.Subject();
+        this._render$ = new rxjs_2.Subject();
+        this._renderAdaptive$ = new rxjs_2.Subject();
         this._renderService = renderService;
         this._currentFrame$ = currentFrame$;
         var rootNode = vd.create(vd.h("div.domRenderer", []));
         element.appendChild(rootNode);
-        this._offset$ = this._adaptiveOperation$
-            .scan(function (adaptive, operation) {
+        this._offset$ = this._adaptiveOperation$.pipe(operators_1.scan(function (adaptive, operation) {
             return operation(adaptive);
         }, {
             elementHeight: element.offsetHeight,
             elementWidth: element.offsetWidth,
             imageAspect: 0,
             renderMode: Render_1.RenderMode.Fill,
-        })
-            .filter(function (adaptive) {
+        }), operators_1.filter(function (adaptive) {
             return adaptive.imageAspect > 0 && adaptive.elementWidth > 0 && adaptive.elementHeight > 0;
-        })
-            .map(function (adaptive) {
+        }), operators_1.map(function (adaptive) {
             var elementAspect = adaptive.elementWidth / adaptive.elementHeight;
             var ratio = adaptive.imageAspect / elementAspect;
             var verticalOffset = 0;
@@ -35641,28 +51663,23 @@ var DOMRenderer = (function () {
                 right: horizontalOffset,
                 top: verticalOffset,
             };
-        });
-        this._currentFrame$
-            .filter(function (frame) {
+        }));
+        this._currentFrame$.pipe(operators_1.filter(function (frame) {
             return frame.state.currentNode != null;
-        })
-            .distinctUntilChanged(function (k1, k2) {
+        }), operators_1.distinctUntilChanged(function (k1, k2) {
             return k1 === k2;
         }, function (frame) {
             return frame.state.currentNode.key;
-        })
-            .map(function (frame) {
+        }), operators_1.map(function (frame) {
             return frame.state.currentTransform.basicAspect;
-        })
-            .map(function (aspect) {
+        }), operators_1.map(function (aspect) {
             return function (adaptive) {
                 adaptive.imageAspect = aspect;
                 return adaptive;
             };
-        })
+        }))
             .subscribe(this._adaptiveOperation$);
-        this._renderAdaptive$
-            .scan(function (vNodeHashes, vNodeHash) {
+        rxjs_1.combineLatest(this._renderAdaptive$.pipe(operators_1.scan(function (vNodeHashes, vNodeHash) {
             if (vNodeHash.vnode == null) {
                 delete vNodeHashes[vNodeHash.name];
             }
@@ -35670,10 +51687,15 @@ var DOMRenderer = (function () {
                 vNodeHashes[vNodeHash.name] = vNodeHash.vnode;
             }
             return vNodeHashes;
-        }, {})
-            .combineLatest(this._offset$)
-            .map(function (vo) {
-            var vNodes = _.values(vo[0]);
+        }, {})), this._offset$).pipe(operators_1.map(function (vo) {
+            var vNodes = [];
+            var hashes = vo[0];
+            for (var name_1 in hashes) {
+                if (!hashes.hasOwnProperty(name_1)) {
+                    continue;
+                }
+                vNodes.push(hashes[name_1]);
+            }
             var offset = vo[1];
             var properties = {
                 style: {
@@ -35689,10 +51711,9 @@ var DOMRenderer = (function () {
                 name: "adaptiveDomRenderer",
                 vnode: vd.h("div.adaptiveDomRenderer", properties, vNodes),
             };
-        })
+        }))
             .subscribe(this._render$);
-        this._vNode$ = this._render$
-            .scan(function (vNodeHashes, vNodeHash) {
+        this._vNode$ = this._render$.pipe(operators_1.scan(function (vNodeHashes, vNodeHash) {
             if (vNodeHash.vnode == null) {
                 delete vNodeHashes[vNodeHash.name];
             }
@@ -35700,62 +51721,60 @@ var DOMRenderer = (function () {
                 vNodeHashes[vNodeHash.name] = vNodeHash.vnode;
             }
             return vNodeHashes;
-        }, {})
-            .map(function (vNodeHashes) {
-            var vNodes = _.values(vNodeHashes);
+        }, {}), operators_1.map(function (hashes) {
+            var vNodes = [];
+            for (var name_2 in hashes) {
+                if (!hashes.hasOwnProperty(name_2)) {
+                    continue;
+                }
+                vNodes.push(hashes[name_2]);
+            }
             return vd.h("div.domRenderer", vNodes);
-        });
-        this._vPatch$ = this._vNode$
-            .scan(function (nodePatch, vNode) {
+        }));
+        this._vPatch$ = this._vNode$.pipe(operators_1.scan(function (nodePatch, vNode) {
             nodePatch.vpatch = vd.diff(nodePatch.vnode, vNode);
             nodePatch.vnode = vNode;
             return nodePatch;
-        }, { vnode: vd.h("div.domRenderer", []), vpatch: null })
-            .pluck("vpatch");
-        this._element$ = this._vPatch$
-            .scan(function (oldElement, vPatch) {
+        }, { vnode: vd.h("div.domRenderer", []), vpatch: null }), operators_1.pluck("vpatch"));
+        this._element$ = this._vPatch$.pipe(operators_1.scan(function (oldElement, vPatch) {
             return vd.patch(oldElement, vPatch);
-        }, rootNode)
-            .publishReplay(1)
-            .refCount();
+        }, rootNode), operators_1.publishReplay(1), operators_1.refCount());
         this._element$.subscribe(function () { });
-        this._renderService.size$
-            .map(function (size) {
+        this._renderService.size$.pipe(operators_1.map(function (size) {
             return function (adaptive) {
                 adaptive.elementWidth = size.width;
                 adaptive.elementHeight = size.height;
                 return adaptive;
             };
-        })
+        }))
             .subscribe(this._adaptiveOperation$);
-        this._renderService.renderMode$
-            .map(function (renderMode) {
+        this._renderService.renderMode$.pipe(operators_1.map(function (renderMode) {
             return function (adaptive) {
                 adaptive.renderMode = renderMode;
                 return adaptive;
             };
-        })
+        }))
             .subscribe(this._adaptiveOperation$);
     }
     Object.defineProperty(DOMRenderer.prototype, "element$", {
         get: function () {
             return this._element$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(DOMRenderer.prototype, "render$", {
         get: function () {
             return this._render$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(DOMRenderer.prototype, "renderAdaptive$", {
         get: function () {
             return this._renderAdaptive$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     DOMRenderer.prototype.clear = function (name) {
@@ -35767,9 +51786,11 @@ var DOMRenderer = (function () {
 exports.DOMRenderer = DOMRenderer;
 exports.default = DOMRenderer;
 
-},{"../Render":232,"rxjs/Subject":34,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/pluck":70,"rxjs/add/operator/scan":73,"underscore":178,"virtual-dom":182}],326:[function(require,module,exports){
+
+},{"../Render":297,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],441:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.GLRenderStage = void 0;
 var GLRenderStage;
 (function (GLRenderStage) {
     GLRenderStage[GLRenderStage["Background"] = 0] = "Background";
@@ -35777,64 +51798,51 @@ var GLRenderStage;
 })(GLRenderStage = exports.GLRenderStage || (exports.GLRenderStage = {}));
 exports.default = GLRenderStage;
 
-},{}],327:[function(require,module,exports){
+},{}],442:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.GLRenderer = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var THREE = require("three");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/share");
-require("rxjs/add/operator/startWith");
 var Render_1 = require("../Render");
-var GLRenderer = (function () {
-    function GLRenderer(canvasContainer, renderService) {
+var Utils_1 = require("../Utils");
+var GLRenderer = /** @class */ (function () {
+    function GLRenderer(canvasContainer, renderService, dom) {
         var _this = this;
-        this._renderFrame$ = new Subject_1.Subject();
-        this._renderCameraOperation$ = new Subject_1.Subject();
-        this._render$ = new Subject_1.Subject();
-        this._clear$ = new Subject_1.Subject();
-        this._renderOperation$ = new Subject_1.Subject();
-        this._rendererOperation$ = new Subject_1.Subject();
-        this._eraserOperation$ = new Subject_1.Subject();
+        this._renderFrame$ = new rxjs_1.Subject();
+        this._renderCameraOperation$ = new rxjs_1.Subject();
+        this._render$ = new rxjs_1.Subject();
+        this._clear$ = new rxjs_1.Subject();
+        this._renderOperation$ = new rxjs_1.Subject();
+        this._rendererOperation$ = new rxjs_1.Subject();
+        this._eraserOperation$ = new rxjs_1.Subject();
         this._renderService = renderService;
-        this._renderer$ = this._rendererOperation$
-            .scan(function (renderer, operation) {
+        this._dom = !!dom ? dom : new Utils_1.DOM();
+        this._renderer$ = this._rendererOperation$.pipe(operators_1.scan(function (renderer, operation) {
             return operation(renderer);
-        }, { needsRender: false, renderer: null });
-        this._renderCollection$ = this._renderOperation$
-            .scan(function (hashes, operation) {
+        }, { needsRender: false, renderer: null }), operators_1.filter(function (renderer) {
+            return !!renderer.renderer;
+        }));
+        this._renderCollection$ = this._renderOperation$.pipe(operators_1.scan(function (hashes, operation) {
             return operation(hashes);
-        }, {})
-            .share();
-        this._renderCamera$ = this._renderCameraOperation$
-            .scan(function (rc, operation) {
+        }, {}), operators_1.share());
+        this._renderCamera$ = this._renderCameraOperation$.pipe(operators_1.scan(function (rc, operation) {
             return operation(rc);
-        }, { frameId: -1, needsRender: false, perspective: null });
-        this._eraser$ = this._eraserOperation$
-            .startWith(function (eraser) {
+        }, { frameId: -1, needsRender: false, perspective: null }));
+        this._eraser$ = this._eraserOperation$.pipe(operators_1.startWith(function (eraser) {
             return eraser;
-        })
-            .scan(function (eraser, operation) {
+        }), operators_1.scan(function (eraser, operation) {
             return operation(eraser);
-        }, { needsRender: false });
-        Observable_1.Observable
-            .combineLatest([this._renderer$, this._renderCollection$, this._renderCamera$, this._eraser$], function (renderer, hashes, rc, eraser) {
+        }, { needsRender: false }));
+        rxjs_1.combineLatest(this._renderer$, this._renderCollection$, this._renderCamera$, this._eraser$).pipe(operators_1.map(function (_a) {
+            var renderer = _a[0], hashes = _a[1], rc = _a[2], eraser = _a[3];
             var renders = Object.keys(hashes)
                 .map(function (key) {
                 return hashes[key];
             });
             return { camera: rc, eraser: eraser, renderer: renderer, renders: renders };
-        })
-            .filter(function (co) {
+        }), operators_1.filter(function (co) {
             var needsRender = co.renderer.needsRender ||
                 co.camera.needsRender ||
                 co.eraser.needsRender;
@@ -35847,12 +51855,11 @@ var GLRenderer = (function () {
                 needsRender = needsRender || render.needsRender;
             }
             return needsRender;
-        })
-            .distinctUntilChanged(function (n1, n2) {
+        }), operators_1.distinctUntilChanged(function (n1, n2) {
             return n1 === n2;
         }, function (co) {
             return co.eraser.needsRender ? -1 : co.camera.frameId;
-        })
+        }))
             .subscribe(function (co) {
             co.renderer.needsRender = false;
             co.camera.needsRender = false;
@@ -35881,8 +51888,7 @@ var GLRenderer = (function () {
                 render(perspectiveCamera, renderer);
             }
         });
-        this._renderFrame$
-            .map(function (rc) {
+        this._renderFrame$.pipe(operators_1.map(function (rc) {
             return function (irc) {
                 irc.frameId = rc.frameId;
                 irc.perspective = rc.perspective;
@@ -35891,53 +51897,45 @@ var GLRenderer = (function () {
                 }
                 return irc;
             };
-        })
+        }))
             .subscribe(this._renderCameraOperation$);
         this._renderFrameSubscribe();
-        var renderHash$ = this._render$
-            .map(function (hash) {
+        var renderHash$ = this._render$.pipe(operators_1.map(function (hash) {
             return function (hashes) {
                 hashes[hash.name] = hash.render;
                 return hashes;
             };
-        });
-        var clearHash$ = this._clear$
-            .map(function (name) {
+        }));
+        var clearHash$ = this._clear$.pipe(operators_1.map(function (name) {
             return function (hashes) {
                 delete hashes[name];
                 return hashes;
             };
-        });
-        Observable_1.Observable
-            .merge(renderHash$, clearHash$)
+        }));
+        rxjs_1.merge(renderHash$, clearHash$)
             .subscribe(this._renderOperation$);
-        this._webGLRenderer$ = this._render$
-            .first()
-            .map(function (hash) {
+        this._webGLRenderer$ = this._render$.pipe(operators_1.first(), operators_1.map(function (hash) {
+            var canvas = _this._dom.createElement("canvas", "mapillary-js-canvas");
+            canvas.style.position = "absolute";
+            canvas.setAttribute("tabindex", "0");
+            canvasContainer.appendChild(canvas);
             var element = renderService.element;
-            var webGLRenderer = new THREE.WebGLRenderer();
+            var webGLRenderer = new THREE.WebGLRenderer({ canvas: canvas });
             webGLRenderer.setPixelRatio(window.devicePixelRatio);
             webGLRenderer.setSize(element.offsetWidth, element.offsetHeight);
             webGLRenderer.setClearColor(new THREE.Color(0x202020), 1.0);
             webGLRenderer.autoClear = false;
-            webGLRenderer.domElement.style.position = "absolute";
-            canvasContainer.appendChild(webGLRenderer.domElement);
             return webGLRenderer;
-        })
-            .publishReplay(1)
-            .refCount();
+        }), operators_1.publishReplay(1), operators_1.refCount());
         this._webGLRenderer$.subscribe(function () { });
-        var createRenderer$ = this._webGLRenderer$
-            .first()
-            .map(function (webGLRenderer) {
+        var createRenderer$ = this._webGLRenderer$.pipe(operators_1.first(), operators_1.map(function (webGLRenderer) {
             return function (renderer) {
                 renderer.needsRender = true;
                 renderer.renderer = webGLRenderer;
                 return renderer;
             };
-        });
-        var resizeRenderer$ = this._renderService.size$
-            .map(function (size) {
+        }));
+        var resizeRenderer$ = this._renderService.size$.pipe(operators_1.map(function (size) {
             return function (renderer) {
                 if (renderer.renderer == null) {
                     return renderer;
@@ -35946,9 +51944,8 @@ var GLRenderer = (function () {
                 renderer.needsRender = true;
                 return renderer;
             };
-        });
-        var clearRenderer$ = this._clear$
-            .map(function (name) {
+        }));
+        var clearRenderer$ = this._clear$.pipe(operators_1.map(function (name) {
             return function (renderer) {
                 if (renderer.renderer == null) {
                     return renderer;
@@ -35956,15 +51953,12 @@ var GLRenderer = (function () {
                 renderer.needsRender = true;
                 return renderer;
             };
-        });
-        Observable_1.Observable
-            .merge(createRenderer$, resizeRenderer$, clearRenderer$)
+        }));
+        rxjs_1.merge(createRenderer$, resizeRenderer$, clearRenderer$)
             .subscribe(this._rendererOperation$);
-        var renderCollectionEmpty$ = this._renderCollection$
-            .filter(function (hashes) {
+        var renderCollectionEmpty$ = this._renderCollection$.pipe(operators_1.filter(function (hashes) {
             return Object.keys(hashes).length === 0;
-        })
-            .share();
+        }), operators_1.share());
         renderCollectionEmpty$
             .subscribe(function (hashes) {
             if (_this._renderFrameSubscription == null) {
@@ -35974,27 +51968,26 @@ var GLRenderer = (function () {
             _this._renderFrameSubscription = null;
             _this._renderFrameSubscribe();
         });
-        renderCollectionEmpty$
-            .map(function (hashes) {
+        renderCollectionEmpty$.pipe(operators_1.map(function (hashes) {
             return function (eraser) {
                 eraser.needsRender = true;
                 return eraser;
             };
-        })
+        }))
             .subscribe(this._eraserOperation$);
     }
     Object.defineProperty(GLRenderer.prototype, "render$", {
         get: function () {
             return this._render$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(GLRenderer.prototype, "webGLRenderer$", {
         get: function () {
             return this._webGLRenderer$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     GLRenderer.prototype.clear = function (name) {
@@ -36002,22 +51995,18 @@ var GLRenderer = (function () {
     };
     GLRenderer.prototype._renderFrameSubscribe = function () {
         var _this = this;
-        this._render$
-            .first()
-            .map(function (renderHash) {
+        this._render$.pipe(operators_1.first(), operators_1.map(function (renderHash) {
             return function (irc) {
                 irc.needsRender = true;
                 return irc;
             };
-        })
+        }))
             .subscribe(function (operation) {
             _this._renderCameraOperation$.next(operation);
         });
-        this._renderFrameSubscription = this._render$
-            .first()
-            .mergeMap(function (hash) {
+        this._renderFrameSubscription = this._render$.pipe(operators_1.first(), operators_1.mergeMap(function (hash) {
             return _this._renderService.renderCameraFrame$;
-        })
+        }))
             .subscribe(this._renderFrame$);
     };
     return GLRenderer;
@@ -36025,135 +52014,259 @@ var GLRenderer = (function () {
 exports.GLRenderer = GLRenderer;
 exports.default = GLRenderer;
 
-},{"../Render":232,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/scan":73,"rxjs/add/operator/share":74,"rxjs/add/operator/startWith":78,"three":176}],328:[function(require,module,exports){
+
+},{"../Render":297,"../Utils":301,"rxjs":43,"rxjs/operators":241,"three":242}],443:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.RenderCamera = void 0;
 var THREE = require("three");
 var Geo_1 = require("../Geo");
 var Render_1 = require("../Render");
-var RenderCamera = (function () {
+var State_1 = require("../State");
+var RenderCamera = /** @class */ (function () {
     function RenderCamera(elementWidth, elementHeight, renderMode) {
-        this.alpha = -1;
-        this.zoom = 0;
+        this._spatial = new Geo_1.Spatial();
+        this._viewportCoords = new Geo_1.ViewportCoords();
+        this._initialFov = 50;
+        this._alpha = -1;
+        this._renderMode = renderMode;
+        this._zoom = 0;
         this._frameId = -1;
         this._changed = false;
         this._changedForFrame = -1;
-        this.currentAspect = 1;
-        this.currentPano = false;
-        this.previousAspect = 1;
-        this.previousPano = false;
-        this.renderMode = renderMode;
-        this._spatial = new Geo_1.Spatial();
+        this._currentNodeId = null;
+        this._previousNodeId = null;
+        this._currentPano = false;
+        this._previousPano = false;
+        this._state = null;
+        this._currentProjectedPoints = [];
+        this._previousProjectedPoints = [];
+        this._currentFov = this._initialFov;
+        this._previousFov = this._initialFov;
         this._camera = new Geo_1.Camera();
-        var perspectiveCameraAspect = this._getPerspectiveCameraAspect(elementWidth, elementHeight);
-        this._perspective = new THREE.PerspectiveCamera(50, perspectiveCameraAspect, 0.4, 10000);
+        this._perspective = new THREE.PerspectiveCamera(this._initialFov, this._computeAspect(elementWidth, elementHeight), 0.16, 10000);
         this._perspective.matrixAutoUpdate = false;
         this._rotation = { phi: 0, theta: 0 };
     }
+    Object.defineProperty(RenderCamera.prototype, "alpha", {
+        get: function () {
+            return this._alpha;
+        },
+        enumerable: false,
+        configurable: true
+    });
     Object.defineProperty(RenderCamera.prototype, "camera", {
         get: function () {
             return this._camera;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(RenderCamera.prototype, "changed", {
         get: function () {
-            return this.frameId === this._changedForFrame;
+            return this._frameId === this._changedForFrame;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(RenderCamera.prototype, "frameId", {
         get: function () {
             return this._frameId;
         },
-        set: function (value) {
-            this._frameId = value;
-            if (this._changed) {
-                this._changed = false;
-                this._changedForFrame = value;
-            }
-        },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(RenderCamera.prototype, "perspective", {
         get: function () {
             return this._perspective;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RenderCamera.prototype, "renderMode", {
+        get: function () {
+            return this._renderMode;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(RenderCamera.prototype, "rotation", {
         get: function () {
             return this._rotation;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    RenderCamera.prototype.updateAspect = function (elementWidth, elementHeight) {
-        var perspectiveCameraAspect = this._getPerspectiveCameraAspect(elementWidth, elementHeight);
-        this._perspective.aspect = perspectiveCameraAspect;
+    Object.defineProperty(RenderCamera.prototype, "zoom", {
+        get: function () {
+            return this._zoom;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    RenderCamera.prototype.getTilt = function () {
+        return 90 - this._spatial.radToDeg(this._rotation.theta);
+    };
+    RenderCamera.prototype.fovToZoom = function (fov) {
+        fov = Math.min(90, Math.max(0, fov));
+        var currentFov = this._computeCurrentFov(0);
+        var actualFov = this._alpha === 1 ?
+            currentFov :
+            this._interpolateFov(currentFov, this._computePreviousFov(0), this._alpha);
+        var y0 = Math.tan(actualFov / 2 * Math.PI / 180);
+        var y1 = Math.tan(fov / 2 * Math.PI / 180);
+        var zoom = Math.log(y0 / y1) / Math.log(2);
+        return zoom;
+    };
+    RenderCamera.prototype.setFrame = function (frame) {
+        var state = frame.state;
+        if (state.state !== this._state) {
+            this._state = state.state;
+            this._changed = true;
+        }
+        var currentNodeId = state.currentNode.key;
+        var previousNodeId = !!state.previousNode ? state.previousNode.key : null;
+        if (currentNodeId !== this._currentNodeId) {
+            this._currentNodeId = currentNodeId;
+            this._currentPano = !!state.currentTransform.gpano;
+            this._currentProjectedPoints = this._computeProjectedPoints(state.currentTransform);
+            this._changed = true;
+        }
+        if (previousNodeId !== this._previousNodeId) {
+            this._previousNodeId = previousNodeId;
+            this._previousPano = !!state.previousTransform.gpano;
+            this._previousProjectedPoints = this._computeProjectedPoints(state.previousTransform);
+            this._changed = true;
+        }
+        var zoom = state.zoom;
+        if (zoom !== this._zoom) {
+            this._zoom = zoom;
+            this._changed = true;
+        }
+        if (this._changed) {
+            this._currentFov = this._computeCurrentFov(this.zoom);
+            this._previousFov = this._computePreviousFov(this._zoom);
+        }
+        var alpha = state.alpha;
+        if (this._changed || alpha !== this._alpha) {
+            this._alpha = alpha;
+            this._perspective.fov = this._state === State_1.State.Earth ?
+                60 :
+                this._interpolateFov(this._currentFov, this._previousFov, this._alpha);
+            this._changed = true;
+        }
+        var camera = state.camera;
+        if (this._camera.diff(camera) > 1e-9) {
+            this._camera.copy(camera);
+            this._rotation = this._computeRotation(camera);
+            this._perspective.up.copy(camera.up);
+            this._perspective.position.copy(camera.position);
+            // Workaround for shaking camera
+            this._perspective.matrixAutoUpdate = true;
+            this._perspective.lookAt(camera.lookat);
+            this._perspective.matrixAutoUpdate = false;
+            this._perspective.updateMatrix();
+            this._perspective.updateMatrixWorld(false);
+            this._changed = true;
+        }
+        if (this._changed) {
+            this._perspective.updateProjectionMatrix();
+        }
+        this._setFrameId(frame.id);
+    };
+    RenderCamera.prototype.setRenderMode = function (renderMode) {
+        this._renderMode = renderMode;
+        this._perspective.fov = this._computeFov();
+        this._perspective.updateProjectionMatrix();
         this._changed = true;
     };
-    RenderCamera.prototype.updateProjection = function () {
-        var currentAspect = this._getAspect(this.currentAspect, this.currentPano, this.perspective.aspect);
-        var previousAspect = this._getAspect(this.previousAspect, this.previousPano, this.perspective.aspect);
-        var aspect = (1 - this.alpha) * previousAspect + this.alpha * currentAspect;
-        var verticalFov = this._getVerticalFov(aspect, this._camera.focal, this.zoom);
-        this._perspective.fov = verticalFov;
+    RenderCamera.prototype.setSize = function (size) {
+        this._perspective.aspect = this._computeAspect(size.width, size.height);
+        this._perspective.fov = this._computeFov();
         this._perspective.updateProjectionMatrix();
         this._changed = true;
     };
-    RenderCamera.prototype.updatePerspective = function (camera) {
-        this._perspective.up.copy(camera.up);
-        this._perspective.position.copy(camera.position);
-        this._perspective.lookAt(camera.lookat);
-        this._perspective.updateMatrix();
-        this._perspective.updateMatrixWorld(false);
-        this._changed = true;
+    RenderCamera.prototype._computeAspect = function (elementWidth, elementHeight) {
+        return elementWidth === 0 ? 0 : elementWidth / elementHeight;
     };
-    RenderCamera.prototype.updateRotation = function (camera) {
-        this._rotation = this._getRotation(camera);
+    RenderCamera.prototype._computeCurrentFov = function (zoom) {
+        if (this._perspective.aspect === 0) {
+            return 0;
+        }
+        if (!this._currentNodeId) {
+            return this._initialFov;
+        }
+        return this._currentPano ?
+            this._yToFov(1, zoom) :
+            this._computeVerticalFov(this._currentProjectedPoints, this._renderMode, zoom, this.perspective.aspect);
     };
-    RenderCamera.prototype._getVerticalFov = function (aspect, focal, zoom) {
-        return 2 * Math.atan(0.5 / (Math.pow(2, zoom) * aspect * focal)) * 180 / Math.PI;
+    RenderCamera.prototype._computeFov = function () {
+        this._currentFov = this._computeCurrentFov(this._zoom);
+        this._previousFov = this._computePreviousFov(this._zoom);
+        return this._interpolateFov(this._currentFov, this._previousFov, this._alpha);
     };
-    RenderCamera.prototype._getAspect = function (nodeAspect, pano, perspectiveCameraAspect) {
-        if (pano) {
-            return 1;
+    RenderCamera.prototype._computePreviousFov = function (zoom) {
+        if (this._perspective.aspect === 0) {
+            return 0;
+        }
+        if (!this._currentNodeId) {
+            return this._initialFov;
         }
-        var coeff = Math.max(1, 1 / nodeAspect);
-        var usePerspective = this.renderMode === Render_1.RenderMode.Letterbox ?
-            nodeAspect > perspectiveCameraAspect :
-            nodeAspect < perspectiveCameraAspect;
-        var aspect = usePerspective ?
-            coeff * perspectiveCameraAspect :
-            coeff * nodeAspect;
-        return aspect;
+        return !this._previousNodeId ?
+            this._currentFov :
+            this._previousPano ?
+                this._yToFov(1, zoom) :
+                this._computeVerticalFov(this._previousProjectedPoints, this._renderMode, zoom, this.perspective.aspect);
     };
-    RenderCamera.prototype._getPerspectiveCameraAspect = function (elementWidth, elementHeight) {
-        return elementWidth === 0 ? 0 : elementWidth / elementHeight;
+    RenderCamera.prototype._computeProjectedPoints = function (transform) {
+        var vertices = [[0.5, 0], [1, 0]];
+        var directions = [[0.5, 0], [0, 0.5]];
+        var pointsPerLine = 100;
+        return Geo_1.Geo.computeProjectedPoints(transform, vertices, directions, pointsPerLine, this._viewportCoords);
+    };
+    RenderCamera.prototype._computeRequiredVerticalFov = function (projectedPoint, zoom, aspect) {
+        var maxY = Math.max(projectedPoint[0] / aspect, projectedPoint[1]);
+        return this._yToFov(maxY, zoom);
     };
-    RenderCamera.prototype._getRotation = function (camera) {
+    RenderCamera.prototype._computeRotation = function (camera) {
         var direction = camera.lookat.clone().sub(camera.position);
         var up = camera.up.clone();
-        var upProjection = direction.clone().dot(up);
-        var planeProjection = direction.clone().sub(up.clone().multiplyScalar(upProjection));
-        var phi = Math.atan2(planeProjection.y, planeProjection.x);
+        var phi = this._spatial.azimuthal(direction.toArray(), up.toArray());
         var theta = Math.PI / 2 - this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);
         return { phi: phi, theta: theta };
     };
+    RenderCamera.prototype._computeVerticalFov = function (projectedPoints, renderMode, zoom, aspect) {
+        var _this = this;
+        var fovs = projectedPoints
+            .map(function (projectedPoint) {
+            return _this._computeRequiredVerticalFov(projectedPoint, zoom, aspect);
+        });
+        var fov = renderMode === Render_1.RenderMode.Fill ?
+            Math.min.apply(Math, fovs) * 0.995 : Math.max.apply(Math, fovs);
+        return fov;
+    };
+    RenderCamera.prototype._yToFov = function (y, zoom) {
+        return 2 * Math.atan(y / Math.pow(2, zoom)) * 180 / Math.PI;
+    };
+    RenderCamera.prototype._interpolateFov = function (v1, v2, alpha) {
+        return alpha * v1 + (1 - alpha) * v2;
+    };
+    RenderCamera.prototype._setFrameId = function (frameId) {
+        this._frameId = frameId;
+        if (this._changed) {
+            this._changed = false;
+            this._changedForFrame = frameId;
+        }
+    };
     return RenderCamera;
 }());
 exports.RenderCamera = RenderCamera;
 exports.default = RenderCamera;
 
-},{"../Geo":229,"../Render":232,"three":176}],329:[function(require,module,exports){
+},{"../Geo":294,"../Render":297,"../State":298,"three":242}],444:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.RenderMode = void 0;
 /**
  * Enumeration for render mode
  * @enum {number}
@@ -36187,120 +52300,64 @@ var RenderMode;
 })(RenderMode = exports.RenderMode || (exports.RenderMode = {}));
 exports.default = RenderMode;
 
-},{}],330:[function(require,module,exports){
-"use strict";
-/// <reference path="../../typings/index.d.ts" />
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("rxjs/Subject");
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/skip");
-require("rxjs/add/operator/startWith");
-require("rxjs/add/operator/withLatestFrom");
+},{}],445:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.RenderService = void 0;
+var operators_1 = require("rxjs/operators");
+var rxjs_1 = require("rxjs");
 var Geo_1 = require("../Geo");
 var Render_1 = require("../Render");
-var RenderService = (function () {
-    function RenderService(element, currentFrame$, renderMode) {
+var RenderService = /** @class */ (function () {
+    function RenderService(element, currentFrame$, renderMode, renderCamera) {
         var _this = this;
         this._element = element;
         this._currentFrame$ = currentFrame$;
         this._spatial = new Geo_1.Spatial();
         renderMode = renderMode != null ? renderMode : Render_1.RenderMode.Fill;
-        this._resize$ = new Subject_1.Subject();
-        this._renderCameraOperation$ = new Subject_1.Subject();
+        this._resize$ = new rxjs_1.Subject();
+        this._renderCameraOperation$ = new rxjs_1.Subject();
         this._size$ =
-            new BehaviorSubject_1.BehaviorSubject({
+            new rxjs_1.BehaviorSubject({
                 height: this._element.offsetHeight,
                 width: this._element.offsetWidth,
             });
-        this._resize$
-            .map(function () {
+        this._resize$.pipe(operators_1.map(function () {
             return { height: _this._element.offsetHeight, width: _this._element.offsetWidth };
-        })
+        }))
             .subscribe(this._size$);
-        this._renderMode$ = new BehaviorSubject_1.BehaviorSubject(renderMode);
-        this._renderCameraHolder$ = this._renderCameraOperation$
-            .startWith(function (rc) {
+        this._renderMode$ = new rxjs_1.BehaviorSubject(renderMode);
+        this._renderCameraHolder$ = this._renderCameraOperation$.pipe(operators_1.startWith(function (rc) {
             return rc;
-        })
-            .scan(function (rc, operation) {
+        }), operators_1.scan(function (rc, operation) {
             return operation(rc);
-        }, new Render_1.RenderCamera(this._element.offsetWidth, this._element.offsetHeight, renderMode))
-            .publishReplay(1)
-            .refCount();
-        this._renderCameraFrame$ = this._currentFrame$
-            .withLatestFrom(this._renderCameraHolder$, function (frame, renderCamera) {
-            return [frame, renderCamera];
-        })
-            .do(function (args) {
-            var frame = args[0];
-            var rc = args[1];
-            var camera = frame.state.camera;
-            if (rc.alpha !== frame.state.alpha ||
-                rc.zoom !== frame.state.zoom ||
-                rc.camera.diff(camera) > 1e-9) {
-                var currentTransform = frame.state.currentTransform;
-                var previousTransform = frame.state.previousTransform != null ?
-                    frame.state.previousTransform :
-                    frame.state.currentTransform;
-                var previousNode = frame.state.previousNode != null ?
-                    frame.state.previousNode :
-                    frame.state.currentNode;
-                rc.currentAspect = currentTransform.basicAspect;
-                rc.currentPano = frame.state.currentNode.pano;
-                rc.previousAspect = previousTransform.basicAspect;
-                rc.previousPano = previousNode.pano;
-                rc.alpha = frame.state.alpha;
-                rc.zoom = frame.state.zoom;
-                rc.camera.copy(camera);
-                rc.updatePerspective(camera);
-                rc.updateRotation(camera);
-                rc.updateProjection();
-            }
-            rc.frameId = frame.id;
-        })
-            .map(function (args) {
+        }, !!renderCamera ? renderCamera : new Render_1.RenderCamera(this._element.offsetWidth, this._element.offsetHeight, renderMode)), operators_1.publishReplay(1), operators_1.refCount());
+        this._renderCameraFrame$ = this._currentFrame$.pipe(operators_1.withLatestFrom(this._renderCameraHolder$), operators_1.tap(function (_a) {
+            var frame = _a[0], rc = _a[1];
+            rc.setFrame(frame);
+        }), operators_1.map(function (args) {
             return args[1];
-        })
-            .publishReplay(1)
-            .refCount();
-        this._renderCamera$ = this._renderCameraFrame$
-            .filter(function (rc) {
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._renderCamera$ = this._renderCameraFrame$.pipe(operators_1.filter(function (rc) {
             return rc.changed;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._bearing$ = this._renderCamera$
-            .map(function (renderCamera) {
-            var bearing = _this._spatial.radToDeg(_this._spatial.azimuthalToBearing(renderCamera.rotation.phi));
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._bearing$ = this._renderCamera$.pipe(operators_1.map(function (rc) {
+            var bearing = _this._spatial.radToDeg(_this._spatial.azimuthalToBearing(rc.rotation.phi));
             return _this._spatial.wrap(bearing, 0, 360);
-        })
-            .publishReplay(1)
-            .refCount();
-        this._size$
-            .skip(1)
-            .map(function (size) {
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._size$.pipe(operators_1.skip(1), operators_1.map(function (size) {
             return function (rc) {
-                rc.updateAspect(size.width, size.height);
-                rc.updateProjection();
+                rc.setSize(size);
                 return rc;
             };
-        })
+        }))
             .subscribe(this._renderCameraOperation$);
-        this._renderMode$
-            .skip(1)
-            .map(function (rm) {
+        this._renderMode$.pipe(operators_1.skip(1), operators_1.map(function (rm) {
             return function (rc) {
-                rc.renderMode = rm;
-                rc.updateProjection();
+                rc.setRenderMode(rm);
                 return rc;
             };
-        })
+        }))
             .subscribe(this._renderCameraOperation$);
         this._bearing$.subscribe(function () { });
         this._renderCameraHolder$.subscribe(function () { });
@@ -36313,49 +52370,49 @@ var RenderService = (function () {
         get: function () {
             return this._bearing$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(RenderService.prototype, "element", {
         get: function () {
             return this._element;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(RenderService.prototype, "resize$", {
         get: function () {
             return this._resize$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(RenderService.prototype, "size$", {
         get: function () {
             return this._size$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(RenderService.prototype, "renderMode$", {
         get: function () {
             return this._renderMode$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(RenderService.prototype, "renderCameraFrame$", {
         get: function () {
             return this._renderCameraFrame$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(RenderService.prototype, "renderCamera$", {
         get: function () {
             return this._renderCamera$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     return RenderService;
@@ -36363,149 +52420,285 @@ var RenderService = (function () {
 exports.RenderService = RenderService;
 exports.default = RenderService;
 
-},{"../Geo":229,"../Render":232,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/skip":75,"rxjs/add/operator/startWith":78,"rxjs/add/operator/withLatestFrom":83}],331:[function(require,module,exports){
+
+},{"../Geo":294,"../Render":297,"rxjs":43,"rxjs/operators":241}],446:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}],447:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.FrameGenerator = void 0;
+var FrameGenerator = /** @class */ (function () {
+    function FrameGenerator(root) {
+        if (root.requestAnimationFrame) {
+            this._cancelAnimationFrame = root.cancelAnimationFrame.bind(root);
+            this._requestAnimationFrame = root.requestAnimationFrame.bind(root);
+        }
+        else if (root.mozRequestAnimationFrame) {
+            this._cancelAnimationFrame = root.mozCancelAnimationFrame.bind(root);
+            this._requestAnimationFrame = root.mozRequestAnimationFrame.bind(root);
+        }
+        else if (root.webkitRequestAnimationFrame) {
+            this._cancelAnimationFrame = root.webkitCancelAnimationFrame.bind(root);
+            this._requestAnimationFrame = root.webkitRequestAnimationFrame.bind(root);
+        }
+        else if (root.msRequestAnimationFrame) {
+            this._cancelAnimationFrame = root.msCancelAnimationFrame.bind(root);
+            this._requestAnimationFrame = root.msRequestAnimationFrame.bind(root);
+        }
+        else if (root.oRequestAnimationFrame) {
+            this._cancelAnimationFrame = root.oCancelAnimationFrame.bind(root);
+            this._requestAnimationFrame = root.oRequestAnimationFrame.bind(root);
+        }
+        else {
+            this._cancelAnimationFrame = root.clearTimeout.bind(root);
+            this._requestAnimationFrame = function (cb) { return root.setTimeout(cb, 1000 / 60); };
+        }
+    }
+    Object.defineProperty(FrameGenerator.prototype, "cancelAnimationFrame", {
+        get: function () {
+            return this._cancelAnimationFrame;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(FrameGenerator.prototype, "requestAnimationFrame", {
+        get: function () {
+            return this._requestAnimationFrame;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    return FrameGenerator;
+}());
+exports.FrameGenerator = FrameGenerator;
+exports.default = FrameGenerator;
+
+},{}],448:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.RotationDelta = void 0;
+var RotationDelta = /** @class */ (function () {
+    function RotationDelta(phi, theta) {
+        this._phi = phi;
+        this._theta = theta;
+    }
+    Object.defineProperty(RotationDelta.prototype, "phi", {
+        get: function () {
+            return this._phi;
+        },
+        set: function (value) {
+            this._phi = value;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RotationDelta.prototype, "theta", {
+        get: function () {
+            return this._theta;
+        },
+        set: function (value) {
+            this._theta = value;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(RotationDelta.prototype, "isZero", {
+        get: function () {
+            return this._phi === 0 && this._theta === 0;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    RotationDelta.prototype.copy = function (delta) {
+        this._phi = delta.phi;
+        this._theta = delta.theta;
+    };
+    RotationDelta.prototype.lerp = function (other, alpha) {
+        this._phi = (1 - alpha) * this._phi + alpha * other.phi;
+        this._theta = (1 - alpha) * this._theta + alpha * other.theta;
+    };
+    RotationDelta.prototype.multiply = function (value) {
+        this._phi *= value;
+        this._theta *= value;
+    };
+    RotationDelta.prototype.threshold = function (value) {
+        this._phi = Math.abs(this._phi) > value ? this._phi : 0;
+        this._theta = Math.abs(this._theta) > value ? this._theta : 0;
+    };
+    RotationDelta.prototype.lengthSquared = function () {
+        return this._phi * this._phi + this._theta * this._theta;
+    };
+    RotationDelta.prototype.reset = function () {
+        this._phi = 0;
+        this._theta = 0;
+    };
+    return RotationDelta;
+}());
+exports.RotationDelta = RotationDelta;
+exports.default = RotationDelta;
+
+},{}],449:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.State = void 0;
 var State;
 (function (State) {
-    State[State["Traversing"] = 0] = "Traversing";
-    State[State["Waiting"] = 1] = "Waiting";
+    State[State["Earth"] = 0] = "Earth";
+    State[State["Traversing"] = 1] = "Traversing";
+    State[State["Waiting"] = 2] = "Waiting";
+    State[State["WaitingInteractively"] = 3] = "WaitingInteractively";
 })(State = exports.State || (exports.State = {}));
 exports.default = State;
 
-},{}],332:[function(require,module,exports){
+},{}],450:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.StateContext = void 0;
 var State_1 = require("../State");
 var Geo_1 = require("../Geo");
-var StateContext = (function () {
-    function StateContext() {
+var StateContext = /** @class */ (function () {
+    function StateContext(transitionMode) {
         this._state = new State_1.TraversingState({
             alpha: 1,
             camera: new Geo_1.Camera(),
             currentIndex: -1,
             reference: { alt: 0, lat: 0, lon: 0 },
             trajectory: [],
+            transitionMode: transitionMode == null ? State_1.TransitionMode.Default : transitionMode,
             zoom: 0,
         });
     }
-    StateContext.prototype.traverse = function () {
-        this._state = this._state.traverse();
-    };
-    StateContext.prototype.wait = function () {
-        this._state = this._state.wait();
-    };
     Object.defineProperty(StateContext.prototype, "state", {
         get: function () {
-            if (this._state instanceof State_1.TraversingState) {
+            if (this._state instanceof State_1.EarthState) {
+                return State_1.State.Earth;
+            }
+            else if (this._state instanceof State_1.TraversingState) {
                 return State_1.State.Traversing;
             }
             else if (this._state instanceof State_1.WaitingState) {
                 return State_1.State.Waiting;
             }
+            else if (this._state instanceof State_1.InteractiveWaitingState) {
+                return State_1.State.WaitingInteractively;
+            }
             throw new Error("Invalid state");
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateContext.prototype, "reference", {
         get: function () {
             return this._state.reference;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateContext.prototype, "alpha", {
         get: function () {
             return this._state.alpha;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateContext.prototype, "camera", {
         get: function () {
             return this._state.camera;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateContext.prototype, "zoom", {
         get: function () {
             return this._state.zoom;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateContext.prototype, "currentNode", {
         get: function () {
             return this._state.currentNode;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateContext.prototype, "previousNode", {
         get: function () {
             return this._state.previousNode;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateContext.prototype, "currentCamera", {
         get: function () {
             return this._state.currentCamera;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateContext.prototype, "currentTransform", {
         get: function () {
             return this._state.currentTransform;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateContext.prototype, "previousTransform", {
         get: function () {
             return this._state.previousTransform;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateContext.prototype, "trajectory", {
         get: function () {
             return this._state.trajectory;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateContext.prototype, "currentIndex", {
         get: function () {
             return this._state.currentIndex;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateContext.prototype, "lastNode", {
         get: function () {
             return this._state.trajectory[this._state.trajectory.length - 1];
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateContext.prototype, "nodesAhead", {
         get: function () {
             return this._state.trajectory.length - 1 - this._state.currentIndex;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateContext.prototype, "motionless", {
         get: function () {
             return this._state.motionless;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
+    StateContext.prototype.earth = function () {
+        this._state = this._state.earth();
+    };
+    StateContext.prototype.traverse = function () {
+        this._state = this._state.traverse();
+    };
+    StateContext.prototype.wait = function () {
+        this._state = this._state.wait();
+    };
+    StateContext.prototype.waitInteractively = function () {
+        this._state = this._state.waitInteractively();
+    };
     StateContext.prototype.getCenter = function () {
         return this._state.getCenter();
     };
@@ -36542,12 +52735,21 @@ var StateContext = (function () {
     StateContext.prototype.rotate = function (delta) {
         this._state.rotate(delta);
     };
+    StateContext.prototype.rotateUnbounded = function (delta) {
+        this._state.rotateUnbounded(delta);
+    };
+    StateContext.prototype.rotateWithoutInertia = function (delta) {
+        this._state.rotateWithoutInertia(delta);
+    };
     StateContext.prototype.rotateBasic = function (basicRotation) {
         this._state.rotateBasic(basicRotation);
     };
     StateContext.prototype.rotateBasicUnbounded = function (basicRotation) {
         this._state.rotateBasicUnbounded(basicRotation);
     };
+    StateContext.prototype.rotateBasicWithoutInertia = function (basicRotation) {
+        this._state.rotateBasicWithoutInertia(basicRotation);
+    };
     StateContext.prototype.rotateToBasic = function (basic) {
         this._state.rotateToBasic(basic);
     };
@@ -36560,209 +52762,146 @@ var StateContext = (function () {
     StateContext.prototype.zoomIn = function (delta, reference) {
         this._state.zoomIn(delta, reference);
     };
+    StateContext.prototype.setSpeed = function (speed) {
+        this._state.setSpeed(speed);
+    };
+    StateContext.prototype.setTransitionMode = function (mode) {
+        this._state.setTransitionMode(mode);
+    };
+    StateContext.prototype.dolly = function (delta) {
+        this._state.dolly(delta);
+    };
+    StateContext.prototype.orbit = function (rotation) {
+        this._state.orbit(rotation);
+    };
+    StateContext.prototype.truck = function (direction) {
+        this._state.truck(direction);
+    };
     return StateContext;
 }());
 exports.StateContext = StateContext;
 
-},{"../Geo":229,"../State":233}],333:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-var Subject_1 = require("rxjs/Subject");
-var AnimationFrame_1 = require("rxjs/util/AnimationFrame");
-require("rxjs/add/operator/bufferCount");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/pairwise");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/startWith");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/withLatestFrom");
+},{"../Geo":294,"../State":298}],451:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.StateService = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var State_1 = require("../State");
-var StateService = (function () {
-    function StateService() {
+var StateService = /** @class */ (function () {
+    function StateService(transitionMode) {
         var _this = this;
-        this._appendNode$ = new Subject_1.Subject();
-        this._start$ = new Subject_1.Subject();
-        this._frame$ = new Subject_1.Subject();
+        this._appendNode$ = new rxjs_1.Subject();
+        this._start$ = new rxjs_1.Subject();
+        this._frame$ = new rxjs_1.Subject();
         this._fpsSampleRate = 30;
-        this._contextOperation$ = new BehaviorSubject_1.BehaviorSubject(function (context) {
+        this._contextOperation$ = new rxjs_1.BehaviorSubject(function (context) {
             return context;
         });
-        this._context$ = this._contextOperation$
-            .scan(function (context, operation) {
+        this._context$ = this._contextOperation$.pipe(operators_1.scan(function (context, operation) {
             return operation(context);
-        }, new State_1.StateContext())
-            .publishReplay(1)
-            .refCount();
-        this._state$ = this._context$
-            .map(function (context) {
+        }, new State_1.StateContext(transitionMode)), operators_1.publishReplay(1), operators_1.refCount());
+        this._state$ = this._context$.pipe(operators_1.map(function (context) {
             return context.state;
-        })
-            .distinctUntilChanged()
-            .publishReplay(1)
-            .refCount();
-        this._fps$ = this._start$
-            .switchMap(function () {
-            return _this._frame$
-                .bufferCount(1, _this._fpsSampleRate)
-                .map(function (frameIds) {
+        }), operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
+        this._fps$ = this._start$.pipe(operators_1.switchMap(function () {
+            return _this._frame$.pipe(operators_1.bufferCount(1, _this._fpsSampleRate), operators_1.map(function (frameIds) {
                 return new Date().getTime();
-            })
-                .pairwise()
-                .map(function (times) {
+            }), operators_1.pairwise(), operators_1.map(function (times) {
                 return Math.max(20, 1000 * _this._fpsSampleRate / (times[1] - times[0]));
-            })
-                .startWith(60);
-        })
-            .share();
-        this._currentState$ = this._frame$
-            .withLatestFrom(this._fps$, this._context$, function (frameId, fps, context) {
+            }), operators_1.startWith(60));
+        }), operators_1.share());
+        this._currentState$ = this._frame$.pipe(operators_1.withLatestFrom(this._fps$, this._context$, function (frameId, fps, context) {
             return [frameId, fps, context];
-        })
-            .filter(function (fc) {
+        }), operators_1.filter(function (fc) {
             return fc[2].currentNode != null;
-        })
-            .do(function (fc) {
+        }), operators_1.tap(function (fc) {
             fc[2].update(fc[1]);
-        })
-            .map(function (fc) {
+        }), operators_1.map(function (fc) {
             return { fps: fc[1], id: fc[0], state: fc[2] };
-        })
-            .share();
-        this._lastState$ = this._currentState$
-            .publishReplay(1)
-            .refCount();
-        var nodeChanged$ = this._currentState$
-            .distinctUntilChanged(undefined, function (f) {
+        }), operators_1.share());
+        this._lastState$ = this._currentState$.pipe(operators_1.publishReplay(1), operators_1.refCount());
+        var nodeChanged$ = this._currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (f) {
             return f.state.currentNode.key;
-        })
-            .publishReplay(1)
-            .refCount();
-        var nodeChangedSubject$ = new Subject_1.Subject();
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        var nodeChangedSubject$ = new rxjs_1.Subject();
         nodeChanged$
             .subscribe(nodeChangedSubject$);
-        this._currentKey$ = new BehaviorSubject_1.BehaviorSubject(null);
-        nodeChangedSubject$
-            .map(function (f) {
+        this._currentKey$ = new rxjs_1.BehaviorSubject(null);
+        nodeChangedSubject$.pipe(operators_1.map(function (f) {
             return f.state.currentNode.key;
-        })
+        }))
             .subscribe(this._currentKey$);
-        this._currentNode$ = nodeChangedSubject$
-            .map(function (f) {
+        this._currentNode$ = nodeChangedSubject$.pipe(operators_1.map(function (f) {
             return f.state.currentNode;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._currentCamera$ = nodeChangedSubject$
-            .map(function (f) {
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._currentCamera$ = nodeChangedSubject$.pipe(operators_1.map(function (f) {
             return f.state.currentCamera;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._currentTransform$ = nodeChangedSubject$
-            .map(function (f) {
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._currentTransform$ = nodeChangedSubject$.pipe(operators_1.map(function (f) {
             return f.state.currentTransform;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._reference$ = nodeChangedSubject$
-            .map(function (f) {
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._reference$ = nodeChangedSubject$.pipe(operators_1.map(function (f) {
             return f.state.reference;
-        })
-            .distinctUntilChanged(function (r1, r2) {
+        }), operators_1.distinctUntilChanged(function (r1, r2) {
             return r1.lat === r2.lat && r1.lon === r2.lon;
         }, function (reference) {
             return { lat: reference.lat, lon: reference.lon };
-        })
-            .publishReplay(1)
-            .refCount();
-        this._currentNodeExternal$ = nodeChanged$
-            .map(function (f) {
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._currentNodeExternal$ = nodeChanged$.pipe(operators_1.map(function (f) {
             return f.state.currentNode;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._appendNode$
-            .map(function (node) {
+        }), operators_1.publishReplay(1), operators_1.refCount());
+        this._appendNode$.pipe(operators_1.map(function (node) {
             return function (context) {
                 context.append([node]);
                 return context;
             };
-        })
+        }))
             .subscribe(this._contextOperation$);
-        this._inMotionOperation$ = new Subject_1.Subject();
-        nodeChanged$
-            .map(function (frame) {
+        this._inMotionOperation$ = new rxjs_1.Subject();
+        nodeChanged$.pipe(operators_1.map(function (frame) {
             return true;
-        })
+        }))
             .subscribe(this._inMotionOperation$);
-        this._inMotionOperation$
-            .distinctUntilChanged()
-            .filter(function (moving) {
+        this._inMotionOperation$.pipe(operators_1.distinctUntilChanged(), operators_1.filter(function (moving) {
             return moving;
-        })
-            .switchMap(function (moving) {
-            return _this._currentState$
-                .filter(function (frame) {
+        }), operators_1.switchMap(function (moving) {
+            return _this._currentState$.pipe(operators_1.filter(function (frame) {
                 return frame.state.nodesAhead === 0;
-            })
-                .map(function (frame) {
+            }), operators_1.map(function (frame) {
                 return [frame.state.camera.clone(), frame.state.zoom];
-            })
-                .pairwise()
-                .map(function (pair) {
+            }), operators_1.pairwise(), operators_1.map(function (pair) {
                 var c1 = pair[0][0];
                 var c2 = pair[1][0];
                 var z1 = pair[0][1];
                 var z2 = pair[1][1];
                 return c1.diff(c2) > 1e-5 || Math.abs(z1 - z2) > 1e-5;
-            })
-                .first(function (changed) {
+            }), operators_1.first(function (changed) {
                 return !changed;
-            });
-        })
+            }));
+        }))
             .subscribe(this._inMotionOperation$);
-        this._inMotion$ = this._inMotionOperation$
-            .distinctUntilChanged()
-            .publishReplay(1)
-            .refCount();
-        this._inTranslationOperation$ = new Subject_1.Subject();
-        nodeChanged$
-            .map(function (frame) {
+        this._inMotion$ = this._inMotionOperation$.pipe(operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
+        this._inTranslationOperation$ = new rxjs_1.Subject();
+        nodeChanged$.pipe(operators_1.map(function (frame) {
             return true;
-        })
+        }))
             .subscribe(this._inTranslationOperation$);
-        this._inTranslationOperation$
-            .distinctUntilChanged()
-            .filter(function (inTranslation) {
+        this._inTranslationOperation$.pipe(operators_1.distinctUntilChanged(), operators_1.filter(function (inTranslation) {
             return inTranslation;
-        })
-            .switchMap(function (inTranslation) {
-            return _this._currentState$
-                .filter(function (frame) {
+        }), operators_1.switchMap(function (inTranslation) {
+            return _this._currentState$.pipe(operators_1.filter(function (frame) {
                 return frame.state.nodesAhead === 0;
-            })
-                .map(function (frame) {
+            }), operators_1.map(function (frame) {
                 return frame.state.camera.position.clone();
-            })
-                .pairwise()
-                .map(function (pair) {
+            }), operators_1.pairwise(), operators_1.map(function (pair) {
                 return pair[0].distanceToSquared(pair[1]) !== 0;
-            })
-                .first(function (changed) {
+            }), operators_1.first(function (changed) {
                 return !changed;
-            });
-        })
+            }));
+        }))
             .subscribe(this._inTranslationOperation$);
-        this._inTranslation$ = this._inTranslationOperation$
-            .distinctUntilChanged()
-            .publishReplay(1)
-            .refCount();
+        this._inTranslation$ = this._inTranslationOperation$.pipe(operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
         this._state$.subscribe(function () { });
         this._currentNode$.subscribe(function () { });
         this._currentCamera$.subscribe(function () { });
@@ -36773,208 +52912,889 @@ var StateService = (function () {
         this._inMotion$.subscribe(function () { });
         this._inTranslation$.subscribe(function () { });
         this._frameId = null;
-        this._frameGenerator = new AnimationFrame_1.RequestAnimationFrameDefinition(window);
+        this._frameGenerator = new State_1.FrameGenerator(window);
     }
     Object.defineProperty(StateService.prototype, "currentState$", {
         get: function () {
             return this._currentState$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateService.prototype, "currentNode$", {
         get: function () {
             return this._currentNode$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateService.prototype, "currentKey$", {
         get: function () {
             return this._currentKey$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateService.prototype, "currentNodeExternal$", {
         get: function () {
             return this._currentNodeExternal$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateService.prototype, "currentCamera$", {
         get: function () {
             return this._currentCamera$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateService.prototype, "currentTransform$", {
         get: function () {
             return this._currentTransform$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateService.prototype, "state$", {
         get: function () {
             return this._state$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateService.prototype, "reference$", {
         get: function () {
             return this._reference$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateService.prototype, "inMotion$", {
         get: function () {
             return this._inMotion$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateService.prototype, "inTranslation$", {
         get: function () {
             return this._inTranslation$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateService.prototype, "appendNode$", {
         get: function () {
             return this._appendNode$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
+    StateService.prototype.earth = function () {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.earth(); });
+    };
     StateService.prototype.traverse = function () {
         this._inMotionOperation$.next(true);
         this._invokeContextOperation(function (context) { context.traverse(); });
     };
-    StateService.prototype.wait = function () {
-        this._invokeContextOperation(function (context) { context.wait(); });
+    StateService.prototype.wait = function () {
+        this._invokeContextOperation(function (context) { context.wait(); });
+    };
+    StateService.prototype.waitInteractively = function () {
+        this._invokeContextOperation(function (context) { context.waitInteractively(); });
+    };
+    StateService.prototype.appendNodes = function (nodes) {
+        this._invokeContextOperation(function (context) { context.append(nodes); });
+    };
+    StateService.prototype.prependNodes = function (nodes) {
+        this._invokeContextOperation(function (context) { context.prepend(nodes); });
+    };
+    StateService.prototype.removeNodes = function (n) {
+        this._invokeContextOperation(function (context) { context.remove(n); });
+    };
+    StateService.prototype.clearNodes = function () {
+        this._invokeContextOperation(function (context) { context.clear(); });
+    };
+    StateService.prototype.clearPriorNodes = function () {
+        this._invokeContextOperation(function (context) { context.clearPrior(); });
+    };
+    StateService.prototype.cutNodes = function () {
+        this._invokeContextOperation(function (context) { context.cut(); });
+    };
+    StateService.prototype.setNodes = function (nodes) {
+        this._invokeContextOperation(function (context) { context.set(nodes); });
+    };
+    StateService.prototype.rotate = function (delta) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.rotate(delta); });
+    };
+    StateService.prototype.rotateUnbounded = function (delta) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.rotateUnbounded(delta); });
+    };
+    StateService.prototype.rotateWithoutInertia = function (delta) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.rotateWithoutInertia(delta); });
+    };
+    StateService.prototype.rotateBasic = function (basicRotation) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.rotateBasic(basicRotation); });
+    };
+    StateService.prototype.rotateBasicUnbounded = function (basicRotation) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.rotateBasicUnbounded(basicRotation); });
+    };
+    StateService.prototype.rotateBasicWithoutInertia = function (basicRotation) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.rotateBasicWithoutInertia(basicRotation); });
+    };
+    StateService.prototype.rotateToBasic = function (basic) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.rotateToBasic(basic); });
+    };
+    StateService.prototype.move = function (delta) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.move(delta); });
+    };
+    StateService.prototype.moveTo = function (position) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.moveTo(position); });
+    };
+    StateService.prototype.dolly = function (delta) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.dolly(delta); });
+    };
+    StateService.prototype.orbit = function (rotation) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.orbit(rotation); });
+    };
+    StateService.prototype.truck = function (direction) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.truck(direction); });
+    };
+    /**
+     * Change zoom level while keeping the reference point position approximately static.
+     *
+     * @parameter {number} delta - Change in zoom level.
+     * @parameter {Array<number>} reference - Reference point in basic coordinates.
+     */
+    StateService.prototype.zoomIn = function (delta, reference) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.zoomIn(delta, reference); });
+    };
+    StateService.prototype.getCenter = function () {
+        return this._lastState$.pipe(operators_1.first(), operators_1.map(function (frame) {
+            return frame.state.getCenter();
+        }));
+    };
+    StateService.prototype.getZoom = function () {
+        return this._lastState$.pipe(operators_1.first(), operators_1.map(function (frame) {
+            return frame.state.zoom;
+        }));
+    };
+    StateService.prototype.setCenter = function (center) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.setCenter(center); });
+    };
+    StateService.prototype.setSpeed = function (speed) {
+        this._invokeContextOperation(function (context) { context.setSpeed(speed); });
+    };
+    StateService.prototype.setTransitionMode = function (mode) {
+        this._invokeContextOperation(function (context) { context.setTransitionMode(mode); });
+    };
+    StateService.prototype.setZoom = function (zoom) {
+        this._inMotionOperation$.next(true);
+        this._invokeContextOperation(function (context) { context.setZoom(zoom); });
+    };
+    StateService.prototype.start = function () {
+        if (this._frameId == null) {
+            this._start$.next(null);
+            this._frameId = this._frameGenerator.requestAnimationFrame(this._frame.bind(this));
+            this._frame$.next(this._frameId);
+        }
+    };
+    StateService.prototype.stop = function () {
+        if (this._frameId != null) {
+            this._frameGenerator.cancelAnimationFrame(this._frameId);
+            this._frameId = null;
+        }
+    };
+    StateService.prototype._invokeContextOperation = function (action) {
+        this._contextOperation$
+            .next(function (context) {
+            action(context);
+            return context;
+        });
+    };
+    StateService.prototype._frame = function (time) {
+        this._frameId = this._frameGenerator.requestAnimationFrame(this._frame.bind(this));
+        this._frame$.next(this._frameId);
+    };
+    return StateService;
+}());
+exports.StateService = StateService;
+
+},{"../State":298,"rxjs":43,"rxjs/operators":241}],452:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.TransitionMode = void 0;
+/**
+ * Enumeration for transition mode
+ * @enum {number}
+ * @readonly
+ * @description Modes for specifying how transitions
+ * between nodes are performed.
+ */
+var TransitionMode;
+(function (TransitionMode) {
+    /**
+     * Default transitions.
+     *
+     * @description The viewer dynamically determines
+     * whether transitions should be performed with or
+     * without motion and blending for each transition
+     * based on the underlying data.
+     */
+    TransitionMode[TransitionMode["Default"] = 0] = "Default";
+    /**
+     * Instantaneous transitions.
+     *
+     * @description All transitions are performed
+     * without motion or blending.
+     */
+    TransitionMode[TransitionMode["Instantaneous"] = 1] = "Instantaneous";
+})(TransitionMode = exports.TransitionMode || (exports.TransitionMode = {}));
+exports.default = TransitionMode;
+
+},{}],453:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}],454:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.EarthState = void 0;
+var THREE = require("three");
+var State_1 = require("../../State");
+var EarthState = /** @class */ (function (_super) {
+    __extends(EarthState, _super);
+    function EarthState(state) {
+        var _this = _super.call(this, state) || this;
+        var viewingDirection = _this._camera.lookat
+            .clone()
+            .sub(_this._camera.position)
+            .normalize();
+        _this._camera.lookat.copy(_this._camera.position);
+        _this._camera.position.z = state.camera.position.z + 20;
+        _this._camera.position.x = state.camera.position.x - 16 * viewingDirection.x;
+        _this._camera.position.y = state.camera.position.y - 16 * viewingDirection.y;
+        _this._camera.up.set(0, 0, 1);
+        return _this;
+    }
+    EarthState.prototype.traverse = function () {
+        return new State_1.TraversingState(this);
+    };
+    EarthState.prototype.wait = function () {
+        return new State_1.WaitingState(this);
+    };
+    EarthState.prototype.waitInteractively = function () {
+        return new State_1.InteractiveWaitingState(this);
+    };
+    EarthState.prototype.dolly = function (delta) {
+        var camera = this._camera;
+        var offset = new THREE.Vector3()
+            .copy(camera.position)
+            .sub(camera.lookat);
+        var length = offset.length();
+        var scaled = length * Math.pow(2, -delta);
+        var clipped = Math.max(1, Math.min(scaled, 1000));
+        offset.normalize();
+        offset.multiplyScalar(clipped);
+        camera.position.copy(camera.lookat).add(offset);
+    };
+    EarthState.prototype.orbit = function (rotation) {
+        var camera = this._camera;
+        var q = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1));
+        var qInverse = q.clone().inverse();
+        var offset = new THREE.Vector3();
+        offset.copy(camera.position).sub(camera.lookat);
+        offset.applyQuaternion(q);
+        var length = offset.length();
+        var phi = Math.atan2(offset.y, offset.x);
+        phi += rotation.phi;
+        var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
+        theta += rotation.theta;
+        theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta));
+        offset.x = Math.sin(theta) * Math.cos(phi);
+        offset.y = Math.sin(theta) * Math.sin(phi);
+        offset.z = Math.cos(theta);
+        offset.applyQuaternion(qInverse);
+        camera.position.copy(camera.lookat).add(offset.multiplyScalar(length));
+    };
+    EarthState.prototype.truck = function (direction) {
+        this._camera.position.add(new THREE.Vector3().fromArray(direction));
+        this._camera.lookat.add(new THREE.Vector3().fromArray(direction));
+    };
+    EarthState.prototype.update = function () { };
+    return EarthState;
+}(State_1.StateBase));
+exports.EarthState = EarthState;
+exports.default = EarthState;
+
+
+},{"../../State":298,"three":242}],455:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.InteractiveStateBase = void 0;
+var THREE = require("three");
+var State_1 = require("../../State");
+var InteractiveStateBase = /** @class */ (function (_super) {
+    __extends(InteractiveStateBase, _super);
+    function InteractiveStateBase(state) {
+        var _this = _super.call(this, state) || this;
+        _this._animationSpeed = 1 / 40;
+        _this._rotationDelta = new State_1.RotationDelta(0, 0);
+        _this._requestedRotationDelta = null;
+        _this._basicRotation = [0, 0];
+        _this._requestedBasicRotation = null;
+        _this._requestedBasicRotationUnbounded = null;
+        _this._rotationAcceleration = 0.86;
+        _this._rotationIncreaseAlpha = 0.97;
+        _this._rotationDecreaseAlpha = 0.9;
+        _this._rotationThreshold = 1e-3;
+        _this._unboundedRotationAlpha = 0.8;
+        _this._desiredZoom = state.zoom;
+        _this._minZoom = 0;
+        _this._maxZoom = 3;
+        _this._lookatDepth = 10;
+        _this._desiredLookat = null;
+        _this._desiredCenter = null;
+        return _this;
+    }
+    InteractiveStateBase.prototype.rotate = function (rotationDelta) {
+        if (this._currentNode == null) {
+            return;
+        }
+        if (rotationDelta.phi === 0 && rotationDelta.theta === 0) {
+            return;
+        }
+        this._desiredZoom = this._zoom;
+        this._desiredLookat = null;
+        this._requestedBasicRotation = null;
+        if (this._requestedRotationDelta != null) {
+            this._requestedRotationDelta.phi = this._requestedRotationDelta.phi + rotationDelta.phi;
+            this._requestedRotationDelta.theta = this._requestedRotationDelta.theta + rotationDelta.theta;
+        }
+        else {
+            this._requestedRotationDelta = new State_1.RotationDelta(rotationDelta.phi, rotationDelta.theta);
+        }
+    };
+    InteractiveStateBase.prototype.rotateUnbounded = function (delta) {
+        if (this._currentNode == null) {
+            return;
+        }
+        this._requestedBasicRotation = null;
+        this._requestedRotationDelta = null;
+        this._applyRotation(delta, this._currentCamera);
+        this._applyRotation(delta, this._previousCamera);
+        if (!this._desiredLookat) {
+            return;
+        }
+        var q = new THREE.Quaternion().setFromUnitVectors(this._currentCamera.up, new THREE.Vector3(0, 0, 1));
+        var qInverse = q.clone().inverse();
+        var offset = new THREE.Vector3()
+            .copy(this._desiredLookat)
+            .sub(this._camera.position)
+            .applyQuaternion(q);
+        var length = offset.length();
+        var phi = Math.atan2(offset.y, offset.x);
+        phi += delta.phi;
+        var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
+        theta += delta.theta;
+        theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta));
+        offset.x = Math.sin(theta) * Math.cos(phi);
+        offset.y = Math.sin(theta) * Math.sin(phi);
+        offset.z = Math.cos(theta);
+        offset.applyQuaternion(qInverse);
+        this._desiredLookat
+            .copy(this._camera.position)
+            .add(offset.multiplyScalar(length));
+    };
+    InteractiveStateBase.prototype.rotateWithoutInertia = function (rotationDelta) {
+        if (this._currentNode == null) {
+            return;
+        }
+        this._desiredZoom = this._zoom;
+        this._desiredLookat = null;
+        this._requestedBasicRotation = null;
+        this._requestedRotationDelta = null;
+        var threshold = Math.PI / (10 * Math.pow(2, this._zoom));
+        var delta = {
+            phi: this._spatial.clamp(rotationDelta.phi, -threshold, threshold),
+            theta: this._spatial.clamp(rotationDelta.theta, -threshold, threshold),
+        };
+        this._applyRotation(delta, this._currentCamera);
+        this._applyRotation(delta, this._previousCamera);
     };
-    StateService.prototype.appendNodes = function (nodes) {
-        this._invokeContextOperation(function (context) { context.append(nodes); });
+    InteractiveStateBase.prototype.rotateBasic = function (basicRotation) {
+        if (this._currentNode == null) {
+            return;
+        }
+        this._desiredZoom = this._zoom;
+        this._desiredLookat = null;
+        this._requestedRotationDelta = null;
+        if (this._requestedBasicRotation != null) {
+            this._requestedBasicRotation[0] += basicRotation[0];
+            this._requestedBasicRotation[1] += basicRotation[1];
+            var threshold = 0.05 / Math.pow(2, this._zoom);
+            this._requestedBasicRotation[0] =
+                this._spatial.clamp(this._requestedBasicRotation[0], -threshold, threshold);
+            this._requestedBasicRotation[1] =
+                this._spatial.clamp(this._requestedBasicRotation[1], -threshold, threshold);
+        }
+        else {
+            this._requestedBasicRotation = basicRotation.slice();
+        }
     };
-    StateService.prototype.prependNodes = function (nodes) {
-        this._invokeContextOperation(function (context) { context.prepend(nodes); });
+    InteractiveStateBase.prototype.rotateBasicUnbounded = function (basicRotation) {
+        if (this._currentNode == null) {
+            return;
+        }
+        if (this._requestedBasicRotationUnbounded != null) {
+            this._requestedBasicRotationUnbounded[0] += basicRotation[0];
+            this._requestedBasicRotationUnbounded[1] += basicRotation[1];
+        }
+        else {
+            this._requestedBasicRotationUnbounded = basicRotation.slice();
+        }
     };
-    StateService.prototype.removeNodes = function (n) {
-        this._invokeContextOperation(function (context) { context.remove(n); });
+    InteractiveStateBase.prototype.rotateBasicWithoutInertia = function (basic) {
+        if (this._currentNode == null) {
+            return;
+        }
+        this._desiredZoom = this._zoom;
+        this._desiredLookat = null;
+        this._requestedRotationDelta = null;
+        this._requestedBasicRotation = null;
+        var threshold = 0.05 / Math.pow(2, this._zoom);
+        var basicRotation = basic.slice();
+        basicRotation[0] = this._spatial.clamp(basicRotation[0], -threshold, threshold);
+        basicRotation[1] = this._spatial.clamp(basicRotation[1], -threshold, threshold);
+        this._applyRotationBasic(basicRotation);
     };
-    StateService.prototype.clearNodes = function () {
-        this._invokeContextOperation(function (context) { context.clear(); });
+    InteractiveStateBase.prototype.rotateToBasic = function (basic) {
+        if (this._currentNode == null) {
+            return;
+        }
+        this._desiredZoom = this._zoom;
+        this._desiredLookat = null;
+        basic[0] = this._spatial.clamp(basic[0], 0, 1);
+        basic[1] = this._spatial.clamp(basic[1], 0, 1);
+        var lookat = this.currentTransform.unprojectBasic(basic, this._lookatDepth);
+        this._currentCamera.lookat.fromArray(lookat);
     };
-    StateService.prototype.clearPriorNodes = function () {
-        this._invokeContextOperation(function (context) { context.clearPrior(); });
+    InteractiveStateBase.prototype.zoomIn = function (delta, reference) {
+        if (this._currentNode == null) {
+            return;
+        }
+        this._desiredZoom = Math.max(this._minZoom, Math.min(this._maxZoom, this._desiredZoom + delta));
+        var currentCenter = this.currentTransform.projectBasic(this._currentCamera.lookat.toArray());
+        var currentCenterX = currentCenter[0];
+        var currentCenterY = currentCenter[1];
+        var zoom0 = Math.pow(2, this._zoom);
+        var zoom1 = Math.pow(2, this._desiredZoom);
+        var refX = reference[0];
+        var refY = reference[1];
+        if (this.currentTransform.gpano != null &&
+            this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) {
+            if (refX - currentCenterX > 0.5) {
+                refX = refX - 1;
+            }
+            else if (currentCenterX - refX > 0.5) {
+                refX = 1 + refX;
+            }
+        }
+        var newCenterX = refX - zoom0 / zoom1 * (refX - currentCenterX);
+        var newCenterY = refY - zoom0 / zoom1 * (refY - currentCenterY);
+        var gpano = this.currentTransform.gpano;
+        if (this._currentNode.fullPano) {
+            newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1);
+            newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0.05, 0.95);
+        }
+        else if (gpano != null &&
+            this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) {
+            newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1);
+            newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0, 1);
+        }
+        else {
+            newCenterX = this._spatial.clamp(newCenterX, 0, 1);
+            newCenterY = this._spatial.clamp(newCenterY, 0, 1);
+        }
+        this._desiredLookat = new THREE.Vector3()
+            .fromArray(this.currentTransform.unprojectBasic([newCenterX, newCenterY], this._lookatDepth));
     };
-    StateService.prototype.cutNodes = function () {
-        this._invokeContextOperation(function (context) { context.cut(); });
+    InteractiveStateBase.prototype.setCenter = function (center) {
+        this._desiredLookat = null;
+        this._requestedRotationDelta = null;
+        this._requestedBasicRotation = null;
+        this._desiredZoom = this._zoom;
+        var clamped = [
+            this._spatial.clamp(center[0], 0, 1),
+            this._spatial.clamp(center[1], 0, 1),
+        ];
+        if (this._currentNode == null) {
+            this._desiredCenter = clamped;
+            return;
+        }
+        this._desiredCenter = null;
+        var currentLookat = new THREE.Vector3()
+            .fromArray(this.currentTransform.unprojectBasic(clamped, this._lookatDepth));
+        var previousTransform = this.previousTransform != null ?
+            this.previousTransform :
+            this.currentTransform;
+        var previousLookat = new THREE.Vector3()
+            .fromArray(previousTransform.unprojectBasic(clamped, this._lookatDepth));
+        this._currentCamera.lookat.copy(currentLookat);
+        this._previousCamera.lookat.copy(previousLookat);
     };
-    StateService.prototype.setNodes = function (nodes) {
-        this._invokeContextOperation(function (context) { context.set(nodes); });
+    InteractiveStateBase.prototype.setZoom = function (zoom) {
+        this._desiredLookat = null;
+        this._requestedRotationDelta = null;
+        this._requestedBasicRotation = null;
+        this._zoom = this._spatial.clamp(zoom, this._minZoom, this._maxZoom);
+        this._desiredZoom = this._zoom;
     };
-    StateService.prototype.rotate = function (delta) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotate(delta); });
+    InteractiveStateBase.prototype._applyRotation = function (delta, camera) {
+        if (camera == null) {
+            return;
+        }
+        var q = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1));
+        var qInverse = q.clone().inverse();
+        var offset = new THREE.Vector3();
+        offset.copy(camera.lookat).sub(camera.position);
+        offset.applyQuaternion(q);
+        var length = offset.length();
+        var phi = Math.atan2(offset.y, offset.x);
+        phi += delta.phi;
+        var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
+        theta += delta.theta;
+        theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta));
+        offset.x = Math.sin(theta) * Math.cos(phi);
+        offset.y = Math.sin(theta) * Math.sin(phi);
+        offset.z = Math.cos(theta);
+        offset.applyQuaternion(qInverse);
+        camera.lookat.copy(camera.position).add(offset.multiplyScalar(length));
     };
-    StateService.prototype.rotateBasic = function (basicRotation) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateBasic(basicRotation); });
+    InteractiveStateBase.prototype._applyRotationBasic = function (basicRotation) {
+        var currentNode = this._currentNode;
+        var previousNode = this._previousNode != null ?
+            this.previousNode :
+            this.currentNode;
+        var currentCamera = this._currentCamera;
+        var previousCamera = this._previousCamera;
+        var currentTransform = this.currentTransform;
+        var previousTransform = this.previousTransform != null ?
+            this.previousTransform :
+            this.currentTransform;
+        var currentBasic = currentTransform.projectBasic(currentCamera.lookat.toArray());
+        var previousBasic = previousTransform.projectBasic(previousCamera.lookat.toArray());
+        var currentGPano = currentTransform.gpano;
+        var previousGPano = previousTransform.gpano;
+        if (currentNode.fullPano) {
+            currentBasic[0] = this._spatial.wrap(currentBasic[0] + basicRotation[0], 0, 1);
+            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0.05, 0.95);
+        }
+        else if (currentGPano != null &&
+            currentTransform.gpano.CroppedAreaImageWidthPixels === currentTransform.gpano.FullPanoWidthPixels) {
+            currentBasic[0] = this._spatial.wrap(currentBasic[0] + basicRotation[0], 0, 1);
+            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);
+        }
+        else {
+            currentBasic[0] = this._spatial.clamp(currentBasic[0] + basicRotation[0], 0, 1);
+            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);
+        }
+        if (previousNode.fullPano) {
+            previousBasic[0] = this._spatial.wrap(previousBasic[0] + basicRotation[0], 0, 1);
+            previousBasic[1] = this._spatial.clamp(previousBasic[1] + basicRotation[1], 0.05, 0.95);
+        }
+        else if (previousGPano != null &&
+            previousTransform.gpano.CroppedAreaImageWidthPixels === previousTransform.gpano.FullPanoWidthPixels) {
+            previousBasic[0] = this._spatial.wrap(previousBasic[0] + basicRotation[0], 0, 1);
+            previousBasic[1] = this._spatial.clamp(previousBasic[1] + basicRotation[1], 0, 1);
+        }
+        else {
+            previousBasic[0] = this._spatial.clamp(previousBasic[0] + basicRotation[0], 0, 1);
+            previousBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);
+        }
+        var currentLookat = currentTransform.unprojectBasic(currentBasic, this._lookatDepth);
+        currentCamera.lookat.fromArray(currentLookat);
+        var previousLookat = previousTransform.unprojectBasic(previousBasic, this._lookatDepth);
+        previousCamera.lookat.fromArray(previousLookat);
     };
-    StateService.prototype.rotateBasicUnbounded = function (basicRotation) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateBasicUnbounded(basicRotation); });
+    InteractiveStateBase.prototype._updateZoom = function (animationSpeed) {
+        var diff = this._desiredZoom - this._zoom;
+        var sign = diff > 0 ? 1 : diff < 0 ? -1 : 0;
+        if (diff === 0) {
+            return;
+        }
+        else if (Math.abs(diff) < 2e-3) {
+            this._zoom = this._desiredZoom;
+            if (this._desiredLookat != null) {
+                this._desiredLookat = null;
+            }
+        }
+        else {
+            this._zoom += sign * Math.max(Math.abs(5 * animationSpeed * diff), 2e-3);
+        }
     };
-    StateService.prototype.rotateToBasic = function (basic) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateToBasic(basic); });
+    InteractiveStateBase.prototype._updateLookat = function (animationSpeed) {
+        if (this._desiredLookat === null) {
+            return;
+        }
+        var diff = this._desiredLookat.distanceToSquared(this._currentCamera.lookat);
+        if (Math.abs(diff) < 1e-6) {
+            this._currentCamera.lookat.copy(this._desiredLookat);
+            this._desiredLookat = null;
+        }
+        else {
+            this._currentCamera.lookat.lerp(this._desiredLookat, 5 * animationSpeed);
+        }
     };
-    StateService.prototype.move = function (delta) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.move(delta); });
+    InteractiveStateBase.prototype._updateRotation = function () {
+        if (this._requestedRotationDelta != null) {
+            var length_1 = this._rotationDelta.lengthSquared();
+            var requestedLength = this._requestedRotationDelta.lengthSquared();
+            if (requestedLength > length_1) {
+                this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationIncreaseAlpha);
+            }
+            else {
+                this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationDecreaseAlpha);
+            }
+            this._requestedRotationDelta = null;
+            return;
+        }
+        if (this._rotationDelta.isZero) {
+            return;
+        }
+        var alpha = this.currentNode.fullPano ? 1 : this._alpha;
+        this._rotationDelta.multiply(this._rotationAcceleration * alpha);
+        this._rotationDelta.threshold(this._rotationThreshold);
     };
-    StateService.prototype.moveTo = function (position) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.moveTo(position); });
+    InteractiveStateBase.prototype._updateRotationBasic = function () {
+        if (this._requestedBasicRotation != null) {
+            var x = this._basicRotation[0];
+            var y = this._basicRotation[1];
+            var reqX = this._requestedBasicRotation[0];
+            var reqY = this._requestedBasicRotation[1];
+            if (Math.abs(reqX) > Math.abs(x)) {
+                this._basicRotation[0] = (1 - this._rotationIncreaseAlpha) * x + this._rotationIncreaseAlpha * reqX;
+            }
+            else {
+                this._basicRotation[0] = (1 - this._rotationDecreaseAlpha) * x + this._rotationDecreaseAlpha * reqX;
+            }
+            if (Math.abs(reqY) > Math.abs(y)) {
+                this._basicRotation[1] = (1 - this._rotationIncreaseAlpha) * y + this._rotationIncreaseAlpha * reqY;
+            }
+            else {
+                this._basicRotation[1] = (1 - this._rotationDecreaseAlpha) * y + this._rotationDecreaseAlpha * reqY;
+            }
+            this._requestedBasicRotation = null;
+            return;
+        }
+        if (this._requestedBasicRotationUnbounded != null) {
+            var reqX = this._requestedBasicRotationUnbounded[0];
+            var reqY = this._requestedBasicRotationUnbounded[1];
+            if (Math.abs(reqX) > 0) {
+                this._basicRotation[0] = (1 - this._unboundedRotationAlpha) * this._basicRotation[0] + this._unboundedRotationAlpha * reqX;
+            }
+            if (Math.abs(reqY) > 0) {
+                this._basicRotation[1] = (1 - this._unboundedRotationAlpha) * this._basicRotation[1] + this._unboundedRotationAlpha * reqY;
+            }
+            if (this._desiredLookat != null) {
+                var desiredBasicLookat = this.currentTransform.projectBasic(this._desiredLookat.toArray());
+                desiredBasicLookat[0] += reqX;
+                desiredBasicLookat[1] += reqY;
+                this._desiredLookat = new THREE.Vector3()
+                    .fromArray(this.currentTransform.unprojectBasic(desiredBasicLookat, this._lookatDepth));
+            }
+            this._requestedBasicRotationUnbounded = null;
+        }
+        if (this._basicRotation[0] === 0 && this._basicRotation[1] === 0) {
+            return;
+        }
+        this._basicRotation[0] = this._rotationAcceleration * this._basicRotation[0];
+        this._basicRotation[1] = this._rotationAcceleration * this._basicRotation[1];
+        if (Math.abs(this._basicRotation[0]) < this._rotationThreshold / Math.pow(2, this._zoom) &&
+            Math.abs(this._basicRotation[1]) < this._rotationThreshold / Math.pow(2, this._zoom)) {
+            this._basicRotation = [0, 0];
+        }
     };
-    /**
-     * Change zoom level while keeping the reference point position approximately static.
-     *
-     * @parameter {number} delta - Change in zoom level.
-     * @parameter {Array<number>} reference - Reference point in basic coordinates.
-     */
-    StateService.prototype.zoomIn = function (delta, reference) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.zoomIn(delta, reference); });
+    InteractiveStateBase.prototype._clearRotation = function () {
+        if (this._currentNode.fullPano) {
+            return;
+        }
+        if (this._requestedRotationDelta != null) {
+            this._requestedRotationDelta = null;
+        }
+        if (!this._rotationDelta.isZero) {
+            this._rotationDelta.reset();
+        }
+        if (this._requestedBasicRotation != null) {
+            this._requestedBasicRotation = null;
+        }
+        if (this._basicRotation[0] > 0 || this._basicRotation[1] > 0) {
+            this._basicRotation = [0, 0];
+        }
     };
-    StateService.prototype.getCenter = function () {
-        return this._lastState$
-            .first()
-            .map(function (frame) {
-            return frame.state.getCenter();
-        });
+    InteractiveStateBase.prototype._setDesiredCenter = function () {
+        if (this._desiredCenter == null) {
+            return;
+        }
+        var lookatDirection = new THREE.Vector3()
+            .fromArray(this.currentTransform.unprojectBasic(this._desiredCenter, this._lookatDepth))
+            .sub(this._currentCamera.position);
+        this._currentCamera.lookat.copy(this._currentCamera.position.clone().add(lookatDirection));
+        this._previousCamera.lookat.copy(this._previousCamera.position.clone().add(lookatDirection));
+        this._desiredCenter = null;
     };
-    StateService.prototype.getZoom = function () {
-        return this._lastState$
-            .first()
-            .map(function (frame) {
-            return frame.state.zoom;
-        });
+    InteractiveStateBase.prototype._setDesiredZoom = function () {
+        this._desiredZoom =
+            this._currentNode.fullPano || this._previousNode == null ?
+                this._zoom : 0;
     };
-    StateService.prototype.setCenter = function (center) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.setCenter(center); });
+    return InteractiveStateBase;
+}(State_1.StateBase));
+exports.InteractiveStateBase = InteractiveStateBase;
+exports.default = InteractiveStateBase;
+
+
+},{"../../State":298,"three":242}],456:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
     };
-    StateService.prototype.setZoom = function (zoom) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.setZoom(zoom); });
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
     };
-    StateService.prototype.start = function () {
-        if (this._frameId == null) {
-            this._start$.next(null);
-            this._frameId = this._frameGenerator.requestAnimationFrame(this._frame.bind(this));
-            this._frame$.next(this._frameId);
-        }
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.InteractiveWaitingState = void 0;
+var State_1 = require("../../State");
+var InteractiveWaitingState = /** @class */ (function (_super) {
+    __extends(InteractiveWaitingState, _super);
+    function InteractiveWaitingState(state) {
+        var _this = _super.call(this, state) || this;
+        _this._adjustCameras();
+        _this._motionless = _this._motionlessTransition();
+        return _this;
+    }
+    InteractiveWaitingState.prototype.traverse = function () {
+        return new State_1.TraversingState(this);
     };
-    StateService.prototype.stop = function () {
-        if (this._frameId != null) {
-            this._frameGenerator.cancelAnimationFrame(this._frameId);
-            this._frameId = null;
+    InteractiveWaitingState.prototype.wait = function () {
+        return new State_1.WaitingState(this);
+    };
+    InteractiveWaitingState.prototype.prepend = function (nodes) {
+        _super.prototype.prepend.call(this, nodes);
+        this._motionless = this._motionlessTransition();
+    };
+    InteractiveWaitingState.prototype.set = function (nodes) {
+        _super.prototype.set.call(this, nodes);
+        this._motionless = this._motionlessTransition();
+    };
+    InteractiveWaitingState.prototype.move = function (delta) {
+        this._alpha = Math.max(0, Math.min(1, this._alpha + delta));
+    };
+    InteractiveWaitingState.prototype.moveTo = function (position) {
+        this._alpha = Math.max(0, Math.min(1, position));
+    };
+    InteractiveWaitingState.prototype.update = function (fps) {
+        this._updateRotation();
+        if (!this._rotationDelta.isZero) {
+            this._applyRotation(this._rotationDelta, this._previousCamera);
+            this._applyRotation(this._rotationDelta, this._currentCamera);
+        }
+        this._updateRotationBasic();
+        if (this._basicRotation[0] !== 0 || this._basicRotation[1] !== 0) {
+            this._applyRotationBasic(this._basicRotation);
         }
+        var animationSpeed = this._animationSpeed * (60 / fps);
+        this._updateZoom(animationSpeed);
+        this._updateLookat(animationSpeed);
+        this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha);
     };
-    StateService.prototype._invokeContextOperation = function (action) {
-        this._contextOperation$
-            .next(function (context) {
-            action(context);
-            return context;
-        });
+    InteractiveWaitingState.prototype._getAlpha = function () {
+        return this._motionless ? Math.round(this._alpha) : this._alpha;
     };
-    StateService.prototype._frame = function (time) {
-        this._frameId = this._frameGenerator.requestAnimationFrame(this._frame.bind(this));
-        this._frame$.next(this._frameId);
+    InteractiveWaitingState.prototype._setCurrentCamera = function () {
+        _super.prototype._setCurrentCamera.call(this);
+        this._adjustCameras();
     };
-    return StateService;
-}());
-exports.StateService = StateService;
+    InteractiveWaitingState.prototype._adjustCameras = function () {
+        if (this._previousNode == null) {
+            return;
+        }
+        if (this._currentNode.fullPano) {
+            var lookat = this._camera.lookat.clone().sub(this._camera.position);
+            this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position));
+        }
+        if (this._previousNode.fullPano) {
+            var lookat = this._currentCamera.lookat.clone().sub(this._currentCamera.position);
+            this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position));
+        }
+    };
+    return InteractiveWaitingState;
+}(State_1.InteractiveStateBase));
+exports.InteractiveWaitingState = InteractiveWaitingState;
+exports.default = InteractiveWaitingState;
 
-},{"../State":233,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/pairwise":69,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/startWith":78,"rxjs/add/operator/switchMap":79,"rxjs/add/operator/withLatestFrom":83,"rxjs/util/AnimationFrame":157}],334:[function(require,module,exports){
+},{"../../State":298}],457:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.StateBase = void 0;
 var Error_1 = require("../../Error");
 var Geo_1 = require("../../Geo");
-var StateBase = (function () {
+var State_1 = require("../../State");
+var StateBase = /** @class */ (function () {
     function StateBase(state) {
         this._spatial = new Geo_1.Spatial();
         this._geoCoords = new Geo_1.GeoCoords();
         this._referenceThreshold = 0.01;
+        this._transitionMode = state.transitionMode;
         this._reference = state.reference;
         this._alpha = state.alpha;
         this._camera = state.camera.clone();
@@ -36985,8 +53805,8 @@ var StateBase = (function () {
         this._trajectoryCameras = [];
         for (var _i = 0, _a = this._trajectory; _i < _a.length; _i++) {
             var node = _a[_i];
-            var translation = this._nodeToTranslation(node);
-            var transform = new Geo_1.Transform(node, node.image, translation);
+            var translation = this._nodeToTranslation(node, this._reference);
+            var transform = new Geo_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image, undefined, node.ck1, node.ck2, node.cameraProjection);
             this._trajectoryTransforms.push(transform);
             this._trajectoryCameras.push(new Geo_1.Camera(transform));
         }
@@ -37007,63 +53827,63 @@ var StateBase = (function () {
         get: function () {
             return this._reference;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "alpha", {
         get: function () {
             return this._getAlpha();
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "camera", {
         get: function () {
             return this._camera;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "zoom", {
         get: function () {
             return this._zoom;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "trajectory", {
         get: function () {
             return this._trajectory;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "currentIndex", {
         get: function () {
             return this._currentIndex;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "currentNode", {
         get: function () {
             return this._currentNode;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "previousNode", {
         get: function () {
             return this._previousNode;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "currentCamera", {
         get: function () {
             return this._currentCamera;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "currentTransform", {
@@ -37071,7 +53891,7 @@ var StateBase = (function () {
             return this._trajectoryTransforms.length > 0 ?
                 this._trajectoryTransforms[this.currentIndex] : null;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "previousTransform", {
@@ -37079,16 +53899,44 @@ var StateBase = (function () {
             return this._trajectoryTransforms.length > 1 && this.currentIndex > 0 ?
                 this._trajectoryTransforms[this.currentIndex - 1] : null;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(StateBase.prototype, "motionless", {
         get: function () {
             return this._motionless;
         },
-        enumerable: true,
-        configurable: true
-    });
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(StateBase.prototype, "transitionMode", {
+        get: function () {
+            return this._transitionMode;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    StateBase.prototype.earth = function () { throw new Error("Not implemented"); };
+    StateBase.prototype.traverse = function () { throw new Error("Not implemented"); };
+    StateBase.prototype.wait = function () { throw new Error("Not implemented"); };
+    StateBase.prototype.waitInteractively = function () { throw new Error("Not implemented"); };
+    StateBase.prototype.move = function (delta) { };
+    StateBase.prototype.moveTo = function (position) { };
+    StateBase.prototype.rotate = function (delta) { };
+    StateBase.prototype.rotateUnbounded = function (delta) { };
+    StateBase.prototype.rotateWithoutInertia = function (delta) { };
+    StateBase.prototype.rotateBasic = function (basicRotation) { };
+    StateBase.prototype.rotateBasicUnbounded = function (basicRotation) { };
+    StateBase.prototype.rotateBasicWithoutInertia = function (basicRotation) { };
+    StateBase.prototype.rotateToBasic = function (basic) { };
+    StateBase.prototype.setSpeed = function (speed) { };
+    StateBase.prototype.zoomIn = function (delta, reference) { };
+    StateBase.prototype.update = function (fps) { };
+    StateBase.prototype.setCenter = function (center) { };
+    StateBase.prototype.setZoom = function (zoom) { };
+    StateBase.prototype.dolly = function (delta) { };
+    StateBase.prototype.orbit = function (rotation) { };
+    StateBase.prototype.truck = function (direction) { };
     StateBase.prototype.append = function (nodes) {
         if (nodes.length < 1) {
             throw Error("Trajectory can not be empty");
@@ -37162,6 +54010,10 @@ var StateBase = (function () {
             this.currentTransform.projectBasic(this._camera.lookat.toArray()) :
             [0.5, 0.5];
     };
+    StateBase.prototype.setTransitionMode = function (mode) {
+        this._transitionMode = mode;
+    };
+    StateBase.prototype._getAlpha = function () { return 1; };
     StateBase.prototype._setCurrent = function () {
         this._setCurrentNode();
         var referenceReset = this._setReference(this._currentNode);
@@ -37178,10 +54030,10 @@ var StateBase = (function () {
     };
     StateBase.prototype._motionlessTransition = function () {
         var nodesSet = this._currentNode != null && this._previousNode != null;
-        return nodesSet && !(this._currentNode.merged &&
+        return nodesSet && (this._transitionMode === State_1.TransitionMode.Instantaneous || !(this._currentNode.merged &&
             this._previousNode.merged &&
             this._withinOriginalDistance() &&
-            this._sameConnectedComponent());
+            this._sameConnectedComponent()));
     };
     StateBase.prototype._setReference = function (node) {
         // do not reset reference if node is within threshold distance
@@ -37230,8 +54082,8 @@ var StateBase = (function () {
             if (!node.assetsCached) {
                 throw new Error_1.ArgumentMapillaryError("Assets must be cached when node is added to trajectory");
             }
-            var translation = this._nodeToTranslation(node);
-            var transform = new Geo_1.Transform(node, node.image, translation);
+            var translation = this._nodeToTranslation(node, this.reference);
+            var transform = new Geo_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image, undefined, node.ck1, node.ck2, node.cameraProjection);
             this._trajectoryTransforms.push(transform);
             this._trajectoryCameras.push(new Geo_1.Camera(transform));
         }
@@ -37242,27 +54094,20 @@ var StateBase = (function () {
             if (!node.assetsCached) {
                 throw new Error_1.ArgumentMapillaryError("Assets must be cached when added to trajectory");
             }
-            var translation = this._nodeToTranslation(node);
-            var transform = new Geo_1.Transform(node, node.image, translation);
+            var translation = this._nodeToTranslation(node, this.reference);
+            var transform = new Geo_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image, undefined, node.ck1, node.ck2, node.cameraProjection);
             this._trajectoryTransforms.unshift(transform);
             this._trajectoryCameras.unshift(new Geo_1.Camera(transform));
         }
     };
-    StateBase.prototype._nodeToTranslation = function (node) {
-        var C = this._geoCoords.geodeticToEnu(node.latLon.lat, node.latLon.lon, node.alt, this._reference.lat, this._reference.lon, this._reference.alt);
-        var RC = this._spatial.rotate(C, node.rotation);
-        return [-RC.x, -RC.y, -RC.z];
+    StateBase.prototype._nodeToTranslation = function (node, reference) {
+        return Geo_1.Geo.computeTranslation({ alt: node.alt, lat: node.latLon.lat, lon: node.latLon.lon }, node.rotation, reference);
     };
     StateBase.prototype._sameConnectedComponent = function () {
         var current = this._currentNode;
         var previous = this._previousNode;
-        if (!current ||
-            !current.mergeCC ||
-            !previous ||
-            !previous.mergeCC) {
-            return true;
-        }
-        return current.mergeCC === previous.mergeCC;
+        return !!current && !!previous &&
+            current.mergeCC === previous.mergeCC;
     };
     StateBase.prototype._withinOriginalDistance = function () {
         var current = this._currentNode;
@@ -37278,13 +54123,15 @@ var StateBase = (function () {
 }());
 exports.StateBase = StateBase;
 
-},{"../../Error":228,"../../Geo":229}],335:[function(require,module,exports){
+},{"../../Error":293,"../../Geo":294,"../../State":298}],458:[function(require,module,exports){
 "use strict";
-/// <reference path="../../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -37292,100 +54139,30 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
+exports.TraversingState = void 0;
 var UnitBezier = require("@mapbox/unitbezier");
 var State_1 = require("../../State");
-var RotationDelta = (function () {
-    function RotationDelta(phi, theta) {
-        this._phi = phi;
-        this._theta = theta;
-    }
-    Object.defineProperty(RotationDelta.prototype, "phi", {
-        get: function () {
-            return this._phi;
-        },
-        set: function (value) {
-            this._phi = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RotationDelta.prototype, "theta", {
-        get: function () {
-            return this._theta;
-        },
-        set: function (value) {
-            this._theta = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RotationDelta.prototype, "isZero", {
-        get: function () {
-            return this._phi === 0 && this._theta === 0;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    RotationDelta.prototype.copy = function (delta) {
-        this._phi = delta.phi;
-        this._theta = delta.theta;
-    };
-    RotationDelta.prototype.lerp = function (other, alpha) {
-        this._phi = (1 - alpha) * this._phi + alpha * other.phi;
-        this._theta = (1 - alpha) * this._theta + alpha * other.theta;
-    };
-    RotationDelta.prototype.multiply = function (value) {
-        this._phi *= value;
-        this._theta *= value;
-    };
-    RotationDelta.prototype.threshold = function (value) {
-        this._phi = Math.abs(this._phi) > value ? this._phi : 0;
-        this._theta = Math.abs(this._theta) > value ? this._theta : 0;
-    };
-    RotationDelta.prototype.lengthSquared = function () {
-        return this._phi * this._phi + this._theta * this._theta;
-    };
-    RotationDelta.prototype.reset = function () {
-        this._phi = 0;
-        this._theta = 0;
-    };
-    return RotationDelta;
-}());
-var TraversingState = (function (_super) {
+var TraversingState = /** @class */ (function (_super) {
     __extends(TraversingState, _super);
     function TraversingState(state) {
         var _this = _super.call(this, state) || this;
         _this._adjustCameras();
         _this._motionless = _this._motionlessTransition();
         _this._baseAlpha = _this._alpha;
-        _this._animationSpeed = 0.025;
+        _this._speedCoefficient = 1;
         _this._unitBezier = new UnitBezier(0.74, 0.67, 0.38, 0.96);
         _this._useBezier = false;
-        _this._rotationDelta = new RotationDelta(0, 0);
-        _this._requestedRotationDelta = null;
-        _this._basicRotation = [0, 0];
-        _this._requestedBasicRotation = null;
-        _this._requestedBasicRotationUnbounded = null;
-        _this._rotationAcceleration = 0.86;
-        _this._rotationIncreaseAlpha = 0.97;
-        _this._rotationDecreaseAlpha = 0.9;
-        _this._rotationThreshold = 1e-3;
-        _this._unboundedRotationAlpha = 0.8;
-        _this._desiredZoom = state.zoom;
-        _this._minZoom = 0;
-        _this._maxZoom = 3;
-        _this._lookatDepth = 10;
-        _this._desiredLookat = null;
-        _this._desiredCenter = null;
         return _this;
     }
-    TraversingState.prototype.traverse = function () {
-        throw new Error("Not implemented");
+    TraversingState.prototype.earth = function () {
+        return new State_1.EarthState(this);
     };
     TraversingState.prototype.wait = function () {
         return new State_1.WaitingState(this);
     };
+    TraversingState.prototype.waitInteractively = function () {
+        return new State_1.InteractiveWaitingState(this);
+    };
     TraversingState.prototype.append = function (nodes) {
         var emptyTrajectory = this._trajectory.length === 0;
         if (emptyTrajectory) {
@@ -37419,140 +54196,8 @@ var TraversingState = (function (_super) {
             this._useBezier = true;
         }
     };
-    TraversingState.prototype.move = function (delta) {
-        throw new Error("Not implemented");
-    };
-    TraversingState.prototype.moveTo = function (delta) {
-        throw new Error("Not implemented");
-    };
-    TraversingState.prototype.rotate = function (rotationDelta) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = this._zoom;
-        this._desiredLookat = null;
-        this._requestedBasicRotation = null;
-        if (this._requestedRotationDelta != null) {
-            this._requestedRotationDelta.phi = this._requestedRotationDelta.phi + rotationDelta.phi;
-            this._requestedRotationDelta.theta = this._requestedRotationDelta.theta + rotationDelta.theta;
-        }
-        else {
-            this._requestedRotationDelta = new RotationDelta(rotationDelta.phi, rotationDelta.theta);
-        }
-    };
-    TraversingState.prototype.rotateBasic = function (basicRotation) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = this._zoom;
-        this._desiredLookat = null;
-        this._requestedRotationDelta = null;
-        if (this._requestedBasicRotation != null) {
-            this._requestedBasicRotation[0] += basicRotation[0];
-            this._requestedBasicRotation[1] += basicRotation[1];
-            var threshold = 0.05 / Math.pow(2, this._zoom);
-            this._requestedBasicRotation[0] =
-                this._spatial.clamp(this._requestedBasicRotation[0], -threshold, threshold);
-            this._requestedBasicRotation[1] =
-                this._spatial.clamp(this._requestedBasicRotation[1], -threshold, threshold);
-        }
-        else {
-            this._requestedBasicRotation = basicRotation.slice();
-        }
-    };
-    TraversingState.prototype.rotateBasicUnbounded = function (basicRotation) {
-        if (this._currentNode == null) {
-            return;
-        }
-        if (this._requestedBasicRotationUnbounded != null) {
-            this._requestedBasicRotationUnbounded[0] += basicRotation[0];
-            this._requestedBasicRotationUnbounded[1] += basicRotation[1];
-        }
-        else {
-            this._requestedBasicRotationUnbounded = basicRotation.slice();
-        }
-    };
-    TraversingState.prototype.rotateToBasic = function (basic) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = this._zoom;
-        this._desiredLookat = null;
-        basic[0] = this._spatial.clamp(basic[0], 0, 1);
-        basic[1] = this._spatial.clamp(basic[1], 0, 1);
-        var lookat = this.currentTransform.unprojectBasic(basic, this._lookatDepth);
-        this._currentCamera.lookat.fromArray(lookat);
-    };
-    TraversingState.prototype.zoomIn = function (delta, reference) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = Math.max(this._minZoom, Math.min(this._maxZoom, this._desiredZoom + delta));
-        var currentCenter = this.currentTransform.projectBasic(this._currentCamera.lookat.toArray());
-        var currentCenterX = currentCenter[0];
-        var currentCenterY = currentCenter[1];
-        var zoom0 = Math.pow(2, this._zoom);
-        var zoom1 = Math.pow(2, this._desiredZoom);
-        var refX = reference[0];
-        var refY = reference[1];
-        if (this.currentTransform.gpano != null &&
-            this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) {
-            if (refX - currentCenterX > 0.5) {
-                refX = refX - 1;
-            }
-            else if (currentCenterX - refX > 0.5) {
-                refX = 1 + refX;
-            }
-        }
-        var newCenterX = refX - zoom0 / zoom1 * (refX - currentCenterX);
-        var newCenterY = refY - zoom0 / zoom1 * (refY - currentCenterY);
-        var gpano = this.currentTransform.gpano;
-        if (this._currentNode.fullPano) {
-            newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1);
-            newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0.05, 0.95);
-        }
-        else if (gpano != null &&
-            this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) {
-            newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1);
-            newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0, 1);
-        }
-        else {
-            newCenterX = this._spatial.clamp(newCenterX, 0, 1);
-            newCenterY = this._spatial.clamp(newCenterY, 0, 1);
-        }
-        this._desiredLookat = new THREE.Vector3()
-            .fromArray(this.currentTransform.unprojectBasic([newCenterX, newCenterY], this._lookatDepth));
-    };
-    TraversingState.prototype.setCenter = function (center) {
-        this._desiredLookat = null;
-        this._requestedRotationDelta = null;
-        this._requestedBasicRotation = null;
-        this._desiredZoom = this._zoom;
-        var clamped = [
-            this._spatial.clamp(center[0], 0, 1),
-            this._spatial.clamp(center[1], 0, 1),
-        ];
-        if (this._currentNode == null) {
-            this._desiredCenter = clamped;
-            return;
-        }
-        this._desiredCenter = null;
-        var currentLookat = new THREE.Vector3()
-            .fromArray(this.currentTransform.unprojectBasic(clamped, this._lookatDepth));
-        var previousTransform = this.previousTransform != null ?
-            this.previousTransform :
-            this.currentTransform;
-        var previousLookat = new THREE.Vector3()
-            .fromArray(previousTransform.unprojectBasic(clamped, this._lookatDepth));
-        this._currentCamera.lookat.copy(currentLookat);
-        this._previousCamera.lookat.copy(previousLookat);
-    };
-    TraversingState.prototype.setZoom = function (zoom) {
-        this._desiredLookat = null;
-        this._requestedRotationDelta = null;
-        this._requestedBasicRotation = null;
-        this._zoom = this._spatial.clamp(zoom, this._minZoom, this._maxZoom);
-        this._desiredZoom = this._zoom;
+    TraversingState.prototype.setSpeed = function (speed) {
+        this._speedCoefficient = this._spatial.clamp(speed, 0, 10);
     };
     TraversingState.prototype.update = function (fps) {
         if (this._alpha === 1 && this._currentIndex + this._alpha < this._trajectory.length) {
@@ -37566,7 +54211,7 @@ var TraversingState = (function (_super) {
             this._desiredLookat = null;
         }
         var animationSpeed = this._animationSpeed * (60 / fps);
-        this._baseAlpha = Math.min(1, this._baseAlpha + animationSpeed);
+        this._baseAlpha = Math.min(1, this._baseAlpha + this._speedCoefficient * animationSpeed);
         if (this._useBezier) {
             this._alpha = this._unitBezier.solve(this._baseAlpha);
         }
@@ -37575,12 +54220,12 @@ var TraversingState = (function (_super) {
         }
         this._updateRotation();
         if (!this._rotationDelta.isZero) {
-            this._applyRotation(this._previousCamera);
-            this._applyRotation(this._currentCamera);
+            this._applyRotation(this._rotationDelta, this._previousCamera);
+            this._applyRotation(this._rotationDelta, this._currentCamera);
         }
         this._updateRotationBasic();
         if (this._basicRotation[0] !== 0 || this._basicRotation[1] !== 0) {
-            this._applyRotationBasic();
+            this._applyRotationBasic(this._basicRotation);
         }
         this._updateZoom(animationSpeed);
         this._updateLookat(animationSpeed);
@@ -37608,213 +54253,20 @@ var TraversingState = (function (_super) {
         this._baseAlpha = 0;
         this._motionless = this._motionlessTransition();
     };
-    TraversingState.prototype._applyRotation = function (camera) {
-        if (camera == null) {
-            return;
-        }
-        var q = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1));
-        var qInverse = q.clone().inverse();
-        var offset = new THREE.Vector3();
-        offset.copy(camera.lookat).sub(camera.position);
-        offset.applyQuaternion(q);
-        var length = offset.length();
-        var phi = Math.atan2(offset.y, offset.x);
-        phi += this._rotationDelta.phi;
-        var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
-        theta += this._rotationDelta.theta;
-        theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta));
-        offset.x = Math.sin(theta) * Math.cos(phi);
-        offset.y = Math.sin(theta) * Math.sin(phi);
-        offset.z = Math.cos(theta);
-        offset.applyQuaternion(qInverse);
-        camera.lookat.copy(camera.position).add(offset.multiplyScalar(length));
-    };
-    TraversingState.prototype._applyRotationBasic = function () {
-        var currentNode = this._currentNode;
-        var previousNode = this._previousNode != null ?
-            this.previousNode :
-            this.currentNode;
-        var currentCamera = this._currentCamera;
-        var previousCamera = this._previousCamera;
-        var currentTransform = this.currentTransform;
-        var previousTransform = this.previousTransform != null ?
-            this.previousTransform :
-            this.currentTransform;
-        var currentBasic = currentTransform.projectBasic(currentCamera.lookat.toArray());
-        var previousBasic = previousTransform.projectBasic(previousCamera.lookat.toArray());
-        var currentGPano = currentTransform.gpano;
-        var previousGPano = previousTransform.gpano;
-        if (currentNode.fullPano) {
-            currentBasic[0] = this._spatial.wrap(currentBasic[0] + this._basicRotation[0], 0, 1);
-            currentBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0.05, 0.95);
-        }
-        else if (currentGPano != null &&
-            currentTransform.gpano.CroppedAreaImageWidthPixels === currentTransform.gpano.FullPanoWidthPixels) {
-            currentBasic[0] = this._spatial.wrap(currentBasic[0] + this._basicRotation[0], 0, 1);
-            currentBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0, 1);
-        }
-        else {
-            currentBasic[0] = this._spatial.clamp(currentBasic[0] + this._basicRotation[0], 0, 1);
-            currentBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0, 1);
-        }
-        if (previousNode.fullPano) {
-            previousBasic[0] = this._spatial.wrap(previousBasic[0] + this._basicRotation[0], 0, 1);
-            previousBasic[1] = this._spatial.clamp(previousBasic[1] + this._basicRotation[1], 0.05, 0.95);
-        }
-        else if (previousGPano != null &&
-            previousTransform.gpano.CroppedAreaImageWidthPixels === previousTransform.gpano.FullPanoWidthPixels) {
-            previousBasic[0] = this._spatial.wrap(previousBasic[0] + this._basicRotation[0], 0, 1);
-            previousBasic[1] = this._spatial.clamp(previousBasic[1] + this._basicRotation[1], 0, 1);
-        }
-        else {
-            previousBasic[0] = this._spatial.clamp(previousBasic[0] + this._basicRotation[0], 0, 1);
-            previousBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0, 1);
-        }
-        var currentLookat = currentTransform.unprojectBasic(currentBasic, this._lookatDepth);
-        currentCamera.lookat.fromArray(currentLookat);
-        var previousLookat = previousTransform.unprojectBasic(previousBasic, this._lookatDepth);
-        previousCamera.lookat.fromArray(previousLookat);
-    };
-    TraversingState.prototype._updateZoom = function (animationSpeed) {
-        var diff = this._desiredZoom - this._zoom;
-        var sign = diff > 0 ? 1 : diff < 0 ? -1 : 0;
-        if (diff === 0) {
-            return;
-        }
-        else if (Math.abs(diff) < 2e-3) {
-            this._zoom = this._desiredZoom;
-            if (this._desiredLookat != null) {
-                this._desiredLookat = null;
-            }
-        }
-        else {
-            this._zoom += sign * Math.max(Math.abs(5 * animationSpeed * diff), 2e-3);
-        }
-    };
-    TraversingState.prototype._updateLookat = function (animationSpeed) {
-        if (this._desiredLookat === null) {
-            return;
-        }
-        var diff = this._desiredLookat.distanceToSquared(this._currentCamera.lookat);
-        if (Math.abs(diff) < 1e-6) {
-            this._currentCamera.lookat.copy(this._desiredLookat);
-            this._desiredLookat = null;
-        }
-        else {
-            this._currentCamera.lookat.lerp(this._desiredLookat, 5 * animationSpeed);
-        }
-    };
-    TraversingState.prototype._updateRotation = function () {
-        if (this._requestedRotationDelta != null) {
-            var length_1 = this._rotationDelta.lengthSquared();
-            var requestedLength = this._requestedRotationDelta.lengthSquared();
-            if (requestedLength > length_1) {
-                this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationIncreaseAlpha);
-            }
-            else {
-                this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationDecreaseAlpha);
-            }
-            this._requestedRotationDelta = null;
-            return;
-        }
-        if (this._rotationDelta.isZero) {
-            return;
-        }
-        this._rotationDelta.multiply(this._rotationAcceleration);
-        this._rotationDelta.threshold(this._rotationThreshold);
-    };
-    TraversingState.prototype._updateRotationBasic = function () {
-        if (this._requestedBasicRotation != null) {
-            var x = this._basicRotation[0];
-            var y = this._basicRotation[1];
-            var reqX = this._requestedBasicRotation[0];
-            var reqY = this._requestedBasicRotation[1];
-            if (Math.abs(reqX) > Math.abs(x)) {
-                this._basicRotation[0] = (1 - this._rotationIncreaseAlpha) * x + this._rotationIncreaseAlpha * reqX;
-            }
-            else {
-                this._basicRotation[0] = (1 - this._rotationDecreaseAlpha) * x + this._rotationDecreaseAlpha * reqX;
-            }
-            if (Math.abs(reqY) > Math.abs(y)) {
-                this._basicRotation[1] = (1 - this._rotationIncreaseAlpha) * y + this._rotationIncreaseAlpha * reqY;
-            }
-            else {
-                this._basicRotation[1] = (1 - this._rotationDecreaseAlpha) * y + this._rotationDecreaseAlpha * reqY;
-            }
-            this._requestedBasicRotation = null;
-            return;
-        }
-        if (this._requestedBasicRotationUnbounded != null) {
-            var reqX = this._requestedBasicRotationUnbounded[0];
-            var reqY = this._requestedBasicRotationUnbounded[1];
-            if (Math.abs(reqX) > 0) {
-                this._basicRotation[0] = (1 - this._unboundedRotationAlpha) * this._basicRotation[0] + this._unboundedRotationAlpha * reqX;
-            }
-            if (Math.abs(reqY) > 0) {
-                this._basicRotation[1] = (1 - this._unboundedRotationAlpha) * this._basicRotation[1] + this._unboundedRotationAlpha * reqY;
-            }
-            if (this._desiredLookat != null) {
-                var desiredBasicLookat = this.currentTransform.projectBasic(this._desiredLookat.toArray());
-                desiredBasicLookat[0] += reqX;
-                desiredBasicLookat[1] += reqY;
-                this._desiredLookat = new THREE.Vector3()
-                    .fromArray(this.currentTransform.unprojectBasic(desiredBasicLookat, this._lookatDepth));
-            }
-            this._requestedBasicRotationUnbounded = null;
-        }
-        if (this._basicRotation[0] === 0 && this._basicRotation[1] === 0) {
-            return;
-        }
-        this._basicRotation[0] = this._rotationAcceleration * this._basicRotation[0];
-        this._basicRotation[1] = this._rotationAcceleration * this._basicRotation[1];
-        if (Math.abs(this._basicRotation[0]) < this._rotationThreshold / Math.pow(2, this._zoom) &&
-            Math.abs(this._basicRotation[1]) < this._rotationThreshold / Math.pow(2, this._zoom)) {
-            this._basicRotation = [0, 0];
-        }
-    };
-    TraversingState.prototype._clearRotation = function () {
-        if (this._currentNode.fullPano) {
-            return;
-        }
-        if (this._requestedRotationDelta != null) {
-            this._requestedRotationDelta = null;
-        }
-        if (!this._rotationDelta.isZero) {
-            this._rotationDelta.reset();
-        }
-        if (this._requestedBasicRotation != null) {
-            this._requestedBasicRotation = null;
-        }
-        if (this._basicRotation[0] > 0 || this._basicRotation[1] > 0) {
-            this._basicRotation = [0, 0];
-        }
-    };
-    TraversingState.prototype._setDesiredCenter = function () {
-        if (this._desiredCenter == null) {
-            return;
-        }
-        var lookatDirection = new THREE.Vector3()
-            .fromArray(this.currentTransform.unprojectBasic(this._desiredCenter, this._lookatDepth))
-            .sub(this._currentCamera.position);
-        this._currentCamera.lookat.copy(this._currentCamera.position.clone().add(lookatDirection));
-        this._previousCamera.lookat.copy(this._previousCamera.position.clone().add(lookatDirection));
-        this._desiredCenter = null;
-    };
-    TraversingState.prototype._setDesiredZoom = function () {
-        this._desiredZoom =
-            this._currentNode.fullPano || this._previousNode == null ?
-                this._zoom : 0;
-    };
     return TraversingState;
-}(State_1.StateBase));
+}(State_1.InteractiveStateBase));
 exports.TraversingState = TraversingState;
+exports.default = TraversingState;
 
-},{"../../State":233,"@mapbox/unitbezier":2,"three":176}],336:[function(require,module,exports){
+},{"../../State":298,"@mapbox/unitbezier":2}],459:[function(require,module,exports){
 "use strict";
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -37822,8 +54274,9 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.WaitingState = void 0;
 var State_1 = require("../../State");
-var WaitingState = (function (_super) {
+var WaitingState = /** @class */ (function (_super) {
     __extends(WaitingState, _super);
     function WaitingState(state) {
         var _this = _super.call(this, state) || this;
@@ -37835,8 +54288,8 @@ var WaitingState = (function (_super) {
     WaitingState.prototype.traverse = function () {
         return new State_1.TraversingState(this);
     };
-    WaitingState.prototype.wait = function () {
-        throw new Error("Not implemented");
+    WaitingState.prototype.waitInteractively = function () {
+        return new State_1.InteractiveWaitingState(this);
     };
     WaitingState.prototype.prepend = function (nodes) {
         _super.prototype.prepend.call(this, nodes);
@@ -37846,11 +54299,6 @@ var WaitingState = (function (_super) {
         _super.prototype.set.call(this, nodes);
         this._motionless = this._motionlessTransition();
     };
-    WaitingState.prototype.rotate = function (delta) { return; };
-    WaitingState.prototype.rotateBasic = function (basicRotation) { return; };
-    WaitingState.prototype.rotateBasicUnbounded = function (basicRotation) { return; };
-    WaitingState.prototype.rotateToBasic = function (basic) { return; };
-    WaitingState.prototype.zoomIn = function (delta, reference) { return; };
     WaitingState.prototype.move = function (delta) {
         this._alpha = Math.max(0, Math.min(1, this._alpha + delta));
     };
@@ -37860,8 +54308,6 @@ var WaitingState = (function (_super) {
     WaitingState.prototype.update = function (fps) {
         this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha);
     };
-    WaitingState.prototype.setCenter = function (center) { return; };
-    WaitingState.prototype.setZoom = function (zoom) { return; };
     WaitingState.prototype._getAlpha = function () {
         return this._motionless ? Math.round(this._alpha) : this._alpha;
     };
@@ -37885,17 +54331,19 @@ var WaitingState = (function (_super) {
     return WaitingState;
 }(State_1.StateBase));
 exports.WaitingState = WaitingState;
+exports.default = WaitingState;
 
-},{"../../State":233}],337:[function(require,module,exports){
+},{"../../State":298}],460:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("rxjs/Observable");
+exports.ImageTileLoader = void 0;
+var rxjs_1 = require("rxjs");
 /**
  * @class ImageTileLoader
  *
  * @classdesc Represents a loader of image tiles.
  */
-var ImageTileLoader = (function () {
+var ImageTileLoader = /** @class */ (function () {
     /**
      * Create a new node image tile loader instance.
      *
@@ -37932,7 +54380,7 @@ var ImageTileLoader = (function () {
             characteristics +
             this._origin;
         var xmlHTTP = null;
-        return [Observable_1.Observable.create(function (subscriber) {
+        return [rxjs_1.Observable.create(function (subscriber) {
                 xmlHTTP = new XMLHttpRequest();
                 xmlHTTP.open("GET", url, true);
                 xmlHTTP.responseType = "arraybuffer";
@@ -37978,15 +54426,16 @@ var ImageTileLoader = (function () {
 exports.ImageTileLoader = ImageTileLoader;
 exports.default = ImageTileLoader;
 
-},{"rxjs/Observable":29}],338:[function(require,module,exports){
+},{"rxjs":43}],461:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.ImageTileStore = void 0;
 /**
  * @class ImageTileStore
  *
  * @classdesc Represents a store for image tiles.
  */
-var ImageTileStore = (function () {
+var ImageTileStore = /** @class */ (function () {
     /**
      * Create a new node image tile store instance.
      */
@@ -38046,17 +54495,17 @@ var ImageTileStore = (function () {
 exports.ImageTileStore = ImageTileStore;
 exports.default = ImageTileStore;
 
-},{}],339:[function(require,module,exports){
+},{}],462:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.RegionOfInterestCalculator = void 0;
 var Geo_1 = require("../Geo");
 /**
  * @class RegionOfInterestCalculator
  *
  * @classdesc Represents a calculator for regions of interest.
  */
-var RegionOfInterestCalculator = (function () {
+var RegionOfInterestCalculator = /** @class */ (function () {
     function RegionOfInterestCalculator() {
         this._viewportCoords = new Geo_1.ViewportCoords();
     }
@@ -38187,18 +54636,19 @@ var RegionOfInterestCalculator = (function () {
 exports.RegionOfInterestCalculator = RegionOfInterestCalculator;
 exports.default = RegionOfInterestCalculator;
 
-},{"../Geo":229}],340:[function(require,module,exports){
+},{"../Geo":294}],463:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.TextureProvider = void 0;
+var operators_1 = require("rxjs/operators");
 var THREE = require("three");
-var Subject_1 = require("rxjs/Subject");
+var rxjs_1 = require("rxjs");
 /**
  * @class TextureProvider
  *
  * @classdesc Represents a provider of textures.
  */
-var TextureProvider = (function () {
+var TextureProvider = /** @class */ (function () {
     /**
      * Create a new node texture provider instance.
      *
@@ -38222,17 +54672,12 @@ var TextureProvider = (function () {
         this._maxLevel = Math.ceil(Math.log(Math.max(height, width)) / Math.log(2));
         this._currentLevel = -1;
         this._tileSize = tileSize;
-        this._updated$ = new Subject_1.Subject();
-        this._createdSubject$ = new Subject_1.Subject();
-        this._created$ = this._createdSubject$
-            .publishReplay(1)
-            .refCount();
+        this._updated$ = new rxjs_1.Subject();
+        this._createdSubject$ = new rxjs_1.Subject();
+        this._created$ = this._createdSubject$.pipe(operators_1.publishReplay(1), operators_1.refCount());
         this._createdSubscription = this._created$.subscribe(function () { });
-        this._hasSubject$ = new Subject_1.Subject();
-        this._has$ = this._hasSubject$
-            .startWith(false)
-            .publishReplay(1)
-            .refCount();
+        this._hasSubject$ = new rxjs_1.Subject();
+        this._has$ = this._hasSubject$.pipe(operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount());
         this._hasSubscription = this._has$.subscribe(function () { });
         this._abortFunctions = [];
         this._tileSubscriptions = {};
@@ -38256,7 +54701,7 @@ var TextureProvider = (function () {
         get: function () {
             return this._disposed;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TextureProvider.prototype, "hasTexture$", {
@@ -38270,7 +54715,7 @@ var TextureProvider = (function () {
         get: function () {
             return this._has$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TextureProvider.prototype, "key", {
@@ -38283,7 +54728,7 @@ var TextureProvider = (function () {
         get: function () {
             return this._key;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TextureProvider.prototype, "textureUpdated$", {
@@ -38296,7 +54741,7 @@ var TextureProvider = (function () {
         get: function () {
             return this._updated$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TextureProvider.prototype, "textureCreated$", {
@@ -38309,7 +54754,7 @@ var TextureProvider = (function () {
         get: function () {
             return this._created$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     /**
@@ -38374,7 +54819,7 @@ var TextureProvider = (function () {
         var width = 1 / this._roi.pixelWidth;
         var height = 1 / this._roi.pixelHeight;
         var size = Math.max(height, width);
-        var currentLevel = Math.max(0, Math.min(this._maxLevel, Math.round(Math.log(size) / Math.log(2) + 0.25)));
+        var currentLevel = Math.max(0, Math.min(this._maxLevel, Math.ceil(Math.log(size) / Math.log(2))));
         if (currentLevel !== this._currentLevel) {
             this.abort();
             this._currentLevel = currentLevel;
@@ -38384,7 +54829,7 @@ var TextureProvider = (function () {
             this._renderedCurrentLevelTiles = {};
             for (var _i = 0, _a = this._renderedTiles[this._currentLevel]; _i < _a.length; _i++) {
                 var tile = _a[_i];
-                this._renderedCurrentLevelTiles[this._tileKey(tile)] = true;
+                this._renderedCurrentLevelTiles[this._tileKey(this._tileSize, tile)] = true;
             }
         }
         var topLeft = this._getTileCoords([this._roi.bbox.minX, this._roi.bbox.minY]);
@@ -38412,6 +54857,9 @@ var TextureProvider = (function () {
         }
         this._fetchTiles(tiles);
     };
+    TextureProvider.prototype.setTileSize = function (tileSize) {
+        this._tileSize = tileSize;
+    };
     /**
      * Update the image used as background for the texture.
      *
@@ -38442,7 +54890,7 @@ var TextureProvider = (function () {
         var tile$ = getTile[0];
         var abort = getTile[1];
         this._abortFunctions.push(abort);
-        var tileKey = this._tileKey(tile);
+        var tileKey = this._tileKey(this._tileSize, tile);
         var subscription = tile$
             .subscribe(function (image) {
             _this._renderToTarget(x, y, w, h, image);
@@ -38474,7 +54922,7 @@ var TextureProvider = (function () {
         var tileSize = this._tileSize * Math.pow(2, this._maxLevel - this._currentLevel);
         for (var _i = 0, tiles_1 = tiles; _i < tiles_1.length; _i++) {
             var tile = tiles_1[_i];
-            var tileKey = this._tileKey(tile);
+            var tileKey = this._tileKey(this._tileSize, tile);
             if (tileKey in this._renderedCurrentLevelTiles ||
                 tileKey in this._tileSubscriptions) {
                 continue;
@@ -38588,8 +55036,10 @@ var TextureProvider = (function () {
         mesh.position.y = this._height / 2 - y - h / 2;
         var scene = new THREE.Scene();
         scene.add(mesh);
-        this._renderer.render(scene, this._camera, this._renderTarget);
-        this._renderer.setRenderTarget(undefined);
+        var target = this._renderer.getRenderTarget();
+        this._renderer.setRenderTarget(this._renderTarget);
+        this._renderer.render(scene, this._camera);
+        this._renderer.setRenderTarget(target);
         scene.remove(mesh);
         geometry.dispose();
         material.dispose();
@@ -38646,7 +55096,7 @@ var TextureProvider = (function () {
             }
         }
         this._renderedTiles[level].push(tile);
-        this._renderedCurrentLevelTiles[this._tileKey(tile)] = true;
+        this._renderedCurrentLevelTiles[this._tileKey(this._tileSize, tile)] = true;
     };
     /**
      * Create a tile key from a tile coordinates.
@@ -38654,20 +55104,56 @@ var TextureProvider = (function () {
      * @description Tile keys are used as a hash for
      * storing the tile in a dictionary.
      *
+     * @param {number} tileSize - The tile size.
      * @param {Arrary<number>} tile - The tile coordinates.
      */
-    TextureProvider.prototype._tileKey = function (tile) {
-        return tile[0] + "-" + tile[1];
+    TextureProvider.prototype._tileKey = function (tileSize, tile) {
+        return tileSize + "-" + tile[0] + "-" + tile[1];
     };
     return TextureProvider;
 }());
 exports.TextureProvider = TextureProvider;
 exports.default = TextureProvider;
 
-},{"rxjs/Subject":34,"three":176}],341:[function(require,module,exports){
+},{"rxjs":43,"rxjs/operators":241,"three":242}],464:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}],465:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DOM = void 0;
+var DOM = /** @class */ (function () {
+    function DOM(doc) {
+        this._document = !!doc ? doc : document;
+    }
+    Object.defineProperty(DOM.prototype, "document", {
+        get: function () {
+            return this._document;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    DOM.prototype.createElement = function (tagName, className, container) {
+        var element = this._document.createElement(tagName);
+        if (!!className) {
+            element.className = className;
+        }
+        if (!!container) {
+            container.appendChild(element);
+        }
+        return element;
+    };
+    return DOM;
+}());
+exports.DOM = DOM;
+exports.default = DOM;
+
+},{}],466:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var EventEmitter = (function () {
+exports.EventEmitter = void 0;
+var EventEmitter = /** @class */ (function () {
     function EventEmitter() {
         this._events = {};
     }
@@ -38723,94 +55209,219 @@ var EventEmitter = (function () {
 exports.EventEmitter = EventEmitter;
 exports.default = EventEmitter;
 
-},{}],342:[function(require,module,exports){
+},{}],467:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.Settings = void 0;
 var Viewer_1 = require("../Viewer");
-var Settings = (function () {
+var Settings = /** @class */ (function () {
     function Settings() {
     }
-    Settings.setOptions = function (options) {
-        Settings._baseImageSize = options.baseImageSize != null ?
-            options.baseImageSize :
-            Viewer_1.ImageSize.Size640;
-        Settings._basePanoramaSize = options.basePanoramaSize != null ?
-            options.basePanoramaSize :
-            Viewer_1.ImageSize.Size2048;
-        Settings._maxImageSize = options.maxImageSize != null ?
-            options.maxImageSize :
-            Viewer_1.ImageSize.Size2048;
-    };
     Object.defineProperty(Settings, "baseImageSize", {
         get: function () {
             return Settings._baseImageSize;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Settings, "basePanoramaSize", {
         get: function () {
             return Settings._basePanoramaSize;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Settings, "maxImageSize", {
         get: function () {
             return Settings._maxImageSize;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
+    Settings.setOptions = function (options) {
+        Settings._baseImageSize = options.baseImageSize != null ?
+            options.baseImageSize :
+            Viewer_1.ImageSize.Size640;
+        Settings._basePanoramaSize = options.basePanoramaSize != null ?
+            options.basePanoramaSize :
+            Viewer_1.ImageSize.Size2048;
+        Settings._maxImageSize = options.maxImageSize != null ?
+            options.maxImageSize :
+            Viewer_1.ImageSize.Size2048;
+    };
     return Settings;
 }());
 exports.Settings = Settings;
 exports.default = Settings;
 
-},{"../Viewer":236}],343:[function(require,module,exports){
+},{"../Viewer":302}],468:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isWebGLSupported = exports.isWebGLSupportedCached = exports.isBlobSupported = exports.isObjectSupported = exports.isJSONSupported = exports.isFunctionSupported = exports.isArraySupported = exports.isBrowser = void 0;
+function isBrowser() {
+    return typeof window !== "undefined" && typeof document !== "undefined";
+}
+exports.isBrowser = isBrowser;
+function isArraySupported() {
+    return !!(Array.prototype &&
+        Array.prototype.filter &&
+        Array.prototype.indexOf &&
+        Array.prototype.map &&
+        Array.prototype.reverse);
+}
+exports.isArraySupported = isArraySupported;
+function isFunctionSupported() {
+    return !!(Function.prototype && Function.prototype.bind);
+}
+exports.isFunctionSupported = isFunctionSupported;
+function isJSONSupported() {
+    return "JSON" in window && "parse" in JSON && "stringify" in JSON;
+}
+exports.isJSONSupported = isJSONSupported;
+function isObjectSupported() {
+    return !!(Object.keys &&
+        Object.assign);
+}
+exports.isObjectSupported = isObjectSupported;
+function isBlobSupported() {
+    return "Blob" in window && "URL" in window;
+}
+exports.isBlobSupported = isBlobSupported;
+var isWebGLSupportedCache = undefined;
+function isWebGLSupportedCached() {
+    if (isWebGLSupportedCache === undefined) {
+        isWebGLSupportedCache = isWebGLSupported();
+    }
+    return isWebGLSupportedCache;
+}
+exports.isWebGLSupportedCached = isWebGLSupportedCached;
+function isWebGLSupported() {
+    var webGLContextAttributes = {
+        alpha: false,
+        antialias: false,
+        depth: true,
+        failIfMajorPerformanceCaveat: false,
+        premultipliedAlpha: true,
+        preserveDrawingBuffer: false,
+        stencil: true,
+    };
+    var canvas = document.createElement("canvas");
+    var context = canvas.getContext("webgl", webGLContextAttributes) ||
+        canvas.getContext("experimental-webgl", webGLContextAttributes);
+    if (!context) {
+        return false;
+    }
+    var requiredExtensions = [
+        "OES_standard_derivatives",
+    ];
+    var supportedExtensions = context.getSupportedExtensions();
+    for (var _i = 0, requiredExtensions_1 = requiredExtensions; _i < requiredExtensions_1.length; _i++) {
+        var requiredExtension = requiredExtensions_1[_i];
+        if (supportedExtensions.indexOf(requiredExtension) === -1) {
+            return false;
+        }
+    }
+    return true;
+}
+exports.isWebGLSupported = isWebGLSupported;
+
+},{}],469:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var Urls = (function () {
+exports.Urls = void 0;
+var Urls = /** @class */ (function () {
     function Urls() {
     }
-    Object.defineProperty(Urls, "tileScheme", {
+    Object.defineProperty(Urls, "explore", {
         get: function () {
-            return "https";
+            return Urls._scheme + "://" + Urls._exploreHost;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(Urls, "tileDomain", {
+    Object.defineProperty(Urls, "origin", {
         get: function () {
-            return "d2qb1440i7l50o.cloudfront.net";
+            return Urls._origin;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
-    Object.defineProperty(Urls, "origin", {
+    Object.defineProperty(Urls, "tileScheme", {
         get: function () {
-            return "mapillary.webgl";
+            return Urls._scheme;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Urls, "tileDomain", {
+        get: function () {
+            return Urls._imageTileHost;
+        },
+        enumerable: false,
         configurable: true
     });
-    Urls.thumbnail = function (key, size) {
-        return "https://d1cuyjsrcm0gby.cloudfront.net/" + key + "/thumb-" + size + ".jpg?origin=" + this.origin;
+    Urls.clusterReconstruction = function (key) {
+        return Urls._scheme + "://" + Urls._clusterReconstructionHost + "/" + key + "/v1.0/aligned.jsonz";
+    };
+    Urls.exporeImage = function (key) {
+        return Urls._scheme + "://" + Urls._exploreHost + "/app/?pKey=" + key + "&focus=photo";
+    };
+    Urls.exporeUser = function (username) {
+        return Urls._scheme + "://" + Urls._exploreHost + "/app/user/" + username;
     };
     Urls.falcorModel = function (clientId) {
-        return "https://a.mapillary.com/v3/model.json?client_id=" + clientId;
+        return Urls._scheme + "://" + Urls._apiHost + "/v3/model.json?client_id=" + clientId;
     };
     Urls.protoMesh = function (key) {
-        return "https://d1brzeo354iq2l.cloudfront.net/v2/mesh/" + key;
+        return Urls._scheme + "://" + Urls._meshHost + "/v2/mesh/" + key;
     };
+    Urls.thumbnail = function (key, size, origin) {
+        var query = !!origin ? "?origin=" + origin : "";
+        return Urls._scheme + "://" + Urls._imageHost + "/" + key + "/thumb-" + size + ".jpg" + query;
+    };
+    Urls.setOptions = function (options) {
+        if (!options) {
+            return;
+        }
+        if (!!options.apiHost) {
+            Urls._apiHost = options.apiHost;
+        }
+        if (!!options.clusterReconstructionHost) {
+            Urls._clusterReconstructionHost = options.clusterReconstructionHost;
+        }
+        if (!!options.exploreHost) {
+            Urls._exploreHost = options.exploreHost;
+        }
+        if (!!options.imageHost) {
+            Urls._imageHost = options.imageHost;
+        }
+        if (!!options.imageTileHost) {
+            Urls._imageTileHost = options.imageTileHost;
+        }
+        if (!!options.meshHost) {
+            Urls._meshHost = options.meshHost;
+        }
+        if (!!options.scheme) {
+            Urls._scheme = options.scheme;
+        }
+    };
+    Urls._apiHost = "a.mapillary.com";
+    Urls._clusterReconstructionHost = "cluster-reconstructions.mapillary.com";
+    Urls._exploreHost = "www.mapillary.com";
+    Urls._imageHost = "images.mapillary.com";
+    Urls._imageTileHost = "loris.mapillary.com";
+    Urls._meshHost = "meshes.mapillary.com";
+    Urls._origin = "mapillary.webgl";
+    Urls._scheme = "https";
     return Urls;
 }());
 exports.Urls = Urls;
 exports.default = Urls;
 
-},{}],344:[function(require,module,exports){
+},{}],470:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.Alignment = void 0;
 /**
  * Enumeration for alignments
  * @enum {number}
@@ -38857,15 +55468,14 @@ var Alignment;
 })(Alignment = exports.Alignment || (exports.Alignment = {}));
 exports.default = Alignment;
 
-},{}],345:[function(require,module,exports){
+},{}],471:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs/add/operator/bufferCount");
-require("rxjs/add/operator/delay");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/switchMap");
-var CacheService = (function () {
+exports.CacheService = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Graph_1 = require("../Graph");
+var CacheService = /** @class */ (function () {
     function CacheService(graphService, stateService) {
         this._graphService = graphService;
         this._stateService = stateService;
@@ -38875,7 +55485,7 @@ var CacheService = (function () {
         get: function () {
             return this._started;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     CacheService.prototype.start = function () {
@@ -38883,21 +55493,40 @@ var CacheService = (function () {
         if (this._started) {
             return;
         }
-        this._uncacheSubscription = this._stateService.currentState$
-            .distinctUntilChanged(undefined, function (frame) {
+        this._uncacheSubscription = this._stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
             return frame.state.currentNode.key;
-        })
-            .map(function (frame) {
-            return frame.state.trajectory
+        }), operators_1.map(function (frame) {
+            var trajectory = frame.state.trajectory;
+            var trajectoryKeys = trajectory
                 .map(function (n) {
                 return n.key;
             });
-        })
-            .bufferCount(1, 5)
-            .switchMap(function (keepKeysBuffer) {
-            var keepKeys = keepKeysBuffer[0];
-            return _this._graphService.uncache$(keepKeys);
-        })
+            var sequenceKey = trajectory[trajectory.length - 1].sequenceKey;
+            return [trajectoryKeys, sequenceKey];
+        }), operators_1.bufferCount(1, 5), operators_1.withLatestFrom(this._graphService.graphMode$), operators_1.switchMap(function (_a) {
+            var keepBuffer = _a[0], graphMode = _a[1];
+            var keepKeys = keepBuffer[0][0];
+            var keepSequenceKey = graphMode === Graph_1.GraphMode.Sequence ?
+                keepBuffer[0][1] : undefined;
+            return _this._graphService.uncache$(keepKeys, keepSequenceKey);
+        }))
+            .subscribe(function () { });
+        this._cacheNodeSubscription = this._graphService.graphMode$.pipe(operators_1.skip(1), operators_1.withLatestFrom(this._stateService.currentState$), operators_1.switchMap(function (_a) {
+            var mode = _a[0], frame = _a[1];
+            return mode === Graph_1.GraphMode.Sequence ?
+                _this._keyToEdges(frame.state.currentNode.key, function (node) {
+                    return node.sequenceEdges$;
+                }) :
+                rxjs_1.from(frame.state.trajectory
+                    .map(function (node) {
+                    return node.key;
+                })
+                    .slice(frame.state.currentIndex)).pipe(operators_1.mergeMap(function (key) {
+                    return _this._keyToEdges(key, function (node) {
+                        return node.spatialEdges$;
+                    });
+                }, 6));
+        }))
             .subscribe(function () { });
         this._started = true;
     };
@@ -38907,26 +55536,41 @@ var CacheService = (function () {
         }
         this._uncacheSubscription.unsubscribe();
         this._uncacheSubscription = null;
+        this._cacheNodeSubscription.unsubscribe();
+        this._cacheNodeSubscription = null;
         this._started = false;
     };
+    CacheService.prototype._keyToEdges = function (key, nodeToEdgeMap) {
+        return this._graphService.cacheNode$(key).pipe(operators_1.switchMap(nodeToEdgeMap), operators_1.first(function (status) {
+            return status.cached;
+        }), operators_1.timeout(15000), operators_1.catchError(function (error) {
+            console.error("Failed to cache edges (" + key + ").", error);
+            return rxjs_1.empty();
+        }));
+    };
     return CacheService;
 }());
 exports.CacheService = CacheService;
 exports.default = CacheService;
 
-},{"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/delay":56,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/switchMap":79}],346:[function(require,module,exports){
+},{"../Graph":295,"rxjs":43,"rxjs/operators":241}],472:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.ComponentController = void 0;
+var operators_1 = require("rxjs/operators");
 var Component_1 = require("../Component");
-var ComponentController = (function () {
-    function ComponentController(container, navigator, observer, key, options) {
+var ComponentController = /** @class */ (function () {
+    function ComponentController(container, navigator, observer, key, options, componentService) {
         var _this = this;
         this._container = container;
         this._observer = observer;
         this._navigator = navigator;
         this._options = options != null ? options : {};
         this._key = key;
-        this._componentService = new Component_1.ComponentService(this._container, this._navigator);
+        this._navigable = key == null;
+        this._componentService = !!componentService ?
+            componentService :
+            new Component_1.ComponentService(this._container, this._navigator);
         this._coverComponent = this._componentService.getCover();
         this._initializeComponents();
         if (key) {
@@ -38934,20 +55578,28 @@ var ComponentController = (function () {
             this._subscribeCoverComponent();
         }
         else {
-            this._navigator.movedToKey$
-                .first(function (k) {
+            this._navigator.movedToKey$.pipe(operators_1.first(function (k) {
                 return k != null;
-            })
+            }))
                 .subscribe(function (k) {
                 _this._key = k;
                 _this._componentService.deactivateCover();
-                _this._coverComponent.configure({ key: _this._key, loading: false, visible: false });
+                _this._coverComponent.configure({ key: _this._key, state: Component_1.CoverState.Hidden });
                 _this._subscribeCoverComponent();
                 _this._navigator.stateService.start();
+                _this._navigator.cacheService.start();
+                _this._navigator.panService.start();
                 _this._observer.startEmit();
             });
         }
     }
+    Object.defineProperty(ComponentController.prototype, "navigable", {
+        get: function () {
+            return this._navigable;
+        },
+        enumerable: false,
+        configurable: true
+    });
     ComponentController.prototype.get = function (name) {
         return this._componentService.get(name);
     };
@@ -38955,16 +55607,13 @@ var ComponentController = (function () {
         this._componentService.activate(name);
     };
     ComponentController.prototype.activateCover = function () {
-        this._coverComponent.configure({ loading: false, visible: true });
+        this._coverComponent.configure({ state: Component_1.CoverState.Visible });
     };
     ComponentController.prototype.deactivate = function (name) {
         this._componentService.deactivate(name);
     };
     ComponentController.prototype.deactivateCover = function () {
-        this._coverComponent.configure({ loading: true, visible: true });
-    };
-    ComponentController.prototype.resize = function () {
-        this._componentService.resize();
+        this._coverComponent.configure({ state: Component_1.CoverState.Loading });
     };
     ComponentController.prototype._initializeComponents = function () {
         var options = this._options;
@@ -38976,6 +55625,7 @@ var ComponentController = (function () {
         this._uFalse(options.popup, "popup");
         this._uFalse(options.route, "route");
         this._uFalse(options.slider, "slider");
+        this._uFalse(options.spatialData, "spatialData");
         this._uFalse(options.tag, "tag");
         this._uTrue(options.attribution, "attribution");
         this._uTrue(options.bearing, "bearing");
@@ -38987,6 +55637,7 @@ var ComponentController = (function () {
         this._uTrue(options.mouse, "mouse");
         this._uTrue(options.sequence, "sequence");
         this._uTrue(options.stats, "stats");
+        this._uTrue(options.zoom, "zoom");
     };
     ComponentController.prototype._initilizeCoverComponent = function () {
         var options = this._options;
@@ -38998,32 +55649,50 @@ var ComponentController = (function () {
             this.deactivateCover();
         }
     };
+    ComponentController.prototype._setNavigable = function (navigable) {
+        if (this._navigable === navigable) {
+            return;
+        }
+        this._navigable = navigable;
+        this._observer.navigable$.next(navigable);
+    };
     ComponentController.prototype._subscribeCoverComponent = function () {
         var _this = this;
-        this._coverComponent.configuration$.subscribe(function (conf) {
-            if (conf.loading) {
-                _this._navigator.stateService.currentKey$
-                    .first()
-                    .switchMap(function (key) {
-                    return key == null || key !== conf.key ?
+        this._coverComponent.configuration$.pipe(operators_1.distinctUntilChanged(undefined, function (c) {
+            return c.state;
+        }))
+            .subscribe(function (conf) {
+            if (conf.state === Component_1.CoverState.Loading) {
+                _this._navigator.stateService.currentKey$.pipe(operators_1.first(), operators_1.switchMap(function (key) {
+                    var keyChanged = key == null || key !== conf.key;
+                    if (keyChanged) {
+                        _this._setNavigable(false);
+                    }
+                    return keyChanged ?
                         _this._navigator.moveToKey$(conf.key) :
-                        _this._navigator.stateService.currentNode$
-                            .first();
-                })
-                    .subscribe(function (node) {
+                        _this._navigator.stateService.currentNode$.pipe(operators_1.first());
+                }))
+                    .subscribe(function () {
                     _this._navigator.stateService.start();
+                    _this._navigator.cacheService.start();
+                    _this._navigator.panService.start();
                     _this._observer.startEmit();
-                    _this._coverComponent.configure({ loading: false, visible: false });
+                    _this._coverComponent.configure({ state: Component_1.CoverState.Hidden });
                     _this._componentService.deactivateCover();
+                    _this._setNavigable(true);
                 }, function (error) {
                     console.error("Failed to deactivate cover.", error);
-                    _this._coverComponent.configure({ loading: false, visible: true });
+                    _this._coverComponent.configure({ state: Component_1.CoverState.Visible });
                 });
             }
-            else if (conf.visible) {
+            else if (conf.state === Component_1.CoverState.Visible) {
                 _this._observer.stopEmit();
                 _this._navigator.stateService.stop();
+                _this._navigator.cacheService.stop();
+                _this._navigator.playService.stop();
+                _this._navigator.panService.stop();
                 _this._componentService.activateCover();
+                _this._setNavigable(conf.key == null);
             }
         });
     };
@@ -39065,29 +55734,37 @@ var ComponentController = (function () {
 }());
 exports.ComponentController = ComponentController;
 
-},{"../Component":226}],347:[function(require,module,exports){
+},{"../Component":291,"rxjs/operators":241}],473:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.Container = void 0;
 var Render_1 = require("../Render");
+var Utils_1 = require("../Utils");
 var Viewer_1 = require("../Viewer");
-var Container = (function () {
-    function Container(id, stateService, options) {
-        this.id = id;
-        this._container = document.getElementById(id);
-        if (!this._container) {
-            throw new Error("Container '" + id + "' not found.");
+var Container = /** @class */ (function () {
+    function Container(container, stateService, options, dom) {
+        this._dom = !!dom ? dom : new Utils_1.DOM();
+        if (typeof container === 'string') {
+            this._container = this._dom.document.getElementById(container);
+            if (!this._container) {
+                throw new Error("Container '" + container + "' not found.");
+            }
+        }
+        else if (container instanceof HTMLElement) {
+            this._container = container;
         }
+        else {
+            throw new Error("Invalid type: 'container' must be a String or HTMLElement.");
+        }
+        this.id = !!this._container.id ? this._container.id : "mapillary-js-fallback-container-id";
         this._container.classList.add("mapillary-js");
-        this._canvasContainer = document.createElement("div");
-        this._canvasContainer.className = "mapillary-js-interactive";
-        this._domContainer = document.createElement("div");
-        this._domContainer.className = "mapillary-js-dom";
-        this._container.appendChild(this._canvasContainer);
-        this._container.appendChild(this._domContainer);
+        this._canvasContainer = this._dom.createElement("div", "mapillary-js-interactive", this._container);
+        this._domContainer = this._dom.createElement("div", "mapillary-js-dom", this._container);
         this.renderService = new Render_1.RenderService(this._container, stateService.currentState$, options.renderMode);
-        this.glRenderer = new Render_1.GLRenderer(this._canvasContainer, this.renderService);
+        this.glRenderer = new Render_1.GLRenderer(this._canvasContainer, this.renderService, this._dom);
         this.domRenderer = new Render_1.DOMRenderer(this._domContainer, this.renderService, stateService.currentState$);
-        this.mouseService = new Viewer_1.MouseService(this._container, this._canvasContainer, this._domContainer);
+        this.keyboardService = new Viewer_1.KeyboardService(this._canvasContainer);
+        this.mouseService = new Viewer_1.MouseService(this._container, this._canvasContainer, this._domContainer, document);
         this.touchService = new Viewer_1.TouchService(this._canvasContainer, this._domContainer);
         this.spriteService = new Viewer_1.SpriteService(options.sprite);
     }
@@ -39095,14 +55772,21 @@ var Container = (function () {
         get: function () {
             return this._container;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Container.prototype, "canvasContainer", {
         get: function () {
-            return this.canvasContainer;
+            return this._canvasContainer;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Container.prototype, "domContainer", {
+        get: function () {
+            return this._domContainer;
+        },
+        enumerable: false,
         configurable: true
     });
     return Container;
@@ -39110,9 +55794,10 @@ var Container = (function () {
 exports.Container = Container;
 exports.default = Container;
 
-},{"../Render":232,"../Viewer":236}],348:[function(require,module,exports){
+},{"../Render":297,"../Utils":301,"../Viewer":302}],474:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.ImageSize = void 0;
 /**
  * Enumeration for image sizes
  * @enum {number}
@@ -39139,53 +55824,72 @@ var ImageSize;
     ImageSize[ImageSize["Size2048"] = 2048] = "Size2048";
 })(ImageSize = exports.ImageSize || (exports.ImageSize = {}));
 
-},{}],349:[function(require,module,exports){
+},{}],475:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.KeyboardService = void 0;
+var rxjs_1 = require("rxjs");
+var KeyboardService = /** @class */ (function () {
+    function KeyboardService(canvasContainer) {
+        this._keyDown$ = rxjs_1.fromEvent(canvasContainer, "keydown");
+        this._keyUp$ = rxjs_1.fromEvent(canvasContainer, "keyup");
+    }
+    Object.defineProperty(KeyboardService.prototype, "keyDown$", {
+        get: function () {
+            return this._keyDown$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(KeyboardService.prototype, "keyUp$", {
+        get: function () {
+            return this._keyUp$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    return KeyboardService;
+}());
+exports.KeyboardService = KeyboardService;
+exports.default = KeyboardService;
+
+},{"rxjs":43}],476:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
-var _ = require("underscore");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/debounceTime");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/startWith");
-var LoadingService = (function () {
+exports.LoadingService = void 0;
+var operators_1 = require("rxjs/operators");
+var rxjs_1 = require("rxjs");
+var LoadingService = /** @class */ (function () {
     function LoadingService() {
-        this._loadersSubject$ = new Subject_1.Subject();
-        this._loaders$ = this._loadersSubject$
-            .scan(function (loaders, loader) {
+        this._loadersSubject$ = new rxjs_1.Subject();
+        this._loaders$ = this._loadersSubject$.pipe(operators_1.scan(function (loaders, loader) {
             if (loader.task !== undefined) {
                 loaders[loader.task] = loader.loading;
             }
             return loaders;
-        }, {})
-            .startWith({})
-            .publishReplay(1)
-            .refCount();
+        }, {}), operators_1.startWith({}), operators_1.publishReplay(1), operators_1.refCount());
     }
     Object.defineProperty(LoadingService.prototype, "loading$", {
         get: function () {
-            return this._loaders$
-                .map(function (loaders) {
-                return _.reduce(loaders, function (loader, acc) {
-                    return (loader || acc);
-                }, false);
-            })
-                .debounceTime(100)
-                .distinctUntilChanged();
+            return this._loaders$.pipe(operators_1.map(function (loaders) {
+                for (var key in loaders) {
+                    if (!loaders.hasOwnProperty(key)) {
+                        continue;
+                    }
+                    if (loaders[key]) {
+                        return true;
+                    }
+                }
+                return false;
+            }), operators_1.debounceTime(100), operators_1.distinctUntilChanged());
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     LoadingService.prototype.taskLoading$ = function (task) {
-        return this._loaders$
-            .map(function (loaders) {
+        return this._loaders$.pipe(operators_1.map(function (loaders) {
             return !!loaders[task];
-        })
-            .debounceTime(100)
-            .distinctUntilChanged();
+        }), operators_1.debounceTime(100), operators_1.distinctUntilChanged());
     };
     LoadingService.prototype.startLoading = function (task) {
         this._loadersSubject$.next({ loading: true, task: task });
@@ -39198,51 +55902,55 @@ var LoadingService = (function () {
 exports.LoadingService = LoadingService;
 exports.default = LoadingService;
 
-},{"rxjs/Subject":34,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/startWith":78,"underscore":178}],350:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/fromEvent");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/withLatestFrom");
-var Geo_1 = require("../Geo");
-var MouseService = (function () {
-    function MouseService(container, canvasContainer, domContainer, viewportCoords) {
+},{"rxjs":43,"rxjs/operators":241}],477:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.MouseService = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var MouseService = /** @class */ (function () {
+    function MouseService(container, canvasContainer, domContainer, doc) {
         var _this = this;
-        this._canvasContainer = canvasContainer;
-        this._domContainer = domContainer;
-        this._viewportCoords = viewportCoords != null ? viewportCoords : new Geo_1.ViewportCoords();
-        this._activeSubject$ = new BehaviorSubject_1.BehaviorSubject(false);
-        this._active$ = this._activeSubject$
-            .distinctUntilChanged()
-            .publishReplay(1)
-            .refCount();
-        this._claimMouse$ = new Subject_1.Subject();
-        this._documentMouseMove$ = Observable_1.Observable.fromEvent(document, "mousemove");
-        this._documentMouseUp$ = Observable_1.Observable.fromEvent(document, "mouseup");
-        this._mouseDown$ = Observable_1.Observable.fromEvent(canvasContainer, "mousedown");
-        this._mouseLeave$ = Observable_1.Observable.fromEvent(canvasContainer, "mouseleave");
-        this._mouseMove$ = Observable_1.Observable.fromEvent(canvasContainer, "mousemove");
-        this._mouseUp$ = Observable_1.Observable.fromEvent(canvasContainer, "mouseup");
-        this._mouseOut$ = Observable_1.Observable.fromEvent(canvasContainer, "mouseout");
-        this._mouseOver$ = Observable_1.Observable.fromEvent(canvasContainer, "mouseover");
-        this._domMouseDown$ = Observable_1.Observable.fromEvent(domContainer, "mousedown");
-        this._domMouseMove$ = Observable_1.Observable.fromEvent(domContainer, "mousemove");
-        this._click$ = Observable_1.Observable.fromEvent(canvasContainer, "click");
-        this._contextMenu$ = Observable_1.Observable.fromEvent(canvasContainer, "contextmenu");
-        this._dblClick$ = Observable_1.Observable
-            .merge(Observable_1.Observable.fromEvent(container, "click"), Observable_1.Observable.fromEvent(canvasContainer, "dblclick"))
-            .bufferCount(3, 1)
-            .filter(function (events) {
+        this._activeSubject$ = new rxjs_1.BehaviorSubject(false);
+        this._active$ = this._activeSubject$.pipe(operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
+        this._claimMouse$ = new rxjs_1.Subject();
+        this._claimWheel$ = new rxjs_1.Subject();
+        this._deferPixelClaims$ = new rxjs_1.Subject();
+        this._deferPixels$ = this._deferPixelClaims$.pipe(operators_1.scan(function (claims, claim) {
+            if (claim.deferPixels == null) {
+                delete claims[claim.name];
+            }
+            else {
+                claims[claim.name] = claim.deferPixels;
+            }
+            return claims;
+        }, {}), operators_1.map(function (claims) {
+            var deferPixelMax = -1;
+            for (var key in claims) {
+                if (!claims.hasOwnProperty(key)) {
+                    continue;
+                }
+                var deferPixels = claims[key];
+                if (deferPixels > deferPixelMax) {
+                    deferPixelMax = deferPixels;
+                }
+            }
+            return deferPixelMax;
+        }), operators_1.startWith(-1), operators_1.publishReplay(1), operators_1.refCount());
+        this._deferPixels$.subscribe(function () { });
+        this._documentMouseMove$ = rxjs_1.fromEvent(doc, "mousemove");
+        this._documentMouseUp$ = rxjs_1.fromEvent(doc, "mouseup");
+        this._mouseDown$ = rxjs_1.fromEvent(canvasContainer, "mousedown");
+        this._mouseLeave$ = rxjs_1.fromEvent(canvasContainer, "mouseleave");
+        this._mouseMove$ = rxjs_1.fromEvent(canvasContainer, "mousemove");
+        this._mouseUp$ = rxjs_1.fromEvent(canvasContainer, "mouseup");
+        this._mouseOut$ = rxjs_1.fromEvent(canvasContainer, "mouseout");
+        this._mouseOver$ = rxjs_1.fromEvent(canvasContainer, "mouseover");
+        this._domMouseDown$ = rxjs_1.fromEvent(domContainer, "mousedown");
+        this._domMouseMove$ = rxjs_1.fromEvent(domContainer, "mousemove");
+        this._click$ = rxjs_1.fromEvent(canvasContainer, "click");
+        this._contextMenu$ = rxjs_1.fromEvent(canvasContainer, "contextmenu");
+        this._dblClick$ = rxjs_1.merge(rxjs_1.fromEvent(container, "click"), rxjs_1.fromEvent(canvasContainer, "dblclick")).pipe(operators_1.bufferCount(3, 1), operators_1.filter(function (events) {
             var event1 = events[0];
             var event2 = events[1];
             var event3 = events[2];
@@ -39251,278 +55959,224 @@ var MouseService = (function () {
                 event3.type === "dblclick" &&
                 event1.target.parentNode === canvasContainer &&
                 event2.target.parentNode === canvasContainer;
-        })
-            .map(function (events) {
+        }), operators_1.map(function (events) {
             return events[2];
-        })
-            .share();
-        Observable_1.Observable
-            .merge(this._domMouseDown$, this._domMouseMove$, this._dblClick$, this._contextMenu$)
+        }), operators_1.share());
+        rxjs_1.merge(this._domMouseDown$, this._domMouseMove$, this._dblClick$, this._contextMenu$)
             .subscribe(function (event) {
             event.preventDefault();
         });
-        this._mouseWheel$ = Observable_1.Observable
-            .merge(Observable_1.Observable.fromEvent(canvasContainer, "wheel"), Observable_1.Observable.fromEvent(domContainer, "wheel"));
-        this._consistentContextMenu$ = Observable_1.Observable
-            .merge(this._mouseDown$, this._mouseMove$, this._mouseOut$, this._mouseUp$, this._contextMenu$)
-            .bufferCount(3, 1)
-            .filter(function (events) {
+        this._mouseWheel$ = rxjs_1.merge(rxjs_1.fromEvent(canvasContainer, "wheel"), rxjs_1.fromEvent(domContainer, "wheel")).pipe(operators_1.share());
+        this._consistentContextMenu$ = rxjs_1.merge(this._mouseDown$, this._mouseMove$, this._mouseOut$, this._mouseUp$, this._contextMenu$).pipe(operators_1.bufferCount(3, 1), operators_1.filter(function (events) {
             // fire context menu on mouse up both on mac and windows
             return events[0].type === "mousedown" &&
                 events[1].type === "contextmenu" &&
                 events[2].type === "mouseup";
-        })
-            .map(function (events) {
+        }), operators_1.map(function (events) {
             return events[1];
-        })
-            .share();
-        var dragStop$ = Observable_1.Observable
-            .merge(Observable_1.Observable.fromEvent(window, "blur"), this._documentMouseUp$
-            .filter(function (e) {
-            return e.button === 0;
-        }))
-            .share();
-        var leftButtonDown$ = this._mouseDown$
-            .filter(function (e) {
+        }), operators_1.share());
+        var dragStop$ = rxjs_1.merge(rxjs_1.fromEvent(window, "blur"), this._documentMouseUp$.pipe(operators_1.filter(function (e) {
             return e.button === 0;
-        })
-            .share();
-        this._mouseDragStart$ = leftButtonDown$
-            .mergeMap(function (e) {
-            return _this._documentMouseMove$
-                .takeUntil(dragStop$)
-                .take(1);
-        });
-        this._mouseDrag$ = leftButtonDown$
-            .mergeMap(function (e) {
-            return _this._documentMouseMove$
-                .skip(1)
-                .takeUntil(dragStop$);
-        });
-        this._mouseDragEnd$ = this._mouseDragStart$
-            .mergeMap(function (e) {
-            return dragStop$.first();
-        });
-        var containerLeftButtonDown$ = this._domMouseDown$
-            .filter(function (e) {
-            return e.button === 0;
-        })
-            .share();
-        this._domMouseDragStart$ = containerLeftButtonDown$
-            .mergeMap(function (e) {
-            return _this._documentMouseMove$
-                .takeUntil(dragStop$)
-                .take(1);
-        });
-        this._domMouseDrag$ = containerLeftButtonDown$
-            .mergeMap(function (e) {
-            return _this._documentMouseMove$
-                .skip(1)
-                .takeUntil(dragStop$);
-        });
-        this._domMouseDragEnd$ = this._domMouseDragStart$
-            .mergeMap(function (e) {
-            return dragStop$.first();
-        });
-        this._staticClick$ = this._mouseDown$
-            .switchMap(function (e) {
-            return _this._click$
-                .takeUntil(_this._mouseMove$)
-                .take(1);
-        });
-        this._mouseOwner$ = this._claimMouse$
-            .scan(function (claims, mouseClaim) {
-            if (mouseClaim.zindex == null) {
-                delete claims[mouseClaim.name];
-            }
-            else {
-                claims[mouseClaim.name] = mouseClaim.zindex;
-            }
-            return claims;
-        }, {})
-            .map(function (claims) {
-            var owner = null;
-            var curZ = -1;
-            for (var name_1 in claims) {
-                if (claims.hasOwnProperty(name_1)) {
-                    if (claims[name_1] > curZ) {
-                        curZ = claims[name_1];
-                        owner = name_1;
-                    }
-                }
-            }
-            return owner;
-        })
-            .publishReplay(1)
-            .refCount();
+        }))).pipe(operators_1.share());
+        var mouseDragInitiate$ = this._createMouseDragInitiate$(this._mouseDown$, dragStop$, true).pipe(operators_1.share());
+        this._mouseDragStart$ = this._createMouseDragStart$(mouseDragInitiate$).pipe(operators_1.share());
+        this._mouseDrag$ = this._createMouseDrag$(mouseDragInitiate$, dragStop$).pipe(operators_1.share());
+        this._mouseDragEnd$ = this._createMouseDragEnd$(this._mouseDragStart$, dragStop$).pipe(operators_1.share());
+        var domMouseDragInitiate$ = this._createMouseDragInitiate$(this._domMouseDown$, dragStop$, false).pipe(operators_1.share());
+        this._domMouseDragStart$ = this._createMouseDragStart$(domMouseDragInitiate$).pipe(operators_1.share());
+        this._domMouseDrag$ = this._createMouseDrag$(domMouseDragInitiate$, dragStop$).pipe(operators_1.share());
+        this._domMouseDragEnd$ = this._createMouseDragEnd$(this._domMouseDragStart$, dragStop$).pipe(operators_1.share());
+        this._proximateClick$ = this._mouseDown$.pipe(operators_1.switchMap(function (mouseDown) {
+            return _this._click$.pipe(operators_1.takeUntil(_this._createDeferredMouseMove$(mouseDown, _this._documentMouseMove$)), operators_1.take(1));
+        }), operators_1.share());
+        this._staticClick$ = this._mouseDown$.pipe(operators_1.switchMap(function (e) {
+            return _this._click$.pipe(operators_1.takeUntil(_this._documentMouseMove$), operators_1.take(1));
+        }), operators_1.share());
+        this._mouseDragStart$.subscribe();
+        this._mouseDrag$.subscribe();
+        this._mouseDragEnd$.subscribe();
+        this._domMouseDragStart$.subscribe();
+        this._domMouseDrag$.subscribe();
+        this._domMouseDragEnd$.subscribe();
+        this._staticClick$.subscribe();
+        this._mouseOwner$ = this._createOwner$(this._claimMouse$).pipe(operators_1.publishReplay(1), operators_1.refCount());
+        this._wheelOwner$ = this._createOwner$(this._claimWheel$).pipe(operators_1.publishReplay(1), operators_1.refCount());
         this._mouseOwner$.subscribe(function () { });
+        this._wheelOwner$.subscribe(function () { });
     }
     Object.defineProperty(MouseService.prototype, "active$", {
         get: function () {
             return this._active$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "activate$", {
         get: function () {
             return this._activeSubject$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "documentMouseMove$", {
         get: function () {
             return this._documentMouseMove$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "documentMouseUp$", {
         get: function () {
             return this._documentMouseUp$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "domMouseDragStart$", {
         get: function () {
             return this._domMouseDragStart$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "domMouseDrag$", {
         get: function () {
             return this._domMouseDrag$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "domMouseDragEnd$", {
         get: function () {
             return this._domMouseDragEnd$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "domMouseDown$", {
         get: function () {
             return this._domMouseDown$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "domMouseMove$", {
         get: function () {
             return this._domMouseMove$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseOwner$", {
         get: function () {
             return this._mouseOwner$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseDown$", {
         get: function () {
             return this._mouseDown$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseMove$", {
         get: function () {
             return this._mouseMove$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseLeave$", {
         get: function () {
             return this._mouseLeave$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseOut$", {
         get: function () {
             return this._mouseOut$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseOver$", {
         get: function () {
             return this._mouseOver$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseUp$", {
         get: function () {
             return this._mouseUp$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "click$", {
         get: function () {
             return this._click$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "dblClick$", {
         get: function () {
             return this._dblClick$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "contextMenu$", {
         get: function () {
             return this._consistentContextMenu$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseWheel$", {
         get: function () {
             return this._mouseWheel$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseDragStart$", {
         get: function () {
             return this._mouseDragStart$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseDrag$", {
         get: function () {
             return this._mouseDrag$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "mouseDragEnd$", {
         get: function () {
             return this._mouseDragEnd$;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(MouseService.prototype, "proximateClick$", {
+        get: function () {
+            return this._proximateClick$;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(MouseService.prototype, "staticClick$", {
         get: function () {
             return this._staticClick$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     MouseService.prototype.claimMouse = function (name, zindex) {
@@ -39531,43 +56185,120 @@ var MouseService = (function () {
     MouseService.prototype.unclaimMouse = function (name) {
         this._claimMouse$.next({ name: name, zindex: null });
     };
+    MouseService.prototype.deferPixels = function (name, deferPixels) {
+        this._deferPixelClaims$.next({ name: name, deferPixels: deferPixels });
+    };
+    MouseService.prototype.undeferPixels = function (name) {
+        this._deferPixelClaims$.next({ name: name, deferPixels: null });
+    };
+    MouseService.prototype.claimWheel = function (name, zindex) {
+        this._claimWheel$.next({ name: name, zindex: zindex });
+    };
+    MouseService.prototype.unclaimWheel = function (name) {
+        this._claimWheel$.next({ name: name, zindex: null });
+    };
     MouseService.prototype.filtered$ = function (name, observable$) {
-        return observable$
-            .withLatestFrom(this.mouseOwner$, function (event, owner) {
-            return [event, owner];
-        })
-            .filter(function (eo) {
-            return eo[1] === name;
-        })
-            .map(function (eo) {
-            return eo[0];
-        });
+        return this._filtered(name, observable$, this._mouseOwner$);
+    };
+    MouseService.prototype.filteredWheel$ = function (name, observable$) {
+        return this._filtered(name, observable$, this._wheelOwner$);
+    };
+    MouseService.prototype._createDeferredMouseMove$ = function (origin, mouseMove$) {
+        return mouseMove$.pipe(operators_1.map(function (mouseMove) {
+            var deltaX = mouseMove.clientX - origin.clientX;
+            var deltaY = mouseMove.clientY - origin.clientY;
+            return [mouseMove, Math.sqrt(deltaX * deltaX + deltaY * deltaY)];
+        }), operators_1.withLatestFrom(this._deferPixels$), operators_1.filter(function (_a) {
+            var _b = _a[0], mouseMove = _b[0], delta = _b[1], deferPixels = _a[1];
+            return delta > deferPixels;
+        }), operators_1.map(function (_a) {
+            var _b = _a[0], mouseMove = _b[0], delta = _b[1], deferPixels = _a[1];
+            return mouseMove;
+        }));
+    };
+    MouseService.prototype._createMouseDrag$ = function (mouseDragStartInitiate$, stop$) {
+        var _this = this;
+        return mouseDragStartInitiate$.pipe(operators_1.map(function (_a) {
+            var mouseDown = _a[0], mouseMove = _a[1];
+            return mouseMove;
+        }), operators_1.switchMap(function (mouseMove) {
+            return rxjs_1.concat(rxjs_1.of(mouseMove), _this._documentMouseMove$).pipe(operators_1.takeUntil(stop$));
+        }));
+    };
+    MouseService.prototype._createMouseDragEnd$ = function (mouseDragStart$, stop$) {
+        return mouseDragStart$.pipe(operators_1.switchMap(function (event) {
+            return stop$.pipe(operators_1.first());
+        }));
+    };
+    MouseService.prototype._createMouseDragStart$ = function (mouseDragStartInitiate$) {
+        return mouseDragStartInitiate$.pipe(operators_1.map(function (_a) {
+            var mouseDown = _a[0], mouseMove = _a[1];
+            return mouseDown;
+        }));
+    };
+    MouseService.prototype._createMouseDragInitiate$ = function (mouseDown$, stop$, defer) {
+        var _this = this;
+        return mouseDown$.pipe(operators_1.filter(function (mouseDown) {
+            return mouseDown.button === 0;
+        }), operators_1.switchMap(function (mouseDown) {
+            return rxjs_1.combineLatest(rxjs_1.of(mouseDown), defer ?
+                _this._createDeferredMouseMove$(mouseDown, _this._documentMouseMove$) :
+                _this._documentMouseMove$).pipe(operators_1.takeUntil(stop$), operators_1.take(1));
+        }));
+    };
+    MouseService.prototype._createOwner$ = function (claim$) {
+        return claim$.pipe(operators_1.scan(function (claims, claim) {
+            if (claim.zindex == null) {
+                delete claims[claim.name];
+            }
+            else {
+                claims[claim.name] = claim.zindex;
+            }
+            return claims;
+        }, {}), operators_1.map(function (claims) {
+            var owner = null;
+            var zIndexMax = -1;
+            for (var name_1 in claims) {
+                if (!claims.hasOwnProperty(name_1)) {
+                    continue;
+                }
+                if (claims[name_1] > zIndexMax) {
+                    zIndexMax = claims[name_1];
+                    owner = name_1;
+                }
+            }
+            return owner;
+        }), operators_1.startWith(null));
+    };
+    MouseService.prototype._filtered = function (name, observable$, owner$) {
+        return observable$.pipe(operators_1.withLatestFrom(owner$), operators_1.filter(function (_a) {
+            var item = _a[0], owner = _a[1];
+            return owner === name;
+        }), operators_1.map(function (_a) {
+            var item = _a[0], owner = _a[1];
+            return item;
+        }));
     };
     return MouseService;
 }());
 exports.MouseService = MouseService;
 exports.default = MouseService;
 
-},{"../Geo":229,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/fromEvent":42,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/switchMap":79,"rxjs/add/operator/withLatestFrom":83}],351:[function(require,module,exports){
+},{"rxjs":43,"rxjs/operators":241}],478:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-var Observable_1 = require("rxjs/Observable");
-var ReplaySubject_1 = require("rxjs/ReplaySubject");
-require("rxjs/add/observable/throw");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/finally");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/mergeMap");
+exports.Navigator = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var API_1 = require("../API");
 var Graph_1 = require("../Graph");
 var Edge_1 = require("../Edge");
+var Error_1 = require("../Error");
 var State_1 = require("../State");
 var Viewer_1 = require("../Viewer");
-var Navigator = (function () {
-    function Navigator(clientId, token, apiV3, graphService, imageLoadingService, loadingService, stateService, cacheService) {
+var PanService_1 = require("./PanService");
+var Navigator = /** @class */ (function () {
+    function Navigator(clientId, options, token, apiV3, graphService, imageLoadingService, loadingService, stateService, cacheService, playService, panService) {
         this._apiV3 = apiV3 != null ? apiV3 : new API_1.APIv3(clientId, token);
         this._imageLoadingService = imageLoadingService != null ? imageLoadingService : new Graph_1.ImageLoadingService();
         this._graphService = graphService != null ?
@@ -39575,13 +56306,18 @@ var Navigator = (function () {
             new Graph_1.GraphService(new Graph_1.Graph(this.apiV3), this._imageLoadingService);
         this._loadingService = loadingService != null ? loadingService : new Viewer_1.LoadingService();
         this._loadingName = "navigator";
-        this._stateService = stateService != null ? stateService : new State_1.StateService();
+        this._stateService = stateService != null ? stateService : new State_1.StateService(options.transitionMode);
         this._cacheService = cacheService != null ?
             cacheService :
             new Viewer_1.CacheService(this._graphService, this._stateService);
-        this._cacheService.start();
-        this._keyRequested$ = new BehaviorSubject_1.BehaviorSubject(null);
-        this._movedToKey$ = new BehaviorSubject_1.BehaviorSubject(null);
+        this._playService = playService != null ?
+            playService :
+            new Viewer_1.PlayService(this._graphService, this._stateService);
+        this._panService = panService != null ?
+            panService :
+            new PanService_1.PanService(this._graphService, this._stateService, options.combinedPanning);
+        this._keyRequested$ = new rxjs_1.BehaviorSubject(null);
+        this._movedToKey$ = new rxjs_1.BehaviorSubject(null);
         this._request$ = null;
         this._requestSubscription = null;
         this._nodeRequestSubscription = null;
@@ -39590,42 +56326,63 @@ var Navigator = (function () {
         get: function () {
             return this._apiV3;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Navigator.prototype, "cacheService", {
+        get: function () {
+            return this._cacheService;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Navigator.prototype, "graphService", {
         get: function () {
             return this._graphService;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Navigator.prototype, "imageLoadingService", {
         get: function () {
             return this._imageLoadingService;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Navigator.prototype, "loadingService", {
         get: function () {
             return this._loadingService;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Navigator.prototype, "movedToKey$", {
         get: function () {
             return this._movedToKey$;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Navigator.prototype, "panService", {
+        get: function () {
+            return this._panService;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Navigator.prototype, "playService", {
+        get: function () {
+            return this._playService;
+        },
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(Navigator.prototype, "stateService", {
         get: function () {
             return this._stateService;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Navigator.prototype.moveToKey$ = function (key) {
@@ -39638,14 +56395,10 @@ var Navigator = (function () {
         var _this = this;
         this._abortRequest("in dir " + Edge_1.EdgeDirection[direction]);
         this._loadingService.startLoading(this._loadingName);
-        var node$ = this.stateService.currentNode$
-            .first()
-            .mergeMap(function (node) {
+        var node$ = this.stateService.currentNode$.pipe(operators_1.first(), operators_1.mergeMap(function (node) {
             return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
                 node.sequenceEdges$ :
-                node.spatialEdges$)
-                .first()
-                .map(function (status) {
+                node.spatialEdges$).pipe(operators_1.first(), operators_1.map(function (status) {
                 for (var _i = 0, _a = status.edges; _i < _a.length; _i++) {
                     var edge = _a[_i];
                     if (edge.data.direction === direction) {
@@ -39653,94 +56406,71 @@ var Navigator = (function () {
                     }
                 }
                 return null;
-            });
-        })
-            .mergeMap(function (directionKey) {
+            }));
+        }), operators_1.mergeMap(function (directionKey) {
             if (directionKey == null) {
                 _this._loadingService.stopLoading(_this._loadingName);
-                return Observable_1.Observable
-                    .throw(new Error("Direction (" + direction + ") does not exist for current node."));
+                return rxjs_1.throwError(new Error("Direction (" + direction + ") does not exist for current node."));
             }
             return _this._moveToKey$(directionKey);
-        });
+        }));
         return this._makeRequest$(node$);
     };
     Navigator.prototype.moveCloseTo$ = function (lat, lon) {
         var _this = this;
         this._abortRequest("to lat " + lat + ", lon " + lon);
         this._loadingService.startLoading(this._loadingName);
-        var node$ = this.apiV3.imageCloseTo$(lat, lon)
-            .mergeMap(function (fullNode) {
+        var node$ = this.apiV3.imageCloseTo$(lat, lon).pipe(operators_1.mergeMap(function (fullNode) {
             if (fullNode == null) {
                 _this._loadingService.stopLoading(_this._loadingName);
-                return Observable_1.Observable
-                    .throw(new Error("No image found close to lat " + lat + ", lon " + lon + "."));
+                return rxjs_1.throwError(new Error("No image found close to lat " + lat + ", lon " + lon + "."));
             }
             return _this._moveToKey$(fullNode.key);
-        });
+        }));
         return this._makeRequest$(node$);
     };
     Navigator.prototype.setFilter$ = function (filter) {
         var _this = this;
         this._stateService.clearNodes();
-        return this._movedToKey$
-            .first()
-            .mergeMap(function (key) {
+        return this._movedToKey$.pipe(operators_1.first(), operators_1.mergeMap(function (key) {
             if (key != null) {
-                return _this._trajectoryKeys$()
-                    .mergeMap(function (keys) {
-                    return _this._graphService.setFilter$(filter)
-                        .mergeMap(function (graph) {
+                return _this._trajectoryKeys$().pipe(operators_1.mergeMap(function (keys) {
+                    return _this._graphService.setFilter$(filter).pipe(operators_1.mergeMap(function () {
                         return _this._cacheKeys$(keys);
-                    });
-                })
-                    .last();
+                    }));
+                }), operators_1.last());
             }
-            return _this._keyRequested$
-                .mergeMap(function (requestedKey) {
+            return _this._keyRequested$.pipe(operators_1.first(), operators_1.mergeMap(function (requestedKey) {
                 if (requestedKey != null) {
-                    return _this._graphService.setFilter$(filter)
-                        .mergeMap(function (graph) {
+                    return _this._graphService.setFilter$(filter).pipe(operators_1.mergeMap(function () {
                         return _this._graphService.cacheNode$(requestedKey);
-                    });
+                    }));
                 }
-                return _this._graphService.setFilter$(filter)
-                    .map(function (graph) {
+                return _this._graphService.setFilter$(filter).pipe(operators_1.map(function () {
                     return undefined;
-                });
-            });
-        })
-            .map(function (node) {
+                }));
+            }));
+        }), operators_1.map(function (node) {
             return undefined;
-        });
+        }));
     };
     Navigator.prototype.setToken$ = function (token) {
         var _this = this;
         this._abortRequest("to set token");
         this._stateService.clearNodes();
-        return this._movedToKey$
-            .first()
-            .do(function (key) {
+        return this._movedToKey$.pipe(operators_1.first(), operators_1.tap(function (key) {
             _this._apiV3.setToken(token);
-        })
-            .mergeMap(function (key) {
+        }), operators_1.mergeMap(function (key) {
             return key == null ?
-                _this._graphService.reset$([])
-                    .map(function (graph) {
-                    return undefined;
-                }) :
-                _this._trajectoryKeys$()
-                    .mergeMap(function (keys) {
-                    return _this._graphService.reset$(keys)
-                        .mergeMap(function (graph) {
+                _this._graphService.reset$([]) :
+                _this._trajectoryKeys$().pipe(operators_1.mergeMap(function (keys) {
+                    return _this._graphService.reset$(keys).pipe(operators_1.mergeMap(function () {
                         return _this._cacheKeys$(keys);
-                    });
-                })
-                    .last()
-                    .map(function (node) {
+                    }));
+                }), operators_1.last(), operators_1.map(function (node) {
                     return undefined;
-                });
-        });
+                }));
+        }));
     };
     Navigator.prototype._cacheKeys$ = function (keys) {
         var _this = this;
@@ -39748,9 +56478,7 @@ var Navigator = (function () {
             .map(function (key) {
             return _this._graphService.cacheNode$(key);
         });
-        return Observable_1.Observable
-            .from(cacheNodes$)
-            .mergeAll();
+        return rxjs_1.from(cacheNodes$).pipe(operators_1.mergeAll());
     };
     Navigator.prototype._abortRequest = function (reason) {
         if (this._requestSubscription != null) {
@@ -39762,61 +56490,60 @@ var Navigator = (function () {
             this._nodeRequestSubscription = null;
         }
         if (this._request$ != null) {
-            this._request$.error(new Error("Request aborted by a subsequent request " + reason + "."));
+            if (!(this._request$.isStopped || this._request$.hasError)) {
+                this._request$.error(new Error_1.AbortMapillaryError("Request aborted by a subsequent request " + reason + "."));
+            }
             this._request$ = null;
         }
     };
     Navigator.prototype._makeRequest$ = function (node$) {
         var _this = this;
-        this._request$ = new ReplaySubject_1.ReplaySubject(1);
-        this._requestSubscription = this._request$
-            .subscribe(undefined, function (e) { });
+        var request$ = new rxjs_1.ReplaySubject(1);
+        this._requestSubscription = request$
+            .subscribe(undefined, function () { });
+        this._request$ = request$;
         this._nodeRequestSubscription = node$
             .subscribe(function (node) {
-            _this._request$.next(node);
-            _this._request$.complete();
+            _this._request$ = null;
+            request$.next(node);
+            request$.complete();
         }, function (error) {
-            _this._request$.error(error);
+            _this._request$ = null;
+            request$.error(error);
         });
-        return this._request$;
+        return request$;
     };
     Navigator.prototype._moveToKey$ = function (key) {
         var _this = this;
         this._keyRequested$.next(key);
-        return this._graphService.cacheNode$(key)
-            .do(function (node) {
+        return this._graphService.cacheNode$(key).pipe(operators_1.tap(function (node) {
             _this._stateService.setNodes([node]);
             _this._movedToKey$.next(node.key);
-        })
-            .finally(function () {
+        }), operators_1.finalize(function () {
             _this._loadingService.stopLoading(_this._loadingName);
-        });
+        }));
     };
     Navigator.prototype._trajectoryKeys$ = function () {
-        return this._stateService.currentState$
-            .first()
-            .map(function (frame) {
+        return this._stateService.currentState$.pipe(operators_1.first(), operators_1.map(function (frame) {
             return frame.state.trajectory
                 .map(function (node) {
                 return node.key;
             });
-        });
+        }));
     };
     return Navigator;
 }());
 exports.Navigator = Navigator;
 exports.default = Navigator;
 
-},{"../API":225,"../Edge":227,"../Graph":230,"../State":233,"../Viewer":236,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/ReplaySubject":32,"rxjs/add/observable/throw":46,"rxjs/add/operator/do":59,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68}],352:[function(require,module,exports){
+},{"../API":290,"../Edge":292,"../Error":293,"../Graph":295,"../State":298,"../Viewer":302,"./PanService":480,"rxjs":43,"rxjs/operators":241}],479:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/throttleTime");
+exports.Observer = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var Viewer_1 = require("../Viewer");
-var Observer = (function () {
+var Observer = /** @class */ (function () {
     function Observer(eventEmitter, navigator, container) {
         var _this = this;
         this._container = container;
@@ -39824,7 +56551,12 @@ var Observer = (function () {
         this._navigator = navigator;
         this._projection = new Viewer_1.Projection();
         this._started = false;
-        // loading should always emit, also when cover is activated
+        this._navigable$ = new rxjs_1.Subject();
+        // navigable and loading should always emit, also when cover is activated.
+        this._navigable$
+            .subscribe(function (navigable) {
+            _this._eventEmitter.fire(Viewer_1.Viewer.navigablechanged, navigable);
+        });
         this._navigator.loadingService.loading$
             .subscribe(function (loading) {
             _this._eventEmitter.fire(Viewer_1.Viewer.loadingchanged, loading);
@@ -39834,19 +56566,45 @@ var Observer = (function () {
         get: function () {
             return this._started;
         },
-        enumerable: true,
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Observer.prototype, "navigable$", {
+        get: function () {
+            return this._navigable$;
+        },
+        enumerable: false,
         configurable: true
     });
+    Object.defineProperty(Observer.prototype, "projection", {
+        get: function () {
+            return this._projection;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Observer.prototype.project$ = function (latLon) {
+        var _this = this;
+        return rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.currentNode$, this._navigator.stateService.reference$).pipe(operators_1.first(), operators_1.map(function (_a) {
+            var render = _a[0], node = _a[1], reference = _a[2];
+            if (_this._projection.distanceBetweenLatLons(latLon, node.latLon) > 1000) {
+                return null;
+            }
+            var canvasPoint = _this._projection.latLonToCanvas(latLon, _this._container.element, render, reference);
+            return !!canvasPoint ?
+                [Math.round(canvasPoint[0]), Math.round(canvasPoint[1])] :
+                null;
+        }));
+    };
     Observer.prototype.projectBasic$ = function (basicPoint) {
         var _this = this;
-        return Observable_1.Observable
-            .combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$)
-            .first()
-            .map(function (_a) {
+        return rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$).pipe(operators_1.first(), operators_1.map(function (_a) {
             var render = _a[0], transform = _a[1];
             var canvasPoint = _this._projection.basicToCanvas(basicPoint, _this._container.element, render, transform);
-            return [Math.round(canvasPoint[0]), Math.round(canvasPoint[1])];
-        });
+            return !!canvasPoint ?
+                [Math.round(canvasPoint[0]), Math.round(canvasPoint[1])] :
+                null;
+        }));
     };
     Observer.prototype.startEmit = function () {
         var _this = this;
@@ -39858,26 +56616,21 @@ var Observer = (function () {
             .subscribe(function (node) {
             _this._eventEmitter.fire(Viewer_1.Viewer.nodechanged, node);
         });
-        this._sequenceEdgesSubscription = this._navigator.stateService.currentNodeExternal$
-            .switchMap(function (node) {
+        this._sequenceEdgesSubscription = this._navigator.stateService.currentNodeExternal$.pipe(operators_1.switchMap(function (node) {
             return node.sequenceEdges$;
-        })
+        }))
             .subscribe(function (status) {
             _this._eventEmitter.fire(Viewer_1.Viewer.sequenceedgeschanged, status);
         });
-        this._spatialEdgesSubscription = this._navigator.stateService.currentNodeExternal$
-            .switchMap(function (node) {
+        this._spatialEdgesSubscription = this._navigator.stateService.currentNodeExternal$.pipe(operators_1.switchMap(function (node) {
             return node.spatialEdges$;
-        })
+        }))
             .subscribe(function (status) {
             _this._eventEmitter.fire(Viewer_1.Viewer.spatialedgeschanged, status);
         });
-        this._moveSubscription = Observable_1.Observable
-            .combineLatest(this._navigator.stateService.inMotion$, this._container.mouseService.active$, this._container.touchService.active$)
-            .map(function (values) {
+        this._moveSubscription = rxjs_1.combineLatest(this._navigator.stateService.inMotion$, this._container.mouseService.active$, this._container.touchService.active$).pipe(operators_1.map(function (values) {
             return values[0] || values[1] || values[2];
-        })
-            .distinctUntilChanged()
+        }), operators_1.distinctUntilChanged())
             .subscribe(function (started) {
             if (started) {
                 _this._eventEmitter.fire(Viewer_1.Viewer.movestart, null);
@@ -39886,24 +56639,18 @@ var Observer = (function () {
                 _this._eventEmitter.fire(Viewer_1.Viewer.moveend, null);
             }
         });
-        this._bearingSubscription = this._container.renderService.bearing$
-            .throttleTime(100)
-            .distinctUntilChanged(function (b1, b2) {
+        this._bearingSubscription = this._container.renderService.bearing$.pipe(operators_1.auditTime(100), operators_1.distinctUntilChanged(function (b1, b2) {
             return Math.abs(b2 - b1) < 1;
-        })
+        }))
             .subscribe(function (bearing) {
             _this._eventEmitter.fire(Viewer_1.Viewer.bearingchanged, bearing);
         });
-        var mouseMove$ = this._container.mouseService.active$
-            .switchMap(function (active) {
+        var mouseMove$ = this._container.mouseService.active$.pipe(operators_1.switchMap(function (active) {
             return active ?
-                Observable_1.Observable.empty() :
+                rxjs_1.empty() :
                 _this._container.mouseService.mouseMove$;
-        });
-        this._viewerMouseEventSubscription = Observable_1.Observable
-            .merge(this._mapMouseEvent$(Viewer_1.Viewer.click, this._container.mouseService.staticClick$), this._mapMouseEvent$(Viewer_1.Viewer.contextmenu, this._container.mouseService.contextMenu$), this._mapMouseEvent$(Viewer_1.Viewer.dblclick, this._container.mouseService.dblClick$), this._mapMouseEvent$(Viewer_1.Viewer.mousedown, this._container.mouseService.mouseDown$), this._mapMouseEvent$(Viewer_1.Viewer.mousemove, mouseMove$), this._mapMouseEvent$(Viewer_1.Viewer.mouseout, this._container.mouseService.mouseOut$), this._mapMouseEvent$(Viewer_1.Viewer.mouseover, this._container.mouseService.mouseOver$), this._mapMouseEvent$(Viewer_1.Viewer.mouseup, this._container.mouseService.mouseUp$))
-            .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.reference$, this._navigator.stateService.currentTransform$)
-            .map(function (_a) {
+        }));
+        this._viewerMouseEventSubscription = rxjs_1.merge(this._mapMouseEvent$(Viewer_1.Viewer.click, this._container.mouseService.staticClick$), this._mapMouseEvent$(Viewer_1.Viewer.contextmenu, this._container.mouseService.contextMenu$), this._mapMouseEvent$(Viewer_1.Viewer.dblclick, this._container.mouseService.dblClick$), this._mapMouseEvent$(Viewer_1.Viewer.mousedown, this._container.mouseService.mouseDown$), this._mapMouseEvent$(Viewer_1.Viewer.mousemove, mouseMove$), this._mapMouseEvent$(Viewer_1.Viewer.mouseout, this._container.mouseService.mouseOut$), this._mapMouseEvent$(Viewer_1.Viewer.mouseover, this._container.mouseService.mouseOver$), this._mapMouseEvent$(Viewer_1.Viewer.mouseup, this._container.mouseService.mouseUp$)).pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.reference$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
             var _b = _a[0], type = _b[0], event = _b[1], render = _a[1], reference = _a[2], transform = _a[3];
             var unprojection = _this._projection.eventToUnprojection(event, _this._container.element, render, reference, transform);
             return {
@@ -39914,10 +56661,49 @@ var Observer = (function () {
                 target: _this._eventEmitter,
                 type: type,
             };
-        })
+        }))
             .subscribe(function (event) {
             _this._eventEmitter.fire(event.type, event);
         });
+        this._positionSubscription = this._container.renderService.renderCamera$.pipe(operators_1.distinctUntilChanged(function (_a, _b) {
+            var x1 = _a[0], y1 = _a[1];
+            var x2 = _b[0], y2 = _b[1];
+            return _this._closeTo(x1, x2, 1e-2) &&
+                _this._closeTo(y1, y2, 1e-2);
+        }, function (rc) {
+            return rc.camera.position.toArray();
+        }))
+            .subscribe(function () {
+            _this._eventEmitter.fire(Viewer_1.Viewer.positionchanged, {
+                target: _this._eventEmitter,
+                type: Viewer_1.Viewer.positionchanged,
+            });
+        });
+        this._povSubscription = this._container.renderService.renderCamera$.pipe(operators_1.distinctUntilChanged(function (_a, _b) {
+            var phi1 = _a[0], theta1 = _a[1];
+            var phi2 = _b[0], theta2 = _b[1];
+            return _this._closeTo(phi1, phi2, 1e-3) &&
+                _this._closeTo(theta1, theta2, 1e-3);
+        }, function (rc) {
+            return [rc.rotation.phi, rc.rotation.theta];
+        }))
+            .subscribe(function () {
+            _this._eventEmitter.fire(Viewer_1.Viewer.povchanged, {
+                target: _this._eventEmitter,
+                type: Viewer_1.Viewer.povchanged,
+            });
+        });
+        this._fovSubscription = this._container.renderService.renderCamera$.pipe(operators_1.distinctUntilChanged(function (fov1, fov2) {
+            return _this._closeTo(fov1, fov2, 1e-2);
+        }, function (rc) {
+            return rc.perspective.fov;
+        }))
+            .subscribe(function () {
+            _this._eventEmitter.fire(Viewer_1.Viewer.fovchanged, {
+                target: _this._eventEmitter,
+                type: Viewer_1.Viewer.fovchanged,
+            });
+        });
     };
     Observer.prototype.stopEmit = function () {
         if (!this.started) {
@@ -39926,62 +56712,609 @@ var Observer = (function () {
         this._started = false;
         this._bearingSubscription.unsubscribe();
         this._currentNodeSubscription.unsubscribe();
+        this._fovSubscription.unsubscribe();
         this._moveSubscription.unsubscribe();
+        this._positionSubscription.unsubscribe();
+        this._povSubscription.unsubscribe();
         this._sequenceEdgesSubscription.unsubscribe();
         this._spatialEdgesSubscription.unsubscribe();
         this._viewerMouseEventSubscription.unsubscribe();
         this._bearingSubscription = null;
         this._currentNodeSubscription = null;
+        this._fovSubscription = null;
         this._moveSubscription = null;
+        this._positionSubscription = null;
+        this._povSubscription = null;
         this._sequenceEdgesSubscription = null;
         this._spatialEdgesSubscription = null;
         this._viewerMouseEventSubscription = null;
     };
     Observer.prototype.unproject$ = function (canvasPoint) {
         var _this = this;
-        return Observable_1.Observable
-            .combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.reference$, this._navigator.stateService.currentTransform$)
-            .first()
-            .map(function (_a) {
+        return rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.reference$, this._navigator.stateService.currentTransform$).pipe(operators_1.first(), operators_1.map(function (_a) {
             var render = _a[0], reference = _a[1], transform = _a[2];
             var unprojection = _this._projection.canvasToUnprojection(canvasPoint, _this._container.element, render, reference, transform);
             return unprojection.latLon;
-        });
+        }));
     };
     Observer.prototype.unprojectBasic$ = function (canvasPoint) {
         var _this = this;
-        return Observable_1.Observable
-            .combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$)
-            .first()
-            .map(function (_a) {
+        return rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$).pipe(operators_1.first(), operators_1.map(function (_a) {
             var render = _a[0], transform = _a[1];
             return _this._projection.canvasToBasic(canvasPoint, _this._container.element, render, transform);
-        });
+        }));
+    };
+    Observer.prototype._closeTo = function (v1, v2, absoluteTolerance) {
+        return Math.abs(v1 - v2) <= absoluteTolerance;
     };
     Observer.prototype._mapMouseEvent$ = function (type, mouseEvent$) {
-        return mouseEvent$.map(function (event) {
+        return mouseEvent$.pipe(operators_1.map(function (event) {
             return [type, event];
-        });
+        }));
     };
     return Observer;
 }());
 exports.Observer = Observer;
 exports.default = Observer;
 
-},{"../Viewer":236,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/throttleTime":82}],353:[function(require,module,exports){
+},{"../Viewer":302,"rxjs":43,"rxjs/operators":241}],480:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.PanService = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Geo = require("../geo/Geo");
+var GeoCoords_1 = require("../geo/GeoCoords");
+var GraphCalculator_1 = require("../graph/GraphCalculator");
+var Spatial_1 = require("../geo/Spatial");
+var Transform_1 = require("../geo/Transform");
+var ViewportCoords_1 = require("../geo/ViewportCoords");
+var PanMode;
+(function (PanMode) {
+    PanMode[PanMode["Disabled"] = 0] = "Disabled";
+    PanMode[PanMode["Enabled"] = 1] = "Enabled";
+    PanMode[PanMode["Started"] = 2] = "Started";
+})(PanMode || (PanMode = {}));
+var PanService = /** @class */ (function () {
+    function PanService(graphService, stateService, enabled, geoCoords, graphCalculator, spatial, viewportCoords) {
+        this._graphService = graphService;
+        this._stateService = stateService;
+        this._geoCoords = !!geoCoords ? geoCoords : new GeoCoords_1.default();
+        this._graphCalculator = !!graphCalculator ? graphCalculator : new GraphCalculator_1.default(this._geoCoords);
+        this._spatial = !!spatial ? spatial : new Spatial_1.default();
+        this._viewportCoords = !!viewportCoords ? viewportCoords : new ViewportCoords_1.default();
+        this._mode = enabled !== false ? PanMode.Enabled : PanMode.Disabled;
+        this._panNodesSubject$ = new rxjs_1.Subject();
+        this._panNodes$ = this._panNodesSubject$.pipe(operators_1.startWith([]), operators_1.publishReplay(1), operators_1.refCount());
+        this._panNodes$.subscribe();
+    }
+    Object.defineProperty(PanService.prototype, "panNodes$", {
+        get: function () {
+            return this._panNodes$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    PanService.prototype.enable = function () {
+        if (this._mode !== PanMode.Disabled) {
+            return;
+        }
+        this._mode = PanMode.Enabled;
+        this.start();
+    };
+    PanService.prototype.disable = function () {
+        if (this._mode === PanMode.Disabled) {
+            return;
+        }
+        this.stop();
+        this._mode = PanMode.Disabled;
+    };
+    PanService.prototype.start = function () {
+        var _this = this;
+        if (this._mode !== PanMode.Enabled) {
+            return;
+        }
+        var panNodes$ = this._stateService.currentNode$.pipe(operators_1.switchMap(function (current) {
+            if (!current.merged) {
+                return rxjs_1.of([]);
+            }
+            var current$ = rxjs_1.of(current);
+            var bounds = _this._graphCalculator.boundingBoxCorners(current.latLon, 20);
+            var adjacent$ = _this._graphService
+                .cacheBoundingBox$(bounds[0], bounds[1]).pipe(operators_1.catchError(function (error) {
+                console.error("Failed to cache periphery bounding box (" + current.key + ")", error);
+                return rxjs_1.empty();
+            }), operators_1.map(function (nodes) {
+                if (current.pano) {
+                    return [];
+                }
+                var potential = [];
+                for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
+                    var node = nodes_1[_i];
+                    if (node.key === current.key) {
+                        continue;
+                    }
+                    if (node.mergeCC !== current.mergeCC) {
+                        continue;
+                    }
+                    if (node.pano) {
+                        continue;
+                    }
+                    if (_this._distance(node, current) > 4) {
+                        continue;
+                    }
+                    potential.push(node);
+                }
+                return potential;
+            }));
+            return rxjs_1.combineLatest(current$, adjacent$).pipe(operators_1.withLatestFrom(_this._stateService.reference$), operators_1.map(function (_a) {
+                var _b = _a[0], cn = _b[0], adjacent = _b[1], reference = _a[1];
+                var currentDirection = _this._spatial.viewingDirection(cn.rotation);
+                var currentTranslation = Geo.computeTranslation({ lat: cn.latLon.lat, lon: cn.latLon.lon, alt: cn.alt }, cn.rotation, reference);
+                var currentTransform = _this._createTransform(cn, currentTranslation);
+                var currentAzimuthal = _this._spatial.wrap(_this._spatial.azimuthal(currentDirection.toArray(), currentTransform.upVector().toArray()), 0, 2 * Math.PI);
+                var currentProjectedPoints = _this._computeProjectedPoints(currentTransform);
+                var currentHFov = _this._computeHorizontalFov(currentProjectedPoints) / 180 * Math.PI;
+                var preferredOverlap = Math.PI / 8;
+                var left = undefined;
+                var right = undefined;
+                for (var _i = 0, adjacent_1 = adjacent; _i < adjacent_1.length; _i++) {
+                    var a = adjacent_1[_i];
+                    var translation = Geo.computeTranslation({ lat: a.latLon.lat, lon: a.latLon.lon, alt: a.alt }, a.rotation, reference);
+                    var transform = _this._createTransform(a, translation);
+                    var projectedPoints = _this._computeProjectedPoints(transform);
+                    var hFov = _this._computeHorizontalFov(projectedPoints) / 180 * Math.PI;
+                    var direction = _this._spatial.viewingDirection(a.rotation);
+                    var azimuthal = _this._spatial.wrap(_this._spatial.azimuthal(direction.toArray(), transform.upVector().toArray()), 0, 2 * Math.PI);
+                    var directionChange = _this._spatial.angleBetweenVector2(currentDirection.x, currentDirection.y, direction.x, direction.y);
+                    var overlap = Number.NEGATIVE_INFINITY;
+                    if (directionChange > 0) {
+                        if (currentAzimuthal > azimuthal) {
+                            overlap = currentAzimuthal - 2 * Math.PI + currentHFov / 2 - (azimuthal - hFov / 2);
+                        }
+                        else {
+                            overlap = currentAzimuthal + currentHFov / 2 - (azimuthal - hFov / 2);
+                        }
+                    }
+                    else {
+                        if (currentAzimuthal < azimuthal) {
+                            overlap = azimuthal + hFov / 2 - (currentAzimuthal + 2 * Math.PI - currentHFov / 2);
+                        }
+                        else {
+                            overlap = azimuthal + hFov / 2 - (currentAzimuthal - currentHFov / 2);
+                        }
+                    }
+                    var nonOverlap = Math.abs(hFov - overlap);
+                    var distanceCost = _this._distance(a, cn);
+                    var timeCost = Math.min(_this._timeDifference(a, cn), 4);
+                    var overlapCost = 20 * Math.abs(overlap - preferredOverlap);
+                    var fovCost = Math.min(5, 1 / Math.min(hFov / currentHFov, 1));
+                    var nonOverlapCost = overlap > 0 ? -2 * nonOverlap : 0;
+                    var cost = distanceCost + timeCost + overlapCost + fovCost + nonOverlapCost;
+                    if (overlap > 0 &&
+                        overlap < 0.5 * currentHFov &&
+                        overlap < 0.5 * hFov &&
+                        nonOverlap > 0.5 * currentHFov) {
+                        if (directionChange > 0) {
+                            if (!left) {
+                                left = [cost, a, transform, hFov];
+                            }
+                            else {
+                                if (cost < left[0]) {
+                                    left = [cost, a, transform, hFov];
+                                }
+                            }
+                        }
+                        else {
+                            if (!right) {
+                                right = [cost, a, transform, hFov];
+                            }
+                            else {
+                                if (cost < right[0]) {
+                                    right = [cost, a, transform, hFov];
+                                }
+                            }
+                        }
+                    }
+                }
+                var panNodes = [];
+                if (!!left) {
+                    panNodes.push([left[1], left[2], left[3]]);
+                }
+                if (!!right) {
+                    panNodes.push([right[1], right[2], right[3]]);
+                }
+                return panNodes;
+            }), operators_1.startWith([]));
+        }));
+        this._panNodesSubscription = this._stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state.nodesAhead > 0;
+        }), operators_1.distinctUntilChanged(), operators_1.switchMap(function (traversing) {
+            return traversing ? rxjs_1.of([]) : panNodes$;
+        }))
+            .subscribe(function (panNodes) {
+            _this._panNodesSubject$.next(panNodes);
+        });
+        this._mode = PanMode.Started;
+    };
+    PanService.prototype.stop = function () {
+        if (this._mode !== PanMode.Started) {
+            return;
+        }
+        this._panNodesSubscription.unsubscribe();
+        this._panNodesSubject$.next([]);
+        this._mode = PanMode.Enabled;
+    };
+    PanService.prototype._distance = function (node, reference) {
+        var _a = this._geoCoords.geodeticToEnu(node.latLon.lat, node.latLon.lon, node.alt, reference.latLon.lat, reference.latLon.lon, reference.alt), x = _a[0], y = _a[1], z = _a[2];
+        return Math.sqrt(x * x + y * y + z * z);
+    };
+    PanService.prototype._timeDifference = function (node, reference) {
+        return Math.abs(node.capturedAt - reference.capturedAt) / (1000 * 60 * 60 * 24 * 30);
+    };
+    PanService.prototype._createTransform = function (node, translation) {
+        return new Transform_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.assetsCached ? node.image : undefined, undefined, node.ck1, node.ck2, node.cameraProjection);
+    };
+    PanService.prototype._computeProjectedPoints = function (transform) {
+        var vertices = [[1, 0]];
+        var directions = [[0, 0.5]];
+        var pointsPerLine = 20;
+        return Geo.computeProjectedPoints(transform, vertices, directions, pointsPerLine, this._viewportCoords);
+    };
+    PanService.prototype._computeHorizontalFov = function (projectedPoints) {
+        var _this = this;
+        var fovs = projectedPoints
+            .map(function (projectedPoint) {
+            return _this._coordToFov(projectedPoint[0]);
+        });
+        var fov = Math.min.apply(Math, fovs);
+        return fov;
+    };
+    PanService.prototype._coordToFov = function (x) {
+        return 2 * Math.atan(x) * 180 / Math.PI;
+    };
+    return PanService;
+}());
+exports.PanService = PanService;
+
+},{"../geo/Geo":415,"../geo/GeoCoords":416,"../geo/Spatial":419,"../geo/Transform":420,"../geo/ViewportCoords":421,"../graph/GraphCalculator":425,"rxjs":43,"rxjs/operators":241}],481:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.PlayService = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var Edge_1 = require("../Edge");
+var Graph_1 = require("../Graph");
+var PlayService = /** @class */ (function () {
+    function PlayService(graphService, stateService, graphCalculator) {
+        this._graphService = graphService;
+        this._stateService = stateService;
+        this._graphCalculator = !!graphCalculator ? graphCalculator : new Graph_1.GraphCalculator();
+        this._directionSubject$ = new rxjs_1.Subject();
+        this._direction$ = this._directionSubject$.pipe(operators_1.startWith(Edge_1.EdgeDirection.Next), operators_1.publishReplay(1), operators_1.refCount());
+        this._direction$.subscribe();
+        this._playing = false;
+        this._playingSubject$ = new rxjs_1.Subject();
+        this._playing$ = this._playingSubject$.pipe(operators_1.startWith(this._playing), operators_1.publishReplay(1), operators_1.refCount());
+        this._playing$.subscribe();
+        this._speed = 0.5;
+        this._speedSubject$ = new rxjs_1.Subject();
+        this._speed$ = this._speedSubject$.pipe(operators_1.startWith(this._speed), operators_1.publishReplay(1), operators_1.refCount());
+        this._speed$.subscribe();
+        this._nodesAhead = this._mapNodesAhead(this._mapSpeed(this._speed));
+        this._bridging$ = null;
+    }
+    Object.defineProperty(PlayService.prototype, "playing", {
+        get: function () {
+            return this._playing;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(PlayService.prototype, "direction$", {
+        get: function () {
+            return this._direction$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(PlayService.prototype, "playing$", {
+        get: function () {
+            return this._playing$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(PlayService.prototype, "speed$", {
+        get: function () {
+            return this._speed$;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    PlayService.prototype.play = function () {
+        var _this = this;
+        if (this._playing) {
+            return;
+        }
+        this._stateService.cutNodes();
+        var stateSpeed = this._setSpeed(this._speed);
+        this._stateService.setSpeed(stateSpeed);
+        this._graphModeSubscription = this._speed$.pipe(operators_1.map(function (speed) {
+            return speed > PlayService.sequenceSpeed ? Graph_1.GraphMode.Sequence : Graph_1.GraphMode.Spatial;
+        }), operators_1.distinctUntilChanged())
+            .subscribe(function (mode) {
+            _this._graphService.setGraphMode(mode);
+        });
+        this._cacheSubscription = rxjs_1.combineLatest(this._stateService.currentNode$.pipe(operators_1.map(function (node) {
+            return [node.sequenceKey, node.key];
+        }), operators_1.distinctUntilChanged(undefined, function (_a) {
+            var sequenceKey = _a[0], nodeKey = _a[1];
+            return sequenceKey;
+        })), this._graphService.graphMode$, this._direction$).pipe(operators_1.switchMap(function (_a) {
+            var _b = _a[0], sequenceKey = _b[0], nodeKey = _b[1], mode = _a[1], direction = _a[2];
+            if (direction !== Edge_1.EdgeDirection.Next && direction !== Edge_1.EdgeDirection.Prev) {
+                return rxjs_1.of([undefined, direction]);
+            }
+            var sequence$ = (mode === Graph_1.GraphMode.Sequence ?
+                _this._graphService.cacheSequenceNodes$(sequenceKey, nodeKey) :
+                _this._graphService.cacheSequence$(sequenceKey)).pipe(operators_1.retry(3), operators_1.catchError(function (error) {
+                console.error(error);
+                return rxjs_1.of(undefined);
+            }));
+            return rxjs_1.combineLatest(sequence$, rxjs_1.of(direction));
+        }), operators_1.switchMap(function (_a) {
+            var sequence = _a[0], direction = _a[1];
+            if (sequence === undefined) {
+                return rxjs_1.empty();
+            }
+            var sequenceKeys = sequence.keys.slice();
+            if (direction === Edge_1.EdgeDirection.Prev) {
+                sequenceKeys.reverse();
+            }
+            return _this._stateService.currentState$.pipe(operators_1.map(function (frame) {
+                return [frame.state.trajectory[frame.state.trajectory.length - 1].key, frame.state.nodesAhead];
+            }), operators_1.scan(function (_a, _b) {
+                var lastRequestKey = _a[0], previousRequestKeys = _a[1];
+                var lastTrajectoryKey = _b[0], nodesAhead = _b[1];
+                if (lastRequestKey === undefined) {
+                    lastRequestKey = lastTrajectoryKey;
+                }
+                var lastIndex = sequenceKeys.length - 1;
+                if (nodesAhead >= _this._nodesAhead || sequenceKeys[lastIndex] === lastRequestKey) {
+                    return [lastRequestKey, []];
+                }
+                var current = sequenceKeys.indexOf(lastTrajectoryKey);
+                var start = sequenceKeys.indexOf(lastRequestKey) + 1;
+                var end = Math.min(lastIndex, current + _this._nodesAhead - nodesAhead) + 1;
+                if (end <= start) {
+                    return [lastRequestKey, []];
+                }
+                return [sequenceKeys[end - 1], sequenceKeys.slice(start, end)];
+            }, [undefined, []]), operators_1.mergeMap(function (_a) {
+                var lastRequestKey = _a[0], newRequestKeys = _a[1];
+                return rxjs_1.from(newRequestKeys);
+            }));
+        }), operators_1.mergeMap(function (key) {
+            return _this._graphService.cacheNode$(key).pipe(operators_1.catchError(function () {
+                return rxjs_1.empty();
+            }));
+        }, 6))
+            .subscribe();
+        this._playingSubscription = this._stateService.currentState$.pipe(operators_1.filter(function (frame) {
+            return frame.state.nodesAhead < _this._nodesAhead;
+        }), operators_1.distinctUntilChanged(undefined, function (frame) {
+            return frame.state.lastNode.key;
+        }), operators_1.map(function (frame) {
+            var lastNode = frame.state.lastNode;
+            var trajectory = frame.state.trajectory;
+            var increasingTime = undefined;
+            for (var i = trajectory.length - 2; i >= 0; i--) {
+                var node = trajectory[i];
+                if (node.sequenceKey !== lastNode.sequenceKey) {
+                    break;
+                }
+                if (node.capturedAt !== lastNode.capturedAt) {
+                    increasingTime = node.capturedAt < lastNode.capturedAt;
+                    break;
+                }
+            }
+            return [frame.state.lastNode, increasingTime];
+        }), operators_1.withLatestFrom(this._direction$), operators_1.switchMap(function (_a) {
+            var _b = _a[0], node = _b[0], increasingTime = _b[1], direction = _a[1];
+            return rxjs_1.zip(([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
+                node.sequenceEdges$ :
+                node.spatialEdges$).pipe(operators_1.first(function (status) {
+                return status.cached;
+            }), operators_1.timeout(15000)), rxjs_1.of(direction)).pipe(operators_1.map(function (_a) {
+                var s = _a[0], d = _a[1];
+                for (var _i = 0, _b = s.edges; _i < _b.length; _i++) {
+                    var edge = _b[_i];
+                    if (edge.data.direction === d) {
+                        return edge.to;
+                    }
+                }
+                return null;
+            }), operators_1.switchMap(function (key) {
+                return key != null ?
+                    _this._graphService.cacheNode$(key) :
+                    _this._bridge$(node, increasingTime).pipe(operators_1.filter(function (n) {
+                        return !!n;
+                    }));
+            }));
+        }))
+            .subscribe(function (node) {
+            _this._stateService.appendNodes([node]);
+        }, function (error) {
+            console.error(error);
+            _this.stop();
+        });
+        this._clearSubscription = this._stateService.currentNode$.pipe(operators_1.bufferCount(1, 10))
+            .subscribe(function (nodes) {
+            _this._stateService.clearPriorNodes();
+        });
+        this._setPlaying(true);
+        var currentLastNodes$ = this._stateService.currentState$.pipe(operators_1.map(function (frame) {
+            return frame.state;
+        }), operators_1.distinctUntilChanged(function (_a, _b) {
+            var kc1 = _a[0], kl1 = _a[1];
+            var kc2 = _b[0], kl2 = _b[1];
+            return kc1 === kc2 && kl1 === kl2;
+        }, function (state) {
+            return [state.currentNode.key, state.lastNode.key];
+        }), operators_1.filter(function (state) {
+            return state.currentNode.key === state.lastNode.key &&
+                state.currentIndex === state.trajectory.length - 1;
+        }), operators_1.map(function (state) {
+            return state.currentNode;
+        }));
+        this._stopSubscription = rxjs_1.combineLatest(currentLastNodes$, this._direction$).pipe(operators_1.switchMap(function (_a) {
+            var node = _a[0], direction = _a[1];
+            var edgeStatus$ = ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
+                node.sequenceEdges$ :
+                node.spatialEdges$).pipe(operators_1.first(function (status) {
+                return status.cached;
+            }), operators_1.timeout(15000), operators_1.catchError(function (error) {
+                console.error(error);
+                return rxjs_1.of({ cached: false, edges: [] });
+            }));
+            return rxjs_1.combineLatest(rxjs_1.of(direction), edgeStatus$).pipe(operators_1.map(function (_a) {
+                var d = _a[0], es = _a[1];
+                for (var _i = 0, _b = es.edges; _i < _b.length; _i++) {
+                    var edge = _b[_i];
+                    if (edge.data.direction === d) {
+                        return true;
+                    }
+                }
+                return false;
+            }));
+        }), operators_1.mergeMap(function (hasEdge) {
+            if (hasEdge || !_this._bridging$) {
+                return rxjs_1.of(hasEdge);
+            }
+            return _this._bridging$.pipe(operators_1.map(function (node) {
+                return node != null;
+            }), operators_1.catchError(function (error) {
+                console.error(error);
+                return rxjs_1.of(false);
+            }));
+        }), operators_1.first(function (hasEdge) {
+            return !hasEdge;
+        }))
+            .subscribe(undefined, undefined, function () { _this.stop(); });
+        if (this._stopSubscription.closed) {
+            this._stopSubscription = null;
+        }
+    };
+    PlayService.prototype.setDirection = function (direction) {
+        this._directionSubject$.next(direction);
+    };
+    PlayService.prototype.setSpeed = function (speed) {
+        speed = Math.max(0, Math.min(1, speed));
+        if (speed === this._speed) {
+            return;
+        }
+        var stateSpeed = this._setSpeed(speed);
+        if (this._playing) {
+            this._stateService.setSpeed(stateSpeed);
+        }
+        this._speedSubject$.next(this._speed);
+    };
+    PlayService.prototype.stop = function () {
+        if (!this._playing) {
+            return;
+        }
+        if (!!this._stopSubscription) {
+            if (!this._stopSubscription.closed) {
+                this._stopSubscription.unsubscribe();
+            }
+            this._stopSubscription = null;
+        }
+        this._graphModeSubscription.unsubscribe();
+        this._graphModeSubscription = null;
+        this._cacheSubscription.unsubscribe();
+        this._cacheSubscription = null;
+        this._playingSubscription.unsubscribe();
+        this._playingSubscription = null;
+        this._clearSubscription.unsubscribe();
+        this._clearSubscription = null;
+        this._stateService.setSpeed(1);
+        this._stateService.cutNodes();
+        this._graphService.setGraphMode(Graph_1.GraphMode.Spatial);
+        this._setPlaying(false);
+    };
+    PlayService.prototype._bridge$ = function (node, increasingTime) {
+        var _this = this;
+        if (increasingTime === undefined) {
+            return rxjs_1.of(null);
+        }
+        var boundingBox = this._graphCalculator.boundingBoxCorners(node.latLon, 25);
+        this._bridging$ = this._graphService.cacheBoundingBox$(boundingBox[0], boundingBox[1]).pipe(operators_1.mergeMap(function (nodes) {
+            var nextNode = null;
+            for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
+                var n = nodes_1[_i];
+                if (n.sequenceKey === node.sequenceKey ||
+                    !n.cameraUuid ||
+                    n.cameraUuid !== node.cameraUuid ||
+                    n.capturedAt === node.capturedAt ||
+                    n.capturedAt > node.capturedAt !== increasingTime) {
+                    continue;
+                }
+                var delta = Math.abs(n.capturedAt - node.capturedAt);
+                if (delta > 15000) {
+                    continue;
+                }
+                if (!nextNode || delta < Math.abs(nextNode.capturedAt - node.capturedAt)) {
+                    nextNode = n;
+                }
+            }
+            return !!nextNode ?
+                _this._graphService.cacheNode$(nextNode.key) :
+                rxjs_1.of(null);
+        }), operators_1.finalize(function () {
+            _this._bridging$ = null;
+        }), operators_1.publish(), operators_1.refCount());
+        return this._bridging$;
+    };
+    PlayService.prototype._mapSpeed = function (speed) {
+        var x = 2 * speed - 1;
+        return Math.pow(10, x) - 0.2 * x;
+    };
+    PlayService.prototype._mapNodesAhead = function (stateSpeed) {
+        return Math.round(Math.max(10, Math.min(50, 8 + 6 * stateSpeed)));
+    };
+    PlayService.prototype._setPlaying = function (playing) {
+        this._playing = playing;
+        this._playingSubject$.next(playing);
+    };
+    PlayService.prototype._setSpeed = function (speed) {
+        this._speed = speed;
+        var stateSpeed = this._mapSpeed(this._speed);
+        this._nodesAhead = this._mapNodesAhead(stateSpeed);
+        return stateSpeed;
+    };
+    PlayService.sequenceSpeed = 0.54;
+    return PlayService;
+}());
+exports.PlayService = PlayService;
+exports.default = PlayService;
+
+},{"../Edge":292,"../Graph":295,"rxjs":43,"rxjs/operators":241}],482:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.Projection = void 0;
 var THREE = require("three");
 var Geo_1 = require("../Geo");
-var Projection = (function () {
-    function Projection(geoCoords, viewportCoords) {
+var Spatial_1 = require("../geo/Spatial");
+var Projection = /** @class */ (function () {
+    function Projection(geoCoords, viewportCoords, spatial) {
         this._geoCoords = !!geoCoords ? geoCoords : new Geo_1.GeoCoords();
+        this._spatial = !!spatial ? spatial : new Spatial_1.default();
         this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
     }
     Projection.prototype.basicToCanvas = function (basicPoint, container, render, transform) {
         return this._viewportCoords
-            .basicToCanvas(basicPoint[0], basicPoint[1], container, transform, render.perspective);
+            .basicToCanvasSafe(basicPoint[0], basicPoint[1], container, transform, render.perspective);
     };
     Projection.prototype.canvasToBasic = function (canvasPoint, container, render, transform) {
         var basicPoint = this._viewportCoords
@@ -40022,30 +57355,41 @@ var Projection = (function () {
         };
         return unprojection;
     };
+    Projection.prototype.cameraToLatLon = function (render, reference) {
+        var position = render.camera.position;
+        var _a = this._geoCoords.enuToGeodetic(position.x, position.y, position.z, reference.lat, reference.lon, reference.alt), lat = _a[0], lon = _a[1];
+        return { lat: lat, lon: lon };
+    };
+    Projection.prototype.latLonToCanvas = function (latLon, container, render, reference) {
+        var point3d = this._geoCoords.geodeticToEnu(latLon.lat, latLon.lon, 0, reference.lat, reference.lon, reference.alt);
+        var canvas = this._viewportCoords.projectToCanvasSafe(point3d, container, render.perspective);
+        return canvas;
+    };
+    Projection.prototype.distanceBetweenLatLons = function (latLon1, latLon2) {
+        return this._spatial.distanceFromLatLon(latLon1.lat, latLon1.lon, latLon2.lat, latLon2.lon);
+    };
     return Projection;
 }());
 exports.Projection = Projection;
 exports.default = Projection;
 
-},{"../Geo":229,"three":176}],354:[function(require,module,exports){
+},{"../Geo":294,"../geo/Spatial":419,"three":242}],483:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.SpriteService = void 0;
+var operators_1 = require("rxjs/operators");
 var THREE = require("three");
 var vd = require("virtual-dom");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/startWith");
+var rxjs_1 = require("rxjs");
 var Viewer_1 = require("../Viewer");
-var SpriteAtlas = (function () {
+var SpriteAtlas = /** @class */ (function () {
     function SpriteAtlas() {
     }
     Object.defineProperty(SpriteAtlas.prototype, "json", {
         set: function (value) {
             this._json = value;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(SpriteAtlas.prototype, "image", {
@@ -40054,14 +57398,14 @@ var SpriteAtlas = (function () {
             this._texture = new THREE.Texture(this._image);
             this._texture.minFilter = THREE.NearestFilter;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(SpriteAtlas.prototype, "loaded", {
         get: function () {
             return !!(this._image && this._json);
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     SpriteAtlas.prototype.getGLSprite = function (name) {
@@ -40117,7 +57461,7 @@ var SpriteAtlas = (function () {
                 break;
             case Viewer_1.Alignment.BottomRight:
             case Viewer_1.Alignment.Right:
-            case Viewer_1.Alignment.BottomRight:
+            case Viewer_1.Alignment.TopRight:
             default:
                 break;
         }
@@ -40162,20 +57506,16 @@ var SpriteAtlas = (function () {
     };
     return SpriteAtlas;
 }());
-var SpriteService = (function () {
+var SpriteService = /** @class */ (function () {
     function SpriteService(sprite) {
         var _this = this;
         this._retina = window.devicePixelRatio > 1;
-        this._spriteAtlasOperation$ = new Subject_1.Subject();
-        this._spriteAtlas$ = this._spriteAtlasOperation$
-            .startWith(function (atlas) {
+        this._spriteAtlasOperation$ = new rxjs_1.Subject();
+        this._spriteAtlas$ = this._spriteAtlasOperation$.pipe(operators_1.startWith(function (atlas) {
             return atlas;
-        })
-            .scan(function (atlas, operation) {
+        }), operators_1.scan(function (atlas, operation) {
             return operation(atlas);
-        }, new SpriteAtlas())
-            .publishReplay(1)
-            .refCount();
+        }, new SpriteAtlas()), operators_1.publishReplay(1), operators_1.refCount());
         this._spriteAtlas$.subscribe(function () { });
         if (sprite == null) {
             return;
@@ -40218,7 +57558,7 @@ var SpriteService = (function () {
         get: function () {
             return this._spriteAtlas$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     return SpriteService;
@@ -40226,116 +57566,72 @@ var SpriteService = (function () {
 exports.SpriteService = SpriteService;
 exports.default = SpriteService;
 
-},{"../Viewer":236,"rxjs/Subject":34,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/startWith":78,"three":176,"virtual-dom":182}],355:[function(require,module,exports){
+
+},{"../Viewer":302,"rxjs":43,"rxjs/operators":241,"three":242,"virtual-dom":247}],484:[function(require,module,exports){
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/timer");
-require("rxjs/add/operator/bufferWhen");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/switchMap");
-var TouchService = (function () {
+exports.TouchService = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
+var TouchService = /** @class */ (function () {
     function TouchService(canvasContainer, domContainer) {
         var _this = this;
-        this._canvasContainer = canvasContainer;
-        this._domContainer = domContainer;
-        this._activeSubject$ = new BehaviorSubject_1.BehaviorSubject(false);
-        this._active$ = this._activeSubject$
-            .distinctUntilChanged()
-            .publishReplay(1)
-            .refCount();
-        Observable_1.Observable.fromEvent(domContainer, "touchmove")
+        this._activeSubject$ = new rxjs_1.BehaviorSubject(false);
+        this._active$ = this._activeSubject$.pipe(operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
+        rxjs_1.fromEvent(domContainer, "touchmove")
             .subscribe(function (event) {
             event.preventDefault();
         });
-        this._touchStart$ = Observable_1.Observable.fromEvent(canvasContainer, "touchstart");
-        this._touchMove$ = Observable_1.Observable.fromEvent(canvasContainer, "touchmove");
-        this._touchEnd$ = Observable_1.Observable.fromEvent(canvasContainer, "touchend");
-        this._touchCancel$ = Observable_1.Observable.fromEvent(canvasContainer, "touchcancel");
-        var tapStart$ = this._touchStart$
-            .filter(function (te) {
+        this._touchStart$ = rxjs_1.fromEvent(canvasContainer, "touchstart");
+        this._touchMove$ = rxjs_1.fromEvent(canvasContainer, "touchmove");
+        this._touchEnd$ = rxjs_1.fromEvent(canvasContainer, "touchend");
+        this._touchCancel$ = rxjs_1.fromEvent(canvasContainer, "touchcancel");
+        var tapStart$ = this._touchStart$.pipe(operators_1.filter(function (te) {
             return te.touches.length === 1 && te.targetTouches.length === 1;
-        })
-            .share();
-        this._doubleTap$ = tapStart$
-            .bufferWhen(function () {
-            return tapStart$
-                .first()
-                .switchMap(function (event) {
-                return Observable_1.Observable
-                    .timer(300)
-                    .merge(tapStart$)
-                    .take(1);
-            });
-        })
-            .filter(function (events) {
+        }), operators_1.share());
+        this._doubleTap$ = tapStart$.pipe(operators_1.bufferWhen(function () {
+            return tapStart$.pipe(operators_1.first(), operators_1.switchMap(function (event) {
+                return rxjs_1.merge(rxjs_1.timer(300), tapStart$).pipe(operators_1.take(1));
+            }));
+        }), operators_1.filter(function (events) {
             return events.length === 2;
-        })
-            .map(function (events) {
+        }), operators_1.map(function (events) {
             return events[events.length - 1];
-        })
-            .share();
+        }), operators_1.share());
         this._doubleTap$
             .subscribe(function (event) {
             event.preventDefault();
         });
-        this._singleTouchMove$ = this._touchMove$
-            .filter(function (te) {
+        this._singleTouchMove$ = this._touchMove$.pipe(operators_1.filter(function (te) {
             return te.touches.length === 1 && te.targetTouches.length === 1;
-        })
-            .share();
-        var singleTouchStart$ = Observable_1.Observable
-            .merge(this._touchStart$, this._touchEnd$, this._touchCancel$)
-            .filter(function (te) {
+        }), operators_1.share());
+        var singleTouchStart$ = rxjs_1.merge(this._touchStart$, this._touchEnd$, this._touchCancel$).pipe(operators_1.filter(function (te) {
             return te.touches.length === 1 && te.targetTouches.length === 1;
-        });
-        var multipleTouchStart$ = Observable_1.Observable
-            .merge(this._touchStart$, this._touchEnd$, this._touchCancel$)
-            .filter(function (te) {
+        }));
+        var multipleTouchStart$ = rxjs_1.merge(this._touchStart$, this._touchEnd$, this._touchCancel$).pipe(operators_1.filter(function (te) {
             return te.touches.length >= 1;
-        });
-        var touchStop$ = Observable_1.Observable
-            .merge(this._touchEnd$, this._touchCancel$)
-            .filter(function (te) {
+        }));
+        var touchStop$ = rxjs_1.merge(this._touchEnd$, this._touchCancel$).pipe(operators_1.filter(function (te) {
             return te.touches.length === 0;
-        });
-        this._singleTouchDragStart$ = singleTouchStart$
-            .mergeMap(function (e) {
-            return _this._singleTouchMove$
-                .takeUntil(Observable_1.Observable.merge(touchStop$, multipleTouchStart$))
-                .take(1);
-        });
-        this._singleTouchDragEnd$ = singleTouchStart$
-            .mergeMap(function (e) {
-            return Observable_1.Observable
-                .merge(touchStop$, multipleTouchStart$)
-                .first();
-        });
-        this._singleTouchDrag$ = singleTouchStart$
-            .switchMap(function (te) {
-            return _this._singleTouchMove$
-                .skip(1)
-                .takeUntil(Observable_1.Observable
-                .merge(multipleTouchStart$, touchStop$));
-        });
-        var touchesChanged$ = Observable_1.Observable
-            .merge(this._touchStart$, this._touchEnd$, this._touchCancel$);
-        this._pinchStart$ = touchesChanged$
-            .filter(function (te) {
+        }));
+        this._singleTouchDragStart$ = singleTouchStart$.pipe(operators_1.mergeMap(function (e) {
+            return _this._singleTouchMove$.pipe(operators_1.takeUntil(rxjs_1.merge(touchStop$, multipleTouchStart$)), operators_1.take(1));
+        }));
+        this._singleTouchDragEnd$ = singleTouchStart$.pipe(operators_1.mergeMap(function (e) {
+            return rxjs_1.merge(touchStop$, multipleTouchStart$).pipe(operators_1.first());
+        }));
+        this._singleTouchDrag$ = singleTouchStart$.pipe(operators_1.switchMap(function (te) {
+            return _this._singleTouchMove$.pipe(operators_1.skip(1), operators_1.takeUntil(rxjs_1.merge(multipleTouchStart$, touchStop$)));
+        }));
+        var touchesChanged$ = rxjs_1.merge(this._touchStart$, this._touchEnd$, this._touchCancel$);
+        this._pinchStart$ = touchesChanged$.pipe(operators_1.filter(function (te) {
             return te.touches.length === 2 && te.targetTouches.length === 2;
-        });
-        this._pinchEnd$ = touchesChanged$
-            .filter(function (te) {
+        }));
+        this._pinchEnd$ = touchesChanged$.pipe(operators_1.filter(function (te) {
             return te.touches.length !== 2 || te.targetTouches.length !== 2;
-        });
-        this._pinchOperation$ = new Subject_1.Subject();
-        this._pinch$ = this._pinchOperation$
-            .scan(function (pinch, operation) {
+        }));
+        this._pinchOperation$ = new rxjs_1.Subject();
+        this._pinch$ = this._pinchOperation$.pipe(operators_1.scan(function (pinch, operation) {
             return operation(pinch);
         }, {
             changeX: 0,
@@ -40353,12 +57649,10 @@ var TouchService = (function () {
             screenY: 0,
             touch1: null,
             touch2: null,
-        });
-        this._touchMove$
-            .filter(function (te) {
+        }));
+        this._touchMove$.pipe(operators_1.filter(function (te) {
             return te.touches.length === 2 && te.targetTouches.length === 2;
-        })
-            .map(function (te) {
+        }), operators_1.map(function (te) {
             return function (previous) {
                 var touch1 = te.touches[0];
                 var touch2 = te.touches[1];
@@ -40397,117 +57691,116 @@ var TouchService = (function () {
                 };
                 return current;
             };
-        })
+        }))
             .subscribe(this._pinchOperation$);
-        this._pinchChange$ = this._pinchStart$
-            .switchMap(function (te) {
-            return _this._pinch$
-                .skip(1)
-                .takeUntil(_this._pinchEnd$);
-        });
+        this._pinchChange$ = this._pinchStart$.pipe(operators_1.switchMap(function (te) {
+            return _this._pinch$.pipe(operators_1.skip(1), operators_1.takeUntil(_this._pinchEnd$));
+        }));
     }
     Object.defineProperty(TouchService.prototype, "active$", {
         get: function () {
             return this._active$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TouchService.prototype, "activate$", {
         get: function () {
             return this._activeSubject$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TouchService.prototype, "doubleTap$", {
         get: function () {
             return this._doubleTap$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TouchService.prototype, "touchStart$", {
         get: function () {
             return this._touchStart$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TouchService.prototype, "touchMove$", {
         get: function () {
             return this._touchMove$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TouchService.prototype, "touchEnd$", {
         get: function () {
             return this._touchEnd$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TouchService.prototype, "touchCancel$", {
         get: function () {
             return this._touchCancel$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TouchService.prototype, "singleTouchDragStart$", {
         get: function () {
             return this._singleTouchDragStart$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TouchService.prototype, "singleTouchDrag$", {
         get: function () {
             return this._singleTouchDrag$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TouchService.prototype, "singleTouchDragEnd$", {
         get: function () {
             return this._singleTouchDragEnd$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TouchService.prototype, "pinch$", {
         get: function () {
             return this._pinchChange$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TouchService.prototype, "pinchStart$", {
         get: function () {
             return this._pinchStart$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     Object.defineProperty(TouchService.prototype, "pinchEnd$", {
         get: function () {
             return this._pinchEnd$;
         },
-        enumerable: true,
+        enumerable: false,
         configurable: true
     });
     return TouchService;
 }());
 exports.TouchService = TouchService;
 
-},{"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/timer":47,"rxjs/add/operator/bufferWhen":51,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/scan":73,"rxjs/add/operator/switchMap":79}],356:[function(require,module,exports){
+},{"rxjs":43,"rxjs/operators":241}],485:[function(require,module,exports){
 "use strict";
-/// <reference path="../../typings/index.d.ts" />
 var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
     return function (d, b) {
         extendStatics(d, b);
         function __() { this.constructor = d; }
@@ -40515,17 +57808,23 @@ var __extends = (this && this.__extends) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.Viewer = void 0;
+var rxjs_1 = require("rxjs");
+var operators_1 = require("rxjs/operators");
 var when = require("when");
 var Viewer_1 = require("../Viewer");
 var Utils_1 = require("../Utils");
 /**
  * @class Viewer
  *
- * @classdesc The Viewer object represents the navigable photo viewer.
- * Create a Viewer by specifying a container, client ID, photo key and
+ * @classdesc The Viewer object represents the navigable image viewer.
+ * Create a Viewer by specifying a container, client ID, image key and
  * other options. The viewer exposes methods and events for programmatic
  * interaction.
  *
+ * In the case of asynchronous methods, MapillaryJS returns promises to
+ * the results. Notifications are always emitted through JavaScript events.
+ *
  * The viewer works with a few different coordinate systems.
  *
  * Container pixel coordinates
@@ -40567,37 +57866,101 @@ var Utils_1 = require("../Utils");
  * zoomed independently of the size of the viewer container resulting in
  * different conversion results for different viewing directions.
  */
-var Viewer = (function (_super) {
+var Viewer = /** @class */ (function (_super) {
     __extends(Viewer, _super);
     /**
      * Create a new viewer instance.
      *
-     * @param {string} id - Required `id` of a DOM element which will
-     * be transformed into the viewer.
+     * @description It is possible to initialize the viewer with or
+     * without a key.
+     *
+     * When you want to show a specific image in the viewer from
+     * the start you should initialize it with a key.
+     *
+     * When you do not know the first image key at implementation
+     * time, e.g. in a map-viewer application you should initialize
+     * the viewer without a key and call `moveToKey` instead.
+     *
+     * When initializing with a key the viewer is bound to that key
+     * until the node for that key has been successfully loaded.
+     * Also, a cover with the image of the key will be shown.
+     * If the data for that key can not be loaded because the key is
+     * faulty or other errors occur it is not possible to navigate
+     * to another key because the viewer is not navigable. The viewer
+     * becomes navigable when the data for the key has been loaded and
+     * the image is shown in the viewer. This way of initializing
+     * the viewer is mostly for embedding in blog posts and similar
+     * where one wants to show a specific image initially.
+     *
+     * If the viewer is initialized without a key (with null or
+     * undefined) it is not bound to any particular key and it is
+     * possible to move to any key with `viewer.moveToKey("<my-image-key>")`.
+     * If the first move to a key fails it is possible to move to another
+     * key. The viewer will show a black background until a move
+     * succeeds. This way of intitializing is suited for a map-viewer
+     * application when the initial key is not known at implementation
+     * time.
+     *
+     * @param {string | HTMLElement} container - The HTML element in which
+     * MapillaryJS will render the viewer, or the element's string `id`. The
+     * specified element must have no children.
      * @param {string} clientId - Required `Mapillary API ClientID`. Can
      * be obtained from https://www.mapillary.com/app/settings/developers.
-     * @param {string} [key] - Optional `photoId` to start from, can be any
-     * Mapillary photo, if null no image is loaded.
-     * @param {IViewerOptions} [options] - Optional configuration object
-     * specifing Viewer's initial setup.
-     * @param {string} [token] - Optional bearer token for API requests of
+     * @param {string} key - Optional `image-key` to start from. The key
+     * can be any Mapillary image. If a key is provided the viewer is
+     * bound to that key until it has been fully loaded. If null is provided
+     * no image is loaded at viewer initialization and the viewer is not
+     * bound to any particular key. Any image can then be navigated to
+     * with e.g. `viewer.moveToKey("<my-image-key>")`.
+     * @param {IViewerOptions} options - Optional configuration object
+     * specifing Viewer's and the components' initial setup.
+     * @param {string} token - Optional bearer token for API requests of
      * protected resources.
      *
      * @example
      * ```
-     * var viewer = new Mapillary.Viewer("<element-id>", "<client-id>", "<my key>");
+     * var viewer = new Mapillary.Viewer("<element-id>", "<client-id>", "<image-key>");
      * ```
      */
-    function Viewer(id, clientId, key, options, token) {
+    function Viewer(container, clientId, key, options, token) {
         var _this = _super.call(this) || this;
         options = options != null ? options : {};
         Utils_1.Settings.setOptions(options);
-        _this._navigator = new Viewer_1.Navigator(clientId, token);
-        _this._container = new Viewer_1.Container(id, _this._navigator.stateService, options);
+        Utils_1.Urls.setOptions(options.url);
+        _this._navigator = new Viewer_1.Navigator(clientId, options, token);
+        _this._container = new Viewer_1.Container(container, _this._navigator.stateService, options);
         _this._observer = new Viewer_1.Observer(_this, _this._navigator, _this._container);
         _this._componentController = new Viewer_1.ComponentController(_this._container, _this._navigator, _this._observer, key, options.component);
         return _this;
     }
+    Object.defineProperty(Viewer.prototype, "isNavigable", {
+        /**
+         * Return a boolean indicating if the viewer is in a navigable state.
+         *
+         * @description The navigable state indicates if the viewer supports
+         * moving, i.e. calling the {@link moveToKey}, {@link moveDir}
+         * and {@link moveCloseTo} methods or changing the authentication state,
+         * i.e. calling {@link setAuthToken}. The viewer will not be in a navigable
+         * state if the cover is activated and the viewer has been supplied a key.
+         * When the cover is deactivated or the viewer is activated without being
+         * supplied a key it will be navigable.
+         *
+         * @returns {boolean} Boolean indicating whether the viewer is navigable.
+         */
+        get: function () {
+            return this._componentController.navigable;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * Activate the combined panning functionality.
+     *
+     * @description The combined panning functionality is active by default.
+     */
+    Viewer.prototype.activateCombinedPanning = function () {
+        this._navigator.panService.enable();
+    };
     /**
      * Activate a component.
      *
@@ -40617,6 +57980,15 @@ var Viewer = (function (_super) {
     Viewer.prototype.activateCover = function () {
         this._componentController.activateCover();
     };
+    /**
+     * Deactivate the combined panning functionality.
+     *
+     * @description Deactivating the combined panning functionality
+     * could be needed in scenarios involving sequence only navigation.
+     */
+    Viewer.prototype.deactivateCombinedPanning = function () {
+        this._navigator.panService.disable();
+    };
     /**
      * Deactivate a component.
      *
@@ -40658,8 +58030,7 @@ var Viewer = (function (_super) {
     Viewer.prototype.getBearing = function () {
         var _this = this;
         return when.promise(function (resolve, reject) {
-            _this._container.renderService.bearing$
-                .first()
+            _this._container.renderService.bearing$.pipe(operators_1.first())
                 .subscribe(function (bearing) {
                 resolve(bearing);
             }, function (error) {
@@ -40668,16 +58039,27 @@ var Viewer = (function (_super) {
         });
     };
     /**
-     * Get the basic coordinates of the current photo that is
+     * Returns the HTML element containing the viewer's <canvas> element.
+     *
+     * @description This is the element to which event bindings for viewer
+     * interactivity (such as panning and zooming) are attached.
+     *
+     * @returns {HTMLElement} The container viewer's <canvas> element.
+     */
+    Viewer.prototype.getCanvasContainer = function () {
+        return this._container.canvasContainer;
+    };
+    /**
+     * Get the basic coordinates of the current image that is
      * at the center of the viewport.
      *
      * @description Basic coordinates are 2D coordinates on the [0, 1] interval
      * and have the origin point, (0, 0), at the top left corner and the
      * maximum value, (1, 1), at the bottom right corner of the original
-     * photo.
+     * image.
      *
      * @returns {Promise<number[]>} Promise to the basic coordinates
-     * of the current photo at the center for the viewport.
+     * of the current image at the center for the viewport.
      *
      * @example
      * ```
@@ -40718,7 +58100,81 @@ var Viewer = (function (_super) {
         return this._container.element;
     };
     /**
-     * Get the photo's current zoom level.
+     * Get the viewer's current vertical field of view.
+     *
+     * @description The vertical field of view rendered on the viewer canvas
+     * measured in degrees.
+     *
+     * @returns {Promise<number>} Promise to the current field of view
+     * of the viewer camera.
+     *
+     * @example
+     * ```
+     * viewer.getFieldOfView().then((fov) => { console.log(fov); });
+     * ```
+     */
+    Viewer.prototype.getFieldOfView = function () {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            _this._container.renderService.renderCamera$.pipe(operators_1.first())
+                .subscribe(function (rc) {
+                resolve(rc.perspective.fov);
+            }, function (error) {
+                reject(error);
+            });
+        });
+    };
+    /**
+     * Get the viewer's current point of view.
+     *
+     * @returns {Promise<IPointOfView>} Promise to the current point of view
+     * of the viewer camera.
+     *
+     * @example
+     * ```
+     * viewer.getPointOfView().then((pov) => { console.log(pov); });
+     * ```
+     */
+    Viewer.prototype.getPointOfView = function () {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            rxjs_1.combineLatest(_this._container.renderService.renderCamera$, _this._container.renderService.bearing$).pipe(operators_1.first())
+                .subscribe(function (_a) {
+                var rc = _a[0], bearing = _a[1];
+                resolve({
+                    bearing: bearing,
+                    tilt: rc.getTilt(),
+                });
+            }, function (error) {
+                reject(error);
+            });
+        });
+    };
+    /**
+     * Get the viewer's current position
+     *
+     * @returns {Promise<ILatLon>} Promise to the viewers's current
+     * position.
+     *
+     * @example
+     * ```
+     * viewer.getPosition().then((pos) => { console.log(pos); });
+     * ```
+     */
+    Viewer.prototype.getPosition = function () {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            rxjs_1.combineLatest(_this._container.renderService.renderCamera$, _this._navigator.stateService.reference$).pipe(operators_1.first())
+                .subscribe(function (_a) {
+                var render = _a[0], reference = _a[1];
+                resolve(_this._observer.projection.cameraToLatLon(render, reference));
+            }, function (error) {
+                reject(error);
+            });
+        });
+    };
+    /**
+     * Get the image's current zoom level.
      *
      * @returns {Promise<number>} Promise to the viewers's current
      * zoom level.
@@ -40751,6 +58207,9 @@ var Viewer = (function (_super) {
      * @throws {Error} If no nodes exist close to provided latitude
      * longitude.
      * @throws {Error} Propagates any IO errors to the caller.
+     * @throws {Error} When viewer is not navigable.
+     * @throws  {@link AbortMapillaryError} When a subsequent move request is made
+     * before the move close to call has completed.
      *
      * @example
      * ```
@@ -40760,9 +58219,11 @@ var Viewer = (function (_super) {
      * ```
      */
     Viewer.prototype.moveCloseTo = function (lat, lon) {
-        var _this = this;
+        var moveCloseTo$ = this.isNavigable ?
+            this._navigator.moveCloseTo$(lat, lon) :
+            rxjs_1.throwError(new Error("Calling moveCloseTo is not supported when viewer is not navigable."));
         return when.promise(function (resolve, reject) {
-            _this._navigator.moveCloseTo$(lat, lon).subscribe(function (node) {
+            moveCloseTo$.subscribe(function (node) {
                 resolve(node);
             }, function (error) {
                 reject(error);
@@ -40779,6 +58240,9 @@ var Viewer = (function (_super) {
      * @throws {Error} If the current node does not have the edge direction
      * or the edges has not yet been cached.
      * @throws {Error} Propagates any IO errors to the caller.
+     * @throws {Error} When viewer is not navigable.
+     * @throws  {@link AbortMapillaryError} When a subsequent move request is made
+     * before the move dir call has completed.
      *
      * @example
      * ```
@@ -40788,9 +58252,11 @@ var Viewer = (function (_super) {
      * ```
      */
     Viewer.prototype.moveDir = function (dir) {
-        var _this = this;
+        var moveDir$ = this.isNavigable ?
+            this._navigator.moveDir$(dir) :
+            rxjs_1.throwError(new Error("Calling moveDir is not supported when viewer is not navigable."));
         return when.promise(function (resolve, reject) {
-            _this._navigator.moveDir$(dir).subscribe(function (node) {
+            moveDir$.subscribe(function (node) {
                 resolve(node);
             }, function (error) {
                 reject(error);
@@ -40798,11 +58264,14 @@ var Viewer = (function (_super) {
         });
     };
     /**
-     * Navigate to a given photo key.
+     * Navigate to a given image key.
      *
-     * @param {string} key - A valid Mapillary photo key.
+     * @param {string} key - A valid Mapillary image key.
      * @returns {Promise<Node>} Promise to the node that was navigated to.
      * @throws {Error} Propagates any IO errors to the caller.
+     * @throws {Error} When viewer is not navigable.
+     * @throws  {@link AbortMapillaryError} When a subsequent move request is made
+     * before the move to key call has completed.
      *
      * @example
      * ```
@@ -40812,24 +58281,74 @@ var Viewer = (function (_super) {
      * ```
      */
     Viewer.prototype.moveToKey = function (key) {
-        var _this = this;
+        var moveToKey$ = this.isNavigable ?
+            this._navigator.moveToKey$(key) :
+            rxjs_1.throwError(new Error("Calling moveToKey is not supported when viewer is not navigable."));
         return when.promise(function (resolve, reject) {
-            _this._navigator.moveToKey$(key).subscribe(function (node) {
+            moveToKey$.subscribe(function (node) {
                 resolve(node);
             }, function (error) {
                 reject(error);
             });
         });
     };
+    /**
+     * Project an ILatLon representing geographicalcoordinates to
+     * canvas pixel coordinates.
+     *
+     * @description The geographical coordinates may not always correspond to pixel
+     * coordinates, e.g. if the geographical coordinates have a position behind the
+     * viewer camera. In the case of no correspondence the returned value will
+     * be `null`.
+     *
+     * If the distance from the viewer camera position to the provided lat-lon
+     * is more than 1000 meters `null` will be returned.
+     *
+     * The projection is performed from the ground plane, i.e.
+     * the altitude with respect to the ground plane for the geographical
+     * point is zero.
+     *
+     * Note that whenever the camera moves, the result of the method will be
+     * different.
+     *
+     * @param {ILatLon} latLon - Geographical coordinates to project.
+     * @returns {Promise<Array<number>>} Promise to the pixel coordinates corresponding
+     * to the latLon.
+     *
+     * @example
+     * ```
+     * viewer.project({ lat: 0, lon: 0 })
+     *     .then((pixelPoint) => {
+     *          if (!pixelPoint) {
+     *              console.log("no correspondence");
+     *          }
+     *
+     *          console.log(pixelPoint);
+     *     });
+     * ```
+     */
+    Viewer.prototype.project = function (latLon) {
+        var _this = this;
+        return when.promise(function (resolve, reject) {
+            _this._observer.project$(latLon)
+                .subscribe(function (pixelPoint) {
+                resolve(pixelPoint);
+            }, function (error) {
+                reject(error);
+            });
+        });
+    };
     /**
      * Project basic image coordinates for the current node to canvas pixel
      * coordinates.
      *
      * @description The basic image coordinates may not always correspond to a
-     * pixel point that lies in the visible area of the viewer container.
+     * pixel point that lies in the visible area of the viewer container. In the
+     * case of no correspondence the returned value can be `null`.
+     *
      *
      * @param {Array<number>} basicPoint - Basic images coordinates to project.
-     * @returns {Promise<ILatLon>} Promise to the pixel coordinates corresponding
+     * @returns {Promise<Array<number>>} Promise to the pixel coordinates corresponding
      * to the basic image point.
      *
      * @example
@@ -40862,7 +58381,6 @@ var Viewer = (function (_super) {
      */
     Viewer.prototype.resize = function () {
         this._container.renderService.resize$.next(null);
-        this._componentController.resize();
     };
     /**
      * Set a bearer token for authenticated API requests of
@@ -40873,13 +58391,18 @@ var Viewer = (function (_super) {
      * viewer will make unauthenticated requests.
      *
      * Calling setAuthToken aborts all outstanding move requests.
-     * The promises of those move requests will be rejected and
-     * the rejections need to be caught.
+     * The promises of those move requests will be rejected with a
+     * {@link AbortMapillaryError} the rejections need to be caught.
+     *
+     * Calling setAuthToken also resets the complete viewer cache
+     * so it should not be called repeatedly.
      *
      * @param {string} [token] token - Bearer token.
      * @returns {Promise<void>} Promise that resolves after token
      * is set.
      *
+     * @throws {Error} When viewer is not navigable.
+     *
      * @example
      * ```
      * viewer.setAuthToken("<my token>")
@@ -40887,9 +58410,11 @@ var Viewer = (function (_super) {
      * ```
      */
     Viewer.prototype.setAuthToken = function (token) {
-        var _this = this;
+        var setToken$ = this.isNavigable ?
+            this._navigator.setToken$(token) :
+            rxjs_1.throwError(new Error("Calling setAuthToken is not supported when viewer is not navigable."));
         return when.promise(function (resolve, reject) {
-            _this._navigator.setToken$(token)
+            setToken$
                 .subscribe(function () {
                 resolve(undefined);
             }, function (error) {
@@ -40898,16 +58423,16 @@ var Viewer = (function (_super) {
         });
     };
     /**
-     * Set the basic coordinates of the current photo to be in the
+     * Set the basic coordinates of the current image to be in the
      * center of the viewport.
      *
      * @description Basic coordinates are 2D coordinates on the [0, 1] interval
      * and has the origin point, (0, 0), at the top left corner and the
      * maximum value, (1, 1), at the bottom right corner of the original
-     * photo.
+     * image.
      *
      * @param {number[]} The basic coordinates of the current
-     * photo to be at the center for the viewport.
+     * image to be at the center for the viewport.
      *
      * @example
      * ```
@@ -40947,18 +58472,37 @@ var Viewer = (function (_super) {
      *
      * `["all", f0, ..., fn]` logical `AND`: `f0 ∧ ... ∧ fn`
      *
-     * A key must be a string that identifies a node property name. A value must be
-     * a string, number, or boolean. Strictly-typed comparisons are used. The values
+     * A key must be a string that identifies a property name of a
+     * simple {@link Node} property. A value must be a string, number, or
+     * boolean. Strictly-typed comparisons are used. The values
      * `f0, ..., fn` of the combining filter must be filter expressions.
      *
      * Clear the filter by setting it to null or empty array.
      *
+     * Commonly used filter properties (see the {@link Node} class
+     * documentation for a full list of properties that can be used
+     * in a filter) and common use cases:
+     *
+     * ```
+     * fullPano        // Show only full 360 panoramas or not
+     * organizationKey // Show images from one or several organizations
+     * sequenceKey     // Show images from one or several sequences
+     * userKey         // Show images from one or several users
+     * capturedAt      // Show images from a certain time interval
+     * ```
+     *
      * @param {FilterExpression} filter - The filter expression.
      * @returns {Promise<void>} Promise that resolves after filter is applied.
      *
      * @example
      * ```
      * viewer.setFilter(["==", "sequenceKey", "<my sequence key>"]);
+     *
+     * // Other examples
+     * // viewer.setFilter(["==", "organizationKey", "<my organization key>"]);
+     * // viewer.setFilter(["in", "userKey", "<my user key #1>", "<my user key #2>"]);
+     * // viewer.setFilter(["==", "fullPano", true]);
+     * // viewer.setFilter([">=", "capturedAt", <my time stamp>]);
      * ```
      */
     Viewer.prototype.setFilter = function (filter) {
@@ -40972,6 +58516,30 @@ var Viewer = (function (_super) {
             });
         });
     };
+    /**
+     * Set the viewer's current vertical field of view.
+     *
+     * @description Sets the vertical field of view rendered
+     * on the viewer canvas measured in degrees. The value
+     * will be clamped to be able to set a valid zoom level
+     * based on the projection model of the current image and
+     * the viewer's current render mode.
+     *
+     * @param {number} fov - Vertical field of view in degrees.
+     *
+     * @example
+     * ```
+     * viewer.setFieldOfView(45);
+     * ```
+     */
+    Viewer.prototype.setFieldOfView = function (fov) {
+        var _this = this;
+        this._container.renderService.renderCamera$.pipe(operators_1.first())
+            .subscribe(function (rc) {
+            var zoom = rc.fovToZoom(fov);
+            _this._navigator.stateService.setZoom(zoom);
+        });
+    };
     /**
      * Set the viewer's render mode.
      *
@@ -40986,13 +58554,26 @@ var Viewer = (function (_super) {
         this._container.renderService.renderMode$.next(renderMode);
     };
     /**
-     * Set the photo's current zoom level.
+     * Set the viewer's transition mode.
+     *
+     * @param {TransitionMode} transitionMode - Transition mode.
+     *
+     * @example
+     * ```
+     * viewer.setTransitionMode(Mapillary.TransitionMode.Instantaneous);
+     * ```
+     */
+    Viewer.prototype.setTransitionMode = function (transitionMode) {
+        this._navigator.stateService.setTransitionMode(transitionMode);
+    };
+    /**
+     * Set the image's current zoom level.
      *
      * @description Possible zoom level values are on the [0, 3] interval.
-     * Zero means zooming out to fit the photo to the view whereas three
+     * Zero means zooming out to fit the image to the view whereas three
      * shows the highest level of detail.
      *
-     * @param {number} The photo's current zoom level.
+     * @param {number} The image's current zoom level.
      *
      * @example
      * ```
@@ -41010,6 +58591,9 @@ var Viewer = (function (_super) {
      * coordinates. In the case of no correspondence the returned value will
      * be `null`.
      *
+     * The unprojection to a latLon will be performed towards the ground plane, i.e.
+     * the altitude with respect to the ground plane for the returned latLon is zero.
+     *
      * @param {Array<number>} pixelPoint - Pixel coordinates to unproject.
      * @returns {Promise<ILatLon>} Promise to the latLon corresponding to the pixel point.
      *
@@ -41061,6 +58645,11 @@ var Viewer = (function (_super) {
     };
     /**
      * Fired when the viewing direction of the camera changes.
+     *
+     * @description Related to the computed compass angle
+     * ({@link Node.computedCA}) from SfM, not the original EXIF compass
+     * angle.
+     *
      * @event
      * @type {number} bearing - Value indicating the current bearing
      * measured in degrees clockwise with respect to north.
@@ -41070,57 +58659,64 @@ var Viewer = (function (_super) {
      * Fired when a pointing device (usually a mouse) is pressed and released at
      * the same point in the viewer.
      * @event
-     * @type {IViewerMouseEvent} event - Viewer mouse event data.
+     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
      */
     Viewer.click = "click";
     /**
      * Fired when the right button of the mouse is clicked within the viewer.
      * @event
-     * @type {IViewerMouseEvent} event - Viewer mouse event data.
+     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
      */
     Viewer.contextmenu = "contextmenu";
     /**
      * Fired when a pointing device (usually a mouse) is clicked twice at
      * the same point in the viewer.
      * @event
-     * @type {IViewerMouseEvent} event - Viewer mouse event data.
+     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
      */
     Viewer.dblclick = "dblclick";
+    /**
+     * Fired when the viewer's vertical field of view changes.
+     *
+     * @event
+     * @type  {@link IViewerEvent} event - The event object.
+     */
+    Viewer.fovchanged = "fovchanged";
     /**
      * Fired when the viewer is loading more data.
      * @event
-     * @type {boolean} loading - Value indicating whether the viewer is loading.
+     * @type {boolean} loading - Boolean indicating whether the viewer is loading.
      */
     Viewer.loadingchanged = "loadingchanged";
     /**
      * Fired when a pointing device (usually a mouse) is pressed within the viewer.
      * @event
-     * @type {IViewerMouseEvent} event - Viewer mouse event data.
+     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
      */
     Viewer.mousedown = "mousedown";
     /**
      * Fired when a pointing device (usually a mouse) is moved within the viewer.
      * @description Will not fire when the mouse is actively used, e.g. for drag pan.
      * @event
-     * @type {IViewerMouseEvent} event - Viewer mouse event data.
+     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
      */
     Viewer.mousemove = "mousemove";
     /**
      * Fired when a pointing device (usually a mouse) leaves the viewer's canvas.
      * @event
-     * @type {IViewerMouseEvent} event - Viewer mouse event data.
+     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
      */
     Viewer.mouseout = "mouseout";
     /**
      * Fired when a pointing device (usually a mouse) is moved onto the viewer's canvas.
      * @event
-     * @type {IViewerMouseEvent} event - Viewer mouse event data.
+     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
      */
     Viewer.mouseover = "mouseover";
     /**
      * Fired when a pointing device (usually a mouse) is released within the viewer.
      * @event
-     * @type {IViewerMouseEvent} event - Viewer mouse event data.
+     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
      */
     Viewer.mouseup = "mouseup";
     /**
@@ -41136,28 +58732,65 @@ var Viewer = (function (_super) {
      * @event
      */
     Viewer.movestart = "movestart";
+    /**
+     * Fired when the navigable state of the viewer changes.
+     *
+     * @description The navigable state indicates if the viewer supports
+     * moving, i.e. calling the `moveToKey`, `moveDir` and `moveCloseTo`
+     * methods. The viewer will not be in a navigable state if the cover
+     * is activated and the viewer has been supplied a key. When the cover
+     * is deactivated or activated without being supplied a key it will
+     * be navigable.
+     *
+     * @event
+     * @type {boolean} navigable - Boolean indicating whether the viewer is navigable.
+     */
+    Viewer.navigablechanged = "navigablechanged";
     /**
      * Fired every time the viewer navigates to a new node.
+     *
      * @event
-     * @type {Node} node - Current node.
+     * @type  {@link Node} node - Current node.
      */
     Viewer.nodechanged = "nodechanged";
+    /**
+     * Fired when the viewer's position changes.
+     *
+     * @description The viewer's position changes when transitioning
+     * between nodes.
+     *
+     * @event
+     * @type  {@link IViewerEvent} event - The event object.
+     */
+    Viewer.positionchanged = "positionchanged";
+    /**
+     * Fired when the viewer's point of view changes. The point of view changes
+     * when the bearing, or tilt changes.
+     *
+     * @event
+     * @type  {@link IViewerEvent} event - The event object.
+     */
+    Viewer.povchanged = "povchanged";
     /**
      * Fired every time the sequence edges of the current node changes.
      * @event
-     * @type {IEdgeStatus} status - The edge status object.
+     * @type  {@link IEdgeStatus} status - The edge status object.
      */
     Viewer.sequenceedgeschanged = "sequenceedgeschanged";
     /**
      * Fired every time the spatial edges of the current node changes.
      * @event
-     * @type {IEdgeStatus} status - The edge status object.
+     * @type  {@link IEdgeStatus} status - The edge status object.
      */
     Viewer.spatialedgeschanged = "spatialedgeschanged";
     return Viewer;
 }(Utils_1.EventEmitter));
 exports.Viewer = Viewer;
 
-},{"../Utils":235,"../Viewer":236,"when":223}]},{},[231])(231)
+},{"../Utils":301,"../Viewer":302,"rxjs":43,"rxjs/operators":241,"when":288}],486:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+
+},{}]},{},[296])(296)
 });
 //# sourceMappingURL=mapillary.js.map