X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/7441f15b4fd59735ae00a16b47cfcf7eb99260a6..a570f59187efa0a298d31bae2b224de9762bb42f:/vendor/assets/iD/iD/mapillary-js/mapillary.js diff --git a/vendor/assets/iD/iD/mapillary-js/mapillary.js b/vendor/assets/iD/iD/mapillary-js/mapillary.js index 40cbd5b8f..78087cb38 100644 --- a/vendor/assets/iD/iD/mapillary-js/mapillary.js +++ b/vendor/assets/iD/iD/mapillary-js/mapillary.js @@ -156,7 +156,7 @@ function getSegDistSq(px, py, a, b) { return dx * dx + dy * dy; } -},{"tinyqueue":241}],2:[function(require,module,exports){ +},{"tinyqueue":243}],2:[function(require,module,exports){ /* * Copyright (C) 2008 Apple Inc. All Rights Reserved. * @@ -2568,19 +2568,23 @@ function isEarHashed(ear, minX, minY, invSize) { 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) && @@ -2588,6 +2592,14 @@ function isEarHashed(ear, minX, minY, invSize) { 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; } @@ -3871,1503 +3883,10223 @@ 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.5.0 + * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor + * + * @author Alex Milevski + * @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) : + (factory((global.martinez = {}))); +}(this, (function (exports) { 'use strict'; - // if the path is allowed to go above the root, restore leading ..s - if (allowAboveRoot) { - for (; up--; up) { - parts.unshift('..'); - } - } + function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; } - return parts; -} + var SplayTree = function SplayTree(compare, noDuplicates) { + if ( compare === void 0 ) compare = DEFAULT_COMPARE; + if ( noDuplicates === void 0 ) noDuplicates = false; -// 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); -}; + this._compare = compare; + this._root = null; + this._size = 0; + this._noDuplicates = !!noDuplicates; + }; -// path.resolve([from ...], to) -// posix version -exports.resolve = function() { - var resolvedPath = '', - resolvedAbsolute = false; + var prototypeAccessors = { size: { configurable: true } }; - 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.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; } - 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) + 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; + }; - // Normalize the path - resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { - return !!p; - }), !resolvedAbsolute).join('/'); - return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; -}; + 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; + } -// path.normalize(path) -// posix version -exports.normalize = function(path) { - var isAbsolute = exports.isAbsolute(path), - trailingSlash = substr(path, -1) === '/'; + 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; + }; - // Normalize the path - path = normalizeArray(filter(path.split('/'), function(p) { - return !!p; - }), !isAbsolute).join('/'); - if (!path && !isAbsolute) { - path = '.'; - } - if (path && trailingSlash) { - path += '/'; - } + SplayTree.prototype._splay = function _splay (x) { + var this$1 = this; + + while (x.parent) { + var p = x.parent; + if (!p.parent) { + if (p.left === x) { this$1.rotateRight(p); } + else { this$1.rotateLeft(p); } + } else if (p.left === x && p.parent.left === p) { + this$1.rotateRight(p.parent); + this$1.rotateRight(p); + } else if (p.right === x && p.parent.right === p) { + this$1.rotateLeft(p.parent); + this$1.rotateLeft(p); + } else if (p.left === x && p.parent.right === p) { + this$1.rotateRight(p); + this$1.rotateLeft(p); + } else { + this$1.rotateLeft(p); + this$1.rotateRight(p); + } + } + }; - return (isAbsolute ? '/' : '') + path; -}; -// posix version -exports.isAbsolute = function(path) { - return path.charAt(0) === '/'; -}; + SplayTree.prototype.splay = function splay (x) { + var this$1 = this; -// 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'); - } - return p; - }).join('/')); -}; + var p, gp, ggp, l, r; + while (x.parent) { + p = x.parent; + gp = p.parent; -// path.relative(from, to) -// posix version -exports.relative = function(from, to) { - from = exports.resolve(from).substr(1); - to = exports.resolve(to).substr(1); + 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$1._root = x; + } - function trim(arr) { - var start = 0; - for (; start < arr.length; start++) { - if (arr[start] !== '') break; - } + 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; } - var end = arr.length - 1; - for (; end >= 0; end--) { - if (arr[end] !== '') break; + x.left = p; + p.parent = x; + } } + }; - if (start > end) return []; - return arr.slice(start, end - start + 1); - } - var fromParts = trim(from.split('/')); - var toParts = trim(to.split('/')); + 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; } + }; - 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; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push('..'); - } + SplayTree.prototype.minNode = function minNode (u) { + if ( u === void 0 ) u = this._root; - outputParts = outputParts.concat(toParts.slice(samePartsLength)); + if (u) { while (u.left) { u = u.left; } } + return u; + }; - return outputParts.join('/'); -}; -exports.sep = '/'; -exports.delimiter = ':'; + SplayTree.prototype.maxNode = function maxNode (u) { + if ( u === void 0 ) u = this._root; -exports.dirname = function(path) { - var result = splitPath(path), - root = result[0], - dir = result[1]; + if (u) { while (u.right) { u = u.right; } } + return u; + }; - if (!root && !dir) { - // No dirname whatsoever - return '.'; - } - if (dir) { - // It has a dirname, strip trailing slash - dir = dir.substr(0, dir.length - 1); - } + SplayTree.prototype.insert = function insert (key, data) { + var z = this._root; + var p = null; + var comp = this._compare; + var cmp; - return root + dir; -}; + 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; } + } + } + z = { key: key, data: data, left: null, right: null, parent: p }; -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; -}; + if (!p) { this._root = z; } + else if (comp(p.key, z.key) < 0) { p.right = z; } + else { p.left= z; } + this.splay(z); + this._size++; + return z; + }; -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]); + 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 res; -} + return null; + }; -// 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); + /** + * 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; } } -; -}).call(this,require('_process')) + return false; + }; -},{"_process":6}],23:[function(require,module,exports){ -'use strict'; -module.exports = Pbf; + SplayTree.prototype.remove = function remove (key) { + var z = this.find(key); -var ieee754 = require('ieee754'); + if (!z) { return false; } -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; -} + this.splay(z); -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 + 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; + } -var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), - SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; + this._size--; + return true; + }; -Pbf.prototype = { - destroy: function() { - this.buf = null; - }, + SplayTree.prototype.removeNode = function removeNode (z) { + if (!z) { return false; } - // === READING ================================================================= + this.splay(z); - readFields: function(readField, result, end) { - end = end || this.length; + 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; + } - while (this.pos < end) { - var val = this.readVarint(), - tag = val >> 3, - startPos = this.pos; + this._size--; + return true; + }; - this.type = val & 0x7; - readField(tag, result, this); - if (this.pos === startPos) this.skip(val); - } - return result; - }, + SplayTree.prototype.erase = function erase (key) { + var z = this.find(key); + if (!z) { return; } - readMessage: function(readField, result) { - return this.readFields(readField, result, this.readVarint() + this.pos); - }, + this.splay(z); - readFixed32: function() { - var val = readUInt32(this.buf, this.pos); - this.pos += 4; - return val; - }, + var s = z.left; + var t = z.right; - readSFixed32: function() { - var val = readInt32(this.buf, this.pos); - this.pos += 4; - return val; - }, + 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; + } - // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) + this._size--; + }; - readFixed64: function() { - var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; - this.pos += 8; - return val; - }, + /** + * 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; + }; - 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; - }, + /* eslint-disable class-methods-use-this */ - readDouble: function() { - var val = ieee754.read(this.buf, this.pos, true, 52, 8); - this.pos += 8; - return val; - }, + /** + * 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; + }; - 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; + /** + * 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 */ - return readVarintRemainder(val, isSigned, this); - }, - readVarint64: function() { // for compatibility with v2.0.1 - return this.readVarint(true); - }, + /** + * @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; + }; - readSVarint: function() { - var num = this.readVarint(); - return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding - }, - readBoolean: function() { - return Boolean(this.readVarint()); - }, + /** + * 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 this$1 = this; - readString: function() { - var end = this.readVarint() + this.pos, - str = readUtf8(this.buf, this.pos, end); - this.pos = end; - return str; - }, + var Q = []; + var compare = this._compare; + var node = this._root, cmp; - readBytes: function() { - var end = this.readVarint() + this.pos, - buffer = this.buf.subarray(this.pos, end); - this.pos = end; - return buffer; - }, + 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$1; } // stop if smth is returned + } + node = node.right; + } + } + return this; + }; - // verbose for performance reasons; doesn't affect gzipped size + /** + * Returns all keys in order + * @return {Array} + */ + 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; + }; - 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; - }, - 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); - }, + /** + * Returns `data` fields of all nodes in order. + * @return {Array} + */ + 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; + }; - // === WRITING ================================================================= - writeTag: function(tag, type) { - this.writeVarint((tag << 3) | type); - }, + /** + * 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; + }; - realloc: function(min) { - var length = this.length || 16; + /** + * Bulk-load items. Both array have to be same size + * @param{Array} keys + * @param{Array}[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; + }; - while (length < this.pos + min) length *= 2; - if (length !== this.length) { - var buf = new Uint8Array(length); - buf.set(this.buf); - this.buf = buf; - this.length = length; - } - }, + SplayTree.prototype.min = function min () { + var node = this.minNode(this._root); + if (node) { return node.key; } + else { return null; } + }; - 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; - }, + SplayTree.prototype.max = function max () { + var node = this.maxNode(this._root); + if (node) { return node.key; } + else { return null; } + }; - writeSFixed32: function(val) { - this.realloc(4); - writeInt32(this.buf, val, this.pos); - this.pos += 4; - }, + SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; }; + prototypeAccessors.size.get = function () { return this._size; }; - 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; - }, - 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; - }, + /** + * Create a tree and load it with items + * @param{Array} keys + * @param{Array?} [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); + }; - writeVarint: function(val) { - val = +val || 0; + Object.defineProperties( SplayTree.prototype, prototypeAccessors ); - if (val > 0xfffffff || val < 0) { - writeBigVarint(val, this); - return; - } - this.realloc(4); + 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; + } - 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; - }, - writeSVarint: function(val) { - this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); - }, + function sort(keys, values, left, right, compare) { + if (left >= right) { return; } - writeBoolean: function(val) { - this.writeVarint(Boolean(val)); - }, + var pivot = keys[(left + right) >> 1]; + var i = left - 1; + var j = right + 1; - writeString: function(str) { - str = String(str); - this.realloc(str.length * 4); + while (true) { + do { i++; } while (compare(keys[i], pivot) < 0); + do { j--; } while (compare(keys[j], pivot) > 0); + if (i >= j) { break; } - this.pos++; // reserve 1 byte for short string length + var tmp = keys[i]; + keys[i] = keys[j]; + keys[j] = tmp; - 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; + tmp = values[i]; + values[i] = values[j]; + values[j] = tmp; + } - if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); + sort(keys, values, left, j, compare); + sort(keys, values, j + 1, right, compare); + } - // finally, write the message length in the reserved place and restore the position - this.pos = startPos - 1; - this.writeVarint(len); - this.pos += len; - }, + var NORMAL = 0; + var NON_CONTRIBUTING = 1; + var SAME_TRANSITION = 2; + var DIFFERENT_TRANSITION = 3; - writeFloat: function(val) { - this.realloc(4); - ieee754.write(this.buf, val, this.pos, true, 23, 4); - this.pos += 4; - }, + var INTERSECTION = 0; + var UNION = 1; + var DIFFERENCE = 2; + var XOR = 3; - writeDouble: function(val) { - this.realloc(8); - ieee754.write(this.buf, val, this.pos, true, 52, 8); - this.pos += 8; - }, + /** + * @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; - 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]; - }, + // previous line segment in sweepline belongs to the same polygon + } else { + if (event.isSubject === prev.isSubject) { + event.inOut = !prev.inOut; + event.otherInOut = prev.otherInOut; - writeRawMessage: function(fn, obj) { - this.pos++; // reserve 1 byte for short message length + // previous line segment in sweepline belongs to the clipping polygon + } else { + event.inOut = !prev.otherInOut; + event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut; + } - // 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; + // compute prevInResult field + if (prev) { + event.prevInResult = (!inResult(prev, operation) || prev.isVertical()) + ? prev.prevInResult : prev; + } + } - if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); + // check if the line segment belongs to the Boolean operation + event.inResult = inResult(event, operation); + } - // finally, write the message length in the reserved place and restore the position - this.pos = startPos - 1; - this.writeVarint(len); - this.pos += len; - }, - writeMessage: function(tag, fn, obj) { - this.writeTag(tag, Pbf.Bytes); - this.writeRawMessage(fn, obj); - }, + /* 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 */ - 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); }, + var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) { - 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)); - } -}; + /** + * Is left endpoint? + * @type {Boolean} + */ + this.left = left; -function readVarintRemainder(l, s, p) { - var buf = p.buf, - h, b; + /** + * @type {Array.} + */ + this.point = point; - 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); + /** + * Other edge reference + * @type {SweepEvent} + */ + this.otherEvent = otherEvent; - throw new Error('Expected varint not more than 10 bytes'); -} + /** + * Belongs to source or clipping polygon + * @type {Boolean} + */ + this.isSubject = isSubject; -function readPackedEnd(pbf) { - return pbf.type === Pbf.Bytes ? - pbf.readVarint() + pbf.pos : pbf.pos + 1; -} + /** + * Edge contribution type + * @type {Number} + */ + this.type = edgeType || NORMAL; -function toNum(low, high, isSigned) { - if (isSigned) { - return high * 0x100000000 + (low >>> 0); - } - return ((high >>> 0) * 0x100000000) + (low >>> 0); -} + /** + * In-out transition for the sweepline crossing polygon + * @type {Boolean} + */ + this.inOut = false; -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); + /** + * @type {Boolean} + */ + this.otherInOut = false; - if (low ^ 0xffffffff) { - low = (low + 1) | 0; - } else { - low = 0; - high = (high + 1) | 0; - } - } + /** + * Previous event in result? + * @type {SweepEvent} + */ + this.prevInResult = null; - if (val >= 0x10000000000000000 || val < -0x10000000000000000) { - throw new Error('Given varint doesn\'t fit into 10 bytes'); - } + /** + * Does event belong to result? + * @type {Boolean} + */ + this.inResult = false; - pbf.realloc(10); - writeBigVarintLow(low, high, pbf); - writeBigVarintHigh(high, pbf); -} + // connection step -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; -} + /** + * @type {Boolean} + */ + this.resultInOut = false; -function writeBigVarintHigh(high, pbf) { - var lsb = (high & 0x07) << 4; + this.isExteriorRing = true; + }; - 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 makeRoomForExtraLength(startPos, len, pbf) { - var extraLen = - len <= 0x3fff ? 1 : - len <= 0x1fffff ? 2 : - len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7)); + /** + * @param{Array.}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; + }; - // 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]; -} -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]); } + /** + * @param{Array.}p + * @return {Boolean} + */ + SweepEvent.prototype.isAbove = function isAbove (p) { + return !this.isBelow(p); + }; -// Buffer code below from https://github.com/feross/buffer, MIT-licensed -function readUInt32(buf, pos) { - return ((buf[pos]) | - (buf[pos + 1] << 8) | - (buf[pos + 2] << 16)) + - (buf[pos + 3] * 0x1000000); -} + /** + * @return {Boolean} + */ + SweepEvent.prototype.isVertical = function isVertical () { + return this.point[0] === this.otherEvent.point[0]; + }; -function writeInt32(buf, val, pos) { - buf[pos] = val; - buf[pos + 1] = (val >>> 8); - buf[pos + 2] = (val >>> 16); - buf[pos + 3] = (val >>> 24); -} -function readInt32(buf, pos) { - return ((buf[pos]) | - (buf[pos + 1] << 8) | - (buf[pos + 2] << 16)) + - (buf[pos + 3] << 24); -} + SweepEvent.prototype.clone = function clone () { + var copy = new SweepEvent( + this.point, this.left, this.otherEvent, this.isSubject, this.type); -function readUtf8(buf, pos, end) { - var str = ''; - var i = pos; + copy.inResult = this.inResult; + copy.prevInResult = this.prevInResult; + copy.isExteriorRing = this.isExteriorRing; + copy.inOut = this.inOut; + copy.otherInOut = this.otherInOut; - while (i < end) { - var b0 = buf[i]; - var c = null; // codepoint - var bytesPerSequence = - b0 > 0xEF ? 4 : - b0 > 0xDF ? 3 : - b0 > 0xBF ? 2 : 1; + return copy; + }; - if (i + bytesPerSequence > end) break; + function equals(p1, p2) { + if (p1[0] === p2[0]) { + if (p1[1] === p2[1]) { + return true; + } else { + return false; + } + } + return false; + } - var b1, b2, b3; + // 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; + // }; - 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; - } - } - } + /** + * Signed area of the triangle (p0, p1, p2) + * @param {Array.} p0 + * @param {Array.} p1 + * @param {Array.} p2 + * @return {Number} + */ + function signedArea(p0, p1, p2) { + return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]); + } - if (c === null) { - c = 0xFFFD; - bytesPerSequence = 1; + /** + * @param {SweepEvent} e1 + * @param {SweepEvent} e2 + * @return {Number} + */ + function compareEvents(e1, e2) { + var p1 = e1.point; + var p2 = e2.point; - } else if (c > 0xFFFF) { - c -= 0x10000; - str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800); - c = 0xDC00 | c & 0x3FF; - } + // Different x-coordinate + if (p1[0] > p2[0]) { return 1; } + if (p1[0] < p2[0]) { return -1; } - str += String.fromCharCode(c); - i += bytesPerSequence; + // 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; } + + return specialCases(e1, e2, p1, p2); + } + + + /* 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; } + + // 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.} 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)) { - 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; - } + console.warn('what is that, a collapsed segment?', se); } - return pos; -} + /* eslint-enable no-console */ -},{"ieee754":17}],24:[function(require,module,exports){ -'use strict'; + r.contourId = l.contourId = se.contourId; -module.exports = partialSort; + // 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; + } -// 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] + // avoid a rounding error. The left event would be processed after the right event + // if (compareEvents(se, r) > 0) {} -function partialSort(arr, k, left, right, compare) { - left = left || 0; - right = right || (arr.length - 1); - compare = compare || defaultCompare; + se.otherEvent.otherEvent = l; + se.otherEvent = r; - 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); - } + queue.push(l); + queue.push(r); - var t = arr[k]; - var i = left; - var j = right; + return queue; + } - swap(arr, left, k); - if (compare(arr[right], t) > 0) swap(arr, left, right); + //const EPS = 1e-9; - 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 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]); + } - if (compare(arr[left], t) === 0) swap(arr, left, j); - else { - j++; - swap(arr, j, 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]); + } - if (j <= k) left = j + 1; - if (k <= j) right = j - 1; + /** + * 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.} a1 point of first line + * @param {Array.} a2 point of first line + * @param {Array.} b1 point of second line + * @param {Array.} b2 point of second line + * @param {Boolean=} noEndpointTouch whether to skip single touchpoints + * (meaning connected segments) as + * intersections + * @returns {Array.>|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)]; } -} -function swap(arr, i, j) { - var tmp = arr[i]; - arr[i] = arr[j]; - arr[j] = tmp; -} + // 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; -function defaultCompare(a, b) { - return a < b ? -1 : a > b ? 1 : 0; -} + if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) { + // Lines are just parallel, not the same. No overlap. + return null; + } -},{}],25:[function(require,module,exports){ -'use strict'; + 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); -module.exports = rbush; + // this is, essentially, the FindIntersection acting on floats from + // Schneider & Eberly, just inlined into this function. + if (smin <= 1 && smax >= 0) { -var quickselect = require('quickselect'); + // overlap on an end point + if (smin === 1) { + return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)]; + } -function rbush(maxEntries, format) { - if (!(this instanceof rbush)) return new rbush(maxEntries, format); + if (smax === 0) { + return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)]; + } - // 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)); + if (noEndpointTouch && smin === 0 && smax === 1) { return null; } - if (format) { - this._initFormat(format); + // 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) + ]; } - this.clear(); -} + return null; + } -rbush.prototype = { + /** + * @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); + } - all: function () { - return this._all(this.data, []); - }, + // 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; + } - search: function (bbox) { + // The line segments associated to se1 and se2 overlap + var events = []; + var leftCoincide = false; + var rightCoincide = false; - var node = this.data, - result = [], - toBBox = this.toBBox; + if (equals(se1.point, se2.point)) { + leftCoincide = true; // linked + } else if (compareEvents(se1, se2) === 1) { + events.push(se2, se1); + } else { + events.push(se1, se2); + } - if (!intersects(bbox, node)) return result; + 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); + } - var nodesToSearch = [], - i, len, child, childBBox; + 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; - while (node) { - for (i = 0, len = node.children.length; i < len; i++) { + 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; + } - child = node.children[i]; - childBBox = node.leaf ? toBBox(child) : child; + // the line segments share the right endpoint + if (rightCoincide) { + divideSegment(events[0], events[1].point, queue); + 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(); - } + // 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; + } - return result; - }, + // one line segment includes the other one + divideSegment(events[0], events[1].point, queue); + divideSegment(events[3].otherEvent, events[2].point, queue); - collides: function (bbox) { + return 3; + } - var node = this.data, - toBBox = this.toBBox; + /** + * @param {SweepEvent} le1 + * @param {SweepEvent} le2 + * @return {Number} + */ + function compareSegments(le1, le2) { + if (le1 === le2) { return 0; } - if (!intersects(bbox, node)) return false; + // Segments are not collinear + if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 || + signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) { - var nodesToSearch = [], - i, len, child, childBBox; + // 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; } - while (node) { - for (i = 0, len = node.children.length; i < len; i++) { + // 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; } - child = node.children[i]; - childBBox = node.leaf ? toBBox(child) : child; + // 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; } - if (intersects(bbox, childBBox)) { - if (node.leaf || contains(bbox, childBBox)) return true; - nodesToSearch.push(child); - } - } - node = nodesToSearch.pop(); - } + // 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; + } - return false; - }, + 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; + } - load: function (data) { - if (!(data && data.length)) return this; + return compareEvents(le1, le2) === 1 ? 1 : -1; + } - if (data.length < this._minEntries) { - for (var i = 0, len = data.length; i < len; i++) { - this.insert(data[i]); - } - return this; - } + function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) { + var sweepLine = new SplayTree(compareSegments); + var sortedEvents = []; - // recursively build the tree with the given data from stratch using OMT algorithm - var node = this._build(data.slice(), 0, data.length - 1, 0); + var rightbound = Math.min(sbbox[2], cbbox[2]); - if (!this.data.children.length) { - // save as is if tree is empty - this.data = node; + var prev, next, begin; - } else if (this.data.height === node.height) { - // split root if trees have the same height - this._splitRoot(this.data, node); + while (eventQueue.length !== 0) { + var event = eventQueue.pop(); + sortedEvents.push(event); - } else { - if (this.data.height < node.height) { - // swap trees if inserted one is bigger - var tmpNode = this.data; - this.data = node; - node = tmpNode; - } + // optimization by bboxes for intersection and difference goes here + if ((operation === INTERSECTION && event.point[0] > rightbound) || + (operation === DIFFERENCE && event.point[0] > sbbox[2])) { + break; + } - // insert the small tree into the large tree at appropriate level - this._insert(node, this.data.height - node.height - 1, true); + if (event.left) { + next = prev = sweepLine.insert(event); + begin = sweepLine.minNode(); + + if (prev !== begin) { prev = sweepLine.prev(prev); } + else { prev = null; } + + next = sweepLine.next(next); + + 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; - } + /** + * @param {Array.} sortedEvents + * @return {Array.} + */ + 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 (node.leaf) { // check current node - index = findItem(item, node.children, equalsFn); - 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; - } - } + for (i = 0, len = resultEvents.length; i < len; i++) { + event = resultEvents[i]; + event.pos = i; + } - if (!goingUp && !node.leaf && contains(node, bbox)) { // go down - path.push(node); - indexes.push(i); - i = 0; - parent = node; - node = node.children[0]; + // 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.pos; + event.pos = event.otherEvent.pos; + event.otherEvent.pos = tmp; + } + } - } else if (parent) { // go right - i++; - node = parent.children[i]; - goingUp = false; + return resultEvents; + } - } else node = null; // nothing found - } - return this; - }, + /** + * @param {Number} pos + * @param {Array.} resultEvents + * @param {Object>} processed + * @return {Number} + */ + function nextPos(pos, resultEvents, processed, origIndex) { + var p, p1; + var newPos = pos + 1; + var length = resultEvents.length; - toBBox: function (item) { return item; }, + p = resultEvents[pos].point; - compareMinX: compareNodeMinX, - compareMinY: compareNodeMinY, + if (newPos < length) + { p1 = resultEvents[newPos].point; } - toJSON: function () { return this.data; }, - fromJSON: function (data) { - this.data = data; - return this; - }, + // while in range and not the current one by value + while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) { + if (!processed[newPos]) { + return newPos; + } else { + newPos++; + } + p1 = resultEvents[newPos].point; + } - _all: function (node, result) { - var nodesToSearch = []; - while (node) { - if (node.leaf) result.push.apply(result, node.children); - else nodesToSearch.push.apply(nodesToSearch, node.children); + newPos = pos - 1; - node = nodesToSearch.pop(); - } - return result; - }, + while (processed[newPos] && newPos >= origIndex) { + newPos--; + } + return newPos; + } - _build: function (items, left, right, height) { - var N = right - left + 1, - M = this._maxEntries, - node; + /** + * @param {Array.} sortedEvents + * @return {Array.<*>} polygons + */ + function connectEdges(sortedEvents, operation) { + var i, len; + var resultEvents = orderEvents(sortedEvents); - if (N <= M) { - // reached leaf level; return leaf - node = createNode(items.slice(left, right + 1)); - calcBBox(node, this.toBBox); - return node; + // "false"-filled array + var processed = {}; + var result = []; + var event; + + for (i = 0, len = resultEvents.length; i < len; i++) { + if (processed[i]) { continue; } + var contour = [[]]; + + if (!resultEvents[i].isExteriorRing) { + if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) { + result.push(contour); + } else if (result.length === 0) { + result.push([[contour]]); + } else { + result[result.length - 1].push(contour[0]); } + } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) { + result[result.length - 1].push(contour[0]); + } else { + result.push(contour); + } - if (!height) { - // target height of the bulk-loaded tree - height = Math.ceil(Math.log(N) / Math.log(M)); + var ringId = result.length - 1; + var pos = i; - // target number of root entries to maximize storage utilization - M = Math.ceil(N / Math.pow(M, height - 1)); + var initial = resultEvents[i].point; + contour[0].push(initial); + + while (pos >= i) { + event = resultEvents[pos]; + processed[pos] = true; + + if (event.left) { + event.resultInOut = false; + event.contourId = ringId; + } else { + event.otherEvent.resultInOut = true; + event.otherEvent.contourId = ringId; } - node = createNode([]); - node.leaf = false; - node.height = height; + pos = event.pos; + processed[pos] = true; + contour[0].push(resultEvents[pos].point); + pos = nextPos(pos, resultEvents, processed, i); + } - // split the items into M mostly square tiles + pos = pos === -1 ? i : pos; - var N2 = Math.ceil(N / M), - N1 = N2 * Math.ceil(Math.sqrt(M)), - i, j, right2, right3; + event = resultEvents[pos]; + processed[pos] = processed[event.pos] = true; + event.otherEvent.resultInOut = true; + event.otherEvent.contourId = ringId; + } - multiSelect(items, left, right, N1, this.compareMinX); + // Handle if the result is a polygon (eg not multipoly) + // Commented it again, let's see what do we mean by that + // if (result.length === 1) result = result[0]; + return result; + } - for (i = left; i <= right; i += N1) { + var tinyqueue = TinyQueue; + var default_1 = TinyQueue; - right2 = Math.min(i + N1 - 1, right); + function TinyQueue(data, compare) { + var this$1 = this; - multiSelect(items, i, right2, N2, this.compareMinY); + if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); } - for (j = i; j <= right2; j += N2) { + this.data = data || []; + this.length = this.data.length; + this.compare = compare || defaultCompare; - right3 = Math.min(j + N2 - 1, right2); + if (this.length > 0) { + for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); } + } + } - // pack each entry recursively - node.children.push(this._build(items, j, right3, height - 1)); - } - } + function defaultCompare(a, b) { + return a < b ? -1 : a > b ? 1 : 0; + } - calcBBox(node, this.toBBox); + TinyQueue.prototype = { - return node; - }, + push: function (item) { + this.data.push(item); + this.length++; + this._up(this.length - 1); + }, - _chooseSubtree: function (bbox, node, level, path) { + pop: function () { + if (this.length === 0) { return undefined; } - var i, len, child, targetNode, area, enlargement, minArea, minEnlargement; + var top = this.data[0]; + this.length--; - while (true) { - path.push(node); + 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; + } - if (node.leaf || path.length - 1 === level) break; + data[pos] = item; + }, - minArea = minEnlargement = Infinity; + _down: function (pos) { + var this$1 = this; - for (i = 0, len = node.children.length; i < len; i++) { - child = node.children[i]; - area = bboxArea(child); - enlargement = enlargedArea(bbox, child) - area; + var data = this.data; + var compare = this.compare; + var halfLength = this.length >> 1; + var item = data[pos]; - // choose entry with the least area enlargement - if (enlargement < minEnlargement) { - minEnlargement = enlargement; - minArea = area < minArea ? area : minArea; - targetNode = child; + while (pos < halfLength) { + var left = (pos << 1) + 1; + var right = left + 1; + var best = data[left]; - } else if (enlargement === minEnlargement) { - // otherwise choose one with the smallest area - if (area < minArea) { - minArea = area; - targetNode = child; - } - } - } + if (right < this$1.length && compare(data[right], best) < 0) { + left = right; + best = data[right]; + } + if (compare(best, item) >= 0) { break; } - node = targetNode || node.children[0]; - } + data[pos] = best; + pos = left; + } - return node; - }, + data[pos] = item; + } + }; + tinyqueue.default = default_1; - _insert: function (item, level, isNode) { + var max = Math.max; + var min = Math.min; - var toBBox = this.toBBox, - bbox = isNode ? item : toBBox(item), - insertPath = []; + var contourId = 0; - // find the best node for accommodating the item, saving all nodes along the path too - var node = this._chooseSubtree(bbox, this.data, level, insertPath); - // put the item into the node - node.children.push(item); - extend(node, bbox); + 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; - // 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; - } + if (s1[0] === s2[0] && s1[1] === s2[1]) { + continue; // skip collapsed edges, or it breaks + } - // adjust bboxes along the insertion path - this._adjustParentBBoxes(bbox, insertPath, level); - }, + 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; + } - // split overflowed node into two - _split: function (insertPath, level) { + 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); - var node = insertPath[level], - M = node.children.length, - m = this._minEntries; + // 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); + } + } - this._chooseSplitAxis(node, m, M); - var splitIndex = this._chooseSplitIndex(node, m, M); + function fillQueue(subject, clipping, sbbox, cbbox, operation) { + var eventQueue = new tinyqueue(null, compareEvents); + var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk; - var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex)); - newNode.height = node.height; - newNode.leaf = node.leaf; + 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); + } + } - calcBBox(node, this.toBBox); - calcBBox(newNode, this.toBBox); + 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); + } + } - if (level) insertPath[level - 1].children.push(newNode); - else this._splitRoot(node, newNode); - }, + return eventQueue; + } - _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); - }, + var EMPTY = []; - _chooseSplitIndex: function (node, m, M) { - var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index; + 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; + } - minOverlap = minArea = Infinity; - for (i = m; i <= M - m; i++) { - bbox1 = distBBox(node, 0, i, this.toBBox); - bbox2 = distBBox(node, i, M, this.toBBox); + 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; + } - overlap = intersectionArea(bbox1, bbox2); - area = bboxArea(bbox1) + bboxArea(bbox2); - // choose distribution with minimum overlap - if (overlap < minOverlap) { - minOverlap = overlap; - index = i; + 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]; - minArea = area < minArea ? area : minArea; + //console.time('fill queue'); + var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation); + //console.timeEnd('fill queue'); - } else if (overlap === minOverlap) { - // otherwise choose distribution with minimum area - if (area < minArea) { - minArea = area; - index = i; - } - } - } + 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'); - return index; - }, + //console.time('connect vertices'); + var result = connectEdges(sortedEvents, operation); + //console.timeEnd('connect vertices'); + return result; + } - // sorts node children by the best axis for split - _chooseSplitAxis: function (node, m, M) { + function union (subject, clipping) { + return boolean(subject, clipping, UNION); + } - 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); + function diff (subject, clipping) { + return boolean(subject, clipping, DIFFERENCE); + } - // 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); - }, + function xor (subject, clipping){ + return boolean(subject, clipping, XOR); + } - // total margin of all possible split distributions where each node is at least m full - _allDistMargin: function (node, m, M, compare) { + function intersection$1 (subject, clipping) { + return boolean(subject, clipping, INTERSECTION); + } - node.children.sort(compare); + /** + * @enum {Number} + */ + var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR }; - var toBBox = this.toBBox, - leftBBox = distBBox(node, 0, m, toBBox), - rightBBox = distBBox(node, M - m, M, toBBox), - margin = bboxMargin(leftBBox) + bboxMargin(rightBBox), - i, child; + exports.union = union; + exports.diff = diff; + exports.xor = xor; + exports.intersection = intersection$1; + exports.operations = operations; - for (i = m; i < M - m; i++) { - child = node.children[i]; - extend(leftBBox, node.leaf ? toBBox(child) : child); - margin += bboxMargin(leftBBox); - } + Object.defineProperty(exports, '__esModule', { value: true }); - 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); - } - }, +},{}],23:[function(require,module,exports){ +// Top level file is just a mixin of submodules & constants +'use strict'; - _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); +var assign = require('./lib/utils/common').assign; - } else this.clear(); +var deflate = require('./lib/deflate'); +var inflate = require('./lib/inflate'); +var constants = require('./lib/zlib/constants'); - } else calcBBox(path[i], this.toBBox); - } - }, +var pako = {}; - _initFormat: function (format) { - // data format (minX, minY, maxX, maxY accessors) +assign(pako, deflate, inflate, constants); - // 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 +module.exports = pako; - var compareArr = ['return a', ' - b', ';']; +},{"./lib/deflate":24,"./lib/inflate":25,"./lib/utils/common":26,"./lib/zlib/constants":29}],24:[function(require,module,exports){ +'use strict'; - this.compareMinX = new Function('a', 'b', compareArr.join(format[0])); - this.compareMinY = new Function('a', 'b', compareArr.join(format[1])); - this.toBBox = new Function('a', - 'return {minX: a' + format[0] + - ', minY: a' + format[1] + - ', maxX: a' + format[2] + - ', maxY: a' + format[3] + '};'); - } -}; +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'); -function findItem(item, items, equalsFn) { - if (!equalsFn) return items.indexOf(item); +var toString = Object.prototype.toString; - for (var i = 0; i < items.length; i++) { - if (equalsFn(item, items[i])) return i; - } - return -1; -} +/* Public constants ==========================================================*/ +/* ===========================================================================*/ -// calculate node's bbox from bboxes of its children -function calcBBox(node, toBBox) { - distBBox(node, 0, node.children.length, toBBox, node); -} +var Z_NO_FLUSH = 0; +var Z_FINISH = 4; -// 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; +var Z_OK = 0; +var Z_STREAM_END = 1; +var Z_SYNC_FLUSH = 2; - for (var i = k, child; i < p; i++) { - child = node.children[i]; - extend(destNode, node.leaf ? toBBox(child) : child); - } +var Z_DEFAULT_COMPRESSION = -1; - return destNode; -} +var Z_DEFAULT_STRATEGY = 0; -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; -} +var Z_DEFLATED = 8; -function compareNodeMinX(a, b) { return a.minX - b.minX; } -function compareNodeMinY(a, b) { return a.minY - b.minY; } +/* ===========================================================================*/ -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)); -} +/** + * class Deflate + * + * Generic JS-style wrapper for zlib calls. If you don't need + * streaming behaviour - use more simple functions: [[deflate]], + * [[deflateRaw]] and [[gzip]]. + **/ -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); +/* internal + * Deflate.chunks -> Array + * + * Chunks of output data, if [[Deflate#onData]] not overridden. + **/ - return Math.max(0, maxX - minX) * - Math.max(0, maxY - minY); -} +/** + * 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). + **/ -function contains(a, b) { - return a.minX <= b.minX && - a.minY <= b.minY && - b.maxX <= a.maxX && - b.maxY <= a.maxY; -} +/** + * 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. + **/ -function intersects(a, b) { - return b.minX <= a.maxX && - b.minY <= a.maxY && - b.maxX >= a.minX && - b.maxY >= a.minY; -} +/** + * Deflate.msg -> String + * + * Error message, if [[Deflate.err]] != 0 + **/ -function createNode(children) { - return { - children: children, - height: 1, - leaf: true, - minX: Infinity, - minY: Infinity, - maxX: -Infinity, - maxY: -Infinity - }; -} -// 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 +/** + * 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; + } -function multiSelect(arr, left, right, n, compare) { - var stack = [left, right], - mid; + else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) { + opt.windowBits += 16; + } - while (stack.length) { - right = stack.pop(); - left = stack.pop(); + 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]); + } - if (right - left <= n) continue; + if (opt.header) { + zlib_deflate.deflateSetHeader(this.strm, opt.header); + } - mid = left + Math.ceil((right - left) / n / 2) * n; - quickselect(arr, mid, left, right, compare); + 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; + } - stack.push(left, mid, mid, right); + status = zlib_deflate.deflateSetDictionary(this.strm, dict); + + if (status !== Z_OK) { + throw new Error(msg[status]); } + + this._dict_set = true; + } } -},{"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 - */ -var BehaviorSubject = (function (_super) { - __extends(BehaviorSubject, _super); - function BehaviorSubject(_value) { - _super.call(this); - this._value = _value; + * 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; + + 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 + status = zlib_deflate.deflate(strm, _mode); /* no bad return value */ + + 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); + + // 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; + } + + return true; +}; + + +/** + * 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); +}; + + +/** + * 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); + + // That will never happens, if you don't cheat with options :) + if (deflator.err) { throw deflator.msg || msg[deflator.err]; } + + return deflator.result; +} + + +/** + * 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); +} + + +/** + * 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); +} + + +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 + ); + + if (status !== c.Z_OK) { + throw new Error(msg[status]); + } + + this.header = new GZheader(); + + zlib_inflate.inflateGetHeader(this.strm, this.header); + + // 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]); + } + } + } +} + +/** + * 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; + } + + 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)); + } + } + } + + // 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; +}; + + +/** + * 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); +}; + + +/** + * 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); + } + } + this.chunks = []; + this.err = status; + this.msg = this.strm.msg; +}; + + +/** + * inflate(data[, options]) -> Uint8Array|Array|String + * - data (Uint8Array|Array|String): input data to decompress. + * - options (Object): zlib inflate options. + * + * 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; +} + + +/** + * 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'); + } + + for (var p in source) { + if (_has(source, p)) { + obj[p] = source[p]; + } + } + } + + return obj; +}; + + +// 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; + } + // Fallback to ordinary array + for (var i = 0; i < len; i++) { + dest[dest_offs + i] = src[src_offs + i]; + } + }, + // Join array of chunks to single array. + flattenChunks: function (chunks) { + var i, l, len, pos, chunk, result; + + // calculate data length + len = 0; + for (i = 0, l = chunks.length; i < l; i++) { + len += chunks[i].length; + } + + // 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 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]; + } + }, + // 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++; + } + } + 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++; + } + } + 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); + } + } + + return buf; +}; + +// 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)); + } + } + + 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); +}; + + +// 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--; + } + + // 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); + } + } + + 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; +} + + +module.exports = adler32; + +},{}],29:[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 = { + + /* 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 +}; + +},{}],30:[function(require,module,exports){ +'use strict'; + +// Note: we can't get significant speed boost here. +// So write code to minimize size - no pregenerated tables +// and array tools dependencies. + +// (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; + } + + return table; +} + +// Create table on load. Just 255 signed longs. Not a problem. +var crcTable = makeTable(); + + +function crc32(crc, buf, len, pos) { + var t = crcTable, + end = pos + len; + + crc ^= -1; + + for (var i = pos; i < end; i++) { + crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; + } + + return (crc ^ (-1)); // >>> 0; +} + + +module.exports = crc32; + +},{}],31:[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 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; + + +/* compression levels */ +//var Z_NO_COMPRESSION = 0; +//var Z_BEST_SPEED = 1; +//var Z_BEST_COMPRESSION = 9; +var Z_DEFAULT_COMPRESSION = -1; + + +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; + + +/* The deflate compression method */ +var Z_DEFLATED = 8; + +/*============================================================================*/ + + +var MAX_MEM_LEVEL = 9; +/* Maximum value for memLevel in deflateInit2 */ +var MAX_WBITS = 15; +/* 32K LZ77 window */ +var DEF_MEM_LEVEL = 8; + + +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 MIN_MATCH = 3; +var MAX_MATCH = 258; +var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); + +var PRESET_DICT = 0x20; + +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; + +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 */ + +var OS_CODE = 0x03; // Unix :) . Don't detect, use this default. + +function err(strm, errorCode) { + strm.msg = msg[errorCode]; + return errorCode; +} + +function rank(f) { + return ((f) << 1) - ((f) > 4 ? 9 : 0); +} + +function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } + + +/* ========================================================================= + * 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; + + //_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; + } +} + + +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); +} + + +function put_byte(s, b) { + s.pending_buf[s.pending++] = b; +} + + +/* ========================================================================= + * 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. + */ +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; +} + + +/* =========================================================================== + * 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()). + */ +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; + } + + /* 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. + */ + scan += 2; + match++; + // Assert(*scan == *match, "match[2]?"); + + /* 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]; + } + } 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; + } + if (s.strm.avail_in === 0) { + break; + } + + /* 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; + } + } + } + /* 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. + */ + + } 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. + */ +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 */ + } + //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; + } + /***/ + + + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + 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; + } + /***/ + } + } + + 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; +} + +/* =========================================================================== + * 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. + */ +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 */ + } + } + + /* 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; + /***/ + } + + /* 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 (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; + } + /***/ + } + } + 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 BS_BLOCK_DONE; +} + +/* =========================================================================== + * 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 */ + } + + /* 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; + /***/ + } + + /* 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; + } + } + /* 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--; + } + } + //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 BS_BLOCK_DONE; +} + + +/* =========================================================================== + * 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.) + */ +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 */ + } + + /* 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; + } + } + //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + } + + /* 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; + } + /***/ + } + } + 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; +} + +/* =========================================================================== + * 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.) + */ +function deflate_huff(s, flush) { + var bflush; /* set if current block must be flushed */ + + 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 */ + } + } + + /* 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; + } + /***/ + } + } + 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; +} + +/* 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; + + /*** CLEAR_HASH(s); ***/ + zero(s.head); // Fill with NIL (= 0); + + /* 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. + */ + + this.window_size = 0; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + 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. + */ + + this.head = null; /* Heads of the hash chains or NIL. */ + + 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 */ + + 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 + */ + + this.block_start = 0; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + 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 */ + + 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. + */ +} + + +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; +} + + +function deflateReset(strm) { + var ret = deflateResetKeep(strm); + if (ret === Z_OK) { + lm_init(strm.state); + } + return ret; +} + + +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; + } + } + 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); + } + } + +//#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; + } + } + 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; + } + } + // 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; + } + put_byte(s, val); + } while (val !== 0); + + 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; + } + } + else { + s.status = COMMENT_STATE; + } + } + 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; + } + } + // 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); + + 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; + } + } + else { + s.status = HCRC_STATE; + } + } + 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; + } + } + else { + s.status = BUSY_STATE; + } + } +//#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; + } + } + } + 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; + } + } + 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 { + 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" + } + } + 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; + } + + break; // need to emulate goto via "continue" + } + } 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. + */ +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; + } + } + + /* 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); +} + +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; +} + +function inflateInit(strm) { + return inflateInit2(strm, DEF_WBITS); +} + + +/* + 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. + */ +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; +} + + +/* + 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. + */ +function updatewindow(strm, src, end, copy) { + var dist; + var state = strm.state; + + /* 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; + } + else { + state.wnext += dist; + if (state.wnext === state.wsize) { state.wnext = 0; } + if (state.whave < state.wsize) { state.whave += dist; } + } + } + 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; + } + + 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; + } + //=== 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; + } + state.flags = 0; /* expect zlib header */ + if (state.head) { + state.head.done = false; + } + 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 ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) { + strm.msg = 'unknown compression method'; + state.mode = BAD; + break; + } + //--- 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; + } + 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; + } + if (state.flags & 0xe000) { + strm.msg = 'unknown header flags set'; + state.mode = BAD; + break; + } + 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; + } + //=== 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; + } + 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; + } + //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; + } +//#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; + } + //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 { + //=== 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; + } + } + } + + /* 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; + } + + /* 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; + + 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; + } + + 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; + } + //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; + } + 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; + } + if (here_op & 32) { + //Tracevv((stderr, "inflate: end of block\n")); + state.back = -1; + state.mode = TYPE; + break; + } + if (here_op & 64) { + strm.msg = 'invalid literal/length code'; + state.mode = BAD; + break; + } + 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; + } + 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; + } +//#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 { /* copy from output */ + from_source = output; + from = put - state.offset; + copy = state.length; + } + 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)); + + } + _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; + } + } + + // 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; + } + } + _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; +} + +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; +} + +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; + } + } + /* 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'; + +// (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; + } + } + + /* + 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]; + } + else if (work[sym] > end) { + here_op = extra[extra_index + work[sym]]; + here_val = base[base_index + work[sym]]; + } + else { + here_op = 32 + 64; /* end of block */ + here_val = 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; + } + + /* go to next symbol, update count, len */ + sym++; + if (--count[len] === 0) { + if (len === max) { break; } + len = lens[lens_index + work[sym]]; + } + + /* 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; + } + } + + /* 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; +}; + +},{"../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. + */ + +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 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. + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +// 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 static_dtree = new Array(D_CODES * 2); +zero(static_dtree); +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +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; +} + + +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. + */ +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; +} + + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +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; + } +} + + +function send_code(s, c, tree) { + send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); +} + + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +function bi_reverse(code, len) { + var res = 0; + do { + res |= code & 1; + code >>>= 1; + res <<= 1; + } while (--len > 0); + return res >>> 1; +} + + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +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; + } +} + + +/* =========================================================================== + * 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 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++; + } + tree[n * 2 + 1]/*.Len*/ = bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + 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--; + } + } +} + + +/* =========================================================================== + * 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 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< 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; + } + } + //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; + } + } + //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"); + + /* 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 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; +} + + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +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; +} + +/* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ +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; +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +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; +} + + +// inlined manually +// var SMALLEST = 1; + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +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; + } + } + + /* 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*/; + } + /* 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*/++; + } + + 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; + } + } +} + + +/* =========================================================================== + * 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); + } + + 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; + } + } +} + + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +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; + } + } + /* 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. + */ +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)); + + 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 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; + } + } + + /* 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; +} + + +var static_init_done = false; + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +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); +} + + +/* =========================================================================== + * Send a stored block + */ +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 */ +} + + +/* =========================================================================== + * 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 _tr_align(s) { + send_bits(s, STATIC_TREES << 1, 3); + send_code(s, END_BLOCK, static_ltree); + bi_flush(s); +} + + +/* =========================================================================== + * 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); + } + + /* 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 _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._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--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; +} + +// 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; + + 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'); + } + 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 end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + + 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; + } + } + + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + + return outputParts.join('/'); +}; + +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 res; +} + +// 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); + } +; + +}).call(this,require('_process')) + +},{"_process":6}],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; +} + +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; + +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); + } + return result; + }, + + 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; + }, + + readSFixed32: function() { + var val = readInt32(this.buf, this.pos); + this.pos += 4; + return val; + }, + + // 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; + }, + + 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; + }, + + readDouble: function() { + var val = ieee754.read(this.buf, this.pos, true, 52, 8); + this.pos += 8; + return val; + }, + + 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; + + return readVarintRemainder(val, isSigned, this); + }, + + 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 + }, + + 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; + }, + + readBytes: function() { + var end = this.readVarint() + this.pos, + buffer = this.buf.subarray(this.pos, end); + this.pos = end; + return buffer; + }, + + // verbose for performance reasons; doesn't affect gzipped size + + 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; + }, + + 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); + }, + + // === WRITING ================================================================= + + writeTag: function(tag, type) { + this.writeVarint((tag << 3) | type); + }, + + realloc: function(min) { + var length = this.length || 16; + + while (length < this.pos + min) length *= 2; + + if (length !== this.length) { + var buf = new Uint8Array(length); + buf.set(this.buf); + this.buf = buf; + this.length = length; + } + }, + + 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; + }, + + 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; + }, + + 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; + }, + + writeVarint: function(val) { + val = +val || 0; + + if (val > 0xfffffff || val < 0) { + writeBigVarint(val, this); + return; + } + + this.realloc(4); + + 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; + }, + + writeSVarint: function(val) { + this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); + }, + + writeBoolean: function(val) { + this.writeVarint(Boolean(val)); + }, + + writeString: function(str) { + str = String(str); + this.realloc(str.length * 4); + + this.pos++; // reserve 1 byte for short string length + + 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); + + // 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; + }, + + writeDouble: function(val) { + this.realloc(8); + ieee754.write(this.buf, val, this.pos, true, 52, 8); + this.pos += 8; + }, + + 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]; + }, + + writeRawMessage: function(fn, obj) { + this.pos++; // reserve 1 byte for short message length + + // 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; + + if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); + + // finally, write the message length in the reserved place and restore the position + this.pos = startPos - 1; + this.writeVarint(len); + this.pos += len; + }, + + writeMessage: function(tag, fn, obj) { + this.writeTag(tag, Pbf.Bytes); + this.writeRawMessage(fn, obj); + }, + + 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)); + } +}; + +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); + + 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; +} + +function toNum(low, high, isSigned) { + if (isSigned) { + return high * 0x100000000 + (low >>> 0); + } + + return ((high >>> 0) * 0x100000000) + (low >>> 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); + + if (low ^ 0xffffffff) { + low = (low + 1) | 0; + } else { + low = 0; + high = (high + 1) | 0; + } + } + + if (val >= 0x10000000000000000 || val < -0x10000000000000000) { + throw new Error('Given varint doesn\'t fit into 10 bytes'); + } + + pbf.realloc(10); + + writeBigVarintLow(low, high, pbf); + writeBigVarintHigh(high, pbf); +} + +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; +} + +function writeBigVarintHigh(high, pbf) { + var lsb = (high & 0x07) << 4; + + 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 makeRoomForExtraLength(startPos, len, pbf) { + var extraLen = + len <= 0x3fff ? 1 : + len <= 0x1fffff ? 2 : + len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7)); + + // 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]; +} + +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]); } + +// Buffer code below from https://github.com/feross/buffer, MIT-licensed + +function readUInt32(buf, pos) { + return ((buf[pos]) | + (buf[pos + 1] << 8) | + (buf[pos + 2] << 16)) + + (buf[pos + 3] * 0x1000000); +} + +function writeInt32(buf, val, pos) { + buf[pos] = val; + buf[pos + 1] = (val >>> 8); + buf[pos + 2] = (val >>> 16); + buf[pos + 3] = (val >>> 24); +} + +function readInt32(buf, pos) { + return ((buf[pos]) | + (buf[pos + 1] << 8) | + (buf[pos + 2] << 16)) + + (buf[pos + 3] << 24); +} + +function readUtf8(buf, pos, end) { + var str = ''; + var i = pos; + + while (i < end) { + var b0 = buf[i]; + var c = null; // codepoint + var bytesPerSequence = + b0 > 0xEF ? 4 : + b0 > 0xDF ? 3 : + b0 > 0xBF ? 2 : 1; + + if (i + bytesPerSequence > end) break; + + var b1, b2, b3; + + 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; + } + } + } + + if (c === null) { + c = 0xFFFD; + bytesPerSequence = 1; + + } else if (c > 0xFFFF) { + c -= 0x10000; + str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800); + c = 0xDC00 | c & 0x3FF; + } + + str += String.fromCharCode(c); + i += bytesPerSequence; + } + + return str; +} + +function writeUtf8(buf, str, pos) { + for (var i = 0, c, lead; i < str.length; i++) { + c = str.charCodeAt(i); // code point + + 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; + } + + 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; + } + } + return pos; +} + +},{"ieee754":17}],41:[function(require,module,exports){ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.quickselect = factory()); +}(this, (function () { 'use strict'; + +function quickselect(arr, k, left, right, compare) { + quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare); +} + +function quickselectStep(arr, k, left, right, compare) { + + 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)); + quickselectStep(arr, k, newLeft, newRight, compare); + } + + var t = arr[k]; + var i = left; + var j = right; + + swap(arr, left, k); + if (compare(arr[right], t) > 0) swap(arr, left, right); + + while (i < j) { + swap(arr, i, j); + i++; + j--; + while (compare(arr[i], t) < 0) i++; + while (compare(arr[j], t) > 0) j--; + } + + if (compare(arr[left], t) === 0) swap(arr, left, j); + else { + j++; + swap(arr, j, right); + } + + if (j <= k) left = j + 1; + if (k <= j) right = j - 1; + } +} + +function swap(arr, i, j) { + var tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; +} + +function defaultCompare(a, b) { + return a < b ? -1 : a > b ? 1 : 0; +} + +return quickselect; + +}))); + +},{}],42:[function(require,module,exports){ +'use strict'; + +module.exports = rbush; +module.exports.default = rbush; + +var quickselect = require('quickselect'); + +function rbush(maxEntries, format) { + if (!(this instanceof rbush)) return new rbush(maxEntries, format); + + // 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)); + + if (format) { + this._initFormat(format); + } + + this.clear(); +} + +rbush.prototype = { + + all: function () { + return this._all(this.data, []); + }, + + search: function (bbox) { + + var node = this.data, + result = [], + toBBox = this.toBBox; + + if (!intersects(bbox, node)) return result; + + var nodesToSearch = [], + i, len, child, childBBox; + + while (node) { + for (i = 0, len = node.children.length; i < len; i++) { + + child = node.children[i]; + childBBox = node.leaf ? toBBox(child) : child; + + 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(); + } + + return result; + }, + + collides: function (bbox) { + + var node = this.data, + toBBox = this.toBBox; + + if (!intersects(bbox, node)) return false; + + var nodesToSearch = [], + i, len, child, childBBox; + + while (node) { + for (i = 0, len = node.children.length; i < len; i++) { + + child = node.children[i]; + childBBox = node.leaf ? toBBox(child) : child; + + if (intersects(bbox, childBBox)) { + if (node.leaf || contains(bbox, childBBox)) return true; + nodesToSearch.push(child); + } + } + node = nodesToSearch.pop(); + } + + return false; + }, + + load: function (data) { + if (!(data && data.length)) return this; + + if (data.length < this._minEntries) { + for (var i = 0, len = data.length; i < len; i++) { + this.insert(data[i]); + } + return this; + } + + // recursively build the tree with the given data from scratch using OMT algorithm + var node = this._build(data.slice(), 0, data.length - 1, 0); + + if (!this.data.children.length) { + // save as is if tree is empty + this.data = node; + + } else if (this.data.height === node.height) { + // split root if trees have the same height + this._splitRoot(this.data, node); + + } else { + if (this.data.height < node.height) { + // swap trees if inserted one is bigger + var tmpNode = this.data; + this.data = node; + node = tmpNode; + } + + // insert the small tree into the large tree at appropriate level + this._insert(node, this.data.height - node.height - 1, true); + } + + return this; + }, + + insert: function (item) { + if (item) this._insert(item, this.data.height - 1); + return this; + }, + + clear: function () { + this.data = createNode([]); + return this; + }, + + remove: function (item, equalsFn) { + if (!item) return this; + + var node = this.data, + bbox = this.toBBox(item), + path = [], + indexes = [], + i, parent, index, goingUp; + + // depth-first iterative tree traversal + while (node || path.length) { + + if (!node) { // go up + node = path.pop(); + parent = path[path.length - 1]; + i = indexes.pop(); + goingUp = true; + } + + if (node.leaf) { // check current node + index = findItem(item, node.children, equalsFn); + + 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; + } + } + + 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; + + } else node = null; // nothing found + } + + return this; + }, + + toBBox: function (item) { return item; }, + + compareMinX: compareNodeMinX, + compareMinY: compareNodeMinY, + + toJSON: function () { return this.data; }, + + fromJSON: function (data) { + this.data = data; + return this; + }, + + _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(); + } + return result; + }, + + _build: function (items, left, right, height) { + + var N = right - left + 1, + M = this._maxEntries, + node; + + if (N <= M) { + // reached leaf level; return leaf + node = createNode(items.slice(left, right + 1)); + calcBBox(node, this.toBBox); + return node; + } + + if (!height) { + // target height of the bulk-loaded tree + height = Math.ceil(Math.log(N) / Math.log(M)); + + // target number of root entries to maximize storage utilization + M = Math.ceil(N / Math.pow(M, height - 1)); + } + + node = createNode([]); + node.leaf = false; + node.height = height; + + // split the items into M mostly square tiles + + var N2 = Math.ceil(N / M), + N1 = N2 * Math.ceil(Math.sqrt(M)), + i, j, right2, right3; + + multiSelect(items, left, right, N1, this.compareMinX); + + for (i = left; i <= right; i += N1) { + + right2 = Math.min(i + N1 - 1, right); + + multiSelect(items, i, right2, N2, this.compareMinY); + + for (j = i; j <= right2; j += N2) { + + right3 = Math.min(j + N2 - 1, right2); + + // pack each entry recursively + node.children.push(this._build(items, j, right3, height - 1)); + } + } + + calcBBox(node, this.toBBox); + + return node; + }, + + _chooseSubtree: function (bbox, node, level, path) { + + var i, len, child, targetNode, area, enlargement, minArea, minEnlargement; + + while (true) { + path.push(node); + + if (node.leaf || path.length - 1 === level) break; + + minArea = minEnlargement = Infinity; + + for (i = 0, len = node.children.length; i < len; i++) { + child = node.children[i]; + area = bboxArea(child); + enlargement = enlargedArea(bbox, child) - area; + + // choose entry with the least area enlargement + if (enlargement < minEnlargement) { + minEnlargement = enlargement; + minArea = area < minArea ? area : minArea; + targetNode = child; + + } else if (enlargement === minEnlargement) { + // otherwise choose one with the smallest area + if (area < minArea) { + minArea = area; + targetNode = child; + } + } + } + + node = targetNode || node.children[0]; + } + + return node; + }, + + _insert: function (item, level, isNode) { + + var toBBox = this.toBBox, + bbox = isNode ? item : toBBox(item), + insertPath = []; + + // find the best node for accommodating the item, saving all nodes along the path too + var node = this._chooseSubtree(bbox, this.data, level, insertPath); + + // put the item into the node + node.children.push(item); + extend(node, bbox); + + // 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; + } + + // adjust bboxes along the insertion path + this._adjustParentBBoxes(bbox, insertPath, level); + }, + + // split overflowed node into two + _split: function (insertPath, level) { + + var node = insertPath[level], + M = node.children.length, + m = this._minEntries; + + this._chooseSplitAxis(node, m, M); + + var splitIndex = this._chooseSplitIndex(node, m, M); + + var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex)); + newNode.height = node.height; + newNode.leaf = node.leaf; + + calcBBox(node, this.toBBox); + calcBBox(newNode, this.toBBox); + + if (level) insertPath[level - 1].children.push(newNode); + else this._splitRoot(node, newNode); + }, + + _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; + + minOverlap = minArea = Infinity; + + for (i = m; i <= M - m; i++) { + bbox1 = distBBox(node, 0, i, this.toBBox); + bbox2 = distBBox(node, i, M, this.toBBox); + + overlap = intersectionArea(bbox1, bbox2); + area = bboxArea(bbox1) + bboxArea(bbox2); + + // choose distribution with minimum overlap + if (overlap < minOverlap) { + minOverlap = overlap; + index = i; + + minArea = area < minArea ? area : minArea; + + } else if (overlap === minOverlap) { + // otherwise choose distribution with minimum area + if (area < minArea) { + minArea = area; + index = i; + } + } + } + + return index; + }, + + // sorts node children by the best axis for split + _chooseSplitAxis: function (node, m, M) { + + 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); + + // 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); + }, + + // total margin of all possible split distributions where each node is at least m full + _allDistMargin: function (node, m, M, compare) { + + node.children.sort(compare); + + var toBBox = this.toBBox, + leftBBox = distBBox(node, 0, m, toBBox), + rightBBox = distBBox(node, M - m, M, toBBox), + margin = bboxMargin(leftBBox) + bboxMargin(rightBBox), + i, child; + + for (i = m; i < M - m; i++) { + child = node.children[i]; + extend(leftBBox, node.leaf ? toBBox(child) : child); + margin += bboxMargin(leftBBox); + } + + 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); + } + }, + + _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); + + } else this.clear(); + + } else calcBBox(path[i], this.toBBox); + } + }, + + _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 + + var compareArr = ['return a', ' - b', ';']; + + this.compareMinX = new Function('a', 'b', compareArr.join(format[0])); + this.compareMinY = new Function('a', 'b', compareArr.join(format[1])); + + this.toBBox = new Function('a', + 'return {minX: a' + format[0] + + ', minY: a' + format[1] + + ', maxX: a' + format[2] + + ', maxY: a' + format[3] + '};'); + } +}; + +function findItem(item, items, equalsFn) { + if (!equalsFn) return items.indexOf(item); + + for (var i = 0; i < items.length; i++) { + if (equalsFn(item, items[i])) return i; + } + return -1; +} + +// calculate node's bbox from bboxes of its children +function calcBBox(node, toBBox) { + distBBox(node, 0, node.children.length, toBBox, node); +} + +// 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; + + for (var i = k, child; i < p; i++) { + child = node.children[i]; + extend(destNode, node.leaf ? toBBox(child) : child); + } + + return destNode; +} + +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; +} + +function compareNodeMinX(a, b) { return a.minX - b.minX; } +function compareNodeMinY(a, b) { return a.minY - b.minY; } + +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)); +} + +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); +} + +function contains(a, b) { + return a.minX <= b.minX && + a.minY <= b.minY && + b.maxX <= a.maxX && + b.maxY <= a.maxY; +} + +function intersects(a, b) { + return b.minX <= a.maxX && + b.minY <= a.maxY && + b.maxX >= a.minX && + b.maxY >= a.minY; +} + +function createNode(children) { + return { + children: children, + height: 1, + leaf: true, + minX: Infinity, + minY: Infinity, + maxX: -Infinity, + maxY: -Infinity + }; +} + +// 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; + + while (stack.length) { + right = stack.pop(); + left = stack.pop(); + + if (right - left <= n) continue; + + mid = left + Math.ceil((right - left) / n / 2) * n; + quickselect(arr, mid, left, right, compare); + + stack.push(left, mid, mid, right); + } +} + +},{"quickselect":41}],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; +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 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 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":74,"./internal/observable/iif":75,"./internal/observable/interval":76,"./internal/observable/merge":77,"./internal/observable/never":78,"./internal/observable/of":79,"./internal/observable/onErrorResumeNext":80,"./internal/observable/pairs":81,"./internal/observable/race":82,"./internal/observable/range":83,"./internal/observable/throwError":85,"./internal/observable/timer":86,"./internal/observable/using":87,"./internal/observable/zip":88,"./internal/operators/groupBy":124,"./internal/scheduler/VirtualTimeScheduler":201,"./internal/scheduler/animationFrame":202,"./internal/scheduler/asap":203,"./internal/scheduler/async":204,"./internal/scheduler/queue":205,"./internal/symbol/observable":207,"./internal/util/ArgumentOutOfRangeError":209,"./internal/util/EmptyError":210,"./internal/util/ObjectUnsubscribedError":212,"./internal/util/TimeoutError":213,"./internal/util/UnsubscriptionError":214,"./internal/util/identity":218,"./internal/util/isObservable":227,"./internal/util/noop":230,"./internal/util/pipe":232}],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); + } + 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 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); + }; + AsyncSubject.prototype.next = function (value) { + if (!this.hasCompleted) { + this.value = value; + this.hasNext = true; + } + }; + AsyncSubject.prototype.error = function (error) { + if (!this.hasCompleted) { + _super.prototype.error.call(this, error); + } + }; + 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; + +},{"./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 __()); + }; +})(); +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; + } + 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); @@ -5394,27 +14126,32 @@ var BehaviorSubject = (function (_super) { }(Subject_1.Subject)); exports.BehaviorSubject = BehaviorSubject; -},{"./Subject":34,"./util/ObjectUnsubscribedError":220}],27:[function(require,module,exports){ +},{"./Subject":53,"./util/ObjectUnsubscribedError":212}],46:[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 __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 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; + var _this = _super.call(this) || this; + _this.parent = parent; + _this.outerValue = outerValue; + _this.outerIndex = outerIndex; + _this.index = 0; + return _this; } InnerSubscriber.prototype._next = function (value) { this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this); @@ -5431,23 +14168,12 @@ var InnerSubscriber = (function (_super) { }(Subscriber_1.Subscriber)); exports.InnerSubscriber = InnerSubscriber; -},{"./Subscriber":36}],28:[function(require,module,exports){ +},{"./Subscriber":55}],47:[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 - */ +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 Notification = (function () { function Notification(kind, value, error) { this.kind = kind; @@ -5455,11 +14181,6 @@ var Notification = (function () { this.error = error; this.hasValue = kind === 'N'; } - /** - * 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': @@ -5470,14 +14191,6 @@ var Notification = (function () { 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) { @@ -5489,15 +14202,6 @@ var Notification = (function () { 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); @@ -5506,50 +14210,27 @@ var Notification = (function () { 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); + return of_1.of(this.value); case 'E': - return Observable_1.Observable.throw(this.error); + return throwError_1.throwError(this.error); case 'C': - return Observable_1.Observable.empty(); + return empty_1.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} 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} 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} The valueless "complete" Notification. - */ Notification.createComplete = function () { return Notification.completeNotification; }; @@ -5559,159 +14240,27 @@ var Notification = (function () { }()); exports.Notification = Notification; -},{"./Observable":29}],29:[function(require,module,exports){ +},{"./observable/empty":65,"./observable/of":79,"./observable/throwError":85}],48:[function(require,module,exports){ "use strict"; -var root_1 = require('./util/root'); -var toSubscriber_1 = require('./util/toSubscriber'); -var observable_1 = require('./symbol/observable'); -var pipe_1 = require('./util/pipe'); -/** - * A representation of any set of values over any amount of time. This is the most basic building block - * of RxJS. - * - * @class Observable - */ +Object.defineProperty(exports, "__esModule", { value: true }); +var canReportError_1 = require("./util/canReportError"); +var toSubscriber_1 = require("./util/toSubscriber"); +var observable_1 = require("../internal/symbol/observable"); +var pipe_1 = require("./util/pipe"); +var config_1 = require("./config"); 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. - * - * Use it when you have all these Observables, but still nothing is happening. - * - * `subscribe` is not a regular operator, but a method that calls Observable's 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 Subscribe with an Observer - * const sumObserver = { - * sum: 0, - * next(value) { - * console.log('Adding: ' + value); - * this.sum = this.sum + value; - * }, - * error() { // We actually could just remove 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 Subscribe with functions - * 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 Cancel a subscription - * 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); @@ -5719,12 +14268,16 @@ var Observable = (function () { 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; + 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; + } } } return sink; @@ -5734,163 +14287,117 @@ var Observable = (function () { 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; + if (config_1.config.useDeprecatedSynchronousErrorHandling) { + sink.syncErrorThrown = true; + sink.syncErrorValue = err; } - else if (root_1.root.Promise) { - PromiseCtor = root_1.root.Promise; + if (canReportError_1.canReportError(sink)) { + sink.error(err); + } + else { + console.warn(err); } } - 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. + }; + 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) { - 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); + try { + next(value); + } + catch (err) { + reject(err); + if (subscription) { 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); + var source = this.source; + return source && 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; }; - /* tslint:enable:max-line-length */ - /** - * Used to stitch together functional operators into a chain. - * @method pipe - * @return {Observable} the Observable result of all of the operators having - * been called in the order they were passed in. - * - * @example - * - * import { map, filter, scan } from 'rxjs/operators'; - * - * Rx.Observable.interval(1000) - * .pipe( - * filter(x => x % 2 === 0), - * map(x => x + x), - * scan((acc, x) => acc + x) - * ) - * .subscribe(x => console.log(x)) - */ Observable.prototype.pipe = function () { var operations = []; for (var _i = 0; _i < arguments.length; _i++) { - operations[_i - 0] = arguments[_i]; + operations[_i] = arguments[_i]; } if (operations.length === 0) { return this; } return pipe_1.pipeFromArray(operations)(this); }; - /* tslint:enable:max-line-length */ - Observable.prototype.toPromise = function (PromiseCtor) { + Observable.prototype.toPromise = function (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) { + 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); }); }); }; - // 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; +function getPromiseCtor(promiseCtor) { + if (!promiseCtor) { + promiseCtor = config_1.config.Promise || Promise; + } + if (!promiseCtor) { + throw new Error('no Promise impl found'); + } + return promiseCtor; +} -},{"./symbol/observable":215,"./util/pipe":235,"./util/root":236,"./util/toSubscriber":238}],30:[function(require,module,exports){ +},{"../internal/symbol/observable":207,"./config":57,"./util/canReportError":215,"./util/pipe":232,"./util/toSubscriber":239}],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) { throw err; }, + error: function (err) { + if (config_1.config.useDeprecatedSynchronousErrorHandling) { + throw err; + } + else { + hostReportError_1.hostReportError(err); + } + }, complete: function () { } }; -},{}],31:[function(require,module,exports){ +},{"./config":57,"./util/hostReportError":217}],50:[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 __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 OuterSubscriber = (function (_super) { __extends(OuterSubscriber, _super); function OuterSubscriber() { - _super.apply(this, arguments); + return _super !== null && _super.apply(this, arguments) || this; } OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { this.destination.next(innerValue); @@ -5905,50 +14412,71 @@ var OuterSubscriber = (function (_super) { }(Subscriber_1.Subscriber)); exports.OuterSubscriber = OuterSubscriber; -},{"./Subscriber":36}],32:[function(require,module,exports){ +},{"./Subscriber":55}],51:[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 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'); -/** - * @class ReplaySubject - */ +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 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; } - _super.call(this); - this.scheduler = scheduler; - this._events = []; - this._bufferSize = bufferSize < 1 ? 1 : bufferSize; - this._windowTime = windowTime < 1 ? 1 : windowTime; + 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; + } + else { + _this.next = _this.nextTimeWindow; + } + return _this; } - ReplaySubject.prototype.next = function (value) { - var now = this._getNow(); - this._events.push(new ReplayEvent(now, value)); + ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) { + var _events = this._events; + _events.push(value); + if (_events.length > this._bufferSize) { + _events.shift(); + } + _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 _events = this._trimBufferThenGetEvents(); + 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.hasError) { - subscription = Subscription_1.Subscription.EMPTY; - } - else if (this.isStopped) { + else if (this.isStopped || this.hasError) { subscription = Subscription_1.Subscription.EMPTY; } else { @@ -5958,9 +14486,15 @@ var ReplaySubject = (function (_super) { 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 (_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); @@ -5980,9 +14514,6 @@ var ReplaySubject = (function (_super) { 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; @@ -6008,93 +14539,66 @@ var ReplayEvent = (function () { return ReplayEvent; }()); -},{"./Subject":34,"./SubjectSubscription":35,"./Subscription":37,"./operators/observeOn":183,"./scheduler/queue":213,"./util/ObjectUnsubscribedError":220}],33:[function(require,module,exports){ +},{"./Subject":53,"./SubjectSubscription":54,"./Subscription":56,"./operators/observeOn":139,"./scheduler/queue":205,"./util/ObjectUnsubscribedError":212}],52:[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 - */ +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; } - /** - * 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(); }; + Scheduler.now = function () { return Date.now(); }; return Scheduler; }()); exports.Scheduler = Scheduler; -},{}],34:[function(require,module,exports){ +},{}],53:[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 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 - */ +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("./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) { - _super.call(this, destination); - this.destination = destination; + var _this = _super.call(this, destination) || this; + _this.destination = destination; + return _this; } return SubjectSubscriber; }(Subscriber_1.Subscriber)); exports.SubjectSubscriber = SubjectSubscriber; -/** - * @class Subject - */ 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; + var _this = _super.call(this) || this; + _this.observers = []; + _this.closed = false; + _this.isStopped = false; + _this.hasError = false; + _this.thrownError = null; + return _this; } Subject.prototype[rxSubscriber_1.rxSubscriber] = function () { return new SubjectSubscriber(this); @@ -6186,15 +14690,13 @@ var Subject = (function (_super) { return Subject; }(Observable_1.Observable)); exports.Subject = Subject; -/** - * @class AnonymousSubject - */ var AnonymousSubject = (function (_super) { __extends(AnonymousSubject, _super); function AnonymousSubject(destination, source) { - _super.call(this); - this.destination = destination; - this.source = source; + var _this = _super.call(this) || this; + _this.destination = destination; + _this.source = source; + return _this; } AnonymousSubject.prototype.next = function (value) { var destination = this.destination; @@ -6227,26 +14729,31 @@ var AnonymousSubject = (function (_super) { }(Subject)); exports.AnonymousSubject = AnonymousSubject; -},{"./Observable":29,"./SubjectSubscription":35,"./Subscriber":36,"./Subscription":37,"./symbol/rxSubscriber":216,"./util/ObjectUnsubscribedError":220}],35:[function(require,module,exports){ +},{"../internal/symbol/rxSubscriber":208,"./Observable":48,"./SubjectSubscription":54,"./Subscriber":55,"./Subscription":56,"./util/ObjectUnsubscribedError":212}],54:[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'); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ +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 SubjectSubscription = (function (_super) { __extends(SubjectSubscription, _super); function SubjectSubscription(subject, subscriber) { - _super.call(this); - this.subject = subject; - this.subscriber = subscriber; - this.closed = false; + var _this = _super.call(this) || this; + _this.subject = subject; + _this.subscriber = subscriber; + _this.closed = false; + return _this; } SubjectSubscription.prototype.unsubscribe = function () { if (this.closed) { @@ -6268,117 +14775,82 @@ var SubjectSubscription = (function (_super) { }(Subscription_1.Subscription)); exports.SubjectSubscription = SubjectSubscription; -},{"./Subscription":37}],36:[function(require,module,exports){ +},{"./Subscription":56}],55:[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 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 - */ +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 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); - /** - * @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; + var _this = _super.call(this) || this; + _this.syncErrorValue = null; + _this.syncErrorThrown = false; + _this.syncErrorThrowable = false; + _this.isStopped = false; + _this._parentSubscription = null; switch (arguments.length) { case 0: - this.destination = Observer_1.empty; + _this.destination = Observer_1.empty; break; case 1: if (!destinationOrNext) { - this.destination = Observer_1.empty; + _this.destination = Observer_1.empty; break; } if (typeof destinationOrNext === 'object') { if (destinationOrNext instanceof Subscriber) { - this.destination = destinationOrNext; - this.destination.add(this); + _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable; + _this.destination = destinationOrNext; + destinationOrNext.add(_this); } else { - this.syncErrorThrowable = true; - this.destination = new SafeSubscriber(this, destinationOrNext); + _this.syncErrorThrowable = true; + _this.destination = new SafeSubscriber(_this, destinationOrNext); } break; } default: - this.syncErrorThrowable = true; - this.destination = new SafeSubscriber(this, destinationOrNext, error, complete); + _this.syncErrorThrowable = true; + _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete); break; } + return _this; } 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} 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; @@ -6412,23 +14884,19 @@ var Subscriber = (function (_super) { this.isStopped = false; this._parent = _parent; this._parents = _parents; + this._parentSubscription = null; 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 _this = _super.call(this) || this; + _this._parentSubscriber = _parentSubscriber; var next; - var context = this; + var context = _this; if (isFunction_1.isFunction(observerOrNext)) { next = observerOrNext; } @@ -6439,20 +14907,21 @@ var SafeSubscriber = (function (_super) { if (observerOrNext !== Observer_1.empty) { context = Object.create(observerOrNext); if (isFunction_1.isFunction(context.unsubscribe)) { - this.add(context.unsubscribe.bind(context)); + _this.add(context.unsubscribe.bind(context)); } - context.unsubscribe = this.unsubscribe.bind(this); + context.unsubscribe = _this.unsubscribe.bind(_this); } } - this._context = context; - this._next = next; - this._error = error; - this._complete = complete; + _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 (!_parentSubscriber.syncErrorThrowable) { + if (!config_1.config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { this.__tryOrUnsub(this._next, value); } else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) { @@ -6463,8 +14932,9 @@ var SafeSubscriber = (function (_super) { SafeSubscriber.prototype.error = function (err) { if (!this.isStopped) { var _parentSubscriber = this._parentSubscriber; + var useDeprecatedSynchronousErrorHandling = config_1.config.useDeprecatedSynchronousErrorHandling; if (this._error) { - if (!_parentSubscriber.syncErrorThrowable) { + if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { this.__tryOrUnsub(this._error, err); this.unsubscribe(); } @@ -6475,11 +14945,19 @@ var SafeSubscriber = (function (_super) { } else if (!_parentSubscriber.syncErrorThrowable) { this.unsubscribe(); - throw err; + if (useDeprecatedSynchronousErrorHandling) { + throw err; + } + hostReportError_1.hostReportError(err); } else { - _parentSubscriber.syncErrorValue = err; - _parentSubscriber.syncErrorThrown = true; + if (useDeprecatedSynchronousErrorHandling) { + _parentSubscriber.syncErrorValue = err; + _parentSubscriber.syncErrorThrown = true; + } + else { + hostReportError_1.hostReportError(err); + } this.unsubscribe(); } } @@ -6490,7 +14968,7 @@ var SafeSubscriber = (function (_super) { var _parentSubscriber = this._parentSubscriber; if (this._complete) { var wrappedComplete = function () { return _this._complete.call(_this._context); }; - if (!_parentSubscriber.syncErrorThrowable) { + if (!config_1.config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { this.__tryOrUnsub(wrappedComplete); this.unsubscribe(); } @@ -6510,17 +14988,31 @@ var SafeSubscriber = (function (_super) { } catch (err) { this.unsubscribe(); - throw err; + 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) { - parent.syncErrorValue = err; - parent.syncErrorThrown = true; - return true; + if (config_1.config.useDeprecatedSynchronousErrorHandling) { + parent.syncErrorValue = err; + parent.syncErrorThrown = true; + return true; + } + else { + hostReportError_1.hostReportError(err); + return true; + } } return false; }; @@ -6532,37 +15024,19 @@ var SafeSubscriber = (function (_super) { }; return SafeSubscriber; }(Subscriber)); +exports.SafeSubscriber = SafeSubscriber; -},{"./Observer":30,"./Subscription":37,"./symbol/rxSubscriber":216,"./util/isFunction":229}],37:[function(require,module,exports){ +},{"../internal/symbol/rxSubscriber":208,"./Observer":49,"./Subscription":56,"./config":57,"./util/hostReportError":217,"./util/isFunction":222}],56:[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 - */ +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 tryCatch_1 = require("./util/tryCatch"); +var errorObject_1 = require("./util/errorObject"); +var UnsubscriptionError_1 = require("./util/UnsubscriptionError"); 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; @@ -6571,12 +15045,6 @@ var Subscription = (function () { this._unsubscribe = unsubscribe; } } - /** - * 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; @@ -6587,17 +15055,11 @@ var Subscription = (function () { 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)) { @@ -6621,657 +15083,134 @@ var Subscription = (function () { 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); }, []); -} - -},{"./util/UnsubscriptionError":223,"./util/errorObject":224,"./util/isArray":226,"./util/isFunction":229,"./util/isObject":231,"./util/tryCatch":239}],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":104}],39:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var concat_1 = require('../../observable/concat'); -Observable_1.Observable.concat = concat_1.concat; - -},{"../../Observable":29,"../../observable/concat":105}],40:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var defer_1 = require('../../observable/defer'); -Observable_1.Observable.defer = defer_1.defer; - -},{"../../Observable":29,"../../observable/defer":106}],41:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var empty_1 = require('../../observable/empty'); -Observable_1.Observable.empty = empty_1.empty; - -},{"../../Observable":29,"../../observable/empty":107}],42:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var from_1 = require('../../observable/from'); -Observable_1.Observable.from = from_1.from; - -},{"../../Observable":29,"../../observable/from":108}],43:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var fromEvent_1 = require('../../observable/fromEvent'); -Observable_1.Observable.fromEvent = fromEvent_1.fromEvent; - -},{"../../Observable":29,"../../observable/fromEvent":109}],44:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var fromPromise_1 = require('../../observable/fromPromise'); -Observable_1.Observable.fromPromise = fromPromise_1.fromPromise; - -},{"../../Observable":29,"../../observable/fromPromise":110}],45:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var merge_1 = require('../../observable/merge'); -Observable_1.Observable.merge = merge_1.merge; - -},{"../../Observable":29,"../../observable/merge":111}],46:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var of_1 = require('../../observable/of'); -Observable_1.Observable.of = of_1.of; - -},{"../../Observable":29,"../../observable/of":112}],47:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var throw_1 = require('../../observable/throw'); -Observable_1.Observable.throw = throw_1._throw; - -},{"../../Observable":29,"../../observable/throw":113}],48:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var timer_1 = require('../../observable/timer'); -Observable_1.Observable.timer = timer_1.timer; - -},{"../../Observable":29,"../../observable/timer":114}],49:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var zip_1 = require('../../observable/zip'); -Observable_1.Observable.zip = zip_1.zip; - -},{"../../Observable":29,"../../observable/zip":115}],50:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var auditTime_1 = require('../../operator/auditTime'); -Observable_1.Observable.prototype.auditTime = auditTime_1.auditTime; - -},{"../../Observable":29,"../../operator/auditTime":116}],51:[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":117}],52:[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; - -},{"../../Observable":29,"../../operator/bufferCount":118}],53:[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; - -},{"../../Observable":29,"../../operator/bufferWhen":119}],54:[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; - -},{"../../Observable":29,"../../operator/catch":120}],55:[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; - -},{"../../Observable":29,"../../operator/combineLatest":121}],56:[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":122}],57:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var count_1 = require('../../operator/count'); -Observable_1.Observable.prototype.count = count_1.count; - -},{"../../Observable":29,"../../operator/count":123}],58:[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; - -},{"../../Observable":29,"../../operator/debounceTime":124}],59:[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; - -},{"../../Observable":29,"../../operator/delay":125}],60:[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; - -},{"../../Observable":29,"../../operator/distinct":126}],61:[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":127}],62:[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; - -},{"../../Observable":29,"../../operator/do":128}],63:[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":129}],64:[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; - -},{"../../Observable":29,"../../operator/filter":130}],65:[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; - -},{"../../Observable":29,"../../operator/finally":131}],66:[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":132}],67:[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; - -},{"../../Observable":29,"../../operator/last":133}],68:[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":134}],69:[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":135}],70:[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; - -},{"../../Observable":29,"../../operator/mergeAll":136}],71:[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":137}],72:[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; - -},{"../../Observable":29,"../../operator/pairwise":138}],73:[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; - -},{"../../Observable":29,"../../operator/pluck":139}],74:[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; - -},{"../../Observable":29,"../../operator/publish":140}],75:[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; - -},{"../../Observable":29,"../../operator/publishReplay":141}],76:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var reduce_1 = require('../../operator/reduce'); -Observable_1.Observable.prototype.reduce = reduce_1.reduce; - -},{"../../Observable":29,"../../operator/reduce":142}],77:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var retry_1 = require('../../operator/retry'); -Observable_1.Observable.prototype.retry = retry_1.retry; - -},{"../../Observable":29,"../../operator/retry":143}],78:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var sample_1 = require('../../operator/sample'); -Observable_1.Observable.prototype.sample = sample_1.sample; - -},{"../../Observable":29,"../../operator/sample":144}],79:[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; - -},{"../../Observable":29,"../../operator/scan":145}],80:[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; - -},{"../../Observable":29,"../../operator/share":146}],81:[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; - -},{"../../Observable":29,"../../operator/skip":147}],82:[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; - -},{"../../Observable":29,"../../operator/skipUntil":148}],83:[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; - -},{"../../Observable":29,"../../operator/skipWhile":149}],84:[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":150}],85:[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; - -},{"../../Observable":29,"../../operator/switchMap":151}],86:[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; - -},{"../../Observable":29,"../../operator/take":152}],87:[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":153}],88:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var takeWhile_1 = require('../../operator/takeWhile'); -Observable_1.Observable.prototype.takeWhile = takeWhile_1.takeWhile; - -},{"../../Observable":29,"../../operator/takeWhile":154}],89:[function(require,module,exports){ -"use strict"; -var Observable_1 = require('../../Observable'); -var timeout_1 = require('../../operator/timeout'); -Observable_1.Observable.prototype.timeout = timeout_1.timeout; - -},{"../../Observable":29,"../../operator/timeout":155}],90:[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":156}],91:[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; - -},{"../../Observable":29,"../../operator/zip":157}],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 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 - */ -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]); + } + else { + errors.push(err); + } + } + } } - subscriber.complete(); } - }; - return ArrayLikeObservable; -}(Observable_1.Observable)); -exports.ArrayLikeObservable = ArrayLikeObservable; - -},{"../Observable":29,"./EmptyObservable":96,"./ScalarObservable":102}],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 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 - */ -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]; + if (hasErrors) { + throw new UnsubscriptionError_1.UnsubscriptionError(errors); } - } - 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. - * - * Emits the arguments you provide, then completes. - * - * - * - * - * 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 Emit 10, 20, 30, then 'a', 'b', 'c', then start ticking every second. - * 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} An Observable that emits each given input value. - * @static true - * @name of - * @owner Observable - */ - 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); + Subscription.prototype.add = function (teardown) { + if (!teardown || (teardown === Subscription.EMPTY)) { + return Subscription.EMPTY; } - else if (len === 1) { - return new ScalarObservable_1.ScalarObservable(array[0], scheduler); + if (teardown === this) { + return this; } - else { - return new EmptyObservable_1.EmptyObservable(scheduler); + 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') { + 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; }; - 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; + Subscription.prototype.remove = function (subscription) { + var subscriptions = this._subscriptions; + if (subscriptions) { + var subscriptionIndex = subscriptions.indexOf(subscription); + if (subscriptionIndex !== -1) { + subscriptions.splice(subscriptionIndex, 1); + } } - 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 - }); + Subscription.prototype._addParent = function (parent) { + var _a = this, _parent = _a._parent, _parents = _a._parents; + if (!_parent || _parent === parent) { + this._parent = parent; } - else { - for (var i = 0; i < count && !subscriber.closed; i++) { - subscriber.next(array[i]); - } - subscriber.complete(); + else if (!_parents) { + this._parents = [parent]; + } + else if (_parents.indexOf(parent) === -1) { + _parents.push(parent); } }; - return ArrayObservable; -}(Observable_1.Observable)); -exports.ArrayObservable = ArrayObservable; + 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); }, []); +} -},{"../Observable":29,"../util/isScheduler":233,"./EmptyObservable":96,"./ScalarObservable":102}],94:[function(require,module,exports){ +},{"./util/UnsubscriptionError":214,"./util/errorObject":216,"./util/isArray":219,"./util/isFunction":222,"./util/isObject":226,"./util/tryCatch":240}],57:[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 __()); +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; + }, }; -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'); -/** - * @class ConnectableObservable - */ + +},{}],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); + } + 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) { - _super.call(this); - this.source = source; - this.subjectFactory = subjectFactory; - this._refCount = 0; - this._isComplete = false; + var _this = _super.call(this) || this; + _this.source = source; + _this.subjectFactory = subjectFactory; + _this._refCount = 0; + _this._isComplete = false; + return _this; } ConnectableObservable.prototype._subscribe = function (subscriber) { return this.getSubject().subscribe(subscriber); @@ -7321,8 +15260,9 @@ exports.connectableObservableDescriptor = { var ConnectableSubscriber = (function (_super) { __extends(ConnectableSubscriber, _super); function ConnectableSubscriber(destination, connectable) { - _super.call(this, destination); - this.connectable = connectable; + var _this = _super.call(this, destination) || this; + _this.connectable = connectable; + return _this; } ConnectableSubscriber.prototype._error = function (err) { this._unsubscribe(); @@ -7367,8 +15307,9 @@ var RefCountOperator = (function () { var RefCountSubscriber = (function (_super) { __extends(RefCountSubscriber, _super); function RefCountSubscriber(destination, connectable) { - _super.call(this, destination); - this.connectable = connectable; + var _this = _super.call(this, destination) || this; + _this.connectable = connectable; + return _this; } RefCountSubscriber.prototype._unsubscribe = function () { var connectable = this.connectable; @@ -7387,29 +15328,6 @@ var RefCountSubscriber = (function (_super) { 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; @@ -7420,1306 +15338,414 @@ var RefCountSubscriber = (function (_super) { return RefCountSubscriber; }(Subscriber_1.Subscriber)); -},{"../Observable":29,"../Subject":34,"../Subscriber":36,"../Subscription":37,"../operators/refCount":189}],95:[function(require,module,exports){ +},{"../Observable":48,"../Subject":53,"../Subscriber":55,"../Subscription":56,"../operators/refCount":150}],59:[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. - * - * Creates the Observable lazily, that is, only when it - * is subscribed. - * - * - * - * - * `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 Subscribe to either an Observable of clicks or an Observable of interval, at random - * 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 - */ - DeferObservable.create = function (observableFactory) { - return new DeferObservable(observableFactory); - }; - DeferObservable.prototype._subscribe = function (subscriber) { - return new DeferSubscriber(subscriber, this.observableFactory); +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 __()); }; - 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); +})(); +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; } - }; - DeferSubscriber.prototype._callFactory = function () { - var result = this.factory(); - if (result) { - this.add(subscribeToResult_1.subscribeToResult(this, result)); + if (!scheduler || typeof scheduler.schedule !== 'function') { + _this.scheduler = asap_1.asap; } - }; - return DeferSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); - -},{"../Observable":29,"../OuterSubscriber":31,"../util/subscribeToResult":237}],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 Observable_1 = require('../Observable'); -/** - * We need this JSDoc comment for affecting ESDoc. - * @extends {Ignored} - * @hide true - */ -var EmptyObservable = (function (_super) { - __extends(EmptyObservable, _super); - function EmptyObservable(scheduler) { - _super.call(this); - this.scheduler = scheduler; + return _this; } - /** - * Creates an Observable that emits no items to the Observer and immediately - * emits a complete notification. - * - * Just emits 'complete', and nothing else. - * - * - * - * - * 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 Emit the number 7, then complete. - * var result = Rx.Observable.empty().startWith(7); - * result.subscribe(x => console.log(x)); - * - * @example Map and flatten only odd numbers to the sequence 'a', 'b', 'c' - * 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); + 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); }; - EmptyObservable.dispatch = function (arg) { - var subscriber = arg.subscriber; - subscriber.complete(); + SubscribeOnObservable.dispatch = function (arg) { + var source = arg.source, subscriber = arg.subscriber; + return this.add(source.subscribe(subscriber)); }; - EmptyObservable.prototype._subscribe = function (subscriber) { + SubscribeOnObservable.prototype._subscribe = function (subscriber) { + var delay = this.delayTime; + var source = this.source; var scheduler = this.scheduler; - if (scheduler) { - return scheduler.schedule(EmptyObservable.dispatch, 0, { subscriber: subscriber }); - } - else { - subscriber.complete(); - } + return scheduler.schedule(SubscribeOnObservable.dispatch, delay, { + source: source, subscriber: subscriber + }); }; - return EmptyObservable; + return SubscribeOnObservable; }(Observable_1.Observable)); -exports.EmptyObservable = EmptyObservable; +exports.SubscribeOnObservable = SubscribeOnObservable; -},{"../Observable":29}],97:[function(require,module,exports){ +},{"../Observable":48,"../scheduler/asap":203,"../util/isNumeric":225}],60:[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. - * - * Just emits 'error', and nothing else. - * - * - * - * - * 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 Emit the number 7, then emit an error. - * var result = Rx.Observable.throw(new Error('oops!')).startWith(7); - * result.subscribe(x => console.log(x), e => console.error(e)); - * - * @example Map and flatten numbers to the sequence 'a', 'b', 'c', but throw an error for 13 - * 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 - */ - 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 - }); +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 { - subscriber.error(error); + 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 ErrorObservable; -}(Observable_1.Observable)); -exports.ErrorObservable = ErrorObservable; - -},{"../Observable":29}],98:[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'; -} -/** - * 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. - * - * Creates an Observable from DOM events, or Node.js - * EventEmitter events or others. - * - * - * - * `fromEvent` accepts as a first argument event target, which is an object with methods - * for registering event handler functions. As a second argument it takes string that indicates - * type of event we want to listen for. `fromEvent` supports selected types of event targets, - * which are described in detail below. If your event target does not match any of the ones listed, - * you should use {@link fromEventPattern}, which can be used on arbitrary APIs. - * When it comes to APIs supported by `fromEvent`, their methods for adding and removing event - * handler functions have different names, but they all accept a string describing event type - * and function itself, which will be called whenever said event happens. - * - * Every time resulting Observable is subscribed, event handler function will be registered - * to event target on given event type. When that event fires, value - * passed as a first argument to registered function will be emitted by output Observable. - * When Observable is unsubscribed, function will be unregistered from event target. - * - * Note that if event target calls registered function with more than one argument, second - * and following arguments will not appear in resulting stream. In order to get access to them, - * you can pass to `fromEvent` optional project function, which will be called with all arguments - * passed to event handler. Output Observable will then emit value returned by project function, - * instead of the usual value. - * - * Remember that event targets listed below are checked via duck typing. It means that - * no matter what kind of object you have and no matter what environment you work in, - * you can safely use `fromEvent` on that object if it exposes described methods (provided - * of course they behave as was described above). So for example if Node.js library exposes - * event target which has the same method names as DOM EventTarget, `fromEvent` is still - * a good choice. - * - * If the API you use is more callback then event handler oriented (subscribed - * callback function fires only once and thus there is no need to manually - * unregister it), you should use {@link bindCallback} or {@link bindNodeCallback} - * instead. - * - * `fromEvent` supports following types of event targets: - * - * **DOM EventTarget** - * - * This is an object with `addEventListener` and `removeEventListener` methods. - * - * In the browser, `addEventListener` accepts - apart from event type string and event - * handler function arguments - optional third parameter, which is either an object or boolean, - * both used for additional configuration how and when passed function will be called. When - * `fromEvent` is used with event target of that type, you can provide this values - * as third parameter as well. - * - * **Node.js EventEmitter** - * - * An object with `addListener` and `removeListener` methods. - * - * **JQuery-style event target** - * - * An object with `on` and `off` methods - * - * **DOM NodeList** - * - * List of DOM Nodes, returned for example by `document.querySelectorAll` or `Node.childNodes`. - * - * Although this collection is not event target in itself, `fromEvent` will iterate over all Nodes - * it contains and install event handler function in every of them. When returned Observable - * is unsubscribed, function will be removed from all Nodes. - * - * **DOM HtmlCollection** - * - * Just as in case of NodeList it is a collection of DOM nodes. Here as well event handler function is - * installed and removed in each of elements. - * - * - * @example Emits clicks happening on the DOM document - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * clicks.subscribe(x => console.log(x)); - * - * // Results in: - * // MouseEvent object logged to console every time a click - * // occurs on the document. - * - * - * @example Use addEventListener with capture option - * var clicksInDocument = Rx.Observable.fromEvent(document, 'click', true); // note optional configuration parameter - * // which will be passed to addEventListener - * var clicksInDiv = Rx.Observable.fromEvent(someDivInDocument, 'click'); - * - * clicksInDocument.subscribe(() => console.log('document')); - * clicksInDiv.subscribe(() => console.log('div')); - * - * // By default events bubble UP in DOM tree, so normally - * // when we would click on div in document - * // "div" would be logged first and then "document". - * // Since we specified optional `capture` option, document - * // will catch event when it goes DOWN DOM tree, so console - * // will log "document" and then "div". - * - * @see {@link bindCallback} - * @see {@link bindNodeCallback} - * @see {@link fromEventPattern} - * - * @param {EventTargetLike} target The DOM EventTarget, Node.js - * EventEmitter, JQuery-like event target, 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} [selector] An optional function to - * post-process results. It takes the arguments from the event handler and - * should return a single value. - * @return {Observable} - * @static true - * @name fromEvent - * @owner Observable - */ - FromEventObservable.create = function (target, eventName, options, selector) { - if (isFunction_1.isFunction(options)) { - selector = options; - options = undefined; + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; } - return new FromEventObservable(target, eventName, selector, options); + 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); + } + }); }; - 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); +} +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])); } - 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); }; + catch (err) { + subject.error(err); } - else if (isNodeStyleEventEmitter(sourceObj)) { - var source_3 = sourceObj; - sourceObj.addListener(eventName, handler); - unsubscribe = function () { return source_3.removeListener(eventName, handler); }; + } + this.add(subject.subscribe(subscriber)); +} +function dispatchNext(state) { + var value = state.value, subject = state.subject; + subject.next(value); + subject.complete(); +} +function dispatchError(state) { + var err = state.err, subject = state.subject; + subject.error(err); +} + +},{"../AsyncSubject":44,"../Observable":48,"../operators/map":128,"../util/canReportError":215,"../util/isArray":219,"../util/isScheduler":229}],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; } else { - throw new TypeError('Invalid event target'); + 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); })); + }; } - 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":224,"../util/isFunction":229,"../util/tryCatch":239}],99:[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('../operators/observeOn'); -var observable_1 = require('../symbol/observable'); -/** - * We need this JSDoc comment for affecting ESDoc. - * @extends {Ignored} - * @hide true - */ -var FromObservable = (function (_super) { - __extends(FromObservable, _super); - function FromObservable(ish, scheduler) { - _super.call(this, null); - this.ish = ish; - this.scheduler = scheduler; } - /** - * Creates an Observable from an Array, an array-like object, a Promise, an - * iterable object, or an Observable-like object. - * - * Converts almost anything to an Observable. - * - * - * - * 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 Converts an array to an Observable - * 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 Convert an infinite iterable (from a generator) to an Observable - * 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} 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} 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 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 new FromObservable(ish, scheduler); + return subject.subscribe(subscriber); } - else if (isArray_1.isArray(ish)) { - return new ArrayObservable_1.ArrayObservable(ish, scheduler); + else { + return scheduler.schedule(dispatch, 0, { params: params, subscriber: subscriber, context: context }); } - else if (isPromise_1.isPromise(ish)) { - return new PromiseObservable_1.PromiseObservable(ish, scheduler); + }); + }; +} +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]; } - else if (typeof ish[iterator_1.iterator] === 'function' || typeof ish === 'string') { - return new IteratorObservable_1.IteratorObservable(ish, scheduler); + var err = innerArgs.shift(); + if (err) { + _this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject })); } - else if (isArrayLike_1.isArrayLike(ish)) { - return new ArrayLikeObservable_1.ArrayLikeObservable(ish, scheduler); + 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])); } - 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)); + catch (err) { + this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject })); } - }; - return FromObservable; -}(Observable_1.Observable)); -exports.FromObservable = FromObservable; + } + 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); +} -},{"../Observable":29,"../operators/observeOn":183,"../symbol/iterator":214,"../symbol/observable":215,"../util/isArray":226,"../util/isArrayLike":227,"../util/isPromise":232,"./ArrayLikeObservable":92,"./ArrayObservable":93,"./IteratorObservable":100,"./PromiseObservable":101}],100:[function(require,module,exports){ +},{"../AsyncSubject":44,"../Observable":48,"../operators/map":128,"../util/canReportError":215,"../util/isArray":219,"../util/isScheduler":229}],62:[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); +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); } - 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 function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - return ArrayIterator; -}()); -function getIterator(obj) { - var i = obj[iterator_1.iterator]; - if (!i && typeof obj === 'string') { - return new StringIterator(obj); - } - if (!i && obj.length !== undefined) { - return new ArrayIterator(obj); - } - if (!i) { - throw new TypeError('object is not iterable'); - } - return obj[iterator_1.iterator](); -} -var maxSafeInteger = Math.pow(2, 53) - 1; -function toLength(o) { - var len = +o.length; - if (isNaN(len)) { - return 0; +})(); +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]; } - if (len === 0 || !numberIsFinite(len)) { - return len; + var resultSelector = null; + var scheduler = null; + if (isScheduler_1.isScheduler(observables[observables.length - 1])) { + scheduler = observables.pop(); } - len = sign(len) * Math.floor(Math.abs(len)); - if (len <= 0) { - return 0; + if (typeof observables[observables.length - 1] === 'function') { + resultSelector = observables.pop(); } - if (len > maxSafeInteger) { - return maxSafeInteger; + if (observables.length === 1 && isArray_1.isArray(observables[0])) { + observables = observables[0]; } - return len; -} -function numberIsFinite(value) { - return typeof value === 'number' && root_1.root.isFinite(value); + return fromArray_1.fromArray(observables, scheduler).lift(new CombineLatestOperator(resultSelector)); } -function sign(value) { - var valueAsNumber = +value; - if (valueAsNumber === 0) { - return valueAsNumber; - } - if (isNaN(valueAsNumber)) { - return valueAsNumber; +exports.combineLatest = combineLatest; +var CombineLatestOperator = (function () { + function CombineLatestOperator(resultSelector) { + this.resultSelector = resultSelector; } - return valueAsNumber < 0 ? -1 : 1; -} - -},{"../Observable":29,"../symbol/iterator":214,"../util/root":236}],101:[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 - */ -var PromiseObservable = (function (_super) { - __extends(PromiseObservable, _super); - function PromiseObservable(promise, scheduler) { - _super.call(this); - this.promise = promise; - this.scheduler = scheduler; + 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; } - /** - * Converts a Promise to an Observable. - * - * Returns an Observable that just emits the Promise's - * resolved value, then completes. - * - * 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 Convert the Promise returned by Fetch to an Observable - * 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} 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} An Observable which wraps the Promise. - * @static true - * @name fromPromise - * @owner Observable - */ - PromiseObservable.create = function (promise, scheduler) { - return new PromiseObservable(promise, scheduler); + CombineLatestSubscriber.prototype._next = function (observable) { + this.values.push(NONE); + this.observables.push(observable); }; - 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; }); - }); - } + CombineLatestSubscriber.prototype._complete = function () { + var observables = this.observables; + var len = observables.length; + if (len === 0) { + this.destination.complete(); } 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; }); - }); + 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)); } } }; - 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); - } -} - -},{"../Observable":29,"../util/root":236}],102:[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; - } - } - 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; + CombineLatestSubscriber.prototype.notifyComplete = function (unused) { + if ((this.active -= 1) === 0) { + this.destination.complete(); } - 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(); + 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()); } } }; - return ScalarObservable; -}(Observable_1.Observable)); -exports.ScalarObservable = ScalarObservable; - -},{"../Observable":29}],103:[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 - */ -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; + CombineLatestSubscriber.prototype._tryResultSelector = function (values) { + var result; + try { + result = this.resultSelector.apply(this, values); } - 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. - * - * Its like {@link interval}, but you can specify when - * should the emissions start. - * - * - * - * `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 Emits ascending numbers, one every second (1000ms), starting after 3 seconds - * var numbers = Rx.Observable.timer(3000, 1000); - * numbers.subscribe(x => console.log(x)); - * - * @example Emits one number after five seconds - * 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) { + catch (err) { + this.destination.error(err); 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 - }); + this.destination.next(result); }; - return TimerObservable; -}(Observable_1.Observable)); -exports.TimerObservable = TimerObservable; - -},{"../Observable":29,"../scheduler/async":212,"../util/isDate":228,"../util/isNumeric":230,"../util/isScheduler":233}],104:[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('../operators/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. - * - * 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. - * - * - * - * `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 Combine two timer Observables - * 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 Combine an array of Observables - * 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 Use project function to dynamically calculate the Body-Mass Index - * 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(); - } - if (typeof observables[observables.length - 1] === 'function') { - project = observables.pop(); - } - // 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]; - } - return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new combineLatest_1.CombineLatestOperator(project)); -} -exports.combineLatest = combineLatest; + return CombineLatestSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); +exports.CombineLatestSubscriber = CombineLatestSubscriber; -},{"../operators/combineLatest":164,"../util/isArray":226,"../util/isScheduler":233,"./ArrayObservable":93}],105:[function(require,module,exports){ +},{"../OuterSubscriber":50,"../util/isArray":219,"../util/isScheduler":229,"../util/subscribeToResult":238,"./fromArray":68}],63:[function(require,module,exports){ "use strict"; -var isScheduler_1 = require('../util/isScheduler'); -var of_1 = require('./of'); -var from_1 = require('./from'); -var concatAll_1 = require('../operators/concatAll'); -/* tslint:enable:max-line-length */ -/** - * Creates an output Observable which sequentially emits all values from given - * Observable and then moves on to the next. - * - * Concatenates multiple Observables together by - * sequentially emitting their values, one Observable after the other. - * - * - * - * `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 Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10 - * 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 Concatenate an array of 3 Observables - * 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 Concatenate the same Observable to repeat it - * 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 - */ +Object.defineProperty(exports, "__esModule", { value: true }); +var isScheduler_1 = require("../util/isScheduler"); +var of_1 = require("./of"); +var from_1 = require("./from"); +var concatAll_1 = require("../operators/concatAll"); function concat() { var observables = []; for (var _i = 0; _i < arguments.length; _i++) { - observables[_i - 0] = arguments[_i]; + observables[_i] = arguments[_i]; } if (observables.length === 1 || (observables.length === 2 && isScheduler_1.isScheduler(observables[1]))) { return from_1.from(observables[0]); @@ -8728,1952 +15754,1224 @@ function concat() { } exports.concat = concat; -},{"../operators/concatAll":166,"../util/isScheduler":233,"./from":108,"./of":112}],106:[function(require,module,exports){ -"use strict"; -var DeferObservable_1 = require('./DeferObservable'); -exports.defer = DeferObservable_1.DeferObservable.create; - -},{"./DeferObservable":95}],107:[function(require,module,exports){ -"use strict"; -var EmptyObservable_1 = require('./EmptyObservable'); -exports.empty = EmptyObservable_1.EmptyObservable.create; - -},{"./EmptyObservable":96}],108:[function(require,module,exports){ -"use strict"; -var FromObservable_1 = require('./FromObservable'); -exports.from = FromObservable_1.FromObservable.create; - -},{"./FromObservable":99}],109:[function(require,module,exports){ -"use strict"; -var FromEventObservable_1 = require('./FromEventObservable'); -exports.fromEvent = FromEventObservable_1.FromEventObservable.create; - -},{"./FromEventObservable":98}],110:[function(require,module,exports){ +},{"../operators/concatAll":100,"../util/isScheduler":229,"./from":67,"./of":79}],64:[function(require,module,exports){ "use strict"; -var PromiseObservable_1 = require('./PromiseObservable'); -exports.fromPromise = PromiseObservable_1.PromiseObservable.create; - -},{"./PromiseObservable":101}],111:[function(require,module,exports){ -"use strict"; -var merge_1 = require('../operator/merge'); -exports.merge = merge_1.mergeStatic; - -},{"../operator/merge":135}],112:[function(require,module,exports){ -"use strict"; -var ArrayObservable_1 = require('./ArrayObservable'); -exports.of = ArrayObservable_1.ArrayObservable.of; - -},{"./ArrayObservable":93}],113:[function(require,module,exports){ -"use strict"; -var ErrorObservable_1 = require('./ErrorObservable'); -exports._throw = ErrorObservable_1.ErrorObservable.create; - -},{"./ErrorObservable":97}],114:[function(require,module,exports){ -"use strict"; -var TimerObservable_1 = require('./TimerObservable'); -exports.timer = TimerObservable_1.TimerObservable.create; - -},{"./TimerObservable":103}],115:[function(require,module,exports){ -"use strict"; -var zip_1 = require('../operators/zip'); -exports.zip = zip_1.zipStatic; - -},{"../operators/zip":206}],116:[function(require,module,exports){ -"use strict"; -var async_1 = require('../scheduler/async'); -var auditTime_1 = require('../operators/auditTime'); -/** - * Ignores source values for `duration` milliseconds, then emits the most recent - * value from the source Observable, then repeats this process. - * - * When it sees a source values, it ignores that plus - * the next ones for `duration` milliseconds, and then it emits the most recent - * value from the source. - * - * - * - * `auditTime` is similar to `throttleTime`, but emits the last value from the - * silenced time window, instead of the first value. `auditTime` emits the most - * recent value from the source Observable on the output Observable as soon as - * its internal timer becomes disabled, and ignores source values while the - * timer is enabled. Initially, the timer is disabled. As soon as the first - * source value arrives, the timer is enabled. After `duration` milliseconds (or - * the time unit determined internally by the optional `scheduler`) has passed, - * the timer is disabled, then the most recent source value is emitted on the - * output Observable, and this process repeats for the next source value. - * Optionally takes a {@link IScheduler} for managing timers. - * - * @example Emit clicks at a rate of at most one click per second - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var result = clicks.auditTime(1000); - * result.subscribe(x => console.log(x)); - * - * @see {@link audit} - * @see {@link debounceTime} - * @see {@link delay} - * @see {@link sampleTime} - * @see {@link throttleTime} - * - * @param {number} duration Time to wait before emitting the most recent source - * 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 rate-limiting behavior. - * @return {Observable} An Observable that performs rate-limiting of - * emissions from the source Observable. - * @method auditTime - * @owner Observable - */ -function auditTime(duration, scheduler) { - if (scheduler === void 0) { scheduler = async_1.async; } - return auditTime_1.auditTime(duration, scheduler)(this); +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.auditTime = auditTime; +exports.defer = defer; -},{"../operators/auditTime":159,"../scheduler/async":212}],117:[function(require,module,exports){ +},{"../Observable":48,"./empty":65,"./from":67}],65:[function(require,module,exports){ "use strict"; -var buffer_1 = require('../operators/buffer'); -/** - * Buffers the source Observable values until `closingNotifier` emits. - * - * Collects values from the past as an array, and emits - * that array only when another Observable emits. - * - * - * - * 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 On every click, emit array of most recent interval events - * 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} closingNotifier An Observable that signals the - * buffer to be emitted on the output Observable. - * @return {Observable} An Observable of buffers, which are arrays of - * values. - * @method buffer - * @owner Observable - */ -function buffer(closingNotifier) { - return buffer_1.buffer(closingNotifier)(this); +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; } -exports.buffer = buffer; - -},{"../operators/buffer":160}],118:[function(require,module,exports){ -"use strict"; -var bufferCount_1 = require('../operators/bufferCount'); -/** - * Buffers the source Observable values until the size hits the maximum - * `bufferSize` given. - * - * Collects values from the past as an array, and emits - * that array only when its size reaches `bufferSize`. - * - * - * - * 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 Emit the last two click events as an array - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var buffered = clicks.bufferCount(2); - * buffered.subscribe(x => console.log(x)); - * - * @example On every click, emit the last two click events as an array - * 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} An Observable of arrays of buffered values. - * @method bufferCount - * @owner Observable - */ -function bufferCount(bufferSize, startBufferEvery) { - if (startBufferEvery === void 0) { startBufferEvery = null; } - return bufferCount_1.bufferCount(bufferSize, startBufferEvery)(this); +exports.empty = empty; +function emptyScheduled(scheduler) { + return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); }); } -exports.bufferCount = bufferCount; +exports.emptyScheduled = emptyScheduled; -},{"../operators/bufferCount":161}],119:[function(require,module,exports){ +},{"../Observable":48}],66:[function(require,module,exports){ "use strict"; -var bufferWhen_1 = require('../operators/bufferWhen'); -/** - * Buffers the source Observable values, using a factory function of closing - * Observables to determine when to close, emit, and reset the buffer. - * - * 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. - * - * - * - * 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 Emit an array of the last clicks every [1-5] random seconds - * 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} An observable of arrays of buffered values. - * @method bufferWhen - * @owner Observable - */ -function bufferWhen(closingSelector) { - return bufferWhen_1.bufferWhen(closingSelector)(this); +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("../Observable"); +var isArray_1 = require("../util/isArray"); +var empty_1 = require("./empty"); +var subscribeToResult_1 = require("../util/subscribeToResult"); +var OuterSubscriber_1 = require("../OuterSubscriber"); +var map_1 = require("../operators/map"); +function forkJoin() { + var sources = []; + for (var _i = 0; _i < arguments.length; _i++) { + sources[_i] = arguments[_i]; + } + var resultSelector; + if (typeof sources[sources.length - 1] === 'function') { + resultSelector = sources.pop(); + } + if (sources.length === 1 && isArray_1.isArray(sources[0])) { + sources = sources[0]; + } + if (sources.length === 0) { + return empty_1.EMPTY; + } + if (resultSelector) { + return forkJoin(sources).pipe(map_1.map(function (args) { return resultSelector.apply(void 0, args); })); + } + return new Observable_1.Observable(function (subscriber) { + return new ForkJoinSubscriber(subscriber, sources); + }); } -exports.bufferWhen = bufferWhen; +exports.forkJoin = forkJoin; +var ForkJoinSubscriber = (function (_super) { + __extends(ForkJoinSubscriber, _super); + function ForkJoinSubscriber(destination, sources) { + var _this = _super.call(this, destination) || this; + _this.sources = sources; + _this.completed = 0; + _this.haveValues = 0; + var len = sources.length; + _this.values = new Array(len); + for (var i = 0; i < len; i++) { + var source = sources[i]; + var innerSubscription = subscribeToResult_1.subscribeToResult(_this, source, null, i); + if (innerSubscription) { + _this.add(innerSubscription); + } + } + return _this; + } + ForkJoinSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.values[outerIndex] = innerValue; + if (!innerSub._hasValue) { + innerSub._hasValue = true; + this.haveValues++; + } + }; + ForkJoinSubscriber.prototype.notifyComplete = function (innerSub) { + var _a = this, destination = _a.destination, haveValues = _a.haveValues, values = _a.values; + var len = values.length; + if (!innerSub._hasValue) { + destination.complete(); + return; + } + this.completed++; + if (this.completed !== len) { + return; + } + if (haveValues === len) { + destination.next(values); + } + destination.complete(); + }; + return ForkJoinSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); -},{"../operators/bufferWhen":162}],120:[function(require,module,exports){ +},{"../Observable":48,"../OuterSubscriber":50,"../operators/map":128,"../util/isArray":219,"../util/subscribeToResult":238,"./empty":65}],67:[function(require,module,exports){ "use strict"; -var catchError_1 = require('../operators/catchError'); -/** - * Catches errors on the observable to be handled by returning a new observable or throwing an error. - * - * - * - * @example Continues with a different Observable when there's an error - * - * 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 Retries the caught source Observable again in case of error, similar to retry() operator - * - * 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 Throws a new error when the source Observable throws an error - * - * 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) { - return catchError_1.catchError(selector)(this); +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("../Observable"); +var isPromise_1 = require("../util/isPromise"); +var isArrayLike_1 = require("../util/isArrayLike"); +var isInteropObservable_1 = require("../util/isInteropObservable"); +var isIterable_1 = require("../util/isIterable"); +var fromArray_1 = require("./fromArray"); +var fromPromise_1 = require("./fromPromise"); +var fromIterable_1 = require("./fromIterable"); +var fromObservable_1 = require("./fromObservable"); +var subscribeTo_1 = require("../util/subscribeTo"); +function from(input, scheduler) { + if (!scheduler) { + if (input instanceof Observable_1.Observable) { + return input; + } + return new Observable_1.Observable(subscribeTo_1.subscribeTo(input)); + } + if (input != null) { + if (isInteropObservable_1.isInteropObservable(input)) { + return fromObservable_1.fromObservable(input, scheduler); + } + else if (isPromise_1.isPromise(input)) { + return fromPromise_1.fromPromise(input, scheduler); + } + else if (isArrayLike_1.isArrayLike(input)) { + return fromArray_1.fromArray(input, scheduler); + } + else if (isIterable_1.isIterable(input) || typeof input === 'string') { + return fromIterable_1.fromIterable(input, scheduler); + } + } + throw new TypeError((input !== null && typeof input || input) + ' is not observable'); } -exports._catch = _catch; +exports.from = from; -},{"../operators/catchError":163}],121:[function(require,module,exports){ +},{"../Observable":48,"../util/isArrayLike":220,"../util/isInteropObservable":223,"../util/isIterable":224,"../util/isPromise":228,"../util/subscribeTo":233,"./fromArray":68,"./fromIterable":71,"./fromObservable":72,"./fromPromise":73}],68:[function(require,module,exports){ "use strict"; -var combineLatest_1 = require('../operators/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. - * - * 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. - * - * - * - * `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 Dynamically calculate the Body-Mass Index from an Observable of weight and one for height - * 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]; +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("../Observable"); +var Subscription_1 = require("../Subscription"); +var subscribeToArray_1 = require("../util/subscribeToArray"); +function fromArray(input, scheduler) { + if (!scheduler) { + return new Observable_1.Observable(subscribeToArray_1.subscribeToArray(input)); + } + else { + 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; + }); } - return combineLatest_1.combineLatest.apply(void 0, observables)(this); } -exports.combineLatest = combineLatest; +exports.fromArray = fromArray; -},{"../operators/combineLatest":164}],122:[function(require,module,exports){ +},{"../Observable":48,"../Subscription":56,"../util/subscribeToArray":234}],69:[function(require,module,exports){ "use strict"; -var concat_1 = require('../operators/concat'); -/* tslint:enable:max-line-length */ -/** - * Creates an output Observable which sequentially emits all values from every - * given input Observable after the current Observable. - * - * Concatenates multiple Observables together by - * sequentially emitting their values, one Observable after the other. - * - * - * - * 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 Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10 - * 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 Concatenate 3 Observables - * 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]; +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 = 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 concat_1.concat.apply(void 0, observables)(this); + return new Observable_1.Observable(function (subscriber) { + function handler(e) { + if (arguments.length > 1) { + subscriber.next(Array.prototype.slice.call(arguments)); + } + else { + subscriber.next(e); + } + } + setupSubscription(target, eventName, handler, subscriber, options); + }); } -exports.concat = concat; - -},{"../operators/concat":165}],123:[function(require,module,exports){ -"use strict"; -var count_1 = require('../operators/count'); -/** - * Counts the number of emissions on the source and emits that number when the - * source completes. - * - * Tells how many values were emitted, when the source - * completes. - * - * - * - * `count` transforms an Observable that emits values into an Observable that - * emits a single value that represents the number of values emitted by the - * source Observable. If the source Observable terminates with an error, `count` - * will pass this error notification along without emitting a value first. If - * the source Observable does not terminate at all, `count` will neither emit - * a value nor terminate. This operator takes an optional `predicate` function - * as argument, in which case the output emission will represent the number of - * source values that matched `true` with the `predicate`. - * - * @example Counts how many seconds have passed before the first click happened - * var seconds = Rx.Observable.interval(1000); - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var secondsBeforeClick = seconds.takeUntil(clicks); - * var result = secondsBeforeClick.count(); - * result.subscribe(x => console.log(x)); - * - * @example Counts how many odd numbers are there between 1 and 7 - * var numbers = Rx.Observable.range(1, 7); - * var result = numbers.count(i => i % 2 === 1); - * result.subscribe(x => console.log(x)); - * - * // Results in: - * // 4 - * - * @see {@link max} - * @see {@link min} - * @see {@link reduce} - * - * @param {function(value: T, i: number, source: Observable): boolean} [predicate] A - * boolean function to select what values are to be counted. It is provided with - * arguments of: - * - `value`: the value from the source Observable. - * - `index`: the (zero-based) "index" of the value from the source Observable. - * - `source`: the source Observable instance itself. - * @return {Observable} An Observable of one number that represents the count as - * described above. - * @method count - * @owner Observable - */ -function count(predicate) { - return count_1.count(predicate)(this); +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); + } + } + else { + throw new TypeError('Invalid event target'); + } + subscriber.add(unsubscribe); } -exports.count = count; - -},{"../operators/count":167}],124:[function(require,module,exports){ -"use strict"; -var async_1 = require('../scheduler/async'); -var debounceTime_1 = require('../operators/debounceTime'); -/** - * Emits a value from the source Observable only after a particular time span - * has passed without another source emission. - * - * It's like {@link delay}, but passes only the most - * recent value from each burst of emissions. - * - * - * - * `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 Emit the most recent click after a burst of clicks - * 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 debounceTime_1.debounceTime(dueTime, scheduler)(this); +function isNodeStyleEventEmitter(sourceObj) { + return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function'; } -exports.debounceTime = debounceTime; - -},{"../operators/debounceTime":168,"../scheduler/async":212}],125:[function(require,module,exports){ -"use strict"; -var async_1 = require('../scheduler/async'); -var delay_1 = require('../operators/delay'); -/** - * Delays the emission of items from the source Observable by a given timeout or - * until a given Date. - * - * Time shifts each item by some specified amount of - * milliseconds. - * - * - * - * 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 Delay each click by one second - * 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 Delay all clicks until a future date happens - * 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 - */ -function delay(delay, scheduler) { - if (scheduler === void 0) { scheduler = async_1.async; } - return delay_1.delay(delay, scheduler)(this); +function isJQueryStyleEventEmitter(sourceObj) { + return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function'; } -exports.delay = delay; - -},{"../operators/delay":170,"../scheduler/async":212}],126:[function(require,module,exports){ -"use strict"; -var distinct_1 = require('../operators/distinct'); -/** - * 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 A simple example with numbers - * 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 An example using a keySelector function - * interface Person { - * age: number, - * name: string - * } - * - * Observable.of( - * { 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 distinct_1.distinct(keySelector, flushes)(this); +function isEventTarget(sourceObj) { + return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function'; } -exports.distinct = distinct; -},{"../operators/distinct":171}],127:[function(require,module,exports){ +},{"../Observable":48,"../operators/map":128,"../util/isArray":219,"../util/isFunction":222}],70:[function(require,module,exports){ "use strict"; -var distinctUntilChanged_1 = require('../operators/distinctUntilChanged'); -/* 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 A simple example with numbers - * 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 An example using a compare function - * interface Person { - * age: number, - * name: string - * } - * - * Observable.of( - * { 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 distinctUntilChanged_1.distinctUntilChanged(compare, keySelector)(this); +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.distinctUntilChanged = distinctUntilChanged; +exports.fromEventPattern = fromEventPattern; -},{"../operators/distinctUntilChanged":172}],128:[function(require,module,exports){ +},{"../Observable":48,"../operators/map":128,"../util/isArray":219,"../util/isFunction":222}],71:[function(require,module,exports){ "use strict"; -var tap_1 = require('../operators/tap'); -/* 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. - * - * 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. - * - * - * - * 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 Map every click to the clientX position of that click, while also logging the click event - * 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 tap_1.tap(nextOrObserver, error, complete)(this); +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("../Observable"); +var Subscription_1 = require("../Subscription"); +var iterator_1 = require("../symbol/iterator"); +var subscribeToIterable_1 = require("../util/subscribeToIterable"); +function fromIterable(input, scheduler) { + if (!input) { + throw new Error('Iterable cannot be null'); + } + if (!scheduler) { + return new Observable_1.Observable(subscribeToIterable_1.subscribeToIterable(input)); + } + else { + 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._do = _do; +exports.fromIterable = fromIterable; -},{"../operators/tap":203}],129:[function(require,module,exports){ +},{"../Observable":48,"../Subscription":56,"../symbol/iterator":206,"../util/subscribeToIterable":235}],72:[function(require,module,exports){ "use strict"; -var expand_1 = require('../operators/expand'); -/* tslint:enable:max-line-length */ -/** - * Recursively projects each source value to an Observable which is merged in - * the output Observable. - * - * It's similar to {@link mergeMap}, but applies the - * projection function to every source value as well as every output value. - * It's recursive. - * - * - * - * 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 Start emitting the powers of two on every click, at most 10 of them - * 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 expand_1.expand(project, concurrent, scheduler)(this); +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("../Observable"); +var Subscription_1 = require("../Subscription"); +var observable_1 = require("../symbol/observable"); +var subscribeToObservable_1 = require("../util/subscribeToObservable"); +function fromObservable(input, scheduler) { + if (!scheduler) { + return new Observable_1.Observable(subscribeToObservable_1.subscribeToObservable(input)); + } + else { + 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.expand = expand; +exports.fromObservable = fromObservable; -},{"../operators/expand":173}],130:[function(require,module,exports){ +},{"../Observable":48,"../Subscription":56,"../symbol/observable":207,"../util/subscribeToObservable":236}],73:[function(require,module,exports){ "use strict"; -var filter_1 = require('../operators/filter'); -/* tslint:enable:max-line-length */ -/** - * Filter items emitted by the source Observable by only emitting those that - * satisfy a specified predicate. - * - * 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. - * - * - * - * 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 Emit only click events whose target was a DIV element - * 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 filter_1.filter(predicate, thisArg)(this); +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("../Observable"); +var Subscription_1 = require("../Subscription"); +var subscribeToPromise_1 = require("../util/subscribeToPromise"); +function fromPromise(input, scheduler) { + if (!scheduler) { + return new Observable_1.Observable(subscribeToPromise_1.subscribeToPromise(input)); + } + else { + 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.filter = filter; +exports.fromPromise = fromPromise; -},{"../operators/filter":174}],131:[function(require,module,exports){ +},{"../Observable":48,"../Subscription":56,"../util/subscribeToPromise":237}],74:[function(require,module,exports){ "use strict"; -var finalize_1 = require('../operators/finalize'); -/** - * 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 finalize_1.finalize(callback)(this); +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; + } + } + 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._finally = _finally; - -},{"../operators/finalize":175}],132:[function(require,module,exports){ -"use strict"; -var first_1 = require('../operators/first'); -/** - * Emits only the first value (or the first value that meets some condition) - * emitted by the source Observable. - * - * Emits only the first value. Or emits only the first - * value that passes some test. - * - * - * - * 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 Emit only the first click that happens on the DOM - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var result = clicks.first(); - * result.subscribe(x => console.log(x)); - * - * @example Emits the first click that happens on a DIV - * 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): 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} An Observable of the first item that matches the - * condition. - * @method first - * @owner Observable - */ -function first(predicate, resultSelector, defaultValue) { - return first_1.first(predicate, resultSelector, defaultValue)(this); +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; + } + } + 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; + } + } + 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); } -exports.first = first; -},{"../operators/first":176}],133:[function(require,module,exports){ +},{"../Observable":48,"../util/identity":218,"../util/isScheduler":229}],75:[function(require,module,exports){ "use strict"; -var last_1 = require('../operators/last'); -/* 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. - * - * - * - * @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 last_1.last(predicate, resultSelector, defaultValue)(this); +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.last = last; +exports.iif = iif; -},{"../operators/last":177}],134:[function(require,module,exports){ +},{"./defer":64,"./empty":65}],76:[function(require,module,exports){ "use strict"; -var map_1 = require('../operators/map'); -/** - * Applies a given `project` function to each value emitted by the source - * Observable, and emits the resulting values as an Observable. - * - * 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. - * - * - * - * 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 Map every click to the clientX position of that click - * 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} An Observable that emits the values from the source - * Observable transformed by the given `project` function. - * @method map - * @owner Observable - */ -function map(project, thisArg) { - return map_1.map(project, thisArg)(this); +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); } -exports.map = map; -},{"../operators/map":178}],135:[function(require,module,exports){ +},{"../Observable":48,"../scheduler/async":204,"../util/isNumeric":225}],77:[function(require,module,exports){ "use strict"; -var merge_1 = require('../operators/merge'); -var merge_2 = require('../operators/merge'); -exports.mergeStatic = merge_2.mergeStatic; -/* tslint:enable:max-line-length */ -/** - * Creates an output Observable which concurrently emits all values from every - * given input Observable. - * - * Flattens multiple Observables together by blending - * their values into one Observable. - * - * - * - * `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 Merge together two Observables: 1s interval and clicks - * 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 Merge together 3 Observables, but only 2 run concurrently - * 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 - */ +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 - 0] = arguments[_i]; + observables[_i] = arguments[_i]; + } + 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 (typeof last === 'number') { + concurrent = observables.pop(); + } + if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) { + return observables[0]; } - return merge_1.merge.apply(void 0, observables)(this); + return mergeAll_1.mergeAll(concurrent)(fromArray_1.fromArray(observables, scheduler)); } exports.merge = merge; -},{"../operators/merge":179}],136:[function(require,module,exports){ +},{"../Observable":48,"../operators/mergeAll":133,"../util/isScheduler":229,"./fromArray":68}],78:[function(require,module,exports){ "use strict"; -var mergeAll_1 = require('../operators/mergeAll'); -/** - * Converts a higher-order Observable into a first-order Observable which - * concurrently delivers all values that are emitted on the inner Observables. - * - * Flattens an Observable-of-Observables. - * - * - * - * `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 Spawn a new interval Observable for each click event, and blend their outputs as one Observable - * 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 Count from 0 to 9 every second for each click, but only allow 2 concurrent timers - * 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 mergeAll_1.mergeAll(concurrent)(this); -} -exports.mergeAll = mergeAll; - -},{"../operators/mergeAll":180}],137:[function(require,module,exports){ -"use strict"; -var mergeMap_1 = require('../operators/mergeMap'); -/* tslint:enable:max-line-length */ -/** - * Projects each source value to an Observable which is merged in the output - * Observable. - * - * Maps each value to an Observable, then flattens all of - * these inner Observables using {@link mergeAll}. - * - * - * - * 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 Map and flatten each letter to an Observable ticking every 1 second - * 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 - */ -function mergeMap(project, resultSelector, concurrent) { - if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; } - return mergeMap_1.mergeMap(project, resultSelector, concurrent)(this); -} -exports.mergeMap = mergeMap; - -},{"../operators/mergeMap":181}],138:[function(require,module,exports){ -"use strict"; -var pairwise_1 = require('../operators/pairwise'); -/** - * Groups pairs of consecutive emissions together and emits them as an array of - * two values. - * - * Puts the current value and previous value together as - * an array, and emits that. - * - * - * - * 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 On every click (starting from the second), emit the relative distance to the previous click - * 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>} An Observable of pairs (as arrays) of - * consecutive values from the source Observable. - * @method pairwise - * @owner Observable - */ -function pairwise() { - return pairwise_1.pairwise()(this); +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.pairwise = pairwise; +exports.never = never; -},{"../operators/pairwise":184}],139:[function(require,module,exports){ +},{"../Observable":48,"../util/noop":230}],79:[function(require,module,exports){ "use strict"; -var pluck_1 = require('../operators/pluck'); -/** - * Maps each source value (an object) to its specified nested property. - * - * Like {@link map}, but meant only for picking one of - * the nested properties of every emitted object. - * - * - * - * 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 Map every click to the tagName of the clicked target element - * 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 - */ -function pluck() { - var properties = []; +Object.defineProperty(exports, "__esModule", { value: true }); +var isScheduler_1 = require("../util/isScheduler"); +var fromArray_1 = require("./fromArray"); +var empty_1 = require("./empty"); +var scalar_1 = require("./scalar"); +function of() { + var args = []; for (var _i = 0; _i < arguments.length; _i++) { - properties[_i - 0] = arguments[_i]; + args[_i] = arguments[_i]; } - return pluck_1.pluck.apply(void 0, properties)(this); -} -exports.pluck = pluck; - -},{"../operators/pluck":185}],140:[function(require,module,exports){ -"use strict"; -var publish_1 = require('../operators/publish'); -/* 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. - * - * - * - * @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 - */ -function publish(selector) { - return publish_1.publish(selector)(this); -} -exports.publish = publish; - -},{"../operators/publish":186}],141:[function(require,module,exports){ -"use strict"; -var publishReplay_1 = require('../operators/publishReplay'); -/* tslint:enable:max-line-length */ -/** - * @param bufferSize - * @param windowTime - * @param selectorOrScheduler - * @param scheduler - * @return {Observable | ConnectableObservable} - * @method publishReplay - * @owner Observable - */ -function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) { - return publishReplay_1.publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler)(this); -} -exports.publishReplay = publishReplay; - -},{"../operators/publishReplay":187}],142:[function(require,module,exports){ -"use strict"; -var reduce_1 = require('../operators/reduce'); -/* tslint:enable:max-line-length */ -/** - * Applies an accumulator function over the source Observable, and returns the - * accumulated result when the source completes, given an optional seed value. - * - * 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. - * - * - * - * Like - * [Array.prototype.reduce()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce), - * `reduce` applies an `accumulator` function against an accumulation and each - * value of the source Observable (from the past) to reduce it to a single - * value, emitted on the output Observable. Note that `reduce` will only emit - * one value, only when the source Observable completes. It is equivalent to - * applying operator {@link scan} followed by operator {@link last}. - * - * 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 Count the number of click events that happened in 5 seconds - * var clicksInFiveSeconds = Rx.Observable.fromEvent(document, 'click') - * .takeUntil(Rx.Observable.interval(5000)); - * var ones = clicksInFiveSeconds.mapTo(1); - * var seed = 0; - * var count = ones.reduce((acc, one) => acc + one, seed); - * count.subscribe(x => console.log(x)); - * - * @see {@link count} - * @see {@link expand} - * @see {@link mergeScan} - * @see {@link scan} - * - * @param {function(acc: R, value: T, index: number): R} accumulator The accumulator function - * called on each source value. - * @param {R} [seed] The initial accumulation value. - * @return {Observable} An Observable that emits a single value that is the - * result of accumulating the values emitted by the source Observable. - * @method reduce - * @owner Observable - */ -function reduce(accumulator, seed) { - // 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) { - return reduce_1.reduce(accumulator, seed)(this); + var scheduler = args[args.length - 1]; + if (isScheduler_1.isScheduler(scheduler)) { + args.pop(); } - return reduce_1.reduce(accumulator)(this); -} -exports.reduce = reduce; - -},{"../operators/reduce":188}],143:[function(require,module,exports){ -"use strict"; -var retry_1 = require('../operators/retry'); -/** - * Returns an Observable that mirrors the source Observable with the exception of an `error`. If the source Observable - * calls `error`, this method will resubscribe to the source Observable for a maximum of `count` resubscriptions (given - * as a number parameter) rather than propagating the `error` call. - * - * - * - * Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted - * during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second - * time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications - * would be: [1, 2, 1, 2, 3, 4, 5, `complete`]. - * @param {number} count - Number of retry attempts before failing. - * @return {Observable} The source Observable modified with the retry logic. - * @method retry - * @owner Observable - */ -function retry(count) { - if (count === void 0) { count = -1; } - return retry_1.retry(count)(this); -} -exports.retry = retry; - -},{"../operators/retry":190}],144:[function(require,module,exports){ -"use strict"; -var sample_1 = require('../operators/sample'); -/** - * Emits the most recently emitted value from the source Observable whenever - * another Observable, the `notifier`, emits. - * - * It's like {@link sampleTime}, but samples whenever - * the `notifier` Observable emits something. - * - * - * - * Whenever the `notifier` Observable emits a value or completes, `sample` - * looks at the source Observable and emits whichever value it has most recently - * emitted since the previous sampling, unless the source has not emitted - * anything since the previous sampling. The `notifier` is subscribed to as soon - * as the output Observable is subscribed. - * - * @example On every click, sample the most recent "seconds" timer - * var seconds = Rx.Observable.interval(1000); - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var result = seconds.sample(clicks); - * result.subscribe(x => console.log(x)); - * - * @see {@link audit} - * @see {@link debounce} - * @see {@link sampleTime} - * @see {@link throttle} - * - * @param {Observable} notifier The Observable to use for sampling the - * source Observable. - * @return {Observable} An Observable that emits the results of sampling the - * values emitted by the source Observable whenever the notifier Observable - * emits value or completes. - * @method sample - * @owner Observable - */ -function sample(notifier) { - return sample_1.sample(notifier)(this); -} -exports.sample = sample; - -},{"../operators/sample":191}],145:[function(require,module,exports){ -"use strict"; -var scan_1 = require('../operators/scan'); -/* tslint:enable:max-line-length */ -/** - * Applies an accumulator function over the source Observable, and returns each - * intermediate result, with an optional seed value. - * - * It's like {@link reduce}, but emits the current - * accumulation whenever the source emits a value. - * - * - * - * 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 Count the number of click events - * 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} An observable of the accumulated values. - * @method scan - * @owner Observable - */ -function scan(accumulator, seed) { - if (arguments.length >= 2) { - return scan_1.scan(accumulator, seed)(this); + else { + scheduler = undefined; + } + switch (args.length) { + case 0: + return empty_1.empty(scheduler); + case 1: + return scheduler ? fromArray_1.fromArray(args, scheduler) : scalar_1.scalar(args[0]); + default: + return fromArray_1.fromArray(args, scheduler); } - return scan_1.scan(accumulator)(this); -} -exports.scan = scan; - -},{"../operators/scan":192}],146:[function(require,module,exports){ -"use strict"; -var share_1 = require('../operators/share'); -/** - * 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 behaves similarly to .publish().refCount(), with a behavior difference when the source observable emits complete. - * .publish().refCount() will not resubscribe to the original source, however .share() will resubscribe to the original source. - * Observable.of("test").publish().refCount() will not re-emit "test" on new subscriptions, Observable.of("test").share() will - * re-emit "test" to new subscriptions. - * - * - * - * @return {Observable} An Observable that upon connection causes the source Observable to emit items to its Observers. - * @method share - * @owner Observable - */ -function share() { - return share_1.share()(this); -} -exports.share = share; -; - -},{"../operators/share":193}],147:[function(require,module,exports){ -"use strict"; -var skip_1 = require('../operators/skip'); -/** - * Returns an Observable that skips the first `count` items emitted by the source Observable. - * - * - * - * @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 - */ -function skip(count) { - return skip_1.skip(count)(this); -} -exports.skip = skip; - -},{"../operators/skip":194}],148:[function(require,module,exports){ -"use strict"; -var skipUntil_1 = require('../operators/skipUntil'); -/** - * Returns an Observable that skips items emitted by the source Observable until a second Observable emits an item. - * - * - * - * @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} 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 - */ -function skipUntil(notifier) { - return skipUntil_1.skipUntil(notifier)(this); } -exports.skipUntil = skipUntil; +exports.of = of; -},{"../operators/skipUntil":195}],149:[function(require,module,exports){ +},{"../util/isScheduler":229,"./empty":65,"./fromArray":68,"./scalar":84}],80:[function(require,module,exports){ "use strict"; -var skipWhile_1 = require('../operators/skipWhile'); -/** - * 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. - * - * - * - * @param {Function} predicate - A function to test each item emitted from the source Observable. - * @return {Observable} An Observable that begins emitting items emitted by the source Observable when the - * specified predicate becomes false. - * @method skipWhile - * @owner Observable - */ -function skipWhile(predicate) { - return skipWhile_1.skipWhile(predicate)(this); +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.skipWhile = skipWhile; +exports.onErrorResumeNext = onErrorResumeNext; -},{"../operators/skipWhile":196}],150:[function(require,module,exports){ +},{"../Observable":48,"../util/isArray":219,"./empty":65,"./from":67}],81:[function(require,module,exports){ "use strict"; -var startWith_1 = require('../operators/startWith'); -/* 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. - * - * - * - * @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 - */ -function startWith() { - var array = []; - for (var _i = 0; _i < arguments.length; _i++) { - array[_i - 0] = arguments[_i]; +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]]); + } + } + subscriber.complete(); + }); + } + 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; + }); } - return startWith_1.startWith.apply(void 0, array)(this); } -exports.startWith = startWith; +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; -},{"../operators/startWith":197}],151:[function(require,module,exports){ +},{"../Observable":48,"../Subscription":56}],82:[function(require,module,exports){ "use strict"; -var switchMap_1 = require('../operators/switchMap'); -/* 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. - * - * Maps each value to an Observable, then flattens all of - * these inner Observables using {@link switch}. - * - * - * - * 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 Rerun an interval Observable on every click event - * 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 - */ -function switchMap(project, resultSelector) { - return switchMap_1.switchMap(project, resultSelector)(this); +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]; + } + else { + return observables[0]; + } + } + return fromArray_1.fromArray(observables, undefined).lift(new RaceOperator()); } -exports.switchMap = switchMap; +exports.race = race; +var RaceOperator = (function () { + function RaceOperator() { + } + 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; + } + 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(); + } + 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; + } + }; + 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); + } + } + this.subscriptions = null; + } + this.destination.next(innerValue); + }; + return RaceSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); +exports.RaceSubscriber = RaceSubscriber; -},{"../operators/switchMap":198}],152:[function(require,module,exports){ +},{"../OuterSubscriber":50,"../util/isArray":219,"../util/subscribeToResult":238,"./fromArray":68}],83:[function(require,module,exports){ "use strict"; -var take_1 = require('../operators/take'); -/** - * Emits only the first `count` values emitted by the source Observable. - * - * Takes the first `count` values from the source, then - * completes. - * - * - * - * `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 Take the first 5 seconds of an infinite 1-second interval Observable - * 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} 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 - */ -function take(count) { - return take_1.take(count)(this); +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("../Observable"); +function range(start, count, scheduler) { + if (start === void 0) { start = 0; } + if (count === void 0) { count = 0; } + return new Observable_1.Observable(function (subscriber) { + var index = 0; + var current = start; + if (scheduler) { + return scheduler.schedule(dispatch, 0, { + index: index, count: count, start: start, subscriber: subscriber + }); + } + else { + do { + if (index++ >= count) { + subscriber.complete(); + break; + } + subscriber.next(current++); + if (subscriber.closed) { + break; + } + } while (true); + } + return undefined; + }); } -exports.take = take; +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; + } + subscriber.next(start); + if (subscriber.closed) { + return; + } + state.index = index + 1; + state.start = start + 1; + this.schedule(state); +} +exports.dispatch = dispatch; -},{"../operators/take":199}],153:[function(require,module,exports){ +},{"../Observable":48}],84:[function(require,module,exports){ "use strict"; -var takeUntil_1 = require('../operators/takeUntil'); -/** - * Emits the values emitted by the source Observable until a `notifier` - * Observable emits a value. - * - * Lets values pass until a second Observable, - * `notifier`, emits something. Then, it completes. - * - * - * - * `takeUntil` subscribes and begins mirroring the source Observable. It also - * monitors a second Observable, `notifier` that you provide. If the `notifier` - * emits a value, the output Observable stops mirroring the source Observable - * and completes. - * - * @example Tick every second until the first click happens - * 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} An Observable that emits the values from the source - * Observable until such time as `notifier` emits its first value. - * @method takeUntil - * @owner Observable - */ -function takeUntil(notifier) { - return takeUntil_1.takeUntil(notifier)(this); +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("../Observable"); +function scalar(value) { + var result = new Observable_1.Observable(function (subscriber) { + subscriber.next(value); + subscriber.complete(); + }); + result._isScalar = true; + result.value = value; + return result; } -exports.takeUntil = takeUntil; +exports.scalar = scalar; -},{"../operators/takeUntil":201}],154:[function(require,module,exports){ +},{"../Observable":48}],85:[function(require,module,exports){ "use strict"; -var takeWhile_1 = require('../operators/takeWhile'); -/** - * Emits values emitted by the source Observable so long as each value satisfies - * the given `predicate`, and then completes as soon as this `predicate` is not - * satisfied. - * - * Takes values from the source only while they pass the - * condition given. When the first value does not satisfy, it completes. - * - * - * - * `takeWhile` subscribes and begins mirroring the source Observable. Each value - * emitted on the source is given to the `predicate` function which returns a - * boolean, representing a condition to be satisfied by the source values. The - * output Observable emits the source values until such time as the `predicate` - * returns false, at which point `takeWhile` stops mirroring the source - * Observable and completes the output Observable. - * - * @example Emit click events only while the clientX property is greater than 200 - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var result = clicks.takeWhile(ev => ev.clientX > 200); - * result.subscribe(x => console.log(x)); - * - * @see {@link take} - * @see {@link takeLast} - * @see {@link takeUntil} - * @see {@link skip} - * - * @param {function(value: T, index: number): boolean} predicate A function that - * evaluates a value emitted by the source Observable and returns a boolean. - * Also takes the (zero-based) index as the second argument. - * @return {Observable} An Observable that emits the values from the source - * Observable so long as each value satisfies the condition defined by the - * `predicate`, then completes. - * @method takeWhile - * @owner Observable - */ -function takeWhile(predicate) { - return takeWhile_1.takeWhile(predicate)(this); +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); }); + } + else { + return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); }); + } +} +exports.throwError = throwError; +function dispatch(_a) { + var error = _a.error, subscriber = _a.subscriber; + subscriber.error(error); } -exports.takeWhile = takeWhile; -},{"../operators/takeWhile":202}],155:[function(require,module,exports){ +},{"../Observable":48}],86:[function(require,module,exports){ "use strict"; -var async_1 = require('../scheduler/async'); -var timeout_1 = require('../operators/timeout'); -/** - * - * Errors if Observable does not emit a value in given time span. - * - * Timeouts on Observable that doesn't emit values fast enough. - * - * - * - * `timeout` operator accepts as an argument either a number or a Date. - * - * If number was provided, it returns an Observable that behaves like a source - * Observable, unless there is a period of time where there is no value emitted. - * So if you provide `100` as argument and first value comes after 50ms from - * the moment of subscription, this value will be simply re-emitted by the resulting - * Observable. If however after that 100ms passes without a second value being emitted, - * stream will end with an error and source Observable will be unsubscribed. - * These checks are performed throughout whole lifecycle of Observable - from the moment - * it was subscribed to, until it completes or errors itself. Thus every value must be - * emitted within specified period since previous value. - * - * If provided argument was Date, returned Observable behaves differently. It throws - * if Observable did not complete before provided Date. This means that periods between - * emission of particular values do not matter in this case. If Observable did not complete - * before provided Date, source Observable will be unsubscribed. Other than that, resulting - * stream behaves just as source Observable. - * - * `timeout` accepts also a Scheduler as a second parameter. It is used to schedule moment (or moments) - * when returned Observable will check if source stream emitted value or completed. - * - * @example Check if ticks are emitted within certain timespan - * const seconds = Rx.Observable.interval(1000); - * - * seconds.timeout(1100) // Let's use bigger timespan to be safe, - * // since `interval` might fire a bit later then scheduled. - * .subscribe( - * value => console.log(value), // Will emit numbers just as regular `interval` would. - * err => console.log(err) // Will never be called. - * ); - * - * seconds.timeout(900).subscribe( - * value => console.log(value), // Will never be called. - * err => console.log(err) // Will emit error before even first value is emitted, - * // since it did not arrive within 900ms period. - * ); - * - * @example Use Date to check if Observable completed - * const seconds = Rx.Observable.interval(1000); - * - * seconds.timeout(new Date("December 17, 2020 03:24:00")) - * .subscribe( - * value => console.log(value), // Will emit values as regular `interval` would - * // until December 17, 2020 at 03:24:00. - * err => console.log(err) // On December 17, 2020 at 03:24:00 it will emit an error, - * // since Observable did not complete by then. - * ); - * - * @see {@link timeoutWith} - * - * @param {number|Date} due Number specifying period within which Observable must emit values - * or Date specifying before when Observable should complete - * @param {Scheduler} [scheduler] Scheduler controlling when timeout checks occur. - * @return {Observable} Observable that mirrors behaviour of source, unless timeout checks fail. - * @method timeout - * @owner Observable - */ -function timeout(due, scheduler) { - if (scheduler === void 0) { scheduler = async_1.async; } - return timeout_1.timeout(due, scheduler)(this); +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; + } + else if (period === -1) { + return subscriber.complete(); + } + state.index = index + 1; + this.schedule(state, period); } -exports.timeout = timeout; -},{"../operators/timeout":204,"../scheduler/async":212}],156:[function(require,module,exports){ +},{"../Observable":48,"../scheduler/async":204,"../util/isNumeric":225,"../util/isScheduler":229}],87:[function(require,module,exports){ "use strict"; -var withLatestFrom_1 = require('../operators/withLatestFrom'); -/* 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. - * - * 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. - * - * - * - * `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 On every click event, emit an array with the latest timer event plus the click event - * 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]; - } - return withLatestFrom_1.withLatestFrom.apply(void 0, args)(this); +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.withLatestFrom = withLatestFrom; +exports.using = using; -},{"../operators/withLatestFrom":205}],157:[function(require,module,exports){ +},{"../Observable":48,"./empty":65,"./from":67}],88:[function(require,module,exports){ "use strict"; -var zip_1 = require('../operators/zip'); -/* tslint:enable:max-line-length */ -/** - * @param observables - * @return {Observable} - * @method zip - * @owner Observable - */ -function zipProto() { +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 - 0] = arguments[_i]; + observables[_i] = arguments[_i]; } - return zip_1.zip.apply(void 0, observables)(this); + var resultSelector = observables[observables.length - 1]; + if (typeof resultSelector === 'function') { + observables.pop(); + } + return fromArray_1.fromArray(observables, undefined).lift(new ZipOperator(resultSelector)); } -exports.zipProto = zipProto; +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)); -},{"../operators/zip":206}],158:[function(require,module,exports){ +},{"../../internal/symbol/iterator":206,"../OuterSubscriber":50,"../Subscriber":55,"../util/isArray":219,"../util/subscribeToResult":238,"./fromArray":68}],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 tryCatch_1 = require('../util/tryCatch'); -var errorObject_1 = require('../util/errorObject'); -var OuterSubscriber_1 = require('../OuterSubscriber'); -var subscribeToResult_1 = require('../util/subscribeToResult'); -/** - * Ignores source values for a duration determined by another Observable, then - * emits the most recent value from the source Observable, then repeats this - * process. - * - * It's like {@link auditTime}, but the silencing - * duration is determined by a second Observable. - * - * - * - * `audit` is similar to `throttle`, but emits the last value from the silenced - * time window, instead of the first value. `audit` emits the most recent value - * from the source Observable on the output Observable as soon as its internal - * timer becomes disabled, and ignores source values while the timer is enabled. - * Initially, the timer is disabled. As soon as the first source value arrives, - * 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, then the most - * recent source value is emitted on the output Observable, and this process - * repeats for the next source value. - * - * @example Emit clicks at a rate of at most one click per second - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var result = clicks.audit(ev => Rx.Observable.interval(1000)); - * result.subscribe(x => console.log(x)); - * - * @see {@link auditTime} - * @see {@link debounce} - * @see {@link delayWhen} - * @see {@link sample} - * @see {@link throttle} - * - * @param {function(value: T): SubscribableOrPromise} durationSelector A function - * that receives a value from the source Observable, for computing the silencing - * duration, returned as an Observable or a Promise. - * @return {Observable} An Observable that performs rate-limiting of - * emissions from the source Observable. - * @method audit - * @owner Observable - */ +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 tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +var OuterSubscriber_1 = require("../OuterSubscriber"); +var subscribeToResult_1 = require("../util/subscribeToResult"); function audit(durationSelector) { return function auditOperatorFunction(source) { return source.lift(new AuditOperator(durationSelector)); @@ -10689,17 +16987,13 @@ var AuditOperator = (function () { }; return AuditOperator; }()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ var AuditSubscriber = (function (_super) { __extends(AuditSubscriber, _super); function AuditSubscriber(destination, durationSelector) { - _super.call(this, destination); - this.durationSelector = durationSelector; - this.hasValue = false; + var _this = _super.call(this, destination) || this; + _this.durationSelector = durationSelector; + _this.hasValue = false; + return _this; } AuditSubscriber.prototype._next = function (value) { this.value = value; @@ -10711,7 +17005,7 @@ var AuditSubscriber = (function (_super) { } else { var innerSubscription = subscribeToResult_1.subscribeToResult(this, duration); - if (innerSubscription.closed) { + if (!innerSubscription || innerSubscription.closed) { this.clearThrottle(); } else { @@ -10742,100 +17036,36 @@ var AuditSubscriber = (function (_super) { return AuditSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":31,"../util/errorObject":224,"../util/subscribeToResult":237,"../util/tryCatch":239}],159:[function(require,module,exports){ +},{"../OuterSubscriber":50,"../util/errorObject":216,"../util/subscribeToResult":238,"../util/tryCatch":240}],90:[function(require,module,exports){ "use strict"; -var async_1 = require('../scheduler/async'); -var audit_1 = require('./audit'); -var timer_1 = require('../observable/timer'); -/** - * Ignores source values for `duration` milliseconds, then emits the most recent - * value from the source Observable, then repeats this process. - * - * When it sees a source values, it ignores that plus - * the next ones for `duration` milliseconds, and then it emits the most recent - * value from the source. - * - * - * - * `auditTime` is similar to `throttleTime`, but emits the last value from the - * silenced time window, instead of the first value. `auditTime` emits the most - * recent value from the source Observable on the output Observable as soon as - * its internal timer becomes disabled, and ignores source values while the - * timer is enabled. Initially, the timer is disabled. As soon as the first - * source value arrives, the timer is enabled. After `duration` milliseconds (or - * the time unit determined internally by the optional `scheduler`) has passed, - * the timer is disabled, then the most recent source value is emitted on the - * output Observable, and this process repeats for the next source value. - * Optionally takes a {@link IScheduler} for managing timers. - * - * @example Emit clicks at a rate of at most one click per second - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var result = clicks.auditTime(1000); - * result.subscribe(x => console.log(x)); - * - * @see {@link audit} - * @see {@link debounceTime} - * @see {@link delay} - * @see {@link sampleTime} - * @see {@link throttleTime} - * - * @param {number} duration Time to wait before emitting the most recent source - * 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 rate-limiting behavior. - * @return {Observable} An Observable that performs rate-limiting of - * emissions from the source Observable. - * @method auditTime - * @owner Observable - */ +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":114,"../scheduler/async":212,"./audit":158}],160:[function(require,module,exports){ +},{"../observable/timer":86,"../scheduler/async":204,"./audit":89}],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 OuterSubscriber_1 = require('../OuterSubscriber'); -var subscribeToResult_1 = require('../util/subscribeToResult'); -/** - * Buffers the source Observable values until `closingNotifier` emits. - * - * Collects values from the past as an array, and emits - * that array only when another Observable emits. - * - * - * - * 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 On every click, emit array of most recent interval events - * 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} closingNotifier An Observable that signals the - * buffer to be emitted on the output Observable. - * @return {Observable} An Observable of buffers, which are arrays of - * values. - * @method buffer - * @owner Observable - */ +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)); @@ -10851,17 +17081,13 @@ var BufferOperator = (function () { }; 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)); + 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); @@ -10874,55 +17100,23 @@ var BufferSubscriber = (function (_super) { return BufferSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":31,"../util/subscribeToResult":237}],161:[function(require,module,exports){ +},{"../OuterSubscriber":50,"../util/subscribeToResult":238}],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 Subscriber_1 = require('../Subscriber'); -/** - * Buffers the source Observable values until the size hits the maximum - * `bufferSize` given. - * - * Collects values from the past as an array, and emits - * that array only when its size reaches `bufferSize`. - * - * - * - * 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 Emit the last two click events as an array - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var buffered = clicks.bufferCount(2); - * buffered.subscribe(x => console.log(x)); - * - * @example On every click, emit the last two click events as an array - * 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} An Observable of arrays of buffered values. - * @method bufferCount - * @owner Observable - */ +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) { @@ -10946,17 +17140,13 @@ var BufferCountOperator = (function () { }; 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 = []; + var _this = _super.call(this, destination) || this; + _this.bufferSize = bufferSize; + _this.buffer = []; + return _this; } BufferCountSubscriber.prototype._next = function (value) { var buffer = this.buffer; @@ -10975,19 +17165,15 @@ var BufferCountSubscriber = (function (_super) { }; 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; + 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; @@ -11017,51 +17203,312 @@ var BufferSkipCountSubscriber = (function (_super) { return BufferSkipCountSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],162:[function(require,module,exports){ +},{"../Subscriber":55}],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 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. - * - * 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. - * - * - * - * 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 Emit an array of the last clicks every [1-5] random seconds - * 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} An observable of arrays of buffered values. - * @method bufferWhen - * @owner Observable - */ +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":204,"../util/isScheduler":229}],94:[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":238}],95:[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 tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +var OuterSubscriber_1 = require("../OuterSubscriber"); +var subscribeToResult_1 = require("../util/subscribeToResult"); function bufferWhen(closingSelector) { return function (source) { return source.lift(new BufferWhenOperator(closingSelector)); @@ -11076,19 +17523,15 @@ var BufferWhenOperator = (function () { 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(); + 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); @@ -11142,72 +17585,25 @@ var BufferWhenSubscriber = (function (_super) { return BufferWhenSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":31,"../Subscription":37,"../util/errorObject":224,"../util/subscribeToResult":237,"../util/tryCatch":239}],163:[function(require,module,exports){ +},{"../OuterSubscriber":50,"../Subscription":56,"../util/errorObject":216,"../util/subscribeToResult":238,"../util/tryCatch":240}],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 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. - * - * - * - * @example Continues with a different Observable when there's an error - * - * 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 Retries the caught source Observable again in case of error, similar to retry() operator - * - * 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 Throws a new error when the source Observable throws an error - * - * 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. - * @name catchError - */ +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); @@ -11225,23 +17621,14 @@ var CatchOperator = (function () { }; 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; + var _this = _super.call(this, destination) || this; + _this.selector = selector; + _this.caught = caught; + return _this; } - // 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; @@ -11253,338 +17640,103 @@ var CatchSubscriber = (function (_super) { return; } this._unsubscribeAndRecycle(); - this.add(subscribeToResult_1.subscribeToResult(this, result)); + var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined); + this.add(innerSubscriber); + subscribeToResult_1.subscribeToResult(this, result, undefined, undefined, innerSubscriber); } }; return CatchSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":31,"../util/subscribeToResult":237}],164:[function(require,module,exports){ +},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../util/subscribeToResult":238}],97:[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'); +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}],98:[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 = {}; -/* 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. - * - * 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. - * - * - * - * `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 Dynamically calculate the Body-Mass Index from an Observable of weight and one for height - * 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]; + observables[_i] = arguments[_i]; } var project = null; if (typeof observables[observables.length - 1] === 'function') { project = observables.pop(); } - // 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(); } - return function (source) { return source.lift.call(new ArrayObservable_1.ArrayObservable([source].concat(observables)), new CombineLatestOperator(project)); }; + return function (source) { return source.lift.call(from_1.from([source].concat(observables)), new combineLatest_1.CombineLatestOperator(project)); }; } exports.combineLatest = combineLatest; -var CombineLatestOperator = (function () { - function CombineLatestOperator(project) { - this.project = project; - } - 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 = []; - } - 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.project) { - this._tryProject(values); - } - else { - this.destination.next(values.slice()); - } - } - }; - 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; -},{"../OuterSubscriber":31,"../observable/ArrayObservable":93,"../util/isArray":226,"../util/subscribeToResult":237}],165:[function(require,module,exports){ +},{"../observable/combineLatest":62,"../observable/from":67,"../util/isArray":219}],99:[function(require,module,exports){ "use strict"; -var concat_1 = require('../observable/concat'); -/* tslint:enable:max-line-length */ -/** - * Creates an output Observable which sequentially emits all values from every - * given input Observable after the current Observable. - * - * Concatenates multiple Observables together by - * sequentially emitting their values, one Observable after the other. - * - * - * - * 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 Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10 - * 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 Concatenate 3 Observables - * 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 - */ +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 - 0] = arguments[_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":105}],166:[function(require,module,exports){ +},{"../observable/concat":63}],100:[function(require,module,exports){ "use strict"; -var mergeAll_1 = require('./mergeAll'); -/** - * Converts a higher-order Observable into a first-order Observable by - * concatenating the inner Observables in order. - * - * Flattens an Observable-of-Observables by putting one - * inner Observable after the other. - * - * - * - * Joins every Observable emitted by the source (a higher-order Observable), in - * a serial fashion. It subscribes to each inner Observable only after the - * previous inner Observable has completed, and merges all of their values into - * the returned observable. - * - * __Warning:__ If the source Observable emits Observables quickly and - * endlessly, and the inner Observables it emits generally complete slower than - * the source emits, you can run into memory issues as the incoming Observables - * collect in an unbounded buffer. - * - * Note: `concatAll` is equivalent to `mergeAll` with concurrency parameter set - * to `1`. - * - * @example For each click event, tick every second from 0 to 3, with no concurrency - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var higherOrder = clicks.map(ev => Rx.Observable.interval(1000).take(4)); - * var firstOrder = higherOrder.concatAll(); - * firstOrder.subscribe(x => console.log(x)); - * - * // Results in the following: - * // (results are not concurrent) - * // For every click on the "document" it will emit values 0 to 3 spaced - * // on a 1000ms interval - * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 - * - * @see {@link combineAll} - * @see {@link concat} - * @see {@link concatMap} - * @see {@link concatMapTo} - * @see {@link exhaust} - * @see {@link mergeAll} - * @see {@link switch} - * @see {@link zipAll} - * - * @return {Observable} An Observable emitting values from all the inner - * Observables concatenated. - * @method concatAll - * @owner Observable - */ +Object.defineProperty(exports, "__esModule", { value: true }); +var mergeAll_1 = require("./mergeAll"); function concatAll() { return mergeAll_1.mergeAll(1); } exports.concatAll = concatAll; -},{"./mergeAll":180}],167:[function(require,module,exports){ +},{"./mergeAll":133}],101:[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'); -/** - * Counts the number of emissions on the source and emits that number when the - * source completes. - * - * Tells how many values were emitted, when the source - * completes. - * - * - * - * `count` transforms an Observable that emits values into an Observable that - * emits a single value that represents the number of values emitted by the - * source Observable. If the source Observable terminates with an error, `count` - * will pass this error notification along without emitting a value first. If - * the source Observable does not terminate at all, `count` will neither emit - * a value nor terminate. This operator takes an optional `predicate` function - * as argument, in which case the output emission will represent the number of - * source values that matched `true` with the `predicate`. - * - * @example Counts how many seconds have passed before the first click happened - * var seconds = Rx.Observable.interval(1000); - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var secondsBeforeClick = seconds.takeUntil(clicks); - * var result = secondsBeforeClick.count(); - * result.subscribe(x => console.log(x)); - * - * @example Counts how many odd numbers are there between 1 and 7 - * var numbers = Rx.Observable.range(1, 7); - * var result = numbers.count(i => i % 2 === 1); - * result.subscribe(x => console.log(x)); - * - * // Results in: - * // 4 - * - * @see {@link max} - * @see {@link min} - * @see {@link reduce} - * - * @param {function(value: T, i: number, source: Observable): boolean} [predicate] A - * boolean function to select what values are to be counted. It is provided with - * arguments of: - * - `value`: the value from the source Observable. - * - `index`: the (zero-based) "index" of the value from the source Observable. - * - `source`: the source Observable instance itself. - * @return {Observable} An Observable of one number that represents the count as - * described above. - * @method count - * @owner Observable - */ +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":134}],102:[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":101}],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 count(predicate) { return function (source) { return source.lift(new CountOperator(predicate, source)); }; } @@ -11599,19 +17751,15 @@ var CountOperator = (function () { }; return CountOperator; }()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ var CountSubscriber = (function (_super) { __extends(CountSubscriber, _super); function CountSubscriber(destination, predicate, source) { - _super.call(this, destination); - this.predicate = predicate; - this.source = source; - this.count = 0; - this.index = 0; + 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) { @@ -11641,61 +17789,115 @@ var CountSubscriber = (function (_super) { return CountSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],168:[function(require,module,exports){ +},{"../Subscriber":55}],104:[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. - * - * It's like {@link delay}, but passes only the most - * recent value from each burst of emissions. - * - * - * - * `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 Emit the most recent click after a burst of clicks - * 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 - */ +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":238}],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 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)); }; @@ -11711,20 +17913,16 @@ var DebounceTimeOperator = (function () { }; 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; + 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(); @@ -11739,9 +17937,10 @@ var DebounceTimeSubscriber = (function (_super) { DebounceTimeSubscriber.prototype.debouncedNext = function () { this.clearDebounce(); if (this.hasValue) { - this.destination.next(this.lastValue); + var lastValue = this.lastValue; this.lastValue = null; this.hasValue = false; + this.destination.next(lastValue); } }; DebounceTimeSubscriber.prototype.clearDebounce = function () { @@ -11758,45 +17957,23 @@ function dispatchNext(subscriber) { subscriber.debouncedNext(); } -},{"../Subscriber":36,"../scheduler/async":212}],169:[function(require,module,exports){ +},{"../Subscriber":55,"../scheduler/async":204}],106:[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 */ -/** - * Emits a given value if the source Observable completes without emitting any - * `next` value, otherwise mirrors the source Observable. - * - * If the source Observable turns out to be empty, then - * this operator will emit a default value. - * - * - * - * `defaultIfEmpty` emits the values emitted by the source Observable or a - * specified default value if the source Observable is empty (completes without - * having emitted any `next` value). - * - * @example If no clicks happen in 5 seconds, then emit "no clicks" - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var clicksBeforeFive = clicks.takeUntil(Rx.Observable.interval(5000)); - * var result = clicksBeforeFive.defaultIfEmpty('no clicks'); - * result.subscribe(x => console.log(x)); - * - * @see {@link empty} - * @see {@link last} - * - * @param {any} [defaultValue=null] The default value used if the source - * Observable is empty. - * @return {Observable} An Observable that emits either the specified - * `defaultValue` if the source Observable emits no items, or the values emitted - * by the source Observable. - * @method defaultIfEmpty - * @owner Observable - */ +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)); }; @@ -11811,17 +17988,13 @@ var DefaultIfEmptyOperator = (function () { }; return DefaultIfEmptyOperator; }()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ var DefaultIfEmptySubscriber = (function (_super) { __extends(DefaultIfEmptySubscriber, _super); function DefaultIfEmptySubscriber(destination, defaultValue) { - _super.call(this, destination); - this.defaultValue = defaultValue; - this.isEmpty = true; + var _this = _super.call(this, destination) || this; + _this.defaultValue = defaultValue; + _this.isEmpty = true; + return _this; } DefaultIfEmptySubscriber.prototype._next = function (value) { this.isEmpty = false; @@ -11836,56 +18009,26 @@ var DefaultIfEmptySubscriber = (function (_super) { return DefaultIfEmptySubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],170:[function(require,module,exports){ +},{"../Subscriber":55}],107:[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. - * - * Time shifts each item by some specified amount of - * milliseconds. - * - * - * - * 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 Delay each click by one second - * 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 Delay all clicks until a future date happens - * 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 - */ +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); @@ -11903,20 +18046,16 @@ var DelayOperator = (function () { }; return DelayOperator; }()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ 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; + 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; @@ -11931,12 +18070,14 @@ var DelaySubscriber = (function (_super) { this.schedule(state, delay_1); } else { + this.unsubscribe(); source.active = false; } }; DelaySubscriber.prototype._schedule = function (scheduler) { this.active = true; - this.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, { + var destination = this.destination; + destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, { source: this, destination: this.destination, scheduler: scheduler })); }; @@ -11958,9 +18099,11 @@ var DelaySubscriber = (function (_super) { 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)); @@ -11972,61 +18115,213 @@ var DelayMessage = (function () { return DelayMessage; }()); -},{"../Notification":28,"../Subscriber":36,"../scheduler/async":212,"../util/isDate":228}],171:[function(require,module,exports){ +},{"../Notification":47,"../Subscriber":55,"../scheduler/async":204,"../util/isDate":221}],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'); -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 A simple example with numbers - * 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 An example using a keySelector function - * interface Person { - * age: number, - * name: string - * } - * - * Observable.of( - * { 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 - */ +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":238}],109:[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}],110:[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)); }; } @@ -12041,20 +18336,16 @@ var DistinctOperator = (function () { }; 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(); + var _this = _super.call(this, destination) || this; + _this.keySelector = keySelector; + _this.values = new Set(); if (flushes) { - this.add(subscribeToResult_1.subscribeToResult(this, flushes)); + _this.add(subscribeToResult_1.subscribeToResult(_this, flushes)); } + return _this; } DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { this.values.clear(); @@ -12093,56 +18384,25 @@ var DistinctSubscriber = (function (_super) { }(OuterSubscriber_1.OuterSubscriber)); exports.DistinctSubscriber = DistinctSubscriber; -},{"../OuterSubscriber":31,"../util/Set":221,"../util/subscribeToResult":237}],172:[function(require,module,exports){ +},{"../OuterSubscriber":50,"../util/subscribeToResult":238}],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 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 A simple example with numbers - * 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 An example using a compare function - * interface Person { - * age: number, - * name: string - * } - * - * Observable.of( - * { 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 - */ +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 tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); function distinctUntilChanged(compare, keySelector) { return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); }; } @@ -12157,20 +18417,16 @@ var DistinctUntilChangedOperator = (function () { }; 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; + var _this = _super.call(this, destination) || this; + _this.keySelector = keySelector; + _this.hasKey = false; if (typeof compare === 'function') { - this.compare = compare; + _this.compare = compare; } + return _this; } DistinctUntilChangedSubscriber.prototype.compare = function (x, y) { return x === y; @@ -12202,63 +18458,312 @@ var DistinctUntilChangedSubscriber = (function (_super) { return DistinctUntilChangedSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":36,"../util/errorObject":224,"../util/tryCatch":239}],173:[function(require,module,exports){ +},{"../Subscriber":55,"../util/errorObject":216,"../util/tryCatch":240}],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 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. - * - * It's similar to {@link mergeMap}, but applies the - * projection function to every source value as well as every output value. - * It's recursive. - * - * - * - * 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 Start emitting the powers of two on every click, at most 10 of them - * 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 - */ +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":111}],113:[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":209,"./defaultIfEmpty":106,"./filter":119,"./take":171,"./throwIfEmpty":178}],114:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var fromArray_1 = require("../observable/fromArray"); +var scalar_1 = require("../observable/scalar"); +var empty_1 = require("../observable/empty"); +var concat_1 = require("../observable/concat"); +var isScheduler_1 = require("../util/isScheduler"); +function endWith() { + var array = []; + for (var _i = 0; _i < arguments.length; _i++) { + array[_i] = arguments[_i]; + } + return function (source) { + var scheduler = array[array.length - 1]; + if (isScheduler_1.isScheduler(scheduler)) { + array.pop(); + } + else { + scheduler = null; + } + var len = array.length; + if (len === 1 && !scheduler) { + return concat_1.concat(source, scalar_1.scalar(array[0])); + } + else if (len > 0) { + return concat_1.concat(source, fromArray_1.fromArray(array, scheduler)); + } + else { + return concat_1.concat(source, empty_1.empty(scheduler)); + } + }; +} +exports.endWith = endWith; + +},{"../observable/concat":63,"../observable/empty":65,"../observable/fromArray":68,"../observable/scalar":84,"../util/isScheduler":229}],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 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}],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 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":238}],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 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 ExhauseMapOperator(project)); + }; +} +exports.exhaustMap = exhaustMap; +var ExhauseMapOperator = (function () { + function ExhauseMapOperator(project) { + this.project = project; + } + ExhauseMapOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project)); + }; + return ExhauseMapOperator; +}()); +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, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + subscribeToResult_1.subscribeToResult(this, result, value, index, innerSubscriber); + }; + 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":238,"./map":128}],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 tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +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; } @@ -12278,24 +18783,20 @@ var ExpandOperator = (function () { 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; + 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 = []; + _this.buffer = []; } + return _this; } ExpandSubscriber.dispatch = function (arg) { var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index; @@ -12319,7 +18820,8 @@ var ExpandSubscriber = (function (_super) { } else { var state = { subscriber: this, result: result, value: value, index: index }; - this.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state)); + var destination_1 = this.destination; + destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state)); } } else { @@ -12328,20 +18830,23 @@ var ExpandSubscriber = (function (_super) { }; ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) { this.active++; - this.add(subscribeToResult_1.subscribeToResult(this, result, value, index)); + 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; - this.remove(innerSub); + var destination = this.destination; + destination.remove(innerSub); this.active--; if (buffer && buffer.length > 0) { this._next(buffer.shift()); @@ -12354,54 +18859,23 @@ var ExpandSubscriber = (function (_super) { }(OuterSubscriber_1.OuterSubscriber)); exports.ExpandSubscriber = ExpandSubscriber; -},{"../OuterSubscriber":31,"../util/errorObject":224,"../util/subscribeToResult":237,"../util/tryCatch":239}],174:[function(require,module,exports){ +},{"../OuterSubscriber":50,"../util/errorObject":216,"../util/subscribeToResult":238,"../util/tryCatch":240}],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 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. - * - * 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. - * - * - * - * 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 Emit only click events whose target was a DIV element - * 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 - */ +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)); @@ -12418,21 +18892,15 @@ var FilterOperator = (function () { }; 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; + var _this = _super.call(this, destination) || this; + _this.predicate = predicate; + _this.thisArg = thisArg; + _this.count = 0; + return _this; } - // 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 { @@ -12449,23 +18917,24 @@ var FilterSubscriber = (function (_super) { return FilterSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],175:[function(require,module,exports){ +},{"../Subscriber":55}],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'); -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 - */ +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)); }; } @@ -12479,334 +18948,432 @@ var FinallyOperator = (function () { }; 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)); + var _this = _super.call(this, destination) || this; + _this.add(new Subscription_1.Subscription(callback)); + return _this; } return FinallySubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":36,"../Subscription":37}],176:[function(require,module,exports){ +},{"../Subscriber":55,"../Subscription":56}],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 EmptyError_1 = require('../util/EmptyError'); -/** - * Emits only the first value (or the first value that meets some condition) - * emitted by the source Observable. - * - * Emits only the first value. Or emits only the first - * value that passes some test. - * - * - * - * 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 Emit only the first click that happens on the DOM - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var result = clicks.first(); - * result.subscribe(x => console.log(x)); - * - * @example Emits the first click that happens on a DIV - * 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): 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} An Observable of the first item that matches the - * condition. - * @method first - * @owner Observable - */ -function first(predicate, resultSelector, defaultValue) { - return function (source) { return source.lift(new FirstOperator(predicate, resultSelector, defaultValue, source)); }; +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.first = first; -var FirstOperator = (function () { - function FirstOperator(predicate, resultSelector, defaultValue, source) { +exports.find = find; +var FindValueOperator = (function () { + function FindValueOperator(predicate, source, yieldIndex, thisArg) { this.predicate = predicate; - this.resultSelector = resultSelector; - this.defaultValue = defaultValue; this.source = source; + this.yieldIndex = yieldIndex; + this.thisArg = thisArg; } - FirstOperator.prototype.call = function (observer, source) { - return source.subscribe(new FirstSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source)); + FindValueOperator.prototype.call = function (observer, source) { + return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg)); }; - return FirstOperator; + return FindValueOperator; }()); -/** - * 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; +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; } - FirstSubscriber.prototype._next = function (value) { + 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++; - if (this.predicate) { - this._tryPredicate(value, index); + try { + var result = predicate.call(thisArg || this, value, index, this.source); + if (result) { + this.notifyComplete(this.yieldIndex ? index : value); + } } - else { - this._emit(value, index); + catch (err) { + this.destination.error(err); } }; - FirstSubscriber.prototype._tryPredicate = function (value, index) { - var result; + FindValueSubscriber.prototype._complete = function () { + this.notifyComplete(this.yieldIndex ? -1 : undefined); + }; + return FindValueSubscriber; +}(Subscriber_1.Subscriber)); +exports.FindValueSubscriber = FindValueSubscriber; + +},{"../Subscriber":55}],122:[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":121}],123:[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":210,"../util/identity":218,"./defaultIfEmpty":106,"./filter":119,"./take":171,"./throwIfEmpty":178}],124:[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 { - result = this.predicate(value, index, this.source); + key = this.keySelector(value); } catch (err) { - this.destination.error(err); + this.error(err); return; } - if (result) { - this._emit(value, index); + 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); } }; - FirstSubscriber.prototype._emit = function (value, index) { - if (this.resultSelector) { - this._tryResultSelector(value, index); - return; + GroupBySubscriber.prototype._error = function (err) { + var groups = this.groups; + if (groups) { + groups.forEach(function (group, key) { + group.error(err); + }); + groups.clear(); } - this._emitFinal(value); + this.destination.error(err); }; - FirstSubscriber.prototype._tryResultSelector = function (value, index) { - var result; - try { - result = this.resultSelector(value, index); + GroupBySubscriber.prototype._complete = function () { + var groups = this.groups; + if (groups) { + groups.forEach(function (group, key) { + group.complete(); + }); + groups.clear(); } - catch (err) { - this.destination.error(err); - return; + 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); + } } - 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; + 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); } }; - FirstSubscriber.prototype._complete = function () { - var destination = this.destination; - if (!this.hasCompleted && typeof this.defaultValue !== 'undefined') { - destination.next(this.defaultValue); - destination.complete(); + 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)); } - else if (!this.hasCompleted) { - destination.error(new EmptyError_1.EmptyError); + 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 FirstSubscriber; -}(Subscriber_1.Subscriber)); + return InnerRefCountSubscription; +}(Subscription_1.Subscription)); -},{"../Subscriber":36,"../util/EmptyError":219}],177:[function(require,module,exports){ +},{"../Observable":48,"../Subject":53,"../Subscriber":55,"../Subscription":56}],125:[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. - * - * - * - * @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 function (source) { return source.lift(new LastOperator(predicate, resultSelector, defaultValue, source)); }; +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.last = last; -var LastOperator = (function () { - function LastOperator(predicate, resultSelector, defaultValue, source) { - this.predicate = predicate; - this.resultSelector = resultSelector; - this.defaultValue = defaultValue; - this.source = source; +exports.ignoreElements = ignoreElements; +var IgnoreElementsOperator = (function () { + function IgnoreElementsOperator() { } - LastOperator.prototype.call = function (observer, source) { - return source.subscribe(new LastSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source)); + IgnoreElementsOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new IgnoreElementsSubscriber(subscriber)); }; - return LastOperator; + return IgnoreElementsOperator; }()); -/** - * 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; - } +var IgnoreElementsSubscriber = (function (_super) { + __extends(IgnoreElementsSubscriber, _super); + function IgnoreElementsSubscriber() { + return _super !== null && _super.apply(this, arguments) || this; } - 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; - } + IgnoreElementsSubscriber.prototype._next = function (unused) { }; - 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; - } + return IgnoreElementsSubscriber; +}(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 __()); }; - 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; +})(); +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)); }; - LastSubscriber.prototype._complete = function () { + 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; - if (this.hasValue) { - destination.next(this.lastValue); - destination.complete(); - } - else { - destination.error(new EmptyError_1.EmptyError); - } + destination.next(isEmpty); + destination.complete(); + }; + IsEmptySubscriber.prototype._next = function (value) { + this.notifyComplete(false); }; - return LastSubscriber; + IsEmptySubscriber.prototype._complete = function () { + this.notifyComplete(true); + }; + return IsEmptySubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":36,"../util/EmptyError":219}],178:[function(require,module,exports){ +},{"../Subscriber":55}],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 __()); -}; -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. - * - * 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. - * - * - * - * 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 Map every click to the clientX position of that click - * 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} An Observable that emits the values from the source - * Observable transformed by the given `project` function. - * @method map - * @owner Observable - */ +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":210,"../util/identity":218,"./defaultIfEmpty":106,"./filter":119,"./takeLast":172,"./throwIfEmpty":178}],128:[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') { @@ -12827,21 +19394,15 @@ var MapOperator = (function () { 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; + var _this = _super.call(this, destination) || this; + _this.project = project; + _this.count = 0; + _this.thisArg = thisArg || _this; + return _this; } - // NOTE: This looks unoptimized, but it's actually purposefully NOT - // using try/catch optimizations. MapSubscriber.prototype._next = function (value) { var result; try { @@ -12856,269 +19417,194 @@ var MapSubscriber = (function (_super) { return MapSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],179:[function(require,module,exports){ +},{"../Subscriber":55}],129:[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 */ -function merge() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i - 0] = arguments[_i]; +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 (source) { return source.lift.call(mergeStatic.apply(void 0, [source].concat(observables))); }; + 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.merge = merge; -/* tslint:enable:max-line-length */ -/** - * Creates an output Observable which concurrently emits all values from every - * given input Observable. - * - * Flattens multiple Observables together by blending - * their values into one Observable. - * - * - * - * `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 Merge together two Observables: 1s interval and clicks - * 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 Merge together 3 Observables, but only 2 run concurrently - * 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]; +exports.mapTo = mapTo; +var MapToOperator = (function () { + function MapToOperator(value) { + this.value = value; } - 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(); - } + 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; } - else if (typeof last === 'number') { - concurrent = observables.pop(); + MapToSubscriber.prototype._next = function (x) { + this.destination.next(this.value); + }; + return MapToSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":55}],130:[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 (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) { - return observables[0]; + 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}],131:[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":149}],132:[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 mergeAll_1.mergeAll(concurrent)(new ArrayObservable_1.ArrayObservable(observables, scheduler)); + return function (source) { return source.lift.call(merge_1.merge.apply(void 0, [source].concat(observables))); }; } -exports.mergeStatic = mergeStatic; +exports.merge = merge; -},{"../Observable":29,"../observable/ArrayObservable":93,"../util/isScheduler":233,"./mergeAll":180}],180:[function(require,module,exports){ +},{"../observable/merge":77}],133:[function(require,module,exports){ "use strict"; -var mergeMap_1 = require('./mergeMap'); -var identity_1 = require('../util/identity'); -/** - * Converts a higher-order Observable into a first-order Observable which - * concurrently delivers all values that are emitted on the inner Observables. - * - * Flattens an Observable-of-Observables. - * - * - * - * `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 Spawn a new interval Observable for each click event, and blend their outputs as one Observable - * 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 Count from 0 to 9 every second for each click, but only allow 2 concurrent timers - * 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 - */ +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, null, concurrent); + return mergeMap_1.mergeMap(identity_1.identity, concurrent); } exports.mergeAll = mergeAll; -},{"../util/identity":225,"./mergeMap":181}],181:[function(require,module,exports){ +},{"../util/identity":218,"./mergeMap":134}],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 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. - * - * Maps each value to an Observable, then flattens all of - * these inner Observables using {@link mergeAll}. - * - * - * - * 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 Map and flatten each letter to an Observable ticking every 1 second - * 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 - */ +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; } - return function mergeMapOperatorFunction(source) { - if (typeof resultSelector === 'number') { - concurrent = resultSelector; - resultSelector = null; - } - return source.lift(new MergeMapOperator(project, resultSelector, concurrent)); - }; + 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, resultSelector, concurrent) { + function MergeMapOperator(project, 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 source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent)); }; return MergeMapOperator; }()); exports.MergeMapOperator = MergeMapOperator; -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ var MergeMapSubscriber = (function (_super) { __extends(MergeMapSubscriber, _super); - function MergeMapSubscriber(destination, project, resultSelector, concurrent) { + function MergeMapSubscriber(destination, project, 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; + 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) { @@ -13142,71 +19628,178 @@ var MergeMapSubscriber = (function (_super) { this._innerSub(result, value, index); }; MergeMapSubscriber.prototype._innerSub = function (ish, value, index) { - this.add(subscribeToResult_1.subscribeToResult(this, ish, value, index)); + var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + subscribeToResult_1.subscribeToResult(this, ish, value, index, innerSubscriber); }; 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) { - if (this.resultSelector) { - this._notifyResultSelector(outerValue, innerValue, outerIndex, innerIndex); + 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 { - this.destination.next(innerValue); + else if (this.active === 0 && this.hasCompleted) { + this.destination.complete(); } }; - MergeMapSubscriber.prototype._notifyResultSelector = function (outerValue, innerValue, outerIndex, innerIndex) { - var result; - try { - result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex); + return MergeMapSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); +exports.MergeMapSubscriber = MergeMapSubscriber; + +},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../observable/from":67,"../util/subscribeToResult":238,"./map":128}],135:[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":134}],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 tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +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 ish = tryCatch_1.tryCatch(this.accumulator)(this.acc, value); + var destination = this.destination; + if (ish === errorObject_1.errorObject) { + destination.error(errorObject_1.errorObject.e); + } + else { + this.active++; + this._innerSub(ish, value, index); + } } - catch (err) { - this.destination.error(err); - return; + else { + this.buffer.push(value); } - this.destination.next(result); }; - MergeMapSubscriber.prototype.notifyComplete = function (innerSub) { + MergeScanSubscriber.prototype._innerSub = function (ish, value, index) { + var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + subscribeToResult_1.subscribeToResult(this, ish, value, index, innerSubscriber); + }; + 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; - this.remove(innerSub); + 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 MergeMapSubscriber; + return MergeScanSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -exports.MergeMapSubscriber = MergeMapSubscriber; +exports.MergeScanSubscriber = MergeScanSubscriber; -},{"../OuterSubscriber":31,"../util/subscribeToResult":237}],182:[function(require,module,exports){ +},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../util/errorObject":216,"../util/subscribeToResult":238,"../util/tryCatch":240}],137:[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. - * - * - * - * @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 - */ +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":149}],138:[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; @@ -13244,61 +19837,24 @@ var MulticastOperator = (function () { }()); exports.MulticastOperator = MulticastOperator; -},{"../observable/ConnectableObservable":94}],183:[function(require,module,exports){ +},{"../observable/ConnectableObservable":58}],139:[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. - * - * Ensure a specific scheduler is used, from outside of an Observable. - * - * `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 Ensure values in subscribe are called just before browser repaint. - * 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} Observable that emits the same notifications as the source Observable, - * but with provided scheduler. - * - * @method observeOn - * @owner Observable - */ +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) { @@ -13318,18 +19874,14 @@ var ObserveOnOperator = (function () { return ObserveOnOperator; }()); exports.ObserveOnOperator = ObserveOnOperator; -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ 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; + 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; @@ -13337,72 +19889,140 @@ var ObserveOnSubscriber = (function (_super) { this.unsubscribe(); }; ObserveOnSubscriber.prototype.scheduleMessage = function (notification) { - this.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination))); + 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}],140:[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(); }; - ObserveOnSubscriber.prototype._next = function (value) { - this.scheduleMessage(Notification_1.Notification.createNext(value)); + OnErrorResumeNextSubscriber.prototype._error = function (err) { + this.subscribeToNextSource(); + this.unsubscribe(); }; - ObserveOnSubscriber.prototype._error = function (err) { - this.scheduleMessage(Notification_1.Notification.createError(err)); + OnErrorResumeNextSubscriber.prototype._complete = function () { + this.subscribeToNextSource(); + this.unsubscribe(); }; - ObserveOnSubscriber.prototype._complete = function () { - this.scheduleMessage(Notification_1.Notification.createComplete()); + 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); + subscribeToResult_1.subscribeToResult(this, next, undefined, undefined, innerSubscriber); + } + else { + this.destination.complete(); + } }; - 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; + return OnErrorResumeNextSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); -},{"../Notification":28,"../Subscriber":36}],184:[function(require,module,exports){ +},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../observable/from":67,"../util/isArray":219,"../util/subscribeToResult":238}],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'); -/** - * Groups pairs of consecutive emissions together and emits them as an array of - * two values. - * - * Puts the current value and previous value together as - * an array, and emits that. - * - * - * - * 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 On every click (starting from the second), emit the relative distance to the previous click - * 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>} An Observable of pairs (as arrays) of - * consecutive values from the source Observable. - * @method pairwise - * @owner Observable - */ +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()); }; } @@ -13415,16 +20035,12 @@ var PairwiseOperator = (function () { }; return PairwiseOperator; }()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ var PairwiseSubscriber = (function (_super) { __extends(PairwiseSubscriber, _super); function PairwiseSubscriber(destination) { - _super.call(this, destination); - this.hasPrev = false; + var _this = _super.call(this, destination) || this; + _this.hasPrev = false; + return _this; } PairwiseSubscriber.prototype._next = function (value) { if (this.hasPrev) { @@ -13438,39 +20054,27 @@ var PairwiseSubscriber = (function (_super) { return PairwiseSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],185:[function(require,module,exports){ +},{"../Subscriber":55}],142:[function(require,module,exports){ "use strict"; -var map_1 = require('./map'); -/** - * Maps each source value (an object) to its specified nested property. - * - * Like {@link map}, but meant only for picking one of - * the nested properties of every emitted object. - * - * - * - * 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 Map every click to the tagName of the clicked target element - * 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 - */ +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":231,"./filter":119}],143:[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 - 0] = arguments[_i]; + properties[_i] = arguments[_i]; } var length = properties.length; if (length === 0) { @@ -13496,24 +20100,11 @@ function plucker(props, length) { return mapper; } -},{"./map":178}],186:[function(require,module,exports){ +},{"./map":128}],144:[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. - * - * - * - * @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 - */ +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) : @@ -13521,11 +20112,31 @@ function publish(selector) { } exports.publish = publish; -},{"../Subject":34,"./multicast":182}],187:[function(require,module,exports){ +},{"../Subject":53,"./multicast":138}],145:[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":138}],146:[function(require,module,exports){ "use strict"; -var ReplaySubject_1 = require('../ReplaySubject'); -var multicast_1 = require('./multicast'); -/* tslint:enable:max-line-length */ +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":138}],147:[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; @@ -13536,84 +20147,61 @@ function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) { } exports.publishReplay = publishReplay; -},{"../ReplaySubject":32,"./multicast":182}],188:[function(require,module,exports){ +},{"../ReplaySubject":51,"./multicast":138}],148:[function(require,module,exports){ "use strict"; -var scan_1 = require('./scan'); -var takeLast_1 = require('./takeLast'); -var defaultIfEmpty_1 = require('./defaultIfEmpty'); -var pipe_1 = require('../util/pipe'); -/* tslint:enable:max-line-length */ -/** - * Applies an accumulator function over the source Observable, and returns the - * accumulated result when the source completes, given an optional seed value. - * - * 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. - * - * - * - * Like - * [Array.prototype.reduce()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce), - * `reduce` applies an `accumulator` function against an accumulation and each - * value of the source Observable (from the past) to reduce it to a single - * value, emitted on the output Observable. Note that `reduce` will only emit - * one value, only when the source Observable completes. It is equivalent to - * applying operator {@link scan} followed by operator {@link last}. - * - * 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 Count the number of click events that happened in 5 seconds - * var clicksInFiveSeconds = Rx.Observable.fromEvent(document, 'click') - * .takeUntil(Rx.Observable.interval(5000)); - * var ones = clicksInFiveSeconds.mapTo(1); - * var seed = 0; - * var count = ones.reduce((acc, one) => acc + one, seed); - * count.subscribe(x => console.log(x)); - * - * @see {@link count} - * @see {@link expand} - * @see {@link mergeScan} - * @see {@link scan} - * - * @param {function(acc: R, value: T, index: number): R} accumulator The accumulator function - * called on each source value. - * @param {R} [seed] The initial accumulation value. - * @return {Observable} An Observable that emits a single value that is the - * result of accumulating the values emitted by the source Observable. - * @method reduce - * @owner Observable - */ +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":82,"../util/isArray":219}],149:[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) { - // 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) { 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); + 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":235,"./defaultIfEmpty":169,"./scan":192,"./takeLast":200}],189:[function(require,module,exports){ +},{"../util/pipe":232,"./defaultIfEmpty":106,"./scan":157,"./takeLast":172}],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 Subscriber_1 = require('../Subscriber'); +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)); @@ -13639,8 +20227,9 @@ var RefCountOperator = (function () { var RefCountSubscriber = (function (_super) { __extends(RefCountSubscriber, _super); function RefCountSubscriber(destination, connectable) { - _super.call(this, destination); - this.connectable = connectable; + var _this = _super.call(this, destination) || this; + _this.connectable = connectable; + return _this; } RefCountSubscriber.prototype._unsubscribe = function () { var connectable = this.connectable; @@ -13659,29 +20248,6 @@ var RefCountSubscriber = (function (_super) { 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; @@ -13692,30 +20258,185 @@ var RefCountSubscriber = (function (_super) { return RefCountSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],190:[function(require,module,exports){ +},{"../Subscriber":55}],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 Subscriber_1 = require('../Subscriber'); -/** - * Returns an Observable that mirrors the source Observable with the exception of an `error`. If the source Observable - * calls `error`, this method will resubscribe to the source Observable for a maximum of `count` resubscriptions (given - * as a number parameter) rather than propagating the `error` call. - * - * - * - * Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted - * during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second - * time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications - * would be: [1, 2, 1, 2, 3, 4, 5, `complete`]. - * @param {number} count - Number of retry attempts before failing. - * @return {Observable} The source Observable modified with the retry logic. - * @method retry - * @owner Observable - */ +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}],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 Subject_1 = require("../Subject"); +var tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +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 = tryCatch_1.tryCatch(this.notifier)(this.notifications); + if (retries === errorObject_1.errorObject) { + 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/errorObject":216,"../util/subscribeToResult":238,"../util/tryCatch":240}],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"); function retry(count) { if (count === void 0) { count = -1; } return function (source) { return source.lift(new RetryOperator(count, source)); }; @@ -13731,17 +20452,13 @@ var RetryOperator = (function () { }; return RetryOperator; }()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ var RetrySubscriber = (function (_super) { __extends(RetrySubscriber, _super); function RetrySubscriber(destination, count, source) { - _super.call(this, destination); - this.count = count; - this.source = source; + var _this = _super.call(this, destination) || this; + _this.count = count; + _this.source = source; + return _this; } RetrySubscriber.prototype.error = function (err) { if (!this.isStopped) { @@ -13758,49 +20475,113 @@ var RetrySubscriber = (function (_super) { return RetrySubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],191:[function(require,module,exports){ +},{"../Subscriber":55}],154:[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 most recently emitted value from the source Observable whenever - * another Observable, the `notifier`, emits. - * - * It's like {@link sampleTime}, but samples whenever - * the `notifier` Observable emits something. - * - * - * - * Whenever the `notifier` Observable emits a value or completes, `sample` - * looks at the source Observable and emits whichever value it has most recently - * emitted since the previous sampling, unless the source has not emitted - * anything since the previous sampling. The `notifier` is subscribed to as soon - * as the output Observable is subscribed. - * - * @example On every click, sample the most recent "seconds" timer - * var seconds = Rx.Observable.interval(1000); - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var result = seconds.sample(clicks); - * result.subscribe(x => console.log(x)); - * - * @see {@link audit} - * @see {@link debounce} - * @see {@link sampleTime} - * @see {@link throttle} - * - * @param {Observable} notifier The Observable to use for sampling the - * source Observable. - * @return {Observable} An Observable that emits the results of sampling the - * values emitted by the source Observable whenever the notifier Observable - * emits value or completes. - * @method sample - * @owner Observable - */ +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 tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +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(); + retries = tryCatch_1.tryCatch(this.notifier)(errors); + if (retries === errorObject_1.errorObject) { + return _super.prototype.error.call(this, errorObject_1.errorObject.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/errorObject":216,"../util/subscribeToResult":238,"../util/tryCatch":240}],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 OuterSubscriber_1 = require("../OuterSubscriber"); +var subscribeToResult_1 = require("../util/subscribeToResult"); function sample(notifier) { return function (source) { return source.lift(new SampleOperator(notifier)); }; } @@ -13817,16 +20598,12 @@ var SampleOperator = (function () { }; return SampleOperator; }()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ var SampleSubscriber = (function (_super) { __extends(SampleSubscriber, _super); function SampleSubscriber() { - _super.apply(this, arguments); - this.hasValue = false; + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.hasValue = false; + return _this; } SampleSubscriber.prototype._next = function (value) { this.value = value; @@ -13847,59 +20624,86 @@ var SampleSubscriber = (function (_super) { return SampleSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":31,"../util/subscribeToResult":237}],192:[function(require,module,exports){ +},{"../OuterSubscriber":50,"../util/subscribeToResult":238}],156:[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. - * - * It's like {@link reduce}, but emits the current - * accumulation whenever the source emits a value. - * - * - * - * 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 Count the number of click events - * 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} An observable of the accumulated values. - * @method scan - * @owner Observable - */ +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":204}],157:[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; - // 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; } @@ -13920,19 +20724,15 @@ var ScanOperator = (function () { }; 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; + 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 () { @@ -13969,51 +20769,294 @@ var ScanSubscriber = (function (_super) { return ScanSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],193:[function(require,module,exports){ +},{"../Subscriber":55}],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 tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +function sequenceEqual(compareTo, comparor) { + return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparor)); }; +} +exports.sequenceEqual = sequenceEqual; +var SequenceEqualOperator = (function () { + function SequenceEqualOperator(compareTo, comparor) { + this.compareTo = compareTo; + this.comparor = comparor; + } + SequenceEqualOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparor)); + }; + return SequenceEqualOperator; +}()); +exports.SequenceEqualOperator = SequenceEqualOperator; +var SequenceEqualSubscriber = (function (_super) { + __extends(SequenceEqualSubscriber, _super); + function SequenceEqualSubscriber(destination, compareTo, comparor) { + var _this = _super.call(this, destination) || this; + _this.compareTo = compareTo; + _this.comparor = comparor; + _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, comparor = _c.comparor; + while (_a.length > 0 && _b.length > 0) { + var a = _a.shift(); + var b = _b.shift(); + var areEqual = false; + if (comparor) { + areEqual = tryCatch_1.tryCatch(comparor)(a, b); + if (areEqual === errorObject_1.errorObject) { + this.destination.error(errorObject_1.errorObject.e); + } + } + else { + areEqual = a === b; + } + 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,"../util/errorObject":216,"../util/tryCatch":240}],159:[function(require,module,exports){ "use strict"; -var multicast_1 = require('./multicast'); -var refCount_1 = require('./refCount'); -var Subject_1 = require('../Subject'); +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(); } -/** - * 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 .multicast(() => new Subject()).refCount(). - * - * - * - * @return {Observable} An Observable that upon connection causes the source Observable to emit items to its Observers. - * @method share - * @owner Observable - */ function share() { return function (source) { return refCount_1.refCount()(multicast_1.multicast(shareSubjectFactory)(source)); }; } exports.share = share; -; -},{"../Subject":34,"./multicast":182,"./refCount":189}],194:[function(require,module,exports){ +},{"../Subject":53,"./multicast":138,"./refCount":150}],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 __()); -}; -var Subscriber_1 = require('../Subscriber'); -/** - * Returns an Observable that skips the first `count` items emitted by the source Observable. - * - * - * - * @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 - */ +Object.defineProperty(exports, "__esModule", { value: true }); +var ReplaySubject_1 = require("../ReplaySubject"); +function shareReplay(bufferSize, windowTime, scheduler) { + if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; } + if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; } + return function (source) { return source.lift(shareReplayOperator(bufferSize, windowTime, scheduler)); }; +} +exports.shareReplay = shareReplay; +function shareReplayOperator(bufferSize, windowTime, 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; + subject.complete(); + }, + }); + } + var innerSub = subject.subscribe(this); + return function () { + refCount--; + innerSub.unsubscribe(); + if (subscription && refCount === 0 && isComplete) { + subscription.unsubscribe(); + } + }; + }; +} + +},{"../ReplaySubject":51}],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 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":210}],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 skip(count) { return function (source) { return source.lift(new SkipOperator(count)); }; } @@ -14027,17 +21070,13 @@ var SkipOperator = (function () { }; 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; + 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) { @@ -14047,27 +21086,90 @@ var SkipSubscriber = (function (_super) { return SkipSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],195:[function(require,module,exports){ +},{"../Subscriber":55}],163:[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. - * - * - * - * @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} 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 - */ +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":209}],164:[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)); }; } @@ -14076,69 +21178,55 @@ var SkipUntilOperator = (function () { function SkipUntilOperator(notifier) { this.notifier = notifier; } - SkipUntilOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SkipUntilSubscriber(subscriber, this.notifier)); + SkipUntilOperator.prototype.call = function (destination, source) { + return source.subscribe(new SkipUntilSubscriber(destination, this.notifier)); }; return SkipUntilOperator; }()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ 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)); + 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; + subscribeToResult_1.subscribeToResult(_this, notifier, undefined, undefined, innerSubscriber); + return _this; } 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; + if (this.innerSubscription) { + this.innerSubscription.unsubscribe(); + } }; SkipUntilSubscriber.prototype.notifyComplete = function () { - this.isInnerStopped = true; - if (this.isStopped) { - _super.prototype._complete.call(this); - } }; return SkipUntilSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":31,"../util/subscribeToResult":237}],196:[function(require,module,exports){ +},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../util/subscribeToResult":238}],165:[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. - * - * - * - * @param {Function} predicate - A function to test each item emitted from the source Observable. - * @return {Observable} An Observable that begins emitting items emitted by the source Observable when the - * specified predicate becomes false. - * @method skipWhile - * @owner Observable - */ +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)); }; } @@ -14152,18 +21240,14 @@ var SkipWhileOperator = (function () { }; return SkipWhileOperator; }()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ var SkipWhileSubscriber = (function (_super) { __extends(SkipWhileSubscriber, _super); function SkipWhileSubscriber(destination, predicate) { - _super.call(this, destination); - this.predicate = predicate; - this.skipping = true; - this.index = 0; + 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; @@ -14186,32 +21270,18 @@ var SkipWhileSubscriber = (function (_super) { return SkipWhileSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],197:[function(require,module,exports){ +},{"../Subscriber":55}],166:[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('../observable/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. - * - * - * - * @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 - */ +Object.defineProperty(exports, "__esModule", { value: true }); +var fromArray_1 = require("../observable/fromArray"); +var scalar_1 = require("../observable/scalar"); +var empty_1 = require("../observable/empty"); +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 - 0] = arguments[_i]; + array[_i] = arguments[_i]; } return function (source) { var scheduler = array[array.length - 1]; @@ -14222,104 +21292,95 @@ function startWith() { scheduler = null; } var len = array.length; - if (len === 1) { - return concat_1.concat(new ScalarObservable_1.ScalarObservable(array[0], scheduler), source); + if (len === 1 && !scheduler) { + return concat_1.concat(scalar_1.scalar(array[0]), source); } - else if (len > 1) { - return concat_1.concat(new ArrayObservable_1.ArrayObservable(array, scheduler), source); + else if (len > 0) { + return concat_1.concat(fromArray_1.fromArray(array, scheduler), source); } else { - return concat_1.concat(new EmptyObservable_1.EmptyObservable(scheduler), source); + return concat_1.concat(empty_1.empty(scheduler), source); } }; } exports.startWith = startWith; -},{"../observable/ArrayObservable":93,"../observable/EmptyObservable":96,"../observable/ScalarObservable":102,"../observable/concat":105,"../util/isScheduler":233}],198:[function(require,module,exports){ +},{"../observable/concat":63,"../observable/empty":65,"../observable/fromArray":68,"../observable/scalar":84,"../util/isScheduler":229}],167:[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. - * - * Maps each value to an Observable, then flattens all of - * these inner Observables using {@link switch}. - * - * - * - * 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 Rerun an interval Observable on every click event - * 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 - */ -function switchMap(project, resultSelector) { - return function switchMapOperatorFunction(source) { - return source.lift(new SwitchMapOperator(project, resultSelector)); +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}],168:[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":218,"./switchMap":169}],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 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, resultSelector) { + function SwitchMapOperator(project) { this.project = project; - this.resultSelector = resultSelector; } SwitchMapOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SwitchMapSubscriber(subscriber, this.project, this.resultSelector)); + return source.subscribe(new SwitchMapSubscriber(subscriber, this.project)); }; return SwitchMapOperator; }()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ 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; + 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; @@ -14338,93 +21399,67 @@ var SwitchMapSubscriber = (function (_super) { if (innerSubscription) { innerSubscription.unsubscribe(); } - this.add(this.innerSubscription = subscribeToResult_1.subscribeToResult(this, result, value, index)); + var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + this.innerSubscription = subscribeToResult_1.subscribeToResult(this, result, value, index, innerSubscriber); }; 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) { - this.remove(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) { - 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); + this.destination.next(innerValue); }; return SwitchMapSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":31,"../util/subscribeToResult":237}],199:[function(require,module,exports){ +},{"../InnerSubscriber":46,"../OuterSubscriber":50,"../observable/from":67,"../util/subscribeToResult":238,"./map":128}],170:[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. - * - * Takes the first `count` values from the source, then - * completes. - * - * - * - * `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 Take the first 5 seconds of an infinite 1-second interval Observable - * 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} 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 - */ +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":169}],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"); +var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError"); +var empty_1 = require("../observable/empty"); function take(count) { return function (source) { if (count === 0) { - return new EmptyObservable_1.EmptyObservable(); + return empty_1.empty(); } else { return source.lift(new TakeOperator(count)); @@ -14444,17 +21479,13 @@ var TakeOperator = (function () { }; 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; + var _this = _super.call(this, destination) || this; + _this.total = total; + _this.count = 0; + return _this; } TakeSubscriber.prototype._next = function (value) { var total = this.total; @@ -14470,56 +21501,29 @@ var TakeSubscriber = (function (_super) { return TakeSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":36,"../observable/EmptyObservable":96,"../util/ArgumentOutOfRangeError":218}],200:[function(require,module,exports){ +},{"../Subscriber":55,"../observable/empty":65,"../util/ArgumentOutOfRangeError":209}],172:[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 last `count` values emitted by the source Observable. - * - * Remembers the latest `count` values, then emits those - * only when the source completes. - * - * - * - * `takeLast` returns an Observable that emits at most the last `count` values - * emitted by the source Observable. If the source emits fewer than `count` - * values then all of its values are emitted. This operator must wait until the - * `complete` notification emission from the source in order to emit the `next` - * values on the output Observable, because otherwise it is impossible to know - * whether or not more values will be emitted on the source. For this reason, - * all values are emitted synchronously, followed by the complete notification. - * - * @example Take the last 3 values of an Observable with many values - * var many = Rx.Observable.range(1, 100); - * var lastThree = many.takeLast(3); - * lastThree.subscribe(x => console.log(x)); - * - * @see {@link take} - * @see {@link takeUntil} - * @see {@link takeWhile} - * @see {@link skip} - * - * @throws {ArgumentOutOfRangeError} When using `takeLast(i)`, it delivers an - * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`. - * - * @param {number} count The maximum number of values to emit from the end of - * the sequence of values emitted by the source Observable. - * @return {Observable} An Observable that emits at most the last count - * values emitted by the source Observable. - * @method takeLast - * @owner Observable - */ +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 new EmptyObservable_1.EmptyObservable(); + return empty_1.empty(); } else { return source.lift(new TakeLastOperator(count)); @@ -14539,18 +21543,14 @@ var TakeLastOperator = (function () { }; return TakeLastOperator; }()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ var TakeLastSubscriber = (function (_super) { __extends(TakeLastSubscriber, _super); function TakeLastSubscriber(destination, total) { - _super.call(this, destination); - this.total = total; - this.ring = new Array(); - this.count = 0; + 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; @@ -14580,48 +21580,24 @@ var TakeLastSubscriber = (function (_super) { return TakeLastSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":36,"../observable/EmptyObservable":96,"../util/ArgumentOutOfRangeError":218}],201:[function(require,module,exports){ +},{"../Subscriber":55,"../observable/empty":65,"../util/ArgumentOutOfRangeError":209}],173:[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. - * - * Lets values pass until a second Observable, - * `notifier`, emits something. Then, it completes. - * - * - * - * `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 Tick every second until the first click happens - * 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} An Observable that emits the values from the source - * Observable until such time as `notifier` emits its first value. - * @method takeUntil - * @owner Observable - */ +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)); }; } @@ -14631,75 +21607,49 @@ var TakeUntilOperator = (function () { this.notifier = notifier; } TakeUntilOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TakeUntilSubscriber(subscriber, this.notifier)); + 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; }()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ 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)); + 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 () { - // noop }; return TakeUntilSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":31,"../util/subscribeToResult":237}],202:[function(require,module,exports){ +},{"../OuterSubscriber":50,"../util/subscribeToResult":238}],174:[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'); -/** - * Emits values emitted by the source Observable so long as each value satisfies - * the given `predicate`, and then completes as soon as this `predicate` is not - * satisfied. - * - * Takes values from the source only while they pass the - * condition given. When the first value does not satisfy, it completes. - * - * - * - * `takeWhile` subscribes and begins mirroring the source Observable. Each value - * emitted on the source is given to the `predicate` function which returns a - * boolean, representing a condition to be satisfied by the source values. The - * output Observable emits the source values until such time as the `predicate` - * returns false, at which point `takeWhile` stops mirroring the source - * Observable and completes the output Observable. - * - * @example Emit click events only while the clientX property is greater than 200 - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var result = clicks.takeWhile(ev => ev.clientX > 200); - * result.subscribe(x => console.log(x)); - * - * @see {@link take} - * @see {@link takeLast} - * @see {@link takeUntil} - * @see {@link skip} - * - * @param {function(value: T, index: number): boolean} predicate A function that - * evaluates a value emitted by the source Observable and returns a boolean. - * Also takes the (zero-based) index as the second argument. - * @return {Observable} An Observable that emits the values from the source - * Observable so long as each value satisfies the condition defined by the - * `predicate`, then completes. - * @method takeWhile - * @owner Observable - */ +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) { return function (source) { return source.lift(new TakeWhileOperator(predicate)); }; } @@ -14713,17 +21663,13 @@ var TakeWhileOperator = (function () { }; return TakeWhileOperator; }()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ var TakeWhileSubscriber = (function (_super) { __extends(TakeWhileSubscriber, _super); function TakeWhileSubscriber(destination, predicate) { - _super.call(this, destination); - this.predicate = predicate; - this.index = 0; + var _this = _super.call(this, destination) || this; + _this.predicate = predicate; + _this.index = 0; + return _this; } TakeWhileSubscriber.prototype._next = function (value) { var destination = this.destination; @@ -14739,4190 +21685,3513 @@ var TakeWhileSubscriber = (function (_super) { }; TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) { var destination = this.destination; - if (Boolean(predicateResult)) { - destination.next(value); - } - else { - destination.complete(); - } - }; - return TakeWhileSubscriber; -}(Subscriber_1.Subscriber)); - -},{"../Subscriber":36}],203:[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. - * - * 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. - * - * - * - * 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 Map every click to the clientX position of that click, while also logging the click event - * 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. - * @name tap - */ -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 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); - } - else { - this.destination.next(value); - } - }; - DoSubscriber.prototype._error = function (err) { - var safeSubscriber = this.safeSubscriber; - safeSubscriber.error(err); - if (safeSubscriber.syncErrorThrown) { - this.destination.error(safeSubscriber.syncErrorValue); - } - else { - this.destination.error(err); - } - }; - DoSubscriber.prototype._complete = function () { - var safeSubscriber = this.safeSubscriber; - safeSubscriber.complete(); - if (safeSubscriber.syncErrorThrown) { - this.destination.error(safeSubscriber.syncErrorValue); - } - else { - this.destination.complete(); - } - }; - return DoSubscriber; -}(Subscriber_1.Subscriber)); - -},{"../Subscriber":36}],204:[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 TimeoutError_1 = require('../util/TimeoutError'); -/** - * - * Errors if Observable does not emit a value in given time span. - * - * Timeouts on Observable that doesn't emit values fast enough. - * - * - * - * `timeout` operator accepts as an argument either a number or a Date. - * - * If number was provided, it returns an Observable that behaves like a source - * Observable, unless there is a period of time where there is no value emitted. - * So if you provide `100` as argument and first value comes after 50ms from - * the moment of subscription, this value will be simply re-emitted by the resulting - * Observable. If however after that 100ms passes without a second value being emitted, - * stream will end with an error and source Observable will be unsubscribed. - * These checks are performed throughout whole lifecycle of Observable - from the moment - * it was subscribed to, until it completes or errors itself. Thus every value must be - * emitted within specified period since previous value. - * - * If provided argument was Date, returned Observable behaves differently. It throws - * if Observable did not complete before provided Date. This means that periods between - * emission of particular values do not matter in this case. If Observable did not complete - * before provided Date, source Observable will be unsubscribed. Other than that, resulting - * stream behaves just as source Observable. - * - * `timeout` accepts also a Scheduler as a second parameter. It is used to schedule moment (or moments) - * when returned Observable will check if source stream emitted value or completed. - * - * @example Check if ticks are emitted within certain timespan - * const seconds = Rx.Observable.interval(1000); - * - * seconds.timeout(1100) // Let's use bigger timespan to be safe, - * // since `interval` might fire a bit later then scheduled. - * .subscribe( - * value => console.log(value), // Will emit numbers just as regular `interval` would. - * err => console.log(err) // Will never be called. - * ); - * - * seconds.timeout(900).subscribe( - * value => console.log(value), // Will never be called. - * err => console.log(err) // Will emit error before even first value is emitted, - * // since it did not arrive within 900ms period. - * ); - * - * @example Use Date to check if Observable completed - * const seconds = Rx.Observable.interval(1000); - * - * seconds.timeout(new Date("December 17, 2020 03:24:00")) - * .subscribe( - * value => console.log(value), // Will emit values as regular `interval` would - * // until December 17, 2020 at 03:24:00. - * err => console.log(err) // On December 17, 2020 at 03:24:00 it will emit an error, - * // since Observable did not complete by then. - * ); - * - * @see {@link timeoutWith} - * - * @param {number|Date} due Number specifying period within which Observable must emit values - * or Date specifying before when Observable should complete - * @param {Scheduler} [scheduler] Scheduler controlling when timeout checks occur. - * @return {Observable} Observable that mirrors behaviour of source, unless timeout checks fail. - * @method timeout - * @owner Observable - */ -function timeout(due, scheduler) { - if (scheduler === void 0) { scheduler = async_1.async; } - var absoluteTimeout = isDate_1.isDate(due); - var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due); - return function (source) { return source.lift(new TimeoutOperator(waitFor, absoluteTimeout, scheduler, new TimeoutError_1.TimeoutError())); }; -} -exports.timeout = timeout; -var TimeoutOperator = (function () { - function TimeoutOperator(waitFor, absoluteTimeout, scheduler, errorInstance) { - this.waitFor = waitFor; - this.absoluteTimeout = absoluteTimeout; - this.scheduler = scheduler; - this.errorInstance = errorInstance; - } - TimeoutOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TimeoutSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.scheduler, this.errorInstance)); - }; - return TimeoutOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var TimeoutSubscriber = (function (_super) { - __extends(TimeoutSubscriber, _super); - function TimeoutSubscriber(destination, absoluteTimeout, waitFor, scheduler, errorInstance) { - _super.call(this, destination); - this.absoluteTimeout = absoluteTimeout; - this.waitFor = waitFor; - this.scheduler = scheduler; - this.errorInstance = errorInstance; - this.action = null; - this.scheduleTimeout(); - } - TimeoutSubscriber.dispatchTimeout = function (subscriber) { - subscriber.error(subscriber.errorInstance); - }; - TimeoutSubscriber.prototype.scheduleTimeout = function () { - var action = this.action; - if (action) { - // Recycle the action if we've already scheduled one. All the production - // Scheduler Actions mutate their state/delay time and return themeselves. - // VirtualActions are immutable, so they create and return a clone. In this - // case, we need to set the action reference to the most recent VirtualAction, - // to ensure that's the one we clone from next time. - this.action = action.schedule(this, this.waitFor); - } - else { - this.add(this.action = this.scheduler.schedule(TimeoutSubscriber.dispatchTimeout, this.waitFor, this)); - } - }; - TimeoutSubscriber.prototype._next = function (value) { - if (!this.absoluteTimeout) { - this.scheduleTimeout(); - } - _super.prototype._next.call(this, value); - }; - TimeoutSubscriber.prototype._unsubscribe = function () { - this.action = null; - this.scheduler = null; - this.errorInstance = null; - }; - return TimeoutSubscriber; -}(Subscriber_1.Subscriber)); - -},{"../Subscriber":36,"../scheduler/async":212,"../util/TimeoutError":222,"../util/isDate":228}],205:[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 */ -/** - * 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. - * - * 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. - * - * - * - * `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 On every click event, emit an array with the latest timer event plus the click event - * 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]; - } - 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; -}()); -/** - * 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)); - } - } - 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":237}],206:[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 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} - * @method zip - * @owner Observable - */ -function zip() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i - 0] = arguments[_i]; - } - return function zipOperatorFunction(source) { - return source.lift.call(zipStatic.apply(void 0, [source].concat(observables))); - }; -} -exports.zip = zip; -/* 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 Combine age and name from different sources - * - * let age$ = Observable.of(27, 25, 29); - * let name$ = Observable.of('Foo', 'Bar', 'Beer'); - * let isDev$ = Observable.of(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} - * @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(); - } - return new ArrayObservable_1.ArrayObservable(observables).lift(new ZipOperator(project)); -} -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; - } - 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":93,"../symbol/iterator":214,"../util/isArray":226,"../util/subscribeToResult":237}],207:[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 extends Subscription { - * new (scheduler: Scheduler, work: (state?: T) => void); - * schedule(state?: T, delay: number = 0): Subscription; - * } - * ``` - * - * @class Action - */ -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}],208:[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); + if (Boolean(predicateResult)) { + destination.next(value); + } + else { + destination.complete(); } - 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); + return TakeWhileSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":55}],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 __()); }; - 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; +})(); +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)); }; - /** - * 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'); +} +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; } - this.pending = false; - var error = this._execute(state, delay); - if (error) { - return error; + 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; } - 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); + 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); }; - AsyncAction.prototype._execute = function (state, delay) { - var errored = false; - var errorValue = undefined; + TapSubscriber.prototype._error = function (err) { try { - this.work(state); - } - catch (e) { - errored = true; - errorValue = !!e && e || new Error(e); + this._tapError.call(this._context, err); } - if (errored) { - this.unsubscribe(); - return errorValue; + catch (err) { + this.destination.error(err); + return; } + this.destination.error(err); }; - 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); + TapSubscriber.prototype._complete = function () { + try { + this._tapComplete.call(this._context); } - if (id != null) { - this.id = this.recycleAsyncId(scheduler, id, null); + catch (err) { + this.destination.error(err); + return; } - this.delay = null; + return this.destination.complete(); }; - return AsyncAction; -}(Action_1.Action)); -exports.AsyncAction = AsyncAction; + return TapSubscriber; +}(Subscriber_1.Subscriber)); -},{"../util/root":236,"./Action":207}],209:[function(require,module,exports){ +},{"../Subscriber":55,"../util/isFunction":222,"../util/noop":230}],176:[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 __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 }; -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; +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; } - 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; + 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(); } - } while (action = actions.shift()); // exhaust the scheduler queue - this.active = false; - if (error) { - while (action = actions.shift()) { - action.unsubscribe(); + else { + this.throttle(value); } - throw error; } }; - return AsyncScheduler; -}(Scheduler_1.Scheduler)); -exports.AsyncScheduler = AsyncScheduler; - -},{"../Scheduler":33}],210:[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); + ThrottleSubscriber.prototype.send = function () { + var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue; + if (_hasValue) { + this.destination.next(_sendValue); + this.throttle(_sendValue); } - this.delay = delay; - this.state = state; - this.scheduler.flush(this); - return this; + this._hasValue = false; + this._sendValue = null; }; - QueueAction.prototype.execute = function (state, delay) { - return (delay > 0 || this.closed) ? - _super.prototype.execute.call(this, state, delay) : - this._execute(state, delay); + ThrottleSubscriber.prototype.throttle = function (value) { + var duration = this.tryDurationSelector(value); + if (duration) { + this.add(this._throttled = subscribeToResult_1.subscribeToResult(this, duration)); + } }; - 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); + ThrottleSubscriber.prototype.tryDurationSelector = function (value) { + try { + return this.durationSelector(value); + } + catch (err) { + this.destination.error(err); + return null; } - // Otherwise flush the scheduler starting with this action. - return scheduler.flush(this); }; - return QueueAction; -}(AsyncAction_1.AsyncAction)); -exports.QueueAction = QueueAction; - -},{"./AsyncAction":208}],211:[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; - -},{"./AsyncScheduler":209}],212:[function(require,module,exports){ -"use strict"; -var AsyncAction_1 = require('./AsyncAction'); -var AsyncScheduler_1 = require('./AsyncScheduler'); -/** - * - * Async Scheduler - * - * Schedule task as if you used setTimeout(task, duration) - * - * `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 Use async scheduler to delay task - * const task = () => console.log('it works!'); - * - * Rx.Scheduler.async.schedule(task, 2000); - * - * // After 2 seconds logs: - * // "it works!" - * - * - * @example Use async scheduler to repeat task in intervals - * 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); - -},{"./AsyncAction":208,"./AsyncScheduler":209}],213:[function(require,module,exports){ -"use strict"; -var QueueAction_1 = require('./QueueAction'); -var QueueScheduler_1 = require('./QueueScheduler'); -/** - * - * Queue Scheduler - * - * Put every next task on a queue, instead of executing it immediately - * - * `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 Schedule recursively first, then do something - * - * 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 Reschedule itself recursively - * - * 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); - -},{"./QueueAction":210,"./QueueScheduler":211}],214:[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'); + ThrottleSubscriber.prototype.throttlingDone = function () { + var _a = this, _throttled = _a._throttled, _trailing = _a._trailing; + if (_throttled) { + _throttled.unsubscribe(); } - 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; - } - } + this._throttled = null; + if (_trailing) { + this.send(); } - return '@@iterator'; - } -} -exports.symbolIteratorPonyfill = symbolIteratorPonyfill; -exports.iterator = symbolIteratorPonyfill(root_1.root); -/** - * @deprecated use iterator instead - */ -exports.$$iterator = exports.iterator; + }; + ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.throttlingDone(); + }; + ThrottleSubscriber.prototype.notifyComplete = function () { + this.throttlingDone(); + }; + return ThrottleSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); -},{"../util/root":236}],215:[function(require,module,exports){ +},{"../OuterSubscriber":50,"../util/subscribeToResult":238}],177:[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'; +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 $$observable; + 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.getSymbolObservable = getSymbolObservable; -exports.observable = getSymbolObservable(root_1.root); -/** - * @deprecated use observable instead - */ -exports.$$observable = exports.observable; - -},{"../util/root":236}],216:[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; - -},{"../util/root":236}],217:[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); +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 if (root.msRequestAnimationFrame) { - this.cancelAnimationFrame = root.msCancelAnimationFrame.bind(root); - this.requestAnimationFrame = root.msRequestAnimationFrame.bind(root); + else { + this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this })); + if (this.leading) { + this.destination.next(value); + } } - else if (root.oRequestAnimationFrame) { - this.cancelAnimationFrame = root.oCancelAnimationFrame.bind(root); - this.requestAnimationFrame = root.oRequestAnimationFrame.bind(root); + }; + ThrottleTimeSubscriber.prototype._complete = function () { + if (this._hasTrailingValue) { + this.destination.next(this._trailingValue); + this.destination.complete(); } 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); - -},{"./root":236}],218:[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; - -},{}],219:[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; - -},{}],220:[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; - -},{}],221:[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 = []; + this.destination.complete(); } - MinimalSet.prototype.add = function (value) { - if (!this.has(value)) { - this._values.push(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; } - }; - 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; - }()); + throttled.unsubscribe(); + this.remove(throttled); + this.throttled = null; + } + }; + return ThrottleTimeSubscriber; +}(Subscriber_1.Subscriber)); +function dispatchNext(arg) { + var subscriber = arg.subscriber; + subscriber.clearThrottle(); } -exports.minimalSetImpl = minimalSetImpl; -exports.Set = root_1.root.Set || minimalSetImpl(); - -},{"./root":236}],222:[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 duetime elapses. - * - * @see {@link timeout} - * - * @class TimeoutError - */ -var TimeoutError = (function (_super) { - __extends(TimeoutError, _super); - function TimeoutError() { - var err = _super.call(this, 'Timeout has occurred'); - this.name = err.name = 'TimeoutError'; - this.stack = err.stack; - this.message = err.message; - } - return TimeoutError; -}(Error)); -exports.TimeoutError = TimeoutError; -},{}],223:[function(require,module,exports){ +},{"../Subscriber":55,"../scheduler/async":204,"./throttle":176}],178:[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 __()); +Object.defineProperty(exports, "__esModule", { value: true }); +var tap_1 = require("./tap"); +var EmptyError_1 = require("../util/EmptyError"); +exports.throwIfEmpty = function (errorFactory) { + if (errorFactory === void 0) { errorFactory = defaultErrorFactory; } + return tap_1.tap({ + hasValue: false, + next: function () { this.hasValue = true; }, + complete: function () { + if (!this.hasValue) { + throw errorFactory(); + } + } + }); }; -/** - * 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; - -},{}],224:[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: {} }; - -},{}],225:[function(require,module,exports){ -"use strict"; -function identity(x) { - return x; +function defaultErrorFactory() { + return new EmptyError_1.EmptyError(); } -exports.identity = identity; - -},{}],226:[function(require,module,exports){ -"use strict"; -exports.isArray = Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); - -},{}],227:[function(require,module,exports){ -"use strict"; -exports.isArrayLike = (function (x) { return x && typeof x.length === 'number'; }); -},{}],228:[function(require,module,exports){ +},{"../util/EmptyError":210,"./tap":175}],179:[function(require,module,exports){ "use strict"; -function isDate(value) { - return value instanceof Date && !isNaN(+value); +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.isDate = isDate; +exports.timeInterval = timeInterval; +var TimeInterval = (function () { + function TimeInterval(value, interval) { + this.value = value; + this.interval = interval; + } + return TimeInterval; +}()); +exports.TimeInterval = TimeInterval; -},{}],229:[function(require,module,exports){ +},{"../observable/defer":64,"../scheduler/async":204,"./map":128,"./scan":157}],180:[function(require,module,exports){ "use strict"; -function isFunction(x) { - return typeof x === 'function'; +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.isFunction = isFunction; +exports.timeout = timeout; -},{}],230:[function(require,module,exports){ +},{"../observable/throwError":85,"../scheduler/async":204,"../util/TimeoutError":213,"./timeoutWith":181}],181:[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; +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.isNumeric = isNumeric; -; +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)); -},{"../util/isArray":226}],231:[function(require,module,exports){ +},{"../OuterSubscriber":50,"../scheduler/async":204,"../util/isDate":221,"../util/subscribeToResult":238}],182:[function(require,module,exports){ "use strict"; -function isObject(x) { - return x != null && typeof x === 'object'; +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.isObject = isObject; +exports.timestamp = timestamp; +var Timestamp = (function () { + function Timestamp(value, timestamp) { + this.value = value; + this.timestamp = timestamp; + } + return Timestamp; +}()); +exports.Timestamp = Timestamp; -},{}],232:[function(require,module,exports){ +},{"../scheduler/async":204,"./map":128}],183:[function(require,module,exports){ "use strict"; -function isPromise(value) { - return value && typeof value.subscribe !== 'function' && typeof value.then === 'function'; +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; } -exports.isPromise = isPromise; - -},{}],233:[function(require,module,exports){ -"use strict"; -function isScheduler(value) { - return value && typeof value.schedule === 'function'; +function toArray() { + return reduce_1.reduce(toArrayReducer, []); } -exports.isScheduler = isScheduler; +exports.toArray = toArray; -},{}],234:[function(require,module,exports){ +},{"./reduce":149}],184:[function(require,module,exports){ "use strict"; -/* tslint:disable:no-empty */ -function noop() { } -exports.noop = noop; +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)); -},{}],235:[function(require,module,exports){ +},{"../OuterSubscriber":50,"../Subject":53,"../util/subscribeToResult":238}],185:[function(require,module,exports){ "use strict"; -var noop_1 = require('./noop'); -/* tslint:enable:max-line-length */ -function pipe() { - var fns = []; - for (var _i = 0; _i < arguments.length; _i++) { - fns[_i - 0] = arguments[_i]; +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 pipeFromArray(fns); + 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.pipe = pipe; -/* @internal */ -function pipeFromArray(fns) { - if (!fns) { - return noop_1.noop; +exports.windowCount = windowCount; +var WindowCountOperator = (function () { + function WindowCountOperator(windowSize, startWindowEvery) { + this.windowSize = windowSize; + this.startWindowEvery = startWindowEvery; } - if (fns.length === 1) { - return fns[0]; + 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; } - return function piped(input) { - return fns.reduce(function (prev, fn) { return fn(prev); }, input); + 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); + } }; -} -exports.pipeFromArray = pipeFromArray; + 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)); -},{"./noop":234}],236:[function(require,module,exports){ -(function (global){ +},{"../Subject":53,"../Subscriber":55}],186:[function(require,module,exports){ "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)'); +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 __()); + }; })(); - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],237:[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; +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; } - if (result instanceof Observable_1.Observable) { - if (result._isScalar) { - destination.next(result.value); - destination.complete(); - return null; + 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 { - destination.syncErrorThrowable = true; - return result.subscribe(destination); + var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan }; + _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState)); } + return _this; } - else if (isArrayLike_1.isArrayLike(result)) { - for (var i = 0, len = result.length; i < len && !destination.closed; i++) { - destination.next(result[i]); + 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); + } + } } - if (!destination.closed) { - destination.complete(); + }; + WindowTimeSubscriber.prototype._error = function (err) { + var windows = this.windows; + while (windows.length > 0) { + windows.shift().error(err); } - } - 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; + 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(); } - } 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)); } + 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); } - 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; + state.window = subscriber.openWindow(); + this.schedule(state, windowTimeSpan); } -exports.subscribeToResult = subscribeToResult; - -},{"../InnerSubscriber":27,"../Observable":29,"../symbol/iterator":214,"../symbol/observable":215,"./isArrayLike":227,"./isObject":231,"./isPromise":232,"./root":236}],238:[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 (!nextOrObserver && !error && !complete) { - return new Subscriber_1.Subscriber(Observer_1.empty); +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); } - return new Subscriber_1.Subscriber(nextOrObserver, error, complete); + subscriber.closeWindow(window); } -exports.toSubscriber = toSubscriber; -},{"../Observer":30,"../Subscriber":36,"../symbol/rxSubscriber":216}],239:[function(require,module,exports){ +},{"../Subject":53,"../Subscriber":55,"../scheduler/async":204,"../util/isNumeric":225,"../util/isScheduler":229}],187:[function(require,module,exports){ "use strict"; -var errorObject_1 = require('./errorObject'); -var tryCatchTarget; -function tryCatcher() { - try { - return tryCatchTarget.apply(this, arguments); +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); } - catch (e) { - errorObject_1.errorObject.e = e; - return errorObject_1.errorObject; + 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 tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +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; } -} -function tryCatch(fn) { - tryCatchTarget = fn; - return tryCatcher; -} -exports.tryCatch = tryCatch; -; - -},{"./errorObject":224}],240:[function(require,module,exports){ -// threejs.org/license -(function(m,ja){"object"===typeof exports&&"undefined"!==typeof module?ja(exports):"function"===typeof define&&define.amd?define(["exports"],ja):ja(m.THREE=m.THREE||{})})(this,function(m){function ja(){}function C(a,b){this.x=a||0;this.y=b||0}function K(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0=d||0 0 ) {\n\t\tfloat fogFactor = 0.0;\n\t\tif ( fogType == 1 ) {\n\t\t\tfogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t\t} else {\n\t\t\tconst float LOG2 = 1.442695;\n\t\t\tfogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );\n\t\t\tfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n\t\t}\n\t\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n\t}\n}"].join("\n")); -b.compileShader(y);b.compileShader(Y);b.attachShader(M,y);b.attachShader(M,Y);b.linkProgram(M);ha=M;B=b.getAttribLocation(ha,"position");J=b.getAttribLocation(ha,"uv");f=b.getUniformLocation(ha,"uvOffset");g=b.getUniformLocation(ha,"uvScale");h=b.getUniformLocation(ha,"rotation");k=b.getUniformLocation(ha,"scale");l=b.getUniformLocation(ha,"color");q=b.getUniformLocation(ha,"map");n=b.getUniformLocation(ha,"opacity");t=b.getUniformLocation(ha,"modelViewMatrix");r=b.getUniformLocation(ha,"projectionMatrix"); -m=b.getUniformLocation(ha,"fogType");v=b.getUniformLocation(ha,"fogDensity");w=b.getUniformLocation(ha,"fogNear");x=b.getUniformLocation(ha,"fogFar");z=b.getUniformLocation(ha,"fogColor");b.getUniformLocation(ha,"fogDepth");I=b.getUniformLocation(ha,"alphaTest");M=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");M.width=8;M.height=8;y=M.getContext("2d");y.fillStyle="white";y.fillRect(0,0,8,8);He=new tc(M)}c.useProgram(ha);c.initAttributes();c.enableAttribute(B);c.enableAttribute(J); -c.disableUnusedAttributes();c.disable(b.CULL_FACE);c.enable(b.BLEND);b.bindBuffer(b.ARRAY_BUFFER,za);b.vertexAttribPointer(B,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(J,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,la);b.uniformMatrix4fv(r,!1,V.projectionMatrix.elements);c.activeTexture(b.TEXTURE0);b.uniform1i(q,0);y=M=0;(Y=p.fog)?(b.uniform3f(z,Y.color.r,Y.color.g,Y.color.b),Y.isFog?(b.uniform1f(w,Y.near),b.uniform1f(x,Y.far),b.uniform1i(m,1),y=M=1):Y.isFogExp2&&(b.uniform1f(v,Y.density), -b.uniform1i(m,2),y=M=2)):(b.uniform1i(m,0),y=M=0);for(var A=0,ua=u.length;Ab&&(b=a[c]);return b}function D(){Object.defineProperty(this,"id",{value:Pf+=2});this.uuid=R.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 Lb(a,b,c,d,e,f){N.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};this.fromBufferGeometry(new jb(a,b,c,d,e,f));this.mergeVertices()}function jb(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,m,ta,za,la){var z=f/ta,u=g/za,v=f/2,w=g/2,I=m/2;g=ta+1;var B=za+1,x=f=0,J,y,C=new p;for(y=0;yl;l++){if(n=d[l])if(h=n[0],n=n[1]){q&&e.addAttribute("morphTarget"+l,q[h]);f&&e.addAttribute("morphNormal"+l,f[h]);c[l]=n;continue}c[l]=0}g.getUniforms().setValue(a,"morphTargetInfluences",c)}}}function Xf(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:d===a.POINTS&&(c.points+=h)};this.renderInstances=function(g,h,k){var l=b.get("ANGLE_instanced_arrays");null===l?console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."):(l.drawElementsInstancedANGLE(d,k,e,h*f,g.maxInstancedCount),c.calls++,c.vertices+= -k*g.maxInstancedCount,d===a.TRIANGLES?c.faces+=g.maxInstancedCount*k/3:d===a.POINTS&&(c.points+=g.maxInstancedCount*k))}}function Yf(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:d===a.POINTS&&(c.points+=f)};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:d===a.POINTS&&(c.points+=e.maxInstancedCount*g)}}}function Zf(a,b,c){function d(a){a=a.target;var g=e[a.id];null!==g.index&&b.remove(g.index);for(var k in g.attributes)b.remove(g.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[g.id])b.remove(k),delete f[g.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 D).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,g=d.length;e/gm,function(a,c){a=W[c];if(void 0===a)throw Error("Can not resolve #include <"+c+">");return Sd(a)})}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);cb||a.height>b){b/=Math.max(a.width,a.height);var c=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");c.width=Math.floor(a.width*b);c.height=Math.floor(a.height*b);c.getContext("2d").drawImage(a, -0,0,a.width,a.height,0,0,c.width,c.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+c.width+"x"+c.height,a);return c}return a}function k(a){return R.isPowerOfTwo(a.width)&&R.isPowerOfTwo(a.height)}function l(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 n(b){b=b.target;b.removeEventListener("dispose",n);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 t(b){b=b.target;b.removeEventListener("dispose",t);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,q){var t=d.get(b);if(0p;p++)u[p]=q||r?r?b.image[p].image:b.image[p]:h(b.image[p],e.maxCubemapSize); -var v=k(u[0]),w=f.convert(b.format),z=f.convert(b.type);m(a.TEXTURE_CUBE_MAP,b,v);for(p=0;6>p;p++)if(q)for(var x,I=u[p].mipmaps,y=0,C=I.length;yq;q++)e.__webglFramebuffer[q]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);m(a.TEXTURE_CUBE_MAP,b.texture,n);for(q=0;6>q;q++)p(e.__webglFramebuffer[q],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+q); -l(b.texture,n)&&a.generateMipmap(a.TEXTURE_CUBE_MAP);c.bindTexture(a.TEXTURE_CUBE_MAP,null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),m(a.TEXTURE_2D,b.texture,n),p(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),l(b.texture,n)&&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(),w(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),w(e.__webglDepthbuffer, -b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture,f=k(b);l(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 lg(){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 mg(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=Z.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+a+" texture units while this GPU supports only "+Z.maxTextures);G+=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);T.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);T.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?T.setTextureCube(b,c):T.setTextureCubeDynamic(b,c)}}();this.getRenderTarget=function(){return H};this.setRenderTarget=function(a){(H=a)&&void 0===U.get(a).__webglFramebuffer&&T.setupRenderTarget(a);var b=null,c=!1;a?(b=U.get(a).__webglFramebuffer,a.isWebGLRenderTargetCube&& -(b=b[a.activeCubeFace],c=!0),Q.copy(a.viewport),S.copy(a.scissor),W=a.scissorTest):(Q.copy(ca).multiplyScalar(O),S.copy(ea).multiplyScalar(O),W=Oe);M!==b&&(F.bindFramebuffer(F.FRAMEBUFFER,b),M=b);ba.viewport(Q);ba.scissor(S);ba.setScissorTest(W);c&&(c=U.get(a.texture),F.framebufferTexture2D(F.FRAMEBUFFER,F.COLOR_ATTACHMENT0,F.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,c.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=function(a,b,c,d,e,f){if(a&&a.isWebGLRenderTarget){var g=U.get(a).__webglFramebuffer; -if(g){var h=!1;g!==M&&(F.bindFramebuffer(F.FRAMEBUFFER,g),h=!0);try{var l=a.texture,k=l.format,n=l.type;1023!==k&&oa.convert(k)!==F.getParameter(F.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===n||oa.convert(n)===F.getParameter(F.IMPLEMENTATION_COLOR_READ_TYPE)||1015===n&&(ia.get("OES_texture_float")||ia.get("WEBGL_color_buffer_float"))||1016===n&&ia.get("EXT_color_buffer_half_float")? -F.checkFramebufferStatus(F.FRAMEBUFFER)===F.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&F.readPixels(b,c,d,e,oa.convert(k),oa.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{h&&F.bindFramebuffer(F.FRAMEBUFFER,M)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")}} -function Ob(a,b){this.name="";this.color=new H(a);this.density=void 0!==b?b:2.5E-4}function Pb(a,b,c){this.name="";this.color=new H(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function od(){A.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function Xd(a,b,c,d,e){A.call(this);this.lensFlares=[];this.positionScreen=new p;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)}function Za(a){Q.call(this);this.type="SpriteMaterial"; -this.color=new H(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}function Cc(a){A.call(this);this.type="Sprite";this.material=void 0!==a?a:new Za}function Dc(){A.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function Ec(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 for(console.warn("THREE.Skeleton boneInverses is the wrong length."), -this.boneInverses=[],a=0,b=this.bones.length;a=a.HAVE_CURRENT_DATA&&(q.needsUpdate=!0);requestAnimationFrame(l)}ea.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1;var q=this;requestAnimationFrame(l)} -function Rb(a,b,c,d,e,f,g,h,k,l,q,n){ea.call(this,null,f,g,h,k,l,d,e,q,n);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function Gc(a,b,c,d,e,f,g,h,k,l){l=void 0!==l?l:1026;if(1026!==l&&1027!==l)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===c&&1026===l&&(c=1012);void 0===c&&1027===l&&(c=1020);ea.call(this,null,d,e,f,g,h,l,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 Sb(a){D.call(this);this.type="WireframeGeometry";var b=[],c,d,e,f=[0,0],g={},h=["a","b","c"];if(a&&a.isGeometry){var k=a.faces;var l=0;for(d=k.length;lc;c++){var n=q[h[c]];var t=q[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)l=g[n],h=a.vertices[l.index1],b.push(h.x,h.y,h.z),h=a.vertices[l.index2],b.push(h.x,h.y,h.z)}else if(a&&a.isBufferGeometry){var h= -new p;if(null!==a.index){k=a.attributes.position;q=a.index;var r=a.groups;0===r.length&&(r=[{start:0,count:q.count,materialIndex:0}]);a=0;for(e=r.length;ac;c++)n=q.getX(l+c),t=q.getX(l+(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)l=g[n],h.fromBufferAttribute(k,l.index1),b.push(h.x,h.y,h.z),h.fromBufferAttribute(k,l.index2),b.push(h.x,h.y,h.z)}else for(k=a.attributes.position, -l=0,d=k.count/3;lc;c++)g=3*l+c,h.fromBufferAttribute(k,g),b.push(h.x,h.y,h.z),g=3*l+(c+1)%3,h.fromBufferAttribute(k,g),b.push(h.x,h.y,h.z)}this.addAttribute("position",new y(b,3))}function Hc(a,b,c){N.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Tb(a,b,c));this.mergeVertices()}function Tb(a,b,c){D.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h= -new p,k=new p,l=new p,q=new p,n=new p,t,r,m=b+1;for(t=0;t<=c;t++){var v=t/c;for(r=0;r<=b;r++){var w=r/b,k=a(w,v,k);e.push(k.x,k.y,k.z);0<=w-1E-5?(l=a(w-1E-5,v,l),q.subVectors(k,l)):(l=a(w+1E-5,v,l),q.subVectors(l,k));0<=v-1E-5?(l=a(w,v-1E-5,l),n.subVectors(k,l)):(l=a(w,v+1E-5,l),n.subVectors(l,k));h.crossVectors(q,n).normalize();f.push(h.x,h.y,h.z);g.push(w,v)}}for(t=0;td&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}D.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 p,d=new p,g=new p,h=0;he&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute("position",new y(h,3));this.addAttribute("normal",new y(h.slice(),3));this.addAttribute("uv",new y(k,2));0===d?this.computeVertexNormals(): -this.normalizeNormals()}function Jc(a,b){N.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ub(a,b));this.mergeVertices()}function Ub(a,b){qa.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 Kc(a,b){N.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new nb(a,b));this.mergeVertices()} -function nb(a,b){qa.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 Lc(a,b){N.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Vb(a,b));this.mergeVertices()}function Vb(a,b){var c=(1+Math.sqrt(5))/2;qa.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 Mc(a,b){N.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Wb(a,b));this.mergeVertices()}function Wb(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;qa.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 Nc(a,b,c,d,e,f){N.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 Xb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Xb(a,b,c,d,e){function f(e){q=a.getPointAt(e/b,q);var f=g.normals[e];e=g.binormals[e];for(t=0;t<=d;t++){var l=t/d*Math.PI*2,n=Math.sin(l),l=-Math.cos(l);k.x=l*f.x+n*e.x;k.y=l*f.y+n*e.y;k.z=l*f.z+n*e.z;k.normalize();u.push(k.x, -k.y,k.z);h.x=q.x+c*k.x;h.y=q.y+c*k.y;h.z=q.z+c*k.z;m.push(h.x,h.y,h.z)}}D.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,k=new p,l=new C,q=new p,n,t,m=[],u=[],v=[],w=[];for(n=0;nq;q++){var n=l[f[q]];var t=l[f[(q+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.addAttribute("position", -new y(c,3))}function pb(a,b,c,d,e,f,g,h){N.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 Sa(a,b,c,d,e,f,g,h));this.mergeVertices()}function Sa(a,b,c,d,e,f,g,h){function k(c){var e,f=new C,k=new p,r=0,v=!0===c?a:b,z=!0===c?1:-1;var y=u;for(e=1;e<=d;e++)n.push(0,w*z,0),t.push(0,z,0),m.push(.5,.5),u++;var A=u;for(e=0;e<=d;e++){var D=e/d*h+g,L=Math.cos(D), -D=Math.sin(D);k.x=v*D;k.y=w*z;k.z=v*L;n.push(k.x,k.y,k.z);t.push(0,z,0);f.x=.5*L+.5;f.y=.5*D*z+.5;m.push(f.x,f.y);u++}for(e=0;ethis.duration&&this.resetDuration();this.optimize()}function Id(a){this.manager=void 0!==a?a:wa;this.textures={}}function ae(a){this.manager=void 0!==a?a:wa}function kc(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}function be(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."), -a=void 0);this.manager=void 0!==a?a:wa;this.withCredentials=!1}function Re(a){this.manager=void 0!==a?a:wa;this.texturePath=""}function Se(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 yb(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function zb(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 S(){this.type="Curve";this.arcLengthDivisions=200}function Ka(a,b){S.call(this);this.type="LineCurve";this.v1=a|| -new C;this.v2=b||new C}function Ab(){S.call(this);this.type="CurvePath";this.curves=[];this.autoClose=!1}function Na(a,b,c,d,e,f,g,h){S.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 ab(a){S.call(this);this.type="SplineCurve";this.points=a||[]}function bb(a,b,c,d){S.call(this);this.type="CubicBezierCurve";this.v0=a||new C;this.v1=b||new C;this.v2= -c||new C;this.v3=d||new C}function cb(a,b,c){S.call(this);this.type="QuadraticBezierCurve";this.v0=a||new C;this.v1=b||new C;this.v2=c||new C}function Bb(a){Ab.call(this);this.type="Path";this.currentPoint=new C;a&&this.setFromPoints(a)}function Cb(a){Bb.call(this,a);this.type="Shape";this.holes=[]}function ce(){this.type="ShapePath";this.subPaths=[];this.currentPath=null}function de(a){this.type="Font";this.data=a}function Te(a){this.manager=void 0!==a?a:wa}function ee(a){this.manager=void 0!==a? -a:wa}function Ue(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new U;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new U;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1}function $c(a,b,c){A.call(this);this.type="CubeCamera";var d=new U(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new p(1,0,0));this.add(d);var e=new U(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new p(-1,0,0));this.add(e);var f=new U(90,1,a,b);f.up.set(0,0,1);f.lookAt(new p(0,1,0)); -this.add(f);var g=new U(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new p(0,-1,0));this.add(g);var h=new U(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new p(0,0,1));this.add(h);var k=new U(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new p(0,0,-1));this.add(k);this.renderTarget=new Ib(c,c,{format:1022,magFilter:1006,minFilter:1006});this.renderTarget.texture.name="CubeCamera";this.update=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,l=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=l;c.activeCubeFace=5;a.render(b,k,c);a.setRenderTarget(null)};this.clear=function(a,b,c,d){for(var e=this.renderTarget,f=0;6>f;f++)e.activeCubeFace=f,a.setRenderTarget(e),a.clear(b,c,d);a.setRenderTarget(null)}}function fe(){A.call(this);this.type="AudioListener";this.context=ge.getContext();this.gain= -this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function lc(a){A.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.offset=this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function he(a){lc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)} -function ie(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 je(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 Ve(a, -b,c){c=c||na.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function na(a,b,c){this.path=b;this.parsedPath=c||na.parseTrackName(b);this.node=na.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function We(){this.uuid=R.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 Xe(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 Ye(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Jd(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."), -a=b);this.value=a}function ke(){D.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function le(a,b,c,d){this.uuid=R.generateUUID();this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function mc(a,b){this.uuid=R.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 me(a,b,c){mc.call(this,a,b);this.meshPerAttribute=c||1}function ne(a, -b,c){P.call(this,a,b);this.meshPerAttribute=c||1}function Ze(a,b,c,d){this.ray=new lb(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 $e(a,b){return a.distance-b.distance}function oe(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e= -a.length;dc;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 y(b,3));b=new O({fog:!1});this.cone=new ca(a,b);this.add(this.cone);this.update()}function df(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;ca?-1:0e;e++)8===e||13===e||18===e||23===e?d+="-":14===e?d+="4":(2>=b&&(b=33554432+16777216*Math.random()|0),c=b&15,b>>=4,d+=a[19===e?c&3|8:c]);return d}}(),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*R.DEG2RAD},radToDeg:function(a){return a*R.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))}};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)},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(){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)},manhattanLength: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},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){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);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}});Object.assign(K.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,l,q,n,t,m,p,v){var r=this.elements;r[0]=a;r[4]=b;r[8]=c;r[12]=d;r[1]=e;r[5]=f;r[9]=g;r[13]=h;r[2]=k;r[6]=l;r[10]=q;r[14]=n;r[3]=t;r[7]=m;r[11]=p;r[15]=v;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 p;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.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),g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e);if("XYZ"===a.order){var k=f*h;var l=f*e;var q=c*h;a=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=l+q*d;b[5]=k-a*d;b[9]=-c*g;b[2]=a-k*d;b[6]=q+l*d;b[10]=f*g}else"YXZ"===a.order?(k=g*h,l=g*e,q=d*h,a=d*e,b[0]=k+a*c,b[4]=q*c-l,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=l*c-q,b[6]=a+k*c,b[10]=f*g):"ZXY"===a.order?(k=g*h,l=g*e,q=d*h,a=d*e,b[0]=k-a*c,b[4]=-f*e,b[8]=q+l*c,b[1]=l+q*c,b[5]=f*h,b[9]= -a-k*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(k=f*h,l=f*e,q=c*h,a=c*e,b[0]=g*h,b[4]=q*d-l,b[8]=k*d+a,b[1]=g*e,b[5]=a*d+k,b[9]=l*d-q,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(k=f*g,l=f*d,q=c*g,a=c*d,b[0]=g*h,b[4]=a-k*e,b[8]=q*e+l,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=l*e+q,b[10]=k-a*e):"XZY"===a.order&&(k=f*g,l=f*d,q=c*g,a=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=k*e+a,b[5]=f*h,b[9]=l*e-q,b[2]=q*e-l,b[6]=c*h,b[10]=a*e+k);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 l=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]=l-f;b[8]=c+h;b[1]=l+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+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 p,b=new p,c=new p;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; -b=this.elements;a=c[0];var e=c[4],f=c[8],g=c[12],h=c[1],k=c[5],l=c[9],q=c[13],n=c[2],m=c[6],r=c[10],p=c[14],v=c[3],w=c[7],x=c[11],c=c[15],z=d[0],I=d[4],B=d[8],J=d[12],y=d[1],C=d[5],A=d[9],D=d[13],E=d[2],H=d[6],L=d[10],Y=d[14],N=d[3],M=d[7],V=d[11],d=d[15];b[0]=a*z+e*y+f*E+g*N;b[4]=a*I+e*C+f*H+g*M;b[8]=a*B+e*A+f*L+g*V;b[12]=a*J+e*D+f*Y+g*d;b[1]=h*z+k*y+l*E+q*N;b[5]=h*I+k*C+l*H+q*M;b[9]=h*B+k*A+l*L+q*V;b[13]=h*J+k*D+l*Y+q*d;b[2]=n*z+m*y+r*E+p*N;b[6]=n*I+m*C+r*H+p*M;b[10]=n*B+m*A+r*L+p*V;b[14]=n*J+m* -D+r*Y+p*d;b[3]=v*z+w*y+x*E+c*N;b[7]=v*I+w*C+x*H+c*M;b[11]=v*B+w*A+x*L+c*V;b[15]=v*J+w*D+x*Y+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 p;return function(b){for(var c=0,d=b.count;cthis.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,l=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]*=l;b.elements[9]*=l;b.elements[10]*=l;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),l=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*l;g[14]=-((f+e)*l);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}});Object.assign(Z,{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],l=c[d+2];c=c[d+3];d=e[f+0];var q=e[f+1],n=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==q||l!==n){f=1-g;var m=h*d+k*q+l*n+c*e,r=0<=m?1:-1,p=1-m*m;p>Number.EPSILON&&(p=Math.sqrt(p),m=Math.atan2(p,m*r),f=Math.sin(f*m)/p,g=Math.sin(g*m)/p);r*=g;h=h*f+d*r;k=k*f+q*r;l=l*f+n*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+k*k+l*l+c*c),h*=g,k*=g,l*=g,c*=g)}a[b]=h;a[b+1]=k;a[b+2]=l;a[b+3]=c}});Object.defineProperties(Z.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(Z.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;a=a.order;var f=Math.cos,g=Math.sin,h=f(c/2),k=f(d/2),f=f(e/2),c=g(c/2),d=g(d/2),e=g(e/2);"XYZ"===a?(this._x=c*k*f+h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f-c*d*e):"YXZ"===a?(this._x=c*k*f+ -h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f+c*d*e):"ZXY"===a?(this._x=c*k*f-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f-c*d*e):"ZYX"===a?(this._x=c*k*f-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f+c*d*e):"YZX"===a?(this._x=c*k*f+h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f-c*d*e):"XZY"===a&&(this._x=c*k*f-h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f+c*d*e);if(!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],k=b[6],b=b[10],l=c+f+b;0f&&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 p,b;return function(c,d){void 0===a&&(a=new p);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;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=Math.sqrt(1-g*g);if(.001>Math.abs(a))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 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},onChange:function(a){this.onChangeCallback= -a;return this},onChangeCallback:function(){}});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(){var a=new Z;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 Z;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,l=a*d+e*c-f*b,b=-e*b-f*c-g*d;this.x=h*a+b*-e+k*-g-l*-f;this.y=k*a+b*-f+l*-e-h*-g;this.z=l*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 p,b=new p;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)},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){return this.subVectors(b,a).multiplyScalar(c).add(a)},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.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a=new p;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=new p;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(R.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){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(ra.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,k){var l=this.elements;l[0]=a;l[1]=d;l[2]=g;l[3]=b;l[4]=e;l[5]=h;l[6]=c;l[7]=f;l[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 p;return function(b){for(var c=0,d=b.count;cc;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 kf=0;ea.DEFAULT_IMAGE=void 0;ea.DEFAULT_MAPPING=300;Object.defineProperty(ea.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(ea.prototype,ja.prototype,{constructor:ea,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.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],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY}; -if(void 0!==this.image){var d=this.image;void 0===d.uuid&&(d.uuid=R.generateUUID());if(!b&&void 0===a.images[d.uuid]){var e=a.images,f=d.uuid,g=d.uuid;if(d instanceof HTMLCanvasElement)var h=d;else{h=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");h.width=d.width;h.height=d.height;var k=h.getContext("2d");d instanceof ImageData?k.putImageData(d,0,0):k.drawImage(d,0,0,d.width,d.height)}h=2048a.x||1a.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||1a.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(da.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 k=a[6];var l=a[10];if(.01>Math.abs(c-e)&&.01>Math.abs(d-h)&&.01>Math.abs(g-k)){if(.1>Math.abs(c+ -e)&&.1>Math.abs(d+h)&&.1>Math.abs(g+k)&&.1>Math.abs(b+f+l-3))return this.set(1,0,0,0),this;a=Math.PI;b=(b+1)/2;f=(f+1)/2;l=(l+1)/2;c=(c+e)/4;d=(d+h)/4;g=(g+k)/4;b>f&&b>l?.01>b?(k=0,c=h=.707106781):(k=Math.sqrt(b),h=c/k,c=d/k):f>l?.01>f?(k=.707106781,h=0,c=.707106781):(h=Math.sqrt(f),k=c/h,c=g/h):.01>l?(h=k=.707106781,c=0):(c=Math.sqrt(l),k=d/c,h=g/c);this.set(k,h,c,a);return this}a=Math.sqrt((k-g)*(k-g)+(d-h)*(d-h)+(e-c)*(e-c));.001>Math.abs(a)&&(a=1);this.x=(k-g)/a;this.y=(d-h)/a;this.z=(e-c)/a; -this.w=Math.acos((b+f+l-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 da,b=new da);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)},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){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(Hb.prototype,ja.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"})}});Ib.prototype=Object.create(Hb.prototype);Ib.prototype.constructor=Ib;Ib.prototype.isWebGLRenderTargetCube=!0;fb.prototype=Object.create(ea.prototype);fb.prototype.constructor=fb;fb.prototype.isDataTexture=!0;Ua.prototype=Object.create(ea.prototype);Ua.prototype.constructor= -Ua;Ua.prototype.isCubeTexture=!0;Object.defineProperty(Ua.prototype,"images",{get:function(){return this.image},set:function(a){this.image=a}});var Be=new ea,Ce=new Ua,we=[],ye=[],Ae=new Float32Array(16),ze=new Float32Array(9);Ge.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 Od=/([\w\d_]+)(\])?(\[|\.)?/g;gb.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};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 sg={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};Object.assign(H.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);1d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b,c,d){b=R.euclideanModulo(b, -1);c=R.clamp(c,0,1);d=R.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=h?k/(e+f): -k/(2-e-f);switch(e){case b:g=(c-d)/k+(c 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 * 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\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 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}\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, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\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\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\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\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 = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 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 ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 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\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= 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\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform mat3 uvTransform;\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_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 );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\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 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}\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, 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 )\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 ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 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:"#ifndef saturate\n\t#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}\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 mat3 uvTransform;\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 = ( 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#endif", -uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || 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;\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 \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n", -distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}\n", -equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 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 \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n", -linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n", -meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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 \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \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 \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n}\n",shadow_vert:"#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"}, -mb={basic:{uniforms:Ea.merge([E.common,E.specularmap,E.envmap,E.aomap,E.lightmap,E.fog]),vertexShader:W.meshbasic_vert,fragmentShader:W.meshbasic_frag},lambert:{uniforms:Ea.merge([E.common,E.specularmap,E.envmap,E.aomap,E.lightmap,E.emissivemap,E.fog,E.lights,{emissive:{value:new H(0)}}]),vertexShader:W.meshlambert_vert,fragmentShader:W.meshlambert_frag},phong:{uniforms:Ea.merge([E.common,E.specularmap,E.envmap,E.aomap,E.lightmap,E.emissivemap,E.bumpmap,E.normalmap,E.displacementmap,E.gradientmap, -E.fog,E.lights,{emissive:{value:new H(0)},specular:{value:new H(1118481)},shininess:{value:30}}]),vertexShader:W.meshphong_vert,fragmentShader:W.meshphong_frag},standard:{uniforms:Ea.merge([E.common,E.envmap,E.aomap,E.lightmap,E.emissivemap,E.bumpmap,E.normalmap,E.displacementmap,E.roughnessmap,E.metalnessmap,E.fog,E.lights,{emissive:{value:new H(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:W.meshphysical_vert,fragmentShader:W.meshphysical_frag},points:{uniforms:Ea.merge([E.points, -E.fog]),vertexShader:W.points_vert,fragmentShader:W.points_frag},dashed:{uniforms:Ea.merge([E.common,E.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:W.linedashed_vert,fragmentShader:W.linedashed_frag},depth:{uniforms:Ea.merge([E.common,E.displacementmap]),vertexShader:W.depth_vert,fragmentShader:W.depth_frag},normal:{uniforms:Ea.merge([E.common,E.bumpmap,E.normalmap,E.displacementmap,{opacity:{value:1}}]),vertexShader:W.normal_vert,fragmentShader:W.normal_frag},cube:{uniforms:{tCube:{value:null}, -tFlip:{value:-1},opacity:{value:1}},vertexShader:W.cube_vert,fragmentShader:W.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:W.equirect_vert,fragmentShader:W.equirect_frag},distanceRGBA:{uniforms:Ea.merge([E.common,E.displacementmap,{referencePosition:{value:new p},nearDistance:{value:1},farDistance:{value:1E3}}]),vertexShader:W.distanceRGBA_vert,fragmentShader:W.distanceRGBA_frag},shadow:{uniforms:Ea.merge([E.lights,E.fog,{color:{value:new H(0)},opacity:{value:1}}]),vertexShader:W.shadow_vert, -fragmentShader:W.shadow_frag}};mb.physical={uniforms:Ea.merge([mb.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:W.meshphysical_vert,fragmentShader:W.meshphysical_frag};Object.assign(kd.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;bthis.max.x||a.ythis.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.xthis.max.x||a.max.ythis.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)}});tc.prototype=Object.create(ea.prototype);tc.prototype.constructor=tc;var Lf=0;Object.assign(Q.prototype,ja.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 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]="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||"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.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());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.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);!0===this.flatShading&&(d.flatShading=this.flatShading);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.rotation&&(d.rotation=this.rotation); -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);0e&&(e=l);q>f&&(f=q);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,k=a.count;he&&(e=l);q>f&&(f=q);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;bthis.max.x||a.ythis.max.y||a.zthis.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 p).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.xthis.max.x||a.max.ythis.max.y||a.max.zthis.max.z?!1:!0},intersectsSphere:function(){var a=new p;return function(b){this.clampPoint(b.center, -a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){if(0=a.constant},clampPoint:function(a, -b){return(b||new p).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new p;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new p;return function(b){b=b||new Da;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 p,new p,new p,new p,new p,new p,new p,new p];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(Da.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new Oa;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e=c=0,f=b.length;e=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(a.distanceToPoint(this.center))<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a);b=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){a=a||new Oa;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(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 p,b=new p;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(b||new p).copy(this.normal).multiplyScalar(-this.distanceToPoint(a)).add(a)},intersectLine:function(){var a=new p;return function(b,c){c=c||new p;var d=b.delta(a),e=this.normal.dot(d);if(0===e){if(0===this.distanceToPoint(b.start))return c.copy(b.start)}else if(e=-(b.start.dot(this.normal)+this.constant)/e,!(0>e||1b&&0a&&0c;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],l=c[7],q=c[8],n=c[9],m=c[10],r=c[11],p=c[12],v=c[13],w=c[14],c=c[15];b[0].setComponents(f-a,l-g,r-q,c-p).normalize();b[1].setComponents(f+a,l+g,r+q,c+p).normalize();b[2].setComponents(f+d,l+h,r+n,c+v).normalize();b[3].setComponents(f-d,l-h,r-n,c-v).normalize();b[4].setComponents(f-e,l-k,r-m,c-w).normalize();b[5].setComponents(f+e,l+k,r+m,c+w).normalize();return this},intersectsObject:function(){var a=new Da;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 Da;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)e;e++){var f=d[e];a.x=0g&&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}});Ya.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" "); -Ya.DefaultOrder="XYZ";Object.defineProperties(Ya.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(Ya.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=R.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],k=e[5],l=e[9],q=e[2],n=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(-l,e),this._z= -Math.atan2(-f,a)):(this._x=Math.atan2(n,k),this._z=0)):"YXZ"===b?(this._x=Math.asin(-d(l,-1,1)),.99999>Math.abs(l)?(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(n,-1,1)),.99999>Math.abs(n)?(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(n,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(-l,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(n,k),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-l,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 Z;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 p(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(Pd.prototype,{set:function(a){this.mask=1<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;ca?b.copy(this.origin):b.copy(this.direction).multiplyScalar(a).add(this.origin)},distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new p;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 p,b=new p,c=new p;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),l=c.dot(this.direction),q=-c.dot(b),n=c.lengthSq(),m=Math.abs(1-k*k);if(0=-p?e<=p?(h=1/m,d*=h,e*=h,k=d*(d+k*e+2*l)+e*(k*d+e+2*q)+n):(e=h,d=Math.max(0,-(k*e+l)),k=-d*d+e*(e+2*q)+n):(e=-h,d=Math.max(0,-(k*e+l)),k=-d*d+e*(e+2*q)+n):e<=-p?(d=Math.max(0,-(-k*h+l)),e=0b)return null; -b=Math.sqrt(b-e);e=d-b;d+=b;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){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(da||h>c)return null; -if(h>g||g!==g)g=h;if(ac?null:this.at(0<=g?g:c,b)},intersectsBox:function(){var a=new p;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a=new p,b=new p,c=new p,d=new p;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(0f)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(Mb.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 p).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){return(a||new p).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){b=b||new p;return this.delta(b).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new p,b=new p;return function(c,d){a.subVectors(c, -this.start);b.subVectors(this.end,this.start);c=b.dot(b);c=b.dot(a)/c;d&&(c=R.clamp(c,0,1));return c}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=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)}});Object.assign(Qa,{normal:function(){var a=new p;return function(b,c,d,e){e=e||new p; -e.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0=b.x+b.y}}()});Object.assign(Qa.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 p,b=new p;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 p).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return Qa.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 Qa.barycoordFromPoint(a,this.a,this.b,this.c,b)},containsPoint:function(a){return Qa.containsPoint(a,this.a,this.b,this.c)},closestPointToPoint:function(){var a= -new Aa,b=[new Mb,new Mb,new Mb],c=new p,d=new p;return function(e,f){f=f||new p;var g=Infinity;a.setFromCoplanarPoints(this.a,this.b,this.c);a.projectPoint(e,c);if(!0===this.containsPoint(c))f.copy(c);else for(b[0].set(this.a,this.b),b[1].set(this.b,this.c),b[2].set(this.c,this.a),e=0;ec.far?null:{distance:b,point:x.clone(),object:a}}function c(c,d,e,f,l,n,q,t){g.fromBufferAttribute(f,n);h.fromBufferAttribute(f,q);k.fromBufferAttribute(f,t);if(c=b(c,c.material,d,e,g,h,k,w))l&&(m.fromBufferAttribute(l, -n),r.fromBufferAttribute(l,q),u.fromBufferAttribute(l,t),c.uv=a(w,g,h,k,m,r,u)),c.face=new Pa(n,q,t,Qa.normal(g,h,k)),c.faceIndex=n;return c}var d=new K,e=new lb,f=new Da,g=new p,h=new p,k=new p,l=new p,q=new p,n=new p,m=new C,r=new C,u=new C,v=new p,w=new p,x=new p;return function(t,p){var v=this.geometry,x=this.material,z=this.matrixWorld;if(void 0!==x&&(null===v.boundingSphere&&v.computeBoundingSphere(),f.copy(v.boundingSphere),f.applyMatrix4(z),!1!==t.ray.intersectsSphere(f)&&(d.getInverse(z), -e.copy(t.ray).applyMatrix4(d),null===v.boundingBox||!1!==e.intersectsBox(v.boundingBox)))){var y;if(v.isBufferGeometry){var x=v.index,I=v.attributes.position,z=v.attributes.uv,C;if(null!==x){var A=0;for(C=x.count;Af||(f=d.ray.origin.distanceTo(a),fd.far||e.push({distance:f,point:a.clone(),face:null,object:this}))}}(),clone:function(){return(new this.constructor(this.material)).copy(this)}});Dc.prototype=Object.assign(Object.create(A.prototype),{constructor:Dc,copy:function(a){A.prototype.copy.call(this, -a,!1);a=a.levels;for(var b=0,c=a.length;b=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break;for(;ef||(q.applyMatrix4(this.matrixWorld),m=d.ray.origin.distanceTo(q),md.far||e.push({distance:m,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}));else for(g=0,v=r.length/3-1;gf||(q.applyMatrix4(this.matrixWorld),m=d.ray.origin.distanceTo(q), -md.far||e.push({distance:m,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else if(g.isGeometry)for(k=g.vertices,l=k.length,g=0;gf||(q.applyMatrix4(this.matrixWorld),m=d.ray.origin.distanceTo(q),md.far||e.push({distance:m,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)}});ca.prototype=Object.assign(Object.create(ma.prototype),{constructor:ca,isLineSegments:!0});rd.prototype=Object.assign(Object.create(ma.prototype),{constructor:rd,isLineLoop:!0});Ba.prototype=Object.create(Q.prototype);Ba.prototype.constructor=Ba;Ba.prototype.isPointsMaterial=!0;Ba.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;return this};Qb.prototype=Object.assign(Object.create(A.prototype), -{constructor:Qb,isPoints:!0,raycast:function(){var a=new K,b=new lb,c=new Da;return function(d,e){function f(a,c){var f=b.distanceSqToPoint(a);if(fd.far||e.push({distance:h,distanceToRay:Math.sqrt(f),point:a.clone(),index:c,face:null,object:g})}}var g=this,h=this.geometry,k=this.matrixWorld,l=d.params.Points.threshold;null===h.boundingSphere&&h.computeBoundingSphere();c.copy(h.boundingSphere);c.applyMatrix4(k); -c.radius+=l;if(!1!==d.ray.intersectsSphere(c)){a.getInverse(k);b.copy(d.ray).applyMatrix4(a);var l=l/((this.scale.x+this.scale.y+this.scale.z)/3),m=l*l,l=new p;if(h.isBufferGeometry){var n=h.index,h=h.attributes.position.array;if(null!==n)for(var t=n.array,n=0,r=t.length;nc)return null;var d=[],e=[],f=[],g;if(0=h--){console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()");break}var k= -g;c<=k&&(k=0);g=k+1;c<=g&&(g=0);var l=g+1;c<=l&&(l=0);a:{var m;var n=a[e[k]].x;var p=a[e[k]].y;var r=a[e[g]].x;var u=a[e[g]].y;var v=a[e[l]].x;var w=a[e[l]].y;if(0>=(r-n)*(w-p)-(u-p)*(v-n))var x=!1;else{var z=v-r;var y=w-u;var B=n-v;var C=p-w;var A=r-n;x=u-p;for(m=0;m=-Number.EPSILON&&D>=-Number.EPSILON&&N>=-Number.EPSILON){x= -!1;break a}}}x=!0}}if(x){d.push([a[e[k]],a[e[g]],a[e[l]]]);f.push([e[k],e[g],e[l]]);k=g;for(l=g+1;lNumber.EPSILON){if(0< -q){if(0>p||p>q)return[];k=l*m-k*n;if(0>k||k>q)return[]}else{if(0c?[]:k===c?f?[]:[g]:a<=c?[g,h]:[g,l]}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,0d&&(d=c);var e=a+1;e>c&&(e=0);c=f(h[a],h[d],h[e],D[b]);if(!c)return!1;c=D.length-1;d=b-1;0>d&&(d=c);e=b+1;e>c&&(e=0);return(c=f(D[b],D[d],D[e],h[a]))?!0:!1}function d(a,b){var c;for(c=0;ct){console.log('THREE.ShapeUtils: Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!');break}for(m=p;ma;a++)m=b[a].x+":"+b[a].y,m=h[m],void 0!==m&&(b[a]=m);return k.concat()},isClockWise:function(a){return 0>Ha.area(a)}};$a.prototype=Object.create(N.prototype);$a.prototype.constructor=$a;Ga.prototype= -Object.create(D.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;dNumber.EPSILON){var k=Math.sqrt(h),l=Math.sqrt(f*f+g*g),h=b.x-e/k;b=b.y+d/k;g=((c.x-g/l-h)*g-(c.y+f/l-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 C(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 C(f/e,d/e)}function e(a,b){for(G=a.length;0<=--G;){var c=G;var d=G-1;0>d&&(d=a.length-1);var e,f=A+2*w;for(e=0;eMath.abs(g-k)?[new C(a,1-c),new C(h,1-d),new C(l,1-e),new C(n,1-b)]:[new C(g,1-c),new C(k,1-d),new C(m,1-e),new C(p,1-b)]}};Qc.prototype=Object.create(N.prototype); -Qc.prototype.constructor=Qc;$b.prototype=Object.create(Ga.prototype);$b.prototype.constructor=$b;Rc.prototype=Object.create(N.prototype);Rc.prototype.constructor=Rc;ob.prototype=Object.create(D.prototype);ob.prototype.constructor=ob;Sc.prototype=Object.create(N.prototype);Sc.prototype.constructor=Sc;ac.prototype=Object.create(D.prototype);ac.prototype.constructor=ac;Tc.prototype=Object.create(N.prototype);Tc.prototype.constructor=Tc;bc.prototype=Object.create(D.prototype);bc.prototype.constructor= -bc;cc.prototype=Object.create(N.prototype);cc.prototype.constructor=cc;dc.prototype=Object.create(D.prototype);dc.prototype.constructor=dc;ec.prototype=Object.create(D.prototype);ec.prototype.constructor=ec;pb.prototype=Object.create(N.prototype);pb.prototype.constructor=pb;Sa.prototype=Object.create(D.prototype);Sa.prototype.constructor=Sa;Uc.prototype=Object.create(pb.prototype);Uc.prototype.constructor=Uc;Vc.prototype=Object.create(Sa.prototype);Vc.prototype.constructor=Vc;Wc.prototype=Object.create(N.prototype); -Wc.prototype.constructor=Wc;fc.prototype=Object.create(D.prototype);fc.prototype.constructor=fc;var Ca=Object.freeze({WireframeGeometry:Sb,ParametricGeometry:Hc,ParametricBufferGeometry:Tb,TetrahedronGeometry:Jc,TetrahedronBufferGeometry:Ub,OctahedronGeometry:Kc,OctahedronBufferGeometry:nb,IcosahedronGeometry:Lc,IcosahedronBufferGeometry:Vb,DodecahedronGeometry:Mc,DodecahedronBufferGeometry:Wb,PolyhedronGeometry:Ic,PolyhedronBufferGeometry:qa,TubeGeometry:Nc,TubeBufferGeometry:Xb,TorusKnotGeometry:Oc, -TorusKnotBufferGeometry:Yb,TorusGeometry:Pc,TorusBufferGeometry:Zb,TextGeometry:Qc,TextBufferGeometry:$b,SphereGeometry:Rc,SphereBufferGeometry:ob,RingGeometry:Sc,RingBufferGeometry:ac,PlaneGeometry:Ac,PlaneBufferGeometry:kb,LatheGeometry:Tc,LatheBufferGeometry:bc,ShapeGeometry:cc,ShapeBufferGeometry:dc,ExtrudeGeometry:$a,ExtrudeBufferGeometry:Ga,EdgesGeometry:ec,ConeGeometry:Uc,ConeBufferGeometry:Vc,CylinderGeometry:pb,CylinderBufferGeometry:Sa,CircleGeometry:Wc,CircleBufferGeometry:fc,BoxGeometry:Lb, -BoxBufferGeometry:jb});gc.prototype=Object.create(Q.prototype);gc.prototype.constructor=gc;gc.prototype.isShadowMaterial=!0;hc.prototype=Object.create(oa.prototype);hc.prototype.constructor=hc;hc.prototype.isRawShaderMaterial=!0;Ma.prototype=Object.create(Q.prototype);Ma.prototype.constructor=Ma;Ma.prototype.isMeshStandardMaterial=!0;Ma.prototype.copy=function(a){Q.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};qb.prototype=Object.create(Ma.prototype);qb.prototype.constructor=qb;qb.prototype.isMeshPhysicalMaterial= -!0;qb.prototype.copy=function(a){Ma.prototype.copy.call(this,a);this.defines={PHYSICAL:""};this.reflectivity=a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};Ia.prototype=Object.create(Q.prototype);Ia.prototype.constructor=Ia;Ia.prototype.isMeshPhongMaterial=!0;Ia.prototype.copy=function(a){Q.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};rb.prototype=Object.create(Ia.prototype);rb.prototype.constructor=rb;rb.prototype.isMeshToonMaterial=!0;rb.prototype.copy=function(a){Ia.prototype.copy.call(this, -a);this.gradientMap=a.gradientMap;return this};sb.prototype=Object.create(Q.prototype);sb.prototype.constructor=sb;sb.prototype.isMeshNormalMaterial=!0;sb.prototype.copy=function(a){Q.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};tb.prototype=Object.create(Q.prototype);tb.prototype.constructor=tb;tb.prototype.isMeshLambertMaterial=!0;tb.prototype.copy=function(a){Q.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};ub.prototype=Object.create(O.prototype);ub.prototype.constructor= -ub;ub.prototype.isLineDashedMaterial=!0;ub.prototype.copy=function(a){O.prototype.copy.call(this,a);this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var tg=Object.freeze({ShadowMaterial:gc,SpriteMaterial:Za,RawShaderMaterial:hc,ShaderMaterial:oa,PointsMaterial:Ba,MeshPhysicalMaterial:qb,MeshStandardMaterial:Ma,MeshPhongMaterial:Ia,MeshToonMaterial:rb,MeshNormalMaterial:sb,MeshLambertMaterial:tb,MeshDepthMaterial:Wa,MeshDistanceMaterial:Xa,MeshBasicMaterial:va,LineDashedMaterial:ub, -LineBasicMaterial:O,Material:Q}),jd={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={}}},wa=new Yd,Ta={};Object.assign(Ja.prototype,{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=jd.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!==Ta[a])Ta[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=window.decodeURIComponent(g);h&&(g=window.atob(g));try{var k=(this.responseType||"").toLowerCase();switch(k){case "arraybuffer":case "blob":for(var l=new Uint8Array(g.length),h=0;h=e)break a;else{f=b[1];a=e)break b}d=c;c=0}}for(;c>>1,ab;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),a=this.getValueSize(),this.times=T.arraySlice(c,e,f),this.values=T.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.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&&T.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, -b,c=this.times,d=this.values,e=this.getValueSize(),f=2302===this.getInterpolation(),g=1,h=c.length-1,k=1;kl.opacity&&(l.transparent=!0);d.setTextures(k);return d.parse(l)}}()});Object.assign(be.prototype, -{load:function(a,b,c,d){var e=this,f=this.texturePath&&"string"===typeof this.texturePath?this.texturePath:kc.prototype.extractUrlBase(a),g=new Ja(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 N,d=a,e,f,g,h=d.faces;var k=d.vertices;var l=d.normals,m=d.colors;var n=d.scale;var t=0;if(void 0!==d.uvs){for(e=0;ef;f++){var B=h[r++];var A=y[2*B];B=y[2*B+1];A=new C(A,B);2!==f&&c.faceVertexUvs[e][v].push(A);0!==f&&c.faceVertexUvs[e][v+1].push(A)}}w&&(w=3* -h[r++],u.normal.set(l[w++],l[w++],l[w]),z.normal.copy(u.normal));if(x)for(e=0;4>e;e++)w=3*h[r++],x=new p(l[w++],l[w++],l[w]),2!==e&&u.vertexNormals.push(x),0!==e&&z.vertexNormals.push(x);n&&(n=h[r++],n=m[n],u.color.setHex(n),z.color.setHex(n));if(k)for(e=0;4>e;e++)n=h[r++],n=m[n],2!==e&&u.vertexColors.push(new H(n)),0!==e&&z.vertexColors.push(new H(n));c.faces.push(u);c.faces.push(z)}else{u=new Pa;u.a=h[r++];u.b=h[r++];u.c=h[r++];v&&(v=h[r++],u.materialIndex=v);v=c.faces.length;if(e)for(e=0;ef;f++)B=h[r++],A=y[2*B],B=y[2*B+1],A=new C(A,B),c.faceVertexUvs[e][v].push(A);w&&(w=3*h[r++],u.normal.set(l[w++],l[w++],l[w]));if(x)for(e=0;3>e;e++)w=3*h[r++],x=new p(l[w++],l[w++],l[w]),u.vertexNormals.push(x);n&&(n=h[r++],u.color.setHex(m[n]));if(k)for(e=0;3>e;e++)n=h[r++],u.vertexColors.push(new H(m[n]));c.faces.push(u)}}d=a;r=void 0!==d.influencesPerVertex?d.influencesPerVertex:2;if(d.skinWeights)for(g=0,h=d.skinWeights.length;gg)e=a+1;else if(0b&&(b=0);1Number.EPSILON&&(g.normalize(),c=Math.acos(R.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(R.clamp(e[0].dot(e[a]),-1,1)),c/=a,0=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;cd;)d+=c;for(;d>c;)d-=c;dc.length-2?c.length-1:a+1],c=c[a>c.length-3?c.length-1:a+2];b.set(Se(d, -e.x,f.x,g.x,c.x),Se(d,e.y,f.y,g.y,c.y));return b};ab.prototype.copy=function(a){S.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;bNumber.EPSILON){if(0>l&&(g=b[f],k=-k,h=b[e],l=-l),!(a.yh.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=l*(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=Ha.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 Cb;h.curves=g.curves;b.push(h);return b}var k=!e(f[0].getPoints()),k=a?!k:k;h=[];var l=[],m=[],n=0;l[n]=void 0;m[n]=[];for(var p=0,r=f.length;pd&&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){Z.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(Ve.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(na,{Composite:Ve,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new na.Composite(a,b,c):new na(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=b){var m=b++,n=a[m];c[n.uuid]=l;a[l]=n;c[k]=m;a[m]=h;h=0;for(k=e;h!==k;++h){var n=d[h],p= -n[l];n[l]=n[m];n[m]=p}}}this.nCachedObjects_=b},uncache:function(){for(var a,b,c=this._objects,d=c.length,e=this.nCachedObjects_,f=this._indicesByUUID,g=this._bindings,h=g.length,k=0,l=arguments.length;k!==l;++k){b=arguments[k].uuid;var m=f[b];if(void 0!==m)if(delete f[b],mb||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0c.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=0a,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(Ye.prototype,ja.prototype, -{_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 l=d[h],m=l.name,n=k[m];if(void 0===n){n=f[h];if(void 0!==n){null===n._cacheIndex&&(++n.referenceCount,this._addInactiveBinding(n,g,m));continue}n=new je(na.create(c,m,b&&b._propertyBindings[h].binding.parsedPath),l.ValueTypeName,l.getValueSize());++n.referenceCount;this._addInactiveBinding(n, -g,m)}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&&aMath.abs(b)&&(b=1E-8);this.scale.set(.5*this.size,.5*this.size,b);this.lookAt(this.plane.normal);A.prototype.updateMatrixWorld.call(this,a)};var Ld,pe;Eb.prototype=Object.create(A.prototype);Eb.prototype.constructor=Eb;Eb.prototype.setDirection=function(){var a=new p,b;return function(c){.99999c.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))}}();Eb.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()};Eb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)};hd.prototype=Object.create(ca.prototype);hd.prototype.constructor=hd;var Nd=new p, -te=new qe,ue=new qe,ve=new qe;ya.prototype=Object.create(S.prototype);ya.prototype.constructor=ya;ya.prototype.isCatmullRomCurve3=!0;ya.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+=0e&&(e=1);1E-4>d&&(d=e);1E-4>k&&(k=e);te.initNonuniformCatmullRom(f.x,g.x,h.x,c.x,d,e,k);ue.initNonuniformCatmullRom(f.y,g.y,h.y,c.y,d,e,k);ve.initNonuniformCatmullRom(f.z,g.z,h.z,c.z,d,e,k)}else"catmullrom"===this.curveType&&(te.initCatmullRom(f.x,g.x,h.x, -c.x,this.tension),ue.initCatmullRom(f.y,g.y,h.y,c.y,this.tension),ve.initCatmullRom(f.z,g.z,h.z,c.z,this.tension));b.set(te.calc(a),ue.calc(a),ve.calc(a));return b};ya.prototype.copy=function(a){S.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b 0) { - for (var i = (this.length >> 1); i >= 0; i--) this._down(i); + 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; } -} - -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); + 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); + } } - 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; + }; + 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(); + } } - - 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]; + _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(); } - if (compare(best, item) >= 0) break; - - data[pos] = best; - pos = left; } + _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 closingSelector = this.closingSelector; + var closingNotifier = tryCatch_1.tryCatch(closingSelector)(innerValue); + if (closingNotifier === errorObject_1.errorObject) { + return this.error(errorObject_1.errorObject.e); + } + else { + 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)); - data[pos] = item; +},{"../OuterSubscriber":50,"../Subject":53,"../Subscription":56,"../util/errorObject":216,"../util/subscribeToResult":238,"../util/tryCatch":240}],188:[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); } -}; - -},{}],242:[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; - }; - - // 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 = _; + 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 tryCatch_1 = require("../util/tryCatch"); +var errorObject_1 = require("../util/errorObject"); +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; } - exports._ = _; - } else { - root._ = _; - } - - // Current version. - _.VERSION = '1.8.3'; - - // 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); - }; + 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; } - return function() { - return func.apply(context, arguments); + WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.openWindow(innerSub); }; - }; - - // 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); - }; - - // 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]; + 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(); } - } - return obj; }; - }; - - // 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; - }; - - var property = function(key) { - return function(obj) { - return obj == null ? void 0 : obj[key]; + 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 = tryCatch_1.tryCatch(this.closingSelector)(); + if (closingNotifier === errorObject_1.errorObject) { + var err = errorObject_1.errorObject.e; + this.destination.error(err); + this.window.error(err); + } + else { + this.add(this.closingNotification = subscribeToResult_1.subscribeToResult(this, closingNotifier)); + } }; - }; - - // 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; - }; + return WindowSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); - // 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); - } +},{"../OuterSubscriber":50,"../Subject":53,"../util/errorObject":216,"../util/subscribeToResult":238,"../util/tryCatch":240}],189:[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 obj; - }; - - // 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; - }; - - // 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); + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - } - - // **Reduce** builds up a single result from a list of values, aka `inject`, - // or `foldl`. - _.reduce = _.foldl = _.inject = createReduce(1); - - // The right-associative version of reduce, also known as `foldr`. - _.reduceRight = _.foldr = createReduce(-1); - - // 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]; - }; - - // 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; - }; - - // Return all the elements for which a truth test fails. - _.reject = function(obj, predicate, context) { - return _.filter(obj, _.negate(cb(predicate)), context); - }; - - // 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; +})(); +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 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 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; } - return false; - }; - - // 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; - }; - - // 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); - }); - }; - - // Convenience version of a common use case of `map`: fetching a property. - _.pluck = function(obj, key) { - return _.map(obj, _.property(key)); - }; - - // 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)); - }; - - // 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 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; + 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); } - } - } 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; + for (var i = 0; i < len; i++) { + var observable = observables[i]; + _this.add(subscribeToResult_1.subscribeToResult(_this, observable, observable, i)); } - }); + return _this; } - return result; - }; - - // 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; + 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); + } } - } - } 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; + }; + 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); + } } - }); - } - 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)]; - } - 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'); - }; - - // 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; }; - }; - - // 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]; - }); - - // 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; - }); - - // 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; - }); - - // 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); - }; - - // Return the number of elements in an object. - _.size = function(obj) { - if (obj == null) return 0; - return isArrayLike(obj) ? obj.length : _.keys(obj).length; - }; - - // 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)); - }; - - // 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); - }; - - // Trim out all falsy values from an array. - _.compact = function(array) { - return _.filter(array, _.identity); - }; + 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)); - // 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; - } +},{"../OuterSubscriber":50,"../util/subscribeToResult":238}],190:[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 output; - }; - - // Flatten out an array, either recursively (by default), or just one level. - _.flatten = function(array, shallow) { - return flatten(array, shallow, false); - }; + return function zipOperatorFunction(source) { + return source.lift.call(zip_1.zip.apply(void 0, [source].concat(observables))); + }; +} +exports.zip = zip; - // Return a version of the array that does not contain the specified value(s). - _.without = function(array) { - return _.difference(array, slice.call(arguments, 1)); - }; +},{"../observable/zip":88}],191:[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; - // 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; +},{"../observable/zip":88}],192:[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 (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 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; } - return result; - }; - - // 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)); - }; + Action.prototype.schedule = function (state, delay) { + if (delay === void 0) { delay = 0; } + return this; + }; + return Action; +}(Subscription_1.Subscription)); +exports.Action = Action; - // 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); +},{"../Subscription":56}],193:[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 result; - }; - - // 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); - }); - }; - - // Zip together multiple lists into a single array -- elements that share - // an index go together. - _.zip = function() { - return _.unzip(arguments); - }; - - // 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); - - for (var index = 0; index < length; index++) { - result[index] = _.pluck(array, index); + 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; } - return result; - }; + 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; - // 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]; - } +},{"./AsyncAction":197}],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 result; - }; - - // 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; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - } - - // Returns the first index on an array-like that passes a predicate test - _.findIndex = createPredicateIndexFinder(1); - _.findLastIndex = createPredicateIndexFinder(-1); - - // 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; +})(); +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; } - return low; - }; - - // 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); - } else { - length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + 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; } - } 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); + return AnimationFrameScheduler; +}(AsyncScheduler_1.AsyncScheduler)); +exports.AnimationFrameScheduler = AnimationFrameScheduler; - // 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; +},{"./AsyncScheduler":198}],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); } - 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 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; } - - 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); + 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))); }; - 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]; + 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; }; - 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); - }; + return AsapAction; +}(AsyncAction_1.AsyncAction)); +exports.AsapAction = AsapAction; - // 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; +},{"../util/Immediate":211,"./AsyncAction":197}],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 __()); }; - }; - - // 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; +})(); +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; - 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; +},{"./AsyncScheduler":198}],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 __()); }; - }; - - // 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); +})(); +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; }; - }; - - // 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; + AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { delay = 0; } + return setInterval(scheduler.flush.bind(scheduler, this), delay); }; - }; - - // 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); - } + 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); }; - }; - - // 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; + 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); + } }; - }; - - // 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 - // ---------------- - - // 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']; - - function collectNonEnumProps(obj, keys) { - var nonEnumIdx = nonEnumerableProps.length; - var constructor = obj.constructor; - var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto; - - // Constructor is a special case. - var prop = 'constructor'; - if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); + 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; - while (nonEnumIdx--) { - prop = nonEnumerableProps[nonEnumIdx]; - if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) { - keys.push(prop); - } +},{"./Action":192}],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); } - } - - // 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 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; } - 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; - }; + 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; - // 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]]]; +},{"../Scheduler":52}],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 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 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; } - return result; - }; + 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; - // 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); +},{"./AsyncAction":197}],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 names.sort(); - }; - - // Extend a given object with all the properties in passed-in object(s). - _.extend = createAssigner(_.allKeys); - - // 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); - - // 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; + 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; - // 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); - } else { - keys = flatten(arguments, false, false, 1); - iteratee = function(value, key, obj) { return key in obj; }; - obj = Object(obj); +},{"./AsyncScheduler":198}],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); } - 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; + 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; } - return result; - }; - - // Return a copy of the object without the blacklisted properties. - _.omit = function(obj, iteratee, context) { - if (_.isFunction(iteratee)) { - iteratee = _.negate(iteratee); - } else { - var keys = _.map(flatten(arguments, false, false, 1), String); - iteratee = function(value, key) { - return !_.contains(keys, key); - }; + VirtualTimeScheduler.prototype.flush = function () { + var _a = this, actions = _a.actions, maxFrames = _a.maxFrames; + var error, action; + while ((action = actions.shift()) && (this.frame = action.delay) <= maxFrames) { + 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; } - return _.pick(obj, iteratee, context); - }; + 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; - // Fill in a given object with default properties. - _.defaults = createAssigner(_.allKeys, true); +},{"./AsyncAction":197,"./AsyncScheduler":198}],202:[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); - // 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; - }; +},{"./AnimationFrameAction":193,"./AnimationFrameScheduler":194}],203:[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); - // Create a (shallow-cloned) duplicate of an object. - _.clone = function(obj) { - if (!_.isObject(obj)) return obj; - return _.isArray(obj) ? obj.slice() : _.extend({}, obj); - }; +},{"./AsapAction":195,"./AsapScheduler":196}],204:[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); - // 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; - }; +},{"./AsyncAction":197,"./AsyncScheduler":198}],205:[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); - // 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; +},{"./QueueAction":199,"./QueueScheduler":200}],206:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function getSymbolIterator() { + if (typeof Symbol !== 'function' || !Symbol.iterator) { + return '@@iterator'; } - return true; - }; + return Symbol.iterator; +} +exports.getSymbolIterator = getSymbolIterator; +exports.iterator = getSymbolIterator(); +exports.$$iterator = exports.iterator; +},{}],207:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.observable = typeof Symbol === 'function' && Symbol.observable || '@@observable'; - // 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; - } - } - // Remove the first object from the stack of traversed objects. - aStack.pop(); - bStack.pop(); - return true; - }; +},{}],208:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.rxSubscriber = typeof Symbol === 'function' + ? Symbol('rxSubscriber') + : '@@rxSubscriber_' + Math.random(); +exports.$$rxSubscriber = exports.rxSubscriber; - // Perform a deep comparison to check if two objects are equal. - _.isEqual = function(a, b) { - return eq(a, b); - }; +},{}],209:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function ArgumentOutOfRangeErrorImpl() { + Error.call(this); + this.message = 'argument out of range'; + this.name = 'ArgumentOutOfRangeError'; + return this; +} +ArgumentOutOfRangeErrorImpl.prototype = Object.create(Error.prototype); +exports.ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl; - // 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; - }; +},{}],210:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function EmptyErrorImpl() { + Error.call(this); + this.message = 'no elements in sequence'; + this.name = 'EmptyError'; + return this; +} +EmptyErrorImpl.prototype = Object.create(Error.prototype); +exports.EmptyError = EmptyErrorImpl; - // Is a given value a DOM element? - _.isElement = function(obj) { - return !!(obj && obj.nodeType === 1); - }; +},{}],211:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var nextHandle = 1; +var tasksByHandle = {}; +function runIfPresent(handle) { + var cb = tasksByHandle[handle]; + if (cb) { + cb(); + } +} +exports.Immediate = { + setImmediate: function (cb) { + var handle = nextHandle++; + tasksByHandle[handle] = cb; + Promise.resolve().then(function () { return runIfPresent(handle); }); + return handle; + }, + clearImmediate: function (handle) { + delete tasksByHandle[handle]; + }, +}; - // Is a given value an array? - // Delegates to ECMA5's native Array.isArray - _.isArray = nativeIsArray || function(obj) { - return toString.call(obj) === '[object Array]'; - }; +},{}],212:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function ObjectUnsubscribedErrorImpl() { + Error.call(this); + this.message = 'object unsubscribed'; + this.name = 'ObjectUnsubscribedError'; + return this; +} +ObjectUnsubscribedErrorImpl.prototype = Object.create(Error.prototype); +exports.ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl; - // Is a given variable an object? - _.isObject = function(obj) { - var type = typeof obj; - return type === 'function' || type === 'object' && !!obj; - }; +},{}],213:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function TimeoutErrorImpl() { + Error.call(this); + this.message = 'Timeout has occurred'; + this.name = 'TimeoutError'; + return this; +} +TimeoutErrorImpl.prototype = Object.create(Error.prototype); +exports.TimeoutError = TimeoutErrorImpl; - // 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 + ']'; - }; - }); +},{}],214:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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); +exports.UnsubscriptionError = UnsubscriptionErrorImpl; - // 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'); - }; - } +},{}],215:[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; - // 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; - }; - } +},{"../Subscriber":55}],216:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.errorObject = { e: {} }; - // Is a given object a finite number? - _.isFinite = function(obj) { - return isFinite(obj) && !isNaN(parseFloat(obj)); - }; +},{}],217:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function hostReportError(err) { + setTimeout(function () { throw err; }); +} +exports.hostReportError = hostReportError; - // Is the given value `NaN`? (NaN is the only number which does not equal itself). - _.isNaN = function(obj) { - return _.isNumber(obj) && obj !== +obj; - }; +},{}],218:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function identity(x) { + return x; +} +exports.identity = identity; - // Is a given value a boolean? - _.isBoolean = function(obj) { - return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; - }; +},{}],219:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isArray = Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); - // Is a given value equal to null? - _.isNull = function(obj) { - return obj === null; - }; +},{}],220:[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'; }); - // Is a given variable undefined? - _.isUndefined = function(obj) { - return obj === void 0; - }; +},{}],221:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function isDate(value) { + return value instanceof Date && !isNaN(+value); +} +exports.isDate = isDate; - // 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); - }; +},{}],222:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function isFunction(x) { + return typeof x === 'function'; +} +exports.isFunction = isFunction; - // Utility Functions - // ----------------- +},{}],223:[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; - // 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; - }; +},{"../symbol/observable":207}],224:[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; - // Keep the identity function around for default iteratees. - _.identity = function(value) { - return value; - }; +},{"../symbol/iterator":206}],225:[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; - // Predicate-generating functions. Often useful outside of Underscore. - _.constant = function(value) { - return function() { - return value; - }; - }; +},{"./isArray":219}],226:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function isObject(x) { + return x != null && typeof x === 'object'; +} +exports.isObject = isObject; - _.noop = function(){}; +},{}],227:[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; - _.property = property; +},{"../Observable":48}],228:[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; - // Generates a function for a given object that returns a given property. - _.propertyOf = function(obj) { - return obj == null ? function(){} : function(key) { - return obj[key]; - }; - }; +},{}],229:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function isScheduler(value) { + return value && typeof value.schedule === 'function'; +} +exports.isScheduler = isScheduler; - // 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); - }; - }; +},{}],230:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function noop() { } +exports.noop = noop; - // 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; - }; +},{}],231:[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; - // Return a random integer between min and max (inclusive). - _.random = function(min, max) { - if (max == null) { - max = min; - min = 0; +},{}],232:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var noop_1 = require("./noop"); +function pipe() { + var fns = []; + for (var _i = 0; _i < arguments.length; _i++) { + fns[_i] = arguments[_i]; } - return min + Math.floor(Math.random() * (max - min + 1)); - }; + return pipeFromArray(fns); +} +exports.pipe = pipe; +function pipeFromArray(fns) { + if (!fns) { + return noop_1.noop; + } + if (fns.length === 1) { + return fns[0]; + } + return function piped(input) { + return fns.reduce(function (prev, fn) { return fn(prev); }, input); + }; +} +exports.pipeFromArray = pipeFromArray; - // A (possibly faster) way to get the current timestamp as an integer. - _.now = Date.now || function() { - return new Date().getTime(); - }; +},{"./noop":230}],233:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("../Observable"); +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 instanceof Observable_1.Observable) { + return function (subscriber) { + if (result._isScalar) { + subscriber.next(result.value); + subscriber.complete(); + return undefined; + } + else { + return result.subscribe(subscriber); + } + }; + } + else 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); + } +}; - // List of HTML entities for escaping. - var escapeMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '`': '`' - }; - var unescapeMap = _.invert(escapeMap); +},{"../Observable":48,"../symbol/iterator":206,"../symbol/observable":207,"./isArrayLike":220,"./isObject":226,"./isPromise":228,"./subscribeToArray":234,"./subscribeToIterable":235,"./subscribeToObservable":236,"./subscribeToPromise":237}],234:[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]); + } + if (!subscriber.closed) { + subscriber.complete(); + } +}; }; - // Functions for escaping and unescaping strings to/from HTML interpolation. - var createEscaper = function(map) { - var escaper = function(match) { - return map[match]; - }; - // 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; - }; - }; - _.escape = createEscaper(escapeMap); - _.unescape = createEscaper(unescapeMap); +},{}],235:[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; +}; }; - // 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; +},{"../symbol/iterator":206}],236:[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'); } - return _.isFunction(value) ? value.call(object) : value; - }; + else { + return obs.subscribe(subscriber); + } +}; }; - // 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; - }; +},{"../symbol/observable":207}],237:[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; +}; }; - // 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 - }; +},{"./hostReportError":217}],238:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var InnerSubscriber_1 = require("../InnerSubscriber"); +var subscribeTo_1 = require("./subscribeTo"); +function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, destination) { + if (destination === void 0) { destination = new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex); } + if (destination.closed) { + return; + } + return subscribeTo_1.subscribeTo(result)(destination); +} +exports.subscribeToResult = subscribeToResult; - // 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' - }; +},{"../InnerSubscriber":46,"./subscribeTo":233}],239:[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; - var escaper = /\\|'|\r|\n|\u2028|\u2029/g; +},{"../Observer":49,"../Subscriber":55,"../symbol/rxSubscriber":208}],240:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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; - var escapeChar = function(match) { - return '\\' + escapes[match]; - }; +},{"./errorObject":216}],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":89,"../internal/operators/auditTime":90,"../internal/operators/buffer":91,"../internal/operators/bufferCount":92,"../internal/operators/bufferTime":93,"../internal/operators/bufferToggle":94,"../internal/operators/bufferWhen":95,"../internal/operators/catchError":96,"../internal/operators/combineAll":97,"../internal/operators/combineLatest":98,"../internal/operators/concat":99,"../internal/operators/concatAll":100,"../internal/operators/concatMap":101,"../internal/operators/concatMapTo":102,"../internal/operators/count":103,"../internal/operators/debounce":104,"../internal/operators/debounceTime":105,"../internal/operators/defaultIfEmpty":106,"../internal/operators/delay":107,"../internal/operators/delayWhen":108,"../internal/operators/dematerialize":109,"../internal/operators/distinct":110,"../internal/operators/distinctUntilChanged":111,"../internal/operators/distinctUntilKeyChanged":112,"../internal/operators/elementAt":113,"../internal/operators/endWith":114,"../internal/operators/every":115,"../internal/operators/exhaust":116,"../internal/operators/exhaustMap":117,"../internal/operators/expand":118,"../internal/operators/filter":119,"../internal/operators/finalize":120,"../internal/operators/find":121,"../internal/operators/findIndex":122,"../internal/operators/first":123,"../internal/operators/groupBy":124,"../internal/operators/ignoreElements":125,"../internal/operators/isEmpty":126,"../internal/operators/last":127,"../internal/operators/map":128,"../internal/operators/mapTo":129,"../internal/operators/materialize":130,"../internal/operators/max":131,"../internal/operators/merge":132,"../internal/operators/mergeAll":133,"../internal/operators/mergeMap":134,"../internal/operators/mergeMapTo":135,"../internal/operators/mergeScan":136,"../internal/operators/min":137,"../internal/operators/multicast":138,"../internal/operators/observeOn":139,"../internal/operators/onErrorResumeNext":140,"../internal/operators/pairwise":141,"../internal/operators/partition":142,"../internal/operators/pluck":143,"../internal/operators/publish":144,"../internal/operators/publishBehavior":145,"../internal/operators/publishLast":146,"../internal/operators/publishReplay":147,"../internal/operators/race":148,"../internal/operators/reduce":149,"../internal/operators/refCount":150,"../internal/operators/repeat":151,"../internal/operators/repeatWhen":152,"../internal/operators/retry":153,"../internal/operators/retryWhen":154,"../internal/operators/sample":155,"../internal/operators/sampleTime":156,"../internal/operators/scan":157,"../internal/operators/sequenceEqual":158,"../internal/operators/share":159,"../internal/operators/shareReplay":160,"../internal/operators/single":161,"../internal/operators/skip":162,"../internal/operators/skipLast":163,"../internal/operators/skipUntil":164,"../internal/operators/skipWhile":165,"../internal/operators/startWith":166,"../internal/operators/subscribeOn":167,"../internal/operators/switchAll":168,"../internal/operators/switchMap":169,"../internal/operators/switchMapTo":170,"../internal/operators/take":171,"../internal/operators/takeLast":172,"../internal/operators/takeUntil":173,"../internal/operators/takeWhile":174,"../internal/operators/tap":175,"../internal/operators/throttle":176,"../internal/operators/throttleTime":177,"../internal/operators/throwIfEmpty":178,"../internal/operators/timeInterval":179,"../internal/operators/timeout":180,"../internal/operators/timeoutWith":181,"../internal/operators/timestamp":182,"../internal/operators/toArray":183,"../internal/operators/window":184,"../internal/operators/windowCount":185,"../internal/operators/windowTime":186,"../internal/operators/windowToggle":187,"../internal/operators/windowWhen":188,"../internal/operators/withLatestFrom":189,"../internal/operators/zip":190,"../internal/operators/zipAll":191}],242:[function(require,module,exports){ +// threejs.org/license +(function(l,ya){"object"===typeof exports&&"undefined"!==typeof module?ya(exports):"function"===typeof define&&define.amd?define(["exports"],ya):ya(l.THREE={})})(this,function(l){function ya(){}function z(a,b){this.x=a||0;this.y=b||0}function I(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0b&&(b=a[c]);return b}function C(){Object.defineProperty(this,"id",{value:If+=2});this.uuid=H.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};this.userData={}}function Ib(a,b,c,d,e,f){R.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e, +depthSegments:f};this.fromBufferGeometry(new kb(a,b,c,d,e,f));this.mergeVertices()}function kb(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,l,N,O,Jf){var r=f/N,v=g/O,P=f/2,y=g/2,w=l/2;g=N+1;var E=O+1,x=f=0,B,z,A=new p;for(z=0;zm;m++){if(n=d[m])if(h=n[0],k=n[1]){q&&e.addAttribute("morphTarget"+m,q[h]);f&&e.addAttribute("morphNormal"+ +m,f[h]);c[m]=k;continue}c[m]=0}g.getUniforms().setValue(a,"morphTargetInfluences",c)}}}function Vf(a,b){var c={};return{update:function(d){var e=b.render.frame,f=d.geometry,g=a.get(d,f);c[g.id]!==e&&(f.isGeometry&&g.updateFromObject(d),a.update(g),c[g.id]=e);return g},dispose:function(){c={}}}}function Ua(a,b,c,d,e,f,g,h,k,m){a=void 0!==a?a:[];T.call(this,a,void 0!==b?b:301,c,d,e,f,g,h,k,m);this.flipY=!1}function Jb(a,b,c){var d=a[0];if(0>=d||0/gm, +function(a,c){a=S[c];if(void 0===a)throw Error("Can not resolve #include <"+c+">");return Xd(a)})}function Xe(a){return a.replace(/#pragma unroll_loop[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(a,c,d,e){a="";for(c=parseInt(c);cb||a.height>b){if("data"in a){console.warn("THREE.WebGLRenderer: image in DataTexture is too big ("+a.width+"x"+a.height+")."); +return}b/=Math.max(a.width,a.height);var c=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");c.width=Math.floor(a.width*b);c.height=Math.floor(a.height*b);c.getContext("2d").drawImage(a,0,0,a.width,a.height,0,0,c.width,c.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+c.width+"x"+c.height);return c}return a}function k(a){return H.isPowerOfTwo(a.width)&&H.isPowerOfTwo(a.height)}function m(a,b){return a.generateMipmaps&&b&&1003!== +a.minFilter&&1006!==a.minFilter}function q(b,c,e,f){a.generateMipmap(b);d.get(c).__maxMipLevel=Math.log(Math.max(e,f))*Math.LOG2E}function n(b,c){if(!e.isWebGL2)return b;if(b===a.RGB){if(c===a.FLOAT)return a.RGB32F;if(c===a.HALF_FLOAT)return a.RGB16F;if(c===a.UNSIGNED_BYTE)return a.RGB8}if(b===a.RGBA){if(c===a.FLOAT)return a.RGBA32F;if(c===a.HALF_FLOAT)return a.RGBA16F;if(c===a.UNSIGNED_BYTE)return a.RGBA8}return b}function t(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function u(b){b= +b.target;b.removeEventListener("dispose",u);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)}b.isVideoTexture&&delete B[b.id];g.memory.textures--}function r(b){b=b.target;b.removeEventListener("dispose",r);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.memory.textures--}function l(b,t){var r=d.get(b);if(b.isVideoTexture){var l=b.id,v=g.render.frame;B[l]!==v&&(B[l]=v,b.update())}if(0w;w++)v[w]=t||l?l?b.image[w].image:b.image[w]:h(b.image[w],e.maxCubemapSize);var y=v[0],E=k(y),P=f.convert(b.format),x=f.convert(b.type),N=n(P,x);p(a.TEXTURE_CUBE_MAP,b,E);for(w=0;6>w;w++)if(t)for(var B,z=v[w].mipmaps,A=0,D=z.length;At;t++)e.__webglFramebuffer[t]=a.createFramebuffer()}else e.__webglFramebuffer= +a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);p(a.TEXTURE_CUBE_MAP,b.texture,n);for(t=0;6>t;t++)x(e.__webglFramebuffer[t],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+t);m(b.texture,n)&&q(a.TEXTURE_CUBE_MAP,b.texture,b.width,b.height);c.bindTexture(a.TEXTURE_CUBE_MAP,null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),p(a.TEXTURE_2D,b.texture,n),x(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),m(b.texture,n)&&q(a.TEXTURE_2D,b.texture,b.width,b.height), +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);l(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(),w(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),w(e.__webglDepthbuffer,b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture,f=k(b);if(m(e,f)){f=b.isWebGLRenderTargetCube?a.TEXTURE_CUBE_MAP:a.TEXTURE_2D;var g=d.get(e).__webglTexture; +c.bindTexture(f,g);q(f,e,b.width,b.height);c.bindTexture(f,null)}}}function $e(a,b,c){return{convert:function(d){if(1E3===d)return a.REPEAT;if(1001===d)return a.CLAMP_TO_EDGE;if(1002===d)return a.MIRRORED_REPEAT;if(1003===d)return a.NEAREST;if(1004===d)return a.NEAREST_MIPMAP_NEAREST;if(1005===d)return a.NEAREST_MIPMAP_LINEAR;if(1006===d)return a.LINEAR;if(1007===d)return a.LINEAR_MIPMAP_NEAREST;if(1008===d)return a.LINEAR_MIPMAP_LINEAR;if(1009===d)return a.UNSIGNED_BYTE;if(1017===d)return a.UNSIGNED_SHORT_4_4_4_4; +if(1018===d)return a.UNSIGNED_SHORT_5_5_5_1;if(1019===d)return a.UNSIGNED_SHORT_5_6_5;if(1010===d)return a.BYTE;if(1011===d)return a.SHORT;if(1012===d)return a.UNSIGNED_SHORT;if(1013===d)return a.INT;if(1014===d)return a.UNSIGNED_INT;if(1015===d)return a.FLOAT;if(1016===d){if(c.isWebGL2)return a.HALF_FLOAT;var e=b.get("OES_texture_half_float");if(null!==e)return e.HALF_FLOAT_OES}if(1021===d)return a.ALPHA;if(1022===d)return a.RGB;if(1023===d)return a.RGBA;if(1024===d)return a.LUMINANCE;if(1025=== +d)return a.LUMINANCE_ALPHA;if(1026===d)return a.DEPTH_COMPONENT;if(1027===d)return a.DEPTH_STENCIL;if(100===d)return a.FUNC_ADD;if(101===d)return a.FUNC_SUBTRACT;if(102===d)return a.FUNC_REVERSE_SUBTRACT;if(200===d)return a.ZERO;if(201===d)return a.ONE;if(202===d)return a.SRC_COLOR;if(203===d)return a.ONE_MINUS_SRC_COLOR;if(204===d)return a.SRC_ALPHA;if(205===d)return a.ONE_MINUS_SRC_ALPHA;if(206===d)return a.DST_ALPHA;if(207===d)return a.ONE_MINUS_DST_ALPHA;if(208===d)return a.DST_COLOR;if(209=== +d)return a.ONE_MINUS_DST_COLOR;if(210===d)return a.SRC_ALPHA_SATURATE;if(33776===d||33777===d||33778===d||33779===d)if(e=b.get("WEBGL_compressed_texture_s3tc"),null!==e){if(33776===d)return e.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===d)return e.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===d)return e.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(33779===d)return e.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(35840===d||35841===d||35842===d||35843===d)if(e=b.get("WEBGL_compressed_texture_pvrtc"),null!==e){if(35840===d)return e.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; +if(35841===d)return e.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===d)return e.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===d)return e.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===d&&(e=b.get("WEBGL_compressed_texture_etc1"),null!==e))return e.COMPRESSED_RGB_ETC1_WEBGL;if(37808===d||37809===d||37810===d||37811===d||37812===d||37813===d||37814===d||37815===d||37816===d||37817===d||37818===d||37819===d||37820===d||37821===d)if(e=b.get("WEBGL_compressed_texture_astc"),null!==e)return d;if(103===d||104=== +d){if(c.isWebGL2){if(103===d)return a.MIN;if(104===d)return a.MAX}e=b.get("EXT_blend_minmax");if(null!==e){if(103===d)return e.MIN_EXT;if(104===d)return e.MAX_EXT}}if(1020===d){if(c.isWebGL2)return a.UNSIGNED_INT_24_8;e=b.get("WEBGL_depth_texture");if(null!==e)return e.UNSIGNED_INT_24_8_WEBGL}return 0}}}function Kb(){D.call(this);this.type="Group"}function Z(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 yc(a){Z.call(this);this.cameras=a||[]}function af(a){function b(){return null!==e&&!0===e.isPresenting}function c(){if(b()){var c=e.getEyeParameters("left"),f=c.renderWidth;c=c.renderHeight;x=a.getPixelRatio();y=a.getSize();a.setDrawingBufferSize(2*f,c,1);B.start()}else d.enabled&&(a.setDrawingBufferSize(y.width,y.height,x),B.stop())}var d=this,e=null,f=null,g=null,h= +[],k=new I,m=new I;"undefined"!==typeof window&&"VRFrameData"in window&&(f=new window.VRFrameData,window.addEventListener("vrdisplaypresentchange",c,!1));var q=new I,n=new fa,t=new p,u=new Z;u.bounds=new V(0,0,.5,1);u.layers.enable(1);var r=new Z;r.bounds=new V(.5,0,.5,1);r.layers.enable(2);var l=new yc([u,r]);l.layers.enable(1);l.layers.enable(2);var y,x,w=[];this.enabled=!1;this.userHeight=1.6;this.getController=function(a){var b=h[a];void 0===b&&(b=new Kb,b.matrixAutoUpdate=!1,b.visible=!1,h[a]= +b);return b};this.getDevice=function(){return e};this.setDevice=function(a){void 0!==a&&(e=a);B.setContext(a)};this.setPoseTarget=function(a){void 0!==a&&(g=a)};this.getCamera=function(a){if(null===e)return a.position.set(0,d.userHeight,0),a;e.depthNear=a.near;e.depthFar=a.far;e.getFrameData(f);var b=e.stageParameters;b?k.fromArray(b.sittingToStandingTransform):k.makeTranslation(0,d.userHeight,0);b=f.pose;var c=null!==g?g:a;c.matrix.copy(k);c.matrix.decompose(c.position,c.quaternion,c.scale);null!== +b.orientation&&(n.fromArray(b.orientation),c.quaternion.multiply(n));null!==b.position&&(n.setFromRotationMatrix(k),t.fromArray(b.position),t.applyQuaternion(n),c.position.add(t));c.updateMatrixWorld();if(!1===e.isPresenting)return a;u.near=a.near;r.near=a.near;u.far=a.far;r.far=a.far;l.matrixWorld.copy(a.matrixWorld);l.matrixWorldInverse.copy(a.matrixWorldInverse);u.matrixWorldInverse.fromArray(f.leftViewMatrix);r.matrixWorldInverse.fromArray(f.rightViewMatrix);m.getInverse(k);u.matrixWorldInverse.multiply(m); +r.matrixWorldInverse.multiply(m);a=c.parent;null!==a&&(q.getInverse(a.matrixWorld),u.matrixWorldInverse.multiply(q),r.matrixWorldInverse.multiply(q));u.matrixWorld.getInverse(u.matrixWorldInverse);r.matrixWorld.getInverse(r.matrixWorldInverse);u.projectionMatrix.fromArray(f.leftProjectionMatrix);r.projectionMatrix.fromArray(f.rightProjectionMatrix);l.projectionMatrix.copy(u.projectionMatrix);a=e.getLayers();a.length&&(a=a[0],null!==a.leftBounds&&4===a.leftBounds.length&&u.bounds.fromArray(a.leftBounds), +null!==a.rightBounds&&4===a.rightBounds.length&&r.bounds.fromArray(a.rightBounds));a:for(a=0;af.normalMatrix.determinant();ba.setMaterial(e,h);var k=t(a,c,e,f),m=!1;if(b!==d.id||S!==k.id||nd!==(!0===e.wireframe))b=d.id,S=k.id,nd=!0===e.wireframe,m=!0;f.morphTargetInfluences&&(va.update(f,d,e,k),m=!0);h=d.index;var q=d.attributes.position;c=1;!0===e.wireframe&& +(h=ra.getWireframeAttribute(d),c=2);a=xa;if(null!==h){var n=pa.get(h);a=ya;a.setIndex(n)}if(m){if(d&&d.isInstancedBufferGeometry&!ua.isWebGL2&&null===ha.get("ANGLE_instanced_arrays"))console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{ba.initAttributes();m=d.attributes;k=k.getAttributes();var u=e.defaultAttributeValues;for(N in k){var l=k[N];if(0<=l){var r=m[N];if(void 0!==r){var v=r.normalized, +p=r.itemSize,w=pa.get(r);if(void 0!==w){var y=w.buffer,E=w.type;w=w.bytesPerElement;if(r.isInterleavedBufferAttribute){var x=r.data,B=x.stride;r=r.offset;x&&x.isInstancedInterleavedBuffer?(ba.enableAttributeAndDivisor(l,x.meshPerAttribute),void 0===d.maxInstancedCount&&(d.maxInstancedCount=x.meshPerAttribute*x.count)):ba.enableAttribute(l);F.bindBuffer(F.ARRAY_BUFFER,y);F.vertexAttribPointer(l,p,E,v,B*w,r*w)}else r.isInstancedBufferAttribute?(ba.enableAttributeAndDivisor(l,r.meshPerAttribute),void 0=== +d.maxInstancedCount&&(d.maxInstancedCount=r.meshPerAttribute*r.count)):ba.enableAttribute(l),F.bindBuffer(F.ARRAY_BUFFER,y),F.vertexAttribPointer(l,p,E,v,0,0)}}else if(void 0!==u&&(v=u[N],void 0!==v))switch(v.length){case 2:F.vertexAttrib2fv(l,v);break;case 3:F.vertexAttrib3fv(l,v);break;case 4:F.vertexAttrib4fv(l,v);break;default:F.vertexAttrib1fv(l,v)}}}ba.disableUnusedAttributes()}null!==h&&F.bindBuffer(F.ELEMENT_ARRAY_BUFFER,n.buffer)}n=Infinity;null!==h?n=h.count:void 0!==q&&(n=q.count);h=d.drawRange.start* +c;q=null!==g?g.start*c:0;var N=Math.max(h,q);g=Math.max(0,Math.min(n,h+d.drawRange.count*c,q+(null!==g?g.count*c:Infinity))-1-N+1);if(0!==g){if(f.isMesh)if(!0===e.wireframe)ba.setLineWidth(e.wireframeLinewidth*(null===R?U:1)),a.setMode(F.LINES);else switch(f.drawMode){case 0:a.setMode(F.TRIANGLES);break;case 1:a.setMode(F.TRIANGLE_STRIP);break;case 2:a.setMode(F.TRIANGLE_FAN)}else f.isLine?(e=e.linewidth,void 0===e&&(e=1),ba.setLineWidth(e*(null===R?U:1)),f.isLineSegments?a.setMode(F.LINES):f.isLineLoop? +a.setMode(F.LINE_LOOP):a.setMode(F.LINE_STRIP)):f.isPoints?a.setMode(F.POINTS):f.isSprite&&a.setMode(F.TRIANGLES);d&&d.isInstancedBufferGeometry?0=ua.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+a+" texture units while this GPU supports only "+ua.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);ia.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);ia.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?ia.setTextureCube(b,c):ia.setTextureCubeDynamic(b,c)}}();this.setFramebuffer=function(a){L=a};this.getRenderTarget=function(){return R};this.setRenderTarget=function(a){(R=a)&&void 0===Ba.get(a).__webglFramebuffer&&ia.setupRenderTarget(a);var b=L,c=!1;a?(b= +Ba.get(a).__webglFramebuffer,a.isWebGLRenderTargetCube&&(b=b[a.activeCubeFace],c=!0),T.copy(a.viewport),wc.copy(a.scissor),ea=a.scissorTest):(T.copy(od).multiplyScalar(U),wc.copy(fa).multiplyScalar(U),ea=qa);Q!==b&&(F.bindFramebuffer(F.FRAMEBUFFER,b),Q=b);ba.viewport(T);ba.scissor(wc);ba.setScissorTest(ea);c&&(c=Ba.get(a.texture),F.framebufferTexture2D(F.FRAMEBUFFER,F.COLOR_ATTACHMENT0,F.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,c.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels= +function(a,b,c,d,e,f){if(a&&a.isWebGLRenderTarget){var g=Ba.get(a).__webglFramebuffer;if(g){var h=!1;g!==Q&&(F.bindFramebuffer(F.FRAMEBUFFER,g),h=!0);try{var k=a.texture,m=k.format,q=k.type;1023!==m&&da.convert(m)!==F.getParameter(F.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===q||da.convert(q)===F.getParameter(F.IMPLEMENTATION_COLOR_READ_TYPE)||1015===q&&(ua.isWebGL2||ha.get("OES_texture_float")|| +ha.get("WEBGL_color_buffer_float"))||1016===q&&(ua.isWebGL2?ha.get("EXT_color_buffer_float"):ha.get("EXT_color_buffer_half_float"))?F.checkFramebufferStatus(F.FRAMEBUFFER)===F.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&F.readPixels(b,c,d,e,da.convert(m),da.convert(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&& +F.bindFramebuffer(F.FRAMEBUFFER,Q)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")};this.copyFramebufferToTexture=function(a,b,c){var d=b.image.width,e=b.image.height,f=da.convert(b.format);this.setTexture2D(b,0);F.copyTexImage2D(F.TEXTURE_2D,c||0,f,a.x,a.y,d,e,0)};this.copyTextureToTexture=function(a,b,c,d){var e=b.image.width,f=b.image.height,g=da.convert(c.format),h=da.convert(c.type);this.setTexture2D(c,0);b.isDataTexture?F.texSubImage2D(F.TEXTURE_2D, +d||0,a.x,a.y,e,f,g,h,b.image.data):F.texSubImage2D(F.TEXTURE_2D,d||0,a.x,a.y,g,h,b.image)}}function Lb(a,b){this.name="";this.color=new G(a);this.density=void 0!==b?b:2.5E-4}function Mb(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 qd(){D.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function ob(a,b){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.version=0}function zc(a,b,c,d){this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function cb(a){J.call(this);this.type="SpriteMaterial";this.color=new G(16777215);this.map=null;this.rotation=0;this.lights=!1;this.transparent=!0;this.setValues(a)}function Ac(a){D.call(this);this.type="Sprite";if(void 0===Nb){Nb=new C;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 ob(b,5);Nb.setIndex([0,1,2,0,2,3]);Nb.addAttribute("position", +new zc(b,3,0,!1));Nb.addAttribute("uv",new zc(b,2,3,!1))}this.geometry=Nb;this.material=void 0!==a?a:new cb;this.center=new z(.5,.5)}function Bc(){D.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function Cc(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 for(console.warn("THREE.Skeleton boneInverses is the wrong length."), +this.boneInverses=[],a=0,b=this.bones.length;ac;c++){var n=q[h[c]];var t=q[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){k=a.attributes.position;q=a.index;var u=a.groups;0===u.length&&(u=[{start:0, +count:q.count,materialIndex:0}]);a=0;for(e=u.length;ac;c++)n=q.getX(m+c),t=q.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(k,m.index1),b.push(h.x,h.y,h.z),h.fromBufferAttribute(k,m.index2),b.push(h.x,h.y,h.z)}else for(k=a.attributes.position,m=0,d=k.count/3;mc;c++)g=3*m+c,h.fromBufferAttribute(k,g),b.push(h.x, +h.y,h.z),g=3*m+(c+1)%3,h.fromBufferAttribute(k,g),b.push(h.x,h.y,h.z);this.addAttribute("position",new A(b,3))}function Fc(a,b,c){R.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Rb(a,b,c));this.mergeVertices()}function Rb(a,b,c){C.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=new p,k=new p,m=new p,q=new p,n=new p,t,u;3>a.length&&console.error("THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter."); +var r=b+1;for(t=0;t<=c;t++){var l=t/c;for(u=0;u<=b;u++){var y=u/b;a(y,l,k);e.push(k.x,k.y,k.z);0<=y-1E-5?(a(y-1E-5,l,m),q.subVectors(k,m)):(a(y+1E-5,l,m),q.subVectors(m,k));0<=l-1E-5?(a(y,l-1E-5,m),n.subVectors(k,m)):(a(y,l+1E-5,m),n.subVectors(m,k));h.crossVectors(q,n).normalize();f.push(h.x,h.y,h.z);g.push(y,l)}}for(t=0;td&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}C.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 p,d=new p,g=new p,h=0;he&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute("position",new A(h,3));this.addAttribute("normal",new A(h.slice(),3));this.addAttribute("uv",new A(k,2));0===d?this.computeVertexNormals():this.normalizeNormals()}function Hc(a, +b){R.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Sb(a,b));this.mergeVertices()}function Sb(a,b){na.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 Ic(a,b){R.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new pb(a,b));this.mergeVertices()}function pb(a,b){na.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 Jc(a,b){R.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Tb(a,b));this.mergeVertices()}function Tb(a,b){var c=(1+Math.sqrt(5))/2;na.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 Kc(a,b){R.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ub(a,b));this.mergeVertices()}function Ub(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;na.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 Lc(a,b,c,d,e,f){R.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 Vb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Vb(a,b,c,d,e){function f(e){q=a.getPointAt(e/b,q);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);k.x=m*f.x+n*e.x;k.y=m*f.y+n*e.y;k.z=m*f.z+n*e.z;k.normalize();r.push(k.x,k.y,k.z);h.x=q.x+c*k.x;h.y=q.y+c*k.y;h.z= +q.z+c*k.z;l.push(h.x,h.y,h.z)}}C.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,k=new p,m=new z,q=new p,n,t,l=[],r=[],v=[],y=[];for(n=0;n=b;e-=d)f=cf(e,a[e],a[e+1],f);f&&qb(f,f.next)&&(Oc(f),f=f.next);return f}function Pc(a,b){if(!a)return a;b||(b=a);do{var c=!1;if(a.steiner||!qb(a,a.next)&&0!==ma(a.prev,a,a.next))a=a.next;else{Oc(a);a=b=a.prev;if(a===a.next)break;c=!0}}while(c||a!==b);return b} +function Qc(a,b,c,d,e,f,g){if(a){if(!g&&f){var h=a,k=h;do null===k.z&&(k.z=ae(k.x,k.y,d,e,f)),k.prevZ=k.prev,k=k.nextZ=k.next;while(k!==h);k.prevZ.nextZ=null;k.prevZ=null;h=k;var m,q,n,t,l=1;do{k=h;var r=h=null;for(q=0;k;){q++;var v=k;for(m=n=0;mn.x?q.x>l.x?q.x:l.x:n.x>l.x?n.x:l.x,B=q.y>n.y?q.y>l.y?q.y:l.y:n.y>l.y?n.y:l.y;m=ae(q.x=m;){if(p!==r.prev&&p!==r.next&&ud(q.x,q.y,n.x,n.y,l.x,l.y,p.x,p.y)&&0<=ma(p.prev,p,p.next)){r=!1;break a}p= +p.prevZ}r=!0}}else a:if(r=a,q=r.prev,n=r,l=r.next,0<=ma(q,n,l))r=!1;else{for(m=r.next.next;m!==r.prev;){if(ud(q.x,q.y,n.x,n.y,l.x,l.y,m.x,m.y)&&0<=ma(m.prev,m,m.next)){r=!1;break a}m=m.next}r=!0}if(r)b.push(k.i/c),b.push(a.i/c),b.push(v.i/c),Oc(a),h=a=v.next;else if(a=v,a===h){if(!g)Qc(Pc(a),b,c,d,e,f,1);else if(1===g){g=b;h=c;k=a;do v=k.prev,r=k.next.next,!qb(v,r)&&df(v,k,k.next,r)&&Rc(v,r)&&Rc(r,v)&&(g.push(v.i/h),g.push(k.i/h),g.push(r.i/h),Oc(k),Oc(k.next),k=a=r),k=k.next;while(k!==a);a=k;Qc(a, +b,c,d,e,f,2)}else if(2===g)a:{g=a;do{for(h=g.next.next;h!==g.prev;){if(k=g.i!==h.i){k=g;v=h;if(r=k.next.i!==v.i&&k.prev.i!==v.i){b:{r=k;do{if(r.i!==k.i&&r.next.i!==k.i&&r.i!==v.i&&r.next.i!==v.i&&df(r,r.next,k,v)){r=!0;break b}r=r.next}while(r!==k);r=!1}r=!r}if(r=r&&Rc(k,v)&&Rc(v,k)){r=k;q=!1;n=(k.x+v.x)/2;v=(k.y+v.y)/2;do r.y>v!==r.next.y>v&&r.next.y!==r.y&&n<(r.next.x-r.x)*(v-r.y)/(r.next.y-r.y)+r.x&&(q=!q),r=r.next;while(r!==k);r=q}k=r}if(k){a=ef(g,h);g=Pc(g,g.next);a=Pc(a,a.next);Qc(g,b,c,d,e, +f);Qc(a,b,c,d,e,f);break a}h=h.next}g=g.next}while(g!==a)}break}}}}function Ng(a,b){return a.x-b.x}function Og(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.x&&c.x>=g&&d!==c.x&&ud(eh.x)&&Rc(c,a)&&(h=c,m=q)}c=c.next}return h}function ae(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 Pg(a){var b=a,c=a;do b.xma(a.prev,a,a.next)?0<=ma(a,b,a.next)&&0<=ma(a,a.prev,b):0>ma(a,b,a.prev)||0>ma(a,a.next,b)}function ef(a,b){var c=new be(a.i,a.x,a.y),d=new be(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 cf(a,b,c,d){a=new be(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 Oc(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 be(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 ff(a){var b=a.length;2Number.EPSILON){var k=Math.sqrt(h),m=Math.sqrt(f*f+g*g);h=b.x-e/k;b=b.y+d/k; +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 z(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 z(f/e,d/e)}function h(a,b){for(M=a.length;0<=--M;){var c=M;var f=M-1;0>f&&(f=a.length-1);var g,h=w+2*O;for(g=0;gq;q++){var n=m[f[q]];var l=m[f[(q+1)%3]];d[0]=Math.min(n,l);d[1]=Math.max(n,l);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.addAttribute("position",new A(c,3))}function vb(a,b,c,d,e,f,g,h){R.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 Wa(a,b,c,d,e,f,g,h));this.mergeVertices()}function Wa(a,b,c,d,e,f,g,h){function k(c){var e,f=new z,k=new p,t=0,v=!0===c?a:b,w=!0===c?1:-1;var A=r;for(e=1;e<=d;e++)n.push(0,y*w,0),l.push(0,w,0),u.push(.5,.5),r++;var C= +r;for(e=0;e<=d;e++){var D=e/d*h+g,H=Math.cos(D);D=Math.sin(D);k.x=v*D;k.y=y*w;k.z=v*H;n.push(k.x,k.y,k.z);l.push(0,w,0);f.x=.5*H+.5;f.y=.5*D*w+.5;u.push(f.x,f.y);r++}for(e=0;ethis.duration&&this.resetDuration()}function Rg(a){switch(a.toLowerCase()){case "scalar":case "double":case "float":case "number":case "integer":return ec;case "vector":case "vector2":case "vector3":case "vector4":return fc; +case "color":return Hd;case "quaternion":return cd;case "bool":case "boolean":return Gd;case "string":return Jd}throw Error("THREE.KeyframeTrack: Unsupported typeName: "+a);}function Sg(a){if(void 0===a.type)throw Error("THREE.KeyframeTrack: track type undefined, can not parse");var b=Rg(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)}function Kd(a){this.manager=void 0!== +a?a:ka;this.textures={}}function ge(a){this.manager=void 0!==a?a:ka}function gc(){}function he(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!==a?a:ka;this.withCredentials=!1}function mf(a){this.manager=void 0!==a?a:ka;this.texturePath=""}function ie(a){"undefined"===typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported.");"undefined"===typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported."); +this.manager=void 0!==a?a:ka;this.options=void 0}function je(){this.type="ShapePath";this.color=new G;this.subPaths=[];this.currentPath=null}function ke(a){this.type="Font";this.data=a}function nf(a){this.manager=void 0!==a?a:ka}function le(a){this.manager=void 0!==a?a:ka}function of(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new Z;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new Z;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate= +!1}function dd(a,b,c){D.call(this);this.type="CubeCamera";var d=new Z(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new p(1,0,0));this.add(d);var e=new Z(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new p(-1,0,0));this.add(e);var f=new Z(90,1,a,b);f.up.set(0,0,1);f.lookAt(new p(0,1,0));this.add(f);var g=new Z(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new p(0,-1,0));this.add(g);var h=new Z(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new p(0,0,1));this.add(h);var k=new Z(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new p(0,0,-1));this.add(k); +this.renderTarget=new Gb(c,c,{format:1022,magFilter:1006,minFilter:1006});this.renderTarget.texture.name="CubeCamera";this.update=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,m=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=m;c.activeCubeFace=5;a.render(b, +k,c);a.setRenderTarget(null)};this.clear=function(a,b,c,d){for(var e=this.renderTarget,f=0;6>f;f++)e.activeCubeFace=f,a.setRenderTarget(e),a.clear(b,c,d);a.setRenderTarget(null)}}function me(){D.call(this);this.type="AudioListener";this.context=ne.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function hc(a){D.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.offset=this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function oe(a){hc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function pe(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 qe(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 pf(a,b,c){c=c||pa.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function pa(a,b,c){this.path=b;this.parsedPath=c||pa.parseTrackName(b);this.node=pa.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function qf(){this.uuid= +H.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 rf(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 re(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Ld(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function se(){C.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function te(a,b,c){ob.call(this,a,b);this.meshPerAttribute=c||1}function ue(a,b,c){Q.call(this, +a,b);this.meshPerAttribute=c||1}function sf(a,b,c,d){this.ray=new mb(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 tf(a,b){return a.distance-b.distance}function ve(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=a.length;dc;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 A(b,3));b=new Y({fog:!1});this.cone=new W(a,b);this.add(this.cone);this.update()}function xf(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;ca?-1:0b;b++)a[b]=(16>b?"0":"")+b.toString(16);return function(){var b=4294967295*Math.random()|0,d=4294967295*Math.random()|0,e=4294967295*Math.random()|0,f=4294967295*Math.random()|0;return(a[b&255]+a[b>>8&255]+a[b>>16&255]+a[b>>24&255]+"-"+a[d&255]+a[d>>8&255]+"-"+a[d>> +16&15|64]+a[d>>24&255]+"-"+a[e&63|128]+a[e>>8&255]+"-"+a[e>>16&255]+a[e>>24&255]+a[f&255]+a[f>>8&255]+a[f>>16&255]+a[f>>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*H.DEG2RAD},radToDeg:function(a){return a*H.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))}};Object.defineProperties(z.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(z.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(){var a=new z,b=new z;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},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(){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},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){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);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}});Object.assign(I.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,m,q,n,l,u,r,p){var t=this.elements;t[0]=a;t[4]=b;t[8]=c;t[12]=d;t[1]=e;t[5]=f;t[9]=g;t[13]=h;t[2]=k;t[6]=m;t[10]=q;t[14]=n;t[3]=l;t[7]=u;t[11]=r;t[15]=p;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 I).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 p;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[3]=0;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*f;c[7]=0;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;c[11]=0;c[12]=0;c[13]=0;c[14]=0;c[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 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(){var a= +new p(0,0,0),b=new p(1,1,1);return function(c){return this.compose(a,c,b)}}(),lookAt:function(){var a=new p,b=new p,c=new p;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;b=this.elements;a=c[0];var e=c[4],f=c[8],g=c[12],h=c[1],k=c[5],m=c[9],q=c[13],n=c[2],l=c[6],u=c[10],r=c[14],p=c[3],y=c[7],x=c[11];c=c[15];var w=d[0],B=d[4],E=d[8],P=d[12],N=d[1],z=d[5],A=d[9],D=d[13],C=d[2], +H=d[6],G=d[10],K=d[14],L=d[3],I=d[7],J=d[11];d=d[15];b[0]=a*w+e*N+f*C+g*L;b[4]=a*B+e*z+f*H+g*I;b[8]=a*E+e*A+f*G+g*J;b[12]=a*P+e*D+f*K+g*d;b[1]=h*w+k*N+m*C+q*L;b[5]=h*B+k*z+m*H+q*I;b[9]=h*E+k*A+m*G+q*J;b[13]=h*P+k*D+m*K+q*d;b[2]=n*w+l*N+u*C+r*L;b[6]=n*B+l*z+u*H+r*I;b[10]=n*E+l*A+u*G+r*J;b[14]=n*P+l*D+u*K+r*d;b[3]=p*w+y*N+x*C+c*L;b[7]=p*B+y*z+x*H+c*I;b[11]=p*E+y*A+x*G+c*J;b[15]=p*P+y*D+x*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 p;return function(b){for(var c=0,d=b.count;cthis.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.copy(this);c=1/g;f=1/h;var 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}});Object.assign(fa,{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 t=h*d+k*q+m*l+c*e,u=0<=t?1:-1,r=1-t*t;r>Number.EPSILON&&(r=Math.sqrt(r),t=Math.atan2(r,t*u),f=Math.sin(f*t)/r,g=Math.sin(g* +t)/r);u*=g;h=h*f+d*u;k=k*f+q*u;m=m*f+l*u;c=c*f+e*u;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(fa.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(fa.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;a=a.order;var f=Math.cos,g=Math.sin,h=f(c/2),k=f(d/2);f=f(e/2);c=g(c/2);d=g(d/2);e=g(e/2);"XYZ"===a?(this._x=c*k*f+h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f-c*d*e):"YXZ"===a?(this._x=c*k*f+h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f+c*d*e):"ZXY"===a?(this._x=c*k*f-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f-c*d*e):"ZYX"===a?(this._x=c*k*f-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f+c*d*e):"YZX"===a?(this._x=c*k*f+ +h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f-c*d*e):"XZY"===a&&(this._x=c*k*f-h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f+c*d*e);if(!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],k=b[6];b=b[10];var m=c+f+b;0f&&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 p,b;return function(c,d){void 0===a&&(a=new p);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()}}(),angleTo:function(a){return 2*Math.acos(Math.abs(H.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();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},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});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(){var a=new fa;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 fa;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 I;return function(b){a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyMatrix4(a)}}(),unproject:function(){var a=new I;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 p,b=new p;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)},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){return this.subVectors(b,a).multiplyScalar(c).add(a)},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.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a= +new p;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=new p;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(H.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){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(ra.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 p;return function(b){for(var c=0,d=b.count;cc;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 eb={getDataURL:function(a){if(a instanceof HTMLCanvasElement)var b=a;else{"undefined"!==typeof OffscreenCanvas?b=new OffscreenCanvas(a.width,a.height):(b=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),b.width=a.width,b.height=a.height);var c=b.getContext("2d");a instanceof ImageData?c.putImageData(a,0,0):c.drawImage(a,0,0,a.width,a.height)}return 2048a.x||1a.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||1a.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.defineProperty(T.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(V.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 k=a[6];var m=a[10];if(.01>Math.abs(c-e)&&.01>Math.abs(d-h)&&.01>Math.abs(g-k)){if(.1>Math.abs(c+e)&&.1>Math.abs(d+h)&&.1>Math.abs(g+k)&&.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+k)/4;b>f&&b>m?.01>b?(k=0,c=h=.707106781):(k=Math.sqrt(b),h=c/k,c=d/k):f>m?.01>f?(k=.707106781,h=0,c=.707106781):(h=Math.sqrt(f),k=c/h,c=g/h):.01>m?(h=k=.707106781,c=0):(c=Math.sqrt(m),k=d/c,h=g/c);this.set(k,h,c,a);return this}a=Math.sqrt((k-g)*(k-g)+(d-h)*(d-h)+(e-c)*(e-c));.001>Math.abs(a)&&(a=1);this.x=(k-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(){var a,b;return function(c,d){void 0===a&&(a=new V,b=new V);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)},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){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}});fb.prototype=Object.assign(Object.create(ya.prototype),{constructor:fb,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"})}});Gb.prototype=Object.create(fb.prototype);Gb.prototype.constructor=Gb;Gb.prototype.isWebGLRenderTargetCube=!0;gb.prototype=Object.create(T.prototype);gb.prototype.constructor=gb;gb.prototype.isDataTexture=!0;Object.assign(Sa.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;he&&(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;he&&(e=m);l>f&&(f=l);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;bthis.max.x||a.ythis.max.y||a.zthis.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.xthis.max.x||a.max.ythis.max.y||a.max.zthis.max.z?!1:!0},intersectsSphere:function(){var a=new p;return function(b){this.clampPoint(b.center, +a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){if(0=a.constant},intersectsTriangle:function(){function a(a){var e; +var f=0;for(e=a.length-3;f<=e;f+=3){h.fromArray(a,f);var g=m.x*Math.abs(h.x)+m.y*Math.abs(h.y)+m.z*Math.abs(h.z),k=b.dot(h),l=c.dot(h),q=d.dot(h);if(Math.max(-Math.max(k,l,q),Math.min(k,l,q))>g)return!1}return!0}var b=new p,c=new p,d=new p,e=new p,f=new p,g=new p,h=new p,k=new p,m=new p,l=new p;return function(h){if(this.isEmpty())return!1;this.getCenter(k);m.subVectors(this.max,k);b.subVectors(h.a,k);c.subVectors(h.b,k);d.subVectors(h.c,k);e.subVectors(c,b);f.subVectors(d,c);g.subVectors(b,d);h= +[0,-e.z,e.y,0,-f.z,f.y,0,-g.z,g.y,e.z,0,-e.x,f.z,0,-f.x,g.z,0,-g.x,-e.y,e.x,0,-f.y,f.x,0,-g.y,g.x,0];if(!a(h))return!1;h=[1,0,0,0,1,0,0,0,1];if(!a(h))return!1;l.crossVectors(e,f);h=[l.x,l.y,l.z];return a(h)}}(),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(){var a=new p;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a= +new p;return function(b){void 0===b&&(console.warn("THREE.Box3: .getBoundingSphere() target is now required"),b=new Da);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(a){if(this.isEmpty())return this;a=a.elements;var b=a[0]*this.min.x,c=a[1]*this.min.x,d=a[2]*this.min.x,e= +a[0]*this.max.x,f=a[1]*this.max.x,g=a[2]*this.max.x,h=a[4]*this.min.y,k=a[5]*this.min.y,m=a[6]*this.min.y,l=a[4]*this.max.y,n=a[5]*this.max.y,t=a[6]*this.max.y,u=a[8]*this.min.z,r=a[9]*this.min.z,p=a[10]*this.min.z,y=a[8]*this.max.z,x=a[9]*this.max.z,w=a[10]*this.max.z;this.min.x=Math.min(b,e)+Math.min(h,l)+Math.min(u,y)+a[12];this.min.y=Math.min(c,f)+Math.min(k,n)+Math.min(r,x)+a[13];this.min.z=Math.min(d,g)+Math.min(m,t)+Math.min(p,w)+a[14];this.max.x=Math.max(b,e)+Math.max(h,l)+Math.max(u,y)+a[12]; +this.max.y=Math.max(c,f)+Math.max(k,n)+Math.max(r,x)+a[13];this.max.z=Math.max(d,g)+Math.max(m,t)+Math.max(p,w)+a[14];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(Da.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new Sa;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e= +c=0,f=b.length;e=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(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 Sa);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(Ma.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 p,b=new p;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){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(){var a= +new p;return function(b,c){void 0===c&&(console.warn("THREE.Plane: .intersectLine() target is now required"),c=new p);var d=b.delta(a),e=this.normal.dot(d);if(0===e){if(0===this.distanceToPoint(b.start))return c.copy(b.start)}else if(e=-(b.start.dot(this.normal)+this.constant)/e,!(0>e||1b&&0a&&0c;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],l=c[8],n=c[9],t=c[10],p=c[11],r=c[12],v=c[13],y=c[14];c=c[15];b[0].setComponents(f-a,m-g,p-l,c-r).normalize();b[1].setComponents(f+a,m+g,p+l,c+r).normalize();b[2].setComponents(f+d,m+h,p+n,c+v).normalize();b[3].setComponents(f-d,m-h,p-n,c-v).normalize();b[4].setComponents(f-e,m-k,p-t,c-y).normalize();b[5].setComponents(f+e,m+k,p+t,c+y).normalize();return this},intersectsObject:function(){var a=new Da;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 Da;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)d;d++){var e=c[d]; +a.x=0e.distanceToPoint(a))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 S={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 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 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\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\n", +clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\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 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}\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( sampler2D envMap, 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, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\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\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\tuniform int maxMipLevel;\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_physical_pars_fragment:"#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( envMap, 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( envMap, queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent ));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 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", +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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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_begin:"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\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\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 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\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\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#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_fragment_begin:"\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\t#pragma unroll_loop\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 ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\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#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearCoatRadiance = vec3( 0.0 );\n#endif\n", +lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\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 defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\n\t#ifndef STANDARD\n\t\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\n\t#endif\n#endif\n", +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, 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\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= 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\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform mat3 uvTransform;\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_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#endif\n",normal_fragment_maps:"#ifdef USE_NORMALMAP\n\t#ifdef OBJECTSPACE_NORMALMAP\n\t\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t#ifdef FLIP_SIDED\n\t\t\tnormal = - normal;\n\t\t#endif\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\tnormal = normalize( normalMatrix * normal );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n\t#endif\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\t#ifdef OBJECTSPACE_NORMALMAP\n\t\tuniform mat3 normalMatrix;\n\t#else\n\t\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\t\tvec2 st0 = dFdx( vUv.st );\n\t\t\tvec2 st1 = dFdy( vUv.st );\n\t\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\t\tvec3 N = normalize( surf_norm );\n\t\t\tmat3 tsn = mat3( S, T, N );\n\t\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t\tmapN.xy *= normalScale;\n\t\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\treturn normalize( tsn * mapN );\n\t\t}\n\t#endif\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 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}\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, 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 )\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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 ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 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:"#ifndef saturate\n\t#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}\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 mat3 uvTransform;\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 = ( 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#endif", +uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || 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;\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 \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - 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 \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n", +distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}\n", +equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 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 \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n", +linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n", +meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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 \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \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 \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n", +normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n", +normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n", +points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \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 \n\t#include \n\t#include \n\t#include \n}\n", +shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n}\n",shadow_vert:"#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n}\n", +sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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\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\tvec4 mvPosition;\n\tmvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n"}, +Aa={merge:function(a){for(var b={},c=0;c>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);1d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b, +c,d){b=H.euclideanModulo(b,1);c=H.clamp(c,0,1);d=H.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)){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}a&&0a?.0773993808*a:Math.pow(.9478672986*a+.0521327014,2.4)}return function(b){this.r=a(b.r);this.g=a(b.g);this.b=a(b.b);return this}}(),copyLinearToSRGB:function(){function a(a){return.0031308>a?12.92*a:1.055*Math.pow(a,.41666)-.055}return function(b){this.r=a(b.r);this.g=a(b.g);this.b=a(b.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 k=e-f;f=.5>=h?k/(e+f):k/(2-e-f);switch(e){case b:g=(c- +d)/k+(cMath.abs(g)?(this._x=Math.atan2(-m,e),this._z= +Math.atan2(-f,a)):(this._x=Math.atan2(n,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(-l,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(n,-1,1)),.99999>Math.abs(n)?(this._y=Math.atan2(-l,e),this._z=Math.atan2(-f,k)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(l,-1,1)),.99999>Math.abs(l)?(this._x=Math.atan2(n,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(-l,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(n,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 I;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 fa;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 p(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(Rd.prototype,{set:function(a){this.mask=1<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;cthis.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.rotation&&(d.rotation=this.rotation);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);0a?b.copy(this.origin):b.copy(this.direction).multiplyScalar(a).add(this.origin)},distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new p;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 p,b=new p,c=new p;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),l=-c.dot(b),n=c.lengthSq(),t=Math.abs(1-k*k);if(0=-p?e<=p?(h=1/t,d*=h,e*=h,k=d*(d+k*e+2*m)+e*(k*d+e+2*l)+n):(e=h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+n):(e=-h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+n):e<=-p?(d=Math.max(0,-(-k*h+m)),e=0b)return null;b=Math.sqrt(b-e);e=d-b;d+=b;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){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(da||h>c)return null;if(h>g||g!==g)g=h;if(ac?null:this.at(0<=g?g:c,b)},intersectsBox:function(){var a= +new p;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a=new p,b=new p,c=new p,d=new p;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(0f)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(ja,{getNormal:function(){var a=new p;return function(b,c,d,e){void 0===e&&(console.warn("THREE.Triangle: .getNormal() target is now required"),e=new p);e.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0=a.x+a.y}}()});Object.assign(ja.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(){var a=new p,b=new p;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b);return.5*a.cross(b).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 ja.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 p);return a.setFromCoplanarPoints(this.a,this.b,this.c)},getBarycoord:function(a,b){return ja.getBarycoord(a,this.a,this.b,this.c,b)},containsPoint:function(a){return ja.containsPoint(a, +this.a,this.b,this.c)},intersectsBox:function(a){return a.intersectsTriangle(this)},closestPointToPoint:function(){var a=new p,b=new p,c=new p,d=new p,e=new p,f=new p;return function(g,h){void 0===h&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),h=new p);var k=this.a,m=this.b,l=this.c;a.subVectors(m,k);b.subVectors(l,k);d.subVectors(g,k);var n=a.dot(d),t=b.dot(d);if(0>=n&&0>=t)return h.copy(k);e.subVectors(g,m);var u=a.dot(e),r=b.dot(e);if(0<=u&&r<=u)return h.copy(m); +var v=n*r-u*t;if(0>=v&&0<=n&&0>=u)return m=n/(n-u),h.copy(k).addScaledVector(a,m);f.subVectors(g,l);g=a.dot(f);var y=b.dot(f);if(0<=y&&g<=y)return h.copy(l);n=g*t-n*y;if(0>=n&&0<=t&&0>=y)return v=t/(t-y),h.copy(k).addScaledVector(b,v);t=u*y-g*r;if(0>=t&&0<=r-u&&0<=g-y)return c.subVectors(l,m),v=(r-u)/(r-u+(g-y)),h.copy(m).addScaledVector(c,v);l=1/(t+n+v);m=n*l;v*=l;return h.copy(k).addScaledVector(a,m).addScaledVector(b,v)}}(),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(D.prototype),{constructor:la,isMesh:!0,setDrawMode:function(a){this.drawMode=a},copy:function(a){D.prototype.copy.call(this,a);this.drawMode=a.drawMode;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(0c.far?null:{distance:b,point:x.clone(),object:a}}function c(c,d,e,f,m,l,n,q,p){g.fromBufferAttribute(m,n);h.fromBufferAttribute(m,q);k.fromBufferAttribute(m, +p);if(c=b(c,d,e,f,g,h,k,y))l&&(t.fromBufferAttribute(l,n),u.fromBufferAttribute(l,q),r.fromBufferAttribute(l,p),c.uv=a(y,g,h,k,t,u,r)),l=new Ta(n,q,p),ja.getNormal(g,h,k,l.normal),c.face=l;return c}var d=new I,e=new mb,f=new Da,g=new p,h=new p,k=new p,m=new p,l=new p,n=new p,t=new z,u=new z,r=new z,v=new p,y=new p,x=new p;return function(q,p){var v=this.geometry,w=this.material,x=this.matrixWorld;if(void 0!==w&&(null===v.boundingSphere&&v.computeBoundingSphere(),f.copy(v.boundingSphere),f.applyMatrix4(x), +!1!==q.ray.intersectsSphere(f)&&(d.getInverse(x),e.copy(q.ray).applyMatrix4(d),null===v.boundingBox||!1!==e.intersectsBox(v.boundingBox))))if(v.isBufferGeometry){var z=v.index,B=v.attributes.position,A=v.attributes.uv,D=v.groups;v=v.drawRange;var C;if(null!==z)if(Array.isArray(w)){var H=0;for(C=D.length;He.far||f.push({distance:q,point:b.clone(),face:null,object:this})}}(),clone:function(){return(new this.constructor(this.material)).copy(this)},copy:function(a){D.prototype.copy.call(this,a);void 0!==a.center&&this.center.copy(a.center);return this}}); +Bc.prototype=Object.assign(Object.create(D.prototype),{constructor:Bc,copy:function(a){D.prototype.copy.call(this,a,!1);a=a.levels;for(var b=0,c=a.length;b=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break; +for(;ef||(l.applyMatrix4(this.matrixWorld),v=d.ray.origin.distanceTo(l),vd.far||e.push({distance:v,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}else for(g=0,r=u.length/3-1;gf||(l.applyMatrix4(this.matrixWorld),v=d.ray.origin.distanceTo(l),vd.far||e.push({distance:v,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;gf||(l.applyMatrix4(this.matrixWorld),v=d.ray.origin.distanceTo(l),vd.far||e.push({distance:v,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)}});W.prototype=Object.assign(Object.create(sa.prototype), +{constructor:W,isLineSegments:!0,computeLineDistances:function(){var a=new p,b=new p;return function(){var c=this.geometry;if(c.isBufferGeometry)if(null===c.index){for(var d=c.attributes.position,e=[],f=0,g=d.count;fd.far||e.push({distance:a,distanceToRay:Math.sqrt(f),point:n.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);m/=(this.scale.x+this.scale.y+this.scale.z)/3;var l=m*m;m=new p;var n=new p;if(h.isBufferGeometry){var t=h.index;h=h.attributes.position.array;if(null!==t){var u=t.array;t=0;for(var r=u.length;t=a.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}});Pb.prototype=Object.create(T.prototype);Pb.prototype.constructor=Pb;Pb.prototype.isCompressedTexture=!0;Dc.prototype=Object.create(T.prototype);Dc.prototype.constructor=Dc;Dc.prototype.isCanvasTexture=!0;Ec.prototype= +Object.create(T.prototype);Ec.prototype.constructor=Ec;Ec.prototype.isDepthTexture=!0;Qb.prototype=Object.create(C.prototype);Qb.prototype.constructor=Qb;Fc.prototype=Object.create(R.prototype);Fc.prototype.constructor=Fc;Rb.prototype=Object.create(C.prototype);Rb.prototype.constructor=Rb;Gc.prototype=Object.create(R.prototype);Gc.prototype.constructor=Gc;na.prototype=Object.create(C.prototype);na.prototype.constructor=na;Hc.prototype=Object.create(R.prototype);Hc.prototype.constructor=Hc;Sb.prototype= +Object.create(na.prototype);Sb.prototype.constructor=Sb;Ic.prototype=Object.create(R.prototype);Ic.prototype.constructor=Ic;pb.prototype=Object.create(na.prototype);pb.prototype.constructor=pb;Jc.prototype=Object.create(R.prototype);Jc.prototype.constructor=Jc;Tb.prototype=Object.create(na.prototype);Tb.prototype.constructor=Tb;Kc.prototype=Object.create(R.prototype);Kc.prototype.constructor=Kc;Ub.prototype=Object.create(na.prototype);Ub.prototype.constructor=Ub;Lc.prototype=Object.create(R.prototype); +Lc.prototype.constructor=Lc;Vb.prototype=Object.create(C.prototype);Vb.prototype.constructor=Vb;Mc.prototype=Object.create(R.prototype);Mc.prototype.constructor=Mc;Wb.prototype=Object.create(C.prototype);Wb.prototype.constructor=Wb;Nc.prototype=Object.create(R.prototype);Nc.prototype.constructor=Nc;Xb.prototype=Object.create(C.prototype);Xb.prototype.constructor=Xb;var Ug={triangulate:function(a,b,c){c=c||2;var d=b&&b.length,e=d?b[0]*c:a.length,f=bf(a,0,e,c,!0),g=[];if(!f)return g;var h;if(d){var k= +c;d=[];var m;var l=0;for(m=b.length;l80*c){var p=h=a[0];var r=d=a[1];for(k=c;kh&&(h=l),b>d&&(d=b);h=Math.max(h-p,d-r);h=0!==h?1/h:0}Qc(f,g,c,p,r,h);return g}},Va={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;eVa.area(a)},triangulateShape:function(a,b){var c=[],d=[],e=[];ff(a);gf(c,a);var f=a.length;b.forEach(ff);for(a=0;aMath.abs(g-k)?[new z(a,1-c),new z(h,1-d),new z(m,1-e),new z(n,1-b)]:[new z(g,1-c),new z(k,1-d),new z(l,1-e),new z(t,1-b)]}};Sc.prototype=Object.create(R.prototype);Sc.prototype.constructor=Sc;Yb.prototype=Object.create(Oa.prototype);Yb.prototype.constructor=Yb;Tc.prototype=Object.create(R.prototype);Tc.prototype.constructor=Tc;sb.prototype=Object.create(C.prototype);sb.prototype.constructor=sb;Uc.prototype=Object.create(R.prototype);Uc.prototype.constructor=Uc;Zb.prototype=Object.create(C.prototype); +Zb.prototype.constructor=Zb;Vc.prototype=Object.create(R.prototype);Vc.prototype.constructor=Vc;$b.prototype=Object.create(C.prototype);$b.prototype.constructor=$b;tb.prototype=Object.create(R.prototype);tb.prototype.constructor=tb;tb.prototype.toJSON=function(){var a=R.prototype.toJSON.call(this);return jf(this.parameters.shapes,a)};ub.prototype=Object.create(C.prototype);ub.prototype.constructor=ub;ub.prototype.toJSON=function(){var a=C.prototype.toJSON.call(this);return jf(this.parameters.shapes, +a)};ac.prototype=Object.create(C.prototype);ac.prototype.constructor=ac;vb.prototype=Object.create(R.prototype);vb.prototype.constructor=vb;Wa.prototype=Object.create(C.prototype);Wa.prototype.constructor=Wa;Wc.prototype=Object.create(vb.prototype);Wc.prototype.constructor=Wc;Xc.prototype=Object.create(Wa.prototype);Xc.prototype.constructor=Xc;Yc.prototype=Object.create(R.prototype);Yc.prototype.constructor=Yc;bc.prototype=Object.create(C.prototype);bc.prototype.constructor=bc;var xa=Object.freeze({WireframeGeometry:Qb, +ParametricGeometry:Fc,ParametricBufferGeometry:Rb,TetrahedronGeometry:Hc,TetrahedronBufferGeometry:Sb,OctahedronGeometry:Ic,OctahedronBufferGeometry:pb,IcosahedronGeometry:Jc,IcosahedronBufferGeometry:Tb,DodecahedronGeometry:Kc,DodecahedronBufferGeometry:Ub,PolyhedronGeometry:Gc,PolyhedronBufferGeometry:na,TubeGeometry:Lc,TubeBufferGeometry:Vb,TorusKnotGeometry:Mc,TorusKnotBufferGeometry:Wb,TorusGeometry:Nc,TorusBufferGeometry:Xb,TextGeometry:Sc,TextBufferGeometry:Yb,SphereGeometry:Tc,SphereBufferGeometry:sb, +RingGeometry:Uc,RingBufferGeometry:Zb,PlaneGeometry:uc,PlaneBufferGeometry:lb,LatheGeometry:Vc,LatheBufferGeometry:$b,ShapeGeometry:tb,ShapeBufferGeometry:ub,ExtrudeGeometry:rb,ExtrudeBufferGeometry:Oa,EdgesGeometry:ac,ConeGeometry:Wc,ConeBufferGeometry:Xc,CylinderGeometry:vb,CylinderBufferGeometry:Wa,CircleGeometry:Yc,CircleBufferGeometry:bc,BoxGeometry:Ib,BoxBufferGeometry:kb});wb.prototype=Object.create(J.prototype);wb.prototype.constructor=wb;wb.prototype.isShadowMaterial=!0;wb.prototype.copy= +function(a){J.prototype.copy.call(this,a);this.color.copy(a.color);return this};cc.prototype=Object.create(ta.prototype);cc.prototype.constructor=cc;cc.prototype.isRawShaderMaterial=!0;Pa.prototype=Object.create(J.prototype);Pa.prototype.constructor=Pa;Pa.prototype.isMeshStandardMaterial=!0;Pa.prototype.copy=function(a){J.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;return this};xb.prototype=Object.create(Pa.prototype);xb.prototype.constructor=xb;xb.prototype.isMeshPhysicalMaterial= +!0;xb.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};Fa.prototype=Object.create(J.prototype);Fa.prototype.constructor=Fa;Fa.prototype.isMeshPhongMaterial=!0;Fa.prototype.copy=function(a){J.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};yb.prototype=Object.create(Fa.prototype);yb.prototype.constructor=yb;yb.prototype.isMeshToonMaterial=!0;yb.prototype.copy=function(a){Fa.prototype.copy.call(this, +a);this.gradientMap=a.gradientMap;return this};zb.prototype=Object.create(J.prototype);zb.prototype.constructor=zb;zb.prototype.isMeshNormalMaterial=!0;zb.prototype.copy=function(a){J.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};Ab.prototype=Object.create(J.prototype);Ab.prototype.constructor=Ab;Ab.prototype.isMeshLambertMaterial=!0;Ab.prototype.copy=function(a){J.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}; +Bb.prototype=Object.create(Y.prototype);Bb.prototype.constructor=Bb;Bb.prototype.isLineDashedMaterial=!0;Bb.prototype.copy=function(a){Y.prototype.copy.call(this,a);this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var Vg=Object.freeze({ShadowMaterial:wb,SpriteMaterial:cb,RawShaderMaterial:cc,ShaderMaterial:ta,PointsMaterial:Ea,MeshPhysicalMaterial:xb,MeshStandardMaterial:Pa,MeshPhongMaterial:Fa,MeshToonMaterial:yb,MeshNormalMaterial:zb,MeshLambertMaterial:Ab,MeshDepthMaterial:$a, +MeshDistanceMaterial:ab,MeshBasicMaterial:da,LineDashedMaterial:Bb,LineBasicMaterial:Y,Material:J}),Fb={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={}}},ka=new ce,Ya={};Object.assign(Ga.prototype,{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=Fb.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!==Ya[a])Ya[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=window.decodeURIComponent(g);h&&(g=window.atob(g));try{var k=(this.responseType||"").toLowerCase();switch(k){case "arraybuffer":case "blob":var m=new Uint8Array(g.length);for(h=0;hg)e=a+1;else if(0b&&(b=0);1Number.EPSILON&&(g.normalize(),c=Math.acos(H.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(H.clamp(e[0].dot(e[a]),-1,1)),c/=a,0d;)d+=c;for(;d>c;)d-=c;de&&(e=1);1E-4>d&&(d=e);1E-4>k&&(k=e);Ae.initNonuniformCatmullRom(f.x,g.x,h.x,c.x,d,e,k);Be.initNonuniformCatmullRom(f.y,g.y,h.y,c.y,d,e,k);Ce.initNonuniformCatmullRom(f.z,g.z,h.z,c.z,d,e,k)}else"catmullrom"===this.curveType&&(Ae.initCatmullRom(f.x,g.x,h.x,c.x,this.tension),Be.initCatmullRom(f.y,g.y,h.y,c.y,this.tension),Ce.initCatmullRom(f.z,g.z,h.z,c.z,this.tension));b.set(Ae.calc(a), +Be.calc(a),Ce.calc(a));return b};ca.prototype.copy=function(a){L.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;bc.length-2?c.length-1:a+1];c=c[a>c.length-3?c.length-1:a+2];b.set(lf(d,e.x,f.x,g.x,c.x),lf(d,e.y,f.y,g.y,c.y));return b};Ka.prototype.copy=function(a){L.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b=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=e)break a;else{f=b[1];a=e)break b}d=c;c= +0}}for(;c>>1,ab;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),a=this.getValueSize(),this.times=ia.arraySlice(c,e,f),this.values=ia.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&&ia.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=this.times,b=this.values,c=this.getValueSize(),d=2302===this.getInterpolation(),e=1,f=a.length-1,g=1;gm.opacity&&(m.transparent=!0);d.setTextures(k);return d.parse(m)}}()});var De={decodeText:function(a){if("undefined"!==typeof TextDecoder)return(new TextDecoder).decode(a);for(var b="",c=0,d=a.length;cf;f++){var E=h[u++];var A=B[2*E];E=B[2*E+1];A=new z(A,E);2!==f&&c.faceVertexUvs[e][v].push(A);0!==f&&c.faceVertexUvs[e][v+1].push(A)}}y&&(y=3*h[u++],r.normal.set(m[y++],m[y++],m[y]),w.normal.copy(r.normal));if(x)for(e=0;4>e;e++)y=3*h[u++],x=new p(m[y++], +m[y++],m[y]),2!==e&&r.vertexNormals.push(x),0!==e&&w.vertexNormals.push(x);n&&(n=h[u++],n=l[n],r.color.setHex(n),w.color.setHex(n));if(k)for(e=0;4>e;e++)n=h[u++],n=l[n],2!==e&&r.vertexColors.push(new G(n)),0!==e&&w.vertexColors.push(new G(n));c.faces.push(r);c.faces.push(w)}else{r=new Ta;r.a=h[u++];r.b=h[u++];r.c=h[u++];v&&(v=h[u++],r.materialIndex=v);v=c.faces.length;if(e)for(e=0;ef;f++)E=h[u++],A=B[2*E],E=B[2*E+1],A=new z(A,E),c.faceVertexUvs[e][v].push(A); +y&&(y=3*h[u++],r.normal.set(m[y++],m[y++],m[y]));if(x)for(e=0;3>e;e++)y=3*h[u++],x=new p(m[y++],m[y++],m[y]),r.vertexNormals.push(x);n&&(n=h[u++],r.color.setHex(l[n]));if(k)for(e=0;3>e;e++)n=h[u++],r.vertexColors.push(new G(l[n]));c.faces.push(r)}}d=a;u=void 0!==d.influencesPerVertex?d.influencesPerVertex:2;if(d.skinWeights)for(g=0,h=d.skinWeights.length;g +Number.EPSILON){if(0>m&&(g=b[f],k=-k,h=b[e],m=-m),!(a.yh.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=Va.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 db;h.curves=g.curves;b.push(h);return b}var k=!e(f[0].getPoints());k=a?!k:k;h=[];var m=[],l=[],n=0;m[n]=void 0;l[n]=[];for(var p= +0,u=f.length;pd&&this._mixBufferRegion(c,a,3*b,1-d,b);d=b;for(var 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){fa.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(pf.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(pa,{Composite:pf,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new pa.Composite(a,b,c):new pa(a,b,c)},sanitizeNodeName:function(){var a= +/[\[\]\.:\/]/g;return function(b){return b.replace(/\s/g,"_").replace(a,"")}}(),parseTrackName:function(){var a="[^"+"\\[\\]\\.:\\/".replace("\\.","")+"]",b=/((?:WC+[\/:])*)/.source.replace("WC","[^\\[\\]\\.:\\/]");a=/(WCOD+)?/.source.replace("WCOD",a);var c=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC","[^\\[\\]\\.:\\/]"),d=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC","[^\\[\\]\\.:\\/]"),e=new RegExp("^"+b+a+c+d+"$"),f=["material","materials","bones"];return function(a){var b=e.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!==f.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||"root"===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=b){var p=b++,n=a[p];c[n.uuid]=l;a[l]=n;c[k]=p;a[p]=h;h=0;for(k=e;h!==k;++h){n=d[h];var t=n[l];n[l]=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,l=d[k];if(void 0!==l)if(delete d[k],lb||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0c.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 break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;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,b=0a,this._setEndings(a,!a,f)):this._setEndings(!1,!1,f),this._loopCount=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:d}))}if(f&&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}});re.prototype=Object.assign(Object.create(ya.prototype),{constructor:re,_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 l=d[h],p=l.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 qe(pa.create(c,p,b&&b._propertyBindings[h].binding.parsedPath),l.ValueTypeName,l.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&&athis.max.x||a.ythis.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 z);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.xthis.max.x||a.max.ythis.max.y?!1:!0},clampPoint:function(a,b){void 0===b&&(console.warn("THREE.Box2: .clampPoint() target is now required"),b=new z);return b.copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new z; +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)}});Object.assign(xe.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(){var a=new p,b=new p;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);c=b.dot(b);c=b.dot(a)/c;d&&(c=H.clamp(c,0,1));return c}}(),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)}});ed.prototype=Object.create(D.prototype);ed.prototype.constructor=ed;ed.prototype.isImmediateRenderObject=!0;fd.prototype=Object.create(W.prototype);fd.prototype.constructor=fd;fd.prototype.update=function(){var a=new p,b=new p,c=new ra;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,p=k.length;lMath.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);D.prototype.updateMatrixWorld.call(this,a)};var Nd,ye;Eb.prototype=Object.create(D.prototype);Eb.prototype.constructor=Eb;Eb.prototype.setDirection=function(){var a=new p,b;return function(c){.99999c.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))}}();Eb.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()};Eb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)};ld.prototype=Object.create(W.prototype); +ld.prototype.constructor=ld;L.create=function(a,b){console.log("THREE.Curve.create() has been deprecated");a.prototype=Object.create(L.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};Object.assign(Xa.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 R,c=0,d=a.length;c 0) { + for (var i = (this.length >> 1); i >= 0; i--) this._down(i); } +} - var template = function(data) { - return render.call(this, data, _); - }; - - // Provide the compiled source as a convenience for precompilation. - var argument = settings.variable || 'obj'; - template.source = 'function(' + argument + '){\n' + source + '}'; +function defaultCompare(a, b) { + return a < b ? -1 : a > b ? 1 : 0; +} - return template; - }; +TinyQueue.prototype = { - // Add a "chain" function. Start chaining a wrapped Underscore object. - _.chain = function(obj) { - var instance = _(obj); - instance._chain = true; - return instance; - }; + push: function (item) { + this.data.push(item); + this.length++; + this._up(this.length - 1); + }, - // 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. + 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; + }, - // Helper function to continue chaining intermediate results. - var result = function(instance, obj) { - return instance._chain ? _(obj).chain() : obj; - }; + peek: function () { + return this.data[0]; + }, - // 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)); - }; - }); - }; + _up: function (pos) { + var data = this.data; + var compare = this.compare; + var item = data[pos]; - // Add all of the Underscore functions to the wrapper object. - _.mixin(_); + while (pos > 0) { + var parent = (pos - 1) >> 1; + var current = data[parent]; + if (compare(item, current) >= 0) break; + data[pos] = current; + pos = parent; + } - // 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); - }; - }); + data[pos] = item; + }, - // 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)); - }; - }); + _down: function (pos) { + var data = this.data; + var compare = this.compare; + var len = this.length; + var halfLen = len >> 1; + var item = data[pos]; - // Extracts the result from a wrapped and chained object. - _.prototype.value = function() { - return this._wrapped; - }; + while (pos < halfLen) { + var left = (pos << 1) + 1; + var right = left + 1; + var best = data[left]; - // Provide unwrapping proxy for some methods used in engine operations - // such as arithmetic and JSON stringification. - _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + if (right < len && compare(data[right], best) < 0) { + left = right; + best = data[right]; + } + if (compare(best, item) >= 0) break; - _.prototype.toString = function() { - return '' + this._wrapped; - }; + data[pos] = best; + pos = left; + } - // 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)); + data[pos] = item; + } +}; -},{}],243:[function(require,module,exports){ +},{}],244:[function(require,module,exports){ var createElement = require("./vdom/create-element.js") module.exports = createElement -},{"./vdom/create-element.js":249}],244:[function(require,module,exports){ +},{"./vdom/create-element.js":250}],245:[function(require,module,exports){ var diff = require("./vtree/diff.js") module.exports = diff -},{"./vtree/diff.js":269}],245:[function(require,module,exports){ +},{"./vtree/diff.js":270}],246:[function(require,module,exports){ var h = require("./virtual-hyperscript/index.js") module.exports = h -},{"./virtual-hyperscript/index.js":256}],246:[function(require,module,exports){ +},{"./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") @@ -18939,12 +25208,12 @@ module.exports = { VText: VText } -},{"./create-element.js":243,"./diff.js":244,"./h.js":245,"./patch.js":247,"./vnode/vnode.js":265,"./vnode/vtext.js":267}],247:[function(require,module,exports){ +},{"./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":252}],248:[function(require,module,exports){ +},{"./vdom/patch.js":253}],249:[function(require,module,exports){ var isObject = require("is-object") var isHook = require("../vnode/is-vhook.js") @@ -19043,7 +25312,7 @@ function getPrototype(value) { } } -},{"../vnode/is-vhook.js":260,"is-object":20}],249:[function(require,module,exports){ +},{"../vnode/is-vhook.js":261,"is-object":20}],250:[function(require,module,exports){ var document = require("global/document") var applyProperties = require("./apply-properties") @@ -19091,7 +25360,7 @@ function createElement(vnode, opts) { return node } -},{"../vnode/handle-thunk.js":258,"../vnode/is-vnode.js":261,"../vnode/is-vtext.js":262,"../vnode/is-widget.js":263,"./apply-properties":248,"global/document":16}],250:[function(require,module,exports){ +},{"../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. @@ -19178,7 +25447,7 @@ function ascending(a, b) { return a > b ? 1 : -1 } -},{}],251:[function(require,module,exports){ +},{}],252:[function(require,module,exports){ var applyProperties = require("./apply-properties") var isWidget = require("../vnode/is-widget.js") @@ -19331,7 +25600,7 @@ function replaceRoot(oldRoot, newRoot) { return newRoot; } -},{"../vnode/is-widget.js":263,"../vnode/vpatch.js":266,"./apply-properties":248,"./update-widget":253}],252:[function(require,module,exports){ +},{"../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") @@ -19413,7 +25682,7 @@ function patchIndices(patches) { return indices } -},{"./create-element":249,"./dom-index":250,"./patch-op":251,"global/document":16,"x-is-array":288}],253:[function(require,module,exports){ +},{"./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 @@ -19430,7 +25699,7 @@ function updateWidget(a, b) { return false } -},{"../vnode/is-widget.js":263}],254:[function(require,module,exports){ +},{"../vnode/is-widget.js":264}],255:[function(require,module,exports){ 'use strict'; var EvStore = require('ev-store'); @@ -19459,7 +25728,7 @@ EvHook.prototype.unhook = function(node, propertyName) { es[propName] = undefined; }; -},{"ev-store":9}],255:[function(require,module,exports){ +},{"ev-store":9}],256:[function(require,module,exports){ 'use strict'; module.exports = SoftSetHook; @@ -19478,7 +25747,7 @@ SoftSetHook.prototype.hook = function (node, propertyName) { } }; -},{}],256:[function(require,module,exports){ +},{}],257:[function(require,module,exports){ 'use strict'; var isArray = require('x-is-array'); @@ -19617,7 +25886,7 @@ function errorString(obj) { } } -},{"../vnode/is-thunk":259,"../vnode/is-vhook":260,"../vnode/is-vnode":261,"../vnode/is-vtext":262,"../vnode/is-widget":263,"../vnode/vnode.js":265,"../vnode/vtext.js":267,"./hooks/ev-hook.js":254,"./hooks/soft-set-hook.js":255,"./parse-tag.js":257,"x-is-array":288}],257:[function(require,module,exports){ +},{"../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'); @@ -19673,7 +25942,7 @@ function parseTag(tag, props) { return props.namespace ? tagName : tagName.toUpperCase(); } -},{"browser-split":5}],258:[function(require,module,exports){ +},{"browser-split":5}],259:[function(require,module,exports){ var isVNode = require("./is-vnode") var isVText = require("./is-vtext") var isWidget = require("./is-widget") @@ -19715,14 +25984,14 @@ function renderThunk(thunk, previous) { return renderedThunk } -},{"./is-thunk":259,"./is-vnode":261,"./is-vtext":262,"./is-widget":263}],259:[function(require,module,exports){ +},{"./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" } -},{}],260:[function(require,module,exports){ +},{}],261:[function(require,module,exports){ module.exports = isHook function isHook(hook) { @@ -19731,7 +26000,7 @@ function isHook(hook) { typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook")) } -},{}],261:[function(require,module,exports){ +},{}],262:[function(require,module,exports){ var version = require("./version") module.exports = isVirtualNode @@ -19740,7 +26009,7 @@ function isVirtualNode(x) { return x && x.type === "VirtualNode" && x.version === version } -},{"./version":264}],262:[function(require,module,exports){ +},{"./version":265}],263:[function(require,module,exports){ var version = require("./version") module.exports = isVirtualText @@ -19749,17 +26018,17 @@ function isVirtualText(x) { return x && x.type === "VirtualText" && x.version === version } -},{"./version":264}],263:[function(require,module,exports){ +},{"./version":265}],264:[function(require,module,exports){ module.exports = isWidget function isWidget(w) { return w && w.type === "Widget" } -},{}],264:[function(require,module,exports){ +},{}],265:[function(require,module,exports){ module.exports = "2" -},{}],265:[function(require,module,exports){ +},{}],266:[function(require,module,exports){ var version = require("./version") var isVNode = require("./is-vnode") var isWidget = require("./is-widget") @@ -19833,7 +26102,7 @@ function VirtualNode(tagName, properties, children, key, namespace) { VirtualNode.prototype.version = version VirtualNode.prototype.type = "VirtualNode" -},{"./is-thunk":259,"./is-vhook":260,"./is-vnode":261,"./is-widget":263,"./version":264}],266:[function(require,module,exports){ +},{"./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 @@ -19857,7 +26126,7 @@ function VirtualPatch(type, vNode, patch) { VirtualPatch.prototype.version = version VirtualPatch.prototype.type = "VirtualPatch" -},{"./version":264}],267:[function(require,module,exports){ +},{"./version":265}],268:[function(require,module,exports){ var version = require("./version") module.exports = VirtualText @@ -19869,7 +26138,7 @@ function VirtualText(text) { VirtualText.prototype.version = version VirtualText.prototype.type = "VirtualText" -},{"./version":264}],268:[function(require,module,exports){ +},{"./version":265}],269:[function(require,module,exports){ var isObject = require("is-object") var isHook = require("../vnode/is-vhook") @@ -19929,7 +26198,7 @@ function getPrototype(value) { } } -},{"../vnode/is-vhook":260,"is-object":20}],269:[function(require,module,exports){ +},{"../vnode/is-vhook":261,"is-object":20}],270:[function(require,module,exports){ var isArray = require("x-is-array") var VPatch = require("../vnode/vpatch") @@ -20358,7 +26627,7 @@ function appendPatch(apply, patch) { } } -},{"../vnode/handle-thunk":258,"../vnode/is-thunk":259,"../vnode/is-vnode":261,"../vnode/is-vtext":262,"../vnode/is-widget":263,"../vnode/vpatch":266,"./diff-props":268,"x-is-array":288}],270:[function(require,module,exports){ +},{"../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 */ @@ -20377,7 +26646,7 @@ define(function (require) { }); })(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); }); -},{"./Scheduler":271,"./env":283,"./makePromise":285}],271:[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 */ @@ -20459,7 +26728,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],272:[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 */ @@ -20487,7 +26756,7 @@ define(function() { return TimeoutError; }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],273:[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 */ @@ -20544,7 +26813,7 @@ define(function() { -},{}],274:[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 */ @@ -20845,7 +27114,7 @@ define(function(require) { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); -},{"../apply":273,"../state":286}],275:[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 */ @@ -21007,7 +27276,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],276:[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 */ @@ -21036,7 +27305,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],277:[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 */ @@ -21058,7 +27327,7 @@ define(function(require) { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); -},{"../state":286}],278:[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 */ @@ -21125,7 +27394,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],279:[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 */ @@ -21151,7 +27420,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],280:[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 */ @@ -21231,7 +27500,7 @@ define(function(require) { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); -},{"../TimeoutError":272,"../env":283}],281:[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 */ @@ -21319,7 +27588,7 @@ define(function(require) { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); -},{"../env":283,"../format":284}],282:[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 */ @@ -21359,7 +27628,7 @@ define(function() { }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],283:[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 */ @@ -21437,7 +27706,7 @@ define(function(require) { }).call(this,require('_process')) -},{"_process":6}],284:[function(require,module,exports){ +},{"_process":6}],285:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -21495,7 +27764,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],285:[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 */ @@ -22455,7 +28724,7 @@ define(function() { }).call(this,require('_process')) -},{"_process":6}],286:[function(require,module,exports){ +},{"_process":6}],287:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -22492,7 +28761,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],287:[function(require,module,exports){ +},{}],288:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @@ -22722,7 +28991,7 @@ define(function (require) { }); })(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); }); -},{"./lib/Promise":270,"./lib/TimeoutError":272,"./lib/apply":273,"./lib/decorators/array":274,"./lib/decorators/flow":275,"./lib/decorators/fold":276,"./lib/decorators/inspect":277,"./lib/decorators/iterate":278,"./lib/decorators/progress":279,"./lib/decorators/timed":280,"./lib/decorators/unhandledRejection":281,"./lib/decorators/with":282}],288:[function(require,module,exports){ +},{"./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 @@ -22732,7 +29001,7 @@ function isArray(obj) { return toString.call(obj) === "[object Array]" } -},{}],289:[function(require,module,exports){ +},{}],290:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var APIv3_1 = require("./api/APIv3"); @@ -22740,7 +29009,7 @@ exports.APIv3 = APIv3_1.APIv3; var ModelCreator_1 = require("./api/ModelCreator"); exports.ModelCreator = ModelCreator_1.ModelCreator; -},{"./api/APIv3":302,"./api/ModelCreator":303}],290:[function(require,module,exports){ +},{"./api/APIv3":303,"./api/ModelCreator":304}],291:[function(require,module,exports){ "use strict"; function __export(m) { for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; @@ -22756,6 +29025,10 @@ var MeshFactory_1 = require("./component/utils/MeshFactory"); exports.MeshFactory = MeshFactory_1.MeshFactory; var MeshScene_1 = require("./component/utils/MeshScene"); exports.MeshScene = MeshScene_1.MeshScene; +var MouseOperator_1 = require("./component/utils/MouseOperator"); +exports.MouseOperator = MouseOperator_1.MouseOperator; +var ComponentSize_1 = require("./component/utils/ComponentSize"); +exports.ComponentSize = ComponentSize_1.ComponentSize; var AttributionComponent_1 = require("./component/AttributionComponent"); exports.AttributionComponent = AttributionComponent_1.AttributionComponent; var BackgroundComponent_1 = require("./component/BackgroundComponent"); @@ -22804,10 +29077,14 @@ 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 EarthControlHandler_1 = require("./component/mouse/EarthControlHandler"); +exports.EarthControlHandler = EarthControlHandler_1.EarthControlHandler; 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 ImageBoundary = require("./component/mouse/ImageBoundary"); +exports.ImageBoundary = ImageBoundary; var Popup_1 = require("./component/popup/popup/Popup"); exports.Popup = Popup_1.Popup; var PopupComponent_1 = require("./component/popup/PopupComponent"); @@ -22822,6 +29099,12 @@ var SequenceDOMRenderer_1 = require("./component/sequence/SequenceDOMRenderer"); exports.SequenceDOMRenderer = SequenceDOMRenderer_1.SequenceDOMRenderer; var SequenceMode_1 = require("./component/sequence/SequenceMode"); exports.SequenceMode = SequenceMode_1.SequenceMode; +var SpatialDataCache_1 = require("./component/spatialdata/SpatialDataCache"); +exports.SpatialDataCache = SpatialDataCache_1.SpatialDataCache; +var SpatialDataComponent_1 = require("./component/spatialdata/SpatialDataComponent"); +exports.SpatialDataComponent = SpatialDataComponent_1.SpatialDataComponent; +var SpatialDataScene_1 = require("./component/spatialdata/SpatialDataScene"); +exports.SpatialDataScene = SpatialDataScene_1.SpatialDataScene; var ImagePlaneComponent_1 = require("./component/imageplane/ImagePlaneComponent"); exports.ImagePlaneComponent = ImagePlaneComponent_1.ImagePlaneComponent; var ImagePlaneGLRenderer_1 = require("./component/imageplane/ImagePlaneGLRenderer"); @@ -22848,6 +29131,8 @@ var CreatePointHandler_1 = require("./component/tag/handlers/CreatePointHandler" exports.CreatePointHandler = CreatePointHandler_1.CreatePointHandler; var CreateVertexHandler_1 = require("./component/tag/handlers/CreateVertexHandler"); exports.CreateVertexHandler = CreateVertexHandler_1.CreateVertexHandler; +var CreatePointsHandler_1 = require("./component/tag/handlers/CreatePointsHandler"); +exports.CreatePointsHandler = CreatePointsHandler_1.CreatePointsHandler; var CreatePolygonHandler_1 = require("./component/tag/handlers/CreatePolygonHandler"); exports.CreatePolygonHandler = CreatePolygonHandler_1.CreatePolygonHandler; var CreateRectHandler_1 = require("./component/tag/handlers/CreateRectHandler"); @@ -22860,16 +29145,22 @@ 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 ExtremePointTag_1 = require("./component/tag/tag/ExtremePointTag"); +exports.ExtremePointTag = ExtremePointTag_1.ExtremePointTag; var RenderTag_1 = require("./component/tag/tag/RenderTag"); exports.RenderTag = RenderTag_1.RenderTag; +var OutlineRenderTagBase_1 = require("./component/tag/tag/OutlineRenderTagBase"); +exports.OutlineRenderTagBase = OutlineRenderTagBase_1.OutlineRenderTagBase; 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 ExtremePointRenderTag_1 = require("./component/tag/tag/ExtremePointRenderTag"); +exports.ExtremePointRenderTag = ExtremePointRenderTag_1.ExtremePointRenderTag; 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 TagDomain_1 = require("./component/tag/tag/TagDomain"); +exports.TagDomain = TagDomain_1.TagDomain; var TagComponent_1 = require("./component/tag/TagComponent"); exports.TagComponent = TagComponent_1.TagComponent; var TagCreator_1 = require("./component/tag/TagCreator"); @@ -22892,15 +29183,23 @@ 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 PointsGeometry_1 = require("./component/tag/geometry/PointsGeometry"); +exports.PointsGeometry = PointsGeometry_1.PointsGeometry; 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; var ZoomComponent_1 = require("./component/zoom/ZoomComponent"); exports.ZoomComponent = ZoomComponent_1.ZoomComponent; +var CreateTag_1 = require("./component/tag/tag/CreateTag"); +exports.CreateTag = CreateTag_1.CreateTag; +var OutlineCreateTag_1 = require("./component/tag/tag/OutlineCreateTag"); +exports.OutlineCreateTag = OutlineCreateTag_1.OutlineCreateTag; +var ExtremePointCreateTag_1 = require("./component/tag/tag/ExtremePointCreateTag"); +exports.ExtremePointCreateTag = ExtremePointCreateTag_1.ExtremePointCreateTag; __export(require("./component/interfaces/interfaces")); -},{"./component/AttributionComponent":304,"./component/BackgroundComponent":305,"./component/BearingComponent":306,"./component/CacheComponent":307,"./component/Component":308,"./component/ComponentService":309,"./component/CoverComponent":310,"./component/DebugComponent":311,"./component/ImageComponent":312,"./component/LoadingComponent":313,"./component/NavigationComponent":314,"./component/RouteComponent":315,"./component/StatsComponent":316,"./component/direction/DirectionComponent":317,"./component/direction/DirectionDOMCalculator":318,"./component/direction/DirectionDOMRenderer":319,"./component/imageplane/ImagePlaneComponent":320,"./component/imageplane/ImagePlaneGLRenderer":321,"./component/interfaces/interfaces":324,"./component/keyboard/KeyPlayHandler":325,"./component/keyboard/KeySequenceNavigationHandler":326,"./component/keyboard/KeySpatialNavigationHandler":327,"./component/keyboard/KeyZoomHandler":328,"./component/keyboard/KeyboardComponent":329,"./component/marker/MarkerComponent":331,"./component/marker/MarkerScene":332,"./component/marker/MarkerSet":333,"./component/marker/marker/CircleMarker":334,"./component/marker/marker/Marker":335,"./component/marker/marker/SimpleMarker":336,"./component/mouse/BounceHandler":337,"./component/mouse/DoubleClickZoomHandler":338,"./component/mouse/DragPanHandler":339,"./component/mouse/MouseComponent":340,"./component/mouse/ScrollZoomHandler":341,"./component/mouse/TouchZoomHandler":342,"./component/popup/PopupComponent":344,"./component/popup/popup/Popup":345,"./component/sequence/SequenceComponent":346,"./component/sequence/SequenceDOMRenderer":347,"./component/sequence/SequenceMode":348,"./component/shaders/Shaders":349,"./component/slider/SliderComponent":350,"./component/slider/SliderDOMRenderer":351,"./component/slider/SliderGLRenderer":352,"./component/tag/TagComponent":354,"./component/tag/TagCreator":355,"./component/tag/TagDOMRenderer":356,"./component/tag/TagMode":357,"./component/tag/TagOperation":358,"./component/tag/TagScene":359,"./component/tag/TagSet":360,"./component/tag/error/GeometryTagError":361,"./component/tag/geometry/Geometry":362,"./component/tag/geometry/PointGeometry":363,"./component/tag/geometry/PolygonGeometry":364,"./component/tag/geometry/RectGeometry":365,"./component/tag/geometry/VertexGeometry":366,"./component/tag/handlers/CreateHandlerBase":367,"./component/tag/handlers/CreatePointHandler":368,"./component/tag/handlers/CreatePolygonHandler":369,"./component/tag/handlers/CreateRectDragHandler":370,"./component/tag/handlers/CreateRectHandler":371,"./component/tag/handlers/CreateVertexHandler":372,"./component/tag/handlers/EditVertexHandler":373,"./component/tag/handlers/TagHandlerBase":374,"./component/tag/tag/OutlineCreateTag":375,"./component/tag/tag/OutlineRenderTag":376,"./component/tag/tag/OutlineTag":377,"./component/tag/tag/RenderTag":378,"./component/tag/tag/SpotRenderTag":379,"./component/tag/tag/SpotTag":380,"./component/tag/tag/Tag":381,"./component/utils/HandlerBase":382,"./component/utils/MeshFactory":383,"./component/utils/MeshScene":384,"./component/zoom/ZoomComponent":385}],291:[function(require,module,exports){ +},{"./component/AttributionComponent":305,"./component/BackgroundComponent":306,"./component/BearingComponent":307,"./component/CacheComponent":308,"./component/Component":309,"./component/ComponentService":310,"./component/CoverComponent":311,"./component/DebugComponent":312,"./component/ImageComponent":313,"./component/LoadingComponent":314,"./component/NavigationComponent":315,"./component/RouteComponent":316,"./component/StatsComponent":317,"./component/direction/DirectionComponent":318,"./component/direction/DirectionDOMCalculator":319,"./component/direction/DirectionDOMRenderer":320,"./component/imageplane/ImagePlaneComponent":321,"./component/imageplane/ImagePlaneGLRenderer":322,"./component/interfaces/interfaces":325,"./component/keyboard/KeyPlayHandler":326,"./component/keyboard/KeySequenceNavigationHandler":327,"./component/keyboard/KeySpatialNavigationHandler":328,"./component/keyboard/KeyZoomHandler":329,"./component/keyboard/KeyboardComponent":330,"./component/marker/MarkerComponent":332,"./component/marker/MarkerScene":333,"./component/marker/MarkerSet":334,"./component/marker/marker/CircleMarker":335,"./component/marker/marker/Marker":336,"./component/marker/marker/SimpleMarker":337,"./component/mouse/BounceHandler":338,"./component/mouse/DoubleClickZoomHandler":339,"./component/mouse/DragPanHandler":340,"./component/mouse/EarthControlHandler":341,"./component/mouse/ImageBoundary":342,"./component/mouse/MouseComponent":343,"./component/mouse/ScrollZoomHandler":344,"./component/mouse/TouchZoomHandler":345,"./component/popup/PopupComponent":347,"./component/popup/popup/Popup":348,"./component/sequence/SequenceComponent":349,"./component/sequence/SequenceDOMRenderer":350,"./component/sequence/SequenceMode":351,"./component/shaders/Shaders":352,"./component/slider/SliderComponent":353,"./component/slider/SliderDOMRenderer":354,"./component/slider/SliderGLRenderer":355,"./component/spatialdata/SpatialDataCache":358,"./component/spatialdata/SpatialDataComponent":359,"./component/spatialdata/SpatialDataScene":360,"./component/tag/TagComponent":362,"./component/tag/TagCreator":363,"./component/tag/TagDOMRenderer":364,"./component/tag/TagMode":365,"./component/tag/TagOperation":366,"./component/tag/TagScene":367,"./component/tag/TagSet":368,"./component/tag/error/GeometryTagError":369,"./component/tag/geometry/Geometry":370,"./component/tag/geometry/PointGeometry":371,"./component/tag/geometry/PointsGeometry":372,"./component/tag/geometry/PolygonGeometry":373,"./component/tag/geometry/RectGeometry":374,"./component/tag/geometry/VertexGeometry":375,"./component/tag/handlers/CreateHandlerBase":376,"./component/tag/handlers/CreatePointHandler":377,"./component/tag/handlers/CreatePointsHandler":378,"./component/tag/handlers/CreatePolygonHandler":379,"./component/tag/handlers/CreateRectDragHandler":380,"./component/tag/handlers/CreateRectHandler":381,"./component/tag/handlers/CreateVertexHandler":382,"./component/tag/handlers/EditVertexHandler":383,"./component/tag/handlers/TagHandlerBase":384,"./component/tag/tag/CreateTag":385,"./component/tag/tag/ExtremePointCreateTag":386,"./component/tag/tag/ExtremePointRenderTag":387,"./component/tag/tag/ExtremePointTag":388,"./component/tag/tag/OutlineCreateTag":389,"./component/tag/tag/OutlineRenderTag":390,"./component/tag/tag/OutlineRenderTagBase":391,"./component/tag/tag/OutlineTag":392,"./component/tag/tag/RenderTag":393,"./component/tag/tag/SpotRenderTag":394,"./component/tag/tag/SpotTag":395,"./component/tag/tag/Tag":396,"./component/tag/tag/TagDomain":397,"./component/utils/ComponentSize":398,"./component/utils/HandlerBase":399,"./component/utils/MeshFactory":400,"./component/utils/MeshScene":401,"./component/utils/MouseOperator":402,"./component/zoom/ZoomComponent":403}],292:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var EdgeDirection_1 = require("./graph/edge/EdgeDirection"); @@ -22914,7 +29213,7 @@ exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients_1.EdgeCalculator var EdgeCalculator_1 = require("./graph/edge/EdgeCalculator"); exports.EdgeCalculator = EdgeCalculator_1.EdgeCalculator; -},{"./graph/edge/EdgeCalculator":405,"./graph/edge/EdgeCalculatorCoefficients":406,"./graph/edge/EdgeCalculatorDirections":407,"./graph/edge/EdgeCalculatorSettings":408,"./graph/edge/EdgeDirection":409}],292:[function(require,module,exports){ +},{"./graph/edge/EdgeCalculator":425,"./graph/edge/EdgeCalculatorCoefficients":426,"./graph/edge/EdgeCalculatorDirections":427,"./graph/edge/EdgeCalculatorSettings":428,"./graph/edge/EdgeDirection":429}],293:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AbortMapillaryError_1 = require("./error/AbortMapillaryError"); @@ -22926,7 +29225,7 @@ exports.GraphMapillaryError = GraphMapillaryError_1.GraphMapillaryError; var MapillaryError_1 = require("./error/MapillaryError"); exports.MapillaryError = MapillaryError_1.MapillaryError; -},{"./error/AbortMapillaryError":386,"./error/ArgumentMapillaryError":387,"./error/GraphMapillaryError":388,"./error/MapillaryError":389}],293:[function(require,module,exports){ +},{"./error/AbortMapillaryError":404,"./error/ArgumentMapillaryError":405,"./error/GraphMapillaryError":406,"./error/MapillaryError":407}],294:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Camera_1 = require("./geo/Camera"); @@ -22939,8 +29238,12 @@ var Spatial_1 = require("./geo/Spatial"); exports.Spatial = Spatial_1.Spatial; var Transform_1 = require("./geo/Transform"); exports.Transform = Transform_1.Transform; +var Geo = require("./geo/Geo"); +exports.Geo = Geo; +var Lines = require("./geo/Lines"); +exports.Lines = Lines; -},{"./geo/Camera":390,"./geo/GeoCoords":391,"./geo/Spatial":392,"./geo/Transform":393,"./geo/ViewportCoords":394}],294:[function(require,module,exports){ +},{"./geo/Camera":408,"./geo/Geo":409,"./geo/GeoCoords":410,"./geo/Lines":411,"./geo/Spatial":412,"./geo/Transform":413,"./geo/ViewportCoords":414}],295:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var FilterCreator_1 = require("./graph/FilterCreator"); @@ -22964,7 +29267,7 @@ exports.NodeCache = NodeCache_1.NodeCache; var Sequence_1 = require("./graph/Sequence"); exports.Sequence = Sequence_1.Sequence; -},{"./graph/FilterCreator":395,"./graph/Graph":396,"./graph/GraphCalculator":397,"./graph/GraphMode":398,"./graph/GraphService":399,"./graph/ImageLoadingService":400,"./graph/MeshReader":401,"./graph/Node":402,"./graph/NodeCache":403,"./graph/Sequence":404}],295:[function(require,module,exports){ +},{"./graph/FilterCreator":415,"./graph/Graph":416,"./graph/GraphCalculator":417,"./graph/GraphMode":418,"./graph/GraphService":419,"./graph/ImageLoadingService":420,"./graph/MeshReader":421,"./graph/Node":422,"./graph/NodeCache":423,"./graph/Sequence":424}],296:[function(require,module,exports){ "use strict"; /** * MapillaryJS is a WebGL JavaScript library for exploring street level imagery @@ -22989,14 +29292,17 @@ exports.ImageSize = Viewer_1.ImageSize; exports.Viewer = Viewer_1.Viewer; var Component_1 = require("./Component"); exports.SliderMode = Component_1.SliderMode; +exports.ComponentSize = 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":290,"./Edge":291,"./Error":292,"./Render":296,"./State":297,"./Support":298,"./Viewer":301,"./component/marker/Marker":330,"./component/popup/Popup":343,"./component/tag/Tag":353}],296:[function(require,module,exports){ +},{"./Component":291,"./Edge":292,"./Error":293,"./Render":297,"./State":298,"./Support":299,"./Viewer":302,"./component/marker/Marker":331,"./component/popup/Popup":346,"./component/spatialdata/SpatialData":357,"./component/tag/Tag":361}],297:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var DOMRenderer_1 = require("./render/DOMRenderer"); @@ -23012,9 +29318,11 @@ exports.RenderMode = RenderMode_1.RenderMode; var RenderService_1 = require("./render/RenderService"); exports.RenderService = RenderService_1.RenderService; -},{"./render/DOMRenderer":410,"./render/GLRenderStage":411,"./render/GLRenderer":412,"./render/RenderCamera":413,"./render/RenderMode":414,"./render/RenderService":415}],297:[function(require,module,exports){ +},{"./render/DOMRenderer":430,"./render/GLRenderStage":431,"./render/GLRenderer":432,"./render/RenderCamera":433,"./render/RenderMode":434,"./render/RenderService":435}],298:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +var FrameGenerator_1 = require("./state/FrameGenerator"); +exports.FrameGenerator = FrameGenerator_1.FrameGenerator; var RotationDelta_1 = require("./state/RotationDelta"); exports.RotationDelta = RotationDelta_1.RotationDelta; var State_1 = require("./state/State"); @@ -23027,6 +29335,8 @@ var StateService_1 = require("./state/StateService"); exports.StateService = StateService_1.StateService; var TransitionMode_1 = require("./state/TransitionMode"); exports.TransitionMode = TransitionMode_1.TransitionMode; +var EarthState_1 = require("./state/states/EarthState"); +exports.EarthState = EarthState_1.EarthState; var InteractiveStateBase_1 = require("./state/states/InteractiveStateBase"); exports.InteractiveStateBase = InteractiveStateBase_1.InteractiveStateBase; var InteractiveWaitingState_1 = require("./state/states/InteractiveWaitingState"); @@ -23036,7 +29346,7 @@ exports.TraversingState = TraversingState_1.TraversingState; var WaitingState_1 = require("./state/states/WaitingState"); exports.WaitingState = WaitingState_1.WaitingState; -},{"./state/RotationDelta":416,"./state/State":417,"./state/StateContext":418,"./state/StateService":419,"./state/TransitionMode":420,"./state/states/InteractiveStateBase":421,"./state/states/InteractiveWaitingState":422,"./state/states/StateBase":423,"./state/states/TraversingState":424,"./state/states/WaitingState":425}],298:[function(require,module,exports){ +},{"./state/FrameGenerator":436,"./state/RotationDelta":437,"./state/State":438,"./state/StateContext":439,"./state/StateService":440,"./state/TransitionMode":441,"./state/states/EarthState":442,"./state/states/InteractiveStateBase":443,"./state/states/InteractiveWaitingState":444,"./state/states/StateBase":445,"./state/states/TraversingState":446,"./state/states/WaitingState":447}],299:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var support = require("./utils/Support"); @@ -23076,7 +29386,7 @@ function isFallbackSupported() { } exports.isFallbackSupported = isFallbackSupported; -},{"./utils/Support":433}],299:[function(require,module,exports){ +},{"./utils/Support":455}],300:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ImageTileLoader_1 = require("./tiles/ImageTileLoader"); @@ -23088,7 +29398,7 @@ exports.TextureProvider = TextureProvider_1.TextureProvider; var RegionOfInterestCalculator_1 = require("./tiles/RegionOfInterestCalculator"); exports.RegionOfInterestCalculator = RegionOfInterestCalculator_1.RegionOfInterestCalculator; -},{"./tiles/ImageTileLoader":426,"./tiles/ImageTileStore":427,"./tiles/RegionOfInterestCalculator":428,"./tiles/TextureProvider":429}],300:[function(require,module,exports){ +},{"./tiles/ImageTileLoader":448,"./tiles/ImageTileStore":449,"./tiles/RegionOfInterestCalculator":450,"./tiles/TextureProvider":451}],301:[function(require,module,exports){ "use strict"; function __export(m) { for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; @@ -23104,7 +29414,7 @@ __export(require("./utils/Support")); var Urls_1 = require("./utils/Urls"); exports.Urls = Urls_1.Urls; -},{"./utils/DOM":430,"./utils/EventEmitter":431,"./utils/Settings":432,"./utils/Support":433,"./utils/Urls":434}],301:[function(require,module,exports){ +},{"./utils/DOM":452,"./utils/EventEmitter":453,"./utils/Settings":454,"./utils/Support":455,"./utils/Urls":456}],302:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Alignment_1 = require("./viewer/Alignment"); @@ -23138,11 +29448,11 @@ exports.TouchService = TouchService_1.TouchService; var Viewer_1 = require("./viewer/Viewer"); exports.Viewer = Viewer_1.Viewer; -},{"./viewer/Alignment":435,"./viewer/CacheService":436,"./viewer/ComponentController":437,"./viewer/Container":438,"./viewer/ImageSize":439,"./viewer/KeyboardService":440,"./viewer/LoadingService":441,"./viewer/MouseService":442,"./viewer/Navigator":443,"./viewer/Observer":444,"./viewer/PlayService":445,"./viewer/Projection":446,"./viewer/SpriteService":447,"./viewer/TouchService":448,"./viewer/Viewer":449}],302:[function(require,module,exports){ +},{"./viewer/Alignment":457,"./viewer/CacheService":458,"./viewer/ComponentController":459,"./viewer/Container":460,"./viewer/ImageSize":461,"./viewer/KeyboardService":462,"./viewer/LoadingService":463,"./viewer/MouseService":464,"./viewer/Navigator":465,"./viewer/Observer":466,"./viewer/PlayService":468,"./viewer/Projection":469,"./viewer/SpriteService":470,"./viewer/TouchService":471,"./viewer/Viewer":472}],303:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); +var operators_1 = require("rxjs/operators"); +var rxjs_1 = require("rxjs"); var API_1 = require("../API"); /** * @class APIv3 @@ -23190,15 +29500,19 @@ var APIv3 = /** @class */ (function () { ]; this._propertiesSpatial = [ "atomic_scale", + "cluster_key", + "c_rotation", "ca", "calt", + "camera_projection_type", "cca", "cfocal", + "ck1", + "ck2", "gpano", "height", "merge_cc", "merge_version", - "c_rotation", "orientation", "width", ]; @@ -23207,7 +29521,7 @@ var APIv3 = /** @class */ (function () { ]; } APIv3.prototype.imageByKeyFill$ = function (keys) { - return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([ + return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([ this._pathImageByKey, keys, this._propertiesKey @@ -23215,16 +29529,15 @@ var APIv3 = /** @class */ (function () { .concat(this._propertiesSpatial), this._propertiesKey .concat(this._propertiesUser) - ])) - .map(function (value) { + ])).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); + })), this._pathImageByKey, keys); }; APIv3.prototype.imageByKeyFull$ = function (keys) { - return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([ + return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([ this._pathImageByKey, keys, this._propertiesKey @@ -23233,17 +29546,16 @@ var APIv3 = /** @class */ (function () { .concat(this._propertiesSpatial), this._propertiesKey .concat(this._propertiesUser) - ])) - .map(function (value) { + ])).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); + })), this._pathImageByKey, keys); }; APIv3.prototype.imageCloseTo$ = function (lat, lon) { var lonLat = lon + ":" + lat; - return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([ + return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([ this._pathImageCloseTo, [lonLat], this._propertiesKey @@ -23252,21 +29564,19 @@ var APIv3 = /** @class */ (function () { .concat(this._propertiesSpatial), this._propertiesKey .concat(this._propertiesUser) - ])) - .map(function (value) { + ])).pipe(operators_1.map(function (value) { return value != null ? value.json.imageCloseTo[lonLat] : null; - }), this._pathImageCloseTo, [lonLat]); + })), this._pathImageCloseTo, [lonLat]); }; APIv3.prototype.imagesByH$ = function (hs) { var _this = this; - return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([ + return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([ this._pathImagesByH, hs, { from: 0, to: this._pageCount }, this._propertiesKey .concat(this._propertiesCore) - ])) - .map(function (value) { + ])).pipe(operators_1.map(function (value) { if (!value) { value = { json: { imagesByH: {} } }; for (var _i = 0, hs_1 = hs; _i < hs_1.length; _i++) { @@ -23278,10 +29588,10 @@ var APIv3 = /** @class */ (function () { } } return value.json.imagesByH; - }), this._pathImagesByH, hs); + })), this._pathImagesByH, hs); }; APIv3.prototype.imageViewAdd$ = function (keys) { - return this._catchInvalidateCall$(this._wrapPromise$(this._model.call([this._pathImageViewAdd], [keys])), this._pathImageViewAdd, 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); @@ -23298,13 +29608,12 @@ var APIv3 = /** @class */ (function () { this._model = this._modelCreator.createModel(this._clientId, token); }; APIv3.prototype.sequenceByKey$ = function (sequenceKeys) { - return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([ + return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([ this._pathSequenceByKey, sequenceKeys, this._propertiesKey .concat(this._propertiesSequence) - ])) - .map(function (value) { + ])).pipe(operators_1.map(function (value) { if (!value) { value = { json: { sequenceByKey: {} } }; } @@ -23316,10 +29625,10 @@ var APIv3 = /** @class */ (function () { } } return value.json.sequenceByKey; - }), this._pathSequenceByKey, sequenceKeys); + })), this._pathSequenceByKey, sequenceKeys); }; APIv3.prototype.sequenceViewAdd$ = function (sequenceKeys) { - return this._catchInvalidateCall$(this._wrapPromise$(this._model.call([this._pathSequenceViewAdd], [sequenceKeys])), this._pathSequenceViewAdd, sequenceKeys); + return this._catchInvalidateCall$(this._wrapCallModelResponse$(this._model.call([this._pathSequenceViewAdd], [sequenceKeys])), this._pathSequenceViewAdd, sequenceKeys); }; Object.defineProperty(APIv3.prototype, "clientId", { get: function () { @@ -23330,19 +29639,17 @@ var APIv3 = /** @class */ (function () { }); APIv3.prototype._catchInvalidateGet$ = function (observable, path, paths) { var _this = this; - return observable - .catch(function (error) { + 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 - .catch(function (error) { + 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]); @@ -23350,20 +29657,33 @@ var APIv3 = /** @class */ (function () { APIv3.prototype._invalidateCall = function (path, paths) { this._model.invalidate([path], [paths]); }; - APIv3.prototype._wrapPromise$ = function (promise) { - return Observable_1.Observable.defer(function () { return Observable_1.Observable.fromPromise(promise); }); + 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":289,"rxjs/Observable":29}],303:[function(require,module,exports){ +},{"../API":290,"rxjs":43,"rxjs/operators":241}],304:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var falcor = require("falcor"); -var HttpDataSource = require("falcor-http-datasource"); +var falcor_http_datasource_1 = require("falcor-http-datasource"); var Utils_1 = require("../Utils"); /** * @class ModelCreator @@ -23394,7 +29714,7 @@ var ModelCreator = /** @class */ (function () { } return new falcor.Model({ maxSize: 16 * 1024 * 1024, - source: new HttpDataSource(Utils_1.Urls.falcorModel(clientId), configuration), + source: new falcor_http_datasource_1.default(Utils_1.Urls.falcorModel(clientId), configuration), }); }; return ModelCreator; @@ -23402,13 +29722,15 @@ var ModelCreator = /** @class */ (function () { exports.ModelCreator = ModelCreator; exports.default = ModelCreator; -},{"../Utils":300,"falcor":15,"falcor-http-datasource":10}],304:[function(require,module,exports){ +},{"../Utils":301,"falcor":15,"falcor-http-datasource":10}],305:[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; } @@ -23416,8 +29738,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var vd = require("virtual-dom"); -var Observable_1 = require("rxjs/Observable"); var Component_1 = require("../Component"); var Utils_1 = require("../Utils"); var AttributionComponent = /** @class */ (function (_super) { @@ -23427,15 +29750,13 @@ var AttributionComponent = /** @class */ (function (_super) { } AttributionComponent.prototype._activate = function () { var _this = this; - this._disposable = Observable_1.Observable - .combineLatest(this._navigator.stateService.currentNode$, this._container.renderService.size$) - .map(function (_a) { + 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 () { @@ -23468,13 +29789,15 @@ exports.AttributionComponent = AttributionComponent; Component_1.ComponentService.register(AttributionComponent); exports.default = AttributionComponent; -},{"../Component":290,"../Utils":300,"rxjs/Observable":29,"virtual-dom":246}],305:[function(require,module,exports){ +},{"../Component":291,"../Utils":301,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],306:[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; } @@ -23512,13 +29835,15 @@ exports.BackgroundComponent = BackgroundComponent; Component_1.ComponentService.register(BackgroundComponent); exports.default = BackgroundComponent; -},{"../Component":290,"virtual-dom":246}],306:[function(require,module,exports){ +},{"../Component":291,"virtual-dom":247}],307:[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; } @@ -23526,56 +29851,227 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +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( + * "", + * "", + * ""); + * + * 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$ - .map(function (rc) { + 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]; - }) - .distinctUntilChanged(function (a1, a2) { + }), operators_1.distinctUntilChanged(function (a1, a2) { return Math.abs(a2[0] - a1[0]) < _this._distinctThreshold && Math.abs(a2[1] - a1[1]) < _this._distinctThreshold; - }); - this._renderSubscription = cameraBearingFov$ - .map(function (_a) { - var bearing = _a[0], fov = _a[1]; - var background = vd.h("div.BearingIndicatorBackground", {}, []); - var backgroundCircle = vd.h("div.BearingIndicatorBackgroundCircle", {}, []); - var north = _this._createNorth(bearing); - var cameraSector = _this._createCircleSectorCompass(_this._createCircleSector(Math.max(Math.PI / 20, fov), "#FFF")); + })); + 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", { oncontextmenu: function (event) { event.preventDefault(); } }, [ + vnode: vd.h("div.BearingIndicatorContainer" + compact, { oncontextmenu: function (event) { event.preventDefault(); } }, [ background, - backgroundCircle, + 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 {}; + 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", { @@ -23586,11 +30082,11 @@ var BearingComponent = /** @class */ (function (_super) { attributes: { viewBox: "0 0 2 2" }, namespace: this._svgNamespace, style: { - height: "30px", - left: "4px", + height: "26px", + left: "7px", position: "absolute", - top: "4px", - width: "30px", + top: "7px", + width: "26px", }, }, [group]); return svg; @@ -23617,9 +30113,38 @@ var BearingComponent = /** @class */ (function (_super) { }; BearingComponent.prototype._createNorth = function (bearing) { var north = vd.h("div.BearingNorth", []); - var container = vd.h("div.BearingNorthContainer", { style: { transform: "rotateZ(" + -bearing * 180 / Math.PI + "deg)" } }, [north]); + 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)); @@ -23627,12 +30152,16 @@ exports.BearingComponent = BearingComponent; Component_1.ComponentService.register(BearingComponent); exports.default = BearingComponent; -},{"../Component":290,"../Geo":293,"virtual-dom":246}],307:[function(require,module,exports){ + +},{"../Component":291,"../Geo":294,"../geo/ViewportCoords":414,"./utils/ComponentSize":398,"@mapbox/unitbezier":2,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],308:[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; } @@ -23640,7 +30169,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); +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) { @@ -23661,43 +30191,30 @@ var CacheComponent = /** @class */ (function (_super) { }; CacheComponent.prototype._activate = function () { var _this = this; - this._sequenceSubscription = Observable_1.Observable - .combineLatest(this._navigator.stateService.currentNode$ - .switchMap(function (node) { + this._sequenceSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) { return node.sequenceEdges$; - }) - .filter(function (status) { + }), operators_1.filter(function (status) { return status.cached; - }), this._configuration$) - .switchMap(function (nc) { + })), 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 Observable_1.Observable - .merge(next$, prev$) - .catch(function (error, caught) { + return rxjs_1.merge(next$, prev$).pipe(operators_1.catchError(function (error, caught) { console.error("Failed to cache sequence edges.", error); - return Observable_1.Observable.empty(); - }); - }) + return rxjs_1.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) { + 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; - })); - }) - .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; + }))); + })), 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)); @@ -23709,13 +30226,11 @@ var CacheComponent = /** @class */ (function (_super) { 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) { + 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 Observable_1.Observable.empty(); - }); - }) + return rxjs_1.empty(); + })); + })) .subscribe(function () { }); }; CacheComponent.prototype._deactivate = function () { @@ -23727,9 +30242,7 @@ var CacheComponent = /** @class */ (function (_super) { }; 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) { + 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$ = []; @@ -23737,30 +30250,23 @@ var CacheComponent = /** @class */ (function (_super) { 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) { + edgesDepths$.push(rxjs_1.zip(_this._navigator.graphService.cacheNode$(edge.to).pipe(operators_1.mergeMap(function (n) { return _this._nodeToEdges$(n, direction); - }), Observable_1.Observable.of(d - 1))); + })), rxjs_1.of(d - 1))); } } } - return Observable_1.Observable - .from(edgesDepths$) - .mergeAll(); - }) - .skip(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$) - .first(function (status) { + node.spatialEdges$).pipe(operators_1.first(function (status) { return status.cached; - }) - .map(function (status) { + }), operators_1.map(function (status) { return status.edges; - }); + })); }; CacheComponent.componentName = "cache"; return CacheComponent; @@ -23769,12 +30275,15 @@ exports.CacheComponent = CacheComponent; Component_1.ComponentService.register(CacheComponent); exports.default = CacheComponent; -},{"../Component":290,"../Edge":291,"rxjs/Observable":29}],308:[function(require,module,exports){ +},{"../Component":291,"../Edge":292,"rxjs":43,"rxjs/operators":241}],309:[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; } @@ -23782,32 +30291,28 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var BehaviorSubject_1 = require("rxjs/BehaviorSubject"); -var Subject_1 = require("rxjs/Subject"); +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 BehaviorSubject_1.BehaviorSubject(false); - _this._configurationSubject$ = new Subject_1.Subject(); + _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$ - .startWith(_this.defaultConfiguration) - .scan(function (conf, newConf) { + _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; - }) - .publishReplay(1) - .refCount(); + }), operators_1.publishReplay(1), operators_1.refCount()); _this._configuration$.subscribe(function () { }); return _this; } @@ -23819,6 +30324,7 @@ var Component = /** @class */ (function (_super) { configurable: true }); Object.defineProperty(Component.prototype, "activated$", { + /** @ignore */ get: function () { return this._activated$; }, @@ -23838,6 +30344,7 @@ var Component = /** @class */ (function (_super) { configurable: true }); Object.defineProperty(Component.prototype, "configuration$", { + /** @ignore */ get: function () { return this._configuration$; }, @@ -23845,6 +30352,12 @@ var Component = /** @class */ (function (_super) { 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; }, @@ -23878,31 +30391,31 @@ var Component = /** @class */ (function (_super) { /** * 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 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":300,"rxjs/BehaviorSubject":26,"rxjs/Subject":34}],309:[function(require,module,exports){ +},{"../Utils":301,"rxjs":43,"rxjs/operators":241}],310:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); -var _ = require("underscore"); var Error_1 = require("../Error"); var ComponentService = /** @class */ (function () { function ComponentService(container, navigator) { this._components = {}; - for (var _i = 0, _a = _.values(ComponentService.registeredComponents); _i < _a.length; _i++) { - var component = _a[_i]; - this._components[component.componentName] = { + 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(component.componentName, container, navigator), + component: new component(componentName, container, navigator), }; } this._coverComponent = new ComponentService.registeredCoverComponent("cover", container, navigator); @@ -23929,26 +30442,30 @@ var ComponentService = /** @class */ (function () { return; } this._coverActivated = true; - for (var _i = 0, _a = _.values(this._components); _i < _a.length; _i++) { - var component = _a[_i]; + for (var componentName in this._components) { + if (!this._components.hasOwnProperty(componentName)) { + continue; + } + var component = this._components[componentName]; if (component.active) { component.component.deactivate(); } } - return; }; 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]; + for (var componentName in this._components) { + if (!this._components.hasOwnProperty(componentName)) { + continue; + } + var component = this._components[componentName]; if (component.active) { component.component.activate(); } } - return; }; ComponentService.prototype.activate = function (name) { this._checkName(name); @@ -23968,12 +30485,6 @@ var ComponentService = /** @class */ (function () { this.get(name).deactivate(); } }; - ComponentService.prototype.resize = function () { - for (var _i = 0, _a = _.values(this._components); _i < _a.length; _i++) { - var component = _a[_i]; - component.component.resize(); - } - }; ComponentService.prototype.get = function (name) { return this._components[name].component; }; @@ -23991,13 +30502,15 @@ var ComponentService = /** @class */ (function () { exports.ComponentService = ComponentService; exports.default = ComponentService; -},{"../Error":292,"underscore":242}],310:[function(require,module,exports){ +},{"../Error":293}],311:[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; } @@ -24005,8 +30518,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var vd = require("virtual-dom"); -var Observable_1 = require("rxjs/Observable"); var Component_1 = require("../Component"); var Utils_1 = require("../Utils"); var Viewer_1 = require("../Viewer"); @@ -24017,36 +30531,28 @@ var CoverComponent = /** @class */ (function (_super) { } CoverComponent.prototype._activate = function () { var _this = this; - this._configuration$ - .distinctUntilChanged(undefined, function (configuration) { + this._configuration$.pipe(operators_1.distinctUntilChanged(undefined, function (configuration) { return configuration.state; - }) - .switchMap(function (configuration) { - return Observable_1.Observable - .combineLatest(Observable_1.Observable.of(configuration.state), _this._navigator.stateService.currentNode$); - }) - .switchMap(function (_a) { + }), 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$ = Observable_1.Observable - .combineLatest(Observable_1.Observable.of(node.key), node.image$ - .map(function (image) { + 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$.first() : keySrc$; - }) - .distinctUntilChanged(function (_a, _b) { + }))); + 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; - }) - .map(function (_a) { + }), operators_1.map(function (_a) { var key = _a[0], src = _a[1]; return { key: key, src: src }; - }) + })) .subscribe(this._configurationSubject$); - this._renderSubscription = Observable_1.Observable - .combineLatest(this._configuration$, this._container.renderService.size$) - .map(function (_a) { + 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", []) }; @@ -24058,7 +30564,7 @@ var CoverComponent = /** @class */ (function (_super) { } 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 () { @@ -24071,9 +30577,15 @@ var CoverComponent = /** @class */ (function (_super) { 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", { onclick: function () { _this.configure({ state: Component_1.CoverState.Loading }); } }, [vd.h("div.CoverButtonIcon", [])]); + var coverButton = vd.h("div.CoverButton", [vd.h("div.CoverButtonIcon", [])]); var coverLogo = vd.h("a.CoverLogo", { href: Utils_1.Urls.explore, target: "_blank" }, []); - return vd.h(cover, [this._getCoverBackgroundVNode(configuration), coverButton, coverLogo]); + 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 ? @@ -24092,13 +30604,15 @@ exports.CoverComponent = CoverComponent; Component_1.ComponentService.registerCover(CoverComponent); exports.default = CoverComponent; -},{"../Component":290,"../Utils":300,"../Viewer":301,"rxjs/Observable":29,"virtual-dom":246}],311:[function(require,module,exports){ +},{"../Component":291,"../Utils":301,"../Viewer":302,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],312:[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; } @@ -24106,23 +30620,23 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var _ = require("underscore"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var vd = require("virtual-dom"); -var BehaviorSubject_1 = require("rxjs/BehaviorSubject"); 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 BehaviorSubject_1.BehaviorSubject(false); + _this._open$ = new rxjs_1.BehaviorSubject(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) { + 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 () { @@ -24144,10 +30658,13 @@ var DebugComponent = /** @class */ (function (_super) { 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) { + 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 { @@ -24204,13 +30721,15 @@ exports.DebugComponent = DebugComponent; Component_1.ComponentService.register(DebugComponent); exports.default = DebugComponent; -},{"../Component":290,"rxjs/BehaviorSubject":26,"underscore":242,"virtual-dom":246}],312:[function(require,module,exports){ +},{"../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],313:[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; } @@ -24218,8 +30737,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var vd = require("virtual-dom"); -var Observable_1 = require("rxjs/Observable"); var Component_1 = require("../Component"); var Utils_1 = require("../Utils"); var ImageComponent = /** @class */ (function (_super) { @@ -24232,27 +30752,22 @@ var ImageComponent = /** @class */ (function (_super) { } ImageComponent.prototype._activate = function () { var _this = this; - var canvasSize$ = this._container.domRenderer.element$ - .map(function (element) { + var canvasSize$ = this._container.domRenderer.element$.pipe(operators_1.map(function (element) { return _this._dom.document.getElementById(_this._canvasId); - }) - .filter(function (canvas) { + }), operators_1.filter(function (canvas) { return !!canvas; - }) - .map(function (canvas) { + }), operators_1.map(function (canvas) { var adaptableDomRenderer = canvas.parentElement; var width = adaptableDomRenderer.offsetWidth; var height = adaptableDomRenderer.offsetHeight; return [canvas, { height: height, width: width }]; - }) - .distinctUntilChanged(function (s1, s2) { + }), 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 = Observable_1.Observable - .combineLatest(canvasSize$, this._navigator.stateService.currentNode$) + })); + 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; @@ -24276,13 +30791,16 @@ exports.ImageComponent = ImageComponent; Component_1.ComponentService.register(ImageComponent); exports.default = ImageComponent; -},{"../Component":290,"../Utils":300,"rxjs/Observable":29,"virtual-dom":246}],313:[function(require,module,exports){ + +},{"../Component":291,"../Utils":301,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],314:[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; } @@ -24290,9 +30808,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var _ = require("underscore"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var vd = require("virtual-dom"); -var Observable_1 = require("rxjs/Observable"); var Component_1 = require("../Component"); var LoadingComponent = /** @class */ (function (_super) { __extends(LoadingComponent, _super); @@ -24301,20 +30819,21 @@ var LoadingComponent = /** @class */ (function (_super) { } LoadingComponent.prototype._activate = function () { var _this = this; - this._loadingSubscription = this._navigator.loadingService.loading$ - .switchMap(function (loading) { + this._loadingSubscription = this._navigator.loadingService.loading$.pipe(operators_1.switchMap(function (loading) { return loading ? _this._navigator.imageLoadingService.loadstatus$ : - Observable_1.Observable.of({}); - }) - .map(function (loadStatus) { + rxjs_1.of({}); + }), operators_1.map(function (loadStatus) { 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; + 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; @@ -24322,7 +30841,7 @@ var LoadingComponent = /** @class */ (function (_super) { percentage = (loaded / total) * 100; } return { name: _this._name, vnode: _this._getBarVNode(percentage) }; - }) + })) .subscribe(this._container.domRenderer.render$); }; LoadingComponent.prototype._deactivate = function () { @@ -24351,13 +30870,15 @@ exports.LoadingComponent = LoadingComponent; Component_1.ComponentService.register(LoadingComponent); exports.default = LoadingComponent; -},{"../Component":290,"rxjs/Observable":29,"underscore":242,"virtual-dom":246}],314:[function(require,module,exports){ +},{"../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],315:[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; } @@ -24365,8 +30886,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var vd = require("virtual-dom"); -var Observable_1 = require("rxjs/Observable"); var Edge_1 = require("../Edge"); var Error_1 = require("../Error"); var Component_1 = require("../Component"); @@ -24379,6 +30901,7 @@ var Component_1 = require("../Component"); */ 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 = {}; @@ -24397,36 +30920,29 @@ var NavigationComponent = /** @class */ (function (_super) { } NavigationComponent.prototype._activate = function () { var _this = this; - this._renderSubscription = Observable_1.Observable - .combineLatest(this._navigator.stateService.currentNode$, this._configuration$) - .switchMap(function (_a) { + 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$ - .map(function (status) { + node.sequenceEdges$.pipe(operators_1.map(function (status) { return status.edges .map(function (edge) { return edge.data.direction; }); - }) : - Observable_1.Observable.of([]); + })) : + rxjs_1.of([]); var spatialEdges$ = !node.pano && configuration.spatial ? - node.spatialEdges$ - .map(function (status) { + node.spatialEdges$.pipe(operators_1.map(function (status) { return status.edges .map(function (edge) { return edge.data.direction; }); - }) : - Observable_1.Observable.of([]); - return Observable_1.Observable - .combineLatest(sequenceEdges$, spatialEdges$) - .map(function (_a) { + })) : + 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); - }); - }) - .map(function (edgeDirections) { + })); + }), 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); @@ -24435,7 +30951,7 @@ var NavigationComponent = /** @class */ (function (_super) { 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 () { @@ -24483,13 +30999,15 @@ exports.NavigationComponent = NavigationComponent; Component_1.ComponentService.register(NavigationComponent); exports.default = NavigationComponent; -},{"../Component":290,"../Edge":291,"../Error":292,"rxjs/Observable":29,"virtual-dom":246}],315:[function(require,module,exports){ +},{"../Component":291,"../Edge":292,"../Error":293,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],316:[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; } @@ -24497,9 +31015,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var _ = require("underscore"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var vd = require("virtual-dom"); -var Observable_1 = require("rxjs/Observable"); var Component_1 = require("../Component"); var DescriptionState = /** @class */ (function () { function DescriptionState() { @@ -24525,41 +31043,39 @@ var RouteComponent = /** @class */ (function (_super) { } RouteComponent.prototype._activate = function () { var _this = this; - var _slowedStream$; - _slowedStream$ = this._navigator.stateService.currentState$.filter(function (frame) { + var slowedStream$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) { return (frame.id % 2) === 0; - }).filter(function (frame) { + }), operators_1.filter(function (frame) { return frame.state.nodesAhead < 15; - }).distinctUntilChanged(undefined, function (frame) { + }), operators_1.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) { + })); + 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; - }).mergeMap(function (path) { - return _this._navigator.apiV3.sequenceByKey$([path.sequenceKey]) - .map(function (sequenceByKey) { + }), operators_1.mergeMap(function (path) { + return _this._navigator.apiV3.sequenceByKey$([path.sequenceKey]).pipe(operators_1.map(function (sequenceByKey) { return sequenceByKey[path.sequenceKey]; - }); - }).combineLatest(this.configuration$, function (sequence, conf) { + })); + })), this.configuration$).pipe(operators_1.map(function (_a) { + var sequence = _a[0], conf = _a[1]; var i = 0; var instructionPlaces = []; - for (var _i = 0, _a = conf.paths; _i < _a.length; _i++) { - var path = _a[_i]; + 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 _b = 0, _c = sequence.keys; _b < _c.length; _b++) { - var key = _c[_b]; + 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 _d = 0, _e = path.infoKeys; _d < _e.length; _d++) { - var infoKey = _e[_d]; + for (var _e = 0, _f = path.infoKeys; _e < _f.length; _e++) { + var infoKey = _f[_e]; if (infoKey.key === key) { description = infoKey.description; } @@ -24575,18 +31091,27 @@ var RouteComponent = /** @class */ (function (_super) { i++; } return instructionPlaces; - }).scan(function (routeTrack, 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; } - routeTrack.nodeInstructions = _.flatten(routeTrack.nodeInstructionsOrdered); + 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()); - this._disposable = _slowedStream$ - .combineLatest(_routeTrack$, this.configuration$, function (frame, routeTrack, conf) { + }, 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 }; - }).scan(function (routeState, rtAndFrame) { + }), operators_1.scan(function (routeState, rtAndFrame) { if (rtAndFrame.conf.playing === undefined || rtAndFrame.conf.playing) { routeState.routeTrack = rtAndFrame.routeTrack; routeState.currentNode = rtAndFrame.frame.state.currentNode; @@ -24598,10 +31123,9 @@ var RouteComponent = /** @class */ (function (_super) { routeState.playing = false; } return routeState; - }, new RouteState()) - .filter(function (routeState) { + }, new RouteState()), operators_1.filter(function (routeState) { return routeState.playing; - }).filter(function (routeState) { + }), operators_1.filter(function (routeState) { for (var _i = 0, _a = routeState.routeTrack.nodeInstructions; _i < _a.length; _i++) { var nodeInstruction = _a[_i]; if (!nodeInstruction) { @@ -24612,9 +31136,9 @@ var RouteComponent = /** @class */ (function (_super) { } } return false; - }).distinctUntilChanged(undefined, function (routeState) { + }), operators_1.distinctUntilChanged(undefined, function (routeState) { return routeState.lastNode.key; - }).mergeMap(function (routeState) { + }), operators_1.mergeMap(function (routeState) { var i = 0; for (var _i = 0, _a = routeState.routeTrack.nodeInstructions; _i < _a.length; _i++) { var nodeInstruction = _a[_i]; @@ -24625,29 +31149,32 @@ var RouteComponent = /** @class */ (function (_super) { } var nextInstruction = routeState.routeTrack.nodeInstructions[i + 1]; if (!nextInstruction) { - return Observable_1.Observable.of(null); + return rxjs_1.of(null); } return _this._navigator.graphService.cacheNode$(nextInstruction.key); - }).combineLatest(this.configuration$, function (node, conf) { + })); + 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 }; - }).filter(function (cAN) { + }), operators_1.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) { + }), 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, _a = routeTrack.nodeInstructions; _i < _a.length; _i++) { - var nodeInstruction = _a[_i]; + 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; - }).scan(function (descriptionState, description) { + }), operators_1.scan(function (descriptionState, description) { if (description !== descriptionState.description && description !== null) { descriptionState.description = description; descriptionState.showsLeft = 6; @@ -24659,14 +31186,15 @@ var RouteComponent = /** @class */ (function (_super) { descriptionState.description = null; } return descriptionState; - }, new DescriptionState()).map(function (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$); + })) + .subscribe(this._container.domRenderer.render$); }; RouteComponent.prototype._deactivate = function () { this._disposable.unsubscribe(); @@ -24693,12 +31221,15 @@ exports.RouteComponent = RouteComponent; Component_1.ComponentService.register(RouteComponent); exports.default = RouteComponent; -},{"../Component":290,"rxjs/Observable":29,"underscore":242,"virtual-dom":246}],316:[function(require,module,exports){ +},{"../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],317:[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; } @@ -24706,17 +31237,19 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); +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) { - return _super.call(this, name, container, navigator) || this; + 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$ - .scan(function (keys, node) { + this._sequenceSubscription = this._navigator.stateService.currentNode$.pipe(operators_1.scan(function (keys, node) { var sKey = node.sequenceKey; keys.report = []; if (!(sKey in keys.reported)) { @@ -24724,24 +31257,18 @@ var StatsComponent = /** @class */ (function (_super) { keys.reported[sKey] = true; } return keys; - }, { report: [], reported: {} }) - .filter(function (keys) { + }, { report: [], reported: {} }), operators_1.filter(function (keys) { return keys.report.length > 0; - }) - .mergeMap(function (keys) { - return _this._navigator.apiV3.sequenceViewAdd$(keys.report) - .catch(function (error, caught) { + }), 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 Observable_1.Observable.empty(); - }); - }) + return rxjs_1.empty(); + })); + })) .subscribe(function () { }); - this._imageSubscription = this._navigator.stateService.currentNode$ - .map(function (node) { + this._imageSubscription = this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) { return node.key; - }) - .buffer(this._navigator.stateService.currentNode$.debounceTime(5000)) - .scan(function (keys, newKeys) { + })).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]; @@ -24751,17 +31278,14 @@ var StatsComponent = /** @class */ (function (_super) { } } return keys; - }, { report: [], reported: {} }) - .filter(function (keys) { + }, { report: [], reported: {} }), operators_1.filter(function (keys) { return keys.report.length > 0; - }) - .mergeMap(function (keys) { - return _this._navigator.apiV3.imageViewAdd$(keys.report) - .catch(function (error, caught) { + }), 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 Observable_1.Observable.empty(); - }); - }) + return rxjs_1.empty(); + })); + })) .subscribe(function () { }); }; StatsComponent.prototype._deactivate = function () { @@ -24778,13 +31302,15 @@ exports.StatsComponent = StatsComponent; Component_1.ComponentService.register(StatsComponent); exports.default = StatsComponent; -},{"../Component":290,"rxjs/Observable":29}],317:[function(require,module,exports){ +},{"../Component":291,"rxjs":43,"rxjs/operators":241}],318:[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; } @@ -24793,8 +31319,8 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var vd = require("virtual-dom"); -var Observable_1 = require("rxjs/Observable"); -var Subject_1 = require("rxjs/Subject"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var Component_1 = require("../../Component"); /** * @class DirectionComponent @@ -24806,9 +31332,9 @@ var DirectionComponent = /** @class */ (function (_super) { var _this = _super.call(this, name, container, navigator) || this; _this._renderer = !!directionDOMRenderer ? directionDOMRenderer : - new Component_1.DirectionDOMRenderer(_this.defaultConfiguration, container.element); - _this._hoveredKeySubject$ = new Subject_1.Subject(); - _this._hoveredKey$ = _this._hoveredKeySubject$.share(); + 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$", { @@ -24869,62 +31395,45 @@ var DirectionComponent = /** @class */ (function (_super) { DirectionComponent.prototype.setMaxWidth = function (maxWidth) { this.configure({ maxWidth: maxWidth }); }; - /** @inheritdoc */ - DirectionComponent.prototype.resize = function () { - this._renderer.resize(this._container.element); - }; DirectionComponent.prototype._activate = function () { var _this = this; this._configurationSubscription = this._configuration$ .subscribe(function (configuration) { _this._renderer.setConfiguration(configuration); }); - this._nodeSubscription = this._navigator.stateService.currentNode$ - .do(function (node) { + 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); - }) - .withLatestFrom(this._configuration$) - .switchMap(function (_a) { + }), operators_1.withLatestFrom(this._configuration$), operators_1.switchMap(function (_a) { var node = _a[0], configuration = _a[1]; - return Observable_1.Observable - .combineLatest(node.spatialEdges$, configuration.distinguishSequence ? + return rxjs_1.combineLatest(node.spatialEdges$, configuration.distinguishSequence ? _this._navigator.graphService - .cacheSequence$(node.sequenceKey) - .catch(function (error, caught) { + .cacheSequence$(node.sequenceKey).pipe(operators_1.catchError(function (error, caught) { console.error("Failed to cache sequence (" + node.sequenceKey + ")", error); - return Observable_1.Observable.of(null); - }) : - Observable_1.Observable.of(null)); - }) + 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$ - .do(function (renderCamera) { + this._renderCameraSubscription = this._container.renderService.renderCameraFrame$.pipe(operators_1.tap(function (renderCamera) { _this._renderer.setRenderCamera(renderCamera); - }) - .map(function (renderCamera) { + }), operators_1.map(function () { return _this._renderer; - }) - .filter(function (renderer) { + }), operators_1.filter(function (renderer) { return renderer.needsRender; - }) - .map(function (renderer) { + }), operators_1.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) { + 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"); @@ -24933,15 +31442,19 @@ var DirectionComponent = /** @class */ (function (_super) { } } return null; - }) - .distinctUntilChanged() + }), 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(); - this._hoveredKeySubscription.unsubscribe(); }; DirectionComponent.prototype._getDefaultConfiguration = function () { return { @@ -24952,13 +31465,25 @@ var DirectionComponent = /** @class */ (function (_super) { }; /** @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":290,"rxjs/Observable":29,"rxjs/Subject":34,"virtual-dom":246}],318:[function(require,module,exports){ + +},{"../../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],319:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Geo_1 = require("../../Geo"); @@ -24967,14 +31492,14 @@ var Geo_1 = require("../../Geo"); * @classdesc Helper class for calculating DOM CSS properties. */ var DirectionDOMCalculator = /** @class */ (function () { - function DirectionDOMCalculator(configuration, element) { + 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(element); + this._resize(size); this._reset(); } Object.defineProperty(DirectionDOMCalculator.prototype, "minWidth", { @@ -25108,13 +31633,12 @@ var DirectionDOMCalculator = /** @class */ (function () { }; /** * Resizes all properties according to the width and height - * of the element. + * of the size object. * - * @param {HTMLElement} element The container element from which to extract - * the width and height. + * @param {ISize} size The size of the container element. */ - DirectionDOMCalculator.prototype.resize = function (element) { - this._resize(element); + DirectionDOMCalculator.prototype.resize = function (size) { + this._resize(size); this._reset(); }; /** @@ -25143,9 +31667,9 @@ var DirectionDOMCalculator = /** @class */ (function () { this._minWidth = configuration.minWidth; this._maxWidth = this._getMaxWidth(configuration.minWidth, configuration.maxWidth); }; - DirectionDOMCalculator.prototype._resize = function (element) { - this._elementWidth = element.offsetWidth; - this._elementHeight = element.offsetHeight; + DirectionDOMCalculator.prototype._resize = function (size) { + this._elementWidth = size.width; + this._elementHeight = size.height; }; DirectionDOMCalculator.prototype._reset = function () { this._containerWidth = this._getContainerWidth(this._elementWidth, this._elementHeight); @@ -25197,9 +31721,9 @@ var DirectionDOMCalculator = /** @class */ (function () { exports.DirectionDOMCalculator = DirectionDOMCalculator; exports.default = DirectionDOMCalculator; -},{"../../Geo":293}],319:[function(require,module,exports){ + +},{"../../Geo":294}],320:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var vd = require("virtual-dom"); var Component_1 = require("../../Component"); @@ -25211,10 +31735,10 @@ var Geo_1 = require("../../Geo"); * @classdesc DOM renderer for direction arrows. */ var DirectionDOMRenderer = /** @class */ (function () { - function DirectionDOMRenderer(configuration, element) { + function DirectionDOMRenderer(configuration, size) { this._isEdge = false; this._spatial = new Geo_1.Spatial(); - this._calculator = new Component_1.DirectionDOMCalculator(configuration, element); + this._calculator = new Component_1.DirectionDOMCalculator(configuration, size); this._node = null; this._rotation = { phi: 0, theta: 0 }; this._epsilon = 0.5 * Math.PI / 180; @@ -25329,10 +31853,10 @@ var DirectionDOMRenderer = /** @class */ (function () { * Detect the element's width and height and resize * elements accordingly. * - * @param {HTMLElement} element Viewer container element. + * @param {ISize} size Size of vßiewer container element. */ - DirectionDOMRenderer.prototype.resize = function (element) { - this._calculator.resize(element); + DirectionDOMRenderer.prototype.resize = function (size) { + this._calculator.resize(size); this._setNeedsRender(); }; DirectionDOMRenderer.prototype._setNeedsRender = function () { @@ -25577,12 +32101,16 @@ var DirectionDOMRenderer = /** @class */ (function () { exports.DirectionDOMRenderer = DirectionDOMRenderer; exports.default = DirectionDOMRenderer; -},{"../../Component":290,"../../Edge":291,"../../Error":292,"../../Geo":293,"virtual-dom":246}],320:[function(require,module,exports){ + +},{"../../Component":291,"../../Edge":292,"../../Error":293,"../../Geo":294,"virtual-dom":247}],321:[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; } @@ -25590,55 +32118,52 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); -var Subject_1 = require("rxjs/Subject"); +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._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) { + _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) - .filter(function (renderer) { + }, null), operators_1.filter(function (renderer) { return renderer != null; - }) - .distinctUntilChanged(undefined, function (renderer) { + }), operators_1.distinctUntilChanged(undefined, function (renderer) { return renderer.frameId; - }); - _this._rendererCreator$ - .map(function () { + })); + _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$ - .map(function () { + _this._rendererDisposer$.pipe(operators_1.map(function () { return function (renderer) { renderer.dispose(); return null; }; - }) + })) .subscribe(_this._rendererOperation$); return _this; } ImagePlaneComponent.prototype._activate = function () { var _this = this; - this._rendererSubscription = this._renderer$ - .map(function (renderer) { + this._rendererSubscription = this._renderer$.pipe(operators_1.map(function (renderer) { var renderHash = { name: _this._name, render: { @@ -25650,30 +32175,19 @@ var ImagePlaneComponent = /** @class */ (function (_super) { }; renderer.clearNeedsRender(); return renderHash; - }) + })) .subscribe(this._container.glRenderer.render$); this._rendererCreator$.next(null); - this._stateSubscription = this._navigator.stateService.currentState$ - .map(function (frame) { + 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$ - .distinctUntilChanged(undefined, function (frame) { + var textureProvider$ = this._navigator.stateService.currentState$.pipe(operators_1.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 (_a) { + }), 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); @@ -25681,39 +32195,30 @@ var ImagePlaneComponent = /** @class */ (function (_super) { 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); - }) - .publishReplay(1) - .refCount(); + }), operators_1.publishReplay(1), operators_1.refCount()); this._textureProviderSubscription = textureProvider$.subscribe(function () { }); - this._setTextureProviderSubscription = textureProvider$ - .map(function (provider) { + 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$ - .switchMap(function (size) { - return Observable_1.Observable - .combineLatest(textureProvider$, Observable_1.Observable.of(size)) - .first(); - }) + 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$ - .pairwise() + this._abortTextureProviderSubscription = textureProvider$.pipe(operators_1.pairwise()) .subscribe(function (pair) { var previous = pair[0]; previous.abort(); }); - var roiTrigger$ = Observable_1.Observable - .combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.debounceTime(250)) - .map(function (_a) { + 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(), @@ -25722,104 +32227,79 @@ var ImagePlaneComponent = /** @class */ (function (_super) { size.height.valueOf(), size.width.valueOf() ]; - }) - .pairwise() - .skipWhile(function (pls) { + }), operators_1.pairwise(), operators_1.skipWhile(function (pls) { return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0; - }) - .map(function (pls) { + }), 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; - }) - .distinctUntilChanged() - .filter(function (stalled) { + }), operators_1.distinctUntilChanged(), operators_1.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 (_a) { + }), 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, ]; - }); - }) - .filter(function (args) { + }), 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$ - .switchMap(function (provider) { + var hasTexture$ = textureProvider$.pipe(operators_1.switchMap(function (provider) { return provider.hasTexture$; - }) - .startWith(false) - .publishReplay(1) - .refCount(); + }), operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount()); this._hasTextureSubscription = hasTexture$.subscribe(function () { }); - var nodeImage$ = this._navigator.stateService.currentState$ - .filter(function (frame) { + var nodeImage$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) { return frame.state.nodesAhead === 0; - }) - .map(function (frame) { + }), operators_1.map(function (frame) { return frame.state.currentNode; - }) - .distinctUntilChanged(undefined, function (node) { + }), operators_1.distinctUntilChanged(undefined, function (node) { return node.key; - }) - .debounceTime(1000) - .withLatestFrom(hasTexture$) - .filter(function (args) { + }), operators_1.debounceTime(1000), operators_1.withLatestFrom(hasTexture$), operators_1.filter(function (args) { return !args[1]; - }) - .map(function (args) { + }), operators_1.map(function (args) { return args[0]; - }) - .filter(function (node) { + }), operators_1.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) { + }), 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 Observable_1.Observable.empty(); + return rxjs_1.empty(); } var image$ = node - .cacheImage$(Utils_1.Settings.maxImageSize) - .map(function (n) { + .cacheImage$(Utils_1.Settings.maxImageSize).pipe(operators_1.map(function (n) { return [n.image, n]; - }); - return image$ - .takeUntil(hasTexture$ - .filter(function (hasTexture) { + })); + return image$.pipe(operators_1.takeUntil(hasTexture$.pipe(operators_1.filter(function (hasTexture) { return hasTexture; - })) - .catch(function (error, caught) { + }))), operators_1.catchError(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$) + 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) { @@ -25827,14 +32307,99 @@ var ImagePlaneComponent = /** @class */ (function (_super) { } args[1].updateBackground(args[0][0]); }); - this._updateTextureImageSubscription = nodeImage$ - .map(function (imn) { + this._updateTextureImageSubscription = nodeImage$.pipe(operators_1.map(function (imn) { return function (renderer) { renderer.updateTextureImage(imn[0], imn[1]); return renderer; }; - }) + })) + .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)); + })); + }), 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; + } + } + if (!closest[1]) { + return rxjs_1.empty(); + } + return _this._navigator.moveToKey$(closest[1]).pipe(operators_1.catchError(function () { + return rxjs_1.empty(); + })); + })) + .subscribe(); }; ImagePlaneComponent.prototype._deactivate = function () { this._rendererDisposer$.next(null); @@ -25848,9 +32413,13 @@ var ImagePlaneComponent = /** @class */ (function (_super) { this._textureProviderSubscription.unsubscribe(); this._updateBackgroundSubscription.unsubscribe(); this._updateTextureImageSubscription.unsubscribe(); + this._clearPeripheryPlaneSubscription.unsubscribe(); + this._addPeripheryPlaneSubscription.unsubscribe(); + this._updatePeripheryPlaneTextureSubscription.unsubscribe(); + this._moveToPeripheryNodeSubscription.unsubscribe(); }; ImagePlaneComponent.prototype._getDefaultConfiguration = function () { - return { imageTiling: false }; + return {}; }; ImagePlaneComponent.componentName = "imagePlane"; return ImagePlaneComponent; @@ -25859,9 +32428,8 @@ exports.ImagePlaneComponent = ImagePlaneComponent; Component_1.ComponentService.register(ImagePlaneComponent); exports.default = ImagePlaneComponent; -},{"../../Component":290,"../../Render":296,"../../Tiles":299,"../../Utils":300,"rxjs/Observable":29,"rxjs/Subject":34}],321:[function(require,module,exports){ +},{"../../Component":291,"../../Render":297,"../../Tiles":300,"../../Utils":301,"../../Viewer":302,"../../geo/Spatial":412,"../../geo/ViewportCoords":414,"rxjs":43,"rxjs/operators":241}],322:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var Component_1 = require("../../Component"); var ImagePlaneGLRenderer = /** @class */ (function () { @@ -25894,6 +32462,17 @@ var ImagePlaneGLRenderer = /** @class */ (function () { ImagePlaneGLRenderer.prototype.indicateNeedsRender = function () { this._needsRender = true; }; + 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; + }; + ImagePlaneGLRenderer.prototype.clearPeripheryPlanes = function () { + this._scene.setPeripheryPlanes({}); + this._needsRender = true; + }; ImagePlaneGLRenderer.prototype.updateFrame = function (frame) { this._updateFrameId(frame.id); this._needsRender = this._updateAlpha(frame.state.alpha) || this._needsRender; @@ -25925,24 +32504,17 @@ var ImagePlaneGLRenderer = /** @class */ (function () { } this._providerDisposers[key] = dispose; }; - ImagePlaneGLRenderer.prototype._updateTexture = function (texture) { - this._needsRender = true; - for (var _i = 0, _a = this._scene.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._scene.imagePlanes; _i < _a.length; _i++) { - var plane = _a[_i]; + var planes = this._extend({}, this._scene.planes, this._scene.planesOld, this._scene.planesPeriphery); + for (var key in planes) { + if (!planes.hasOwnProperty(key)) { + continue; + } + if (key !== node.key) { + continue; + } + var plane = planes[key]; var material = plane.material; var texture = material.uniforms.projectorTex.value; texture.image = image; @@ -25950,19 +32522,40 @@ var ImagePlaneGLRenderer = /** @class */ (function () { } }; ImagePlaneGLRenderer.prototype.render = function (perspectiveCamera, renderer) { - var planeAlpha = this._scene.imagePlanesOld.length ? 1 : this._alpha; - for (var _i = 0, _a = this._scene.imagePlanes; _i < _a.length; _i++) { - var plane = _a[_i]; + 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; } - for (var _b = 0, _c = this._scene.imagePlanesOld; _b < _c.length; _b++) { - var plane = _c[_b]; + for (var key in planesOld) { + if (!planesOld.hasOwnProperty(key)) { + continue; + } + var plane = planesOld[key]; plane.material.uniforms.opacity.value = this._alphaOld; } + for (var key in planesPeriphery) { + if (!planesPeriphery.hasOwnProperty(key)) { + continue; + } + 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 _d = 0, _e = this._scene.imagePlanes; _d < _e.length; _d++) { - var plane = _e[_d]; + for (var key in planes) { + if (!planes.hasOwnProperty(key)) { + continue; + } + var plane = planes[key]; plane.material.uniforms.opacity.value = this._alpha; } renderer.render(this._scene.scene, perspectiveCamera); @@ -26006,22 +32599,57 @@ var ImagePlaneGLRenderer = /** @class */ (function () { if (previousKey != null) { if (previousKey !== this._currentKey && previousKey !== this._previousKey) { var previousMesh = this._factory.createMesh(state.previousNode, state.previousTransform); - this._scene.updateImagePlanes([previousMesh]); + var previousPlanes = {}; + previousPlanes[previousKey] = previousMesh; + this._scene.updateImagePlanes(previousPlanes); } this._previousKey = previousKey; } this._currentKey = currentKey; var currentMesh = this._factory.createMesh(state.currentNode, state.currentTransform); - this._scene.updateImagePlanes([currentMesh]); + var planes = {}; + planes[currentKey] = currentMesh; + this._scene.updateImagePlanes(planes); this._alphaOld = 1; return true; }; + 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; + } + }; + ImagePlaneGLRenderer.prototype._extend = function (dest) { + var sources = []; + for (var _i = 1; _i < arguments.length; _i++) { + sources[_i - 1] = arguments[_i]; + } + 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; + }; return ImagePlaneGLRenderer; }()); exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer; exports.default = ImagePlaneGLRenderer; -},{"../../Component":290}],322:[function(require,module,exports){ +},{"../../Component":291}],323:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var CoverState; @@ -26031,7 +32659,7 @@ var CoverState; CoverState[CoverState["Visible"] = 2] = "Visible"; })(CoverState = exports.CoverState || (exports.CoverState = {})); -},{}],323:[function(require,module,exports){ +},{}],324:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -26071,7 +32699,7 @@ var SliderMode; SliderMode[SliderMode["Stationary"] = 1] = "Stationary"; })(SliderMode = exports.SliderMode || (exports.SliderMode = {})); -},{}],324:[function(require,module,exports){ +},{}],325:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ICoverConfiguration_1 = require("./ICoverConfiguration"); @@ -26079,13 +32707,15 @@ exports.CoverState = ICoverConfiguration_1.CoverState; var ISliderConfiguration_1 = require("./ISliderConfiguration"); exports.SliderMode = ISliderConfiguration_1.SliderMode; -},{"./ICoverConfiguration":322,"./ISliderConfiguration":323}],325:[function(require,module,exports){ +},{"./ICoverConfiguration":323,"./ISliderConfiguration":324}],326:[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; } @@ -26093,6 +32723,7 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var operators_1 = require("rxjs/operators"); var Component_1 = require("../../Component"); var Edge_1 = require("../../Edge"); /** @@ -26121,11 +32752,9 @@ var KeyPlayHandler = /** @class */ (function (_super) { } KeyPlayHandler.prototype._enable = function () { var _this = this; - this._keyDownSubscription = this._container.keyboardService.keyDown$ - .withLatestFrom(this._navigator.playService.playing$, this._navigator.playService.direction$, this._navigator.playService.speed$, 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$; - })) + })))) .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) { @@ -26183,13 +32812,15 @@ var KeyPlayHandler = /** @class */ (function (_super) { exports.KeyPlayHandler = KeyPlayHandler; exports.default = KeyPlayHandler; -},{"../../Component":290,"../../Edge":291}],326:[function(require,module,exports){ +},{"../../Component":291,"../../Edge":292,"rxjs/operators":241}],327:[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; } @@ -26197,6 +32828,7 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var operators_1 = require("rxjs/operators"); var Component_1 = require("../../Component"); var Edge_1 = require("../../Edge"); var Error_1 = require("../../Error"); @@ -26224,20 +32856,18 @@ var KeySequenceNavigationHandler = /** @class */ (function (_super) { } KeySequenceNavigationHandler.prototype._enable = function () { var _this = this; - var sequenceEdges$ = this._navigator.stateService.currentNode$ - .switchMap(function (node) { + var sequenceEdges$ = this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) { return node.sequenceEdges$; - }); - this._keyDownSubscription = this._container.keyboardService.keyDown$ - .withLatestFrom(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 + case 38: // up direction = Edge_1.EdgeDirection.Next; break; - case 40:// down + case 40: // down direction = Edge_1.EdgeDirection.Prev; break; default: @@ -26272,13 +32902,15 @@ var KeySequenceNavigationHandler = /** @class */ (function (_super) { exports.KeySequenceNavigationHandler = KeySequenceNavigationHandler; exports.default = KeySequenceNavigationHandler; -},{"../../Component":290,"../../Edge":291,"../../Error":292}],327:[function(require,module,exports){ +},{"../../Component":291,"../../Edge":292,"../../Error":293,"rxjs/operators":241}],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; } @@ -26286,6 +32918,7 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var operators_1 = require("rxjs/operators"); var Component_1 = require("../../Component"); var Edge_1 = require("../../Edge"); var Error_1 = require("../../Error"); @@ -26313,6 +32946,7 @@ var Error_1 = require("../../Error"); */ 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; @@ -26320,27 +32954,25 @@ var KeySpatialNavigationHandler = /** @class */ (function (_super) { } KeySpatialNavigationHandler.prototype._enable = function () { var _this = this; - var spatialEdges$ = this._navigator.stateService.currentNode$ - .switchMap(function (node) { + var spatialEdges$ = this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) { return node.spatialEdges$; - }); - this._keyDownSubscription = this._container.keyboardService.keyDown$ - .withLatestFrom(spatialEdges$, this._navigator.stateService.currentState$) + })); + 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 + case 37: // left direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnLeft : Edge_1.EdgeDirection.StepLeft; break; - case 38:// up + case 38: // up direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.Pano : Edge_1.EdgeDirection.StepForward; break; - case 39:// right + case 39: // right direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnRight : Edge_1.EdgeDirection.StepRight; break; - case 40:// down + case 40: // down direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnU : Edge_1.EdgeDirection.StepBackward; break; default: @@ -26419,13 +33051,15 @@ var KeySpatialNavigationHandler = /** @class */ (function (_super) { exports.KeySpatialNavigationHandler = KeySpatialNavigationHandler; exports.default = KeySpatialNavigationHandler; -},{"../../Component":290,"../../Edge":291,"../../Error":292}],328:[function(require,module,exports){ +},{"../../Component":291,"../../Edge":292,"../../Error":293,"rxjs/operators":241}],329:[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; } @@ -26433,6 +33067,7 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var operators_1 = require("rxjs/operators"); var Component_1 = require("../../Component"); /** * The `KeyZoomHandler` allows the user to zoom in and out using the @@ -26453,6 +33088,7 @@ var Component_1 = require("../../Component"); */ 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; @@ -26460,8 +33096,7 @@ var KeyZoomHandler = /** @class */ (function (_super) { } KeyZoomHandler.prototype._enable = function () { var _this = this; - this._keyDownSubscription = this._container.keyboardService.keyDown$ - .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$) + 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) { @@ -26495,12 +33130,15 @@ var KeyZoomHandler = /** @class */ (function (_super) { exports.KeyZoomHandler = KeyZoomHandler; exports.default = KeyZoomHandler; -},{"../../Component":290}],329:[function(require,module,exports){ +},{"../../Component":291,"rxjs/operators":241}],330:[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; } @@ -26529,6 +33167,7 @@ var Geo_1 = require("../../Geo"); */ 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); @@ -26632,7 +33271,7 @@ exports.KeyboardComponent = KeyboardComponent; Component_1.ComponentService.register(KeyboardComponent); exports.default = KeyboardComponent; -},{"../../Component":290,"../../Geo":293}],330:[function(require,module,exports){ +},{"../../Component":291,"../../Geo":294}],331:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var MarkerComponent_1 = require("./MarkerComponent"); @@ -26642,13 +33281,15 @@ exports.SimpleMarker = SimpleMarker_1.SimpleMarker; var CircleMarker_1 = require("./marker/CircleMarker"); exports.CircleMarker = CircleMarker_1.CircleMarker; -},{"./MarkerComponent":331,"./marker/CircleMarker":334,"./marker/SimpleMarker":336}],331:[function(require,module,exports){ +},{"./MarkerComponent":332,"./marker/CircleMarker":335,"./marker/SimpleMarker":337}],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; } @@ -26656,9 +33297,10 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var THREE = require("three"); var when = require("when"); -var Observable_1 = require("rxjs/Observable"); var Component_1 = require("../../Component"); var Render_1 = require("../../Render"); var Graph_1 = require("../../Graph"); @@ -26701,6 +33343,7 @@ var Geo_1 = require("../../Geo"); */ 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; @@ -26774,14 +33417,12 @@ var MarkerComponent = /** @class */ (function (_super) { MarkerComponent.prototype.getMarkerIdAt = function (pixelPoint) { var _this = this; return when.promise(function (resolve, reject) { - _this._container.renderService.renderCamera$ - .first() - .map(function (render) { + _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) { @@ -26819,51 +33460,28 @@ var MarkerComponent = /** @class */ (function (_super) { }; MarkerComponent.prototype._activate = function () { var _this = this; - var groundAltitude$ = this._navigator.stateService.currentState$ - .map(function (frame) { + var groundAltitude$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) { return frame.state.camera.position.z + _this._relativeGroundAltitude; - }) - .distinctUntilChanged(function (a1, a2) { + }), operators_1.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) { + }), 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$ - .map(function (node) { return node.latLon; }) - .publishReplay(1) - .refCount(); - var visibleBBox$ = Observable_1.Observable - .combineLatest(clampedConfiguration$, currentlatLon$) - .map(function (_a) { + })); + 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); - }) - .publishReplay(1) - .refCount(); - var visibleMarkers$ = Observable_1.Observable - .combineLatest(Observable_1.Observable - .of(this._markerSet) - .concat(this._markerSet.changed$), visibleBBox$) - .map(function (_a) { + }), 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$ - .switchMap(function () { - return visibleMarkers$ - .withLatestFrom(_this._navigator.stateService.reference$, groundAltitude$); - }) + })); + 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; @@ -26888,11 +33506,9 @@ var MarkerComponent = /** @class */ (function (_super) { markerScene.remove(id); } }); - this._markersUpdatedSubscription = geoInitiated$ - .switchMap(function () { - return _this._markerSet.updated$ - .withLatestFrom(visibleBBox$, _this._navigator.stateService.reference$, groundAltitude$); - }) + 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; @@ -26914,9 +33530,7 @@ var MarkerComponent = /** @class */ (function (_super) { } } }); - this._referenceSubscription = this._navigator.stateService.reference$ - .skip(1) - .withLatestFrom(groundAltitude$) + 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; @@ -26928,9 +33542,7 @@ var MarkerComponent = /** @class */ (function (_super) { markerScene.update(marker.id, point3d); } }); - this._adjustHeightSubscription = groundAltitude$ - .skip(1) - .withLatestFrom(this._navigator.stateService.reference$, currentlatLon$) + 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; @@ -26950,8 +33562,7 @@ var MarkerComponent = /** @class */ (function (_super) { 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) { + this._renderSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) { var scene = _this._markerScene; return { name: _this._name, @@ -26962,39 +33573,26 @@ var MarkerComponent = /** @class */ (function (_super) { 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 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; - }) - .publishReplay(1) - .refCount(); + }), operators_1.publishReplay(1), operators_1.refCount()); var draggingStarted$ = this._container.mouseService - .filtered$(this._name, this._container.mouseService.mouseDragStart$) - .map(function (event) { + .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$) - .map(function (event) { + .filtered$(this._name, this._container.mouseService.mouseDragEnd$).pipe(operators_1.map(function (event) { return false; - }); - var filteredDragging$ = 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() + })); + 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]; @@ -27004,18 +33602,11 @@ var MarkerComponent = /** @class */ (function (_super) { var markerEvent = { marker: marker, target: _this, type: eventType }; _this.fire(eventType, markerEvent); }); - var mouseDown$ = Observable_1.Observable - .merge(this._container.mouseService.mouseDown$ - .map(function (event) { return true; }), this._container.mouseService.documentMouseUp$ - .map(function (event) { return false; })) - .startWith(false); - this._mouseClaimSubscription = Observable_1.Observable - .combineLatest(this._container.mouseService.active$, hoveredMarkerId$.distinctUntilChanged(), mouseDown$, filteredDragging$) - .map(function (_a) { + 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; - }) - .distinctUntilChanged() + }), operators_1.distinctUntilChanged()) .subscribe(function (claim) { if (claim) { _this._container.mouseService.claimMouse(_this._name, 1); @@ -27027,9 +33618,7 @@ var MarkerComponent = /** @class */ (function (_super) { } }); var offset$ = this._container.mouseService - .filtered$(this._name, this._container.mouseService.mouseDragStart$) - .withLatestFrom(hoveredMarkerId$, this._container.renderService.renderCamera$) - .map(function (_a) { + .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; @@ -27037,12 +33626,9 @@ var MarkerComponent = /** @class */ (function (_super) { 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(); + }), operators_1.publishReplay(1), operators_1.refCount()); this._updateMarkerSubscription = this._container.mouseService - .filtered$(this._name, this._container.mouseService.mouseDrag$) - .withLatestFrom(offset$, this._navigator.stateService.reference$, clampedConfiguration$) + .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)) { @@ -27132,9 +33718,9 @@ exports.MarkerComponent = MarkerComponent; Component_1.ComponentService.register(MarkerComponent); exports.default = MarkerComponent; -},{"../../Component":290,"../../Geo":293,"../../Graph":294,"../../Render":296,"rxjs/Observable":29,"three":240,"when":287}],332:[function(require,module,exports){ + +},{"../../Component":291,"../../Geo":294,"../../Graph":295,"../../Render":297,"rxjs":43,"rxjs/operators":241,"three":242,"when":288}],333:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var MarkerScene = /** @class */ (function () { @@ -27255,18 +33841,17 @@ var MarkerScene = /** @class */ (function () { exports.MarkerScene = MarkerScene; exports.default = MarkerScene; -},{"three":240}],333:[function(require,module,exports){ +},{"three":242}],334:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var rbush = require("rbush"); -var Subject_1 = require("rxjs/Subject"); +var rxjs_1 = require("rxjs"); var MarkerSet = /** @class */ (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(); + this._indexChanged$ = new rxjs_1.Subject(); + this._updated$ = new rxjs_1.Subject(); } Object.defineProperty(MarkerSet.prototype, "changed$", { get: function () { @@ -27373,13 +33958,15 @@ var MarkerSet = /** @class */ (function () { exports.MarkerSet = MarkerSet; exports.default = MarkerSet; -},{"rbush":25,"rxjs/Subject":34}],334:[function(require,module,exports){ +},{"rbush":42,"rxjs":43}],335:[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; } @@ -27456,9 +34043,8 @@ var CircleMarker = /** @class */ (function (_super) { exports.CircleMarker = CircleMarker; exports.default = CircleMarker; -},{"../../../Component":290,"three":240}],335:[function(require,module,exports){ +},{"../../../Component":291,"three":242}],336:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); /** * @class Marker @@ -27483,6 +34069,11 @@ var Marker = /** @class */ (function () { configurable: true }); Object.defineProperty(Marker.prototype, "geometry", { + /** + * Get geometry. + * + * @ignore + */ get: function () { return this._geometry; }, @@ -27500,6 +34091,7 @@ var Marker = /** @class */ (function () { enumerable: true, configurable: true }); + /** @ignore */ Marker.prototype.createGeometry = function (position) { if (!!this._geometry) { return; @@ -27508,6 +34100,7 @@ var Marker = /** @class */ (function () { // update matrix world if raycasting occurs before first render this._geometry.updateMatrixWorld(true); }; + /** @ignore */ Marker.prototype.disposeGeometry = function () { if (!this._geometry) { return; @@ -27515,18 +34108,21 @@ var Marker = /** @class */ (function () { 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; @@ -27543,13 +34139,15 @@ var Marker = /** @class */ (function () { exports.Marker = Marker; exports.default = Marker; -},{}],336:[function(require,module,exports){ +},{}],337:[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; } @@ -27690,13 +34288,15 @@ var SimpleMarker = /** @class */ (function (_super) { exports.SimpleMarker = SimpleMarker; exports.default = SimpleMarker; -},{"../../../Component":290,"three":240}],337:[function(require,module,exports){ +},{"../../../Component":291,"three":242}],338:[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; } @@ -27704,7 +34304,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); +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 @@ -27716,83 +34317,69 @@ var BounceHandler = /** @class */ (function (_super) { var _this = _super.call(this, component, container, navigator) || this; _this._spatial = spatial; _this._viewportCoords = viewportCoords; - _this._basicDistanceThreshold = 1e-3; - _this._basicRotationThreshold = 5e-2; - _this._bounceCoeff = 1e-1; return _this; } BounceHandler.prototype._enable = function () { var _this = this; - var inTransition$ = this._navigator.stateService.currentState$ - .map(function (frame) { + var inTransition$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) { return frame.state.alpha < 1; - }); - this._bounceSubscription = Observable_1.Observable - .combineLatest(inTransition$, this._navigator.stateService.inTranslation$, this._container.mouseService.active$, this._container.touchService.active$) - .map(function (noForce) { + }), 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]; - }) - .distinctUntilChanged() - .switchMap(function (noForce) { + }), operators_1.distinctUntilChanged(), operators_1.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) { + 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; } - 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) { + if (render.perspective.aspect === 0 || render.perspective.aspect === Number.POSITIVE_INFINITY) { 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 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]; + } + } } - if (Math.abs(basicDistances[0] - basicDistances[2]) < distanceThreshold && - Math.abs(basicDistances[1] - basicDistances[3]) < distanceThreshold) { + if (Math.max.apply(Math, distances) < 0.01) { return; } - var coeff = _this._bounceCoeff; - if (basicDistances[1] > 0 && basicDistances[3] === 0) { - basicX = -coeff * basicDistances[1]; - } - else if (basicDistances[1] === 0 && basicDistances[3] > 0) { - basicX = coeff * basicDistances[3]; - } - else if (basicDistances[1] > 0 && basicDistances[3] > 0) { - basicX = coeff * (basicDistances[3] - basicDistances[1]) / 2; - } - if (basicDistances[0] > 0 && basicDistances[2] === 0) { - basicY = coeff * basicDistances[0]; - } - else if (basicDistances[0] === 0 && basicDistances[2] > 0) { - basicY = -coeff * basicDistances[2]; - } - else if (basicDistances[0] > 0 && basicDistances[2] > 0) { - basicY = coeff * (basicDistances[0] - basicDistances[2]) / 2; - } - var rotationThreshold = _this._basicRotationThreshold; - basicX = _this._spatial.clamp(basicX, -rotationThreshold, rotationThreshold); - basicY = _this._spatial.clamp(basicY, -rotationThreshold, rotationThreshold); - _this._navigator.stateService.rotateBasicUnbounded([basicX, basicY]); + 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 }); }); }; BounceHandler.prototype._disable = function () { this._bounceSubscription.unsubscribe(); }; - BounceHandler.prototype._getConfiguration = function (enable) { + BounceHandler.prototype._getConfiguration = function () { return {}; }; return BounceHandler; @@ -27800,12 +34387,15 @@ var BounceHandler = /** @class */ (function (_super) { exports.BounceHandler = BounceHandler; exports.default = BounceHandler; -},{"../../Component":290,"rxjs/Observable":29}],338:[function(require,module,exports){ +},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],339:[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; } @@ -27813,7 +34403,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); +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. @@ -27830,6 +34421,7 @@ var Component_1 = require("../../Component"); */ 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; @@ -27837,14 +34429,11 @@ var DoubleClickZoomHandler = /** @class */ (function (_super) { } 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) { + 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 }; - })) - .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$) + }))).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; @@ -27866,13 +34455,15 @@ var DoubleClickZoomHandler = /** @class */ (function (_super) { exports.DoubleClickZoomHandler = DoubleClickZoomHandler; exports.default = DoubleClickZoomHandler; -},{"../../Component":290,"rxjs/Observable":29}],339:[function(require,module,exports){ +},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],340:[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; } @@ -27880,8 +34471,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var THREE = require("three"); -var Observable_1 = require("rxjs/Observable"); +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. @@ -27898,100 +34489,58 @@ var Component_1 = require("../../Component"); */ 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; - _this._basicRotationThreshold = 5e-2; - _this._forceCoeff = 2e-1; return _this; } DragPanHandler.prototype._enable = function () { var _this = this; var draggingStarted$ = this._container.mouseService - .filtered$(this._component.name, this._container.mouseService.mouseDragStart$) - .map(function (event) { + .filtered$(this._component.name, this._container.mouseService.mouseDragStart$).pipe(operators_1.map(function () { return true; - }) - .share(); + }), operators_1.share()); var draggingStopped$ = this._container.mouseService - .filtered$(this._component.name, this._container.mouseService.mouseDragEnd$) - .map(function (event) { + .filtered$(this._component.name, this._container.mouseService.mouseDragEnd$).pipe(operators_1.map(function () { return false; - }) - .share(); - this._activeMouseSubscription = Observable_1.Observable - .merge(draggingStarted$, draggingStopped$) + }), operators_1.share()); + this._activeMouseSubscription = rxjs_1.merge(draggingStarted$, draggingStopped$) .subscribe(this._container.mouseService.activate$); - this._preventDefaultSubscription = Observable_1.Observable - .merge(draggingStarted$, draggingStopped$) - .switchMap(function (dragging) { + var documentMouseMove$ = rxjs_1.merge(draggingStarted$, draggingStopped$).pipe(operators_1.switchMap(function (dragging) { return dragging ? _this._container.mouseService.documentMouseMove$ : - Observable_1.Observable.empty(); - }) - .merge(this._container.touchService.touchMove$) + 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$ - .map(function (event) { + var touchMovingStarted$ = this._container.touchService.singleTouchDragStart$.pipe(operators_1.map(function () { return true; - }); - var touchMovingStopped$ = this._container.touchService.singleTouchDragEnd$ - .map(function (event) { + })); + var touchMovingStopped$ = this._container.touchService.singleTouchDragEnd$.pipe(operators_1.map(function () { return false; - }); - this._activeTouchSubscription = Observable_1.Observable - .merge(touchMovingStarted$, touchMovingStopped$) + })); + this._activeTouchSubscription = rxjs_1.merge(touchMovingStarted$, touchMovingStopped$) .subscribe(this._container.touchService.activate$); - var basicRotation$ = this._navigator.stateService.currentState$ - .map(function (frame) { + var rotation$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) { return frame.state.currentNode.fullPano || frame.state.nodesAhead < 1; - }) - .distinctUntilChanged() - .switchMap(function (enable) { + }), operators_1.distinctUntilChanged(), operators_1.switchMap(function (enable) { if (!enable) { - return Observable_1.Observable.empty(); + return rxjs_1.empty(); } - var mouseDrag$ = _this._container.mouseService - .filtered$(_this._component.name, _this._container.mouseService.mouseDragStart$) - .switchMap(function (mouseDragStart) { - return Observable_1.Observable - .of(mouseDragStart) - .concat(_this._container.mouseService - .filtered$(_this._component.name, _this._container.mouseService.mouseDrag$)) - .merge(_this._container.mouseService - .filtered$(_this._component.name, _this._container.mouseService.mouseDragEnd$) - .map(function (e) { - return null; - })) - .takeWhile(function (e) { - return !!e; - }) - .startWith(null); - }) - .pairwise() - .filter(function (pair) { - return pair[0] != null && pair[1] != null; - }); - 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) { + 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; - }) - .pairwise() - .filter(function (pair) { + }), operators_1.pairwise(), operators_1.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(); + })); + 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; @@ -28004,101 +34553,72 @@ var DragPanHandler = /** @class */ (function (_super) { .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]; - }) - .share(); - this._rotateBasicWithoutInertiaSubscription = basicRotation$ - .subscribe(function (basicRotation) { - _this._navigator.stateService.rotateBasicWithoutInertia(basicRotation); + 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._rotateBasicSubscription = basicRotation$ - .scan(function (rotationBuffer, rotation) { + this._rotateSubscription = rotation$.pipe(operators_1.scan(function (rotationBuffer, rotation) { _this._drainBuffer(rotationBuffer); rotationBuffer.push([Date.now(), rotation]); return rotationBuffer; - }, []) - .sample(Observable_1.Observable - .merge(this._container.mouseService.filtered$(this._component.name, this._container.mouseService.mouseDragEnd$), this._container.touchService.singleTouchDragEnd$)) - .map(function (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 basicRotation = [0, 0]; + var rotation = { phi: 0, theta: 0 }; for (var _i = 0, drainedBuffer_1 = drainedBuffer; _i < drainedBuffer_1.length; _i++) { - var rotation = drainedBuffer_1[_i]; - basicRotation[0] += rotation[1][0]; - basicRotation[1] += rotation[1][1]; + var bufferedRotation = drainedBuffer_1[_i]; + rotation.phi += bufferedRotation[1].phi; + rotation.theta += bufferedRotation[1].theta; } var count = drainedBuffer.length; if (count > 0) { - basicRotation[0] /= count; - basicRotation[1] /= count; + rotation.phi /= count; + rotation.theta /= count; } - return basicRotation; - }) - .subscribe(function (basicRotation) { - _this._navigator.stateService.rotateBasic(basicRotation); + 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); }); }; DragPanHandler.prototype._disable = function () { this._activeMouseSubscription.unsubscribe(); this._activeTouchSubscription.unsubscribe(); this._preventDefaultSubscription.unsubscribe(); - this._rotateBasicSubscription.unsubscribe(); - this._rotateBasicWithoutInertiaSubscription.unsubscribe(); + this._rotateSubscription.unsubscribe(); + this._rotateWithoutInertiaSubscription.unsubscribe(); this._activeMouseSubscription = null; this._activeTouchSubscription = null; this._preventDefaultSubscription = null; - this._rotateBasicSubscription = null; + this._rotateSubscription = null; }; DragPanHandler.prototype._getConfiguration = function (enable) { return { dragPan: enable }; @@ -28116,12 +34636,280 @@ var DragPanHandler = /** @class */ (function (_super) { exports.DragPanHandler = DragPanHandler; exports.default = DragPanHandler; -},{"../../Component":290,"rxjs/Observable":29,"three":240}],340:[function(require,module,exports){ +},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],341:[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; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var THREE = require("three"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); +var Component_1 = require("../../Component"); +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; + } + EarthControlHandler.prototype._enable = function () { + var _this = this; + 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(); + }); + 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); + }); + this._orbitSubscription = 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.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; + } + 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); + }); + }; + EarthControlHandler.prototype._disable = function () { + this._dollySubscription.unsubscribe(); + this._orbitSubscription.unsubscribe(); + this._preventDefaultSubscription.unsubscribe(); + this._truckSubscription.unsubscribe(); + }; + EarthControlHandler.prototype._getConfiguration = function () { + return {}; + }; + 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":291,"../../State":298,"rxjs":43,"rxjs/operators":241,"three":242}],342:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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; + } + } + } + } + } + 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; + } + if (x < maximums[3]) { + maximums[3] = x; + } + if (y > maximums[0]) { + maximums[0] = y; + } + if (y < maximums[2]) { + maximums[2] = y; + } + } + var boundary = [1, 1, -1, -1]; + var distances = []; + for (var side = 0; side < 4; side++) { + if (intersections[side]) { + distances.push(0); + continue; + } + distances.push(Math.abs(boundary[side] - maximums[side])); + } + return distances; +} +exports.viewportDistances = viewportDistances; + +},{"../../../src/Geo":294}],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); + } return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } @@ -28150,6 +34938,7 @@ var Geo_1 = require("../../Geo"); */ 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(); @@ -28157,6 +34946,7 @@ var MouseComponent = /** @class */ (function (_super) { _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; @@ -28212,6 +35002,7 @@ var MouseComponent = /** @class */ (function (_super) { MouseComponent.prototype._activate = function () { var _this = this; this._bounceHandler.enable(); + this._earthControlHandler.enable(); this._configurationSubscription = this._configuration$ .subscribe(function (configuration) { if (configuration.doubleClickZoom) { @@ -28247,6 +35038,7 @@ var MouseComponent = /** @class */ (function (_super) { this._bounceHandler.disable(); this._doubleClickZoomHandler.disable(); this._dragPanHandler.disable(); + this._earthControlHandler.disable(); this._scrollZoomHandler.disable(); this._touchZoomHandler.disable(); }; @@ -28261,12 +35053,15 @@ exports.MouseComponent = MouseComponent; Component_1.ComponentService.register(MouseComponent); exports.default = MouseComponent; -},{"../../Component":290,"../../Geo":293}],341:[function(require,module,exports){ +},{"../../Component":291,"../../Geo":294}],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; } @@ -28274,6 +35069,7 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var operators_1 = require("rxjs/operators"); var Component_1 = require("../../Component"); /** * The `ScrollZoomHandler` allows the user to zoom the viewer image by scrolling. @@ -28290,6 +35086,7 @@ var Component_1 = require("../../Component"); */ 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; @@ -28303,20 +35100,16 @@ var ScrollZoomHandler = /** @class */ (function (_super) { event.preventDefault(); }); this._zoomSubscription = this._container.mouseService - .filteredWheel$(this._component.name, this._container.mouseService.mouseWheel$) - .withLatestFrom(this._navigator.stateService.currentState$, function (w, f) { + .filteredWheel$(this._component.name, this._container.mouseService.mouseWheel$).pipe(operators_1.withLatestFrom(this._navigator.stateService.currentState$, function (w, f) { return [w, f]; - }) - .filter(function (args) { + }), operators_1.filter(function (args) { var state = args[1].state; return state.currentNode.fullPano || state.nodesAhead < 1; - }) - .map(function (args) { + }), operators_1.map(function (args) { return args[0]; - }) - .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, function (w, r, t) { + }), 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]; @@ -28352,13 +35145,15 @@ var ScrollZoomHandler = /** @class */ (function (_super) { exports.ScrollZoomHandler = ScrollZoomHandler; exports.default = ScrollZoomHandler; -},{"../../Component":290}],342:[function(require,module,exports){ +},{"../../Component":291,"rxjs/operators":241}],345:[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; } @@ -28366,7 +35161,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); +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. @@ -28383,6 +35179,7 @@ var Component_1 = require("../../Component"); */ 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; @@ -28394,27 +35191,20 @@ var TouchZoomHandler = /** @class */ (function (_super) { .subscribe(function (pinch) { pinch.originalEvent.preventDefault(); }); - var pinchStarted$ = this._container.touchService.pinchStart$ - .map(function (event) { + var pinchStarted$ = this._container.touchService.pinchStart$.pipe(operators_1.map(function (event) { return true; - }); - var pinchStopped$ = this._container.touchService.pinchEnd$ - .map(function (event) { + })); + var pinchStopped$ = this._container.touchService.pinchEnd$.pipe(operators_1.map(function (event) { return false; - }); - this._activeSubscription = Observable_1.Observable - .merge(pinchStarted$, pinchStopped$) + })); + this._activeSubscription = rxjs_1.merge(pinchStarted$, pinchStopped$) .subscribe(this._container.touchService.activate$); - this._zoomSubscription = this._container.touchService.pinch$ - .withLatestFrom(this._navigator.stateService.currentState$) - .filter(function (args) { + 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; - }) - .map(function (args) { + }), operators_1.map(function (args) { return args[0]; - }) - .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$) + }), 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; @@ -28441,7 +35231,7 @@ var TouchZoomHandler = /** @class */ (function (_super) { exports.TouchZoomHandler = TouchZoomHandler; exports.default = TouchZoomHandler; -},{"../../Component":290,"rxjs/Observable":29}],343:[function(require,module,exports){ +},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],346:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Popup_1 = require("./popup/Popup"); @@ -28449,12 +35239,15 @@ exports.Popup = Popup_1.Popup; var PopupComponent_1 = require("./PopupComponent"); exports.PopupComponent = PopupComponent_1.PopupComponent; -},{"./PopupComponent":344,"./popup/Popup":345}],344:[function(require,module,exports){ +},{"./PopupComponent":347,"./popup/Popup":348}],347:[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; } @@ -28462,8 +35255,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); -var Subject_1 = require("rxjs/Subject"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var Component_1 = require("../../Component"); var Utils_1 = require("../../Utils"); /** @@ -28497,12 +35290,13 @@ var Utils_1 = require("../../Utils"); */ 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 Subject_1.Subject(); - _this._popups$ = new Subject_1.Subject(); + _this._added$ = new rxjs_1.Subject(); + _this._popups$ = new rxjs_1.Subject(); return _this; } /** @@ -28571,8 +35365,7 @@ var PopupComponent = /** @class */ (function (_super) { 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$) + 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++) { @@ -28580,21 +35373,14 @@ var PopupComponent = /** @class */ (function (_super) { popup.update(renderCamera, size, transform); } }); - var changed$ = this._popups$ - .startWith(this._popups) - .switchMap(function (popups) { - return Observable_1.Observable - .from(popups) - .mergeMap(function (popup) { + 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$; - }); - }) - .map(function (popup) { + })); + }), operators_1.map(function (popup) { return [popup]; - }); - this._updateAddedChangedSubscription = this._added$ - .merge(changed$) - .withLatestFrom(this._container.renderService.renderCamera$, this._container.renderService.size$, this._navigator.stateService.currentTransform$) + })); + 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++) { @@ -28633,11 +35419,10 @@ exports.PopupComponent = PopupComponent; Component_1.ComponentService.register(PopupComponent); exports.default = PopupComponent; -},{"../../Component":290,"../../Utils":300,"rxjs/Observable":29,"rxjs/Subject":34}],345:[function(require,module,exports){ +},{"../../Component":291,"../../Utils":301,"rxjs":43,"rxjs/operators":241}],348:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); -var Subject_1 = require("rxjs/Subject"); +var rxjs_1 = require("rxjs"); var Geo_1 = require("../../../Geo"); var Utils_1 = require("../../../Utils"); var Viewer_1 = require("../../../Viewer"); @@ -28691,24 +35476,23 @@ var Viewer_1 = require("../../../Viewer"); var Popup = /** @class */ (function () { function Popup(options, viewportCoords, dom) { this._options = {}; - if (!!options) { - this._options.capturePointer = options.capturePointer == null ? true : options.capturePointer; - 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; - } + 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 Subject_1.Subject(); + this._notifyChanged$ = new rxjs_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. + * @ignore */ get: function () { return this._notifyChanged$; @@ -28717,10 +35501,9 @@ var Popup = /** @class */ (function () { configurable: true }); /** - * @ignore - * * @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) { @@ -28860,21 +35643,20 @@ var Popup = /** @class */ (function () { this.setDOMContent(this._dom.document.createTextNode(text)); }; /** - * @ignore - * * @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; }; /** - * @ignore - * * @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; } @@ -28921,10 +35703,10 @@ var Popup = /** @class */ (function () { } } if (pointPixel == null) { - this._container.style.visibility = "hidden"; + this._container.style.display = "none"; return; } - this._container.style.visibility = "visible"; + this._container.style.display = ""; if (!float) { var width = this._container.offsetWidth; var height = this._container.offsetHeight; @@ -28953,7 +35735,6 @@ var Popup = /** @class */ (function () { } classList.add("mapillaryjs-popup-float-" + float); this._container.style.transform = floatTranslate[float] + " translate(" + pointPixel[0] + "px," + pointPixel[1] + "px)"; - var _a; }; Popup.prototype._rectToPixel = function (rect, position, appliedPosition, renderCamera, size, transform) { if (!position) { @@ -29119,13 +35900,16 @@ var Popup = /** @class */ (function () { exports.Popup = Popup; exports.default = Popup; -},{"../../../Geo":293,"../../../Utils":300,"../../../Viewer":301,"rxjs/Subject":34}],346:[function(require,module,exports){ + +},{"../../../Geo":294,"../../../Utils":301,"../../../Viewer":302,"rxjs":43}],349:[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; } @@ -29133,8 +35917,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); -var Subject_1 = require("rxjs/Subject"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var Component_1 = require("../../Component"); var Edge_1 = require("../../Edge"); var Graph_1 = require("../../Graph"); @@ -29149,12 +35933,10 @@ var SequenceComponent = /** @class */ (function (_super) { var _this = _super.call(this, name, container, navigator) || this; _this._sequenceDOMRenderer = !!renderer ? renderer : new Component_1.SequenceDOMRenderer(container); _this._scheduler = scheduler; - _this._containerWidth$ = new Subject_1.Subject(); - _this._hoveredKeySubject$ = new Subject_1.Subject(); - _this._hoveredKey$ = _this._hoveredKeySubject$.share(); - _this._navigator.playService.playing$ - .skip(1) - .withLatestFrom(_this._configuration$) + _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); @@ -29168,9 +35950,7 @@ var SequenceComponent = /** @class */ (function (_super) { _this.stop(); } }); - _this._navigator.playService.direction$ - .skip(1) - .withLatestFrom(_this._configuration$) + _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) { @@ -29268,186 +36048,123 @@ var SequenceComponent = /** @class */ (function (_super) { 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._sequenceDOMRenderer.activate(); - var edgeStatus$ = this._navigator.stateService.currentNode$ - .switchMap(function (node) { + var edgeStatus$ = this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) { return node.sequenceEdges$; - }) - .publishReplay(1) - .refCount(); - var sequence$ = this._navigator.stateService.currentNode$ - .distinctUntilChanged(undefined, function (node) { + }), operators_1.publishReplay(1), operators_1.refCount()); + var sequence$ = this._navigator.stateService.currentNode$.pipe(operators_1.distinctUntilChanged(undefined, function (node) { return node.sequenceKey; - }) - .switchMap(function (node) { - return Observable_1.Observable - .concat(Observable_1.Observable.of(null), _this._navigator.graphService.cacheSequence$(node.sequenceKey) - .retry(3) - .catch(function (e) { + }), 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 Observable_1.Observable.of(null); - })); - }) - .startWith(null) - .publishReplay(1) - .refCount(); + 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$ - .withLatestFrom(sequence$) - .map(function (_a) { + 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; - }) - .filter(function (key) { + }), operators_1.filter(function (key) { return !!key; - }) - .distinctUntilChanged() - .publish() - .refCount(); - this._moveSubscription = Observable_1.Observable - .merge(rendererKey$.debounceTime(100, this._scheduler), rendererKey$.auditTime(400, this._scheduler)) - .distinctUntilChanged() - .switchMap(function (key) { - return _this._navigator.moveToKey$(key) - .catch(function (e) { - return Observable_1.Observable.empty(); - }); - }) + }), 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$ - .filter(function (changing) { + this._setSequenceGraphModeSubscription = this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.filter(function (changing) { return changing; - }) + })) .subscribe(function () { _this._navigator.graphService.setGraphMode(Graph_1.GraphMode.Sequence); }); - this._setSpatialGraphModeSubscription = this._sequenceDOMRenderer.changingPositionChanged$ - .filter(function (changing) { + this._setSpatialGraphModeSubscription = this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.filter(function (changing) { return !changing; - }) + })) .subscribe(function () { _this._navigator.graphService.setGraphMode(Graph_1.GraphMode.Spatial); }); - this._navigator.graphService.graphMode$ - .switchMap(function (mode) { + this._navigator.graphService.graphMode$.pipe(operators_1.switchMap(function (mode) { return mode === Graph_1.GraphMode.Spatial ? - _this._navigator.stateService.currentNode$ - .take(2) : - Observable_1.Observable.empty(); - }) - .filter(function (node) { + _this._navigator.stateService.currentNode$.pipe(operators_1.take(2)) : + rxjs_1.empty(); + }), operators_1.filter(function (node) { return !node.spatialEdges.cached; - }) - .switchMap(function (node) { - return _this._navigator.graphService.cacheNode$(node.key) - .catch(function (e) { - return Observable_1.Observable.empty(); - }); - }) + }), 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$ - .filter(function (changing) { + this._stopSubscription = this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.filter(function (changing) { return changing; - }) + })) .subscribe(function () { _this._navigator.playService.stop(); }); - this._cacheSequenceNodesSubscription = Observable_1.Observable - .combineLatest(this._navigator.graphService.graphMode$, this._sequenceDOMRenderer.changingPositionChanged$ - .startWith(false) - .distinctUntilChanged()) - .withLatestFrom(this._navigator.stateService.currentNode$) - .switchMap(function (_a) { + 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) - .retry(3) - .catch(function (error) { + _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 Observable_1.Observable.empty(); - }) : - Observable_1.Observable.empty(); - }) + return rxjs_1.empty(); + })) : + rxjs_1.empty(); + })) .subscribe(); - var position$ = sequence$ - .switchMap(function (sequence) { + var position$ = sequence$.pipe(operators_1.switchMap(function (sequence) { if (!sequence) { - return Observable_1.Observable.of({ index: null, max: null }); + return rxjs_1.of({ index: null, max: null }); } var firstCurrentKey = true; - return _this._sequenceDOMRenderer.changingPositionChanged$ - .startWith(false) - .distinctUntilChanged() - .switchMap(function (changingPosition) { - var skip = !changingPosition && firstCurrentKey ? 0 : 1; + 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$ - .map(function (node) { + _this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) { return node.key; - }) - .distinctUntilChanged() - .skip(skip); - }) - .map(function (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 }; } return { index: index, max: sequence.keys.length - 1 }; - }); - }); - this._renderSubscription = Observable_1.Observable - .combineLatest(edgeStatus$, this._configuration$, this._containerWidth$, this._sequenceDOMRenderer.changed$.startWith(this._sequenceDOMRenderer), this._navigator.playService.speed$, position$) - .map(function (_a) { + })); + })); + 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); }); - this._setDirectionSubscription = this._configuration$ - .map(function (configuration) { + this._setDirectionSubscription = this._configuration$.pipe(operators_1.map(function (configuration) { return configuration.direction; - }) - .distinctUntilChanged() + }), operators_1.distinctUntilChanged()) .subscribe(function (direction) { _this._navigator.playService.setDirection(direction); }); - this._containerWidthSubscription = this._configuration$ - .distinctUntilChanged(function (value1, value2) { + 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]; - }) - .map(function (configuration) { - return _this._sequenceDOMRenderer.getContainerWidth(_this._container.element, configuration); - }) + }))).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$ - .map(function (configuration) { + this._playingSubscription = this._configuration$.pipe(operators_1.map(function (configuration) { return configuration.playing; - }) - .distinctUntilChanged() + }), operators_1.distinctUntilChanged()) .subscribe(function (playing) { if (playing) { _this._navigator.playService.play(); @@ -29456,10 +36173,8 @@ var SequenceComponent = /** @class */ (function (_super) { _this._navigator.playService.stop(); } }); - this._hoveredKeySubscription = this._sequenceDOMRenderer.mouseEnterDirection$ - .switchMap(function (direction) { - return edgeStatus$ - .map(function (edgeStatus) { + 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) { @@ -29467,14 +36182,17 @@ var SequenceComponent = /** @class */ (function (_super) { } } return null; - }) - .takeUntil(_this._sequenceDOMRenderer.mouseLeaveDirection$) - .concat(Observable_1.Observable.of(null)); - }) - .distinctUntilChanged() + }), 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); + }); }; SequenceComponent.prototype._deactivate = function () { + this._emitHoveredKeySubscription.unsubscribe(); this._renderSubscription.unsubscribe(); this._playingSubscription.unsubscribe(); this._containerWidthSubscription.unsubscribe(); @@ -29503,23 +36221,33 @@ var SequenceComponent = /** @class */ (function (_super) { /** * Event fired when playing starts or stops. * - * @event PlayerComponent#playingchanged + * @event SequenceComponent#playingchanged * @type {boolean} Indicates whether the player is playing. */ SequenceComponent.playingchanged = "playingchanged"; + /** + * 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. + */ + SequenceComponent.hoveredkeychanged = "hoveredkeychanged"; return SequenceComponent; }(Component_1.Component)); exports.SequenceComponent = SequenceComponent; Component_1.ComponentService.register(SequenceComponent); exports.default = SequenceComponent; -},{"../../Component":290,"../../Edge":291,"../../Graph":294,"rxjs/Observable":29,"rxjs/Subject":34}],347:[function(require,module,exports){ +},{"../../Component":291,"../../Edge":292,"../../Graph":295,"rxjs":43,"rxjs/operators":241}],350:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var vd = require("virtual-dom"); -var Observable_1 = require("rxjs/Observable"); -var Subject_1 = require("rxjs/Subject"); var Component_1 = require("../../Component"); var Edge_1 = require("../../Edge"); var Error_1 = require("../../Error"); @@ -29539,12 +36267,12 @@ var SequenceDOMRenderer = /** @class */ (function () { this._changingSpeed = false; this._index = null; this._changingPosition = false; - this._mouseEnterDirection$ = new Subject_1.Subject(); - this._mouseLeaveDirection$ = new Subject_1.Subject(); - this._notifyChanged$ = new Subject_1.Subject(); - this._notifyChangingPositionChanged$ = new Subject_1.Subject(); - this._notifySpeedChanged$ = new Subject_1.Subject(); - this._notifyIndexChanged$ = new Subject_1.Subject(); + 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 () { @@ -29593,11 +36321,9 @@ var SequenceDOMRenderer = /** @class */ (function () { if (!!this._changingSubscription) { return; } - this._changingSubscription = Observable_1.Observable - .merge(this._container.mouseService.documentMouseUp$, this._container.touchService.touchEnd$ - .filter(function (touchEvent) { + 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; @@ -29628,16 +36354,14 @@ var SequenceDOMRenderer = /** @class */ (function () { var timeline = this._createTimelineControls(containerWidth, index, max); return vd.h("div.SequenceContainer", [stepper, controls, playback, timeline]); }; - SequenceDOMRenderer.prototype.getContainerWidth = function (element, configuration) { - var elementWidth = element.offsetWidth; - var elementHeight = element.offsetHeight; + SequenceDOMRenderer.prototype.getContainerWidth = function (size, configuration) { var minWidth = configuration.minWidth; var maxWidth = configuration.maxWidth; if (maxWidth < minWidth) { maxWidth = minWidth; } - var relativeWidth = (elementWidth - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth); - var relativeHeight = (elementHeight - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight); + 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); }; @@ -29947,7 +36671,7 @@ var SequenceDOMRenderer = /** @class */ (function () { exports.SequenceDOMRenderer = SequenceDOMRenderer; exports.default = SequenceDOMRenderer; -},{"../../Component":290,"../../Edge":291,"../../Error":292,"rxjs/Observable":29,"rxjs/Subject":34,"virtual-dom":246}],348:[function(require,module,exports){ +},{"../../Component":291,"../../Edge":292,"../../Error":293,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],351:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var SequenceMode; @@ -29958,9 +36682,8 @@ var SequenceMode; })(SequenceMode = exports.SequenceMode || (exports.SequenceMode = {})); exports.default = SequenceMode; -},{}],349:[function(require,module,exports){ +},{}],352:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var path = require("path"); @@ -29976,24 +36699,43 @@ var Shaders = /** @class */ (function () { 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}", }; 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 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 = texture2D(projectorTex, vec2(x, y));\n baseColor.a = opacity;\n\n gl_FragColor = baseColor;\n}", + 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}", }; 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 curtain;\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 < curtain || curtain >= 1.0) {\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}\n", + 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}", + }; + 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}", + }; + 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}", }; + 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", + }; + 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 Shaders; }()); exports.Shaders = Shaders; -},{"path":22}],350:[function(require,module,exports){ + +},{"path":39}],353:[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; } @@ -30001,8 +36743,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); -var Subject_1 = require("rxjs/Subject"); +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"); @@ -30019,7 +36761,7 @@ var Utils_1 = require("../../Utils"); * components when activating the slider component to avoid * interfering UI elements. * - * To retrive and use the marker component + * To retrive and use the slider component * * @example * ``` @@ -30034,11 +36776,12 @@ var Utils_1 = require("../../Utils"); * * viewer.activateComponent("slider"); * - * var sliderComponent = viewer.getComponent("marker"); + * var sliderComponent = viewer.getComponent("slider"); * ``` */ 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(); @@ -30046,36 +36789,31 @@ var SliderComponent = /** @class */ (function (_super) { _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 Subject_1.Subject(); - _this._glRendererCreator$ = new Subject_1.Subject(); - _this._glRendererDisposer$ = new Subject_1.Subject(); - _this._glRenderer$ = _this._glRendererOperation$ - .scan(function (glRenderer, operation) { + _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) - .filter(function (glRenderer) { + }, null), operators_1.filter(function (glRenderer) { return glRenderer != null; - }) - .distinctUntilChanged(undefined, function (glRenderer) { + }), operators_1.distinctUntilChanged(undefined, function (glRenderer) { return glRenderer.frameId; - }); - _this._glRendererCreator$ - .map(function () { + })); + _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$ - .map(function () { + _this._glRendererDisposer$.pipe(operators_1.map(function () { return function (glRenderer) { glRenderer.dispose(); return null; }; - }) + })) .subscribe(_this._glRendererOperation$); return _this; } @@ -30129,8 +36867,7 @@ var SliderComponent = /** @class */ (function (_super) { .subscribe(function (mode) { _this.setSliderMode(mode); }); - this._glRenderSubscription = this._glRenderer$ - .map(function (glRenderer) { + this._glRenderSubscription = this._glRenderer$.pipe(operators_1.map(function (glRenderer) { var renderHash = { name: _this._name, render: { @@ -30141,51 +36878,34 @@ var SliderComponent = /** @class */ (function (_super) { }, }; return renderHash; - }) + })) .subscribe(this._container.glRenderer.render$); - var position$ = this.configuration$ - .map(function (configuration) { + var position$ = rxjs_1.concat(this.configuration$.pipe(operators_1.map(function (configuration) { return configuration.initialPosition != null ? configuration.initialPosition : 1; - }) - .first() - .concat(this._domRenderer.position$); - var mode$ = this.configuration$ - .map(function (configuration) { + }), operators_1.first()), this._domRenderer.position$); + var mode$ = this.configuration$.pipe(operators_1.map(function (configuration) { return configuration.mode; - }) - .distinctUntilChanged(); - var motionless$ = this._navigator.stateService.currentState$ - .map(function (frame) { + }), operators_1.distinctUntilChanged()); + var motionless$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) { return frame.state.motionless; - }) - .distinctUntilChanged(); - var fullPano$ = this._navigator.stateService.currentState$ - .map(function (frame) { + }), operators_1.distinctUntilChanged()); + var fullPano$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) { return frame.state.currentNode.fullPano; - }) - .distinctUntilChanged(); - var sliderVisible$ = Observable_1.Observable - .combineLatest(this._configuration$ - .map(function (configuration) { + }), operators_1.distinctUntilChanged()); + var sliderVisible$ = rxjs_1.combineLatest(this._configuration$.pipe(operators_1.map(function (configuration) { return configuration.sliderVisible; - }), this._navigator.stateService.currentState$ - .map(function (frame) { + })), 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)); - }) - .distinctUntilChanged()) - .map(function (_a) { + }), operators_1.distinctUntilChanged())).pipe(operators_1.map(function (_a) { var sliderVisible = _a[0], enabledState = _a[1]; return sliderVisible && enabledState; - }) - .distinctUntilChanged(); - this._waitSubscription = Observable_1.Observable - .combineLatest(mode$, motionless$, fullPano$, sliderVisible$) - .withLatestFrom(this._navigator.stateService.state$) + }), 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 && @@ -30197,8 +36917,7 @@ var SliderComponent = /** @class */ (function (_super) { _this._navigator.stateService.wait(); } }); - this._moveSubscription = Observable_1.Observable - .combineLatest(position$, mode$, motionless$, fullPano$, sliderVisible$) + 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) { @@ -30208,20 +36927,16 @@ var SliderComponent = /** @class */ (function (_super) { _this._navigator.stateService.moveTo(position); } }); - this._domRenderSubscription = Observable_1.Observable - .combineLatest(position$, mode$, motionless$, fullPano$, sliderVisible$, this._container.renderService.size$) - .map(function (_a) { + 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 = Observable_1.Observable - .combineLatest(position$, fullPano$, sliderVisible$, this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$) - .map(function (_a) { + 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; @@ -30231,39 +36946,30 @@ var SliderComponent = /** @class */ (function (_super) { 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; - }) - .map(function (position) { + }), operators_1.map(function (position) { return function (glRenderer) { glRenderer.updateCurtain(position); return glRenderer; }; - }) + })) .subscribe(this._glRendererOperation$); - this._stateSubscription = Observable_1.Observable - .combineLatest(this._navigator.stateService.currentState$, mode$) - .map(function (_a) { + 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$ - .filter(function (configuration) { + this._setKeysSubscription = this._configuration$.pipe(operators_1.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) { + }), 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] }; - }) - .zip(_this._navigator.stateService.currentState$.first()) - .map(function (nf) { + })), _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 && @@ -30285,22 +36991,16 @@ var SliderComponent = /** @class */ (function (_super) { }, function (e) { console.error(e); }); - var previousNode$ = this._navigator.stateService.currentState$ - .map(function (frame) { + var previousNode$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) { return frame.state.previousNode; - }) - .filter(function (node) { + }), operators_1.filter(function (node) { return node != null; - }) - .distinctUntilChanged(undefined, function (node) { + }), operators_1.distinctUntilChanged(undefined, function (node) { return node.key; - }); - var textureProvider$ = this._navigator.stateService.currentState$ - .distinctUntilChanged(undefined, function (frame) { + })); + var textureProvider$ = this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) { return frame.state.currentNode.key; - }) - .withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$) - .map(function (_a) { + }), 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); @@ -30308,39 +37008,30 @@ var SliderComponent = /** @class */ (function (_super) { 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); - }) - .publishReplay(1) - .refCount(); + }), operators_1.publishReplay(1), operators_1.refCount()); this._textureProviderSubscription = textureProvider$.subscribe(function () { }); - this._setTextureProviderSubscription = textureProvider$ - .map(function (provider) { + 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$ - .switchMap(function (size) { - return Observable_1.Observable - .combineLatest(textureProvider$, Observable_1.Observable.of(size)) - .first(); - }) + 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$ - .pairwise() + this._abortTextureProviderSubscription = textureProvider$.pipe(operators_1.pairwise()) .subscribe(function (pair) { var previous = pair[0]; previous.abort(); }); - var roiTrigger$ = Observable_1.Observable - .combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.debounceTime(250)) - .map(function (_a) { + 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(), @@ -30349,104 +37040,73 @@ var SliderComponent = /** @class */ (function (_super) { size.height.valueOf(), size.width.valueOf() ]; - }) - .pairwise() - .skipWhile(function (pls) { + }), operators_1.pairwise(), operators_1.skipWhile(function (pls) { return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0; - }) - .map(function (pls) { + }), 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; - }) - .distinctUntilChanged() - .filter(function (stalled) { + }), operators_1.distinctUntilChanged(), operators_1.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 (_a) { + }), 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, ]; - }); - }) - .filter(function (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$ - .switchMap(function (provider) { + var hasTexture$ = textureProvider$.pipe(operators_1.switchMap(function (provider) { return provider.hasTexture$; - }) - .startWith(false) - .publishReplay(1) - .refCount(); + }), operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount()); this._hasTextureSubscription = hasTexture$.subscribe(function () { }); - var nodeImage$ = this._navigator.stateService.currentState$ - .filter(function (frame) { + var nodeImage$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) { return frame.state.nodesAhead === 0; - }) - .map(function (frame) { + }), operators_1.map(function (frame) { return frame.state.currentNode; - }) - .distinctUntilChanged(undefined, function (node) { + }), operators_1.distinctUntilChanged(undefined, function (node) { return node.key; - }) - .debounceTime(1000) - .withLatestFrom(hasTexture$) - .filter(function (args) { + }), operators_1.debounceTime(1000), operators_1.withLatestFrom(hasTexture$), operators_1.filter(function (args) { return !args[1]; - }) - .map(function (args) { + }), operators_1.map(function (args) { return args[0]; - }) - .filter(function (node) { + }), operators_1.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) { + }), 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 Observable_1.Observable.empty(); + return rxjs_1.empty(); } var image$ = node - .cacheImage$(Utils_1.Settings.maxImageSize) - .map(function (n) { + .cacheImage$(Utils_1.Settings.maxImageSize).pipe(operators_1.map(function (n) { return [n.image, n]; - }); - return image$ - .takeUntil(hasTexture$ - .filter(function (hasTexture) { + })); + return image$.pipe(operators_1.takeUntil(hasTexture$.pipe(operators_1.filter(function (hasTexture) { return hasTexture; - })) - .catch(function (error, caught) { + }))), operators_1.catchError(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$) + 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) { @@ -30454,23 +37114,18 @@ var SliderComponent = /** @class */ (function (_super) { } args[1].updateBackground(args[0][0]); }); - this._updateTextureImageSubscription = nodeImage$ - .map(function (imn) { + 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$ - .filter(function (frame) { + var textureProviderPrev$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) { return !!frame.state.previousNode; - }) - .distinctUntilChanged(undefined, function (frame) { + }), operators_1.distinctUntilChanged(undefined, function (frame) { return frame.state.previousNode.key; - }) - .withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$) - .map(function (_a) { + }), 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); @@ -30478,39 +37133,30 @@ var SliderComponent = /** @class */ (function (_super) { 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); - }) - .publishReplay(1) - .refCount(); + }), operators_1.publishReplay(1), operators_1.refCount()); this._textureProviderSubscriptionPrev = textureProviderPrev$.subscribe(function () { }); - this._setTextureProviderSubscriptionPrev = textureProviderPrev$ - .map(function (provider) { + 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$ - .switchMap(function (size) { - return Observable_1.Observable - .combineLatest(textureProviderPrev$, Observable_1.Observable.of(size)) - .first(); - }) + 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$ - .pairwise() + this._abortTextureProviderSubscriptionPrev = textureProviderPrev$.pipe(operators_1.pairwise()) .subscribe(function (pair) { var previous = pair[0]; previous.abort(); }); - var roiTriggerPrev$ = Observable_1.Observable - .combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.debounceTime(250)) - .map(function (_a) { + 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(), @@ -30519,43 +37165,31 @@ var SliderComponent = /** @class */ (function (_super) { size.height.valueOf(), size.width.valueOf() ]; - }) - .pairwise() - .skipWhile(function (pls) { + }), operators_1.pairwise(), operators_1.skipWhile(function (pls) { return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0; - }) - .map(function (pls) { + }), 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; - }) - .distinctUntilChanged() - .filter(function (stalled) { + }), operators_1.distinctUntilChanged(), operators_1.filter(function (stalled) { return stalled; - }) - .switchMap(function (stalled) { - return _this._container.renderService.renderCameraFrame$ - .first(); - }) - .withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$); - this._setRegionOfInterestSubscriptionPrev = textureProviderPrev$ - .switchMap(function (provider) { - return roiTriggerPrev$ - .map(function (_a) { + }), 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, ]; - }); - }) - .filter(function (args) { + })); + }), operators_1.filter(function (args) { return !args[1].disposed; - }) - .withLatestFrom(this._navigator.stateService.currentState$) + }), 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; @@ -30645,63 +37279,43 @@ var SliderComponent = /** @class */ (function (_super) { } provider.setRegionOfInterest(shiftedRoi); }); - var hasTexturePrev$ = textureProviderPrev$ - .switchMap(function (provider) { + var hasTexturePrev$ = textureProviderPrev$.pipe(operators_1.switchMap(function (provider) { return provider.hasTexture$; - }) - .startWith(false) - .publishReplay(1) - .refCount(); + }), operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount()); this._hasTextureSubscriptionPrev = hasTexturePrev$.subscribe(function () { }); - var nodeImagePrev$ = this._navigator.stateService.currentState$ - .filter(function (frame) { + var nodeImagePrev$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) { return frame.state.nodesAhead === 0 && !!frame.state.previousNode; - }) - .map(function (frame) { + }), operators_1.map(function (frame) { return frame.state.previousNode; - }) - .distinctUntilChanged(undefined, function (node) { + }), operators_1.distinctUntilChanged(undefined, function (node) { return node.key; - }) - .debounceTime(1000) - .withLatestFrom(hasTexturePrev$) - .filter(function (args) { + }), operators_1.debounceTime(1000), operators_1.withLatestFrom(hasTexturePrev$), operators_1.filter(function (args) { return !args[1]; - }) - .map(function (args) { + }), operators_1.map(function (args) { return args[0]; - }) - .filter(function (node) { + }), operators_1.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) { + }), 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 Observable_1.Observable.empty(); + return rxjs_1.empty(); } var image$ = node - .cacheImage$(Utils_1.Settings.maxImageSize) - .map(function (n) { + .cacheImage$(Utils_1.Settings.maxImageSize).pipe(operators_1.map(function (n) { return [n.image, n]; - }); - return image$ - .takeUntil(hasTexturePrev$ - .filter(function (hasTexture) { + })); + return image$.pipe(operators_1.takeUntil(hasTexturePrev$.pipe(operators_1.filter(function (hasTexture) { return hasTexture; - })) - .catch(function (error, caught) { + }))), operators_1.catchError(function (error, caught) { console.error("Failed to fetch high res image (" + node.key + ")", error); - return Observable_1.Observable.empty(); - }); - }) - .publish() - .refCount(); - this._updateBackgroundSubscriptionPrev = nodeImagePrev$ - .withLatestFrom(textureProviderPrev$) + 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) { @@ -30709,20 +37323,18 @@ var SliderComponent = /** @class */ (function (_super) { } args[1].updateBackground(args[0][0]); }); - this._updateTextureImageSubscriptionPrev = nodeImagePrev$ - .map(function (imn) { + 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$ - .first() + this._navigator.stateService.state$.pipe(operators_1.first()) .subscribe(function (state) { if (state !== State_1.State.Traversing) { _this._navigator.stateService.traverse(); @@ -30736,6 +37348,23 @@ var SliderComponent = /** @class */ (function (_super) { 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 () { @@ -30746,11 +37375,10 @@ var SliderComponent = /** @class */ (function (_super) { }; }; SliderComponent.prototype._catchCacheNode$ = function (key) { - return this._navigator.graphService.cacheNode$(key) - .catch(function (error, caught) { + return this._navigator.graphService.cacheNode$(key).pipe(operators_1.catchError(function (error, caught) { console.error("Failed to cache slider node (" + key + ")", error); - return Observable_1.Observable.empty(); - }); + return rxjs_1.empty(); + })); }; SliderComponent.prototype._getBasicCorners = function (currentAspect, previousAspect) { var offsetX; @@ -30778,20 +37406,20 @@ exports.SliderComponent = SliderComponent; Component_1.ComponentService.register(SliderComponent); exports.default = SliderComponent; -},{"../../Component":290,"../../Geo":293,"../../Render":296,"../../State":297,"../../Tiles":299,"../../Utils":300,"rxjs/Observable":29,"rxjs/Subject":34}],351:[function(require,module,exports){ + +},{"../../Component":291,"../../Geo":294,"../../Render":297,"../../State":298,"../../Tiles":300,"../../Utils":301,"rxjs":43,"rxjs/operators":241}],354:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var vd = require("virtual-dom"); -var Observable_1 = require("rxjs/Observable"); -var Subject_1 = require("rxjs/Subject"); var Component_1 = require("../../Component"); var SliderDOMRenderer = /** @class */ (function () { function SliderDOMRenderer(container) { this._container = container; this._interacting = false; - this._notifyModeChanged$ = new Subject_1.Subject(); - this._notifyPositionChanged$ = new Subject_1.Subject(); + this._notifyModeChanged$ = new rxjs_1.Subject(); + this._notifyPositionChanged$ = new rxjs_1.Subject(); this._stopInteractionSubscription = null; } Object.defineProperty(SliderDOMRenderer.prototype, "mode$", { @@ -30813,11 +37441,9 @@ var SliderDOMRenderer = /** @class */ (function () { if (!!this._stopInteractionSubscription) { return; } - this._stopInteractionSubscription = Observable_1.Observable - .merge(this._container.mouseService.documentMouseUp$, this._container.touchService.touchEnd$ - .filter(function (touchEvent) { + 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; @@ -30839,6 +37465,7 @@ var SliderDOMRenderer = /** @class */ (function () { var modeVisible = !(motionless || pano); if (modeVisible) { children.push(this._createModeButton(mode)); + children.push(this._createModeButton2d(mode)); } children.push(this._createPositionInput(position, modeVisible)); } @@ -30850,16 +37477,32 @@ var SliderDOMRenderer = /** @class */ (function () { var _this = this; var properties = { onclick: function () { - _this._notifyModeChanged$.next(mode === Component_1.SliderMode.Motion ? - Component_1.SliderMode.Stationary : - Component_1.SliderMode.Motion); + if (mode === Component_1.SliderMode.Motion) { + return; + } + _this._notifyModeChanged$.next(Component_1.SliderMode.Motion); }, }; var className = mode === Component_1.SliderMode.Stationary ? - "SliderModeButtonPressed" : + "SliderModeButtonDisabled" : "SliderModeButton"; return vd.h("div." + className, properties, [vd.h("div.SliderModeIcon", [])]); }; + 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", [])]); + }; SliderDOMRenderer.prototype._createPositionInput = function (position, modeVisible) { var _this = this; var onChange = function (e) { @@ -30881,7 +37524,7 @@ var SliderDOMRenderer = /** @class */ (function () { } }; var boundingRect = this._container.domContainer.getBoundingClientRect(); - var width = Math.max(215, Math.min(400, boundingRect.width - 105)) - 68 + (modeVisible ? 0 : 36); + 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, @@ -30905,7 +37548,7 @@ var SliderDOMRenderer = /** @class */ (function () { exports.SliderDOMRenderer = SliderDOMRenderer; exports.default = SliderDOMRenderer; -},{"../../Component":290,"rxjs/Observable":29,"rxjs/Subject":34,"virtual-dom":246}],352:[function(require,module,exports){ +},{"../../Component":291,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],355:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Component_1 = require("../../Component"); @@ -30946,263 +37589,1471 @@ var SliderGLRenderer = /** @class */ (function () { enumerable: true, configurable: true }); - SliderGLRenderer.prototype.setTextureProvider = function (key, provider) { - this._setTextureProvider(key, this._currentKey, provider, this._currentProviderDisposers, this._updateTexture.bind(this)); - }; - 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) { + SliderGLRenderer.prototype.setTextureProvider = function (key, provider) { + this._setTextureProvider(key, this._currentKey, provider, this._currentProviderDisposers, this._updateTexture.bind(this)); + }; + 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; + }; + 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; + } + }; + 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; + } + }; + 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; + } + this._currentProviderDisposers[key](); + } + for (var key in this._previousProviderDisposers) { + if (!this._previousProviderDisposers.hasOwnProperty(key)) { + continue; + } + this._previousProviderDisposers[key](); + } + this._currentProviderDisposers = {}; + this._previousProviderDisposers = {}; + }; + 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]]; + }; + 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; + if (key !== originalKey) { + return; + } + var createdSubscription = provider.textureCreated$ + .subscribe(updateTexture); + var updatedSubscription = provider.textureUpdated$ + .subscribe(function (updated) { + _this._needsRender = true; + }); + 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; + } + var plane = planes[key]; + var shaderMaterial = plane.material; + if (!!shaderMaterial.uniforms.curtain) { + shaderMaterial.uniforms.curtain.value = this._curtain; + } + } + }; + 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]; + } + } + 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); + } + } + if (currentChanged || modeChanged) { + if (this._currentKey in this._currentProviderDisposers) { + this._currentProviderDisposers[this._currentKey](); + delete this._currentProviderDisposers[this._currentKey]; + } + this._currentKey = state.currentNode.key; + var planes = {}; + if (state.currentNode.fullPano) { + planes[state.currentNode.key] = this._factory.createCurtainMesh(state.currentNode, state.currentTransform); + } + else if (state.currentNode.pano && !state.currentNode.fullPano) { + planes[state.currentNode.key] = this._factory.createMesh(state.currentNode, state.currentTransform); + } + 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); + } + } + this._scene.setImagePlanes(planes); + this._updateCurtain(); + } + }; + 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; + } + }; + 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 SliderGLRenderer; +}()); +exports.SliderGLRenderer = SliderGLRenderer; +exports.default = SliderGLRenderer; + + +},{"../../Component":291,"../../Geo":294}],356:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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; + +},{}],357:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var CameraVisualizationMode_1 = require("./CameraVisualizationMode"); +exports.CameraVisualizationMode = CameraVisualizationMode_1.CameraVisualizationMode; + +},{"./CameraVisualizationMode":356}],358:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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$ = {}; + } + SpatialDataCache.prototype.cacheClusterReconstructions$ = function (hash) { + var _this = this; + 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; + }) + .map(function (nd) { + return nd.clusterKey; + }) + .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; + } + 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); + }); + }), 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]; + }) + .filter(function (reconstruction) { + return !!reconstruction; + }) : + []; + }; + SpatialDataCache.prototype.getTile = function (hash) { + return hash in this._tiles ? this._tiles[hash] : []; + }; + 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]; + } + }; + 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; + +},{"../../Error":293,"../../Utils":301,"latlon-geohash":21,"pako":23,"rxjs":43,"rxjs/operators":241}],359:[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 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"); +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; + _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; + } + SpatialDataComponent.prototype._activate = function () { + var _this = this; + 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 if (!earth && state === State_1.default.Earth) { + _this._navigator.stateService.traverse(); + } + }); + 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; + } + _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); + } + }); + 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 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)); + })); + } + else if (_this._cache.hasTile(hash)) { + reconstructions$ = _this._cache.cacheClusterReconstructions$(hash); + } + else { + 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._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$); + }; + 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(); + } + }); + }; + SpatialDataComponent.prototype._getDefaultConfiguration = function () { + return { + cameraVisualizationMode: CameraVisualizationMode_1.default.Default, + camerasVisible: false, + connectedComponents: false, + pointsVisible: true, + positionsVisible: false, + tilesVisible: false, + }; + }; + 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.SpatialDataComponent = SpatialDataComponent; +Component_1.ComponentService.register(SpatialDataComponent); +exports.default = SpatialDataComponent; + +},{"../../Component":291,"../../Geo":294,"../../Render":297,"../../state/State":438,"../../viewer/PlayService":468,"./CameraVisualizationMode":356,"latlon-geohash":21,"rxjs":43,"rxjs/operators":241}],360:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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._needsRender; + }, + enumerable: true, + configurable: true + }); + SpatialDataScene.prototype.addClusterReconstruction = function (reconstruction, translation, hash) { + if (this.hasClusterReconstruction(reconstruction.key, hash)) { return; } - this._curtain = curtain; - this._updateCurtain(); + 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; }; - SliderGLRenderer.prototype.updateTexture = function (image, node) { - var imagePlanes = node.key === this._currentKey ? - this._scene.imagePlanes : - node.key === this._previousKey ? - this._scene.imagePlanesOld : - []; - if (imagePlanes.length === 0) { + 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; } + 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; - 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; - } }; - SliderGLRenderer.prototype.updateTextureImage = function (image, node) { - if (this._currentKey !== node.key) { + 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; - for (var _i = 0, _a = this._scene.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; - } }; - SliderGLRenderer.prototype.render = function (perspectiveCamera, renderer) { - if (!this.disabled) { - renderer.render(this._scene.sceneOld, perspectiveCamera); + 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); } - 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)) { + 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._currentProviderDisposers[key](); + this._disposeNodes(hash); } - for (var key in this._previousProviderDisposers) { - if (!this._previousProviderDisposers.hasOwnProperty(key)) { + 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._previousProviderDisposers[key](); + this._disposeTile(hash); } - this._currentProviderDisposers = {}; - this._previousProviderDisposers = {}; + this._needsRender = true; }; - SliderGLRenderer.prototype._getBasicCorners = function (currentAspect, previousAspect) { - var offsetX; - var offsetY; - if (currentAspect > previousAspect) { - offsetX = 0.5; - offsetY = 0.5 * currentAspect / previousAspect; + 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; } - else { - offsetX = 0.5 * previousAspect / currentAspect; - offsetY = 0.5; + 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]; + } + } } - return [[0.5 - offsetX, 0.5 - offsetY], [0.5 + offsetX, 0.5 + offsetY]]; - }; - 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); + return null; }; - SliderGLRenderer.prototype._setTextureProvider = function (key, originalKey, provider, providerDisposers, updateTexture) { - var _this = this; - if (key !== originalKey) { + SpatialDataScene.prototype.setCameraVisibility = function (visible) { + if (visible === this._camerasVisible) { return; } - var createdSubscription = provider.textureCreated$ - .subscribe(updateTexture); - var updatedSubscription = provider.textureUpdated$ - .subscribe(function (updated) { - _this._needsRender = true; - }); - var dispose = function () { - createdSubscription.unsubscribe(); - updatedSubscription.unsubscribe(); - provider.dispose(); - }; - if (key in providerDisposers) { - var disposeProvider = providerDisposers[key]; - disposeProvider(); - delete providerDisposers[key]; + for (var hash in this._nodes) { + if (!this._nodes.hasOwnProperty(hash)) { + continue; + } + this._nodes[hash].cameras.visible = visible; } - providerDisposers[key] = dispose; + this._camerasVisible = visible; + this._needsRender = true; }; - SliderGLRenderer.prototype._updateCurtain = function () { - for (var _i = 0, _a = this._scene.imagePlanes; _i < _a.length; _i++) { - var plane = _a[_i]; - var shaderMaterial = plane.material; - if (!!shaderMaterial.uniforms.curtain) { - shaderMaterial.uniforms.curtain.value = this._curtain; + 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; }; - 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)) { + SpatialDataScene.prototype.setPositionVisibility = function (visible) { + if (visible === this._positionsVisible) { return; } - this._setDisabled(state); + for (var hash in this._nodes) { + if (!this._nodes.hasOwnProperty(hash)) { + continue; + } + this._nodes[hash].positions.visible = visible; + } + this._positionsVisible = visible; 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]; + }; + 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; } - if (this.disabled) { - this._scene.setImagePlanesOld([]); + this._tilesVisible = visible; + this._needsRender = true; + }; + SpatialDataScene.prototype.setCameraVisualizationMode = function (mode) { + if (mode === this._cameraVisualizationMode) { + return; } - 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; + 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); } - 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); + 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.addAttribute("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.addAttribute("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 frame = new THREE.BufferGeometry(); + frame.addAttribute("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.addAttribute("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.addAttribute("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]; + }); + 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.addAttribute("position", new THREE.BufferAttribute(positions, 3)); + geometry.addAttribute("color", new THREE.BufferAttribute(colors, 3)); + var material = new THREE.PointsMaterial({ + size: 0.1, + vertexColors: THREE.VertexColors, + }); + return new THREE.Points(geometry, material); + }; + SpatialDataScene.prototype._createPosition = function (transform, originalPosition) { + var computedPosition = transform.unprojectBasic([0, 0], 0); + var vertices = [originalPosition, computedPosition]; + var geometry = new THREE.BufferGeometry(); + geometry.addAttribute("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; + }; + 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 { - 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); - } + console.warn("Object does not exist (" + child.id + ") for " + hash); } - this._scene.setImagePlanesOld([mesh]); } + tileCameras.remove(camera); } - if (currentChanged) { - if (this._currentKey in this._currentProviderDisposers) { - this._currentProviderDisposers[this._currentKey](); - delete this._currentProviderDisposers[this._currentKey]; + this._scene.remove(tileCameras); + }; + 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; } - this._currentKey = state.currentNode.key; - var imagePlane = state.currentNode.pano && !state.currentNode.fullPano ? - this._factory.createMesh(state.currentNode, state.currentTransform) : - this._factory.createCurtainMesh(state.currentNode, state.currentTransform); - this._scene.setImagePlanes([imagePlane]); - this._updateCurtain(); + 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 ""; } }; - SliderGLRenderer.prototype._updateTexture = function (texture) { - this._needsRender = true; - for (var _i = 0, _a = this._scene.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; + 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); } }; - SliderGLRenderer.prototype._updateTexturePrev = function (texture) { - this._needsRender = true; - for (var _i = 0, _a = this._scene.imagePlanesOld; _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; + 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 SliderGLRenderer; + return SpatialDataScene; }()); -exports.SliderGLRenderer = SliderGLRenderer; -exports.default = SliderGLRenderer; +exports.SpatialDataScene = SpatialDataScene; +exports.default = SpatialDataScene; -},{"../../Component":290,"../../Geo":293}],353:[function(require,module,exports){ +},{"./CameraVisualizationMode":356,"three":242}],361:[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 PointsGeometry_1 = require("./geometry/PointsGeometry"); +exports.PointsGeometry = PointsGeometry_1.PointsGeometry; 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 ExtremePointTag_1 = require("./tag/ExtremePointTag"); +exports.ExtremePointTag = ExtremePointTag_1.ExtremePointTag; var SpotTag_1 = require("./tag/SpotTag"); exports.SpotTag = SpotTag_1.SpotTag; +var TagDomain_1 = require("./tag/TagDomain"); +exports.TagDomain = TagDomain_1.TagDomain; var TagComponent_1 = require("./TagComponent"); exports.TagComponent = TagComponent_1.TagComponent; var TagMode_1 = require("./TagMode"); exports.TagMode = TagMode_1.TagMode; -},{"./TagComponent":354,"./TagMode":357,"./error/GeometryTagError":361,"./geometry/PointGeometry":363,"./geometry/PolygonGeometry":364,"./geometry/RectGeometry":365,"./tag/OutlineTag":377,"./tag/SpotTag":380}],354:[function(require,module,exports){ +},{"./TagComponent":362,"./TagMode":365,"./error/GeometryTagError":369,"./geometry/PointGeometry":371,"./geometry/PointsGeometry":372,"./geometry/PolygonGeometry":373,"./geometry/RectGeometry":374,"./tag/ExtremePointTag":388,"./tag/OutlineTag":392,"./tag/SpotTag":395,"./tag/TagDomain":397}],362:[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; } @@ -31210,8 +39061,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var when = require("when"); -var Observable_1 = require("rxjs/Observable"); var Component_1 = require("../../Component"); var Geo_1 = require("../../Geo"); var Render_1 = require("../../Render"); @@ -31255,6 +39107,7 @@ var Render_1 = require("../../Render"); */ var TagComponent = /** @class */ (function (_super) { __extends(TagComponent, _super); + /** @ignore */ function TagComponent(name, container, navigator) { var _this = _super.call(this, name, container, navigator) || this; _this._tagDomRenderer = new Component_1.TagDOMRenderer(); @@ -31264,14 +39117,14 @@ var TagComponent = /** @class */ (function (_super) { _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$ - .map(function (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. @@ -31287,52 +39140,35 @@ var TagComponent = /** @class */ (function (_super) { 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) { + }), 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$; - }); - }) - .share(); - _this._createGeometryChanged$ = _this._tagCreator.tag$ - .switchMap(function (tag) { + })); + }), operators_1.share()); + _this._createGeometryChanged$ = _this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) { return tag != null ? tag.geometryChanged$ : - Observable_1.Observable.empty(); - }) - .share(); - _this._createGLObjectsChanged$ = _this._tagCreator.tag$ - .switchMap(function (tag) { + rxjs_1.empty(); + }), operators_1.share()); + _this._createGLObjectsChanged$ = _this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) { return tag != null ? tag.glObjectsChanged$ : - Observable_1.Observable.empty(); - }) - .share(); - _this._creatingConfiguration$ = _this._configuration$ - .distinctUntilChanged(function (c1, c2) { + 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, }; - }) - .publishReplay(1) - .refCount(); + }), operators_1.publishReplay(1), operators_1.refCount()); _this._creatingConfiguration$ .subscribe(function (configuration) { _this.fire(TagComponent.modechanged, configuration.mode); @@ -31353,8 +39189,7 @@ var TagComponent = /** @class */ (function (_super) { TagComponent.prototype.add = function (tags) { var _this = this; if (this._activated) { - this._navigator.stateService.currentTransform$ - .first() + this._navigator.stateService.currentTransform$.pipe(operators_1.first()) .subscribe(function (transform) { _this._tagSet.add(tags, transform); var renderTags = tags @@ -31368,6 +39203,70 @@ var TagComponent = /** @class */ (function (_super) { this._tagSet.addDeactivated(tags); } }; + /** + * Calculate the smallest rectangle containing all the points + * in the points geometry. + * + * @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>} Promise to the rectangle + * on the format specified for the {@link RectGeometry} in basic + * coordinates. + */ + 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); + }); + }); + }; + /** + * Force the creation of a geometry programatically using its + * current vertices. + * + * @description The method only has an effect when the tag + * mode is either of the following modes: + * + * 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(); + * ``` + */ + 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. * @@ -31424,7 +39323,8 @@ var TagComponent = /** @class */ (function (_super) { * 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. + * 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. * @@ -31434,7 +39334,8 @@ var TagComponent = /** @class */ (function (_super) { * If no tag at exist the pixel point, an empty array will be returned. * * @param {Array} pixelPoint - Pixel coordinates on the viewer element. - * @returns {Array} Ids of the tags that contain the specified pixel point. + * @returns {Promise>} Promise to the ids of the tags that + * contain the specified pixel point. * * @example * ``` @@ -31445,14 +39346,12 @@ var TagComponent = /** @class */ (function (_super) { TagComponent.prototype.getTagIdsAt = function (pixelPoint) { var _this = this; return when.promise(function (resolve, reject) { - _this._container.renderService.renderCamera$ - .first() - .map(function (render) { + _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) { @@ -31503,27 +39402,20 @@ var TagComponent = /** @class */ (function (_super) { TagComponent.prototype._activate = function () { var _this = this; this._editVertexHandler.enable(); - var handlerGeometryCreated$ = Observable_1.Observable - .from(Object.keys(this._createHandlers)) - .map(function (key) { + var handlerGeometryCreated$ = rxjs_1.from(Object.keys(this._createHandlers)).pipe(operators_1.map(function (key) { return _this._createHandlers[key]; - }) - .filter(function (handler) { + }), operators_1.filter(function (handler) { return !!handler; - }) - .mergeMap(function (handler) { + }), operators_1.mergeMap(function (handler) { return handler.geometryCreated$; - }) - .share(); + }), operators_1.share()); this._fireGeometryCreatedSubscription = handlerGeometryCreated$ .subscribe(function (geometry) { _this.fire(TagComponent.geometrycreated, geometry); }); - this._fireCreateGeometryEventSubscription = this._tagCreator.tag$ - .skipWhile(function (tag) { + this._fireCreateGeometryEventSubscription = this._tagCreator.tag$.pipe(operators_1.skipWhile(function (tag) { return tag == null; - }) - .distinctUntilChanged() + }), operators_1.distinctUntilChanged()) .subscribe(function (tag) { var eventType = tag != null ? TagComponent.creategeometrystart : @@ -31544,16 +39436,14 @@ var TagComponent = /** @class */ (function (_super) { } }); this._fireTagsChangedSubscription = this._renderTags$ - .subscribe(function (tags) { + .subscribe(function () { _this.fire(TagComponent.tagschanged, _this); }); - this._stopCreateSubscription = this._tagCreator.tag$ - .switchMap(function (tag) { + this._stopCreateSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) { return tag != null ? - tag.aborted$ - .map(function (t) { return null; }) : - Observable_1.Observable.empty(); - }) + 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) { @@ -31573,29 +39463,23 @@ var TagComponent = /** @class */ (function (_super) { _this._tagScene.updateObjects(tag); }); this._updateTagSceneSubscription = this._tagChanged$ - .subscribe(function (tag) { + .subscribe(function () { _this._tagScene.update(); }); - this._domSubscription = this._renderTags$ - .startWith([]) - .do(function (tags) { + 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(), }); - }) - .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) { + })), 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(args[3], args[5], args[1], args[0].perspective, args[2]), + vnode: _this._tagDomRenderer.render(renderTags, ct, atlas, rc.perspective, size), }; - }) + })) .subscribe(this._container.domRenderer.render$); - this._glSubscription = this._navigator.stateService.currentState$ - .map(function (frame) { + this._glSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) { var tagScene = _this._tagScene; return { name: _this._name, @@ -31606,10 +39490,9 @@ var TagComponent = /** @class */ (function (_super) { stage: Render_1.GLRenderStage.Foreground, }, }; - }) + })) .subscribe(this._container.glRenderer.render$); - this._navigator.stateService.currentTransform$ - .first() + this._navigator.stateService.currentTransform$.pipe(operators_1.first()) .subscribe(function (transform) { _this._tagSet.activate(transform); _this._tagScene.add(_this._tagSet.getAll()); @@ -31638,6 +39521,7 @@ var TagComponent = /** @class */ (function (_super) { TagComponent.prototype._getDefaultConfiguration = function () { return { createColor: 0xFFFFFF, + indicatePointsCompleter: true, mode: Component_1.TagMode.Default, }; }; @@ -31732,29 +39616,43 @@ exports.TagComponent = TagComponent; Component_1.ComponentService.register(TagComponent); exports.default = TagComponent; -},{"../../Component":290,"../../Geo":293,"../../Render":296,"rxjs/Observable":29,"when":287}],355:[function(require,module,exports){ +},{"../../Component":291,"../../Geo":294,"../../Render":297,"rxjs":43,"rxjs/operators":241,"when":288}],363:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var Subject_1 = require("rxjs/Subject"); +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 Subject_1.Subject(); - this._createPolygon$ = new Subject_1.Subject(); - this._createRect$ = new Subject_1.Subject(); - this._delete$ = new Subject_1.Subject(); - this._tag$ = this._tagOperation$ - .scan(function (tag, operation) { + 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) - .share(); - this._createRect$ - .withLatestFrom(this._component.configuration$, this._navigator.stateService.currentTransform$) - .map(function (_a) { + }, 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 (tag) { + return function () { var geometry = new Component_1.RectGeometry([ coord[0], coord[1], @@ -31763,13 +39661,11 @@ var TagCreator = /** @class */ (function () { ]); return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform); }; - }) + })) .subscribe(this._tagOperation$); - this._createPolygon$ - .withLatestFrom(this._component.configuration$, this._navigator.stateService.currentTransform$) - .map(function (_a) { + 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 (tag) { + return function () { var geometry = new Component_1.PolygonGeometry([ [coord[0], coord[1]], [coord[0], coord[1]], @@ -31777,14 +39673,13 @@ var TagCreator = /** @class */ (function () { ]); return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform); }; - }) + })) .subscribe(this._tagOperation$); - this._delete$ - .map(function () { - return function (tag) { + this._delete$.pipe(operators_1.map(function () { + return function () { return null; }; - }) + })) .subscribe(this._tagOperation$); } Object.defineProperty(TagCreator.prototype, "createRect$", { @@ -31801,6 +39696,13 @@ var TagCreator = /** @class */ (function () { enumerable: true, configurable: true }); + Object.defineProperty(TagCreator.prototype, "createPoints$", { + get: function () { + return this._createPoints$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(TagCreator.prototype, "delete$", { get: function () { return this._delete$; @@ -31815,14 +39717,20 @@ var TagCreator = /** @class */ (function () { enumerable: true, configurable: true }); + Object.defineProperty(TagCreator.prototype, "replayedTag$", { + get: function () { + return this._replayedTag$; + }, + enumerable: true, + configurable: true + }); return TagCreator; }()); exports.TagCreator = TagCreator; exports.default = TagCreator; -},{"../../Component":290,"rxjs/Subject":34}],356:[function(require,module,exports){ +},{"../../Component":291,"rxjs":43,"rxjs/operators":241}],364:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var vd = require("virtual-dom"); var TagDOMRenderer = /** @class */ (function () { @@ -31846,7 +39754,7 @@ var TagDOMRenderer = /** @class */ (function () { }()); exports.TagDOMRenderer = TagDOMRenderer; -},{"virtual-dom":246}],357:[function(require,module,exports){ +},{"virtual-dom":247}],365:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -31865,25 +39773,29 @@ var TagMode; * 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"] = 2] = "CreatePolygon"; + TagMode[TagMode["CreatePolygon"] = 3] = "CreatePolygon"; /** * Create a rect geometry through clicks. */ - TagMode[TagMode["CreateRect"] = 3] = "CreateRect"; + TagMode[TagMode["CreateRect"] = 4] = "CreateRect"; /** * Create a rect geometry through drag. * * @description Claims the mouse which results in mouse handlers like * drag pan and scroll zoom becoming inactive. */ - TagMode[TagMode["CreateRectDrag"] = 4] = "CreateRectDrag"; + TagMode[TagMode["CreateRectDrag"] = 5] = "CreateRectDrag"; })(TagMode = exports.TagMode || (exports.TagMode = {})); exports.default = TagMode; -},{}],358:[function(require,module,exports){ +},{}],366:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var TagOperation; @@ -31894,9 +39806,8 @@ var TagOperation; })(TagOperation = exports.TagOperation || (exports.TagOperation = {})); exports.default = TagOperation; -},{}],359:[function(require,module,exports){ +},{}],367:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var TagScene = /** @class */ (function () { @@ -32062,17 +39973,19 @@ var TagScene = /** @class */ (function () { exports.TagScene = TagScene; exports.default = TagScene; -},{"three":240}],360:[function(require,module,exports){ +},{"three":242}],368:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var Subject_1 = require("rxjs/Subject"); +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 Subject_1.Subject(); + this._notifyChanged$ = new rxjs_1.Subject(); } Object.defineProperty(TagSet.prototype, "active", { get: function () { @@ -32128,7 +40041,9 @@ var TagSet = /** @class */ (function () { 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)) { + if (!(tag instanceof Component_1.OutlineTag || + tag instanceof Component_1.SpotTag || + tag instanceof ExtremePointTag_1.default)) { throw new Error("Tag type not supported"); } this._hashDeactivated[tag.id] = tag; @@ -32199,6 +40114,9 @@ var TagSet = /** @class */ (function () { else if (tag instanceof Component_1.SpotTag) { this._hash[tag.id] = new Component_1.SpotRenderTag(tag, transform); } + else if (tag instanceof ExtremePointTag_1.default) { + this._hash[tag.id] = new ExtremePointRenderTag_1.default(tag, transform); + } else { throw new Error("Tag type not supported"); } @@ -32213,12 +40131,15 @@ var TagSet = /** @class */ (function () { exports.TagSet = TagSet; exports.default = TagSet; -},{"../../Component":290,"rxjs/Subject":34}],361:[function(require,module,exports){ +},{"../../Component":291,"./tag/ExtremePointRenderTag":387,"./tag/ExtremePointTag":388,"rxjs":43}],369:[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; } @@ -32231,6 +40152,7 @@ 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; } @@ -32239,10 +40161,10 @@ var GeometryTagError = /** @class */ (function (_super) { exports.GeometryTagError = GeometryTagError; exports.default = Error_1.MapillaryError; -},{"../../../Error":292}],362:[function(require,module,exports){ +},{"../../../Error":293}],370:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var Subject_1 = require("rxjs/Subject"); +var rxjs_1 = require("rxjs"); /** * @class Geometry * @abstract @@ -32253,9 +40175,10 @@ var Geometry = /** @class */ (function () { * Create a geometry. * * @constructor + * @ignore */ function Geometry() { - this._notifyChanged$ = new Subject_1.Subject(); + this._notifyChanged$ = new rxjs_1.Subject(); } Object.defineProperty(Geometry.prototype, "changed$", { /** @@ -32278,12 +40201,15 @@ var Geometry = /** @class */ (function () { exports.Geometry = Geometry; exports.default = Geometry; -},{"rxjs/Subject":34}],363:[function(require,module,exports){ +},{"rxjs":43}],371:[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; } @@ -32340,6 +40266,7 @@ var PointGeometry = /** @class */ (function (_super) { * basic coordinates of the point itself. * * @returns {Array} 2D basic coordinates representing the centroid. + * @ignore */ PointGeometry.prototype.getCentroid2d = function () { return this._point.slice(); @@ -32350,6 +40277,7 @@ var PointGeometry = /** @class */ (function (_super) { * * @param {Transform} transform - The transform of the node related to the point. * @returns {Array} 3D world coordinates representing the centroid. + * @ignore */ PointGeometry.prototype.getCentroid3d = function (transform) { return transform.unprojectBasic(this._point, 200); @@ -32359,6 +40287,7 @@ var PointGeometry = /** @class */ (function (_super) { * * @param {Array} value - The new value of the centroid. * @param {Transform} transform - The transform of the node related to the point. + * @ignore */ PointGeometry.prototype.setCentroid2d = function (value, transform) { var changed = [ @@ -32372,13 +40301,232 @@ var PointGeometry = /** @class */ (function (_super) { return PointGeometry; }(Component_1.Geometry)); exports.PointGeometry = PointGeometry; +exports.default = PointGeometry; + +},{"../../../Component":291}],372:[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"); +/** + * @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); + /** + * Create a points geometry. + * + * @constructor + * @param {Array>} points - Array of 2D points on the basic coordinate + * system. The number of points must be greater than or equal to two. + * + * @throws {GeometryTagError} Point coordinates must be valid basic coordinates. + */ + 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(PointsGeometry.prototype, "points", { + /** + * Get points property. + * @returns {Array>} Array of 2d points. + */ + get: function () { + return this._points; + }, + enumerable: true, + configurable: true + }); + /** + * Add a point to the point set. + * + * @param {Array} 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); + }; + /** + * Get the coordinates of a point from the point set representation of the geometry. + * + * @param {number} index - Point index. + * @returns {Array} 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."); + } + this._points.splice(index, 1); + this._notifyChanged$.next(this); + }; + /** @ignore */ + PointsGeometry.prototype.setVertex2d = function (index, value, transform) { + this.setPoint2d(index, value, transform); + }; + /** @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); + }; + /** @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."); + } + 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 [minX, minY, maxX, maxY]; + }; + /** @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; -},{"../../../Component":290}],364:[function(require,module,exports){ +},{"../../../Component":291}],373:[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; } @@ -32396,7 +40544,7 @@ var Component_1 = require("../../../Component"); * @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 = new Mapillary.TagComponent.PolygonGeometry(basicPolygon); * ``` */ var PolygonGeometry = /** @class */ (function (_super) { @@ -32482,6 +40630,7 @@ var PolygonGeometry = /** @class */ (function (_super) { * Add a vertex to the polygon by appending it after the last vertex. * * @param {Array} vertex - Vertex to add. + * @ignore */ PolygonGeometry.prototype.addVertex2d = function (vertex) { var clamped = [ @@ -32494,11 +40643,9 @@ var PolygonGeometry = /** @class */ (function (_super) { /** * 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} Array representing the 2D basic coordinates of the vertex. + * @ignore */ PolygonGeometry.prototype.getVertex2d = function (index) { return this._polygon[index].slice(); @@ -32507,6 +40654,7 @@ var PolygonGeometry = /** @class */ (function (_super) { * Remove a vertex from the polygon. * * @param {number} index - The index of the vertex to remove. + * @ignore */ PolygonGeometry.prototype.removeVertex2d = function (index) { if (index < 0 || @@ -32525,7 +40673,7 @@ var PolygonGeometry = /** @class */ (function (_super) { } this._notifyChanged$.next(this); }; - /** @inheritdoc */ + /** @ignore */ PolygonGeometry.prototype.setVertex2d = function (index, value, transform) { var changed = [ Math.max(0, Math.min(1, value[0])), @@ -32540,7 +40688,7 @@ var PolygonGeometry = /** @class */ (function (_super) { } this._notifyChanged$.next(this); }; - /** @inheritdoc */ + /** @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]; }); @@ -32562,23 +40710,37 @@ var PolygonGeometry = /** @class */ (function (_super) { } this._notifyChanged$.next(this); }; - /** @inheritdoc */ + /** @ignore */ PolygonGeometry.prototype.getPoints3d = function (transform) { - return this.getVertices3d(transform); + return this._getPoints3d(this._subsample(this._polygon), transform); }; - /** @inheritdoc */ + /** @ignore */ PolygonGeometry.prototype.getVertex3d = function (index, transform) { return transform.unprojectBasic(this._polygon[index], 200); }; - /** @inheritdoc */ + /** @ignore */ PolygonGeometry.prototype.getVertices2d = function () { return this._polygon.slice(); }; - /** @inheritdoc */ + /** @ignore */ PolygonGeometry.prototype.getVertices3d = function (transform) { - return this._polygon - .map(function (point) { - return transform.unprojectBasic(point, 200); + return this._getPoints3d(this._polygon, transform); + }; + /** + * 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. + * + * @param {Transform} transform - The transform of the node related to the geometry. + * @returns {Array>>} 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); }); }; /** @@ -32588,20 +40750,16 @@ var PolygonGeometry = /** @class */ (function (_super) { * @param {Transform} transform - The transform of the node related to the geometry. * @returns {Array>>} Array of hole polygons in 3D world coordinates * representing the vertices of each hole of the geometry. + * @ignore */ 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; + var _this = this; + return this._holes + .map(function (hole2d) { + return _this._getPoints3d(hole2d, transform); + }); }; - /** @inheritdoc */ + /** @ignore */ PolygonGeometry.prototype.getCentroid2d = function () { var polygon = this._polygon; var area = 0; @@ -32622,35 +40780,63 @@ var PolygonGeometry = /** @class */ (function (_super) { centroidY /= 6 * area; return [centroidX, centroidY]; }; - /** @inheritdoc */ + /** @ignore */ PolygonGeometry.prototype.getCentroid3d = function (transform) { var centroid2d = this.getCentroid2d(); return transform.unprojectBasic(centroid2d, 200); }; - /** @inheritdoc */ + /** @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) { - return this._triangulate(this._polygon, this.getPoints3d(transform), this._holes, this.getHoleVertices3d(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); }; - /** @inheritdoc */ - PolygonGeometry.prototype.getPoleOfAccessibility2d = function () { + /** @ignore */ + PolygonGeometry.prototype.getPoleOfInaccessibility2d = function () { return this._getPoleOfInaccessibility2d(this._polygon.slice()); }; - /** @inheritdoc */ - PolygonGeometry.prototype.getPoleOfAccessibility3d = function (transform) { + /** @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":290}],365:[function(require,module,exports){ +},{"../../../Component":291}],374:[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; } @@ -32704,6 +40890,7 @@ var RectGeometry = /** @class */ (function (_super) { * @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; @@ -32717,6 +40904,7 @@ var RectGeometry = /** @class */ (function (_super) { * * @returns {boolean} Boolean determining whether the rect geometry is * inverted. For panoramas the rect geometrye may be inverted. + * @ignore */ get: function () { return this._inverted; @@ -32744,6 +40932,7 @@ var RectGeometry = /** @class */ (function (_super) { * * @throws {Error} If anchor indexing has already been initialized. * @throws {Error} If index is not valid (0 to 3). + * @ignore */ RectGeometry.prototype.initializeAnchorIndexing = function (index) { if (this._anchorIndex !== undefined) { @@ -32756,6 +40945,7 @@ var RectGeometry = /** @class */ (function (_super) { }; /** * Terminate anchor indexing to disable setting pposite vertex. + * @ignore */ RectGeometry.prototype.terminateAnchorIndexing = function () { this._anchorIndex = undefined; @@ -32770,6 +40960,7 @@ var RectGeometry = /** @class */ (function (_super) { * @param {Transform} transform - The transform of the node related to the rectangle. * * @throws {Error} When anchor indexing has not been initialized. + * @ignore */ RectGeometry.prototype.setOppositeVertex2d = function (opposite, transform) { if (this._anchorIndex === undefined) { @@ -32965,6 +41156,7 @@ var RectGeometry = /** @class */ (function (_super) { * @param {number} index - The index of the vertex to be set. * @param {Array} value - The new value of the vertex. * @param {Transform} transform - The transform of the node related to the rectangle. + * @ignore */ RectGeometry.prototype.setVertex2d = function (index, value, transform) { var original = this._rect.slice(); @@ -33035,7 +41227,7 @@ var RectGeometry = /** @class */ (function (_super) { this._rect[3] = rect[3]; this._notifyChanged$.next(this); }; - /** @inheritdoc */ + /** @ignore */ RectGeometry.prototype.setCentroid2d = function (value, transform) { var original = this._rect.slice(); var x0 = original[0]; @@ -33087,9 +41279,10 @@ var RectGeometry = /** @class */ (function (_super) { * the rectangle. * @returns {Array>} Polygon array of 3D world coordinates * representing the rectangle. + * @ignore */ RectGeometry.prototype.getPoints3d = function (transform) { - return this._getPoints2d(transform) + return this._getPoints2d() .map(function (point) { return transform.unprojectBasic(point, 200); }); @@ -33104,6 +41297,7 @@ var RectGeometry = /** @class */ (function (_super) { * * @param {number} index - Vertex index. * @returns {Array} Array representing the 2D basic coordinates of the vertex. + * @ignore */ RectGeometry.prototype.getVertex2d = function (index) { return this._rectToVertices2d(this._rect)[index]; @@ -33117,6 +41311,7 @@ var RectGeometry = /** @class */ (function (_super) { * * @param {number} index - Vertex index. * @returns {Array} Array representing the 2D basic coordinates of the vertex. + * @ignore */ RectGeometry.prototype.getNonAdjustedVertex2d = function (index) { return this._rectToNonAdjustedVertices2d(this._rect)[index]; @@ -33132,6 +41327,7 @@ var RectGeometry = /** @class */ (function (_super) { * @param {Transform} transform - The transform of the node related to the geometry. * @returns {Array>} Polygon array of 3D world coordinates representing * the vertices of the geometry. + * @ignore */ RectGeometry.prototype.getVertex3d = function (index, transform) { return transform.unprojectBasic(this._rectToVertices2d(this._rect)[index], 200); @@ -33144,6 +41340,7 @@ var RectGeometry = /** @class */ (function (_super) { * * @returns {Array>} Polygon array of 2D basic coordinates representing * the rectangle vertices. + * @ignore */ RectGeometry.prototype.getVertices2d = function () { return this._rectToVertices2d(this._rect); @@ -33157,6 +41354,7 @@ var RectGeometry = /** @class */ (function (_super) { * @param {Transform} transform - The transform of the node related to the rectangle. * @returns {Array>} Polygon array of 3D world coordinates representing * the rectangle vertices. + * @ignore */ RectGeometry.prototype.getVertices3d = function (transform) { return this._rectToVertices2d(this._rect) @@ -33164,7 +41362,7 @@ var RectGeometry = /** @class */ (function (_super) { return transform.unprojectBasic(vertex, 200); }); }; - /** @inheritdoc */ + /** @ignore */ RectGeometry.prototype.getCentroid2d = function () { var rect = this._rect; var x0 = rect[0]; @@ -33175,23 +41373,27 @@ var RectGeometry = /** @class */ (function (_super) { var centroidY = (y0 + y1) / 2; return [centroidX, centroidY]; }; - /** @inheritdoc */ + /** @ignore */ RectGeometry.prototype.getCentroid3d = function (transform) { var centroid2d = this.getCentroid2d(); return transform.unprojectBasic(centroid2d, 200); }; - /** @inheritdoc */ - RectGeometry.prototype.getPoleOfAccessibility2d = function () { + /** + * @ignore + */ + RectGeometry.prototype.getPoleOfInaccessibility2d = function () { return this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect)); }; - /** @inheritdoc */ - RectGeometry.prototype.getPoleOfAccessibility3d = function (transform) { + /** @ignore */ + RectGeometry.prototype.getPoleOfInaccessibility3d = function (transform) { var pole2d = this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect)); return transform.unprojectBasic(pole2d, 200); }; - /** @inheritdoc */ + /** @ignore */ RectGeometry.prototype.getTriangles3d = function (transform) { - return this._triangulate(this._rectToVertices2d(this._rect), this.getVertices3d(transform)); + return transform.fullPano ? + [] : + this._triangulate(this._project(this._getPoints2d(), transform), this.getPoints3d(transform)); }; /** * Check if a particular bottom-right value is valid according to the current @@ -33200,6 +41402,7 @@ var RectGeometry = /** @class */ (function (_super) { * @param {Array} 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; @@ -33214,12 +41417,10 @@ var RectGeometry = /** @class */ (function (_super) { * 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>} Polygon array of 2D basic coordinates * representing the rectangle. */ - RectGeometry.prototype._getPoints2d = function (transform) { + RectGeometry.prototype._getPoints2d = function () { var vertices2d = this._rectToVertices2d(this._rect); var sides = vertices2d.length - 1; var sections = 10; @@ -33291,13 +41492,15 @@ var RectGeometry = /** @class */ (function (_super) { exports.RectGeometry = RectGeometry; exports.default = RectGeometry; -},{"../../../Component":290}],366:[function(require,module,exports){ +},{"../../../Component":291}],375:[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; } @@ -33305,8 +41508,10 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var earcut = require("earcut"); +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 @@ -33319,9 +41524,12 @@ var VertexGeometry = /** @class */ (function (_super) { * Create a vertex geometry. * * @constructor + * @ignore */ function VertexGeometry() { - return _super.call(this) || this; + var _this = _super.call(this) || this; + _this._subsampleThreshold = 0.005; + return _this; } /** * Finds the polygon pole of inaccessibility, the most distant internal @@ -33335,6 +41543,32 @@ var VertexGeometry = /** @class */ (function (_super) { 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); + } + } + return subsampled; + }; /** * Triangulates a 2d polygon and returns the triangle * representation as a flattened array of 3d points. @@ -33357,8 +41591,8 @@ var VertexGeometry = /** @class */ (function (_super) { 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 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]]; @@ -33368,18 +41602,100 @@ var VertexGeometry = /** @class */ (function (_super) { } return triangles; }; + 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)); + } + } + return triangles; + }; + VertexGeometry.prototype._unproject = function (points2d, transform, distance) { + if (distance === void 0) { distance = 200; } + return points2d + .map(function (point) { + return transform.unprojectBasic(point, distance); + }); + }; + 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; + }; + 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]; + }); + }; + VertexGeometry.prototype._triangulateSubarea = function (points2d, holes2d, bbox2d, lookat2d, transform) { + var intersections = martinez.intersection([points2d].concat(holes2d), [bbox2d]); + if (!intersections) { + return []; + } + 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; + }; return VertexGeometry; }(Component_1.Geometry)); exports.VertexGeometry = VertexGeometry; exports.default = VertexGeometry; -},{"../../../Component":290,"@mapbox/polylabel":1,"earcut":8}],367:[function(require,module,exports){ +},{"../../../Component":291,"@mapbox/polylabel":1,"earcut":8,"martinez-polygon-clipping":22,"three":242}],376:[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; } @@ -33387,14 +41703,15 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Subject_1 = require("rxjs/Subject"); +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 Subject_1.Subject(); + _this._geometryCreated$ = new rxjs_1.Subject(); return _this; } Object.defineProperty(CreateHandlerBase.prototype, "geometryCreated$", { @@ -33419,24 +41736,25 @@ var CreateHandlerBase = /** @class */ (function (_super) { }; CreateHandlerBase.prototype._mouseEventToBasic$ = function (mouseEvent$) { var _this = this; - return mouseEvent$ - .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$) - .map(function (_a) { + 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":290,"rxjs/Subject":34}],368:[function(require,module,exports){ +},{"../../../Component":291,"rxjs":43,"rxjs/operators":241}],377:[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; } @@ -33444,6 +41762,7 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var operators_1 = require("rxjs/operators"); var Component_1 = require("../../../Component"); var CreatePointHandler = /** @class */ (function (_super) { __extends(CreatePointHandler, _super); @@ -33452,11 +41771,9 @@ var CreatePointHandler = /** @class */ (function (_super) { } CreatePointHandler.prototype._enableCreate = function () { this._container.mouseService.deferPixels(this._name, 4); - this._geometryCreatedSubscription = this._mouseEventToBasic$(this._container.mouseService.proximateClick$) - .filter(this._validateBasic) - .map(function (basic) { + 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 () { @@ -33471,12 +41788,58 @@ var CreatePointHandler = /** @class */ (function (_super) { exports.CreatePointHandler = CreatePointHandler; exports.default = CreatePointHandler; -},{"../../../Component":290}],369:[function(require,module,exports){ +},{"../../../Component":291,"rxjs/operators":241}],378:[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"); +var CreatePointsHandler = /** @class */ (function (_super) { + __extends(CreatePointsHandler, _super); + function CreatePointsHandler() { + return _super !== null && _super.apply(this, arguments) || this; + } + CreatePointsHandler.prototype._addPoint = function (tag, basicPoint) { + tag.geometry.addPoint2d(basicPoint); + }; + Object.defineProperty(CreatePointsHandler.prototype, "_create$", { + get: function () { + return this._tagCreator.createPoints$; + }, + enumerable: true, + configurable: true + }); + 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; + +},{"../../../Component":291}],379:[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; } @@ -33511,12 +41874,15 @@ var CreatePolygonHandler = /** @class */ (function (_super) { exports.CreatePolygonHandler = CreatePolygonHandler; exports.default = CreatePolygonHandler; -},{"../../../Component":290}],370:[function(require,module,exports){ +},{"../../../Component":291}],380:[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; } @@ -33524,7 +41890,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var Component_1 = require("../../../Component"); var CreateRectDragHandler = /** @class */ (function (_super) { __extends(CreateRectDragHandler, _super); @@ -33534,52 +41901,37 @@ var CreateRectDragHandler = /** @class */ (function (_super) { CreateRectDragHandler.prototype._enableCreate = function () { var _this = this; this._container.mouseService.claimMouse(this._name, 2); - this._deleteSubscription = this._navigator.stateService.currentTransform$ - .map(function (transform) { return null; }) - .skip(1) + 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$)) - .filter(this._validateBasic) + 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$ - .filter(function (tag) { + this._initializeAnchorIndexingSubscription = this._tagCreator.tag$.pipe(operators_1.filter(function (tag) { return !!tag; - }) + })) .subscribe(function (tag) { tag.geometry.initializeAnchorIndexing(); }); - var basicMouse$ = Observable_1.Observable - .merge(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseMove$), this._container.mouseService.filtered$(this._name, this._container.mouseService.domMouseMove$)) - .combineLatest(this._container.renderService.renderCamera$) - .withLatestFrom(this._navigator.stateService.currentTransform$) - .map(function (_a) { + 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$ - .switchMap(function (tag) { + })); + this._setVertexSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) { return !!tag ? - Observable_1.Observable - .combineLatest(Observable_1.Observable.of(tag), basicMouse$, _this._navigator.stateService.currentTransform$) : - Observable_1.Observable.empty(); - }) + 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$ - .withLatestFrom(this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseDrag$)) - .filter(this._validateBasic), function (event, basicPoint) { + 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; - }) - .share(); - this._addPointSubscription = this._tagCreator.tag$ - .switchMap(function (tag) { + }), operators_1.share()); + this._addPointSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) { return !!tag ? - Observable_1.Observable - .combineLatest(Observable_1.Observable.of(tag), basicMouseDragEnd$) : - Observable_1.Observable.empty(); - }) + 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; @@ -33588,15 +41940,13 @@ var CreateRectDragHandler = /** @class */ (function (_super) { } tag.addPoint(basicPoint); }); - this._geometryCreatedSubscription = this._tagCreator.tag$ - .switchMap(function (tag) { + this._geometryCreatedSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) { return !!tag ? - tag.created$ - .map(function (t) { + tag.created$.pipe(operators_1.map(function (t) { return t.geometry; - }) : - Observable_1.Observable.empty(); - }) + })) : + rxjs_1.empty(); + })) .subscribe(this._geometryCreated$); }; CreateRectDragHandler.prototype._disableCreate = function () { @@ -33617,12 +41967,15 @@ var CreateRectDragHandler = /** @class */ (function (_super) { exports.CreateRectDragHandler = CreateRectDragHandler; exports.default = CreateRectDragHandler; -},{"../../../Component":290,"rxjs/Observable":29}],371:[function(require,module,exports){ +},{"../../../Component":291,"rxjs":43,"rxjs/operators":241}],381:[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; } @@ -33630,6 +41983,7 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var operators_1 = require("rxjs/operators"); var Component_1 = require("../../../Component"); var CreateRectHandler = /** @class */ (function (_super) { __extends(CreateRectHandler, _super); @@ -33652,10 +42006,9 @@ var CreateRectHandler = /** @class */ (function (_super) { }; CreateRectHandler.prototype._enable = function () { _super.prototype._enable.call(this); - this._initializeAnchorIndexingSubscription = this._tagCreator.tag$ - .filter(function (tag) { + this._initializeAnchorIndexingSubscription = this._tagCreator.tag$.pipe(operators_1.filter(function (tag) { return !!tag; - }) + })) .subscribe(function (tag) { tag.geometry.initializeAnchorIndexing(); }); @@ -33675,12 +42028,15 @@ var CreateRectHandler = /** @class */ (function (_super) { exports.CreateRectHandler = CreateRectHandler; exports.default = CreateRectHandler; -},{"../../../Component":290}],372:[function(require,module,exports){ +},{"../../../Component":291,"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; } @@ -33688,7 +42044,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var Component_1 = require("../../../Component"); var CreateVertexHandler = /** @class */ (function (_super) { __extends(CreateVertexHandler, _super); @@ -33698,54 +42055,40 @@ var CreateVertexHandler = /** @class */ (function (_super) { CreateVertexHandler.prototype._enableCreate = function () { var _this = this; this._container.mouseService.deferPixels(this._name, 4); - var transformChanged$ = this._navigator.stateService.currentTransform$ - .map(function (transform) { }) - .publishReplay(1) - .refCount(); - this._deleteSubscription = transformChanged$ - .skip(1) + 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$).share(); - this._createSubscription = transformChanged$ - .switchMap(function () { - return basicClick$ - .filter(_this._validateBasic) - .take(1); - }) + 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$ - .switchMap(function (tag) { + this._setVertexSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) { return !!tag ? - Observable_1.Observable - .combineLatest(Observable_1.Observable.of(tag), Observable_1.Observable - .merge(_this._container.mouseService.mouseMove$, _this._container.mouseService.domMouseMove$), _this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$) : - Observable_1.Observable.empty(); - }) + 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$ - .switchMap(function (tag) { + this._addPointSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) { return !!tag ? - Observable_1.Observable - .combineLatest(Observable_1.Observable.of(tag), basicClick$) : - Observable_1.Observable.empty(); - }) + 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$ - .switchMap(function (tag) { + this._geometryCreateSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) { return !!tag ? - tag.created$ - .map(function (t) { + tag.created$.pipe(operators_1.map(function (t) { return t.geometry; - }) : - Observable_1.Observable.empty(); - }) + })) : + rxjs_1.empty(); + })) .subscribe(this._geometryCreated$); }; CreateVertexHandler.prototype._disableCreate = function () { @@ -33762,12 +42105,15 @@ var CreateVertexHandler = /** @class */ (function (_super) { exports.CreateVertexHandler = CreateVertexHandler; exports.default = CreateVertexHandler; -},{"../../../Component":290,"rxjs/Observable":29}],373:[function(require,module,exports){ +},{"../../../Component":291,"rxjs":43,"rxjs/operators":241}],383:[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; } @@ -33775,7 +42121,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var Component_1 = require("../../../Component"); var EditVertexHandler = /** @class */ (function (_super) { __extends(EditVertexHandler, _super); @@ -33786,42 +42133,27 @@ var EditVertexHandler = /** @class */ (function (_super) { } EditVertexHandler.prototype._enable = function () { var _this = this; - var interaction$ = this._tagSet.changed$ - .map(function (tagSet) { + var interaction$ = this._tagSet.changed$.pipe(operators_1.map(function (tagSet) { return tagSet.getAll(); - }) - .switchMap(function (tags) { - return Observable_1.Observable - .from(tags) - .mergeMap(function (tag) { + }), operators_1.switchMap(function (tags) { + return rxjs_1.from(tags).pipe(operators_1.mergeMap(function (tag) { return tag.interact$; - }); - }) - .switchMap(function (interaction) { - return Observable_1.Observable - .of(interaction) - .concat(_this._container.mouseService.documentMouseUp$ - .map(function () { + })); + }), 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 }; - }) - .first()); - }) - .share(); - var mouseMove$ = Observable_1.Observable - .merge(this._container.mouseService.mouseMove$, this._container.mouseService.domMouseMove$) - .share(); - this._claimMouseSubscription = interaction$ - .switchMap(function (interaction) { - return !!interaction.tag ? _this._container.mouseService.domMouseDragStart$ : Observable_1.Observable.empty(); - }) + }), 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$ - .map(function (interaction) { + this._cursorSubscription = interaction$.pipe(operators_1.map(function (interaction) { return interaction.cursor; - }) - .distinctUntilChanged() + }), 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++) { @@ -33837,36 +42169,27 @@ var EditVertexHandler = /** @class */ (function (_super) { .subscribe(function (e) { _this._container.mouseService.unclaimMouse(_this._name); }); - this._preventDefaultSubscription = interaction$ - .switchMap(function (interaction) { + this._preventDefaultSubscription = interaction$.pipe(operators_1.switchMap(function (interaction) { return !!interaction.tag ? _this._container.mouseService.documentMouseMove$ : - Observable_1.Observable.empty(); - }) + rxjs_1.empty(); + })) .subscribe(function (event) { event.preventDefault(); // prevent selection of content outside the viewer }); - this._updateGeometrySubscription = interaction$ - .withLatestFrom(mouseMove$) - .switchMap(function (_a) { - var interaction = _a[0], mouseMove = _a[1]; + this._updateGeometrySubscription = interaction$.pipe(operators_1.switchMap(function (interaction) { if (interaction.operation === Component_1.TagOperation.None || !interaction.tag) { - return Observable_1.Observable.empty(); + return rxjs_1.empty(); } - var mouseDrag$ = Observable_1.Observable - .of(mouseMove) - .concat(_this._container.mouseService - .filtered$(_this._name, _this._container.mouseService.domMouseDrag$) - .filter(function (event) { + 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 Observable_1.Observable - .combineLatest(mouseDrag$, _this._container.renderService.renderCamera$) - .withLatestFrom(Observable_1.Observable.of(interaction), _this._navigator.stateService.currentTransform$, function (_a, i, transform) { + 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); @@ -33877,30 +42200,324 @@ var EditVertexHandler = /** @class */ (function (_super) { else if (interaction.operation === Component_1.TagOperation.Vertex) { geometry.setVertex2d(interaction.vertexIndex, basic, transform); } - }); + }); + }; + EditVertexHandler.prototype._disable = function () { + this._claimMouseSubscription.unsubscribe(); + this._cursorSubscription.unsubscribe(); + this._preventDefaultSubscription.unsubscribe(); + this._unclaimMouseSubscription.unsubscribe(); + this._updateGeometrySubscription.unsubscribe(); + }; + EditVertexHandler.prototype._getNameExtension = function () { + return "edit-vertex"; + }; + return EditVertexHandler; +}(Component_1.TagHandlerBase)); +exports.EditVertexHandler = EditVertexHandler; +exports.default = EditVertexHandler; + + +},{"../../../Component":291,"rxjs":43,"rxjs/operators":241}],384:[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"); +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; + } + 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}],385:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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._geometry; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CreateTag.prototype, "glObjects", { + get: function () { + return this._glObjects; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CreateTag.prototype, "aborted$", { + get: function () { + return this._aborted$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CreateTag.prototype, "created$", { + get: function () { + return this._created$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CreateTag.prototype, "glObjectsChanged$", { + get: function () { + return this._glObjectsChanged$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CreateTag.prototype, "geometryChanged$", { + get: function () { + var _this = this; + return this._geometry.changed$.pipe(operators_1.map(function () { + return _this; + })); + }, + enumerable: true, + configurable: true + }); + CreateTag.prototype.dispose = function () { + this._geometryChangedSubscription.unsubscribe(); + }; + 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.addAttribute("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; + } + 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]; + } + return positions; + }; + return CreateTag; +}()); +exports.CreateTag = CreateTag; +exports.default = CreateTag; + +},{"../../../Geo":294,"rxjs":43,"rxjs/operators":241,"three":242}],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 }); +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); + }; + ExtremePointCreateTag.prototype.dispose = function () { + _super.prototype.dispose.call(this); + this._disposeObjects(); + }; + 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; }; - EditVertexHandler.prototype._disable = function () { - this._claimMouseSubscription.unsubscribe(); - this._cursorSubscription.unsubscribe(); - this._preventDefaultSubscription.unsubscribe(); - this._unclaimMouseSubscription.unsubscribe(); - this._updateGeometrySubscription.unsubscribe(); + ExtremePointCreateTag.prototype._onGeometryChanged = function () { + this._disposeObjects(); + this._rectGeometry = new Tag_1.RectGeometry(this._geometry.getRect2d(this._transform)); + this._createGlObjects(); }; - EditVertexHandler.prototype._getNameExtension = function () { - return "edit-vertex"; + 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); }; - return EditVertexHandler; -}(Component_1.TagHandlerBase)); -exports.EditVertexHandler = EditVertexHandler; -exports.default = EditVertexHandler; + ExtremePointCreateTag.prototype._disposeObjects = function () { + this._disposeLine(this._outline); + this._outline = null; + this._glObjects = null; + }; + return ExtremePointCreateTag; +}(Component_1.CreateTag)); +exports.ExtremePointCreateTag = ExtremePointCreateTag; + -},{"../../../Component":290,"rxjs/Observable":29}],374:[function(require,module,exports){ +},{"../../../Component":291,"../Tag":361,"virtual-dom":247}],387:[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; } @@ -33908,108 +42525,411 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var THREE = require("three"); +var vd = require("virtual-dom"); var Component_1 = require("../../../Component"); -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; +/** + * @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; } - TagHandlerBase.prototype._getConfiguration = function (enable) { - return {}; + ExtremePointRenderTag.prototype.dispose = function () { + _super.prototype.dispose.call(this); + this._disposeFill(); + this._disposeOutline(); }; - 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; + ExtremePointRenderTag.prototype.getDOMObjects = function (atlas, camera, size) { + var vNodes = []; + var container = { + offsetHeight: size.height, offsetWidth: size.width, + }; + if (!this._tag.editable) { + return vNodes; + } + 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; }; - return TagHandlerBase; -}(Component_1.HandlerBase)); -exports.TagHandlerBase = TagHandlerBase; -exports.default = TagHandlerBase; + 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; + } + } + else { + this._updateOutlineMaterial(); + } + return glObjectsChanged; + }; + ExtremePointRenderTag.prototype._getPoints3d = function () { + return this._rectGeometry.getPoints3d(this._transform); + }; + 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":290}],375:[function(require,module,exports){ + +},{"../../../Component":291,"three":242,"virtual-dom":247}],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); + } + 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 vd = require("virtual-dom"); -var Subject_1 = require("rxjs/Subject"); var Component_1 = require("../../../Component"); -var Geo_1 = require("../../../Geo"); -var OutlineCreateTag = /** @class */ (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); - }); +/** + * @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 ExtremePointTag = /** @class */ (function (_super) { + __extends(ExtremePointTag, _super); + /** + * 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 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; + }, + /** + * Set editable property. + * @param {boolean} + * + * @fires Tag#changed + */ + set: function (value) { + this._editable = value; + this._notifyChanged$.next(this); }, enumerable: true, 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; + }, + /** + * Set fill color property. + * @param {number} + * + * @fires Tag#changed + */ + set: function (value) { + this._fillColor = value; + this._notifyChanged$.next(this); }, enumerable: true, 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; + }, + /** + * Set fill opacity property. + * @param {number} + * + * @fires Tag#changed + */ + set: function (value) { + this._fillOpacity = value; + this._notifyChanged$.next(this); }, enumerable: true, configurable: true }); - Object.defineProperty(OutlineCreateTag.prototype, "created$", { + Object.defineProperty(ExtremePointTag.prototype, "geometry", { + /** @inheritdoc */ get: function () { - return this._created$; + return this._geometry; }, enumerable: true, 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; + }, + /** + * Set indicate vertices property. + * @param {boolean} + * + * @fires Tag#changed + */ + set: function (value) { + this._indicateVertices = value; + this._notifyChanged$.next(this); }, enumerable: true, 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; + }, + /** + * Set line color property. + * @param {number} + * + * @fires Tag#changed + */ + set: function (value) { + this._lineColor = value; + this._notifyChanged$.next(this); + }, + enumerable: true, + 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: true, + 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: true, 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}],389:[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 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; @@ -34111,60 +43031,37 @@ var OutlineCreateTag = /** @class */ (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":290,"../../../Geo":293,"rxjs/Subject":34,"three":240,"virtual-dom":246}],376:[function(require,module,exports){ + +},{"../../../Component":291,"virtual-dom":247}],390:[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; } @@ -34185,54 +43082,24 @@ var OutlineRenderTag = /** @class */ (function (_super) { 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; @@ -34245,10 +43112,10 @@ var OutlineRenderTag = /** @class */ (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) { @@ -34272,7 +43139,7 @@ var OutlineRenderTag = /** @class */ (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]); @@ -34280,7 +43147,7 @@ var OutlineRenderTag = /** @class */ (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 = { @@ -34364,24 +43231,62 @@ var OutlineRenderTag = /** @class */ (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); @@ -34390,7 +43295,101 @@ var OutlineRenderTag = /** @class */ (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}],391:[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 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.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); + }; + OutlineRenderTagBase.prototype._createLine = function (points3d) { var positions = this._getLinePositions(points3d); var geometry = new THREE.BufferGeometry(); geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3)); @@ -34401,11 +43400,10 @@ var OutlineRenderTag = /** @class */ (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; } @@ -34413,15 +43411,7 @@ var OutlineRenderTag = /** @class */ (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; } @@ -34429,7 +43419,7 @@ var OutlineRenderTag = /** @class */ (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) { @@ -34441,7 +43431,7 @@ var OutlineRenderTag = /** @class */ (function (_super) { } return positions; }; - OutlineRenderTag.prototype._interact = function (operation, cursor, vertexIndex) { + OutlineRenderTagBase.prototype._interact = function (operation, cursor, vertexIndex) { var _this = this; return function (e) { var offsetX = e.offsetX - e.target.offsetWidth / 2; @@ -34456,8 +43446,8 @@ var OutlineRenderTag = /** @class */ (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"); @@ -34471,31 +43461,7 @@ var OutlineRenderTag = /** @class */ (function (_super) { } 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); - } - }; - 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"); @@ -34503,32 +43469,24 @@ var OutlineRenderTag = /** @class */ (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":290,"three":240,"virtual-dom":246}],377:[function(require,module,exports){ + +},{"../../../Component":291,"three":242}],392:[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; } @@ -34536,7 +43494,7 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Subject_1 = require("rxjs/Subject"); +var rxjs_1 = require("rxjs"); var Component_1 = require("../../../Component"); var Viewer_1 = require("../../../Viewer"); /** @@ -34570,7 +43528,11 @@ var OutlineTag = /** @class */ (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; @@ -34582,7 +43544,7 @@ var OutlineTag = /** @class */ (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); @@ -34604,6 +43566,20 @@ var OutlineTag = /** @class */ (function (_super) { enumerable: true, 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: true, + configurable: true + }); Object.defineProperty(OutlineTag.prototype, "editable", { /** * Get editable property. @@ -34619,6 +43595,9 @@ var OutlineTag = /** @class */ (function (_super) { * @fires Tag#changed */ set: function (value) { + if (this._twoDimensionalPolygon(this._domain, this._geometry)) { + return; + } this._editable = value; this._notifyChanged$.next(this); }, @@ -34876,7 +43855,8 @@ var OutlineTag = /** @class */ (function (_super) { * @fires {Tag#changed} */ OutlineTag.prototype.setOptions = function (options) { - this._editable = options.editable == null ? this._editable : options.editable; + 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; @@ -34889,6 +43869,9 @@ var OutlineTag = /** @class */ (function (_super) { 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. * @@ -34901,19 +43884,18 @@ var OutlineTag = /** @class */ (function (_super) { exports.OutlineTag = OutlineTag; exports.default = OutlineTag; -},{"../../../Component":290,"../../../Viewer":301,"rxjs/Subject":34}],378:[function(require,module,exports){ +},{"../../../Component":291,"../../../Viewer":302,"rxjs":43}],393:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); -var Subject_1 = require("rxjs/Subject"); +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 Subject_1.Subject(); - this._interact$ = new Subject_1.Subject(); + this._glObjectsChanged$ = new rxjs_1.Subject(); + this._interact$ = new rxjs_1.Subject(); } Object.defineProperty(RenderTag.prototype, "glObjectsChanged$", { get: function () { @@ -34941,13 +43923,15 @@ var RenderTag = /** @class */ (function () { exports.RenderTag = RenderTag; exports.default = RenderTag; -},{"../../../Geo":293,"rxjs/Subject":34}],379:[function(require,module,exports){ +},{"../../../Geo":294,"rxjs":43}],394:[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; } @@ -35056,12 +44040,16 @@ var SpotRenderTag = /** @class */ (function (_super) { }(Component_1.RenderTag)); exports.SpotRenderTag = SpotRenderTag; -},{"../../../Component":290,"../../../Viewer":301,"virtual-dom":246}],380:[function(require,module,exports){ + +},{"../../../Component":291,"../../../Viewer":302,"virtual-dom":247}],395:[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; } @@ -35236,12 +44224,15 @@ var SpotTag = /** @class */ (function (_super) { exports.SpotTag = SpotTag; exports.default = SpotTag; -},{"../../../Component":290}],381:[function(require,module,exports){ +},{"../../../Component":291}],396:[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; } @@ -35249,7 +44240,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Subject_1 = require("rxjs/Subject"); +var operators_1 = require("rxjs/operators"); +var rxjs_1 = require("rxjs"); var Utils_1 = require("../../../Utils"); /** * @class Tag @@ -35269,7 +44261,7 @@ var Tag = /** @class */ (function (_super) { var _this = _super.call(this) || this; _this._id = id; _this._geometry = geometry; - _this._notifyChanged$ = new Subject_1.Subject(); + _this._notifyChanged$ = new rxjs_1.Subject(); _this._notifyChanged$ .subscribe(function (t) { _this.fire(Tag.changed, _this); @@ -35322,11 +44314,9 @@ var Tag = /** @class */ (function (_super) { */ get: function () { var _this = this; - return this._geometry.changed$ - .map(function (geometry) { + return this._geometry.changed$.pipe(operators_1.map(function (geometry) { return _this; - }) - .share(); + }), operators_1.share()); }, enumerable: true, configurable: true @@ -35351,10 +44341,73 @@ var Tag = /** @class */ (function (_super) { exports.Tag = Tag; exports.default = Tag; -},{"../../../Utils":300,"rxjs/Subject":34}],382:[function(require,module,exports){ +},{"../../../Utils":301,"rxjs":43,"rxjs/operators":241}],397:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * 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; + +},{}],398:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * 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; + +},{}],399:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var HandlerBase = /** @class */ (function () { + /** @ignore */ function HandlerBase(component, container, navigator) { this._component = component; this._container = container; @@ -35406,9 +44459,8 @@ var HandlerBase = /** @class */ (function () { exports.HandlerBase = HandlerBase; exports.default = HandlerBase; -},{}],383:[function(require,module,exports){ +},{}],400:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var Component_1 = require("../../Component"); @@ -35418,21 +44470,19 @@ var MeshFactory = /** @class */ (function () { this._imageSphereRadius = imageSphereRadius != null ? imageSphereRadius : 200; } MeshFactory.prototype.createMesh = function (node, transform) { - var mesh = node.pano ? - this._createImageSphere(node, transform) : - this._createImagePlane(node, transform); - return mesh; - }; - MeshFactory.prototype.createScaledFlatMesh = function (node, transform, dx, dy) { - var texture = this._createTexture(node.image); - var materialParameters = this._createPlaneMaterialParameters(transform, texture); - var material = new THREE.ShaderMaterial(materialParameters); - var geometry = this._getFlatImagePlaneGeo(transform, dx, dy); - return new THREE.Mesh(geometry, material); + 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._createPlaneMaterialParameters(transform, texture); + 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); @@ -35441,9 +44491,21 @@ var MeshFactory = /** @class */ (function () { if (node.pano && !node.fullPano) { throw new Error("Cropped panoramas cannot have curtain."); } - return node.pano ? - this._createSphereCurtainMesh(node, transform) : - this._createCurtainMesh(node, transform); + 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); @@ -35454,6 +44516,22 @@ var MeshFactory = /** @class */ (function () { 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); @@ -35480,6 +44558,15 @@ var MeshFactory = /** @class */ (function () { 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; @@ -35585,29 +44672,205 @@ var MeshFactory = /** @class */ (function () { side: THREE.DoubleSide, transparent: true, uniforms: { + focal: { + type: "f", + value: transform.focal, + }, + k1: { + type: "f", + value: transform.ck1, + }, + k2: { + type: "f", + value: transform.ck2, + }, opacity: { type: "f", value: 1, }, projectorMat: { type: "m4", - value: transform.projectorMatrix(), + value: transform.basicRt, }, projectorTex: { type: "t", value: texture, }, + radial_peak: { + type: "f", + value: !!transform.radialPeak ? transform.radialPeak : 0, + }, + scale_x: { + type: "f", + value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth, + }, + scale_y: { + type: "f", + 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: { + type: "f", + value: transform.focal, + }, + k1: { + type: "f", + value: transform.ck1, + }, + k2: { + type: "f", + value: transform.ck2, + }, + opacity: { + type: "f", + value: 1, + }, + projectorMat: { + type: "m4", + value: transform.basicRt, + }, + projectorTex: { + type: "t", + value: texture, + }, + radial_peak: { + type: "f", + value: !!transform.radialPeak ? transform.radialPeak : 0, + }, + scale_x: { + type: "f", + value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth, + }, + scale_y: { + type: "f", + 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: { + type: "f", + value: 1, + }, + focal: { + type: "f", + value: transform.focal, + }, + k1: { + type: "f", + value: transform.ck1, + }, + k2: { + type: "f", + value: transform.ck2, + }, + opacity: { + type: "f", + value: 1, + }, + projectorMat: { + type: "m4", + value: transform.basicRt, + }, + projectorTex: { + type: "t", + value: texture, + }, + radial_peak: { + type: "f", + value: !!transform.radialPeak ? transform.radialPeak : 0, + }, + scale_x: { + type: "f", + value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth, + }, + scale_y: { + type: "f", + 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: { + type: "f", + value: 1, + }, + focal: { + type: "f", + value: transform.focal, + }, + k1: { + type: "f", + value: transform.ck1, + }, + k2: { + type: "f", + value: transform.ck2, + }, + opacity: { + type: "f", + value: 1, + }, + projectorMat: { + type: "m4", + value: transform.basicRt, + }, + projectorTex: { + type: "t", + value: texture, + }, + radial_peak: { + type: "f", + value: !!transform.radialPeak ? transform.radialPeak : 0, + }, + scale_x: { + type: "f", + value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth, + }, + scale_y: { + type: "f", + 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: { type: "f", @@ -35626,7 +44889,31 @@ var MeshFactory = /** @class */ (function () { value: texture, }, }, - vertexShader: Component_1.Shaders.perspective.vertex, + 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: { + type: "f", + value: 1, + }, + projectorMat: { + type: "m4", + value: transform.projectorMatrix(), + }, + projectorTex: { + type: "t", + value: texture, + }, + }, + vertexShader: Component_1.Shaders.perspectiveDistorted.vertex, }; return materialParameters; }; @@ -35672,6 +44959,7 @@ var MeshFactory = /** @class */ (function () { 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; @@ -35684,6 +44972,10 @@ var MeshFactory = /** @class */ (function () { 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); @@ -35702,6 +44994,38 @@ var MeshFactory = /** @class */ (function () { 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.addAttribute("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; @@ -35730,6 +45054,22 @@ var MeshFactory = /** @class */ (function () { 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)); @@ -35763,50 +45103,118 @@ var MeshFactory = /** @class */ (function () { exports.MeshFactory = MeshFactory; exports.default = MeshFactory; -},{"../../Component":290,"three":240}],384:[function(require,module,exports){ +},{"../../Component":291,"three":242}],401:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var MeshScene = /** @class */ (function () { function MeshScene() { - this.scene = new THREE.Scene(); - this.sceneOld = new THREE.Scene(); - this.imagePlanes = []; - this.imagePlanesOld = []; + 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: true, + configurable: true + }); + Object.defineProperty(MeshScene.prototype, "planesOld", { + get: function () { + return this._planesOld; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MeshScene.prototype, "planesPeriphery", { + get: function () { + return this._planesPeriphery; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MeshScene.prototype, "scene", { + get: function () { + return this._scene; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MeshScene.prototype, "sceneOld", { + get: function () { + return this._sceneOld; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MeshScene.prototype, "scenePeriphery", { + get: function () { + return this._scenePeriphery; + }, + enumerable: true, + configurable: true + }); MeshScene.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); + 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 _b = 0, planes_1 = planes; _b < planes_1.length; _b++) { - var plane = planes_1[_b]; - this.scene.add(plane); + for (var key in planes) { + if (!planes.hasOwnProperty(key)) { + continue; + } + this._scene.add(planes[key]); } - this.imagePlanesOld = this.imagePlanes; - this.imagePlanes = planes; + this._planesOld = this._planes; + this._planes = planes; }; MeshScene.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); + for (var key in planes) { + if (!planes.hasOwnProperty(key)) { + continue; + } + var plane = planes[key]; + this._scene.add(plane); + this._planes[key] = plane; } }; MeshScene.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); + for (var key in planes) { + if (!planes.hasOwnProperty(key)) { + continue; + } + 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 plane = planes[key]; + this._scenePeriphery.add(plane); + this._planesPeriphery[key] = plane; + } + }; + MeshScene.prototype.setPeripheryPlanes = function (planes) { + this._clearPeriphery(); + this.addPeripheryPlanes(planes); + }; MeshScene.prototype.setImagePlanesOld = function (planes) { this._clearOld(); this.addImagePlanesOld(planes); @@ -35816,16 +45224,23 @@ var MeshScene = /** @class */ (function () { this._clearOld(); }; MeshScene.prototype._clear = function () { - this._dispose(this.imagePlanes, this.scene); - this.imagePlanes.length = 0; + this._dispose(this._planes, this._scene); + this._planes = {}; }; MeshScene.prototype._clearOld = function () { - this._dispose(this.imagePlanesOld, this.sceneOld); - this.imagePlanesOld.length = 0; + 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 _i = 0, planes_4 = planes; _i < planes_4.length; _i++) { - var plane = planes_4[_i]; + for (var key in planes) { + if (!planes.hasOwnProperty(key)) { + continue; + } + var plane = planes[key]; scene.remove(plane); plane.geometry.dispose(); plane.material.dispose(); @@ -35840,13 +45255,44 @@ var MeshScene = /** @class */ (function () { exports.MeshScene = MeshScene; exports.default = MeshScene; -},{"three":240}],385:[function(require,module,exports){ +},{"three":242}],402:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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}],403:[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; } @@ -35854,30 +45300,42 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var vd = require("virtual-dom"); -var Observable_1 = require("rxjs/Observable"); -var Subject_1 = require("rxjs/Subject"); var Component_1 = require("../../Component"); var Geo_1 = require("../../Geo"); var State_1 = require("../../State"); +var ComponentSize_1 = require("../utils/ComponentSize"); +/** + * @class ZoomComponent + * + * @classdesc Component rendering UI elements used for zooming. + * + * @example + * ``` + * var viewer = new Mapillary.Viewer( + * "", + * "", + * ""); + * + * var zoomComponent = viewer.getComponent("zoom"); + * zoomComponent.configure({ size: Mapillary.ComponentSize.Small }); + * ``` + */ 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 Subject_1.Subject(); + _this._zoomDelta$ = new rxjs_1.Subject(); return _this; } ZoomComponent.prototype._activate = function () { var _this = this; - this._renderSubscription = Observable_1.Observable - .combineLatest(this._navigator.stateService.currentState$, this._navigator.stateService.state$) - .map(function (_a) { - var frame = _a[0], state = _a[1]; - return [frame.state.zoom, state]; - }) - .map(function (_a) { - var zoom = _a[0], state = _a[1]; + 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]) : @@ -35886,14 +45344,16 @@ var ZoomComponent = /** @class */ (function (_super) { 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", { oncontextmenu: function (event) { event.preventDefault(); } }, [zoomInButton, zoomOutButton]), + vnode: vd.h("div.ZoomContainer" + compact, { oncontextmenu: function (event) { event.preventDefault(); } }, [zoomInButton, zoomOutButton]), }; - }) + })) .subscribe(this._container.domRenderer.render$); - this._zoomSubscription = this._zoomDelta$ - .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$) + 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); @@ -35906,7 +45366,7 @@ var ZoomComponent = /** @class */ (function (_super) { this._zoomSubscription.unsubscribe(); }; ZoomComponent.prototype._getDefaultConfiguration = function () { - return {}; + return { size: ComponentSize_1.default.Automatic }; }; ZoomComponent.componentName = "zoom"; return ZoomComponent; @@ -35915,12 +45375,15 @@ exports.ZoomComponent = ZoomComponent; Component_1.ComponentService.register(ZoomComponent); exports.default = ZoomComponent; -},{"../../Component":290,"../../Geo":293,"../../State":297,"rxjs/Observable":29,"rxjs/Subject":34,"virtual-dom":246}],386:[function(require,module,exports){ +},{"../../Component":291,"../../Geo":294,"../../State":298,"../utils/ComponentSize":398,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],404:[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; } @@ -35948,12 +45411,15 @@ var AbortMapillaryError = /** @class */ (function (_super) { exports.AbortMapillaryError = AbortMapillaryError; exports.default = AbortMapillaryError; -},{"./MapillaryError":389}],387:[function(require,module,exports){ +},{"./MapillaryError":407}],405:[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; } @@ -35975,12 +45441,15 @@ var ArgumentMapillaryError = /** @class */ (function (_super) { exports.ArgumentMapillaryError = ArgumentMapillaryError; exports.default = ArgumentMapillaryError; -},{"./MapillaryError":389}],388:[function(require,module,exports){ +},{"./MapillaryError":407}],406:[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; } @@ -36002,12 +45471,15 @@ var GraphMapillaryError = /** @class */ (function (_super) { exports.GraphMapillaryError = GraphMapillaryError; exports.default = GraphMapillaryError; -},{"./MapillaryError":389}],389:[function(require,module,exports){ +},{"./MapillaryError":407}],407:[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; } @@ -36028,9 +45500,8 @@ var MapillaryError = /** @class */ (function (_super) { exports.MapillaryError = MapillaryError; exports.default = MapillaryError; -},{}],390:[function(require,module,exports){ +},{}],408:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); /** @@ -36178,7 +45649,50 @@ var Camera = /** @class */ (function () { }()); exports.Camera = Camera; -},{"three":240}],391:[function(require,module,exports){ +},{"three":242}],409:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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}],410:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -36402,9 +45916,81 @@ var GeoCoords = /** @class */ (function () { exports.GeoCoords = GeoCoords; exports.default = GeoCoords; -},{}],392:[function(require,module,exports){ +},{}],411:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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; + +},{}],412:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); /** @@ -36606,6 +46192,13 @@ var Spatial = /** @class */ (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 @@ -36632,9 +46225,8 @@ var Spatial = /** @class */ (function () { exports.Spatial = Spatial; exports.default = Spatial; -},{"three":240}],393:[function(require,module,exports){ +},{"three":242}],413:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); /** @@ -36656,7 +46248,7 @@ var Transform = /** @class */ (function () { * @param {Array} 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) { + 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; @@ -36673,8 +46265,38 @@ var Transform = /** @class */ (function () { 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: true, + configurable: true + }); + Object.defineProperty(Transform.prototype, "ck2", { + get: function () { + return this._ck2; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Transform.prototype, "cameraProjection", { + get: function () { + return this._cameraProjection; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(Transform.prototype, "basicAspect", { /** * Get basic aspect. @@ -36702,6 +46324,13 @@ var Transform = /** @class */ (function () { enumerable: true, configurable: true }); + Object.defineProperty(Transform.prototype, "basicRt", { + get: function () { + return this._basicRt; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(Transform.prototype, "basicWidth", { /** * Get basic width. @@ -36827,6 +46456,18 @@ var Transform = /** @class */ (function () { enumerable: true, 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: true, + configurable: true + }); Object.defineProperty(Transform.prototype, "width", { /** * Get width. @@ -36891,12 +46532,15 @@ var Transform = /** @class */ (function () { * Unproject basic coordinates to 3D world coordinates. * * @param {Array} basic - 2D basic coordinates. - * @param {Array} distance - Depth to unproject from camera center. + * @param {Array} 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} 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. @@ -36913,12 +46557,17 @@ var Transform = /** @class */ (function () { * Unproject SfM coordinates to a 3D world coordinates. * * @param {Array} sfm - 2D SfM coordinates. - * @param {Array} distance - Depth to unproject from camera center. + * @param {Array} 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} 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]; }; @@ -36952,12 +46601,45 @@ var Transform = /** @class */ (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. @@ -36991,11 +46673,37 @@ var Transform = /** @class */ (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 { @@ -37140,6 +46848,44 @@ var Transform = /** @class */ (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. @@ -37170,9 +46916,8 @@ var Transform = /** @class */ (function () { }()); exports.Transform = Transform; -},{"three":240}],394:[function(require,module,exports){ +},{"three":242}],414:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); /** @@ -37235,13 +46980,11 @@ var ViewportCoords = /** @class */ (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; }; /** @@ -37261,6 +47004,28 @@ var ViewportCoords = /** @class */ (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} 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. * @@ -37455,6 +47220,24 @@ var ViewportCoords = /** @class */ (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} point3D - 3D world coordinates. + * @param {HTMLElement} container - The viewer container. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} 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. * @@ -37544,7 +47327,8 @@ var ViewportCoords = /** @class */ (function () { exports.ViewportCoords = ViewportCoords; exports.default = ViewportCoords; -},{"three":240}],395:[function(require,module,exports){ + +},{"three":242}],415:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -37632,13 +47416,12 @@ var FilterCreator = /** @class */ (function () { exports.FilterCreator = FilterCreator; exports.default = FilterCreator; -},{}],396:[function(require,module,exports){ +},{}],416:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var rbush = require("rbush"); -var Observable_1 = require("rxjs/Observable"); -var Subject_1 = require("rxjs/Subject"); var Edge_1 = require("../Edge"); var Error_1 = require("../Error"); var Graph_1 = require("../Graph"); @@ -37671,7 +47454,7 @@ var Graph = /** @class */ (function () { 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(); @@ -37732,13 +47515,9 @@ var Graph = /** @class */ (function () { _this._cacheTile$(h); }); if (cacheTiles$.length === 0) { - cacheTiles$.push(Observable_1.Observable.of(this)); + cacheTiles$.push(rxjs_1.of(this)); } - return Observable_1.Observable - .from(cacheTiles$) - .mergeAll() - .last() - .mergeMap(function (graph) { + 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, @@ -37765,11 +47544,10 @@ var Graph = /** @class */ (function () { while (coreNodes.length > 0) { coreNodeBatches.push(coreNodes.splice(0, batchSize)); } - var fullNodes$ = Observable_1.Observable.of(fullNodes); + var fullNodes$ = rxjs_1.of(fullNodes); var fillNodes$ = coreNodeBatches .map(function (batch) { - return _this._apiV3.imageByKeyFill$(batch) - .map(function (imageByKeyFill) { + return _this._apiV3.imageByKeyFill$(batch).pipe(operators_1.map(function (imageByKeyFill) { var filledNodes = []; for (var fillKey in imageByKeyFill) { if (!imageByKeyFill.hasOwnProperty(fillKey)) { @@ -37784,16 +47562,12 @@ var Graph = /** @class */ (function () { } } return filledNodes; - }); + })); }); - return Observable_1.Observable - .merge(fullNodes$, Observable_1.Observable - .from(fillNodes$) - .mergeAll()); - }) - .reduce(function (acc, value) { + 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. @@ -37819,24 +47593,19 @@ var Graph = /** @class */ (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]; }; /** @@ -37856,8 +47625,7 @@ var Graph = /** @class */ (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); @@ -37876,18 +47644,14 @@ var Graph = /** @class */ (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]; }; /** @@ -37974,11 +47738,8 @@ var Graph = /** @class */ (function () { batches.push(keys.splice(0, batchSize)); } var batchesToCache = batches.length; - var sequenceNodes$ = Observable_1.Observable - .from(batches) - .mergeMap(function (batch) { - return _this._apiV3.imageByKeyFull$(batch) - .do(function (imageByKeyFull) { + 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; @@ -38002,20 +47763,15 @@ var Graph = /** @class */ (function () { } } batchesToCache--; - }) - .map(function (imageByKeyFull) { + }), operators_1.map(function (imageByKeyFull) { return _this; - }); - }, 6) - .last() - .finally(function () { + })); + }, 6), operators_1.last(), operators_1.finalize(function () { delete _this._cachingSequenceNodes$[sequence.key]; if (batchesToCache === 0) { _this._cachedSequenceNodes[sequence.key] = true; } - }) - .publish() - .refCount(); + }), operators_1.publish(), operators_1.refCount()); this._cachingSequenceNodes$[sequence.key] = sequenceNodes$; return sequenceNodes$; }; @@ -38053,8 +47809,7 @@ var Graph = /** @class */ (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; @@ -38071,11 +47826,9 @@ var Graph = /** @class */ (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) { @@ -38089,14 +47842,11 @@ var Graph = /** @class */ (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; @@ -38188,8 +47938,7 @@ var Graph = /** @class */ (function () { var cacheTile$ = h in this_2._cachingTiles$ ? this_2._cachingTiles$[h] : this_2._cacheTile$(h); - cacheTiles$.push(cacheTile$ - .do(function (graph) { + cacheTiles$.push(cacheTile$.pipe(operators_1.tap(function (graph) { var index = nodeTiles.caching.indexOf(h); if (index > -1) { nodeTiles.caching.splice(index, 1); @@ -38199,8 +47948,7 @@ var Graph = /** @class */ (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); @@ -38211,12 +47959,9 @@ var Graph = /** @class */ (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++) { @@ -38701,8 +48446,7 @@ var Graph = /** @class */ (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(), @@ -38710,24 +48454,19 @@ var Graph = /** @class */ (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]) - .do(function (imagesByH) { + this._cachingTiles$[h] = this._apiV3.imagesByH$([h]).pipe(operators_1.tap(function (imagesByH) { var coreNodes = imagesByH[h]; if (h in _this._cachedTiles) { return; @@ -38775,16 +48514,12 @@ var Graph = /** @class */ (function () { _this._setNode(node); } delete _this._cachingTiles$[h]; - }) - .map(function (imagesByH) { + }), operators_1.map(function (imagesByH) { return _this; - }) - .catch(function (error) { + }), operators_1.catchError(function (error) { delete _this._cachingTiles$[h]; throw error; - }) - .publish() - .refCount(); + }), operators_1.publish(), operators_1.refCount()); return this._cachingTiles$[h]; }; Graph.prototype._makeFull = function (node, fillNode) { @@ -38892,27 +48627,13 @@ var Graph = /** @class */ (function () { exports.Graph = Graph; exports.default = Graph; -},{"../Edge":291,"../Error":292,"../Graph":294,"rbush":25,"rxjs/Observable":29,"rxjs/Subject":34}],397:[function(require,module,exports){ +},{"../Edge":292,"../Error":293,"../Graph":295,"rbush":42,"rxjs":43,"rxjs/operators":241}],417:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var geohash = require("latlon-geohash"); var THREE = require("three"); var Error_1 = require("../Error"); var Geo_1 = require("../Geo"); -var GeoHashDirections = /** @class */ (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 * @@ -38970,28 +48691,28 @@ var GraphCalculator = /** @class */ (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; }; @@ -39081,7 +48802,7 @@ var GraphCalculator = /** @class */ (function () { exports.GraphCalculator = GraphCalculator; exports.default = GraphCalculator; -},{"../Error":292,"../Geo":293,"latlon-geohash":21,"three":240}],398:[function(require,module,exports){ +},{"../Error":293,"../Geo":294,"latlon-geohash":21,"three":242}],418:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -39113,11 +48834,11 @@ var GraphMode; })(GraphMode = exports.GraphMode || (exports.GraphMode = {})); exports.default = GraphMode; -},{}],399:[function(require,module,exports){ +},{}],419:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); -var Subject_1 = require("rxjs/Subject"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var Graph_1 = require("../Graph"); /** * @class GraphService @@ -39131,18 +48852,11 @@ var GraphService = /** @class */ (function () { * @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 Subject_1.Subject(); - this._graphMode$ = this._graphModeSubject$ - .startWith(this._graphMode) - .publishReplay(1) - .refCount(); + 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$ = []; @@ -39181,11 +48895,9 @@ var GraphService = /** @class */ (function () { * @throws {Error} Propagates any IO node caching errors to the caller. */ GraphService.prototype.cacheBoundingBox$ = function (sw, ne) { - return this._graph$ - .first() - .mergeMap(function (graph) { + 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. @@ -39207,50 +48919,40 @@ var GraphService = /** @class */ (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(); @@ -39260,27 +48962,22 @@ var GraphService = /** @class */ (function () { if (!initializeCacheSubscription.closed) { this._initializeCacheSubscriptions.push(initializeCacheSubscription); } - var graphSequence$ = 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); - }) - .publishReplay(1) - .refCount(); - var sequenceSubscription = graphSequence$ - .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); }); @@ -39288,59 +48985,45 @@ var GraphService = /** @class */ (function () { this._sequenceSubscriptions.push(sequenceSubscription); } if (this._graphMode === Graph_1.GraphMode.Spatial) { - var spatialSubscription_1 = firstGraph$ - .expand(function (graph) { + var spatialSubscription_1 = firstGraph$.pipe(operators_1.expand(function (graph) { if (graph.hasTiles(key)) { - return Observable_1.Observable.empty(); + return rxjs_1.empty(); } - return Observable_1.Observable - .from(graph.cacheTiles$(key)) - .mergeMap(function (graph$) { - return graph$ - .mergeMap(function (g) { + 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 Observable_1.Observable.empty(); + return rxjs_1.empty(); } - return Observable_1.Observable.of(g); - }) - .catch(function (error, caught$) { + return rxjs_1.of(g); + }), operators_1.catchError(function (error, caught$) { console.error("Failed to cache tile data (" + key + ").", error); - return Observable_1.Observable.empty(); - }); - }); - }) - .last() - .mergeMap(function (graph) { + return rxjs_1.empty(); + })); + })); + }), operators_1.last(), operators_1.mergeMap(function (graph) { if (graph.hasSpatialArea(key)) { - return Observable_1.Observable.of(graph); + return rxjs_1.of(graph); } - return Observable_1.Observable - .from(graph.cacheSpatialArea$(key)) - .mergeMap(function (graph$) { - return graph$ - .catch(function (error, caught$) { + 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 Observable_1.Observable.empty(); - }); - }); - }) - .last() - .mergeMap(function (graph) { + return rxjs_1.empty(); + })); + })); + }), operators_1.last(), operators_1.mergeMap(function (graph) { return graph.hasNodeSequence(key) ? - Observable_1.Observable.of(graph) : + rxjs_1.of(graph) : graph.cacheNodeSequence$(key); - }) - .do(function (graph) { + }), operators_1.tap(function (graph) { if (!graph.getNode(key).spatialEdges.cached) { graph.cacheSpatialEdges(key); } - }) - .finally(function () { + }), 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); }); @@ -39348,10 +49031,9 @@ var GraphService = /** @class */ (function () { this._spatialSubscriptions.push(spatialSubscription_1); } } - 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. @@ -39362,17 +49044,14 @@ var GraphService = /** @class */ (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. @@ -39390,23 +49069,19 @@ var GraphService = /** @class */ (function () { * @throws {Error} Propagates any IO node caching errors to the caller. */ GraphService.prototype.cacheSequenceNodes$ = function (sequenceKey, referenceNodeKey) { - 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); - }) - .mergeMap(function (graph) { + return rxjs_1.of(graph); + }), operators_1.mergeMap(function (graph) { if (graph.isCachingSequenceNodes(sequenceKey) || !graph.hasSequenceNodes(sequenceKey)) { return graph.cacheSequenceNodes$(sequenceKey, referenceNodeKey); } - return Observable_1.Observable.of(graph); - }) - .map(function (graph) { + return rxjs_1.of(graph); + }), operators_1.map(function (graph) { return graph.getSequence(sequenceKey); - }); + })); }; /** * Set a spatial edge filter on the graph. @@ -39419,15 +49094,12 @@ var GraphService = /** @class */ (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); - }) - .map(function (graph) { + }), operators_1.map(function (graph) { return undefined; - }); + })); }; /** * Set the graph mode. @@ -39467,14 +49139,11 @@ var GraphService = /** @class */ (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); - }) - .map(function (graph) { + }), operators_1.map(function (graph) { return undefined; - }); + })); }; /** * Uncache the graph. @@ -39492,14 +49161,11 @@ var GraphService = /** @class */ (function () { * the graph, when the graph has been uncached. */ GraphService.prototype.uncache$ = function (keepKeys, keepSequenceKey) { - return this._graph$ - .first() - .do(function (graph) { + return this._graph$.pipe(operators_1.first(), operators_1.tap(function (graph) { graph.uncache(keepKeys, keepSequenceKey); - }) - .map(function (graph) { + }), operators_1.map(function (graph) { return undefined; - }); + })); }; GraphService.prototype._abortSubjects = function (subjects) { for (var _i = 0, _a = subjects.slice(); _i < _a.length; _i++) { @@ -39528,16 +49194,15 @@ var GraphService = /** @class */ (function () { exports.GraphService = GraphService; exports.default = GraphService; -},{"../Graph":294,"rxjs/Observable":29,"rxjs/Subject":34}],400:[function(require,module,exports){ +},{"../Graph":295,"rxjs":43,"rxjs/operators":241}],420:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); -var Subject_1 = require("rxjs/Subject"); +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 (_a, node) { + 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) { @@ -39551,17 +49216,13 @@ var ImageLoadingService = /** @class */ (function () { changed = true; } return [nodes, changed]; - }, [{}, false]) - .filter(function (_a) { + }, [{}, false]), operators_1.filter(function (_a) { var nodes = _a[0], changed = _a[1]; return changed; - }) - .map(function (_a) { + }), 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$", { @@ -39582,9 +49243,8 @@ var ImageLoadingService = /** @class */ (function () { }()); exports.ImageLoadingService = ImageLoadingService; -},{"rxjs/Subject":34}],401:[function(require,module,exports){ +},{"rxjs":43,"rxjs/operators":241}],421:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var Pbf = require("pbf"); var MeshReader = /** @class */ (function () { @@ -39606,9 +49266,10 @@ var MeshReader = /** @class */ (function () { }()); exports.MeshReader = MeshReader; -},{"pbf":23}],402:[function(require,module,exports){ +},{"pbf":40}],422:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +var operators_1 = require("rxjs/operators"); /** * @class Node * @@ -39626,7 +49287,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); * * 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 @@ -39646,6 +49307,7 @@ var Node = /** @class */ (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; @@ -39663,6 +49325,8 @@ var Node = /** @class */ (function () { * * @returns {boolean} Value indicating whether all assets have been * cached. + * + * @ignore */ get: function () { return this._core != null && @@ -39696,7 +49360,8 @@ var Node = /** @class */ (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; @@ -39704,6 +49369,20 @@ var Node = /** @class */ (function () { enumerable: true, 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: true, + configurable: true + }); Object.defineProperty(Node.prototype, "capturedAt", { /** * Get capturedAt. @@ -39732,13 +49411,57 @@ var Node = /** @class */ (function () { enumerable: true, 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: true, + 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: true, + 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: true, + configurable: true + }); Object.defineProperty(Node.prototype, "computedCA", { /** * Get computedCA. * * @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; @@ -39784,6 +49507,8 @@ var Node = /** @class */ (function () { * * @returns {boolean} Value indicating whether the node has all * properties filled. + * + * @ignore */ get: function () { return this._fill != null; @@ -39855,6 +49580,8 @@ var Node = /** @class */ (function () { * * @returns {Observable} Observable emitting * the cached image when it is updated. + * + * @ignore */ get: function () { return this._cache.image$; @@ -39897,6 +49624,8 @@ var Node = /** @class */ (function () { * * @returns {ILoadStatus} Value indicating the load status * of the mesh and image. + * + * @ignore */ get: function () { return this._cache.loadStatus; @@ -40108,6 +49837,8 @@ var Node = /** @class */ (function () { * * @returns {IEdgeStatus} Value describing the status of the * sequence edges. + * + * @ignore */ get: function () { return this._cache.sequenceEdges; @@ -40119,8 +49850,12 @@ var Node = /** @class */ (function () { /** * Get sequenceEdges$. * + * @description Internal observable, should not be used as an API. + * * @returns {Observable} Observable emitting * values describing the status of the sequence edges. + * + * @ignore */ get: function () { return this._cache.sequenceEdges$; @@ -40134,6 +49869,8 @@ var Node = /** @class */ (function () { * * @returns {IEdgeStatus} Value describing the status of the * spatial edges. + * + * @ignore */ get: function () { return this._cache.spatialEdges; @@ -40145,8 +49882,12 @@ var Node = /** @class */ (function () { /** * Get spatialEdges$. * + * @description Internal observable, should not be used as an API. + * * @returns {Observable} Observable emitting * values describing the status of the spatial edges. + * + * @ignore */ get: function () { return this._cache.spatialEdges$; @@ -40201,20 +49942,31 @@ var Node = /** @class */ (function () { * * @returns {Observable} 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} 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. @@ -40223,6 +49975,7 @@ var Node = /** @class */ (function () { * internally by the library. * * @param {Array} edges - Sequence edges to cache. + * @ignore */ Node.prototype.cacheSequenceEdges = function (edges) { this._cache.cacheSequenceEdges(edges); @@ -40234,6 +49987,7 @@ var Node = /** @class */ (function () { * internally by the library. * * @param {Array} edges - Spatial edges to cache. + * @ignore */ Node.prototype.cacheSpatialEdges = function (edges) { this._cache.cacheSpatialEdges(edges); @@ -40242,6 +49996,7 @@ var Node = /** @class */ (function () { * Dispose the node. * * @description Disposes all cached assets. + * @ignore */ Node.prototype.dispose = function () { if (this._cache != null) { @@ -40258,6 +50013,7 @@ var Node = /** @class */ (function () { * the library. * * @param {NodeCache} cache - The node cache to set as cache. + * @ignore */ Node.prototype.initializeCache = function (cache) { if (this._cache != null) { @@ -40272,6 +50028,7 @@ var Node = /** @class */ (function () { * the library. * * @param {IFillNode} fill - The fill node struct. + * @ignore */ Node.prototype.makeFull = function (fill) { if (fill == null) { @@ -40281,12 +50038,16 @@ var Node = /** @class */ (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(); @@ -40294,6 +50055,8 @@ var Node = /** @class */ (function () { /** * Clears the image and mesh assets, aborts * any outstanding requests and resets edges. + * + * @ignore */ Node.prototype.uncache = function () { if (this._cache == null) { @@ -40307,12 +50070,12 @@ var Node = /** @class */ (function () { exports.Node = Node; exports.default = Node; -},{}],403:[function(require,module,exports){ +},{"rxjs/operators":241}],423:[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"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var Graph_1 = require("../Graph"); var Utils_1 = require("../Utils"); /** @@ -40331,23 +50094,14 @@ var NodeCache = /** @class */ (function () { this._mesh = null; this._sequenceEdges = { cached: false, edges: [] }; this._spatialEdges = { cached: false, edges: [] }; - this._imageChanged$ = new Subject_1.Subject(); - this._image$ = this._imageChanged$ - .startWith(null) - .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 Subject_1.Subject(); - this._sequenceEdges$ = this._sequenceEdgesChanged$ - .startWith(this._sequenceEdges) - .publishReplay(1) - .refCount(); + 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; } @@ -40478,8 +50232,8 @@ var NodeCache = /** @class */ (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) { @@ -40493,16 +50247,12 @@ var NodeCache = /** @class */ (function () { _this._loadStatus.total += imageStatus.loaded.total; } return _this; - }) - .finally(function () { + }), operators_1.finalize(function () { _this._cachingAssets$ = null; - }) - .publishReplay(1) - .refCount(); - this._cachingAssets$ - .first(function (nodeCache) { + }), 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) { }); @@ -40521,21 +50271,16 @@ var NodeCache = /** @class */ (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); } - var cacheImage$ = 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; - }) - .publishReplay(1) - .refCount(); + }), operators_1.publishReplay(1), operators_1.refCount()); cacheImage$ .subscribe(function (nodeCache) { _this._imageChanged$.next(_this._image); @@ -40612,7 +50357,7 @@ var NodeCache = /** @class */ (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, Utils_1.Urls.origin), true); xmlHTTP.responseType = "arraybuffer"; @@ -40675,7 +50420,7 @@ var NodeCache = /** @class */ (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(); @@ -40747,11 +50492,9 @@ exports.default = NodeCache; }).call(this,require("buffer").Buffer) -},{"../Graph":294,"../Utils":300,"buffer":7,"rxjs/Observable":29,"rxjs/Subject":34}],404:[function(require,module,exports){ +},{"../Graph":295,"../Utils":301,"buffer":7,"rxjs":43,"rxjs/operators":241}],424:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); -var _ = require("underscore"); /** * @class Sequence * @@ -40808,7 +50551,7 @@ var Sequence = /** @class */ (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; } @@ -40824,7 +50567,7 @@ var Sequence = /** @class */ (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; } @@ -40837,9 +50580,8 @@ var Sequence = /** @class */ (function () { exports.Sequence = Sequence; exports.default = Sequence; -},{"underscore":242}],405:[function(require,module,exports){ +},{}],425:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var Edge_1 = require("../../Edge"); @@ -41439,7 +51181,7 @@ var EdgeCalculator = /** @class */ (function () { exports.EdgeCalculator = EdgeCalculator; exports.default = EdgeCalculator; -},{"../../Edge":291,"../../Error":292,"../../Geo":293,"three":240}],406:[function(require,module,exports){ +},{"../../Edge":292,"../../Error":293,"../../Geo":294,"three":242}],426:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var EdgeCalculatorCoefficients = /** @class */ (function () { @@ -41465,7 +51207,7 @@ var EdgeCalculatorCoefficients = /** @class */ (function () { exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients; exports.default = EdgeCalculatorCoefficients; -},{}],407:[function(require,module,exports){ +},{}],427:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Edge_1 = require("../../Edge"); @@ -41538,7 +51280,7 @@ var EdgeCalculatorDirections = /** @class */ (function () { }()); exports.EdgeCalculatorDirections = EdgeCalculatorDirections; -},{"../../Edge":291}],408:[function(require,module,exports){ +},{"../../Edge":292}],428:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var EdgeCalculatorSettings = /** @class */ (function () { @@ -41575,7 +51317,7 @@ var EdgeCalculatorSettings = /** @class */ (function () { exports.EdgeCalculatorSettings = EdgeCalculatorSettings; exports.default = EdgeCalculatorSettings; -},{}],409:[function(require,module,exports){ +},{}],429:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -41633,36 +51375,33 @@ var EdgeDirection; EdgeDirection[EdgeDirection["Similar"] = 10] = "Similar"; })(EdgeDirection = exports.EdgeDirection || (exports.EdgeDirection = {})); -},{}],410:[function(require,module,exports){ +},{}],430:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); -var _ = require("underscore"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var vd = require("virtual-dom"); -var Subject_1 = require("rxjs/Subject"); +var rxjs_2 = require("rxjs"); var Render_1 = require("../Render"); 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; @@ -41689,28 +51428,23 @@ var DOMRenderer = /** @class */ (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]; } @@ -41718,10 +51452,15 @@ var DOMRenderer = /** @class */ (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: { @@ -41737,10 +51476,9 @@ var DOMRenderer = /** @class */ (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]; } @@ -41748,41 +51486,39 @@ var DOMRenderer = /** @class */ (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$", { @@ -41815,7 +51551,8 @@ var DOMRenderer = /** @class */ (function () { exports.DOMRenderer = DOMRenderer; exports.default = DOMRenderer; -},{"../Render":296,"rxjs/Subject":34,"underscore":242,"virtual-dom":246}],411:[function(require,module,exports){ + +},{"../Render":297,"rxjs":43,"rxjs/operators":241,"virtual-dom":247}],431:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GLRenderStage; @@ -41825,59 +51562,50 @@ var GLRenderStage; })(GLRenderStage = exports.GLRenderStage || (exports.GLRenderStage = {})); exports.default = GLRenderStage; -},{}],412:[function(require,module,exports){ +},{}],432:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); +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"); var Render_1 = require("../Render"); 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._dom = !!dom ? dom : new Utils_1.DOM(); - this._renderer$ = this._rendererOperation$ - .scan(function (renderer, operation) { + this._renderer$ = this._rendererOperation$.pipe(operators_1.scan(function (renderer, operation) { return operation(renderer); - }, { needsRender: false, renderer: null }) - .filter(function (renderer) { + }, { needsRender: false, renderer: null }), operators_1.filter(function (renderer) { return !!renderer.renderer; - }); - this._renderCollection$ = this._renderOperation$ - .scan(function (hashes, operation) { + })); + 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; @@ -41890,12 +51618,11 @@ var GLRenderer = /** @class */ (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; @@ -41924,8 +51651,7 @@ var GLRenderer = /** @class */ (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; @@ -41934,29 +51660,24 @@ var GLRenderer = /** @class */ (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"); @@ -41968,21 +51689,16 @@ var GLRenderer = /** @class */ (function () { webGLRenderer.setClearColor(new THREE.Color(0x202020), 1.0); webGLRenderer.autoClear = false; 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; @@ -41991,9 +51707,8 @@ var GLRenderer = /** @class */ (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; @@ -42001,15 +51716,12 @@ var GLRenderer = /** @class */ (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) { @@ -42019,13 +51731,12 @@ var GLRenderer = /** @class */ (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$", { @@ -42047,22 +51758,18 @@ var GLRenderer = /** @class */ (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; @@ -42070,32 +51777,46 @@ var GLRenderer = /** @class */ (function () { exports.GLRenderer = GLRenderer; exports.default = GLRenderer; -},{"../Render":296,"../Utils":300,"rxjs/Observable":29,"rxjs/Subject":34,"three":240}],413:[function(require,module,exports){ + +},{"../Render":297,"../Utils":301,"rxjs":43,"rxjs/operators":241,"three":242}],433:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var Geo_1 = require("../Geo"); var Render_1 = require("../Render"); +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: true, + configurable: true + }); Object.defineProperty(RenderCamera.prototype, "camera", { get: function () { return this._camera; @@ -42105,7 +51826,7 @@ var RenderCamera = /** @class */ (function () { }); Object.defineProperty(RenderCamera.prototype, "changed", { get: function () { - return this.frameId === this._changedForFrame; + return this._frameId === this._changedForFrame; }, enumerable: true, configurable: true @@ -42114,13 +51835,6 @@ var RenderCamera = /** @class */ (function () { get: function () { return this._frameId; }, - set: function (value) { - this._frameId = value; - if (this._changed) { - this._changed = false; - this._changedForFrame = value; - } - }, enumerable: true, configurable: true }); @@ -42131,6 +51845,13 @@ var RenderCamera = /** @class */ (function () { enumerable: true, configurable: true }); + Object.defineProperty(RenderCamera.prototype, "renderMode", { + get: function () { + return this._renderMode; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(RenderCamera.prototype, "rotation", { get: function () { return this._rotation; @@ -42138,65 +51859,170 @@ var RenderCamera = /** @class */ (function () { enumerable: true, 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: true, + 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); + this._perspective.lookAt(camera.lookat); + 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; } - 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; + if (!this._currentNodeId) { + return this._initialFov; + } + 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._getRotation = function (camera) { + RenderCamera.prototype._computeRequiredVerticalFov = function (projectedPoint, zoom, aspect) { + var maxY = Math.max(projectedPoint[0] / aspect, projectedPoint[1]); + return this._yToFov(maxY, zoom); + }; + 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":293,"../Render":296,"three":240}],414:[function(require,module,exports){ +},{"../Geo":294,"../Render":297,"../State":298,"three":242}],434:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -42232,111 +52058,63 @@ var RenderMode; })(RenderMode = exports.RenderMode || (exports.RenderMode = {})); exports.default = RenderMode; -},{}],415:[function(require,module,exports){ +},{}],435:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); -var Subject_1 = require("rxjs/Subject"); -var BehaviorSubject_1 = require("rxjs/BehaviorSubject"); +var operators_1 = require("rxjs/operators"); +var rxjs_1 = require("rxjs"); var Geo_1 = require("../Geo"); var Render_1 = require("../Render"); var RenderService = /** @class */ (function () { - function RenderService(element, currentFrame$, renderMode) { + 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 () { }); @@ -42399,7 +52177,57 @@ var RenderService = /** @class */ (function () { exports.RenderService = RenderService; exports.default = RenderService; -},{"../Geo":293,"../Render":296,"rxjs/BehaviorSubject":26,"rxjs/Subject":34}],416:[function(require,module,exports){ + +},{"../Geo":294,"../Render":297,"rxjs":43,"rxjs/operators":241}],436:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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: true, + configurable: true + }); + Object.defineProperty(FrameGenerator.prototype, "requestAnimationFrame", { + get: function () { + return this._requestAnimationFrame; + }, + enumerable: true, + configurable: true + }); + return FrameGenerator; +}()); +exports.FrameGenerator = FrameGenerator; +exports.default = FrameGenerator; + +},{}],437:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var RotationDelta = /** @class */ (function () { @@ -42462,18 +52290,19 @@ var RotationDelta = /** @class */ (function () { exports.RotationDelta = RotationDelta; exports.default = RotationDelta; -},{}],417:[function(require,module,exports){ +},{}],438:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var State; (function (State) { - State[State["Traversing"] = 0] = "Traversing"; - State[State["Waiting"] = 1] = "Waiting"; - State[State["WaitingInteractively"] = 2] = "WaitingInteractively"; + 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; -},{}],418:[function(require,module,exports){ +},{}],439:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var State_1 = require("../State"); @@ -42490,6 +52319,9 @@ var StateContext = /** @class */ (function () { zoom: 0, }); } + StateContext.prototype.earth = function () { + this._state = this._state.earth(); + }; StateContext.prototype.traverse = function () { this._state = this._state.traverse(); }; @@ -42501,7 +52333,10 @@ var StateContext = /** @class */ (function () { }; 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) { @@ -42649,6 +52484,12 @@ var StateContext = /** @class */ (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); }; @@ -42676,197 +52517,139 @@ var StateContext = /** @class */ (function () { 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":293,"../State":297}],419:[function(require,module,exports){ +},{"../Geo":294,"../State":298}],440:[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"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var State_1 = require("../State"); 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(transitionMode)) - .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 () { }); @@ -42877,7 +52660,7 @@ var StateService = /** @class */ (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 () { @@ -42956,6 +52739,10 @@ var StateService = /** @class */ (function () { enumerable: true, 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(); }); @@ -42991,6 +52778,14 @@ var StateService = /** @class */ (function () { 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); }); @@ -43015,6 +52810,18 @@ var StateService = /** @class */ (function () { 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. * @@ -43026,18 +52833,14 @@ var StateService = /** @class */ (function () { this._invokeContextOperation(function (context) { context.zoomIn(delta, reference); }); }; StateService.prototype.getCenter = function () { - return this._lastState$ - .first() - .map(function (frame) { + return this._lastState$.pipe(operators_1.first(), operators_1.map(function (frame) { return frame.state.getCenter(); - }); + })); }; StateService.prototype.getZoom = function () { - return this._lastState$ - .first() - .map(function (frame) { + 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); @@ -43081,7 +52884,7 @@ var StateService = /** @class */ (function () { }()); exports.StateService = StateService; -},{"../State":297,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/util/AnimationFrame":217}],420:[function(require,module,exports){ +},{"../State":298,"rxjs":43,"rxjs/operators":241}],441:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -43112,12 +52915,99 @@ var TransitionMode; })(TransitionMode = exports.TransitionMode || (exports.TransitionMode = {})); exports.default = TransitionMode; -},{}],421:[function(require,module,exports){ +},{}],442:[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 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}],443:[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; } @@ -43154,6 +53044,9 @@ var InteractiveStateBase = /** @class */ (function (_super) { if (this._currentNode == null) { return; } + if (rotationDelta.phi === 0 && rotationDelta.theta === 0) { + return; + } this._desiredZoom = this._zoom; this._desiredLookat = null; this._requestedBasicRotation = null; @@ -43165,6 +53058,53 @@ var InteractiveStateBase = /** @class */ (function (_super) { 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); + }; InteractiveStateBase.prototype.rotateBasic = function (basicRotation) { if (this._currentNode == null) { return; @@ -43293,7 +53233,7 @@ var InteractiveStateBase = /** @class */ (function (_super) { this._zoom = this._spatial.clamp(zoom, this._minZoom, this._maxZoom); this._desiredZoom = this._zoom; }; - InteractiveStateBase.prototype._applyRotation = function (camera) { + InteractiveStateBase.prototype._applyRotation = function (delta, camera) { if (camera == null) { return; } @@ -43304,9 +53244,9 @@ var InteractiveStateBase = /** @class */ (function (_super) { offset.applyQuaternion(q); var length = offset.length(); var phi = Math.atan2(offset.y, offset.x); - phi += this._rotationDelta.phi; + phi += delta.phi; var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z); - theta += this._rotationDelta.theta; + 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); @@ -43405,7 +53345,8 @@ var InteractiveStateBase = /** @class */ (function (_super) { if (this._rotationDelta.isZero) { return; } - this._rotationDelta.multiply(this._rotationAcceleration); + var alpha = this.currentNode.fullPano ? 1 : this._alpha; + this._rotationDelta.multiply(this._rotationAcceleration * alpha); this._rotationDelta.threshold(this._rotationThreshold); }; InteractiveStateBase.prototype._updateRotationBasic = function () { @@ -43495,12 +53436,16 @@ var InteractiveStateBase = /** @class */ (function (_super) { exports.InteractiveStateBase = InteractiveStateBase; exports.default = InteractiveStateBase; -},{"../../State":297,"three":240}],422:[function(require,module,exports){ + +},{"../../State":298,"three":242}],444:[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; } @@ -43523,9 +53468,6 @@ var InteractiveWaitingState = /** @class */ (function (_super) { InteractiveWaitingState.prototype.wait = function () { return new State_1.WaitingState(this); }; - InteractiveWaitingState.prototype.waitInteractively = function () { - throw new Error("Not implemented"); - }; InteractiveWaitingState.prototype.prepend = function (nodes) { _super.prototype.prepend.call(this, nodes); this._motionless = this._motionlessTransition(); @@ -43534,7 +53476,6 @@ var InteractiveWaitingState = /** @class */ (function (_super) { _super.prototype.set.call(this, nodes); this._motionless = this._motionlessTransition(); }; - InteractiveWaitingState.prototype.setSpeed = function (speed) { return; }; InteractiveWaitingState.prototype.move = function (delta) { this._alpha = Math.max(0, Math.min(1, this._alpha + delta)); }; @@ -43544,8 +53485,8 @@ var InteractiveWaitingState = /** @class */ (function (_super) { InteractiveWaitingState.prototype.update = function (fps) { 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) { @@ -43581,9 +53522,8 @@ var InteractiveWaitingState = /** @class */ (function (_super) { exports.InteractiveWaitingState = InteractiveWaitingState; exports.default = InteractiveWaitingState; -},{"../../State":297}],423:[function(require,module,exports){ +},{"../../State":298}],445:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var Error_1 = require("../../Error"); var Geo_1 = require("../../Geo"); @@ -43604,8 +53544,8 @@ var StateBase = /** @class */ (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.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image); + 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)); } @@ -43715,6 +53655,27 @@ var StateBase = /** @class */ (function () { enumerable: true, 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"); @@ -43791,6 +53752,7 @@ var StateBase = /** @class */ (function () { 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); @@ -43859,8 +53821,8 @@ var StateBase = /** @class */ (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.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image); + 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)); } @@ -43871,16 +53833,14 @@ var StateBase = /** @class */ (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.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image); + 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; @@ -43902,13 +53862,15 @@ var StateBase = /** @class */ (function () { }()); exports.StateBase = StateBase; -},{"../../Error":292,"../../Geo":293,"../../State":297}],424:[function(require,module,exports){ +},{"../../Error":293,"../../Geo":294,"../../State":298}],446:[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; } @@ -43930,8 +53892,8 @@ var TraversingState = /** @class */ (function (_super) { _this._useBezier = false; 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); @@ -43972,12 +53934,6 @@ var TraversingState = /** @class */ (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.setSpeed = function (speed) { this._speedCoefficient = this._spatial.clamp(speed, 0, 10); }; @@ -44002,8 +53958,8 @@ var TraversingState = /** @class */ (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) { @@ -44040,12 +53996,15 @@ var TraversingState = /** @class */ (function (_super) { exports.TraversingState = TraversingState; exports.default = TraversingState; -},{"../../State":297,"@mapbox/unitbezier":2}],425:[function(require,module,exports){ +},{"../../State":298,"@mapbox/unitbezier":2}],447:[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; } @@ -44066,9 +54025,6 @@ var WaitingState = /** @class */ (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); }; @@ -44080,13 +54036,6 @@ var WaitingState = /** @class */ (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.rotateBasicWithoutInertia = function (basicRotation) { return; }; - WaitingState.prototype.rotateToBasic = function (basic) { return; }; - WaitingState.prototype.setSpeed = function (speed) { return; }; - WaitingState.prototype.zoomIn = function (delta, reference) { return; }; WaitingState.prototype.move = function (delta) { this._alpha = Math.max(0, Math.min(1, this._alpha + delta)); }; @@ -44096,8 +54045,6 @@ var WaitingState = /** @class */ (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; }; @@ -44123,10 +54070,10 @@ var WaitingState = /** @class */ (function (_super) { exports.WaitingState = WaitingState; exports.default = WaitingState; -},{"../../State":297}],426:[function(require,module,exports){ +},{"../../State":298}],448:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); +var rxjs_1 = require("rxjs"); /** * @class ImageTileLoader * @@ -44169,7 +54116,7 @@ var ImageTileLoader = /** @class */ (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"; @@ -44215,7 +54162,7 @@ var ImageTileLoader = /** @class */ (function () { exports.ImageTileLoader = ImageTileLoader; exports.default = ImageTileLoader; -},{"rxjs/Observable":29}],427:[function(require,module,exports){ +},{"rxjs":43}],449:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -44283,9 +54230,8 @@ var ImageTileStore = /** @class */ (function () { exports.ImageTileStore = ImageTileStore; exports.default = ImageTileStore; -},{}],428:[function(require,module,exports){ +},{}],450:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var Geo_1 = require("../Geo"); /** @@ -44424,12 +54370,12 @@ var RegionOfInterestCalculator = /** @class */ (function () { exports.RegionOfInterestCalculator = RegionOfInterestCalculator; exports.default = RegionOfInterestCalculator; -},{"../Geo":293}],429:[function(require,module,exports){ +},{"../Geo":294}],451:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); +var operators_1 = require("rxjs/operators"); var THREE = require("three"); -var Subject_1 = require("rxjs/Subject"); +var rxjs_1 = require("rxjs"); /** * @class TextureProvider * @@ -44459,17 +54405,12 @@ var TextureProvider = /** @class */ (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 = {}; @@ -44905,7 +54846,7 @@ var TextureProvider = /** @class */ (function () { exports.TextureProvider = TextureProvider; exports.default = TextureProvider; -},{"rxjs/Subject":34,"three":240}],430:[function(require,module,exports){ +},{"rxjs":43,"rxjs/operators":241,"three":242}],452:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var DOM = /** @class */ (function () { @@ -44934,7 +54875,7 @@ var DOM = /** @class */ (function () { exports.DOM = DOM; exports.default = DOM; -},{}],431:[function(require,module,exports){ +},{}],453:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var EventEmitter = /** @class */ (function () { @@ -44993,7 +54934,7 @@ var EventEmitter = /** @class */ (function () { exports.EventEmitter = EventEmitter; exports.default = EventEmitter; -},{}],432:[function(require,module,exports){ +},{}],454:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Viewer_1 = require("../Viewer"); @@ -45037,7 +54978,7 @@ var Settings = /** @class */ (function () { exports.Settings = Settings; exports.default = Settings; -},{"../Viewer":301}],433:[function(require,module,exports){ +},{"../Viewer":302}],455:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function isBrowser() { @@ -45107,7 +55048,7 @@ function isWebGLSupported() { } exports.isWebGLSupported = isWebGLSupported; -},{}],434:[function(require,module,exports){ +},{}],456:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Urls = /** @class */ (function () { @@ -45141,6 +55082,9 @@ var Urls = /** @class */ (function () { enumerable: true, configurable: true }); + 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"; }; @@ -45164,6 +55108,9 @@ var Urls = /** @class */ (function () { if (!!options.apiHost) { Urls._apiHost = options.apiHost; } + if (!!options.clusterReconstructionHost) { + Urls._clusterReconstructionHost = options.clusterReconstructionHost; + } if (!!options.exploreHost) { Urls._exploreHost = options.exploreHost; } @@ -45181,10 +55128,11 @@ var Urls = /** @class */ (function () { } }; Urls._apiHost = "a.mapillary.com"; + Urls._clusterReconstructionHost = "cluster-reconstructions.mapillary.com"; Urls._exploreHost = "www.mapillary.com"; - Urls._imageHost = "d1cuyjsrcm0gby.cloudfront.net"; - Urls._imageTileHost = "d2qb1440i7l50o.cloudfront.net"; - Urls._meshHost = "d1brzeo354iq2l.cloudfront.net"; + Urls._imageHost = "images.mapillary.com"; + Urls._imageTileHost = "loris.mapillary.com"; + Urls._meshHost = "meshes.mapillary.com"; Urls._origin = "mapillary.webgl"; Urls._scheme = "https"; return Urls; @@ -45192,7 +55140,7 @@ var Urls = /** @class */ (function () { exports.Urls = Urls; exports.default = Urls; -},{}],435:[function(require,module,exports){ +},{}],457:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -45241,10 +55189,11 @@ var Alignment; })(Alignment = exports.Alignment || (exports.Alignment = {})); exports.default = Alignment; -},{}],436:[function(require,module,exports){ +},{}],458:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var Graph_1 = require("../Graph"); var CacheService = /** @class */ (function () { function CacheService(graphService, stateService) { @@ -45264,11 +55213,9 @@ var CacheService = /** @class */ (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) { + }), operators_1.map(function (frame) { var trajectory = frame.state.trajectory; var trajectoryKeys = trajectory .map(function (n) { @@ -45276,38 +55223,30 @@ var CacheService = /** @class */ (function () { }); var sequenceKey = trajectory[trajectory.length - 1].sequenceKey; return [trajectoryKeys, sequenceKey]; - }) - .bufferCount(1, 5) - .withLatestFrom(this._graphService.graphMode$) - .switchMap(function (_a) { + }), 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$ - .skip(1) - .withLatestFrom(this._stateService.currentState$) - .switchMap(function (_a) { + 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$; }) : - Observable_1.Observable - .from(frame.state.trajectory + rxjs_1.from(frame.state.trajectory .map(function (node) { return node.key; }) - .slice(frame.state.currentIndex)) - .mergeMap(function (key) { + .slice(frame.state.currentIndex)).pipe(operators_1.mergeMap(function (key) { return _this._keyToEdges(key, function (node) { return node.spatialEdges$; }); - }, 6); - }) + }, 6)); + })) .subscribe(function () { }); this._started = true; }; @@ -45322,25 +55261,22 @@ var CacheService = /** @class */ (function () { this._started = false; }; CacheService.prototype._keyToEdges = function (key, nodeToEdgeMap) { - return this._graphService.cacheNode$(key) - .switchMap(nodeToEdgeMap) - .first(function (status) { + return this._graphService.cacheNode$(key).pipe(operators_1.switchMap(nodeToEdgeMap), operators_1.first(function (status) { return status.cached; - }) - .timeout(15000) - .catch(function (error) { + }), operators_1.timeout(15000), operators_1.catchError(function (error) { console.error("Failed to cache edges (" + key + ").", error); - return Observable_1.Observable.empty(); - }); + return rxjs_1.empty(); + })); }; return CacheService; }()); exports.CacheService = CacheService; exports.default = CacheService; -},{"../Graph":294,"rxjs/Observable":29}],437:[function(require,module,exports){ +},{"../Graph":295,"rxjs":43,"rxjs/operators":241}],459:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +var operators_1 = require("rxjs/operators"); var Component_1 = require("../Component"); var ComponentController = /** @class */ (function () { function ComponentController(container, navigator, observer, key, options, componentService) { @@ -45361,10 +55297,9 @@ var ComponentController = /** @class */ (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(); @@ -45372,6 +55307,7 @@ var ComponentController = /** @class */ (function () { _this._subscribeCoverComponent(); _this._navigator.stateService.start(); _this._navigator.cacheService.start(); + _this._navigator.panService.start(); _this._observer.startEmit(); }); } @@ -45398,9 +55334,6 @@ var ComponentController = /** @class */ (function () { ComponentController.prototype.deactivateCover = function () { this._coverComponent.configure({ state: Component_1.CoverState.Loading }); }; - ComponentController.prototype.resize = function () { - this._componentService.resize(); - }; ComponentController.prototype._initializeComponents = function () { var options = this._options; this._uFalse(options.background, "background"); @@ -45411,6 +55344,7 @@ var ComponentController = /** @class */ (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"); @@ -45443,23 +55377,24 @@ var ComponentController = /** @class */ (function () { }; ComponentController.prototype._subscribeCoverComponent = function () { var _this = this; - this._coverComponent.configuration$.subscribe(function (conf) { + 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$ - .first() - .switchMap(function (key) { + _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({ state: Component_1.CoverState.Hidden }); _this._componentService.deactivateCover(); @@ -45474,6 +55409,7 @@ var ComponentController = /** @class */ (function () { _this._navigator.stateService.stop(); _this._navigator.cacheService.stop(); _this._navigator.playService.stop(); + _this._navigator.panService.stop(); _this._componentService.activateCover(); _this._setNavigable(conf.key == null); } @@ -45517,7 +55453,7 @@ var ComponentController = /** @class */ (function () { }()); exports.ComponentController = ComponentController; -},{"../Component":290}],438:[function(require,module,exports){ +},{"../Component":291,"rxjs/operators":241}],460:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Render_1 = require("../Render"); @@ -45568,7 +55504,7 @@ var Container = /** @class */ (function () { exports.Container = Container; exports.default = Container; -},{"../Render":296,"../Utils":300,"../Viewer":301}],439:[function(require,module,exports){ +},{"../Render":297,"../Utils":301,"../Viewer":302}],461:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -45597,13 +55533,14 @@ var ImageSize; ImageSize[ImageSize["Size2048"] = 2048] = "Size2048"; })(ImageSize = exports.ImageSize || (exports.ImageSize = {})); -},{}],440:[function(require,module,exports){ +},{}],462:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); +var rxjs_1 = require("rxjs"); var KeyboardService = /** @class */ (function () { function KeyboardService(canvasContainer) { - this._keyDown$ = Observable_1.Observable.fromEvent(canvasContainer, "keydown"); + this._keyDown$ = rxjs_1.fromEvent(canvasContainer, "keydown"); + this._keyUp$ = rxjs_1.fromEvent(canvasContainer, "keyup"); } Object.defineProperty(KeyboardService.prototype, "keyDown$", { get: function () { @@ -45612,52 +55549,54 @@ var KeyboardService = /** @class */ (function () { enumerable: true, configurable: true }); + Object.defineProperty(KeyboardService.prototype, "keyUp$", { + get: function () { + return this._keyUp$; + }, + enumerable: true, + configurable: true + }); return KeyboardService; }()); exports.KeyboardService = KeyboardService; exports.default = KeyboardService; -},{"rxjs/Observable":29}],441:[function(require,module,exports){ +},{"rxjs":43}],463:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); -var _ = require("underscore"); -var Subject_1 = require("rxjs/Subject"); +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, 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 }); @@ -45670,27 +55609,20 @@ var LoadingService = /** @class */ (function () { exports.LoadingService = LoadingService; exports.default = LoadingService; -},{"rxjs/Subject":34,"underscore":242}],442:[function(require,module,exports){ +},{"rxjs":43,"rxjs/operators":241}],464:[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"); -var Geo_1 = require("../Geo"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var MouseService = /** @class */ (function () { - function MouseService(container, canvasContainer, domContainer, doc, viewportCoords) { + function MouseService(container, canvasContainer, domContainer, doc) { var _this = 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._claimWheel$ = new Subject_1.Subject(); - this._deferPixelClaims$ = new Subject_1.Subject(); - this._deferPixels$ = this._deferPixelClaims$ - .scan(function (claims, claim) { + 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]; } @@ -45698,8 +55630,7 @@ var MouseService = /** @class */ (function () { claims[claim.name] = claim.deferPixels; } return claims; - }, {}) - .map(function (claims) { + }, {}), operators_1.map(function (claims) { var deferPixelMax = -1; for (var key in claims) { if (!claims.hasOwnProperty(key)) { @@ -45711,27 +55642,21 @@ var MouseService = /** @class */ (function () { } } return deferPixelMax; - }) - .startWith(-1) - .publishReplay(1) - .refCount(); + }), operators_1.startWith(-1), operators_1.publishReplay(1), operators_1.refCount()); this._deferPixels$.subscribe(function () { }); - this._documentMouseMove$ = Observable_1.Observable.fromEvent(doc, "mousemove"); - this._documentMouseUp$ = Observable_1.Observable.fromEvent(doc, "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._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]; @@ -45740,60 +55665,39 @@ var MouseService = /** @class */ (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")) - .share(); - 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) { + }), 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(); - var mouseDragInitiate$ = this._createMouseDragInitiate$(this._mouseDown$, dragStop$, true).share(); - this._mouseDragStart$ = this._createMouseDragStart$(mouseDragInitiate$).share(); - this._mouseDrag$ = this._createMouseDrag$(mouseDragInitiate$, dragStop$).share(); - this._mouseDragEnd$ = this._createMouseDragEnd$(this._mouseDragStart$, dragStop$).share(); - var domMouseDragInitiate$ = this._createMouseDragInitiate$(this._domMouseDown$, dragStop$, false).share(); - this._domMouseDragStart$ = this._createMouseDragStart$(domMouseDragInitiate$).share(); - this._domMouseDrag$ = this._createMouseDrag$(domMouseDragInitiate$, dragStop$).share(); - this._domMouseDragEnd$ = this._createMouseDragEnd$(this._domMouseDragStart$, dragStop$).share(); - this._proximateClick$ = this._mouseDown$ - .switchMap(function (mouseDown) { - return _this._click$ - .takeUntil(_this._createDeferredMouseMove$(mouseDown, _this._documentMouseMove$)) - .take(1); - }) - .share(); - this._staticClick$ = this._mouseDown$ - .switchMap(function (e) { - return _this._click$ - .takeUntil(_this._documentMouseMove$) - .take(1); - }) - .share(); + }))).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(); @@ -45801,12 +55705,8 @@ var MouseService = /** @class */ (function () { this._domMouseDrag$.subscribe(); this._domMouseDragEnd$.subscribe(); this._staticClick$.subscribe(); - this._mouseOwner$ = this._createOwner$(this._claimMouse$) - .publishReplay(1) - .refCount(); - this._wheelOwner$ = this._createOwner$(this._claimWheel$) - .publishReplay(1) - .refCount(); + 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 () { }); } @@ -46010,67 +55910,50 @@ var MouseService = /** @class */ (function () { return this._filtered(name, observable$, this._wheelOwner$); }; MouseService.prototype._createDeferredMouseMove$ = function (origin, mouseMove$) { - return mouseMove$ - .map(function (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)]; - }) - .withLatestFrom(this._deferPixels$) - .filter(function (_a) { + }), 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; - }) - .map(function (_a) { + }), 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$ - .map(function (_a) { + return mouseDragStartInitiate$.pipe(operators_1.map(function (_a) { var mouseDown = _a[0], mouseMove = _a[1]; return mouseMove; - }) - .switchMap(function (mouseMove) { - return Observable_1.Observable - .of(mouseMove) - .concat(_this._documentMouseMove$) - .takeUntil(stop$); - }); + }), 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$ - .switchMap(function (event) { - return stop$.first(); - }); + return mouseDragStart$.pipe(operators_1.switchMap(function (event) { + return stop$.pipe(operators_1.first()); + })); }; MouseService.prototype._createMouseDragStart$ = function (mouseDragStartInitiate$) { - return mouseDragStartInitiate$ - .map(function (_a) { + 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$ - .filter(function (mouseDown) { + return mouseDown$.pipe(operators_1.filter(function (mouseDown) { return mouseDown.button === 0; - }) - .switchMap(function (mouseDown) { - return Observable_1.Observable - .combineLatest(Observable_1.Observable.of(mouseDown), defer ? + }), operators_1.switchMap(function (mouseDown) { + return rxjs_1.combineLatest(rxjs_1.of(mouseDown), defer ? _this._createDeferredMouseMove$(mouseDown, _this._documentMouseMove$) : - _this._documentMouseMove$) - .takeUntil(stop$) - .take(1); - }); + _this._documentMouseMove$).pipe(operators_1.takeUntil(stop$), operators_1.take(1)); + })); }; MouseService.prototype._createOwner$ = function (claim$) { - return claim$ - .scan(function (claims, claim) { + return claim$.pipe(operators_1.scan(function (claims, claim) { if (claim.zindex == null) { delete claims[claim.name]; } @@ -46078,8 +55961,7 @@ var MouseService = /** @class */ (function () { claims[claim.name] = claim.zindex; } return claims; - }, {}) - .map(function (claims) { + }, {}), operators_1.map(function (claims) { var owner = null; var zIndexMax = -1; for (var name_1 in claims) { @@ -46092,41 +55974,36 @@ var MouseService = /** @class */ (function () { } } return owner; - }) - .startWith(null); + }), operators_1.startWith(null)); }; MouseService.prototype._filtered = function (name, observable$, owner$) { - return observable$ - .withLatestFrom(owner$) - .filter(function (_a) { + return observable$.pipe(operators_1.withLatestFrom(owner$), operators_1.filter(function (_a) { var item = _a[0], owner = _a[1]; return owner === name; - }) - .map(function (_a) { + }), operators_1.map(function (_a) { var item = _a[0], owner = _a[1]; return item; - }); + })); }; return MouseService; }()); exports.MouseService = MouseService; exports.default = MouseService; -},{"../Geo":293,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/Subject":34}],443:[function(require,module,exports){ +},{"rxjs":43,"rxjs/operators":241}],465:[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 ReplaySubject_1 = require("rxjs/ReplaySubject"); +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 PanService_1 = require("./PanService"); var Navigator = /** @class */ (function () { - function Navigator(clientId, options, token, apiV3, graphService, imageLoadingService, loadingService, stateService, cacheService, playService) { + 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 ? @@ -46141,8 +56018,11 @@ var Navigator = /** @class */ (function () { this._playService = playService != null ? playService : new Viewer_1.PlayService(this._graphService, this._stateService); - this._keyRequested$ = new BehaviorSubject_1.BehaviorSubject(null); - this._movedToKey$ = new BehaviorSubject_1.BehaviorSubject(null); + 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; @@ -46189,6 +56069,13 @@ var Navigator = /** @class */ (function () { enumerable: true, configurable: true }); + Object.defineProperty(Navigator.prototype, "panService", { + get: function () { + return this._panService; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(Navigator.prototype, "playService", { get: function () { return this._playService; @@ -46213,14 +56100,10 @@ var Navigator = /** @class */ (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) { @@ -46228,92 +56111,71 @@ var Navigator = /** @class */ (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 () { + 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$ - .first() - .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 () { + return _this._graphService.setFilter$(filter).pipe(operators_1.mergeMap(function () { return _this._graphService.cacheNode$(requestedKey); - }); + })); } - return _this._graphService.setFilter$(filter) - .map(function () { + 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$([]) : - _this._trajectoryKeys$() - .mergeMap(function (keys) { - return _this._graphService.reset$(keys) - .mergeMap(function () { + _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; @@ -46321,9 +56183,7 @@ var Navigator = /** @class */ (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) { @@ -46343,53 +56203,49 @@ var Navigator = /** @class */ (function () { }; Navigator.prototype._makeRequest$ = function (node$) { var _this = this; - var request$ = new ReplaySubject_1.ReplaySubject(1); + var request$ = new rxjs_1.ReplaySubject(1); this._requestSubscription = request$ - .subscribe(undefined, function (e) { }); + .subscribe(undefined, function () { }); this._request$ = request$; this._nodeRequestSubscription = node$ .subscribe(function (node) { + _this._request$ = null; request$.next(node); request$.complete(); - _this._request$ = null; }, function (error) { - request$.error(error); _this._request$ = null; + request$.error(error); }); 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":289,"../Edge":291,"../Error":292,"../Graph":294,"../State":297,"../Viewer":301,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/ReplaySubject":32}],444:[function(require,module,exports){ +},{"../API":290,"../Edge":292,"../Error":293,"../Graph":295,"../State":298,"../Viewer":302,"./PanService":467,"rxjs":43,"rxjs/operators":241}],466:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); -var Subject_1 = require("rxjs/Subject"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var Viewer_1 = require("../Viewer"); var Observer = /** @class */ (function () { function Observer(eventEmitter, navigator, container) { @@ -46399,7 +56255,7 @@ var Observer = /** @class */ (function () { this._navigator = navigator; this._projection = new Viewer_1.Projection(); this._started = false; - this._navigable$ = new Subject_1.Subject(); + this._navigable$ = new rxjs_1.Subject(); // navigable and loading should always emit, also when cover is activated. this._navigable$ .subscribe(function (navigable) { @@ -46424,16 +56280,35 @@ var Observer = /** @class */ (function () { enumerable: true, configurable: true }); + Object.defineProperty(Observer.prototype, "projection", { + get: function () { + return this._projection; + }, + enumerable: true, + 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; @@ -46445,26 +56320,21 @@ var Observer = /** @class */ (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); @@ -46473,24 +56343,18 @@ var Observer = /** @class */ (function () { _this._eventEmitter.fire(Viewer_1.Viewer.moveend, null); } }); - this._bearingSubscription = this._container.renderService.bearing$ - .auditTime(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 { @@ -46501,10 +56365,49 @@ var Observer = /** @class */ (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) { @@ -46513,53 +56416,275 @@ var Observer = /** @class */ (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":301,"rxjs/Observable":29,"rxjs/Subject":34}],445:[function(require,module,exports){ +},{"../Viewer":302,"rxjs":43,"rxjs/operators":241}],467:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); -var Subject_1 = require("rxjs/Subject"); +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: true, + 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":409,"../geo/GeoCoords":410,"../geo/Spatial":412,"../geo/Transform":413,"../geo/ViewportCoords":414,"../graph/GraphCalculator":417,"rxjs":43,"rxjs/operators":241}],468:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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 () { @@ -46567,25 +56692,16 @@ var PlayService = /** @class */ (function () { this._graphService = graphService; this._stateService = stateService; this._graphCalculator = !!graphCalculator ? graphCalculator : new Graph_1.GraphCalculator(); - this._directionSubject$ = new Subject_1.Subject(); - this._direction$ = this._directionSubject$ - .startWith(Edge_1.EdgeDirection.Next) - .publishReplay(1) - .refCount(); + 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 Subject_1.Subject(); - this._playing$ = this._playingSubject$ - .startWith(this._playing) - .publishReplay(1) - .refCount(); + 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 Subject_1.Subject(); - this._speed$ = this._speedSubject$ - .startWith(this._speed) - .publishReplay(1) - .refCount(); + 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; @@ -46626,53 +56742,41 @@ var PlayService = /** @class */ (function () { this._stateService.cutNodes(); var stateSpeed = this._setSpeed(this._speed); this._stateService.setSpeed(stateSpeed); - this._graphModeSubscription = this._speed$ - .map(function (speed) { - return speed > 0.54 ? Graph_1.GraphMode.Sequence : Graph_1.GraphMode.Spatial; - }) - .distinctUntilChanged() + 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 = this._stateService.currentNode$ - .map(function (node) { + this._cacheSubscription = rxjs_1.combineLatest(this._stateService.currentNode$.pipe(operators_1.map(function (node) { return [node.sequenceKey, node.key]; - }) - .distinctUntilChanged(undefined, function (_a) { + }), operators_1.distinctUntilChanged(undefined, function (_a) { var sequenceKey = _a[0], nodeKey = _a[1]; return sequenceKey; - }) - .combineLatest(this._graphService.graphMode$, this._direction$) - .switchMap(function (_a) { + })), 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 Observable_1.Observable.of([undefined, direction]); + return rxjs_1.of([undefined, direction]); } var sequence$ = (mode === Graph_1.GraphMode.Sequence ? _this._graphService.cacheSequenceNodes$(sequenceKey, nodeKey) : - _this._graphService.cacheSequence$(sequenceKey)) - .retry(3) - .catch(function (error) { + _this._graphService.cacheSequence$(sequenceKey)).pipe(operators_1.retry(3), operators_1.catchError(function (error) { console.error(error); - return Observable_1.Observable.of(undefined); - }); - return Observable_1.Observable - .combineLatest(sequence$, Observable_1.Observable.of(direction)); - }) - .switchMap(function (_a) { + 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 Observable_1.Observable.empty(); + return rxjs_1.empty(); } var sequenceKeys = sequence.keys.slice(); if (direction === Edge_1.EdgeDirection.Prev) { sequenceKeys.reverse(); } - return _this._stateService.currentState$ - .map(function (frame) { + return _this._stateService.currentState$.pipe(operators_1.map(function (frame) { return [frame.state.trajectory[frame.state.trajectory.length - 1].key, frame.state.nodesAhead]; - }) - .scan(function (_a, _b) { + }), operators_1.scan(function (_a, _b) { var lastRequestKey = _a[0], previousRequestKeys = _a[1]; var lastTrajectoryKey = _b[0], nodesAhead = _b[1]; if (lastRequestKey === undefined) { @@ -46689,27 +56793,21 @@ var PlayService = /** @class */ (function () { return [lastRequestKey, []]; } return [sequenceKeys[end - 1], sequenceKeys.slice(start, end)]; - }, [undefined, []]) - .mergeMap(function (_a) { + }, [undefined, []]), operators_1.mergeMap(function (_a) { var lastRequestKey = _a[0], newRequestKeys = _a[1]; - return Observable_1.Observable.from(newRequestKeys); - }); - }) - .mergeMap(function (key) { - return _this._graphService.cacheNode$(key) - .catch(function () { - return Observable_1.Observable.empty(); - }); - }, 6) + 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$ - .filter(function (frame) { + this._playingSubscription = this._stateService.currentState$.pipe(operators_1.filter(function (frame) { return frame.state.nodesAhead < _this._nodesAhead; - }) - .distinctUntilChanged(undefined, function (frame) { + }), operators_1.distinctUntilChanged(undefined, function (frame) { return frame.state.lastNode.key; - }) - .map(function (frame) { + }), operators_1.map(function (frame) { var lastNode = frame.state.lastNode; var trajectory = frame.state.trajectory; var increasingTime = undefined; @@ -46724,19 +56822,13 @@ var PlayService = /** @class */ (function () { } } return [frame.state.lastNode, increasingTime]; - }) - .withLatestFrom(this._direction$) - .switchMap(function (_a) { + }), operators_1.withLatestFrom(this._direction$), operators_1.switchMap(function (_a) { var _b = _a[0], node = _b[0], increasingTime = _b[1], direction = _a[1]; - return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ? + return rxjs_1.zip(([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ? node.sequenceEdges$ : - node.spatialEdges$) - .first(function (status) { + node.spatialEdges$).pipe(operators_1.first(function (status) { return status.cached; - }) - .timeout(15000) - .zip(Observable_1.Observable.of(direction)) - .map(function (_a) { + }), 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]; @@ -46745,64 +56837,50 @@ var PlayService = /** @class */ (function () { } } return null; - }) - .switchMap(function (key) { + }), operators_1.switchMap(function (key) { return key != null ? _this._graphService.cacheNode$(key) : - _this._bridge$(node, increasingTime) - .filter(function (n) { + _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$ - .bufferCount(1, 10) + 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$ - .map(function (frame) { + var currentLastNodes$ = this._stateService.currentState$.pipe(operators_1.map(function (frame) { return frame.state; - }) - .distinctUntilChanged(function (_a, _b) { + }), 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]; - }) - .filter(function (state) { + }), operators_1.filter(function (state) { return state.currentNode.key === state.lastNode.key && state.currentIndex === state.trajectory.length - 1; - }) - .map(function (state) { + }), operators_1.map(function (state) { return state.currentNode; - }); - this._stopSubscription = Observable_1.Observable - .combineLatest(currentLastNodes$, this._direction$) - .switchMap(function (_a) { + })); + 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$) - .first(function (status) { + node.spatialEdges$).pipe(operators_1.first(function (status) { return status.cached; - }) - .timeout(15000) - .catch(function (error) { + }), operators_1.timeout(15000), operators_1.catchError(function (error) { console.error(error); - return Observable_1.Observable.of({ cached: false, edges: [] }); - }); - return Observable_1.Observable - .combineLatest(Observable_1.Observable.of(direction), edgeStatus$) - .map(function (_a) { + 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]; @@ -46811,24 +56889,20 @@ var PlayService = /** @class */ (function () { } } return false; - }); - }) - .mergeMap(function (hasEdge) { + })); + }), operators_1.mergeMap(function (hasEdge) { if (hasEdge || !_this._bridging$) { - return Observable_1.Observable.of(hasEdge); + return rxjs_1.of(hasEdge); } - return _this._bridging$ - .map(function (node) { + return _this._bridging$.pipe(operators_1.map(function (node) { return node != null; - }) - .catch(function (error) { + }), operators_1.catchError(function (error) { console.error(error); - return Observable_1.Observable.of(false); - }); - }) - .first(function (hasEdge) { + 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; @@ -46874,11 +56948,10 @@ var PlayService = /** @class */ (function () { PlayService.prototype._bridge$ = function (node, increasingTime) { var _this = this; if (increasingTime === undefined) { - return Observable_1.Observable.of(null); + return rxjs_1.of(null); } var boundingBox = this._graphCalculator.boundingBoxCorners(node.latLon, 25); - this._bridging$ = this._graphService.cacheBoundingBox$(boundingBox[0], boundingBox[1]) - .mergeMap(function (nodes) { + 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]; @@ -46899,13 +56972,10 @@ var PlayService = /** @class */ (function () { } return !!nextNode ? _this._graphService.cacheNode$(nextNode.key) : - Observable_1.Observable.of(null); - }) - .finally(function () { + rxjs_1.of(null); + }), operators_1.finalize(function () { _this._bridging$ = null; - }) - .publish() - .refCount(); + }), operators_1.publish(), operators_1.refCount()); return this._bridging$; }; PlayService.prototype._mapSpeed = function (speed) { @@ -46925,25 +56995,27 @@ var PlayService = /** @class */ (function () { this._nodesAhead = this._mapNodesAhead(stateSpeed); return stateSpeed; }; + PlayService.sequenceSpeed = 0.54; return PlayService; }()); exports.PlayService = PlayService; exports.default = PlayService; -},{"../Edge":291,"../Graph":294,"rxjs/Observable":29,"rxjs/Subject":34}],446:[function(require,module,exports){ +},{"../Edge":292,"../Graph":295,"rxjs":43,"rxjs/operators":241}],469:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var Geo_1 = require("../Geo"); +var Spatial_1 = require("../geo/Spatial"); var Projection = /** @class */ (function () { - function Projection(geoCoords, viewportCoords) { + 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 @@ -46984,18 +57056,31 @@ var Projection = /** @class */ (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":293,"three":240}],447:[function(require,module,exports){ +},{"../Geo":294,"../geo/Spatial":412,"three":242}],470:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); +var operators_1 = require("rxjs/operators"); var THREE = require("three"); var vd = require("virtual-dom"); -var Subject_1 = require("rxjs/Subject"); +var rxjs_1 = require("rxjs"); var Viewer_1 = require("../Viewer"); var SpriteAtlas = /** @class */ (function () { function SpriteAtlas() { @@ -47125,16 +57210,12 @@ 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; @@ -47185,107 +57266,71 @@ var SpriteService = /** @class */ (function () { exports.SpriteService = SpriteService; exports.default = SpriteService; -},{"../Viewer":301,"rxjs/Subject":34,"three":240,"virtual-dom":246}],448:[function(require,module,exports){ + +},{"../Viewer":302,"rxjs":43,"rxjs/operators":241,"three":242,"virtual-dom":247}],471:[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"); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var TouchService = /** @class */ (function () { function TouchService(canvasContainer, domContainer) { var _this = this; - 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, @@ -47303,12 +57348,10 @@ var TouchService = /** @class */ (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]; @@ -47347,14 +57390,11 @@ var TouchService = /** @class */ (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 () { @@ -47451,13 +57491,15 @@ var TouchService = /** @class */ (function () { }()); exports.TouchService = TouchService; -},{"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/Subject":34}],449:[function(require,module,exports){ +},{"rxjs":43,"rxjs/operators":241}],472:[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; } @@ -47465,62 +57507,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var rxjs_1 = require("rxjs"); +var operators_1 = require("rxjs/operators"); var when = require("when"); -require("rxjs/add/observable/combineLatest"); -require("rxjs/add/observable/concat"); -require("rxjs/add/observable/defer"); -require("rxjs/add/observable/empty"); -require("rxjs/add/observable/merge"); -require("rxjs/add/observable/from"); -require("rxjs/add/observable/fromEvent"); -require("rxjs/add/observable/fromPromise"); -require("rxjs/add/observable/of"); -require("rxjs/add/observable/throw"); -require("rxjs/add/observable/timer"); -require("rxjs/add/observable/zip"); -require("rxjs/add/operator/auditTime"); -require("rxjs/add/operator/buffer"); -require("rxjs/add/operator/bufferCount"); -require("rxjs/add/operator/bufferWhen"); -require("rxjs/add/operator/catch"); -require("rxjs/add/operator/combineLatest"); -require("rxjs/add/operator/concat"); -require("rxjs/add/operator/count"); -require("rxjs/add/operator/debounceTime"); -require("rxjs/add/operator/delay"); -require("rxjs/add/operator/distinct"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/do"); -require("rxjs/add/operator/expand"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/finally"); -require("rxjs/add/operator/first"); -require("rxjs/add/operator/last"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/merge"); -require("rxjs/add/operator/mergeMap"); -require("rxjs/add/operator/mergeAll"); -require("rxjs/add/operator/pairwise"); -require("rxjs/add/operator/pluck"); -require("rxjs/add/operator/publish"); -require("rxjs/add/operator/publishReplay"); -require("rxjs/add/operator/reduce"); -require("rxjs/add/operator/retry"); -require("rxjs/add/operator/sample"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/share"); -require("rxjs/add/operator/skip"); -require("rxjs/add/operator/skipUntil"); -require("rxjs/add/operator/skipWhile"); -require("rxjs/add/operator/startWith"); -require("rxjs/add/operator/switchMap"); -require("rxjs/add/operator/take"); -require("rxjs/add/operator/takeUntil"); -require("rxjs/add/operator/takeWhile"); -require("rxjs/add/operator/timeout"); -require("rxjs/add/operator/withLatestFrom"); -require("rxjs/add/operator/zip"); -var Observable_1 = require("rxjs/Observable"); var Viewer_1 = require("../Viewer"); var Utils_1 = require("../Utils"); /** @@ -47531,6 +57520,9 @@ var Utils_1 = require("../Utils"); * 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 @@ -47643,7 +57635,7 @@ var Viewer = /** @class */ (function (_super) { * 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`} + * 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. @@ -47658,6 +57650,14 @@ var Viewer = /** @class */ (function (_super) { enumerable: true, 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. * @@ -47677,6 +57677,15 @@ var Viewer = /** @class */ (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. * @@ -47718,8 +57727,7 @@ var Viewer = /** @class */ (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) { @@ -47727,6 +57735,17 @@ var Viewer = /** @class */ (function (_super) { }); }); }; + /** + * Returns the HTML element containing the viewer's 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 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. @@ -47777,6 +57796,80 @@ var Viewer = /** @class */ (function (_super) { Viewer.prototype.getContainer = function () { return this._container.element; }; + /** + * 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} 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} 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} 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. * @@ -47812,7 +57905,7 @@ var Viewer = /** @class */ (function (_super) { * longitude. * @throws {Error} Propagates any IO errors to the caller. * @throws {Error} When viewer is not navigable. - * @throws {AbortMapillaryError} When a subsequent move request is made + * @throws {@link AbortMapillaryError} When a subsequent move request is made * before the move close to call has completed. * * @example @@ -47825,7 +57918,7 @@ var Viewer = /** @class */ (function (_super) { Viewer.prototype.moveCloseTo = function (lat, lon) { var moveCloseTo$ = this.isNavigable ? this._navigator.moveCloseTo$(lat, lon) : - Observable_1.Observable.throw(new Error("Calling moveCloseTo is not supported when viewer is not navigable.")); + rxjs_1.throwError(new Error("Calling moveCloseTo is not supported when viewer is not navigable.")); return when.promise(function (resolve, reject) { moveCloseTo$.subscribe(function (node) { resolve(node); @@ -47845,7 +57938,7 @@ var Viewer = /** @class */ (function (_super) { * 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 {AbortMapillaryError} When a subsequent move request is made + * @throws {@link AbortMapillaryError} When a subsequent move request is made * before the move dir call has completed. * * @example @@ -47858,7 +57951,7 @@ var Viewer = /** @class */ (function (_super) { Viewer.prototype.moveDir = function (dir) { var moveDir$ = this.isNavigable ? this._navigator.moveDir$(dir) : - Observable_1.Observable.throw(new Error("Calling moveDir is not supported when viewer is not navigable.")); + rxjs_1.throwError(new Error("Calling moveDir is not supported when viewer is not navigable.")); return when.promise(function (resolve, reject) { moveDir$.subscribe(function (node) { resolve(node); @@ -47874,7 +57967,7 @@ var Viewer = /** @class */ (function (_super) { * @returns {Promise} 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 {AbortMapillaryError} When a subsequent move request is made + * @throws {@link AbortMapillaryError} When a subsequent move request is made * before the move to key call has completed. * * @example @@ -47887,7 +57980,7 @@ var Viewer = /** @class */ (function (_super) { Viewer.prototype.moveToKey = function (key) { var moveToKey$ = this.isNavigable ? this._navigator.moveToKey$(key) : - Observable_1.Observable.throw(new Error("Calling moveToKey is not supported when viewer is not navigable.")); + rxjs_1.throwError(new Error("Calling moveToKey is not supported when viewer is not navigable.")); return when.promise(function (resolve, reject) { moveToKey$.subscribe(function (node) { resolve(node); @@ -47896,12 +57989,60 @@ var Viewer = /** @class */ (function (_super) { }); }); }; + /** + * 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>} 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} basicPoint - Basic images coordinates to project. * @returns {Promise>} Promise to the pixel coordinates corresponding @@ -47937,7 +58078,6 @@ var Viewer = /** @class */ (function (_super) { */ Viewer.prototype.resize = function () { this._container.renderService.resize$.next(null); - this._componentController.resize(); }; /** * Set a bearer token for authenticated API requests of @@ -47969,7 +58109,7 @@ var Viewer = /** @class */ (function (_super) { Viewer.prototype.setAuthToken = function (token) { var setToken$ = this.isNavigable ? this._navigator.setToken$(token) : - Observable_1.Observable.throw(new Error("Calling setAuthToken is not supported when viewer is not navigable.")); + rxjs_1.throwError(new Error("Calling setAuthToken is not supported when viewer is not navigable.")); return when.promise(function (resolve, reject) { setToken$ .subscribe(function () { @@ -48036,12 +58176,30 @@ var Viewer = /** @class */ (function (_super) { * * 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} Promise that resolves after filter is applied. * * @example * ``` * viewer.setFilter(["==", "sequenceKey", ""]); + * + * // Other examples + * // viewer.setFilter(["==", "organizationKey", ""]); + * // viewer.setFilter(["in", "userKey", "", ""]); + * // viewer.setFilter(["==", "fullPano", true]); + * // viewer.setFilter([">=", "capturedAt", ]); * ``` */ Viewer.prototype.setFilter = function (filter) { @@ -48055,6 +58213,30 @@ var Viewer = /** @class */ (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. * @@ -48106,6 +58288,9 @@ var Viewer = /** @class */ (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} pixelPoint - Pixel coordinates to unproject. * @returns {Promise} Promise to the latLon corresponding to the pixel point. * @@ -48159,7 +58344,7 @@ var Viewer = /** @class */ (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 + * ({@link Node.computedCA}) from SfM, not the original EXIF compass * angle. * * @event @@ -48171,22 +58356,29 @@ var Viewer = /** @class */ (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 @@ -48196,32 +58388,32 @@ var Viewer = /** @class */ (function (_super) { /** * 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"; /** @@ -48253,26 +58445,45 @@ var Viewer = /** @class */ (function (_super) { 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":300,"../Viewer":301,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/concat":39,"rxjs/add/observable/defer":40,"rxjs/add/observable/empty":41,"rxjs/add/observable/from":42,"rxjs/add/observable/fromEvent":43,"rxjs/add/observable/fromPromise":44,"rxjs/add/observable/merge":45,"rxjs/add/observable/of":46,"rxjs/add/observable/throw":47,"rxjs/add/observable/timer":48,"rxjs/add/observable/zip":49,"rxjs/add/operator/auditTime":50,"rxjs/add/operator/buffer":51,"rxjs/add/operator/bufferCount":52,"rxjs/add/operator/bufferWhen":53,"rxjs/add/operator/catch":54,"rxjs/add/operator/combineLatest":55,"rxjs/add/operator/concat":56,"rxjs/add/operator/count":57,"rxjs/add/operator/debounceTime":58,"rxjs/add/operator/delay":59,"rxjs/add/operator/distinct":60,"rxjs/add/operator/distinctUntilChanged":61,"rxjs/add/operator/do":62,"rxjs/add/operator/expand":63,"rxjs/add/operator/filter":64,"rxjs/add/operator/finally":65,"rxjs/add/operator/first":66,"rxjs/add/operator/last":67,"rxjs/add/operator/map":68,"rxjs/add/operator/merge":69,"rxjs/add/operator/mergeAll":70,"rxjs/add/operator/mergeMap":71,"rxjs/add/operator/pairwise":72,"rxjs/add/operator/pluck":73,"rxjs/add/operator/publish":74,"rxjs/add/operator/publishReplay":75,"rxjs/add/operator/reduce":76,"rxjs/add/operator/retry":77,"rxjs/add/operator/sample":78,"rxjs/add/operator/scan":79,"rxjs/add/operator/share":80,"rxjs/add/operator/skip":81,"rxjs/add/operator/skipUntil":82,"rxjs/add/operator/skipWhile":83,"rxjs/add/operator/startWith":84,"rxjs/add/operator/switchMap":85,"rxjs/add/operator/take":86,"rxjs/add/operator/takeUntil":87,"rxjs/add/operator/takeWhile":88,"rxjs/add/operator/timeout":89,"rxjs/add/operator/withLatestFrom":90,"rxjs/add/operator/zip":91,"when":287}]},{},[295])(295) +},{"../Utils":301,"../Viewer":302,"rxjs":43,"rxjs/operators":241,"when":288}]},{},[296])(296) }); //# sourceMappingURL=mapillary.js.map