diff --git a/resources/html/webrtcgateway/js/sylkrtc.js b/resources/html/webrtcgateway/js/sylkrtc.js index bfaef70..a5ace24 100644 --- a/resources/html/webrtcgateway/js/sylkrtc.js +++ b/resources/html/webrtcgateway/js/sylkrtc.js @@ -1,4454 +1,4478 @@ /* - * sylkrtc.js v0.0.1 + * sylkrtc.js v0.1.2 * SylkServer WebRTC Gateway client library * Copyright 2015 AG Projects * License MIT */ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.sylkrtc = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o %s', this._state, newState); var oldState = this._state; this._state = newState; this.emit('stateChanged', oldState, newState); } }, { key: '_onOpen', // WebSocket callbacks value: function _onOpen() { clearTimeout(this._timer); this._timer = null; this._delay = INITIAL_DELAY; this._setState('connected'); } }, { key: '_onClose', value: function _onClose() { var _this5 = this; this._sock = null; if (this._timer) { clearTimeout(this._timer); this._timer = null; } // remove all accounts, the server no longer has them anyway this._accounts.clear(); this._setState('disconnected'); if (!this._closed) { this._delay = this._delay * 2; if (this._delay > Number.MAX_VALUE) { this._delay = INITIAL_DELAY; } DEBUG('Retrying connection in %s seconds', this._delay / 1000); this._timer = setTimeout(function () { _this5._connect(); }, this._delay); } else { this._setState('closed'); } } }, { key: '_onMessage', value: function _onMessage(event) { var message = JSON.parse(event.data); if (typeof message.sylkrtc === 'undefined') { DEBUG('Unrecognized message received'); return; } DEBUG('Received "%s" message: %o', message.sylkrtc, message); if (message.sylkrtc === 'event') { DEBUG('Received event: "%s"', message.event); switch (message.event) { case 'ready': this._setState('ready'); break; default: break; } } else if (message.sylkrtc === 'account_event') { var acc = this._accounts.get(message.account); if (!acc) { DEBUG('Account %s not found', message.account); return; } acc._handleEvent(message); } else if (message.sylkrtc === 'session_event') { var sessionId = message.session; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = this._accounts.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var acc = _step.value; var call = acc._calls.get(sessionId); if (call) { call._handleEvent(message); break; } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator['return']) { _iterator['return'](); } } finally { if (_didIteratorError) { throw _iteratorError; } } } } else if (message.sylkrtc === 'ack' || message.sylkrtc === 'error') { var transaction = message.transaction; var data = this._requests.get(transaction); if (!data) { DEBUG('Could not find transaction %s', transaction); return; } this._requests['delete'](transaction); DEBUG('Received "%s" for request: %o', message.sylkrtc, data.req); if (data.cb) { if (message.sylkrtc === 'ack') { data.cb(null); } else { data.cb(new Error(message.error)); } } } } }, { key: 'state', get: function get() { return this._state; } }]); return Connection; })(_events.EventEmitter); exports.Connection = Connection; }).call(this,require('_process')) },{"./account":1,"_process":7,"debug":9,"events":6,"node-uuid":12,"timers":8,"websocket":20}],4:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _debug = require('debug'); var _debug2 = _interopRequireDefault(_debug); var _rtcninja = require('rtcninja'); var _rtcninja2 = _interopRequireDefault(_rtcninja); var _connection = require('./connection'); // Public API function createConnection() { var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; if (!_rtcninja2['default'].hasWebRTC()) { throw new Error('WebRTC support not detected'); } var conn = new _connection.Connection(options); conn._initialize(); return conn; } // Some proxied functions from rtcninja function isWebRTCSupported() { return _rtcninja2['default'].hasWebRTC(); } function attachMediaStream(element, stream) { - _rtcninja2['default'].attachMediaStream(element, stream); + return _rtcninja2['default'].attachMediaStream(element, stream); } function closeMediaStream(stream) { _rtcninja2['default'].closeMediaStream(stream); } -exports.createConnection = createConnection; -exports.debug = _debug2['default']; -exports.attachMediaStream = attachMediaStream; -exports.closeMediaStream = closeMediaStream; -exports.isWebRTCSupported = isWebRTCSupported; +exports['default'] = { + createConnection: createConnection, + debug: _debug2['default'], + attachMediaStream: attachMediaStream, closeMediaStream: closeMediaStream, isWebRTCSupported: isWebRTCSupported +}; +module.exports = exports['default']; },{"./connection":3,"debug":9,"rtcninja":15}],5:[function(require,module,exports){ /* * JavaScript MD5 1.0.1 * https://github.com/blueimp/JavaScript-MD5 * * Copyright 2011, Sebastian Tschan * https://blueimp.net * * Licensed under the MIT license: * http://www.opensource.org/licenses/MIT * * Based on * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Digest Algorithm, as defined in RFC 1321. * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * Distributed under the BSD License * See http://pajhome.org.uk/crypt/md5 for more info. */ /*jslint bitwise: true */ /*global unescape, define */ (function ($) { 'use strict'; /* * Add integers, wrapping at 2^32. This uses 16-bit operations internally * to work around bugs in some JS interpreters. */ function safe_add(x, y) { var lsw = (x & 0xFFFF) + (y & 0xFFFF), msw = (x >> 16) + (y >> 16) + (lsw >> 16); return (msw << 16) | (lsw & 0xFFFF); } /* * Bitwise rotate a 32-bit number to the left. */ function bit_rol(num, cnt) { return (num << cnt) | (num >>> (32 - cnt)); } /* * These functions implement the four basic operations the algorithm uses. */ function md5_cmn(q, a, b, x, s, t) { return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b); } function md5_ff(a, b, c, d, x, s, t) { return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); } function md5_gg(a, b, c, d, x, s, t) { return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); } function md5_hh(a, b, c, d, x, s, t) { return md5_cmn(b ^ c ^ d, a, b, x, s, t); } function md5_ii(a, b, c, d, x, s, t) { return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); } /* * Calculate the MD5 of an array of little-endian words, and a bit length. */ function binl_md5(x, len) { /* append padding */ x[len >> 5] |= 0x80 << (len % 32); x[(((len + 64) >>> 9) << 4) + 14] = len; var i, olda, oldb, oldc, oldd, a = 1732584193, b = -271733879, c = -1732584194, d = 271733878; for (i = 0; i < x.length; i += 16) { olda = a; oldb = b; oldc = c; oldd = d; a = md5_ff(a, b, c, d, x[i], 7, -680876936); d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586); c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819); b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330); a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897); d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426); c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341); b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983); a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416); d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417); c = md5_ff(c, d, a, b, x[i + 10], 17, -42063); b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162); a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682); d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101); c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290); b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329); a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510); d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632); c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713); b = md5_gg(b, c, d, a, x[i], 20, -373897302); a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691); d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083); c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335); b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848); a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438); d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690); c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961); b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501); a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467); d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784); c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473); b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734); a = md5_hh(a, b, c, d, x[i + 5], 4, -378558); d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463); c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562); b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556); a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060); d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353); c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632); b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640); a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174); d = md5_hh(d, a, b, c, x[i], 11, -358537222); c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979); b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189); a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487); d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835); c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520); b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651); a = md5_ii(a, b, c, d, x[i], 6, -198630844); d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415); c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905); b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055); a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571); d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606); c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523); b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799); a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359); d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744); c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380); b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649); a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070); d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379); c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259); b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551); a = safe_add(a, olda); b = safe_add(b, oldb); c = safe_add(c, oldc); d = safe_add(d, oldd); } return [a, b, c, d]; } /* * Convert an array of little-endian words to a string */ function binl2rstr(input) { var i, output = ''; for (i = 0; i < input.length * 32; i += 8) { output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF); } return output; } /* * Convert a raw string to an array of little-endian words * Characters >255 have their high-byte silently ignored. */ function rstr2binl(input) { var i, output = []; output[(input.length >> 2) - 1] = undefined; for (i = 0; i < output.length; i += 1) { output[i] = 0; } for (i = 0; i < input.length * 8; i += 8) { output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32); } return output; } /* * Calculate the MD5 of a raw string */ function rstr_md5(s) { return binl2rstr(binl_md5(rstr2binl(s), s.length * 8)); } /* * Calculate the HMAC-MD5, of a key and some data (raw strings) */ function rstr_hmac_md5(key, data) { var i, bkey = rstr2binl(key), ipad = [], opad = [], hash; ipad[15] = opad[15] = undefined; if (bkey.length > 16) { bkey = binl_md5(bkey, key.length * 8); } for (i = 0; i < 16; i += 1) { ipad[i] = bkey[i] ^ 0x36363636; opad[i] = bkey[i] ^ 0x5C5C5C5C; } hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8); return binl2rstr(binl_md5(opad.concat(hash), 512 + 128)); } /* * Convert a raw string to a hex string */ function rstr2hex(input) { var hex_tab = '0123456789abcdef', output = '', x, i; for (i = 0; i < input.length; i += 1) { x = input.charCodeAt(i); output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F); } return output; } /* * Encode a string as utf-8 */ function str2rstr_utf8(input) { return unescape(encodeURIComponent(input)); } /* * Take string arguments and return either raw or hex encoded strings */ function raw_md5(s) { return rstr_md5(str2rstr_utf8(s)); } function hex_md5(s) { return rstr2hex(raw_md5(s)); } function raw_hmac_md5(k, d) { return rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)); } function hex_hmac_md5(k, d) { return rstr2hex(raw_hmac_md5(k, d)); } function md5(string, key, raw) { if (!key) { if (!raw) { return hex_md5(string); } return raw_md5(string); } if (!raw) { return hex_hmac_md5(key, string); } return raw_hmac_md5(key, string); } if (typeof define === 'function' && define.amd) { define(function () { return md5; }); } else { $.md5 = md5; } }(this)); },{}],6:[function(require,module,exports){ // 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. function EventEmitter() { this._events = this._events || {}; this._maxListeners = this._maxListeners || undefined; } module.exports = EventEmitter; // Backwards-compat with node 0.10.x EventEmitter.EventEmitter = EventEmitter; EventEmitter.prototype._events = undefined; EventEmitter.prototype._maxListeners = undefined; // By default EventEmitters will print a warning if more than 10 listeners are // added to it. This is a useful default which helps finding memory leaks. EventEmitter.defaultMaxListeners = 10; // Obviously not all Emitters should be limited to 10. This function allows // that to be increased. Set to zero for unlimited. EventEmitter.prototype.setMaxListeners = function(n) { if (!isNumber(n) || n < 0 || isNaN(n)) throw TypeError('n must be a positive number'); this._maxListeners = n; return this; }; EventEmitter.prototype.emit = function(type) { var er, handler, len, args, i, listeners; if (!this._events) this._events = {}; // If there is no 'error' event listener then throw. if (type === 'error') { if (!this._events.error || (isObject(this._events.error) && !this._events.error.length)) { er = arguments[1]; if (er instanceof Error) { throw er; // Unhandled 'error' event } throw TypeError('Uncaught, unspecified "error" event.'); } } handler = this._events[type]; if (isUndefined(handler)) return false; if (isFunction(handler)) { switch (arguments.length) { // fast cases case 1: handler.call(this); break; case 2: handler.call(this, arguments[1]); break; case 3: handler.call(this, arguments[1], arguments[2]); break; // slower default: len = arguments.length; args = new Array(len - 1); for (i = 1; i < len; i++) args[i - 1] = arguments[i]; handler.apply(this, args); } } else if (isObject(handler)) { len = arguments.length; args = new Array(len - 1); for (i = 1; i < len; i++) args[i - 1] = arguments[i]; listeners = handler.slice(); len = listeners.length; for (i = 0; i < len; i++) listeners[i].apply(this, args); } return true; }; EventEmitter.prototype.addListener = function(type, listener) { var m; if (!isFunction(listener)) throw TypeError('listener must be a function'); if (!this._events) this._events = {}; // To avoid recursion in the case that type === "newListener"! Before // adding it to the listeners, first emit "newListener". if (this._events.newListener) this.emit('newListener', type, isFunction(listener.listener) ? listener.listener : listener); if (!this._events[type]) // Optimize the case of one listener. Don't need the extra array object. this._events[type] = listener; else if (isObject(this._events[type])) // If we've already got an array, just append. this._events[type].push(listener); else // Adding the second element, need to change to array. this._events[type] = [this._events[type], listener]; // Check for listener leak if (isObject(this._events[type]) && !this._events[type].warned) { var m; if (!isUndefined(this._maxListeners)) { m = this._maxListeners; } else { m = EventEmitter.defaultMaxListeners; } if (m && m > 0 && this._events[type].length > m) { this._events[type].warned = true; console.error('(node) warning: possible EventEmitter memory ' + 'leak detected. %d listeners added. ' + 'Use emitter.setMaxListeners() to increase limit.', this._events[type].length); if (typeof console.trace === 'function') { // not supported in IE 10 console.trace(); } } } return this; }; EventEmitter.prototype.on = EventEmitter.prototype.addListener; EventEmitter.prototype.once = function(type, listener) { if (!isFunction(listener)) throw TypeError('listener must be a function'); var fired = false; function g() { this.removeListener(type, g); if (!fired) { fired = true; listener.apply(this, arguments); } } g.listener = listener; this.on(type, g); return this; }; // emits a 'removeListener' event iff the listener was removed EventEmitter.prototype.removeListener = function(type, listener) { var list, position, length, i; if (!isFunction(listener)) throw TypeError('listener must be a function'); if (!this._events || !this._events[type]) return this; list = this._events[type]; length = list.length; position = -1; if (list === listener || (isFunction(list.listener) && list.listener === listener)) { delete this._events[type]; if (this._events.removeListener) this.emit('removeListener', type, listener); } else if (isObject(list)) { for (i = length; i-- > 0;) { if (list[i] === listener || (list[i].listener && list[i].listener === listener)) { position = i; break; } } if (position < 0) return this; if (list.length === 1) { list.length = 0; delete this._events[type]; } else { list.splice(position, 1); } if (this._events.removeListener) this.emit('removeListener', type, listener); } return this; }; EventEmitter.prototype.removeAllListeners = function(type) { var key, listeners; if (!this._events) return this; // not listening for removeListener, no need to emit if (!this._events.removeListener) { if (arguments.length === 0) this._events = {}; else if (this._events[type]) delete this._events[type]; return this; } // emit removeListener for all listeners on all events if (arguments.length === 0) { for (key in this._events) { if (key === 'removeListener') continue; this.removeAllListeners(key); } this.removeAllListeners('removeListener'); this._events = {}; return this; } listeners = this._events[type]; if (isFunction(listeners)) { this.removeListener(type, listeners); } else { // LIFO order while (listeners.length) this.removeListener(type, listeners[listeners.length - 1]); } delete this._events[type]; return this; }; EventEmitter.prototype.listeners = function(type) { var ret; if (!this._events || !this._events[type]) ret = []; else if (isFunction(this._events[type])) ret = [this._events[type]]; else ret = this._events[type].slice(); return ret; }; EventEmitter.listenerCount = function(emitter, type) { var ret; if (!emitter._events || !emitter._events[type]) ret = 0; else if (isFunction(emitter._events[type])) ret = 1; else ret = emitter._events[type].length; return ret; }; function isFunction(arg) { return typeof arg === 'function'; } function isNumber(arg) { return typeof arg === 'number'; } function isObject(arg) { return typeof arg === 'object' && arg !== null; } function isUndefined(arg) { return arg === void 0; } },{}],7:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); } else { queueIndex = -1; } if (queue.length) { drainQueue(); } } function drainQueue() { if (draining) { return; } var timeout = setTimeout(cleanUpNextTick); draining = true; var len = queue.length; while(len) { currentQueue = queue; queue = []; while (++queueIndex < len) { currentQueue[queueIndex].run(); } queueIndex = -1; len = queue.length; } currentQueue = null; draining = false; clearTimeout(timeout); } process.nextTick = function (fun) { var args = new Array(arguments.length - 1); if (arguments.length > 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { setTimeout(drainQueue, 0); } }; // v8 likes predictible objects function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; // empty string to avoid regexp issues process.versions = {}; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.binding = function (name) { throw new Error('process.binding is not supported'); }; // TODO(shtylman) process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function() { return 0; }; },{}],8:[function(require,module,exports){ var nextTick = require('process/browser.js').nextTick; var apply = Function.prototype.apply; var slice = Array.prototype.slice; var immediateIds = {}; var nextImmediateId = 0; // DOM APIs, for completeness exports.setTimeout = function() { return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); }; exports.setInterval = function() { return new Timeout(apply.call(setInterval, window, arguments), clearInterval); }; exports.clearTimeout = exports.clearInterval = function(timeout) { timeout.close(); }; function Timeout(id, clearFn) { this._id = id; this._clearFn = clearFn; } Timeout.prototype.unref = Timeout.prototype.ref = function() {}; Timeout.prototype.close = function() { this._clearFn.call(window, this._id); }; // Does not start the time, just sets up the members needed. exports.enroll = function(item, msecs) { clearTimeout(item._idleTimeoutId); item._idleTimeout = msecs; }; exports.unenroll = function(item) { clearTimeout(item._idleTimeoutId); item._idleTimeout = -1; }; exports._unrefActive = exports.active = function(item) { clearTimeout(item._idleTimeoutId); var msecs = item._idleTimeout; if (msecs >= 0) { item._idleTimeoutId = setTimeout(function onTimeout() { if (item._onTimeout) item._onTimeout(); }, msecs); } }; // That's not how node.js implements it but the exposed api is the same. exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { var id = nextImmediateId++; var args = arguments.length < 2 ? false : slice.call(arguments, 1); immediateIds[id] = true; nextTick(function onNextTick() { if (immediateIds[id]) { // fn.call() is faster so we optimize for the common use-case // @see http://jsperf.com/call-apply-segu if (args) { fn.apply(null, args); } else { fn.call(null); } // Prevent ids from leaking exports.clearImmediate(id); } }); return id; }; exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { delete immediateIds[id]; }; },{"process/browser.js":7}],9:[function(require,module,exports){ /** * This is the web browser implementation of `debug()`. * * Expose `debug()` as the module. */ exports = module.exports = require('./debug'); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; exports.load = load; exports.useColors = useColors; exports.storage = 'undefined' != typeof chrome && 'undefined' != typeof chrome.storage ? chrome.storage.local : localstorage(); /** * Colors. */ exports.colors = [ 'lightseagreen', 'forestgreen', 'goldenrod', 'dodgerblue', 'darkorchid', 'crimson' ]; /** * Currently only WebKit-based Web Inspectors, Firefox >= v31, * and the Firebug extension (any Firefox version) are known * to support "%c" CSS customizations. * * TODO: add a `localStorage` variable to explicitly enable/disable colors */ function useColors() { // is webkit? http://stackoverflow.com/a/16459606/376773 return ('WebkitAppearance' in document.documentElement.style) || // is firebug? http://stackoverflow.com/a/398120/376773 (window.console && (console.firebug || (console.exception && console.table))) || // is firefox >= v31? // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages (navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31); } /** * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. */ exports.formatters.j = function(v) { return JSON.stringify(v); }; /** * Colorize log arguments if enabled. * * @api public */ function formatArgs() { var args = arguments; var useColors = this.useColors; args[0] = (useColors ? '%c' : '') + this.namespace + (useColors ? ' %c' : ' ') + args[0] + (useColors ? '%c ' : ' ') + '+' + exports.humanize(this.diff); if (!useColors) return args; var c = 'color: ' + this.color; args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1)); // the final "%c" is somewhat tricky, because there could be other // arguments passed either before or after the %c, so we need to // figure out the correct index to insert the CSS into var index = 0; var lastC = 0; args[0].replace(/%[a-z%]/g, function(match) { if ('%%' === match) return; index++; if ('%c' === match) { // we only are interested in the *last* %c // (the user may have provided their own) lastC = index; } }); args.splice(lastC, 0, c); return args; } /** * Invokes `console.log()` when available. * No-op when `console.log` is not a "function". * * @api public */ function log() { // this hackery is required for IE8/9, where // the `console.log` function doesn't have 'apply' return 'object' === typeof console && console.log && Function.prototype.apply.call(console.log, console, arguments); } /** * Save `namespaces`. * * @param {String} namespaces * @api private */ function save(namespaces) { try { if (null == namespaces) { exports.storage.removeItem('debug'); } else { exports.storage.debug = namespaces; } } catch(e) {} } /** * Load `namespaces`. * * @return {String} returns the previously persisted debug modes * @api private */ function load() { var r; try { r = exports.storage.debug; } catch(e) {} return r; } /** * Enable namespaces listed in `localStorage.debug` initially. */ exports.enable(load()); /** * Localstorage attempts to return the localstorage. * * This is necessary because safari throws * when a user disables cookies/localstorage * and you attempt to access it. * * @return {LocalStorage} * @api private */ function localstorage(){ try { return window.localStorage; } catch (e) {} } },{"./debug":10}],10:[function(require,module,exports){ /** * This is the common logic for both the Node.js and web browser * implementations of `debug()`. * * Expose `debug()` as the module. */ exports = module.exports = debug; exports.coerce = coerce; exports.disable = disable; exports.enable = enable; exports.enabled = enabled; exports.humanize = require('ms'); /** * The currently active debug mode names, and names to skip. */ exports.names = []; exports.skips = []; /** * Map of special "%n" handling functions, for the debug "format" argument. * * Valid key names are a single, lowercased letter, i.e. "n". */ exports.formatters = {}; /** * Previously assigned color. */ var prevColor = 0; /** * Previous log timestamp. */ var prevTime; /** * Select a color. * * @return {Number} * @api private */ function selectColor() { return exports.colors[prevColor++ % exports.colors.length]; } /** * Create a debugger with the given `namespace`. * * @param {String} namespace * @return {Function} * @api public */ function debug(namespace) { // define the `disabled` version function disabled() { } disabled.enabled = false; // define the `enabled` version function enabled() { var self = enabled; // set `diff` timestamp var curr = +new Date(); var ms = curr - (prevTime || curr); self.diff = ms; self.prev = prevTime; self.curr = curr; prevTime = curr; // add the `color` if not set if (null == self.useColors) self.useColors = exports.useColors(); if (null == self.color && self.useColors) self.color = selectColor(); var args = Array.prototype.slice.call(arguments); args[0] = exports.coerce(args[0]); if ('string' !== typeof args[0]) { // anything else let's inspect with %o args = ['%o'].concat(args); } // apply any `formatters` transformations var index = 0; args[0] = args[0].replace(/%([a-z%])/g, function(match, format) { // if we encounter an escaped % then don't increase the array index if (match === '%%') return match; index++; var formatter = exports.formatters[format]; if ('function' === typeof formatter) { var val = args[index]; match = formatter.call(self, val); // now we need to remove `args[index]` since it's inlined in the `format` args.splice(index, 1); index--; } return match; }); if ('function' === typeof exports.formatArgs) { args = exports.formatArgs.apply(self, args); } var logFn = enabled.log || exports.log || console.log.bind(console); logFn.apply(self, args); } enabled.enabled = true; var fn = exports.enabled(namespace) ? enabled : disabled; fn.namespace = namespace; return fn; } /** * Enables a debug mode by namespaces. This can include modes * separated by a colon and wildcards. * * @param {String} namespaces * @api public */ function enable(namespaces) { exports.save(namespaces); var split = (namespaces || '').split(/[\s,]+/); var len = split.length; for (var i = 0; i < len; i++) { if (!split[i]) continue; // ignore empty strings namespaces = split[i].replace(/\*/g, '.*?'); if (namespaces[0] === '-') { exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); } else { exports.names.push(new RegExp('^' + namespaces + '$')); } } } /** * Disable debug output. * * @api public */ function disable() { exports.enable(''); } /** * Returns true if the given mode name is enabled, false otherwise. * * @param {String} name * @return {Boolean} * @api public */ function enabled(name) { var i, len; for (i = 0, len = exports.skips.length; i < len; i++) { if (exports.skips[i].test(name)) { return false; } } for (i = 0, len = exports.names.length; i < len; i++) { if (exports.names[i].test(name)) { return true; } } return false; } /** * Coerce `val`. * * @param {Mixed} val * @return {Mixed} * @api private */ function coerce(val) { if (val instanceof Error) return val.stack || val.message; return val; } },{"ms":11}],11:[function(require,module,exports){ /** * Helpers. */ var s = 1000; var m = s * 60; var h = m * 60; var d = h * 24; var y = d * 365.25; /** * Parse or format the given `val`. * * Options: * * - `long` verbose formatting [false] * * @param {String|Number} val * @param {Object} options * @return {String|Number} * @api public */ module.exports = function(val, options){ options = options || {}; if ('string' == typeof val) return parse(val); return options.long ? long(val) : short(val); }; /** * Parse the given `str` and return milliseconds. * * @param {String} str * @return {Number} * @api private */ function parse(str) { str = '' + str; if (str.length > 10000) return; var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str); if (!match) return; var n = parseFloat(match[1]); var type = (match[2] || 'ms').toLowerCase(); switch (type) { case 'years': case 'year': case 'yrs': case 'yr': case 'y': return n * y; case 'days': case 'day': case 'd': return n * d; case 'hours': case 'hour': case 'hrs': case 'hr': case 'h': return n * h; case 'minutes': case 'minute': case 'mins': case 'min': case 'm': return n * m; case 'seconds': case 'second': case 'secs': case 'sec': case 's': return n * s; case 'milliseconds': case 'millisecond': case 'msecs': case 'msec': case 'ms': return n; } } /** * Short format for `ms`. * * @param {Number} ms * @return {String} * @api private */ function short(ms) { if (ms >= d) return Math.round(ms / d) + 'd'; if (ms >= h) return Math.round(ms / h) + 'h'; if (ms >= m) return Math.round(ms / m) + 'm'; if (ms >= s) return Math.round(ms / s) + 's'; return ms + 'ms'; } /** * Long format for `ms`. * * @param {Number} ms * @return {String} * @api private */ function long(ms) { return plural(ms, d, 'day') || plural(ms, h, 'hour') || plural(ms, m, 'minute') || plural(ms, s, 'second') || ms + ' ms'; } /** * Pluralization helper. */ function plural(ms, n, name) { if (ms < n) return; if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; return Math.ceil(ms / n) + ' ' + name + 's'; } },{}],12:[function(require,module,exports){ // uuid.js // // Copyright (c) 2010-2012 Robert Kieffer // MIT License - http://opensource.org/licenses/mit-license.php (function() { var _global = this; // Unique ID creation requires a high quality random # generator. We feature // detect to determine the best RNG source, normalizing to a function that // returns 128-bits of randomness, since that's what's usually required var _rng; // Node.js crypto-based RNG - http://nodejs.org/docs/v0.6.2/api/crypto.html // // Moderately fast, high quality if (typeof(_global.require) == 'function') { try { var _rb = _global.require('crypto').randomBytes; _rng = _rb && function() {return _rb(16);}; } catch(e) {} } if (!_rng && _global.crypto && crypto.getRandomValues) { // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto // // Moderately fast, high quality var _rnds8 = new Uint8Array(16); _rng = function whatwgRNG() { crypto.getRandomValues(_rnds8); return _rnds8; }; } if (!_rng) { // Math.random()-based (RNG) // // If all else fails, use Math.random(). It's fast, but is of unspecified // quality. var _rnds = new Array(16); _rng = function() { for (var i = 0, r; i < 16; i++) { if ((i & 0x03) === 0) r = Math.random() * 0x100000000; _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff; } return _rnds; }; } // Buffer class to use var BufferClass = typeof(_global.Buffer) == 'function' ? _global.Buffer : Array; // Maps for number <-> hex string conversion var _byteToHex = []; var _hexToByte = {}; for (var i = 0; i < 256; i++) { _byteToHex[i] = (i + 0x100).toString(16).substr(1); _hexToByte[_byteToHex[i]] = i; } // **`parse()` - Parse a UUID into it's component bytes** function parse(s, buf, offset) { var i = (buf && offset) || 0, ii = 0; buf = buf || []; s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) { if (ii < 16) { // Don't overflow! buf[i + ii++] = _hexToByte[oct]; } }); // Zero out remaining bytes if string was short while (ii < 16) { buf[i + ii++] = 0; } return buf; } // **`unparse()` - Convert UUID byte array (ala parse()) into a string** function unparse(buf, offset) { var i = offset || 0, bth = _byteToHex; return bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + '-' + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]]; } // **`v1()` - Generate time-based UUID** // // Inspired by https://github.com/LiosK/UUID.js // and http://docs.python.org/library/uuid.html // random #'s we need to init node and clockseq var _seedBytes = _rng(); // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) var _nodeId = [ _seedBytes[0] | 0x01, _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5] ]; // Per 4.2.2, randomize (14 bit) clockseq var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff; // Previous uuid creation time var _lastMSecs = 0, _lastNSecs = 0; // See https://github.com/broofa/node-uuid for API details function v1(options, buf, offset) { var i = buf && offset || 0; var b = buf || []; options = options || {}; var clockseq = options.clockseq != null ? options.clockseq : _clockseq; // UUID timestamps are 100 nano-second units since the Gregorian epoch, // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. var msecs = options.msecs != null ? options.msecs : new Date().getTime(); // Per 4.2.1.2, use count of uuid's generated during the current clock // cycle to simulate higher resolution clock var nsecs = options.nsecs != null ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000; // Per 4.2.1.2, Bump clockseq on clock regression if (dt < 0 && options.clockseq == null) { clockseq = clockseq + 1 & 0x3fff; } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new // time interval if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) { nsecs = 0; } // Per 4.2.1.2 Throw error if too many uuids are requested if (nsecs >= 10000) { throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec'); } _lastMSecs = msecs; _lastNSecs = nsecs; _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch msecs += 12219292800000; // `time_low` var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; b[i++] = tl >>> 24 & 0xff; b[i++] = tl >>> 16 & 0xff; b[i++] = tl >>> 8 & 0xff; b[i++] = tl & 0xff; // `time_mid` var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff; b[i++] = tmh >>> 8 & 0xff; b[i++] = tmh & 0xff; // `time_high_and_version` b[i++] = tmh >>> 24 & 0xf | 0x10; // include version b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low` b[i++] = clockseq & 0xff; // `node` var node = options.node || _nodeId; for (var n = 0; n < 6; n++) { b[i + n] = node[n]; } return buf ? buf : unparse(b); } // **`v4()` - Generate random UUID** // See https://github.com/broofa/node-uuid for API details function v4(options, buf, offset) { // Deprecated - 'format' argument, as supported in v1.2 var i = buf && offset || 0; if (typeof(options) == 'string') { buf = options == 'binary' ? new BufferClass(16) : null; options = null; } options = options || {}; var rnds = options.random || (options.rng || _rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` rnds[6] = (rnds[6] & 0x0f) | 0x40; rnds[8] = (rnds[8] & 0x3f) | 0x80; // Copy bytes to buffer, if provided if (buf) { for (var ii = 0; ii < 16; ii++) { buf[i + ii] = rnds[ii]; } } return buf || unparse(rnds); } // Export public API var uuid = v4; uuid.v1 = v1; uuid.v4 = v4; uuid.parse = parse; uuid.unparse = unparse; uuid.BufferClass = BufferClass; if (typeof(module) != 'undefined' && module.exports) { // Publish as node.js module module.exports = uuid; } else if (typeof define === 'function' && define.amd) { // Publish as AMD module define(function() {return uuid;}); } else { // Publish as global (in browsers) var _previousRoot = _global.uuid; // **`noConflict()` - (browser only) to reset global 'uuid' var** uuid.noConflict = function() { _global.uuid = _previousRoot; return uuid; }; _global.uuid = uuid; } }).call(this); },{}],13:[function(require,module,exports){ (function (global){ 'use strict'; // Expose the Adapter function/object. module.exports = Adapter; // Dependencies -var browser = require('bowser').browser, +var browser = require('bowser'), debug = require('debug')('rtcninja:Adapter'), debugerror = require('debug')('rtcninja:ERROR:Adapter'), // Internal vars getUserMedia = null, RTCPeerConnection = null, RTCSessionDescription = null, RTCIceCandidate = null, MediaStreamTrack = null, getMediaDevices = null, attachMediaStream = null, canRenegotiate = false, oldSpecRTCOfferOptions = false, browserVersion = Number(browser.version) || 0, - isDesktop = !!(!browser.mobile || !browser.tablet), + isDesktop = !!(!browser.mobile && !browser.tablet), hasWebRTC = false, virtGlobal, virtNavigator; debugerror.log = console.warn.bind(console); // Dirty trick to get this library working in a Node-webkit env with browserified libs virtGlobal = global.window || global; // Don't fail in Node virtNavigator = virtGlobal.navigator || {}; // Constructor. function Adapter(options) { // Chrome desktop, Chrome Android, Opera desktop, Opera Android, Android native browser // or generic Webkit browser. if ( (isDesktop && browser.chrome && browserVersion >= 32) || (browser.android && browser.chrome && browserVersion >= 39) || (isDesktop && browser.opera && browserVersion >= 27) || (browser.android && browser.opera && browserVersion >= 24) || (browser.android && browser.webkit && !browser.chrome && browserVersion >= 37) || (virtNavigator.webkitGetUserMedia && virtGlobal.webkitRTCPeerConnection) ) { hasWebRTC = true; getUserMedia = virtNavigator.webkitGetUserMedia.bind(virtNavigator); RTCPeerConnection = virtGlobal.webkitRTCPeerConnection; RTCSessionDescription = virtGlobal.RTCSessionDescription; RTCIceCandidate = virtGlobal.RTCIceCandidate; MediaStreamTrack = virtGlobal.MediaStreamTrack; if (MediaStreamTrack && MediaStreamTrack.getSources) { getMediaDevices = MediaStreamTrack.getSources.bind(MediaStreamTrack); } else if (virtNavigator.getMediaDevices) { getMediaDevices = virtNavigator.getMediaDevices.bind(virtNavigator); } attachMediaStream = function (element, stream) { element.src = URL.createObjectURL(stream); return element; }; canRenegotiate = true; oldSpecRTCOfferOptions = false; // Firefox desktop, Firefox Android. } else if ( (isDesktop && browser.firefox && browserVersion >= 22) || (browser.android && browser.firefox && browserVersion >= 33) || (virtNavigator.mozGetUserMedia && virtGlobal.mozRTCPeerConnection) ) { hasWebRTC = true; getUserMedia = virtNavigator.mozGetUserMedia.bind(virtNavigator); RTCPeerConnection = virtGlobal.mozRTCPeerConnection; RTCSessionDescription = virtGlobal.mozRTCSessionDescription; RTCIceCandidate = virtGlobal.mozRTCIceCandidate; MediaStreamTrack = virtGlobal.MediaStreamTrack; attachMediaStream = function (element, stream) { element.src = URL.createObjectURL(stream); return element; }; canRenegotiate = false; oldSpecRTCOfferOptions = false; // WebRTC plugin required. For example IE or Safari with the Temasys plugin. } else if ( options.plugin && typeof options.plugin.isRequired === 'function' && options.plugin.isRequired() && typeof options.plugin.isInstalled === 'function' && options.plugin.isInstalled() ) { var pluginiface = options.plugin.interface; hasWebRTC = true; getUserMedia = pluginiface.getUserMedia; RTCPeerConnection = pluginiface.RTCPeerConnection; RTCSessionDescription = pluginiface.RTCSessionDescription; RTCIceCandidate = pluginiface.RTCIceCandidate; MediaStreamTrack = pluginiface.MediaStreamTrack; if (MediaStreamTrack && MediaStreamTrack.getSources) { getMediaDevices = MediaStreamTrack.getSources.bind(MediaStreamTrack); } else if (virtNavigator.getMediaDevices) { getMediaDevices = virtNavigator.getMediaDevices.bind(virtNavigator); } attachMediaStream = pluginiface.attachMediaStream; canRenegotiate = pluginiface.canRenegotiate; oldSpecRTCOfferOptions = true; // TODO: Update when fixed in the plugin. // Best effort (may be adater.js is loaded). } else if (virtNavigator.getUserMedia && virtGlobal.RTCPeerConnection) { hasWebRTC = true; getUserMedia = virtNavigator.getUserMedia.bind(virtNavigator); RTCPeerConnection = virtGlobal.RTCPeerConnection; RTCSessionDescription = virtGlobal.RTCSessionDescription; RTCIceCandidate = virtGlobal.RTCIceCandidate; MediaStreamTrack = virtGlobal.MediaStreamTrack; if (MediaStreamTrack && MediaStreamTrack.getSources) { getMediaDevices = MediaStreamTrack.getSources.bind(MediaStreamTrack); } else if (virtNavigator.getMediaDevices) { getMediaDevices = virtNavigator.getMediaDevices.bind(virtNavigator); } attachMediaStream = virtGlobal.attachMediaStream || function (element, stream) { element.src = URL.createObjectURL(stream); return element; }; canRenegotiate = false; oldSpecRTCOfferOptions = false; } function throwNonSupported(item) { return function () { throw new Error('rtcninja: WebRTC not supported, missing ' + item + ' [browser: ' + browser.name + ' ' + browser.version + ']'); }; } // Public API. // Expose a WebRTC checker. Adapter.hasWebRTC = function () { return hasWebRTC; }; // Expose getUserMedia. if (getUserMedia) { Adapter.getUserMedia = function (constraints, successCallback, errorCallback) { debug('getUserMedia() | constraints: %o', constraints); try { getUserMedia(constraints, function (stream) { debug('getUserMedia() | success'); if (successCallback) { successCallback(stream); } }, function (error) { debug('getUserMedia() | error:', error); if (errorCallback) { errorCallback(error); } } ); } catch (error) { debugerror('getUserMedia() | error:', error); if (errorCallback) { errorCallback(error); } } }; } else { Adapter.getUserMedia = function (constraints, successCallback, errorCallback) { debugerror('getUserMedia() | WebRTC not supported'); if (errorCallback) { errorCallback(new Error('rtcninja: WebRTC not supported, missing ' + 'getUserMedia [browser: ' + browser.name + ' ' + browser.version + ']')); } else { throwNonSupported('getUserMedia'); } }; } // Expose RTCPeerConnection. Adapter.RTCPeerConnection = RTCPeerConnection || throwNonSupported('RTCPeerConnection'); // Expose RTCSessionDescription. Adapter.RTCSessionDescription = RTCSessionDescription || throwNonSupported('RTCSessionDescription'); // Expose RTCIceCandidate. Adapter.RTCIceCandidate = RTCIceCandidate || throwNonSupported('RTCIceCandidate'); // Expose MediaStreamTrack. Adapter.MediaStreamTrack = MediaStreamTrack || throwNonSupported('MediaStreamTrack'); // Expose getMediaDevices. Adapter.getMediaDevices = getMediaDevices; // Expose MediaStreamTrack. Adapter.attachMediaStream = attachMediaStream || throwNonSupported('attachMediaStream'); // Expose canRenegotiate attribute. Adapter.canRenegotiate = canRenegotiate; // Expose closeMediaStream. Adapter.closeMediaStream = function (stream) { if (!stream) { return; } // Latest spec states that MediaStream has no stop() method and instead must // call stop() on every MediaStreamTrack. if (MediaStreamTrack && MediaStreamTrack.prototype && MediaStreamTrack.prototype.stop) { debug('closeMediaStream() | calling stop() on all the MediaStreamTrack'); var tracks, i, len; if (stream.getTracks) { tracks = stream.getTracks(); for (i = 0, len = tracks.length; i < len; i += 1) { tracks[i].stop(); } } else { tracks = stream.getAudioTracks(); for (i = 0, len = tracks.length; i < len; i += 1) { tracks[i].stop(); } tracks = stream.getVideoTracks(); for (i = 0, len = tracks.length; i < len; i += 1) { tracks[i].stop(); } } // Deprecated by the spec, but still in use. } else if (typeof stream.stop === 'function') { debug('closeMediaStream() | calling stop() on the MediaStream'); stream.stop(); } }; // Expose fixPeerConnectionConfig. Adapter.fixPeerConnectionConfig = function (pcConfig) { var i, len, iceServer, hasUrls, hasUrl; if (!Array.isArray(pcConfig.iceServers)) { pcConfig.iceServers = []; } for (i = 0, len = pcConfig.iceServers.length; i < len; i += 1) { iceServer = pcConfig.iceServers[i]; hasUrls = iceServer.hasOwnProperty('urls'); hasUrl = iceServer.hasOwnProperty('url'); if (typeof iceServer === 'object') { // Has .urls but not .url, so add .url with a single string value. if (hasUrls && !hasUrl) { iceServer.url = (Array.isArray(iceServer.urls) ? iceServer.urls[0] : iceServer.urls); // Has .url but not .urls, so add .urls with same value. } else if (!hasUrls && hasUrl) { iceServer.urls = (Array.isArray(iceServer.url) ? iceServer.url.slice() : iceServer.url); } // Ensure .url is a single string. if (hasUrl && Array.isArray(iceServer.url)) { iceServer.url = iceServer.url[0]; } } } }; // Expose fixRTCOfferOptions. Adapter.fixRTCOfferOptions = function (options) { options = options || {}; // New spec. if (!oldSpecRTCOfferOptions) { if (options.mandatory && options.mandatory.OfferToReceiveAudio) { options.offerToReceiveAudio = 1; } if (options.mandatory && options.mandatory.OfferToReceiveVideo) { options.offerToReceiveVideo = 1; } delete options.mandatory; // Old spec. } else { if (options.offerToReceiveAudio) { options.mandatory = options.mandatory || {}; options.mandatory.OfferToReceiveAudio = true; } if (options.offerToReceiveVideo) { options.mandatory = options.mandatory || {}; options.mandatory.OfferToReceiveVideo = true; } } }; return Adapter; } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"bowser":17,"debug":9}],14:[function(require,module,exports){ 'use strict'; // Expose the RTCPeerConnection class. module.exports = RTCPeerConnection; // Dependencies. var merge = require('merge'), debug = require('debug')('rtcninja:RTCPeerConnection'), debugerror = require('debug')('rtcninja:ERROR:RTCPeerConnection'), Adapter = require('./Adapter'), // Internal constants. C = { REGEXP_NORMALIZED_CANDIDATE: new RegExp(/^candidate:/i), REGEXP_FIX_CANDIDATE: new RegExp(/(^a=|\r|\n)/gi), REGEXP_RELAY_CANDIDATE: new RegExp(/ relay /i), REGEXP_SDP_CANDIDATES: new RegExp(/^a=candidate:.*\r\n/igm), REGEXP_SDP_NON_RELAY_CANDIDATES: new RegExp(/^a=candidate:(.(?!relay ))*\r\n/igm) }, // Internal variables. VAR = { normalizeCandidate: null }; debugerror.log = console.warn.bind(console); // Constructor function RTCPeerConnection(pcConfig, pcConstraints) { debug('new | pcConfig: %o', pcConfig); // Set this.pcConfig and this.options. setConfigurationAndOptions.call(this, pcConfig); // NOTE: Deprecated pcConstraints argument. this.pcConstraints = pcConstraints; // Own version of the localDescription. this.ourLocalDescription = null; // Latest values of PC attributes to avoid events with same value. this.ourSignalingState = null; this.ourIceConnectionState = null; this.ourIceGatheringState = null; // Timer for options.gatheringTimeout. this.timerGatheringTimeout = null; // Timer for options.gatheringTimeoutAfterRelay. this.timerGatheringTimeoutAfterRelay = null; // Flag to ignore new gathered ICE candidates. this.ignoreIceGathering = false; // Flag set when closed. this.closed = false; // Set RTCPeerConnection. setPeerConnection.call(this); // Set properties. setProperties.call(this); } // Public API. RTCPeerConnection.prototype.createOffer = function (successCallback, failureCallback, options) { debug('createOffer()'); var self = this; Adapter.fixRTCOfferOptions(options); this.pc.createOffer( function (offer) { if (isClosed.call(self)) { return; } debug('createOffer() | success'); if (successCallback) { successCallback(offer); } }, function (error) { if (isClosed.call(self)) { return; } debugerror('createOffer() | error:', error); if (failureCallback) { failureCallback(error); } }, options ); }; RTCPeerConnection.prototype.createAnswer = function (successCallback, failureCallback, options) { debug('createAnswer()'); var self = this; this.pc.createAnswer( function (answer) { if (isClosed.call(self)) { return; } debug('createAnswer() | success'); if (successCallback) { successCallback(answer); } }, function (error) { if (isClosed.call(self)) { return; } debugerror('createAnswer() | error:', error); if (failureCallback) { failureCallback(error); } }, options ); }; RTCPeerConnection.prototype.setLocalDescription = function (description, successCallback, failureCallback) { debug('setLocalDescription()'); var self = this; this.pc.setLocalDescription( description, // success. function () { if (isClosed.call(self)) { return; } debug('setLocalDescription() | success'); // Clear gathering timers. clearTimeout(self.timerGatheringTimeout); delete self.timerGatheringTimeout; clearTimeout(self.timerGatheringTimeoutAfterRelay); delete self.timerGatheringTimeoutAfterRelay; runTimerGatheringTimeout(); if (successCallback) { successCallback(); } }, // failure function (error) { if (isClosed.call(self)) { return; } debugerror('setLocalDescription() | error:', error); if (failureCallback) { failureCallback(error); } } ); // Enable (again) ICE gathering. this.ignoreIceGathering = false; // Handle gatheringTimeout. function runTimerGatheringTimeout() { if (typeof self.options.gatheringTimeout !== 'number') { return; } // If setLocalDescription was already called, it may happen that // ICE gathering is not needed, so don't run this timer. if (self.pc.iceGatheringState === 'complete') { return; } debug('setLocalDescription() | ending gathering in %d ms (gatheringTimeout option)', self.options.gatheringTimeout); self.timerGatheringTimeout = setTimeout(function () { if (isClosed.call(self)) { return; } debug('forced end of candidates after gatheringTimeout timeout'); // Clear gathering timers. delete self.timerGatheringTimeout; clearTimeout(self.timerGatheringTimeoutAfterRelay); delete self.timerGatheringTimeoutAfterRelay; // Ignore new candidates. self.ignoreIceGathering = true; if (self.onicecandidate) { self.onicecandidate({ candidate: null }, null); } }, self.options.gatheringTimeout); } }; RTCPeerConnection.prototype.setRemoteDescription = function (description, successCallback, failureCallback) { debug('setRemoteDescription()'); var self = this; this.pc.setRemoteDescription( description, function () { if (isClosed.call(self)) { return; } debug('setRemoteDescription() | success'); if (successCallback) { successCallback(); } }, function (error) { if (isClosed.call(self)) { return; } debugerror('setRemoteDescription() | error:', error); if (failureCallback) { failureCallback(error); } } ); }; RTCPeerConnection.prototype.updateIce = function (pcConfig) { debug('updateIce() | pcConfig: %o', pcConfig); // Update this.pcConfig and this.options. setConfigurationAndOptions.call(this, pcConfig); this.pc.updateIce(this.pcConfig); // Enable (again) ICE gathering. this.ignoreIceGathering = false; }; RTCPeerConnection.prototype.addIceCandidate = function (candidate, successCallback, failureCallback) { debug('addIceCandidate() | candidate: %o', candidate); var self = this; this.pc.addIceCandidate( candidate, function () { if (isClosed.call(self)) { return; } debug('addIceCandidate() | success'); if (successCallback) { successCallback(); } }, function (error) { if (isClosed.call(self)) { return; } debugerror('addIceCandidate() | error:', error); if (failureCallback) { failureCallback(error); } } ); }; RTCPeerConnection.prototype.getConfiguration = function () { debug('getConfiguration()'); return this.pc.getConfiguration(); }; RTCPeerConnection.prototype.getLocalStreams = function () { debug('getLocalStreams()'); return this.pc.getLocalStreams(); }; RTCPeerConnection.prototype.getRemoteStreams = function () { debug('getRemoteStreams()'); return this.pc.getRemoteStreams(); }; RTCPeerConnection.prototype.getStreamById = function (streamId) { debug('getStreamById() | streamId: %s', streamId); return this.pc.getStreamById(streamId); }; RTCPeerConnection.prototype.addStream = function (stream) { debug('addStream() | stream: %s', stream); this.pc.addStream(stream); }; RTCPeerConnection.prototype.removeStream = function (stream) { debug('removeStream() | stream: %o', stream); this.pc.removeStream(stream); }; RTCPeerConnection.prototype.close = function () { debug('close()'); this.closed = true; // Clear gathering timers. clearTimeout(this.timerGatheringTimeout); delete this.timerGatheringTimeout; clearTimeout(this.timerGatheringTimeoutAfterRelay); delete this.timerGatheringTimeoutAfterRelay; this.pc.close(); }; RTCPeerConnection.prototype.createDataChannel = function () { debug('createDataChannel()'); return this.pc.createDataChannel.apply(this.pc, arguments); }; RTCPeerConnection.prototype.createDTMFSender = function (track) { debug('createDTMFSender()'); return this.pc.createDTMFSender(track); }; RTCPeerConnection.prototype.getStats = function () { debug('getStats()'); return this.pc.getStats.apply(this.pc, arguments); }; RTCPeerConnection.prototype.setIdentityProvider = function () { debug('setIdentityProvider()'); return this.pc.setIdentityProvider.apply(this.pc, arguments); }; RTCPeerConnection.prototype.getIdentityAssertion = function () { debug('getIdentityAssertion()'); return this.pc.getIdentityAssertion(); }; RTCPeerConnection.prototype.reset = function (pcConfig) { debug('reset() | pcConfig: %o', pcConfig); var pc = this.pc; // Remove events in the old PC. pc.onnegotiationneeded = null; pc.onicecandidate = null; pc.onaddstream = null; pc.onremovestream = null; pc.ondatachannel = null; pc.onsignalingstatechange = null; pc.oniceconnectionstatechange = null; pc.onicegatheringstatechange = null; pc.onidentityresult = null; pc.onpeeridentity = null; pc.onidpassertionerror = null; pc.onidpvalidationerror = null; // Clear gathering timers. clearTimeout(this.timerGatheringTimeout); delete this.timerGatheringTimeout; clearTimeout(this.timerGatheringTimeoutAfterRelay); delete this.timerGatheringTimeoutAfterRelay; // Silently close the old PC. debug('reset() | closing current peerConnection'); pc.close(); // Set this.pcConfig and this.options. setConfigurationAndOptions.call(this, pcConfig); // Create a new PC. setPeerConnection.call(this); }; // Private Helpers. function setConfigurationAndOptions(pcConfig) { // Clone pcConfig. this.pcConfig = merge(true, pcConfig); // Fix pcConfig. Adapter.fixPeerConnectionConfig(this.pcConfig); this.options = { iceTransportsRelay: (this.pcConfig.iceTransports === 'relay'), iceTransportsNone: (this.pcConfig.iceTransports === 'none'), gatheringTimeout: this.pcConfig.gatheringTimeout, gatheringTimeoutAfterRelay: this.pcConfig.gatheringTimeoutAfterRelay }; // Remove custom rtcninja.RTCPeerConnection options from pcConfig. delete this.pcConfig.gatheringTimeout; delete this.pcConfig.gatheringTimeoutAfterRelay; debug('setConfigurationAndOptions | processed pcConfig: %o', this.pcConfig); } function isClosed() { return ((this.closed) || (this.pc && this.pc.iceConnectionState === 'closed')); } function setEvents() { var self = this, pc = this.pc; pc.onnegotiationneeded = function (event) { if (isClosed.call(self)) { return; } debug('onnegotiationneeded()'); if (self.onnegotiationneeded) { self.onnegotiationneeded(event); } }; pc.onicecandidate = function (event) { var candidate, isRelay, newCandidate; if (isClosed.call(self)) { return; } if (self.ignoreIceGathering) { return; } // Ignore any candidate (event the null one) if iceTransports:'none' is set. if (self.options.iceTransportsNone) { return; } candidate = event.candidate; if (candidate) { isRelay = C.REGEXP_RELAY_CANDIDATE.test(candidate.candidate); // Ignore if just relay candidates are requested. if (self.options.iceTransportsRelay && !isRelay) { return; } // Handle gatheringTimeoutAfterRelay. if (isRelay && !self.timerGatheringTimeoutAfterRelay && (typeof self.options.gatheringTimeoutAfterRelay === 'number')) { debug('onicecandidate() | first relay candidate found, ending gathering in %d ms', self.options.gatheringTimeoutAfterRelay); self.timerGatheringTimeoutAfterRelay = setTimeout(function () { if (isClosed.call(self)) { return; } debug('forced end of candidates after timeout'); // Clear gathering timers. delete self.timerGatheringTimeoutAfterRelay; clearTimeout(self.timerGatheringTimeout); delete self.timerGatheringTimeout; // Ignore new candidates. self.ignoreIceGathering = true; if (self.onicecandidate) { self.onicecandidate({candidate: null}, null); } }, self.options.gatheringTimeoutAfterRelay); } newCandidate = new Adapter.RTCIceCandidate({ sdpMid: candidate.sdpMid, sdpMLineIndex: candidate.sdpMLineIndex, candidate: candidate.candidate }); // Force correct candidate syntax (just check it once). if (VAR.normalizeCandidate === null) { if (C.REGEXP_NORMALIZED_CANDIDATE.test(candidate.candidate)) { VAR.normalizeCandidate = false; } else { debug('onicecandidate() | normalizing ICE candidates syntax (remove "a=" and "\\r\\n")'); VAR.normalizeCandidate = true; } } if (VAR.normalizeCandidate) { newCandidate.candidate = candidate.candidate.replace(C.REGEXP_FIX_CANDIDATE, ''); } debug( 'onicecandidate() | m%d(%s) %s', newCandidate.sdpMLineIndex, newCandidate.sdpMid || 'no mid', newCandidate.candidate); if (self.onicecandidate) { self.onicecandidate(event, newCandidate); } // Null candidate (end of candidates). } else { debug('onicecandidate() | end of candidates'); // Clear gathering timers. clearTimeout(self.timerGatheringTimeout); delete self.timerGatheringTimeout; clearTimeout(self.timerGatheringTimeoutAfterRelay); delete self.timerGatheringTimeoutAfterRelay; if (self.onicecandidate) { self.onicecandidate(event, null); } } }; pc.onaddstream = function (event) { if (isClosed.call(self)) { return; } debug('onaddstream() | stream: %o', event.stream); if (self.onaddstream) { self.onaddstream(event, event.stream); } }; pc.onremovestream = function (event) { if (isClosed.call(self)) { return; } debug('onremovestream() | stream: %o', event.stream); if (self.onremovestream) { self.onremovestream(event, event.stream); } }; pc.ondatachannel = function (event) { if (isClosed.call(self)) { return; } debug('ondatachannel() | datachannel: %o', event.channel); if (self.ondatachannel) { self.ondatachannel(event, event.channel); } }; pc.onsignalingstatechange = function (event) { if (pc.signalingState === self.ourSignalingState) { return; } debug('onsignalingstatechange() | signalingState: %s', pc.signalingState); self.ourSignalingState = pc.signalingState; if (self.onsignalingstatechange) { self.onsignalingstatechange(event, pc.signalingState); } }; pc.oniceconnectionstatechange = function (event) { if (pc.iceConnectionState === self.ourIceConnectionState) { return; } debug('oniceconnectionstatechange() | iceConnectionState: %s', pc.iceConnectionState); self.ourIceConnectionState = pc.iceConnectionState; if (self.oniceconnectionstatechange) { self.oniceconnectionstatechange(event, pc.iceConnectionState); } }; pc.onicegatheringstatechange = function (event) { if (isClosed.call(self)) { return; } if (pc.iceGatheringState === self.ourIceGatheringState) { return; } debug('onicegatheringstatechange() | iceGatheringState: %s', pc.iceGatheringState); self.ourIceGatheringState = pc.iceGatheringState; if (self.onicegatheringstatechange) { self.onicegatheringstatechange(event, pc.iceGatheringState); } }; pc.onidentityresult = function (event) { if (isClosed.call(self)) { return; } debug('onidentityresult()'); if (self.onidentityresult) { self.onidentityresult(event); } }; pc.onpeeridentity = function (event) { if (isClosed.call(self)) { return; } debug('onpeeridentity()'); if (self.onpeeridentity) { self.onpeeridentity(event); } }; pc.onidpassertionerror = function (event) { if (isClosed.call(self)) { return; } debug('onidpassertionerror()'); if (self.onidpassertionerror) { self.onidpassertionerror(event); } }; pc.onidpvalidationerror = function (event) { if (isClosed.call(self)) { return; } debug('onidpvalidationerror()'); if (self.onidpvalidationerror) { self.onidpvalidationerror(event); } }; } function setPeerConnection() { // Create a RTCPeerConnection. if (!this.pcConstraints) { this.pc = new Adapter.RTCPeerConnection(this.pcConfig); } else { // NOTE: Deprecated. this.pc = new Adapter.RTCPeerConnection(this.pcConfig, this.pcConstraints); } // Set RTC events. setEvents.call(this); } function getLocalDescription() { var pc = this.pc, options = this.options, sdp = null; if (!pc.localDescription) { this.ourLocalDescription = null; return null; } // Mangle the SDP string. if (options.iceTransportsRelay) { sdp = pc.localDescription.sdp.replace(C.REGEXP_SDP_NON_RELAY_CANDIDATES, ''); } else if (options.iceTransportsNone) { sdp = pc.localDescription.sdp.replace(C.REGEXP_SDP_CANDIDATES, ''); } this.ourLocalDescription = new Adapter.RTCSessionDescription({ type: pc.localDescription.type, sdp: sdp || pc.localDescription.sdp }); return this.ourLocalDescription; } function setProperties() { var self = this; Object.defineProperties(this, { peerConnection: { get: function () { return self.pc; } }, signalingState: { get: function () { return self.pc.signalingState; } }, iceConnectionState: { get: function () { return self.pc.iceConnectionState; } }, iceGatheringState: { get: function () { return self.pc.iceGatheringState; } }, localDescription: { get: function () { return getLocalDescription.call(self); } }, remoteDescription: { get: function () { return self.pc.remoteDescription; } }, peerIdentity: { get: function () { return self.pc.peerIdentity; } } }); } },{"./Adapter":13,"debug":9,"merge":18}],15:[function(require,module,exports){ 'use strict'; module.exports = rtcninja; // Dependencies. -var browser = require('bowser').browser, +var browser = require('bowser'), debug = require('debug')('rtcninja'), debugerror = require('debug')('rtcninja:ERROR'), version = require('./version'), Adapter = require('./Adapter'), RTCPeerConnection = require('./RTCPeerConnection'), // Internal vars. called = false; debugerror.log = console.warn.bind(console); debug('version %s', version); debug('detected browser: %s %s [mobile:%s, tablet:%s, android:%s, ios:%s]', browser.name, browser.version, !!browser.mobile, !!browser.tablet, !!browser.android, !!browser.ios); // Constructor. function rtcninja(options) { // Load adapter var iface = Adapter(options || {}); // jshint ignore:line called = true; // Expose RTCPeerConnection class. rtcninja.RTCPeerConnection = RTCPeerConnection; // Expose WebRTC API and utils. rtcninja.getUserMedia = iface.getUserMedia; rtcninja.RTCSessionDescription = iface.RTCSessionDescription; rtcninja.RTCIceCandidate = iface.RTCIceCandidate; rtcninja.MediaStreamTrack = iface.MediaStreamTrack; rtcninja.getMediaDevices = iface.getMediaDevices; rtcninja.attachMediaStream = iface.attachMediaStream; rtcninja.closeMediaStream = iface.closeMediaStream; rtcninja.canRenegotiate = iface.canRenegotiate; // Log WebRTC support. if (iface.hasWebRTC()) { debug('WebRTC supported'); return true; } else { debugerror('WebRTC not supported'); return false; } } // Public API. // If called without calling rtcninja(), call it. rtcninja.hasWebRTC = function () { if (!called) { rtcninja(); } return Adapter.hasWebRTC(); }; // Expose version property. Object.defineProperty(rtcninja, 'version', { get: function () { return version; } }); // Expose called property. Object.defineProperty(rtcninja, 'called', { get: function () { return called; } }); // Exposing stuff. rtcninja.debug = require('debug'); rtcninja.browser = browser; },{"./Adapter":13,"./RTCPeerConnection":14,"./version":16,"bowser":17,"debug":9}],16:[function(require,module,exports){ 'use strict'; // Expose the 'version' field of package.json. module.exports = require('../package.json').version; },{"../package.json":19}],17:[function(require,module,exports){ /*! * Bowser - a browser detector * https://github.com/ded/bowser - * MIT License | (c) Dustin Diaz 2014 + * MIT License | (c) Dustin Diaz 2015 */ !function (name, definition) { - if (typeof module != 'undefined' && module.exports) module.exports['browser'] = definition() + if (typeof module != 'undefined' && module.exports) module.exports = definition() else if (typeof define == 'function' && define.amd) define(definition) else this[name] = definition() }('bowser', function () { /** * See useragents.js for examples of navigator.userAgent */ var t = true function detect(ua) { function getFirstMatch(regex) { var match = ua.match(regex); return (match && match.length > 1 && match[1]) || ''; } function getSecondMatch(regex) { var match = ua.match(regex); return (match && match.length > 1 && match[2]) || ''; } var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase() , likeAndroid = /like android/i.test(ua) , android = !likeAndroid && /android/i.test(ua) + , chromeBook = /CrOS/.test(ua) , edgeVersion = getFirstMatch(/edge\/(\d+(\.\d+)?)/i) , versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i) , tablet = /tablet/i.test(ua) , mobile = !tablet && /[^-]mobi/i.test(ua) , result if (/opera|opr/i.test(ua)) { result = { name: 'Opera' , opera: t , version: versionIdentifier || getFirstMatch(/(?:opera|opr)[\s\/](\d+(\.\d+)?)/i) } } + else if (/yabrowser/i.test(ua)) { + result = { + name: 'Yandex Browser' + , yandexbrowser: t + , version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i) + } + } else if (/windows phone/i.test(ua)) { result = { name: 'Windows Phone' , windowsphone: t } if (edgeVersion) { result.msedge = t result.version = edgeVersion } else { result.msie = t result.version = getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i) } } else if (/msie|trident/i.test(ua)) { result = { name: 'Internet Explorer' , msie: t , version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i) } - } - else if (/chrome.+? edge/i.test(ua)) { + } else if (chromeBook) { + result = { + name: 'Chrome' + , chromeBook: t + , chrome: t + , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) + } + } else if (/chrome.+? edge/i.test(ua)) { result = { name: 'Microsoft Edge' , msedge: t , version: edgeVersion } } else if (/chrome|crios|crmo/i.test(ua)) { result = { name: 'Chrome' , chrome: t , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) } } else if (iosdevice) { result = { name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod' } // WTF: version is not part of user agent in web apps if (versionIdentifier) { result.version = versionIdentifier } } else if (/sailfish/i.test(ua)) { result = { name: 'Sailfish' , sailfish: t , version: getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i) } } else if (/seamonkey\//i.test(ua)) { result = { name: 'SeaMonkey' , seamonkey: t , version: getFirstMatch(/seamonkey\/(\d+(\.\d+)?)/i) } } else if (/firefox|iceweasel/i.test(ua)) { result = { name: 'Firefox' , firefox: t , version: getFirstMatch(/(?:firefox|iceweasel)[ \/](\d+(\.\d+)?)/i) } if (/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(ua)) { result.firefoxos = t } } else if (/silk/i.test(ua)) { result = { name: 'Amazon Silk' , silk: t , version : getFirstMatch(/silk\/(\d+(\.\d+)?)/i) } } else if (android) { result = { name: 'Android' , version: versionIdentifier } } else if (/phantom/i.test(ua)) { result = { name: 'PhantomJS' , phantom: t , version: getFirstMatch(/phantomjs\/(\d+(\.\d+)?)/i) } } else if (/blackberry|\bbb\d+/i.test(ua) || /rim\stablet/i.test(ua)) { result = { name: 'BlackBerry' , blackberry: t , version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i) } } else if (/(web|hpw)os/i.test(ua)) { result = { name: 'WebOS' , webos: t , version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i) }; /touchpad\//i.test(ua) && (result.touchpad = t) } else if (/bada/i.test(ua)) { result = { name: 'Bada' , bada: t , version: getFirstMatch(/dolfin\/(\d+(\.\d+)?)/i) }; } else if (/tizen/i.test(ua)) { result = { name: 'Tizen' , tizen: t , version: getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i) || versionIdentifier }; } else if (/safari/i.test(ua)) { result = { name: 'Safari' , safari: t , version: versionIdentifier } } else { result = { name: getFirstMatch(/^(.*)\/(.*) /), version: getSecondMatch(/^(.*)\/(.*) /) }; } // set webkit or gecko flag for browsers based on these engines if (!result.msedge && /(apple)?webkit/i.test(ua)) { result.name = result.name || "Webkit" result.webkit = t if (!result.version && versionIdentifier) { result.version = versionIdentifier } } else if (!result.opera && /gecko\//i.test(ua)) { result.name = result.name || "Gecko" result.gecko = t result.version = result.version || getFirstMatch(/gecko\/(\d+(\.\d+)?)/i) } // set OS flags for platforms that have multiple browsers if (!result.msedge && (android || result.silk)) { result.android = t } else if (iosdevice) { result[iosdevice] = t result.ios = t } // OS version extraction var osVersion = ''; if (result.windowsphone) { osVersion = getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i); } else if (iosdevice) { osVersion = getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i); osVersion = osVersion.replace(/[_\s]/g, '.'); } else if (android) { osVersion = getFirstMatch(/android[ \/-](\d+(\.\d+)*)/i); } else if (result.webos) { osVersion = getFirstMatch(/(?:web|hpw)os\/(\d+(\.\d+)*)/i); } else if (result.blackberry) { osVersion = getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i); } else if (result.bada) { osVersion = getFirstMatch(/bada\/(\d+(\.\d+)*)/i); } else if (result.tizen) { osVersion = getFirstMatch(/tizen[\/\s](\d+(\.\d+)*)/i); } if (osVersion) { result.osversion = osVersion; } // device type extraction var osMajorVersion = osVersion.split('.')[0]; if (tablet || iosdevice == 'ipad' || (android && (osMajorVersion == 3 || (osMajorVersion == 4 && !mobile))) || result.silk) { result.tablet = t } else if (mobile || iosdevice == 'iphone' || iosdevice == 'ipod' || android || result.blackberry || result.webos || result.bada) { result.mobile = t } // Graded Browser Support // http://developer.yahoo.com/yui/articles/gbs if (result.msedge || (result.msie && result.version >= 10) || + (result.yandexbrowser && result.version >= 15) || (result.chrome && result.version >= 20) || (result.firefox && result.version >= 20.0) || (result.safari && result.version >= 6) || (result.opera && result.version >= 10.0) || (result.ios && result.osversion && result.osversion.split(".")[0] >= 6) || (result.blackberry && result.version >= 10.1) ) { result.a = t; } else if ((result.msie && result.version < 10) || (result.chrome && result.version < 20) || (result.firefox && result.version < 20.0) || (result.safari && result.version < 6) || (result.opera && result.version < 10.0) || (result.ios && result.osversion && result.osversion.split(".")[0] < 6) ) { result.c = t } else result.x = t return result } var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '') bowser.test = function (browserList) { for (var i = 0; i < browserList.length; ++i) { var browserItem = browserList[i]; if (typeof browserItem=== 'string') { if (browserItem in bowser) { return true; } } } return false; } /* * Set our detect method to the main bowser object so we can * reuse it to test other user agents. * This is needed to implement future tests. */ bowser._detect = detect; return bowser }); },{}],18:[function(require,module,exports){ /*! * @name JavaScript/NodeJS Merge v1.2.0 * @author yeikos * @repository https://github.com/yeikos/js.merge * Copyright 2014 yeikos - MIT license * https://raw.github.com/yeikos/js.merge/master/LICENSE */ ;(function(isNode) { /** * Merge one or more objects * @param bool? clone * @param mixed,... arguments * @return object */ var Public = function(clone) { return merge(clone === true, false, arguments); }, publicName = 'merge'; /** * Merge two or more objects recursively * @param bool? clone * @param mixed,... arguments * @return object */ Public.recursive = function(clone) { return merge(clone === true, true, arguments); }; /** * Clone the input removing any reference * @param mixed input * @return mixed */ Public.clone = function(input) { var output = input, type = typeOf(input), index, size; if (type === 'array') { output = []; size = input.length; for (index=0;index=0.10.32" }, "dependencies": { - "bowser": "^0.7.3", + "bowser": "^1.0.0", "debug": "^2.2.0", "merge": "^1.2.0" }, "devDependencies": { - "browserify": "^10.2.3", + "browserify": "^11.0.1", "gulp": "git+https://github.com/gulpjs/gulp.git#4.0", "gulp-expect-file": "0.0.7", "gulp-filelog": "^0.4.1", - "gulp-header": "^1.2.2", - "gulp-jscs": "^1.6.0", - "gulp-jscs-stylish": "^1.1.0", - "gulp-jshint": "^1.11.0", + "gulp-header": "^1.7.1", + "gulp-jscs": "^2.0.0", + "gulp-jscs-stylish": "^1.1.2", + "gulp-jshint": "^1.11.2", "gulp-rename": "^1.2.2", - "gulp-uglify": "^1.2.0", - "jshint-stylish": "^1.0.2", - "retire": "^1.1.0", - "shelljs": "^0.5.0", + "gulp-uglify": "^1.4.0", + "jshint-stylish": "^2.0.1", + "retire": "^1.1.1", + "shelljs": "^0.5.3", "vinyl-source-stream": "^1.1.0" }, - "gitHead": "9ddf6664289d9ab9da786edcd2f8b61b0633f013", + "gitHead": "18789cbefdb5a6c6c038ab4f1ce8e9e3813135b0", "bugs": { "url": "https://github.com/eface2face/rtcninja.js/issues" }, - "_id": "rtcninja@0.6.2", + "_id": "rtcninja@0.6.4", "scripts": {}, - "_shasum": "ac274f4184c64d2d98c1da2cca914a2725dfcf09", - "_from": "rtcninja@>=0.6.2 <0.7.0", + "_shasum": "7ede8577ce978cb431772d877967c53aadeb5e99", + "_from": "rtcninja@0.6.4", "_npmVersion": "2.5.1", "_nodeVersion": "0.12.0", "_npmUser": { "name": "ibc", "email": "ibc@aliax.net" }, "dist": { - "shasum": "ac274f4184c64d2d98c1da2cca914a2725dfcf09", - "tarball": "http://registry.npmjs.org/rtcninja/-/rtcninja-0.6.2.tgz" + "shasum": "7ede8577ce978cb431772d877967c53aadeb5e99", + "tarball": "http://registry.npmjs.org/rtcninja/-/rtcninja-0.6.4.tgz" }, "maintainers": [ { "name": "ibc", "email": "ibc@aliax.net" } ], "directories": {}, - "_resolved": "https://registry.npmjs.org/rtcninja/-/rtcninja-0.6.2.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/rtcninja/-/rtcninja-0.6.4.tgz" } },{}],20:[function(require,module,exports){ var _global = (function() { return this; })(); var nativeWebSocket = _global.WebSocket || _global.MozWebSocket; /** * Expose a W3C WebSocket class with just one or two arguments. */ function W3CWebSocket(uri, protocols) { var native_instance; if (protocols) { native_instance = new nativeWebSocket(uri, protocols); } else { native_instance = new nativeWebSocket(uri); } /** * 'native_instance' is an instance of nativeWebSocket (the browser's WebSocket * class). Since it is an Object it will be returned as it is when creating an * instance of W3CWebSocket via 'new W3CWebSocket()'. * * ECMAScript 5: http://bclary.com/2004/11/07/#a-13.2.2 */ return native_instance; } /** * Module exports. */ module.exports = { 'w3cwebsocket' : nativeWebSocket ? W3CWebSocket : null, 'version' : require('./version') }; },{"./version":21}],21:[function(require,module,exports){ module.exports = require('../package.json').version; },{"../package.json":22}],22:[function(require,module,exports){ module.exports={ "name": "websocket", "description": "Websocket Client & Server Library implementing the WebSocket protocol as specified in RFC 6455.", "keywords": [ "websocket", "websockets", "socket", "networking", "comet", "push", "RFC-6455", "realtime", "server", "client" ], "author": { "name": "Brian McKelvey", "email": "brian@worlize.com", "url": "https://www.worlize.com/" }, - "version": "1.0.19", + "contributors": [ + { + "name": "Iñaki Baz Castillo", + "email": "ibc@aliax.net", + "url": "http://dev.sipdoc.net" + } + ], + "version": "1.0.21", "repository": { "type": "git", "url": "git+https://github.com/theturtle32/WebSocket-Node.git" }, "homepage": "https://github.com/theturtle32/WebSocket-Node", "engines": { "node": ">=0.8.0" }, "dependencies": { - "debug": "~2.1.0", - "nan": "1.8.x", - "typedarray-to-buffer": "~3.0.0" + "debug": "~2.2.0", + "nan": "~1.8.x", + "typedarray-to-buffer": "~3.0.3", + "yaeti": "~0.0.4" }, "devDependencies": { - "buffer-equal": "0.0.1", - "faucet": "0.0.1", + "buffer-equal": "^0.0.1", + "faucet": "^0.0.1", "gulp": "git+https://github.com/gulpjs/gulp.git#4.0", - "gulp-jshint": "^1.9.0", - "jshint-stylish": "^1.0.0", - "tape": "^3.0.0" + "gulp-jshint": "^1.11.2", + "jshint-stylish": "^1.0.2", + "tape": "^4.0.1" }, "config": { "verbose": false }, "scripts": { "install": "(node-gyp rebuild 2> builderror.log) || (exit 0)", "test": "faucet test/unit", "gulp": "gulp" }, "main": "index", "directories": { "lib": "./lib" }, "browser": "lib/browser.js", "license": "Apache-2.0", - "gitHead": "da3bd5b04e9442c84881b2e9c13432cdbbae1f16", + "gitHead": "8f5d5f3ef3d946324fe016d525893546ff6500e1", "bugs": { "url": "https://github.com/theturtle32/WebSocket-Node/issues" }, - "_id": "websocket@1.0.19", - "_shasum": "e62dbf1a3c5e0767425db7187cfa38f921dfb42c", - "_from": "websocket@>=1.0.19 <2.0.0", - "_npmVersion": "2.10.1", - "_nodeVersion": "0.12.4", + "_id": "websocket@1.0.21", + "_shasum": "f51f0a96ed19629af39922470ab591907f1c5bd9", + "_from": "websocket@1.0.21", + "_npmVersion": "2.12.1", + "_nodeVersion": "2.3.4", "_npmUser": { "name": "theturtle32", "email": "brian@worlize.com" }, "maintainers": [ { "name": "theturtle32", "email": "brian@worlize.com" } ], "dist": { - "shasum": "e62dbf1a3c5e0767425db7187cfa38f921dfb42c", - "tarball": "http://registry.npmjs.org/websocket/-/websocket-1.0.19.tgz" + "shasum": "f51f0a96ed19629af39922470ab591907f1c5bd9", + "tarball": "http://registry.npmjs.org/websocket/-/websocket-1.0.21.tgz" }, - "_resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.19.tgz", + "_resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.21.tgz", "readme": "ERROR: No README data found!" } },{}]},{},[4])(4) }); //# sourceMappingURL=sylkrtc.js.map \ No newline at end of file diff --git a/resources/html/webrtcgateway/js/sylkrtc.js.map b/resources/html/webrtcgateway/js/sylkrtc.js.map index bea008f..417bd53 100644 --- a/resources/html/webrtcgateway/js/sylkrtc.js.map +++ b/resources/html/webrtcgateway/js/sylkrtc.js.map @@ -1 +1 @@ -{"version":3,"sources":["node_modules/browserify/node_modules/browser-pack/_prelude.js","lib/account.js","lib/call.js","lib/connection.js","lib/sylkrtc.js","node_modules/blueimp-md5/js/md5.js","node_modules/browserify/node_modules/events/events.js","node_modules/browserify/node_modules/process/browser.js","node_modules/browserify/node_modules/timers-browserify/main.js","node_modules/debug/browser.js","node_modules/debug/debug.js","node_modules/debug/node_modules/ms/index.js","node_modules/node-uuid/uuid.js","node_modules/rtcninja/lib/Adapter.js","node_modules/rtcninja/lib/RTCPeerConnection.js","node_modules/rtcninja/lib/rtcninja.js","node_modules/rtcninja/lib/version.js","node_modules/rtcninja/node_modules/bowser/bowser.js","node_modules/rtcninja/node_modules/merge/merge.js","node_modules/rtcninja/package.json","node_modules/websocket/lib/browser.js","node_modules/websocket/lib/version.js","node_modules/websocket/package.json"],"names":[],"mappings":"AAAA;ACAA,YAAY,CAAC;;AAEb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE;AACzC,SAAK,EAAE,IAAI;CACd,CAAC,CAAC;;AAEH,IAAI,YAAY,GAAG,CAAC,YAAY;AAAE,aAAS,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE;AAAE,aAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAAE,gBAAI,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,AAAC,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,KAAK,CAAC,AAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,AAAC,IAAI,OAAO,IAAI,UAAU,EAAE,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC,AAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;SAAE;KAAE,AAAC,OAAO,UAAU,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE;AAAE,YAAI,UAAU,EAAE,gBAAgB,CAAC,WAAW,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,AAAC,IAAI,WAAW,EAAE,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,AAAC,OAAO,WAAW,CAAC;KAAE,CAAC;CAAE,CAAA,EAAG,CAAC;;AAEtjB,IAAI,IAAI,GAAG,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAAE,QAAI,MAAM,GAAG,IAAI,CAAC,AAAC,SAAS,EAAE,OAAO,MAAM,EAAE;AAAE,YAAI,MAAM,GAAG,GAAG;YAAE,QAAQ,GAAG,GAAG;YAAE,QAAQ,GAAG,GAAG,CAAC,AAAC,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,AAAC,MAAM,GAAG,KAAK,CAAC,AAAC,IAAI,MAAM,KAAK,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,AAAC,IAAI,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,AAAC,IAAI,IAAI,KAAK,SAAS,EAAE;AAAE,gBAAI,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,AAAC,IAAI,MAAM,KAAK,IAAI,EAAE;AAAE,uBAAO,SAAS,CAAC;aAAE,MAAM;AAAE,mBAAG,GAAG,MAAM,CAAC,AAAC,GAAG,GAAG,QAAQ,CAAC,AAAC,GAAG,GAAG,QAAQ,CAAC,AAAC,MAAM,GAAG,IAAI,CAAC,AAAC,SAAS,SAAS,CAAC;aAAE;SAAE,MAAM,IAAI,OAAO,IAAI,IAAI,EAAE;AAAE,mBAAO,IAAI,CAAC,KAAK,CAAC;SAAE,MAAM;AAAE,gBAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,AAAC,IAAI,MAAM,KAAK,SAAS,EAAE;AAAE,uBAAO,SAAS,CAAC;aAAE,AAAC,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SAAE;KAAE;CAAE,CAAC;;AAE9pB,SAAS,sBAAsB,CAAC,GAAG,EAAE;AAAE,WAAO,GAAG,IAAI,GAAG,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;CAAE;;AAEjG,SAAS,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE;AAAE,QAAI,EAAE,QAAQ,YAAY,WAAW,CAAA,AAAC,EAAE;AAAE,cAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;KAAE;CAAE;;AAEzJ,SAAS,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE;AAAE,QAAI,OAAO,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,IAAI,EAAE;AAAE,cAAM,IAAI,SAAS,CAAC,0DAA0D,GAAG,OAAO,UAAU,CAAC,CAAC;KAAE,AAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,AAAC,IAAI,UAAU,EAAE,QAAQ,CAAC,SAAS,GAAG,UAAU,CAAC;CAAE;;AAExa,IAAI,MAAM,GAAG,OAAO,CAdF,OAAO,CAAA,CAAA;;AAgBzB,IAAI,OAAO,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;;AAE7C,IAAI,WAAW,GAAG,OAAO,CAhBL,aAAa,CAAA,CAAA;;AAkBjC,IAAI,OAAO,GAAG,OAAO,CAjBQ,QAAQ,CAAA,CAAA;;AAmBrC,IAAI,KAAK,GAAG,OAAO,CAlBE,QAAQ,CAAA,CAAA;;AAE7B,IAAM,KAAK,GAAG,CAAA,CAAA,EAAA,OAAA,CAAA,SAAA,CAAA,CAAA,CAAM,iBAAiB,CAAC,CAAC;;AAoBvC,IAjBM,OAAO,GAAA,CAAA,UAAA,aAAA,EAAA;AAkBT,aAAS,CAlBP,OAAO,EAAA,aAAA,CAAA,CAAA;;AACE,aADT,OAAO,CACG,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;AAoBlC,uBAAe,CAAC,IAAI,EArBtB,OAAO,CAAA,CAAA;;AAEL,YAAI,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;AACxB,kBAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;SACnD;AACD,YAAA,CAAA,MAAA,CAAA,cAAA,CALF,OAAO,CAAA,SAAA,CAAA,EAAA,aAAA,EAAA,IAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAKG;AACR,YAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAClD,YAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACjD,YAAI,CAAC,GAAG,GAAG,EAAE,CAAC;AACd,YAAI,CAAC,SAAS,GAAG,CAAA,CAAA,EAAA,WAAA,CAhBhB,GAAG,CAAA,CAgBiB,QAAQ,GAAG,GAAG,GAAG,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,CAAC;AAC/D,YAAI,CAAC,WAAW,GAAG,UAAU,CAAC;AAC9B,YAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;AAC/B,YAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;KAC3B;;AAuBD,gBAAY,CApCV,OAAO,EAAA,CAAA;AAqCL,WAAG,EAAE,UAAU;AACf,aAAK,EAXD,SAAA,QAAA,GAAG;AAYH,gBAAI,KAAK,GAAG,IAAI,CAAC;;AAXrB,gBAAI,GAAG,GAAG;AACN,uBAAO,EAAE,kBAAkB;AAC3B,uBAAO,EAAE,IAAI,CAAC,GAAG;aACpB,CAAC;AACF,gBAAI,CAAC,YAAY,CAAC,GAAG,EAAE,UAAC,KAAK,EAAK;AAC9B,oBAAI,KAAK,EAAE;AACP,yBAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;AACnC,wBAAM,QAAQ,GAAG,KAAA,CAAK,kBAAkB,CAAC;AACzC,wBAAM,QAAQ,GAAG,QAAQ,CAAC;AAC1B,wBAAI,IAAI,GAAG,EAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAC,CAAC;AACtC,yBAAA,CAAK,kBAAkB,GAAG,QAAQ,CAAC;AACnC,yBAAA,CAAK,IAAI,CAAC,0BAA0B,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;iBACnE;aACJ,CAAC,CAAC;SACN;KAcA,EAAE;AACC,WAAG,EAAE,YAAY;AACjB,aAAK,EAdC,SAAA,UAAA,GAAG;AAeL,gBAAI,MAAM,GAAG,IAAI,CAAC;;AAdtB,gBAAI,GAAG,GAAG;AACN,uBAAO,EAAE,oBAAoB;AAC7B,uBAAO,EAAE,IAAI,CAAC,GAAG;aACpB,CAAC;AACF,gBAAI,CAAC,YAAY,CAAC,GAAG,EAAE,UAAC,KAAK,EAAK;AAC9B,oBAAI,KAAK,EAAE;AACP,yBAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;iBACxC;AACD,oBAAM,QAAQ,GAAG,MAAA,CAAK,kBAAkB,CAAC;AACzC,oBAAM,QAAQ,GAAG,IAAI,CAAC;AACtB,sBAAA,CAAK,kBAAkB,GAAG,QAAQ,CAAC;AACnC,sBAAA,CAAK,IAAI,CAAC,0BAA0B,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;aACjE,CAAC,CAAC;SACN;KAiBA,EAAE;AACC,WAAG,EAAE,MAAM;AACX,aAAK,EAjBL,SAAA,IAAA,CAAC,GAAG,EAAc;AAkBd,gBAlBE,OAAO,GAAA,SAAA,CAAA,MAAA,IAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAC,EAAE,GAAA,SAAA,CAAA,CAAA,CAAA,CAAA;;AAChB,gBAAI,IAAI,GAAG,IAAA,KAAA,CAlEV,IAAI,CAkEe,IAAI,CAAC,CAAC;AAC1B,gBAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACjC,gBAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AAC/B,gBAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;AAChC,mBAAO,IAAI,CAAC;SACf;KAoBA,EAAE;AACC,WAAG,EAAE,cAAc;;;;AAInB,aAAK,EArBG,SAAA,YAAA,CAAC,OAAO,EAAE;AAClB,iBAAK,CAAC,4BAA4B,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;AACnD,oBAAQ,OAAO,CAAC,KAAK;AACjB,qBAAK,oBAAoB;AACrB,wBAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC;AACzC,wBAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;AACpC,wBAAI,IAAI,GAAG,EAAE,CAAC;AACd,wBAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;AACnC,wBAAI,QAAQ,KAAK,QAAQ,EAAE;AACvB,4BAAI,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;qBACrC;AACD,wBAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AAChE,0BAAM;AAAA,qBACL,kBAAkB;AACnB,wBAAI,IAAI,GAAG,IAAA,KAAA,CAzFlB,IAAI,CAyFuB,IAAI,CAAC,CAAC;AAC1B,wBAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/E,wBAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AAC/B,wBAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;AAChC,0BAAM;AAAA;AAEN,0BAAM;AAAA,aACb;SACJ;KAsBA,EAAE;AACC,WAAG,EAAE,cAAc;AACnB,aAAK,EAtBG,SAAA,YAAA,CAAC,GAAG,EAAE,EAAE,EAAE;AAClB,gBAAI,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;SAC1C;KAuBA,EAAE;AACC,WAAG,EAAE,IAAI;AACT,WAAG,EA1GD,SAAA,GAAA,GAAG;AACL,mBAAO,IAAI,CAAC,GAAG,CAAC;SACnB;KA2GA,EAAE;AACC,WAAG,EAAE,UAAU;AACf,WAAG,EA3GK,SAAA,GAAA,GAAG;AACX,mBAAO,IAAI,CAAC,SAAS,CAAC;SACzB;KA4GA,EAAE;AACC,WAAG,EAAE,mBAAmB;AACxB,WAAG,EA5Gc,SAAA,GAAA,GAAG;AACpB,mBAAO,IAAI,CAAC,kBAAkB,CAAC;SAClC;KA6GA,CAAC,CAAC,CAAC;;AAEJ,WAxIE,OAAO,CAAA;CAyIZ,CAAA,CAAE,OAAO,CA/ID,YAAY,CAAA,CAAA;;AAiJrB,OAAO,CAtCE,OAAO,GAAP,OAAO,CAAA;;;AChHhB,YAAY,CAAC;;AAEb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE;AACzC,SAAK,EAAE,IAAI;CACd,CAAC,CAAC;;AAEH,IAAI,YAAY,GAAG,CAAC,YAAY;AAAE,aAAS,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE;AAAE,aAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAAE,gBAAI,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,AAAC,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,KAAK,CAAC,AAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,AAAC,IAAI,OAAO,IAAI,UAAU,EAAE,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC,AAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;SAAE;KAAE,AAAC,OAAO,UAAU,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE;AAAE,YAAI,UAAU,EAAE,gBAAgB,CAAC,WAAW,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,AAAC,IAAI,WAAW,EAAE,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,AAAC,OAAO,WAAW,CAAC;KAAE,CAAC;CAAE,CAAA,EAAG,CAAC;;AAEtjB,IAAI,IAAI,GAAG,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAAE,QAAI,MAAM,GAAG,IAAI,CAAC,AAAC,SAAS,EAAE,OAAO,MAAM,EAAE;AAAE,YAAI,MAAM,GAAG,GAAG;YAAE,QAAQ,GAAG,GAAG;YAAE,QAAQ,GAAG,GAAG,CAAC,AAAC,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,AAAC,MAAM,GAAG,KAAK,CAAC,AAAC,IAAI,MAAM,KAAK,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,AAAC,IAAI,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,AAAC,IAAI,IAAI,KAAK,SAAS,EAAE;AAAE,gBAAI,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,AAAC,IAAI,MAAM,KAAK,IAAI,EAAE;AAAE,uBAAO,SAAS,CAAC;aAAE,MAAM;AAAE,mBAAG,GAAG,MAAM,CAAC,AAAC,GAAG,GAAG,QAAQ,CAAC,AAAC,GAAG,GAAG,QAAQ,CAAC,AAAC,MAAM,GAAG,IAAI,CAAC,AAAC,SAAS,SAAS,CAAC;aAAE;SAAE,MAAM,IAAI,OAAO,IAAI,IAAI,EAAE;AAAE,mBAAO,IAAI,CAAC,KAAK,CAAC;SAAE,MAAM;AAAE,gBAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,AAAC,IAAI,MAAM,KAAK,SAAS,EAAE;AAAE,uBAAO,SAAS,CAAC;aAAE,AAAC,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SAAE;KAAE;CAAE,CAAC;;AAE9pB,SAAS,sBAAsB,CAAC,GAAG,EAAE;AAAE,WAAO,GAAG,IAAI,GAAG,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;CAAE;;AAEjG,SAAS,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE;AAAE,QAAI,EAAE,QAAQ,YAAY,WAAW,CAAA,AAAC,EAAE;AAAE,cAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;KAAE;CAAE;;AAEzJ,SAAS,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE;AAAE,QAAI,OAAO,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,IAAI,EAAE;AAAE,cAAM,IAAI,SAAS,CAAC,0DAA0D,GAAG,OAAO,UAAU,CAAC,CAAC;KAAE,AAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,AAAC,IAAI,UAAU,EAAE,QAAQ,CAAC,SAAS,GAAG,UAAU,CAAC;CAAE;;AAExa,IAAI,MAAM,GAAG,OAAO,CAdF,OAAO,CAAA,CAAA;;AAgBzB,IAAI,OAAO,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;;AAE7C,IAAI,SAAS,GAAG,OAAO,CAjBN,WAAW,CAAA,CAAA;;AAmB5B,IAAI,UAAU,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;;AAEnD,IAAI,SAAS,GAAG,OAAO,CApBF,UAAU,CAAA,CAAA;;AAsB/B,IAAI,UAAU,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;;AAEnD,IAAI,OAAO,GAAG,OAAO,CAtBQ,QAAQ,CAAA,CAAA;;AAErC,IAAM,KAAK,GAAG,CAAA,CAAA,EAAA,OAAA,CAAA,SAAA,CAAA,CAAA,CAAM,cAAc,CAAC,CAAC;;AAwBpC,IArBM,IAAI,GAAA,CAAA,UAAA,aAAA,EAAA;AAsBN,aAAS,CAtBP,IAAI,EAAA,aAAA,CAAA,CAAA;;AACK,aADT,IAAI,CACM,OAAO,EAAE;AAwBjB,uBAAe,CAAC,IAAI,EAzBtB,IAAI,CAAA,CAAA;;AAEF,YAAA,CAAA,MAAA,CAAA,cAAA,CAFF,IAAI,CAAA,SAAA,CAAA,EAAA,aAAA,EAAA,IAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAEM;AACR,YAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;AACxB,YAAI,CAAC,GAAG,GAAG,IAAI,CAAC;AAChB,YAAI,CAAC,UAAU,GAAG,IAAI,CAAC;AACvB,YAAI,CAAC,GAAG,GAAG,IAAI,CAAC;AAChB,YAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AACnB,YAAI,CAAC,WAAW,GAAG,KAAK,CAAC;AACzB,YAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,YAAI,CAAC,eAAe,GAAG,IAAI,CAAC;KAC/B;;AA2BD,gBAAY,CAtCV,IAAI,EAAA,CAAA;AAuCF,WAAG,EAAE,iBAAiB;AACtB,aAAK,EAHM,SAAA,eAAA,GAAG;AACd,gBAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE;AACnB,uBAAO,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;aACrC,MAAM;AACH,uBAAO,EAAE,CAAC;aACb;SACJ;KAIA,EAAE;AACC,WAAG,EAAE,kBAAkB;AACvB,aAAK,EAJO,SAAA,gBAAA,GAAG;AACf,gBAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE;AACnB,uBAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;aACtC,MAAM;AACH,uBAAO,EAAE,CAAC;aACb;SACJ;KAKA,EAAE;AACC,WAAG,EAAE,QAAQ;AACb,aAAK,EALH,SAAA,MAAA,GAAe;AAMb,gBAND,OAAO,GAAA,SAAA,CAAA,MAAA,IAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAG,EAAE,GAAA,SAAA,CAAA,CAAA,CAAA,CAAA;;AACf,gBAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE;AAC5B,sBAAM,IAAI,KAAK,CAAC,qCAAqC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;aACxE;;AAED,gBAAM,IAAI,GAAG,IAAI,CAAC;AAClB,gBAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAC,UAAU,EAAC,EAAE,EAAC,CAAC;AACrD,gBAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,EAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAC,CAAC;AAChF,gBAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;;;AAG5C,gBAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;;;AAGtC,sBAAA,CAAA,SAAA,CAAA,CAAS,YAAY,CACjB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,CAClB,CAAC;;AAEF,qBAAS,kBAAkB,CAAC,MAAM,EAAE;;AAEhC,oBAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAC3B,oBAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;;AAEtC,oBAAI,CAAC,GAAG,CAAC,oBAAoB,CACzB,IAAI,UAAA,CAAA,SAAA,CAAA,CAAS,qBAAqB,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,YAAY,EAAC,CAAC;;AAE3E,4BAAW;AACP,wBAAI,CAAC,eAAe,CAChB,QAAQ,EACR,aAAa;;AAEb,8BAAS,GAAG,EAAE;AACV,6BAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AAC5B,4BAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;qBACzB;;AAED,8BAAS,KAAK,EAAE;AACZ,6BAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;AAC7C,4BAAI,CAAC,SAAS,EAAE,CAAC;qBACpB,CACJ,CAAC;iBACL;;AAED,0BAAS,KAAK,EAAE;AACZ,yBAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;AACrD,wBAAI,CAAC,SAAS,EAAE,CAAC;iBACpB,CACJ,CAAC;aACL;;AAED,qBAAS,eAAe,CAAC,KAAK,EAAE;AAC5B,qBAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;AAC7C,oBAAI,CAAC,SAAS,EAAE,CAAC;aACpB;SACJ;KADA,EAAE;AACC,WAAG,EAAE,WAAW;AAChB,aAAK,EACA,SAAA,SAAA,GAAG;AACR,gBAAI,IAAI,CAAC,WAAW,EAAE;AAClB,uBAAO;aACV;;AAED,gBAAI,CAAC,cAAc,EAAE,CAAC;SACzB;KAAA,EAAE;AACC,WAAG,EAAE,eAAe;;;;AAIpB,aAAK,EADI,SAAA,aAAA,CAAC,GAAG,EAAc;AAEvB,gBAFW,OAAO,GAAA,SAAA,CAAA,MAAA,IAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAC,EAAE,GAAA,SAAA,CAAA,CAAA,CAAA,CAAA;;AACzB,gBAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;AACzB,sBAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;aAClC;;AAED,gBAAI,CAAC,GAAG,GAAG,UAAA,CAAA,SAAA,CAAA,CAAK,EAAE,EAAE,CAAC;AACrB,gBAAI,CAAC,UAAU,GAAG,UAAU,CAAC;;AAE7B,gBAAM,IAAI,GAAG,IAAI,CAAC;AAClB,gBAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAC,UAAU,EAAC,EAAE,EAAC,CAAC;AACrD,gBAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,EAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAC,CAAC;AAChF,gBAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;;;AAG1C,gBAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;;;AAGtC,sBAAA,CAAA,SAAA,CAAA,CAAS,YAAY,CACjB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,CAClB,CAAC;;AAEF,qBAAS,kBAAkB,CAAC,MAAM,EAAE;;AAEhC,oBAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAC3B,oBAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;;AAEtC,oBAAI,CAAC,eAAe,CAChB,OAAO,EACP,YAAY;;AAEZ,0BAAS,GAAG,EAAE;AACV,yBAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AAC5B,wBAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;iBAC5B;;AAED,0BAAS,KAAK,EAAE;AACZ,yBAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;AAC7C,wBAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;iBAC/B,CACJ,CAAC;aACL;;AAED,qBAAS,eAAe,CAAC,KAAK,EAAE;AAC5B,qBAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;AAC7C,oBAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;aAC/B;SACJ;KAHA,EAAE;AACC,WAAG,EAAE,eAAe;AACpB,aAAK,EAGI,SAAA,aAAA,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;AAC3B,gBAAI,CAAC,GAAG,GAAG,EAAE,CAAC;AACd,gBAAI,CAAC,eAAe,GAAG,MAAM,CAAC;AAC9B,gBAAI,CAAC,YAAY,GAAG,GAAG,CAAC;AACxB,gBAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AAC7B,gBAAI,CAAC,MAAM,GAAG,UAAU,CAAC;SAC5B;KAFA,EAAE;AACC,WAAG,EAAE,cAAc;AACnB,aAAK,EAEG,SAAA,YAAA,CAAC,OAAO,EAAE;AADd,gBAAI,KAAK,GAAG,IAAI,CAAC;;AAErB,iBAAK,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;AACjC,oBAAQ,OAAO,CAAC,KAAK;AACjB,qBAAK,OAAO;AACR,wBAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;AAC7B,wBAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;AACpC,wBAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;AACvB,wBAAI,IAAI,GAAG,EAAE,CAAC;;AAEd,wBAAI,QAAQ,KAAK,UAAU,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE;AACvD,yBAAC,YAAY;AAAjB,gCAAM,IAAI,GAAA,KAAO,CAAC;AAClB,iCAAA,CAAK,GAAG,CAAC,oBAAoB,CACzB,IAAI,UAAA,CAAA,SAAA,CAAA,CAAS,qBAAqB,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAC,CAAC;;AAE3E,wCAAW;AACP,qCAAK,CAAC,eAAe,CAAC,CAAC;AACvB,oCAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;6BACvD;;AAED,sCAAS,KAAK,EAAE;AACZ,qCAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;AACzC,oCAAI,CAAC,SAAS,EAAE,CAAC;6BACpB,CACJ,CAAC;yBAAG,CAAA,EAAG,CAAC;qBACZ,MAAM;AACH,4BAAI,QAAQ,KAAK,YAAY,EAAE;AAC3B,gCAAI,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;AAClC,gCAAI,CAAC,WAAW,GAAG,IAAI,CAAC;yBAC3B;AACD,4BAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AACpD,4BAAI,QAAQ,KAAK,YAAY,EAAE;AAC3B,gCAAI,CAAC,uBAAuB,EAAE,CAAC;yBAClC;qBACJ;AACD,0BAAM;AAAA;AAEN,0BAAM;AAAA,aACb;SACJ;KACA,EAAE;AACC,WAAG,EAAE,wBAAwB;AAC7B,aAAK,EADa,SAAA,sBAAA,CAAC,QAAQ,EAAE;AAC7B,gBAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE;AACnB,sBAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;aAC5D;;AAED,gBAAM,IAAI,GAAG,IAAI,CAAC;AAClB,gBAAI,CAAC,GAAG,GAAG,IAAI,UAAA,CAAA,SAAA,CAAA,CAAS,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AACpD,gBAAI,CAAC,GAAG,CAAC,WAAW,GAAG,UAAS,KAAK,EAAE,MAAM,EAAE;AAC3C,qBAAK,CAAC,cAAc,CAAC,CAAC;AACtB,oBAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;aACpC,CAAC;AACF,gBAAI,CAAC,GAAG,CAAC,cAAc,GAAG,UAAS,KAAK,EAAE;AACtC,oBAAI,SAAS,GAAG,IAAI,CAAC;AACrB,oBAAI,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE;AAC1B,6BAAS,GAAG;AACR,mCAAW,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS;AACtC,gCAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM;AAChC,uCAAe,EAAE,KAAK,CAAC,SAAS,CAAC,aAAa;qBACjD,CAAC;AACF,yBAAK,CAAC,sBAAsB,EAAE,SAAS,CAAC,CAAC;iBAC5C;AACD,oBAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;aAChC,CAAC;SACL;KAEA,EAAE;AACC,WAAG,EAAE,iBAAiB;AACtB,aAAK,EAFM,SAAA,eAAA,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE;AACjD,gBAAM,IAAI,GAAG,IAAI,CAAC;;AAElB,gBAAI,IAAI,KAAK,OAAO,EAAE;AAClB,oBAAI,CAAC,GAAG,CAAC,WAAW;;AAEhB,+BAAe;;AAEf,uBAAO;;AAEP,uBAAO,CACV,CAAC;aACL,MAAM,IAAI,IAAI,KAAK,QAAQ,EAAE;AAC1B,oBAAI,CAAC,GAAG,CAAC,YAAY;;AAEjB,+BAAe;;AAEf,uBAAO;;AAEP,uBAAO,CACV,CAAC;aACL,MAAM;AACH,sBAAM,IAAI,KAAK,CAAC,yCAAyC,GAAE,IAAI,GAAE,aAAa,CAAC,CAAC;aACnF;;AAED,qBAAS,eAAe,CAAC,IAAI,EAAE;AAC3B,oBAAI,CAAC,GAAG,CAAC,mBAAmB,CACxB,IAAI;;AAEJ,4BAAW;AACP,6BAAS,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;iBAC5C;;AAED,uBAAO,CACV,CAAC;aACL;;AAED,qBAAS,OAAO,CAAC,KAAK,EAAE;AACpB,yBAAS,CAAC,KAAK,CAAC,CAAC;aACpB;SACJ;KADA,EAAE;AACC,WAAG,EAAE,cAAc;AACnB,aAAK,EACG,SAAA,YAAA,CAAC,GAAG,EAAE,EAAE,EAAE;AAClB,gBAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;SACvC;KAAA,EAAE;AACC,WAAG,EAAE,WAAW;AAChB,aAAK,EAAA,SAAA,SAAA,CAAC,GAAG,EAAE,GAAG,EAAE;AAChB,gBAAI,GAAG,GAAG;AACN,uBAAO,EAAE,gBAAgB;AACzB,uBAAO,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;AACxB,uBAAO,EAAE,IAAI,CAAC,EAAE;AAChB,mBAAG,EAAE,GAAG;AACR,mBAAG,EAAE,GAAG;aACX,CAAC;AACF,gBAAM,IAAI,GAAG,IAAI,CAAC;AAClB,gBAAI,CAAC,YAAY,CAAC,GAAG,EAAE,UAAS,KAAK,EAAE;AACnC,oBAAI,KAAK,EAAE;AACP,yBAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AAC/B,wBAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;iBAC/B;aACJ,CAAC,CAAC;SACN;KACA,EAAE;AACC,WAAG,EAAE,gBAAgB;AACrB,aAAK,EADK,SAAA,cAAA,GAAG;AACb,gBAAI,GAAG,GAAG;AACN,uBAAO,EAAE,mBAAmB;AAC5B,uBAAO,EAAE,IAAI,CAAC,EAAE;aACnB,CAAC;AACF,gBAAM,IAAI,GAAG,IAAI,CAAC;AAClB,gBAAI,CAAC,YAAY,CAAC,GAAG,EAAE,UAAS,KAAK,EAAE;AACnC,oBAAI,KAAK,EAAE;AACP,yBAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;AAC3C,wBAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;iBAC/B;AACD,oBAAI,CAAC,WAAW,GAAG,IAAI,CAAC;aAC3B,CAAC,CAAC;SACN;KAEA,EAAE;AACC,WAAG,EAAE,cAAc;AACnB,aAAK,EAFG,SAAA,YAAA,CAAC,SAAS,EAAE;AACpB,gBAAI,GAAG,GAAG;AACN,uBAAO,EAAE,iBAAiB;AAC1B,uBAAO,EAAE,IAAI,CAAC,EAAE;AAChB,0BAAU,EAAE,SAAS,KAAK,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;aACpD,CAAC;AACF,gBAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;SAChC;KAGA,EAAE;AACC,WAAG,EAAE,aAAa;AAClB,aAAK,EAHE,SAAA,WAAA,CAAC,GAAG,EAAE;AACb,gBAAI,GAAG,GAAG;AACN,uBAAO,EAAE,gBAAgB;AACzB,uBAAO,EAAE,IAAI,CAAC,EAAE;AAChB,mBAAG,EAAE,GAAG;aACX,CAAC;AACF,gBAAM,IAAI,GAAG,IAAI,CAAC;AAClB,gBAAI,CAAC,YAAY,CAAC,GAAG,EAAE,UAAS,KAAK,EAAE;AACnC,oBAAI,KAAK,EAAE;AACP,yBAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;AACjC,wBAAI,CAAC,SAAS,EAAE,CAAC;iBACpB;aACJ,CAAC,CAAC;SACN;KAIA,EAAE;AACC,WAAG,EAAE,yBAAyB;AAC9B,aAAK,EAJc,SAAA,uBAAA,GAAG;AACtB,iBAAK,CAAC,2BAA2B,CAAC,CAAC;AACnC,gBAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE;AAKf,oBAAI,yBAAyB,GAAG,IAAI,CAAC;AACrC,oBAAI,iBAAiB,GAAG,KAAK,CAAC;AAC9B,oBAAI,cAAc,GAAG,SAAS,CAAC;;AAE/B,oBAAI;AARR,yBAAA,IAAA,SAAA,GAAmB,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,CAAA,MAAA,CAAA,QAAA,CAAA,EAAA,EAAA,KAAA,EAAA,EAAA,yBAAA,GAAA,CAAA,KAAA,GAAA,SAAA,CAAA,IAAA,EAAA,CAAA,CAAA,IAAA,CAAA,EAAA,yBAAA,GAAA,IAAA,EAAE;AAUnC,4BAVH,MAAM,GAAA,KAAA,CAAA,KAAA,CAAA;;AACX,kCAAA,CAAA,SAAA,CAAA,CAAS,gBAAgB,CAAC,MAAM,CAAC,CAAC;qBACrC;iBAYI,CAAC,OAAO,GAAG,EAAE;AACV,qCAAiB,GAAG,IAAI,CAAC;AACzB,kCAAc,GAAG,GAAG,CAAC;iBACxB,SAAS;AACN,wBAAI;AACA,4BAAI,CAAC,yBAAyB,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE;AACnD,qCAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;yBACzB;qBACJ,SAAS;AACN,4BAAI,iBAAiB,EAAE;AACnB,kCAAM,cAAc,CAAC;yBACxB;qBACJ;iBACJ;;AAED,oBAAI,0BAA0B,GAAG,IAAI,CAAC;AACtC,oBAAI,kBAAkB,GAAG,KAAK,CAAC;AAC/B,oBAAI,eAAe,GAAG,SAAS,CAAC;;AAEhC,oBAAI;AA9BR,yBAAA,IAAA,UAAA,GAAmB,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA,MAAA,CAAA,QAAA,CAAA,EAAA,EAAA,MAAA,EAAA,EAAA,0BAAA,GAAA,CAAA,MAAA,GAAA,UAAA,CAAA,IAAA,EAAA,CAAA,CAAA,IAAA,CAAA,EAAA,0BAAA,GAAA,IAAA,EAAE;AAgCpC,4BAhCH,MAAM,GAAA,MAAA,CAAA,KAAA,CAAA;;AACX,kCAAA,CAAA,SAAA,CAAA,CAAS,gBAAgB,CAAC,MAAM,CAAC,CAAC;qBACrC;iBAkCI,CAAC,OAAO,GAAG,EAAE;AACV,sCAAkB,GAAG,IAAI,CAAC;AAC1B,mCAAe,GAAG,GAAG,CAAC;iBACzB,SAAS;AACN,wBAAI;AACA,4BAAI,CAAC,0BAA0B,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE;AACrD,sCAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;yBAC1B;qBACJ,SAAS;AACN,4BAAI,kBAAkB,EAAE;AACpB,kCAAM,eAAe,CAAC;yBACzB;qBACJ;iBACJ;;AA9CL,oBAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;AACjB,oBAAI,CAAC,GAAG,GAAG,IAAI,CAAC;aACnB;SACJ;KAiDA,EAAE;AACC,WAAG,EAAE,iBAAiB;AACtB,aAAK,EAjDM,SAAA,eAAA,CAAC,KAAK,EAAE;AACnB,gBAAI,IAAI,CAAC,WAAW,EAAE;AAClB,uBAAO;aACV;AACD,gBAAI,CAAC,QAAQ,CAAC,MAAM,CAAA,QAAA,CAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACrC,gBAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AACxB,gBAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;AAC7B,gBAAM,QAAQ,GAAG,YAAY,CAAC;AAC9B,gBAAI,IAAI,GAAG;AACP,sBAAM,EAAE,KAAK,CAAC,QAAQ,EAAE;aAC3B,CAAC;AACF,gBAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AACpD,gBAAI,CAAC,uBAAuB,EAAE,CAAC;SAClC;KAkDA,EAAE;AACC,WAAG,EAAE,SAAS;AACd,WAAG,EA5ZI,SAAA,GAAA,GAAG;AACV,mBAAO,IAAI,CAAC,QAAQ,CAAC;SACxB;KA6ZA,EAAE;AACC,WAAG,EAAE,IAAI;AACT,WAAG,EA7ZD,SAAA,GAAA,GAAG;AACL,mBAAO,IAAI,CAAC,GAAG,CAAC;SACnB;KA8ZA,EAAE;AACC,WAAG,EAAE,WAAW;AAChB,WAAG,EA9ZM,SAAA,GAAA,GAAG;AACZ,mBAAO,IAAI,CAAC,UAAU,CAAC;SAC1B;KA+ZA,EAAE;AACC,WAAG,EAAE,OAAO;AACZ,WAAG,EA/ZE,SAAA,GAAA,GAAG;AACR,mBAAO,IAAI,CAAC,MAAM,CAAC;SACtB;KAgaA,EAAE;AACC,WAAG,EAAE,eAAe;AACpB,WAAG,EAhaU,SAAA,GAAA,GAAG;AAChB,mBAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;SAC3B;KAiaA,EAAE;AACC,WAAG,EAAE,gBAAgB;AACrB,WAAG,EAjaW,SAAA,GAAA,GAAG;AACjB,mBAAO,IAAI,CAAC,eAAe,CAAC;SAC/B;KAkaA,CAAC,CAAC,CAAC;;AAEJ,WAvcE,IAAI,CAAA;CAwcT,CAAA,CAAE,OAAO,CA7cD,YAAY,CAAA,CAAA;;AA+crB,OAAO,CAjFE,IAAI,GAAJ,IAAI,CAAA;;;;ACpYb,YAAY,CAAC;;AAEb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE;AACzC,SAAK,EAAE,IAAI;CACd,CAAC,CAAC;;AAEH,IAAI,YAAY,GAAG,CAAC,YAAY;AAAE,aAAS,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE;AAAE,aAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAAE,gBAAI,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,AAAC,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,KAAK,CAAC,AAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,AAAC,IAAI,OAAO,IAAI,UAAU,EAAE,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC,AAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;SAAE;KAAE,AAAC,OAAO,UAAU,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE;AAAE,YAAI,UAAU,EAAE,gBAAgB,CAAC,WAAW,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,AAAC,IAAI,WAAW,EAAE,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,AAAC,OAAO,WAAW,CAAC;KAAE,CAAC;CAAE,CAAA,EAAG,CAAC;;AAEtjB,IAAI,IAAI,GAAG,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAAE,QAAI,MAAM,GAAG,IAAI,CAAC,AAAC,SAAS,EAAE,OAAO,MAAM,EAAE;AAAE,YAAI,MAAM,GAAG,GAAG;YAAE,QAAQ,GAAG,GAAG;YAAE,QAAQ,GAAG,GAAG,CAAC,AAAC,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,AAAC,MAAM,GAAG,KAAK,CAAC,AAAC,IAAI,MAAM,KAAK,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,AAAC,IAAI,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,AAAC,IAAI,IAAI,KAAK,SAAS,EAAE;AAAE,gBAAI,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,AAAC,IAAI,MAAM,KAAK,IAAI,EAAE;AAAE,uBAAO,SAAS,CAAC;aAAE,MAAM;AAAE,mBAAG,GAAG,MAAM,CAAC,AAAC,GAAG,GAAG,QAAQ,CAAC,AAAC,GAAG,GAAG,QAAQ,CAAC,AAAC,MAAM,GAAG,IAAI,CAAC,AAAC,SAAS,SAAS,CAAC;aAAE;SAAE,MAAM,IAAI,OAAO,IAAI,IAAI,EAAE;AAAE,mBAAO,IAAI,CAAC,KAAK,CAAC;SAAE,MAAM;AAAE,gBAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,AAAC,IAAI,MAAM,KAAK,SAAS,EAAE;AAAE,uBAAO,SAAS,CAAC;aAAE,AAAC,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SAAE;KAAE;CAAE,CAAC;;AAE9pB,SAAS,sBAAsB,CAAC,GAAG,EAAE;AAAE,WAAO,GAAG,IAAI,GAAG,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;CAAE;;AAEjG,SAAS,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE;AAAE,QAAI,EAAE,QAAQ,YAAY,WAAW,CAAA,AAAC,EAAE;AAAE,cAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;KAAE;CAAE;;AAEzJ,SAAS,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE;AAAE,QAAI,OAAO,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,IAAI,EAAE;AAAE,cAAM,IAAI,SAAS,CAAC,0DAA0D,GAAG,OAAO,UAAU,CAAC,CAAC;KAAE,AAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,AAAC,IAAI,UAAU,EAAE,QAAQ,CAAC,SAAS,GAAG,UAAU,CAAC;CAAE;;AAExa,IAAI,MAAM,GAAG,OAAO,CAdF,OAAO,CAAA,CAAA;;AAgBzB,IAAI,OAAO,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;;AAE7C,IAAI,SAAS,GAAG,OAAO,CAjBN,WAAW,CAAA,CAAA;;AAmB5B,IAAI,UAAU,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;;AAEnD,IAAI,OAAO,GAAG,OAAO,CAnBQ,QAAQ,CAAA,CAAA;;AAqBrC,IAAI,OAAO,GAAG,OAAO,CApBQ,QAAQ,CAAA,CAAA;;AAsBrC,IAAI,UAAU,GAAG,OAAO,CArBqB,WAAW,CAAA,CAAA;;AAuBxD,IAAI,QAAQ,GAAG,OAAO,CAtBE,WAAW,CAAA,CAAA;;AAEnC,IAAM,aAAa,GAAG,WAAW,CAAC;AAClC,IAAM,KAAK,GAAG,CAAA,CAAA,EAAA,OAAA,CAAA,SAAA,CAAA,CAAA,CAAM,oBAAoB,CAAC,CAAC;AAC1C,IAAM,aAAa,GAAG,GAAG,GAAG,IAAI,CAAC;;AAwBjC,IArBM,UAAU,GAAA,CAAA,UAAA,aAAA,EAAA;AAsBZ,aAAS,CAtBP,UAAU,EAAA,aAAA,CAAA,CAAA;;AACD,aADT,UAAU,GACc;AAwBtB,YAxBQ,OAAO,GAAA,SAAA,CAAA,MAAA,IAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAG,EAAE,GAAA,SAAA,CAAA,CAAA,CAAA,CAAA;;AA0BpB,uBAAe,CAAC,IAAI,EA3BtB,UAAU,CAAA,CAAA;;AAER,YAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AACjB,kBAAM,IAAI,KAAK,CAAC,4BAA8B,CAAC,CAAC;SACnD;AACD,YAAA,CAAA,MAAA,CAAA,cAAA,CALF,UAAU,CAAA,SAAA,CAAA,EAAA,aAAA,EAAA,IAAA,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAKA;AACR,YAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;AAC7B,YAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AAClB,YAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AACnB,YAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AACrB,YAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AACnB,YAAI,CAAC,MAAM,GAAG,aAAa,CAAC;AAC5B,YAAI,CAAC,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;AAC3B,YAAI,CAAC,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;KAC9B;;AA6BD,gBAAY,CA3CV,UAAU,EAAA,CAAA;AA4CR,WAAG,EAAE,OAAO;AACZ,aAAK,EAzBJ,SAAA,KAAA,GAAG;AA0BA,gBAAI,KAAK,GAAG,IAAI,CAAC;;AAzBrB,gBAAI,IAAI,CAAC,OAAO,EAAE;AACd,uBAAO;aACV;AACD,gBAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACpB,gBAAI,IAAI,CAAC,MAAM,EAAE;AACb,4BAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC1B,oBAAI,CAAC,MAAM,GAAG,IAAI,CAAC;aACtB;AACD,gBAAI,IAAI,CAAC,KAAK,EAAE;AACZ,oBAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;AACnB,oBAAI,CAAC,KAAK,GAAG,IAAI,CAAC;aACrB,MAAM;AACH,iBAAA,CAAA,EAAA,OAAA,CA1CH,YAAY,CAAA,CA0CI,YAAM;AACf,yBAAA,CAAK,SAAS,CAAC,QAAQ,CAAC,CAAC;iBAC5B,CAAC,CAAC;aACN;SACJ;KA4BA,EAAE;AACC,WAAG,EAAE,YAAY;AACjB,aAAK,EA5BC,SAAA,UAAA,GAA0B;AA6B5B,gBAAI,MAAM,GAAG,IAAI,CAAC;;AAElB,gBA/BG,OAAO,GAAA,SAAA,CAAA,MAAA,IAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAG,EAAE,GAAA,SAAA,CAAA,CAAA,CAAA,CAAA;AAgCf,gBAhCiB,EAAE,GAAA,SAAA,CAAA,MAAA,IAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAG,IAAI,GAAA,SAAA,CAAA,CAAA,CAAA,CAAA;;AAC9B,gBAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE;AAC7E,sBAAM,IAAI,KAAK,CAAC,4DAAgE,CAAC,CAAC;aACrF;AACD,gBAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACrC,sBAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;aAC5C;;AAED,gBAAI,GAAG,GAAG,IAAA,QAAA,CAtDT,OAAO,CAsDc,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;;AAE/D,gBAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;;AAEhC,gBAAI,GAAG,GAAG;AACN,uBAAO,EAAE,aAAa;AACtB,uBAAO,EAAE,GAAG,CAAC,EAAE;AACf,wBAAQ,EAAE,GAAG,CAAC,QAAQ;aACzB,CAAC;AACF,gBAAI,CAAC,YAAY,CAAC,GAAG,EAAE,UAAC,KAAK,EAAK;AAC9B,oBAAI,KAAK,EAAE;AACP,yBAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;AACtC,0BAAA,CAAK,SAAS,CAAA,QAAA,CAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC9B,uBAAG,GAAG,IAAI,CAAC;iBACd;AACD,oBAAI,EAAE,EAAE;AACJ,sBAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;iBAClB;aACJ,CAAC,CAAC;SAEN;KAiCA,EAAE;AACC,WAAG,EAAE,eAAe;AACpB,aAAK,EAjCI,SAAA,aAAA,CAAC,OAAO,EAAW;AAkCxB,gBAlCe,EAAE,GAAA,SAAA,CAAA,MAAA,IAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAC,IAAI,GAAA,SAAA,CAAA,CAAA,CAAA,CAAA;;AAC1B,gBAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC3C,gBAAI,OAAO,KAAK,GAAG,EAAE;AACjB,sBAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;aACtC;;;AAGD,gBAAI,CAAC,SAAS,CAAA,QAAA,CAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;;AAElC,gBAAI,GAAG,GAAG;AACN,uBAAO,EAAE,gBAAgB;AACzB,uBAAO,EAAE,GAAG,CAAC,EAAE;aAClB,CAAC;AACF,gBAAI,CAAC,YAAY,CAAC,GAAG,EAAE,UAAC,KAAK,EAAK;AAC9B,oBAAI,KAAK,EAAE;AACP,yBAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;iBAC5C;AACD,oBAAI,EAAE,EAAE;AACJ,sBAAE,EAAE,CAAC;iBACR;aACJ,CAAC,CAAC;SAEN;KAmCA,EAAE;AACC,WAAG,EAAE,aAAa;;;;AAIlB,aAAK,EApCE,SAAA,WAAA,GAAG;AAqCN,gBAAI,MAAM,GAAG,IAAI,CAAC;;AApCtB,gBAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;AACrB,sBAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;aACpD;AACD,gBAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE;AACtB,sBAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;aAChD;;AAED,iBAAK,CAAC,cAAc,CAAC,CAAC;;AAEtB,gBAAI,OAAO,CAAC,OAAO,EAAE;AACjB,sBAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,YAAM;AAC1C,wBAAI,MAAA,CAAK,KAAK,KAAK,IAAI,EAAE;AACrB,4BAAI,IAAI,GAAG,SAAP,IAAI,GAAc,EAAE,CAAC;AACzB,8BAAA,CAAK,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;AAC1B,8BAAA,CAAK,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;AAC5B,8BAAA,CAAK,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;AAC1B,8BAAA,CAAK,KAAK,CAAC,KAAK,EAAE,CAAC;qBACtB;iBACJ,CAAC,CAAC;aACN;;AAED,gBAAI,CAAC,MAAM,GAAG,UAAU,CAAC,YAAM;AAC3B,sBAAA,CAAK,QAAQ,EAAE,CAAC;aACnB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;SACnB;KAuCA,EAAE;AACC,WAAG,EAAE,UAAU;AACf,aAAK,EAvCD,SAAA,QAAA,GAAG;AAwCH,gBAAI,MAAM,GAAG,IAAI,CAAC;;AAvCtB,iBAAK,CAAC,sBAAsB,CAAC,CAAC;AAC9B,gBAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;;AAE7B,gBAAI,CAAC,KAAK,GAAG,IAAA,UAAA,CAtIZ,YAAY,CAsIiB,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAC1D,gBAAI,CAAC,KAAK,CAAC,MAAM,GAAG,YAAM;AACtB,qBAAK,CAAC,2BAA2B,CAAC,CAAC;AACnC,sBAAA,CAAK,OAAO,EAAE,CAAC;aAClB,CAAC;AACF,gBAAI,CAAC,KAAK,CAAC,OAAO,GAAG,YAAM;AACvB,qBAAK,CAAC,gCAAgC,CAAC,CAAC;aAC3C,CAAC;AACF,gBAAI,CAAC,KAAK,CAAC,OAAO,GAAG,UAAC,KAAK,EAAK;AAC5B,qBAAK,CAAC,0DAA4D,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC9G,sBAAA,CAAK,QAAQ,EAAE,CAAC;aACnB,CAAC;AACF,gBAAI,CAAC,KAAK,CAAC,SAAS,GAAG,UAAC,KAAK,EAAK;AAC9B,qBAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;AAC/C,sBAAA,CAAK,UAAU,CAAC,KAAK,CAAC,CAAC;aAC1B,CAAC;SACL;KA0CA,EAAE;AACC,WAAG,EAAE,cAAc;AACnB,aAAK,EA1CG,SAAA,YAAA,CAAC,GAAG,EAAE,EAAE,EAAE;AAClB,gBAAM,WAAW,GAAG,UAAA,CAAA,SAAA,CAAA,CAAK,EAAE,EAAE,CAAC;AAC9B,eAAG,CAAC,WAAW,GAAG,WAAW,CAAC;AAC9B,gBAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE;AACzB,iBAAA,CAAA,EAAA,OAAA,CA7JH,YAAY,CAAA,CA6JI,YAAM;AACf,sBAAE,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;iBAC5C,CAAC,CAAC;AACH,uBAAO;aACV;AACD,gBAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,EAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAC,CAAC,CAAC;AACpD,gBAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;SACxC;KA2CA,EAAE;AACC,WAAG,EAAE,WAAW;AAChB,aAAK,EA3CA,SAAA,SAAA,CAAC,QAAQ,EAAE;AAChB,iBAAK,CAAC,qBAAqB,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACpD,gBAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;AAC7B,gBAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;AACvB,gBAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;SACjD;KA4CA,EAAE;AACC,WAAG,EAAE,SAAS;;;;AAId,aAAK,EA7CF,SAAA,OAAA,GAAG;AACN,wBAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC1B,gBAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AACnB,gBAAI,CAAC,MAAM,GAAG,aAAa,CAAC;AAC5B,gBAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;SAC/B;KA8CA,EAAE;AACC,WAAG,EAAE,UAAU;AACf,aAAK,EA9CD,SAAA,QAAA,GAAG;AA+CH,gBAAI,MAAM,GAAG,IAAI,CAAC;;AA9CtB,gBAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AAClB,gBAAI,IAAI,CAAC,MAAM,EAAE;AACb,4BAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC1B,oBAAI,CAAC,MAAM,GAAG,IAAI,CAAC;aACtB;;;AAGD,gBAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;;AAEvB,gBAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;AAC/B,gBAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACf,oBAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9B,oBAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE;AAChC,wBAAI,CAAC,MAAM,GAAG,aAAa,CAAC;iBAC/B;AACD,qBAAK,CAAC,mCAAmC,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAC/D,oBAAI,CAAC,MAAM,GAAG,UAAU,CAAC,YAAM;AAC3B,0BAAA,CAAK,QAAQ,EAAE,CAAC;iBACnB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;aACnB,MAAM;AACH,oBAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;aAC5B;SACJ;KAiDA,EAAE;AACC,WAAG,EAAE,YAAY;AACjB,aAAK,EAjDC,SAAA,UAAA,CAAC,KAAK,EAAE;AACd,gBAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACrC,gBAAI,OAAO,OAAO,CAAC,OAAO,KAAK,WAAW,EAAE;AACxC,qBAAK,CAAC,+BAA+B,CAAC,CAAC;AACvC,uBAAO;aACV;;AAED,iBAAK,CAAC,2BAA6B,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;;AAE/D,gBAAI,OAAO,CAAC,OAAO,KAAK,OAAO,EAAE;AAC7B,qBAAK,CAAC,sBAAwB,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;AAC/C,wBAAQ,OAAO,CAAC,KAAK;AACjB,yBAAK,OAAO;AACR,4BAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACxB,8BAAM;AAAA;AAEN,8BAAM;AAAA,iBACb;aACJ,MAAM,IAAI,OAAO,CAAC,OAAO,KAAK,eAAe,EAAE;AAC5C,oBAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAC9C,oBAAI,CAAC,GAAG,EAAE;AACN,yBAAK,CAAC,sBAAsB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;AAC/C,2BAAO;iBACV;AACD,mBAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;aAC7B,MAAM,IAAI,OAAO,CAAC,OAAO,KAAK,eAAe,EAAE;AAC5C,oBAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;AAkD9B,oBAAI,yBAAyB,GAAG,IAAI,CAAC;AACrC,oBAAI,iBAAiB,GAAG,KAAK,CAAC;AAC9B,oBAAI,cAAc,GAAG,SAAS,CAAC;;AAE/B,oBAAI;AArDR,yBAAA,IAAA,SAAA,GAAgB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAA,MAAA,CAAA,QAAA,CAAA,EAAA,EAAA,KAAA,EAAA,EAAA,yBAAA,GAAA,CAAA,KAAA,GAAA,SAAA,CAAA,IAAA,EAAA,CAAA,CAAA,IAAA,CAAA,EAAA,yBAAA,GAAA,IAAA,EAAE;AAuD7B,4BAvDH,GAAG,GAAA,KAAA,CAAA,KAAA,CAAA;;AACR,4BAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACrC,4BAAI,IAAI,EAAE;AACN,gCAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AAC3B,kCAAM;yBACT;qBACJ;iBAyDI,CAAC,OAAO,GAAG,EAAE;AACV,qCAAiB,GAAG,IAAI,CAAC;AACzB,kCAAc,GAAG,GAAG,CAAC;iBACxB,SAAS;AACN,wBAAI;AACA,4BAAI,CAAC,yBAAyB,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE;AACnD,qCAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;yBACzB;qBACJ,SAAS;AACN,4BAAI,iBAAiB,EAAE;AACnB,kCAAM,cAAc,CAAC;yBACxB;qBACJ;iBACJ;aArER,MAAM,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,EAAE;AACjE,oBAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;AACxC,oBAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC7C,oBAAI,CAAC,IAAI,EAAE;AACP,yBAAK,CAAC,+BAA+B,EAAE,WAAW,CAAC,CAAC;AACpD,2BAAO;iBACV;AACD,oBAAI,CAAC,SAAS,CAAA,QAAA,CAAO,CAAC,WAAW,CAAC,CAAC;AACnC,qBAAK,CAAC,+BAAiC,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AACpE,oBAAI,IAAI,CAAC,EAAE,EAAE;AACT,wBAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE;AAC3B,4BAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;qBACjB,MAAM;AACH,4BAAI,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;qBACrC;iBACJ;aACJ;SACJ;KAuEA,EAAE;AACC,WAAG,EAAE,OAAO;AACZ,WAAG,EAlTE,SAAA,GAAA,GAAG;AACR,mBAAO,IAAI,CAAC,MAAM,CAAC;SACtB;KAmTA,CAAC,CAAC,CAAC;;AAEJ,WAvUE,UAAU,CAAA;CAwUf,CAAA,CAAE,OAAO,CAlVD,YAAY,CAAA,CAAA;;AAoVrB,OAAO,CA5EE,UAAU,GAAV,UAAU,CAAA;;;;;AC7QnB,YAAY,CAAC;;AAEb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE;AACzC,SAAK,EAAE,IAAI;CACd,CAAC,CAAC;;AAEH,SAAS,sBAAsB,CAAC,GAAG,EAAE;AAAE,WAAO,GAAG,IAAI,GAAG,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;CAAE;;AAEjG,IAAI,MAAM,GAAG,OAAO,CANF,OAAO,CAAA,CAAA;;AAQzB,IAAI,OAAO,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;;AAE7C,IAAI,SAAS,GAAG,OAAO,CATF,UAAU,CAAA,CAAA;;AAW/B,IAAI,UAAU,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;;AAEnD,IAAI,WAAW,GAAG,OAAO,CAZE,cAAc,CAAA,CAAA;;;;AAKzC,SAAS,gBAAgB,GAAe;AAYpC,QAZsB,OAAO,GAAA,SAAA,CAAA,MAAA,IAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAG,EAAE,GAAA,SAAA,CAAA,CAAA,CAAA,CAAA;;AAClC,QAAI,CAAC,UAAA,CAAA,SAAA,CAAA,CAAS,SAAS,EAAE,EAAE;AACvB,cAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;KAClD;;AAED,QAAI,IAAI,GAAG,IAAA,WAAA,CAVN,UAAU,CAUW,OAAO,CAAC,CAAC;AACnC,QAAI,CAAC,WAAW,EAAE,CAAC;AACnB,WAAO,IAAI,CAAC;CACf;;;;AAKD,SAAS,iBAAiB,GAAG;AACzB,WAAO,UAAA,CAAA,SAAA,CAAA,CAAS,SAAS,EAAE,CAAC;CAC/B;;AAED,SAAS,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE;AACxC,cAAA,CAAA,SAAA,CAAA,CAAS,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;CAC/C;;AAED,SAAS,gBAAgB,CAAC,MAAM,EAAE;AAC9B,cAAA,CAAA,SAAA,CAAA,CAAS,gBAAgB,CAAC,MAAM,CAAC,CAAC;CACrC;;AAcD,OAAO,CAVH,gBAAgB,GAAhB,gBAAgB,CAAA;AAWpB,OAAO,CAVH,KAAK,GAAA,OAAA,CAAA,SAAA,CAAA,CAAA;AAWT,OAAO,CAVH,iBAAiB,GAAjB,iBAAiB,CAAA;AAWrB,OAAO,CAXgB,gBAAgB,GAAhB,gBAAgB,CAAA;AAYvC,OAAO,CAZkC,iBAAiB,GAAjB,iBAAiB,CAAA;;;ACtC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACvPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC5SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7uBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxFA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"sylkrtc.js","sourceRoot":"/source/","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o {\n if (error) {\n DEBUG('Register error: %s', error);\n const oldState = this._registrationState;\n const newState = 'failed';\n let data = {reason: error.toString()};\n this._registrationState = newState;\n this.emit('registrationStateChanged', oldState, newState, data);\n }\n });\n }\n\n unregister() {\n let req = {\n sylkrtc: 'account-unregister',\n account: this._id,\n };\n this._sendRequest(req, (error) => {\n if (error) {\n DEBUG('Unregister error: %s', error);\n }\n const oldState = this._registrationState;\n const newState = null;\n this._registrationState = newState;\n this.emit('registrationStateChanged', oldState, newState, {});\n });\n }\n\n call(uri, options={}) {\n let call = new Call(this);\n call._initOutgoing(uri, options);\n this._calls.set(call.id, call);\n this.emit('outgoingCall', call);\n return call;\n }\n\n // Private API\n\n _handleEvent(message) {\n DEBUG('Received account event: %s', message.event);\n switch (message.event) {\n case 'registration_state':\n const oldState = this._registrationState;\n const newState = message.data.state;\n let data = {};\n this._registrationState = newState;\n if (newState === 'failed') {\n data.reason = message.data.reason;\n }\n this.emit('registrationStateChanged', oldState, newState, data);\n break;\n case 'incoming_session':\n let call = new Call(this);\n call._initIncoming(message.session, message.data.originator, message.data.sdp);\n this._calls.set(call.id, call);\n this.emit('incomingCall', call);\n break;\n default:\n break;\n }\n }\n\n _sendRequest(req, cb) {\n this._connection._sendRequest(req, cb);\n }\n\n}\n\n\nexport { Account };\n","'use strict';\n\nimport debug from 'debug';\nimport uuid from 'node-uuid';\nimport rtcninja from 'rtcninja';\n\nimport { EventEmitter } from 'events';\n\nconst DEBUG = debug('sylkrtc:Call');\n\n\nclass Call extends EventEmitter {\n constructor(account) {\n super();\n this._account = account;\n this._id = null;\n this._direction = null;\n this._pc = null;\n this._state = null;\n this._terminated = false;\n this._incomingSdp = null;\n this._remoteIdentity = null;\n }\n\n get account() {\n return this._account;\n }\n\n get id() {\n return this._id;\n }\n\n get direction() {\n return this._direction;\n }\n\n get state() {\n return this._state;\n }\n\n get localIdentity() {\n return this._account.id;\n }\n\n get remoteIdentity() {\n return this._remoteIdentity;\n }\n\n getLocalStreams() {\n if (this._pc !== null) {\n return this._pc.getLocalStreams();\n } else {\n return [];\n }\n }\n\n getRemoteStreams() {\n if (this._pc !== null) {\n return this._pc.getRemoteStreams();\n } else {\n return [];\n }\n }\n\n answer(options = {}) {\n if (this._state !== 'incoming') {\n throw new Error('Call is not in the incoming state: ' + this._state);\n }\n\n const self = this;\n const pcConfig = options.pcConfig || {iceServers:[]};\n const mediaConstraints = options.mediaConstraints || {audio: true, video: true};\n const answerOptions = options.answerOptions;\n\n // Create the RTCPeerConnection\n this._initRTCPeerConnection(pcConfig);\n\n // Get the user media\n rtcninja.getUserMedia(\n mediaConstraints,\n userMediaSucceeded,\n userMediaFailed\n );\n\n function userMediaSucceeded(stream) {\n // adding a local stream doesn't trigger the 'onaddstream' callback\n self._pc.addStream(stream);\n self.emit('localStreamAdded', stream);\n\n self._pc.setRemoteDescription(\n new rtcninja.RTCSessionDescription({type: 'offer', sdp: self._incomingSdp}),\n // success\n function() {\n self._createLocalSDP(\n 'answer',\n answerOptions,\n // success\n function(sdp) {\n DEBUG('Local SDP: %s', sdp);\n self._sendAnswer(sdp);\n },\n // failure\n function(error) {\n DEBUG('Error creating local SDP: %s', error);\n self.terminate();\n }\n );\n },\n // failure\n function(error) {\n DEBUG('Error setting remote description: %s', error);\n self.terminate();\n }\n );\n }\n\n function userMediaFailed(error) {\n DEBUG('Error getting user media: %s', error);\n self.terminate();\n }\n }\n\n terminate() {\n if (this._terminated) {\n return;\n }\n\n this._sendTerminate();\n }\n\n // Private API\n\n _initOutgoing(uri, options={}) {\n if (uri.indexOf('@') === -1) {\n throw new Error('Invalid URI');\n }\n\n this._id = uuid.v4();\n this._direction = 'outgoing';\n\n const self = this;\n const pcConfig = options.pcConfig || {iceServers:[]};\n const mediaConstraints = options.mediaConstraints || {audio: true, video: true};\n const offerOptions = options.offerOptions;\n\n // Create the RTCPeerConnection\n this._initRTCPeerConnection(pcConfig);\n\n // Get the user media\n rtcninja.getUserMedia(\n mediaConstraints,\n userMediaSucceeded,\n userMediaFailed\n );\n\n function userMediaSucceeded(stream) {\n // adding a local stream doesn't trigger the 'onaddstream' callback\n self._pc.addStream(stream);\n self.emit('localStreamAdded', stream);\n\n self._createLocalSDP(\n 'offer',\n offerOptions,\n // success\n function(sdp) {\n DEBUG('Local SDP: %s', sdp);\n self._sendCall(uri, sdp);\n },\n // failure\n function(error) {\n DEBUG('Error creating local SDP: %s', error);\n self._localTerminate(error);\n }\n );\n }\n\n function userMediaFailed(error) {\n DEBUG('Error getting user media: %s', error);\n self._localTerminate(error);\n }\n }\n\n _initIncoming(id, caller, sdp) {\n this._id = id;\n this._remoteIdentity = caller;\n this._incomingSdp = sdp;\n this._direction = 'incoming';\n this._state = 'incoming';\n }\n\n _handleEvent(message) {\n DEBUG('Call event: %o', message);\n switch (message.event) {\n case 'state':\n const oldState = this._state;\n const newState = message.data.state;\n this._state = newState;\n let data = {};\n\n if (newState === 'accepted' && this._direction === 'outgoing') {\n const self = this;\n this._pc.setRemoteDescription(\n new rtcninja.RTCSessionDescription({type: 'answer', sdp: message.data.sdp}),\n // success\n function() {\n DEBUG('Call accepted');\n self.emit('stateChanged', oldState, newState, data);\n },\n // failure\n function(error) {\n DEBUG('Error accepting call: %s', error);\n self.terminate();\n }\n );\n } else {\n if (newState === 'terminated') {\n data.reason = message.data.reason;\n this._terminated = true;\n }\n this.emit('stateChanged', oldState, newState, data);\n if (newState === 'terminated') {\n this._closeRTCPeerConnection();\n }\n }\n break;\n default:\n break;\n }\n }\n\n _initRTCPeerConnection(pcConfig) {\n if (this._pc !== null) {\n throw new Error('RTCPeerConnection already initialized');\n }\n\n const self = this;\n this._pc = new rtcninja.RTCPeerConnection(pcConfig);\n this._pc.onaddstream = function(event, stream) {\n DEBUG('Stream added');\n self.emit('streamAdded', stream);\n };\n this._pc.onicecandidate = function(event) {\n let candidate = null;\n if (event.candidate !== null) {\n candidate = {\n 'candidate': event.candidate.candidate,\n 'sdpMid': event.candidate.sdpMid,\n 'sdpMLineIndex': event.candidate.sdpMLineIndex\n };\n DEBUG('New ICE candidate %o', candidate);\n }\n self._sendTrickle(candidate);\n };\n }\n\n _createLocalSDP(type, options, onSuccess, onFailure) {\n const self = this;\n\n if (type === 'offer') {\n this._pc.createOffer(\n // success\n createSucceeded,\n // failure\n failure,\n // options\n options\n );\n } else if (type === 'answer') {\n this._pc.createAnswer(\n // success\n createSucceeded,\n // failure\n failure,\n // options\n options\n );\n } else {\n throw new Error('type must be \"offer\" or \"answer\", but \"' +type+ '\" was given');\n }\n\n function createSucceeded(desc) {\n self._pc.setLocalDescription(\n desc,\n // success\n function() {\n onSuccess(self._pc.localDescription.sdp);\n },\n // failure\n failure\n );\n }\n\n function failure(error) {\n onFailure(error);\n }\n }\n\n _sendRequest(req, cb) {\n this._account._sendRequest(req, cb);\n }\n\n _sendCall(uri, sdp) {\n let req = {\n sylkrtc: 'session-create',\n account: this.account.id,\n session: this.id,\n uri: uri,\n sdp: sdp\n };\n const self = this;\n this._sendRequest(req, function(error) {\n if (error) {\n DEBUG('Call error: %s', error);\n self._localTerminate(error);\n }\n });\n }\n\n _sendTerminate() {\n let req = {\n sylkrtc: 'session-terminate',\n session: this.id\n };\n const self = this;\n this._sendRequest(req, function(error) {\n if (error) {\n DEBUG('Error terminating call: %s', error);\n self._localTerminate(error);\n }\n self._terminated = true;\n });\n }\n\n _sendTrickle(candidate) {\n let req = {\n sylkrtc: 'session-trickle',\n session: this.id,\n candidates: candidate !== null ? [candidate] : [],\n };\n this._sendRequest(req, null);\n }\n\n _sendAnswer(sdp) {\n let req = {\n sylkrtc: 'session-answer',\n session: this.id,\n sdp: sdp\n };\n const self = this;\n this._sendRequest(req, function(error) {\n if (error) {\n DEBUG('Answer error: %s', error);\n self.terminate();\n }\n });\n }\n\n _closeRTCPeerConnection() {\n DEBUG('Closing RTCPeerConnection');\n if (this._pc !== null) {\n for (let stream of this._pc.getLocalStreams()) {\n rtcninja.closeMediaStream(stream);\n }\n for (let stream of this._pc.getRemoteStreams()) {\n rtcninja.closeMediaStream(stream);\n }\n this._pc.close();\n this._pc = null;\n }\n }\n\n _localTerminate(error) {\n if (this._terminated) {\n return;\n }\n this._account._calls.delete(this.id);\n this._terminated = true;\n const oldState = this._state;\n const newState = 'terminated';\n let data = {\n reason: error.toString()\n };\n this.emit('stateChanged', oldState, newState, data);\n this._closeRTCPeerConnection();\n }\n}\n\n\nexport { Call };\n","'use strict';\n\nimport debug from 'debug';\nimport uuid from 'node-uuid';\n\nimport { EventEmitter } from 'events';\nimport { setImmediate } from 'timers';\nimport { w3cwebsocket as W3CWebSocket } from 'websocket';\nimport { Account } from './account';\n\nconst SYLKRTC_PROTO = 'sylkRTC-1';\nconst DEBUG = debug('sylkrtc:Connection');\nconst INITIAL_DELAY = 0.5 * 1000;\n\n\nclass Connection extends EventEmitter {\n constructor(options = {}) {\n if (!options.server) {\n throw new Error('\\\"server\\\" must be specified');\n }\n super();\n this._wsUri = options.server;\n this._sock = null;\n this._state = null;\n this._closed = false;\n this._timer = null;\n this._delay = INITIAL_DELAY;\n this._accounts = new Map();\n this._requests = new Map();\n }\n\n get state() {\n return this._state;\n }\n\n close() {\n if (this._closed) {\n return;\n }\n this._closed = true;\n if (this._timer) {\n clearTimeout(this._timer);\n this._timer = null;\n }\n if (this._sock) {\n this._sock.close();\n this._sock = null;\n } else {\n setImmediate(() => {\n this._setState('closed');\n });\n }\n }\n\n addAccount(options = {}, cb = null) {\n if (typeof options.account !== 'string' || typeof options.password !== 'string') {\n throw new Error('Invalid options, \\\"account\\\" and \\\"password\\\" must be supplied');\n }\n if (this._accounts.has(options.account)) {\n throw new Error('Account already added');\n }\n\n let acc = new Account(options.account, options.password, this);\n // add it early to the set so we don't add it more than once, ever\n this._accounts.set(acc.id, acc);\n\n let req = {\n sylkrtc: 'account-add',\n account: acc.id,\n password: acc.password\n };\n this._sendRequest(req, (error) => {\n if (error) {\n DEBUG('add_account error: %s', error);\n this._accounts.delete(acc.id);\n acc = null;\n }\n if (cb) {\n cb(error, acc);\n }\n });\n\n }\n\n removeAccount(account, cb=null) {\n const acc = this._accounts.get(account.id);\n if (account !== acc) {\n throw new Error('Unknown account');\n }\n\n // delete the account from the mapping, regardless of the result\n this._accounts.delete(account.id);\n\n let req = {\n sylkrtc: 'account-remove',\n account: acc.id\n };\n this._sendRequest(req, (error) => {\n if (error) {\n DEBUG('remove_account error: %s', error);\n }\n if (cb) {\n cb();\n }\n });\n\n }\n\n // Private API\n\n _initialize() {\n if (this._sock !== null) {\n throw new Error('WebSocket already initialized');\n }\n if (this._timer !== null) {\n throw new Error('Initialize is in progress');\n }\n\n DEBUG('Initializing');\n\n if (process.browser) {\n window.addEventListener('beforeunload', () => {\n if (this._sock !== null) {\n let noop = function() {};\n this._sock.onerror = noop;\n this._sock.onmessage = noop;\n this._sock.onclose = noop;\n this._sock.close();\n }\n });\n }\n\n this._timer = setTimeout(() => {\n this._connect();\n }, this._delay);\n }\n\n _connect() {\n DEBUG('WebSocket connecting');\n this._setState('connecting');\n\n this._sock = new W3CWebSocket(this._wsUri, SYLKRTC_PROTO);\n this._sock.onopen = () => {\n DEBUG('WebSocket connection open');\n this._onOpen();\n };\n this._sock.onerror = () => {\n DEBUG('WebSocket connection got error');\n };\n this._sock.onclose = (event) => {\n DEBUG('WebSocket connection closed: %d: (reason=\\\"%s\\\", clean=%s)', event.code, event.reason, event.wasClean);\n this._onClose();\n };\n this._sock.onmessage = (event) => {\n DEBUG('WebSocket received message: %o', event);\n this._onMessage(event);\n };\n }\n\n _sendRequest(req, cb) {\n const transaction = uuid.v4();\n req.transaction = transaction;\n if (this._state !== 'ready') {\n setImmediate(() => {\n cb(new Error('Connection is not ready'));\n });\n return;\n }\n this._requests.set(transaction, {req: req, cb: cb});\n this._sock.send(JSON.stringify(req));\n }\n\n _setState(newState) {\n DEBUG('Set state: %s -> %s', this._state, newState);\n const oldState = this._state;\n this._state = newState;\n this.emit('stateChanged', oldState, newState);\n }\n\n // WebSocket callbacks\n\n _onOpen() {\n clearTimeout(this._timer);\n this._timer = null;\n this._delay = INITIAL_DELAY;\n this._setState('connected');\n }\n\n _onClose() {\n this._sock = null;\n if (this._timer) {\n clearTimeout(this._timer);\n this._timer = null;\n }\n\n // remove all accounts, the server no longer has them anyway\n this._accounts.clear();\n\n this._setState('disconnected');\n if (!this._closed) {\n this._delay = this._delay * 2;\n if (this._delay > Number.MAX_VALUE) {\n this._delay = INITIAL_DELAY;\n }\n DEBUG('Retrying connection in %s seconds', this._delay / 1000);\n this._timer = setTimeout(() => {\n this._connect();\n }, this._delay);\n } else {\n this._setState('closed');\n }\n }\n\n _onMessage(event) {\n let message = JSON.parse(event.data);\n if (typeof message.sylkrtc === 'undefined') {\n DEBUG('Unrecognized message received');\n return;\n }\n\n DEBUG('Received \\\"%s\\\" message: %o', message.sylkrtc, message);\n\n if (message.sylkrtc === 'event') {\n DEBUG('Received event: \\\"%s\\\"', message.event);\n switch (message.event) {\n case 'ready':\n this._setState('ready');\n break;\n default:\n break;\n }\n } else if (message.sylkrtc === 'account_event') {\n let acc = this._accounts.get(message.account);\n if (!acc) {\n DEBUG('Account %s not found', message.account);\n return;\n }\n acc._handleEvent(message);\n } else if (message.sylkrtc === 'session_event') {\n const sessionId = message.session;\n for (let acc of this._accounts.values()) {\n let call = acc._calls.get(sessionId);\n if (call) {\n call._handleEvent(message);\n break;\n }\n }\n } else if (message.sylkrtc === 'ack' || message.sylkrtc === 'error') {\n const transaction = message.transaction;\n const data = this._requests.get(transaction);\n if (!data) {\n DEBUG('Could not find transaction %s', transaction);\n return;\n }\n this._requests.delete(transaction);\n DEBUG('Received \\\"%s\\\" for request: %o', message.sylkrtc, data.req);\n if (data.cb) {\n if (message.sylkrtc === 'ack') {\n data.cb(null);\n } else {\n data.cb(new Error(message.error));\n }\n }\n }\n }\n\n}\n\n\nexport { Connection };\n","'use strict';\n\nimport debug from 'debug';\nimport rtcninja from 'rtcninja';\nimport { Connection } from './connection';\n\n\n// Public API\n\nfunction createConnection(options = {}) {\n if (!rtcninja.hasWebRTC()) {\n throw new Error('WebRTC support not detected');\n }\n\n let conn = new Connection(options);\n conn._initialize();\n return conn;\n}\n\n\n// Some proxied functions from rtcninja\n\nfunction isWebRTCSupported() {\n return rtcninja.hasWebRTC();\n}\n\nfunction attachMediaStream(element, stream) {\n rtcninja.attachMediaStream(element, stream);\n}\n\nfunction closeMediaStream(stream) {\n rtcninja.closeMediaStream(stream);\n}\n\n\nexport {\n createConnection,\n debug,\n attachMediaStream, closeMediaStream, isWebRTCSupported\n};\n","/*\n * JavaScript MD5 1.0.1\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/MIT\n * \n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/*jslint bitwise: true */\n/*global unescape, define */\n\n(function ($) {\n 'use strict';\n\n /*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n function safe_add(x, y) {\n var lsw = (x & 0xFFFF) + (y & 0xFFFF),\n msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xFFFF);\n }\n\n /*\n * Bitwise rotate a 32-bit number to the left.\n */\n function bit_rol(num, cnt) {\n return (num << cnt) | (num >>> (32 - cnt));\n }\n\n /*\n * These functions implement the four basic operations the algorithm uses.\n */\n function md5_cmn(q, a, b, x, s, t) {\n return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);\n }\n function md5_ff(a, b, c, d, x, s, t) {\n return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);\n }\n function md5_gg(a, b, c, d, x, s, t) {\n return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);\n }\n function md5_hh(a, b, c, d, x, s, t) {\n return md5_cmn(b ^ c ^ d, a, b, x, s, t);\n }\n function md5_ii(a, b, c, d, x, s, t) {\n return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);\n }\n\n /*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n function binl_md5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << (len % 32);\n x[(((len + 64) >>> 9) << 4) + 14] = len;\n\n var i, olda, oldb, oldc, oldd,\n a = 1732584193,\n b = -271733879,\n c = -1732584194,\n d = 271733878;\n\n for (i = 0; i < x.length; i += 16) {\n olda = a;\n oldb = b;\n oldc = c;\n oldd = d;\n\n a = md5_ff(a, b, c, d, x[i], 7, -680876936);\n d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);\n\n a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5_gg(b, c, d, a, x[i], 20, -373897302);\n a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);\n\n a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5_hh(d, a, b, c, x[i], 11, -358537222);\n c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);\n\n a = md5_ii(a, b, c, d, x[i], 6, -198630844);\n d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);\n\n a = safe_add(a, olda);\n b = safe_add(b, oldb);\n c = safe_add(c, oldc);\n d = safe_add(d, oldd);\n }\n return [a, b, c, d];\n }\n\n /*\n * Convert an array of little-endian words to a string\n */\n function binl2rstr(input) {\n var i,\n output = '';\n for (i = 0; i < input.length * 32; i += 8) {\n output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);\n }\n return output;\n }\n\n /*\n * Convert a raw string to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n function rstr2binl(input) {\n var i,\n output = [];\n output[(input.length >> 2) - 1] = undefined;\n for (i = 0; i < output.length; i += 1) {\n output[i] = 0;\n }\n for (i = 0; i < input.length * 8; i += 8) {\n output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);\n }\n return output;\n }\n\n /*\n * Calculate the MD5 of a raw string\n */\n function rstr_md5(s) {\n return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));\n }\n\n /*\n * Calculate the HMAC-MD5, of a key and some data (raw strings)\n */\n function rstr_hmac_md5(key, data) {\n var i,\n bkey = rstr2binl(key),\n ipad = [],\n opad = [],\n hash;\n ipad[15] = opad[15] = undefined;\n if (bkey.length > 16) {\n bkey = binl_md5(bkey, key.length * 8);\n }\n for (i = 0; i < 16; i += 1) {\n ipad[i] = bkey[i] ^ 0x36363636;\n opad[i] = bkey[i] ^ 0x5C5C5C5C;\n }\n hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\n return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));\n }\n\n /*\n * Convert a raw string to a hex string\n */\n function rstr2hex(input) {\n var hex_tab = '0123456789abcdef',\n output = '',\n x,\n i;\n for (i = 0; i < input.length; i += 1) {\n x = input.charCodeAt(i);\n output += hex_tab.charAt((x >>> 4) & 0x0F) +\n hex_tab.charAt(x & 0x0F);\n }\n return output;\n }\n\n /*\n * Encode a string as utf-8\n */\n function str2rstr_utf8(input) {\n return unescape(encodeURIComponent(input));\n }\n\n /*\n * Take string arguments and return either raw or hex encoded strings\n */\n function raw_md5(s) {\n return rstr_md5(str2rstr_utf8(s));\n }\n function hex_md5(s) {\n return rstr2hex(raw_md5(s));\n }\n function raw_hmac_md5(k, d) {\n return rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d));\n }\n function hex_hmac_md5(k, d) {\n return rstr2hex(raw_hmac_md5(k, d));\n }\n\n function md5(string, key, raw) {\n if (!key) {\n if (!raw) {\n return hex_md5(string);\n }\n return raw_md5(string);\n }\n if (!raw) {\n return hex_hmac_md5(key, string);\n }\n return raw_hmac_md5(key, string);\n }\n\n if (typeof define === 'function' && define.amd) {\n define(function () {\n return md5;\n });\n } else {\n $.md5 = md5;\n }\n}(this));\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n this._events = this._events || {};\n this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n if (!isNumber(n) || n < 0 || isNaN(n))\n throw TypeError('n must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n var er, handler, len, args, i, listeners;\n\n if (!this._events)\n this._events = {};\n\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events.error ||\n (isObject(this._events.error) && !this._events.error.length)) {\n er = arguments[1];\n if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n }\n throw TypeError('Uncaught, unspecified \"error\" event.');\n }\n }\n\n handler = this._events[type];\n\n if (isUndefined(handler))\n return false;\n\n if (isFunction(handler)) {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n len = arguments.length;\n args = new Array(len - 1);\n for (i = 1; i < len; i++)\n args[i - 1] = arguments[i];\n handler.apply(this, args);\n }\n } else if (isObject(handler)) {\n len = arguments.length;\n args = new Array(len - 1);\n for (i = 1; i < len; i++)\n args[i - 1] = arguments[i];\n\n listeners = handler.slice();\n len = listeners.length;\n for (i = 0; i < len; i++)\n listeners[i].apply(this, args);\n }\n\n return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n var m;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events)\n this._events = {};\n\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (this._events.newListener)\n this.emit('newListener', type,\n isFunction(listener.listener) ?\n listener.listener : listener);\n\n if (!this._events[type])\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n else if (isObject(this._events[type]))\n // If we've already got an array, just append.\n this._events[type].push(listener);\n else\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n\n // Check for listener leak\n if (isObject(this._events[type]) && !this._events[type].warned) {\n var m;\n if (!isUndefined(this._maxListeners)) {\n m = this._maxListeners;\n } else {\n m = EventEmitter.defaultMaxListeners;\n }\n\n if (m && m > 0 && this._events[type].length > m) {\n this._events[type].warned = true;\n console.error('(node) warning: possible EventEmitter memory ' +\n 'leak detected. %d listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit.',\n this._events[type].length);\n if (typeof console.trace === 'function') {\n // not supported in IE 10\n console.trace();\n }\n }\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n var fired = false;\n\n function g() {\n this.removeListener(type, g);\n\n if (!fired) {\n fired = true;\n listener.apply(this, arguments);\n }\n }\n\n g.listener = listener;\n this.on(type, g);\n\n return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n var list, position, length, i;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events || !this._events[type])\n return this;\n\n list = this._events[type];\n length = list.length;\n position = -1;\n\n if (list === listener ||\n (isFunction(list.listener) && list.listener === listener)) {\n delete this._events[type];\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n\n } else if (isObject(list)) {\n for (i = length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list.length = 0;\n delete this._events[type];\n } else {\n list.splice(position, 1);\n }\n\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n var key, listeners;\n\n if (!this._events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!this._events.removeListener) {\n if (arguments.length === 0)\n this._events = {};\n else if (this._events[type])\n delete this._events[type];\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n for (key in this._events) {\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = {};\n return this;\n }\n\n listeners = this._events[type];\n\n if (isFunction(listeners)) {\n this.removeListener(type, listeners);\n } else {\n // LIFO order\n while (listeners.length)\n this.removeListener(type, listeners[listeners.length - 1]);\n }\n delete this._events[type];\n\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n var ret;\n if (!this._events || !this._events[type])\n ret = [];\n else if (isFunction(this._events[type]))\n ret = [this._events[type]];\n else\n ret = this._events[type].slice();\n return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n var ret;\n if (!emitter._events || !emitter._events[type])\n ret = 0;\n else if (isFunction(emitter._events[type]))\n ret = 1;\n else\n ret = emitter._events[type].length;\n return ret;\n};\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\n","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n currentQueue[queueIndex].run();\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\n// TODO(shtylman)\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","var nextTick = require('process/browser.js').nextTick;\nvar apply = Function.prototype.apply;\nvar slice = Array.prototype.slice;\nvar immediateIds = {};\nvar nextImmediateId = 0;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) { timeout.close(); };\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// That's not how node.js implements it but the exposed api is the same.\nexports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n var id = nextImmediateId++;\n var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\n immediateIds[id] = true;\n\n nextTick(function onNextTick() {\n if (immediateIds[id]) {\n // fn.call() is faster so we optimize for the common use-case\n // @see http://jsperf.com/call-apply-segu\n if (args) {\n fn.apply(null, args);\n } else {\n fn.call(null);\n }\n // Prevent ids from leaking\n exports.clearImmediate(id);\n }\n });\n\n return id;\n};\n\nexports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n delete immediateIds[id];\n};","\n/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n && 'undefined' != typeof chrome.storage\n ? chrome.storage.local\n : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n 'lightseagreen',\n 'forestgreen',\n 'goldenrod',\n 'dodgerblue',\n 'darkorchid',\n 'crimson'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n // is webkit? http://stackoverflow.com/a/16459606/376773\n return ('WebkitAppearance' in document.documentElement.style) ||\n // is firebug? http://stackoverflow.com/a/398120/376773\n (window.console && (console.firebug || (console.exception && console.table))) ||\n // is firefox >= v31?\n // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n (navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31);\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n return JSON.stringify(v);\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs() {\n var args = arguments;\n var useColors = this.useColors;\n\n args[0] = (useColors ? '%c' : '')\n + this.namespace\n + (useColors ? ' %c' : ' ')\n + args[0]\n + (useColors ? '%c ' : ' ')\n + '+' + exports.humanize(this.diff);\n\n if (!useColors) return args;\n\n var c = 'color: ' + this.color;\n args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1));\n\n // the final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n var index = 0;\n var lastC = 0;\n args[0].replace(/%[a-z%]/g, function(match) {\n if ('%%' === match) return;\n index++;\n if ('%c' === match) {\n // we only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index;\n }\n });\n\n args.splice(lastC, 0, c);\n return args;\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n // this hackery is required for IE8/9, where\n // the `console.log` function doesn't have 'apply'\n return 'object' === typeof console\n && console.log\n && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n try {\n if (null == namespaces) {\n exports.storage.removeItem('debug');\n } else {\n exports.storage.debug = namespaces;\n }\n } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n var r;\n try {\n r = exports.storage.debug;\n } catch(e) {}\n return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage(){\n try {\n return window.localStorage;\n } catch (e) {}\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = debug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = require('ms');\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lowercased letter, i.e. \"n\".\n */\n\nexports.formatters = {};\n\n/**\n * Previously assigned color.\n */\n\nvar prevColor = 0;\n\n/**\n * Previous log timestamp.\n */\n\nvar prevTime;\n\n/**\n * Select a color.\n *\n * @return {Number}\n * @api private\n */\n\nfunction selectColor() {\n return exports.colors[prevColor++ % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction debug(namespace) {\n\n // define the `disabled` version\n function disabled() {\n }\n disabled.enabled = false;\n\n // define the `enabled` version\n function enabled() {\n\n var self = enabled;\n\n // set `diff` timestamp\n var curr = +new Date();\n var ms = curr - (prevTime || curr);\n self.diff = ms;\n self.prev = prevTime;\n self.curr = curr;\n prevTime = curr;\n\n // add the `color` if not set\n if (null == self.useColors) self.useColors = exports.useColors();\n if (null == self.color && self.useColors) self.color = selectColor();\n\n var args = Array.prototype.slice.call(arguments);\n\n args[0] = exports.coerce(args[0]);\n\n if ('string' !== typeof args[0]) {\n // anything else let's inspect with %o\n args = ['%o'].concat(args);\n }\n\n // apply any `formatters` transformations\n var index = 0;\n args[0] = args[0].replace(/%([a-z%])/g, function(match, format) {\n // if we encounter an escaped % then don't increase the array index\n if (match === '%%') return match;\n index++;\n var formatter = exports.formatters[format];\n if ('function' === typeof formatter) {\n var val = args[index];\n match = formatter.call(self, val);\n\n // now we need to remove `args[index]` since it's inlined in the `format`\n args.splice(index, 1);\n index--;\n }\n return match;\n });\n\n if ('function' === typeof exports.formatArgs) {\n args = exports.formatArgs.apply(self, args);\n }\n var logFn = enabled.log || exports.log || console.log.bind(console);\n logFn.apply(self, args);\n }\n enabled.enabled = true;\n\n var fn = exports.enabled(namespace) ? enabled : disabled;\n\n fn.namespace = namespace;\n\n return fn;\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n exports.save(namespaces);\n\n var split = (namespaces || '').split(/[\\s,]+/);\n var len = split.length;\n\n for (var i = 0; i < len; i++) {\n if (!split[i]) continue; // ignore empty strings\n namespaces = split[i].replace(/\\*/g, '.*?');\n if (namespaces[0] === '-') {\n exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n } else {\n exports.names.push(new RegExp('^' + namespaces + '$'));\n }\n }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n var i, len;\n for (i = 0, len = exports.skips.length; i < len; i++) {\n if (exports.skips[i].test(name)) {\n return false;\n }\n }\n for (i = 0, len = exports.names.length; i < len; i++) {\n if (exports.names[i].test(name)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n if (val instanceof Error) return val.stack || val.message;\n return val;\n}\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} options\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options){\n options = options || {};\n if ('string' == typeof val) return parse(val);\n return options.long\n ? long(val)\n : short(val);\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = '' + str;\n if (str.length > 10000) return;\n var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str);\n if (!match) return;\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction short(ms) {\n if (ms >= d) return Math.round(ms / d) + 'd';\n if (ms >= h) return Math.round(ms / h) + 'h';\n if (ms >= m) return Math.round(ms / m) + 'm';\n if (ms >= s) return Math.round(ms / s) + 's';\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction long(ms) {\n return plural(ms, d, 'day')\n || plural(ms, h, 'hour')\n || plural(ms, m, 'minute')\n || plural(ms, s, 'second')\n || ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n if (ms < n) return;\n if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name;\n return Math.ceil(ms / n) + ' ' + name + 's';\n}\n","// uuid.js\n//\n// Copyright (c) 2010-2012 Robert Kieffer\n// MIT License - http://opensource.org/licenses/mit-license.php\n\n(function() {\n var _global = this;\n\n // Unique ID creation requires a high quality random # generator. We feature\n // detect to determine the best RNG source, normalizing to a function that\n // returns 128-bits of randomness, since that's what's usually required\n var _rng;\n\n // Node.js crypto-based RNG - http://nodejs.org/docs/v0.6.2/api/crypto.html\n //\n // Moderately fast, high quality\n if (typeof(_global.require) == 'function') {\n try {\n var _rb = _global.require('crypto').randomBytes;\n _rng = _rb && function() {return _rb(16);};\n } catch(e) {}\n }\n\n if (!_rng && _global.crypto && crypto.getRandomValues) {\n // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto\n //\n // Moderately fast, high quality\n var _rnds8 = new Uint8Array(16);\n _rng = function whatwgRNG() {\n crypto.getRandomValues(_rnds8);\n return _rnds8;\n };\n }\n\n if (!_rng) {\n // Math.random()-based (RNG)\n //\n // If all else fails, use Math.random(). It's fast, but is of unspecified\n // quality.\n var _rnds = new Array(16);\n _rng = function() {\n for (var i = 0, r; i < 16; i++) {\n if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n }\n\n return _rnds;\n };\n }\n\n // Buffer class to use\n var BufferClass = typeof(_global.Buffer) == 'function' ? _global.Buffer : Array;\n\n // Maps for number <-> hex string conversion\n var _byteToHex = [];\n var _hexToByte = {};\n for (var i = 0; i < 256; i++) {\n _byteToHex[i] = (i + 0x100).toString(16).substr(1);\n _hexToByte[_byteToHex[i]] = i;\n }\n\n // **`parse()` - Parse a UUID into it's component bytes**\n function parse(s, buf, offset) {\n var i = (buf && offset) || 0, ii = 0;\n\n buf = buf || [];\n s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) {\n if (ii < 16) { // Don't overflow!\n buf[i + ii++] = _hexToByte[oct];\n }\n });\n\n // Zero out remaining bytes if string was short\n while (ii < 16) {\n buf[i + ii++] = 0;\n }\n\n return buf;\n }\n\n // **`unparse()` - Convert UUID byte array (ala parse()) into a string**\n function unparse(buf, offset) {\n var i = offset || 0, bth = _byteToHex;\n return bth[buf[i++]] + bth[buf[i++]] +\n bth[buf[i++]] + bth[buf[i++]] + '-' +\n bth[buf[i++]] + bth[buf[i++]] + '-' +\n bth[buf[i++]] + bth[buf[i++]] + '-' +\n bth[buf[i++]] + bth[buf[i++]] + '-' +\n bth[buf[i++]] + bth[buf[i++]] +\n bth[buf[i++]] + bth[buf[i++]] +\n bth[buf[i++]] + bth[buf[i++]];\n }\n\n // **`v1()` - Generate time-based UUID**\n //\n // Inspired by https://github.com/LiosK/UUID.js\n // and http://docs.python.org/library/uuid.html\n\n // random #'s we need to init node and clockseq\n var _seedBytes = _rng();\n\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n var _nodeId = [\n _seedBytes[0] | 0x01,\n _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5]\n ];\n\n // Per 4.2.2, randomize (14 bit) clockseq\n var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff;\n\n // Previous uuid creation time\n var _lastMSecs = 0, _lastNSecs = 0;\n\n // See https://github.com/broofa/node-uuid for API details\n function v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || [];\n\n options = options || {};\n\n var clockseq = options.clockseq != null ? options.clockseq : _clockseq;\n\n // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n var msecs = options.msecs != null ? options.msecs : new Date().getTime();\n\n // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n var nsecs = options.nsecs != null ? options.nsecs : _lastNSecs + 1;\n\n // Time since last uuid creation (in msecs)\n var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;\n\n // Per 4.2.1.2, Bump clockseq on clock regression\n if (dt < 0 && options.clockseq == null) {\n clockseq = clockseq + 1 & 0x3fff;\n }\n\n // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) {\n nsecs = 0;\n }\n\n // Per 4.2.1.2 Throw error if too many uuids are requested\n if (nsecs >= 10000) {\n throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq;\n\n // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n msecs += 12219292800000;\n\n // `time_low`\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff;\n\n // `time_mid`\n var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff;\n\n // `time_high_and_version`\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n b[i++] = tmh >>> 16 & 0xff;\n\n // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n b[i++] = clockseq >>> 8 | 0x80;\n\n // `clock_seq_low`\n b[i++] = clockseq & 0xff;\n\n // `node`\n var node = options.node || _nodeId;\n for (var n = 0; n < 6; n++) {\n b[i + n] = node[n];\n }\n\n return buf ? buf : unparse(b);\n }\n\n // **`v4()` - Generate random UUID**\n\n // See https://github.com/broofa/node-uuid for API details\n function v4(options, buf, offset) {\n // Deprecated - 'format' argument, as supported in v1.2\n var i = buf && offset || 0;\n\n if (typeof(options) == 'string') {\n buf = options == 'binary' ? new BufferClass(16) : null;\n options = null;\n }\n options = options || {};\n\n var rnds = options.random || (options.rng || _rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n for (var ii = 0; ii < 16; ii++) {\n buf[i + ii] = rnds[ii];\n }\n }\n\n return buf || unparse(rnds);\n }\n\n // Export public API\n var uuid = v4;\n uuid.v1 = v1;\n uuid.v4 = v4;\n uuid.parse = parse;\n uuid.unparse = unparse;\n uuid.BufferClass = BufferClass;\n\n if (typeof(module) != 'undefined' && module.exports) {\n // Publish as node.js module\n module.exports = uuid;\n } else if (typeof define === 'function' && define.amd) {\n // Publish as AMD module\n define(function() {return uuid;});\n \n\n } else {\n // Publish as global (in browsers)\n var _previousRoot = _global.uuid;\n\n // **`noConflict()` - (browser only) to reset global 'uuid' var**\n uuid.noConflict = function() {\n _global.uuid = _previousRoot;\n return uuid;\n };\n\n _global.uuid = uuid;\n }\n}).call(this);\n","'use strict';\n\n// Expose the Adapter function/object.\nmodule.exports = Adapter;\n\n\n// Dependencies\n\nvar browser = require('bowser').browser,\n\tdebug = require('debug')('rtcninja:Adapter'),\n\tdebugerror = require('debug')('rtcninja:ERROR:Adapter'),\n\n\t// Internal vars\n\tgetUserMedia = null,\n\tRTCPeerConnection = null,\n\tRTCSessionDescription = null,\n\tRTCIceCandidate = null,\n\tMediaStreamTrack = null,\n\tgetMediaDevices = null,\n\tattachMediaStream = null,\n\tcanRenegotiate = false,\n\toldSpecRTCOfferOptions = false,\n\tbrowserVersion = Number(browser.version) || 0,\n\tisDesktop = !!(!browser.mobile || !browser.tablet),\n\thasWebRTC = false,\n\tvirtGlobal, virtNavigator;\n\ndebugerror.log = console.warn.bind(console);\n\n// Dirty trick to get this library working in a Node-webkit env with browserified libs\nvirtGlobal = global.window || global;\n// Don't fail in Node\nvirtNavigator = virtGlobal.navigator || {};\n\n\n// Constructor.\n\nfunction Adapter(options) {\n\t// Chrome desktop, Chrome Android, Opera desktop, Opera Android, Android native browser\n\t// or generic Webkit browser.\n\tif (\n\t\t(isDesktop && browser.chrome && browserVersion >= 32) ||\n\t\t(browser.android && browser.chrome && browserVersion >= 39) ||\n\t\t(isDesktop && browser.opera && browserVersion >= 27) ||\n\t\t(browser.android && browser.opera && browserVersion >= 24) ||\n\t\t(browser.android && browser.webkit && !browser.chrome && browserVersion >= 37) ||\n\t\t(virtNavigator.webkitGetUserMedia && virtGlobal.webkitRTCPeerConnection)\n\t) {\n\t\thasWebRTC = true;\n\t\tgetUserMedia = virtNavigator.webkitGetUserMedia.bind(virtNavigator);\n\t\tRTCPeerConnection = virtGlobal.webkitRTCPeerConnection;\n\t\tRTCSessionDescription = virtGlobal.RTCSessionDescription;\n\t\tRTCIceCandidate = virtGlobal.RTCIceCandidate;\n\t\tMediaStreamTrack = virtGlobal.MediaStreamTrack;\n\t\tif (MediaStreamTrack && MediaStreamTrack.getSources) {\n\t\t\tgetMediaDevices = MediaStreamTrack.getSources.bind(MediaStreamTrack);\n\t\t} else if (virtNavigator.getMediaDevices) {\n\t\t\tgetMediaDevices = virtNavigator.getMediaDevices.bind(virtNavigator);\n\t\t}\n\t\tattachMediaStream = function (element, stream) {\n\t\t\telement.src = URL.createObjectURL(stream);\n\t\t\treturn element;\n\t\t};\n\t\tcanRenegotiate = true;\n\t\toldSpecRTCOfferOptions = false;\n\t// Firefox desktop, Firefox Android.\n\t} else if (\n\t\t(isDesktop && browser.firefox && browserVersion >= 22) ||\n\t\t(browser.android && browser.firefox && browserVersion >= 33) ||\n\t\t(virtNavigator.mozGetUserMedia && virtGlobal.mozRTCPeerConnection)\n\t) {\n\t\thasWebRTC = true;\n\t\tgetUserMedia = virtNavigator.mozGetUserMedia.bind(virtNavigator);\n\t\tRTCPeerConnection = virtGlobal.mozRTCPeerConnection;\n\t\tRTCSessionDescription = virtGlobal.mozRTCSessionDescription;\n\t\tRTCIceCandidate = virtGlobal.mozRTCIceCandidate;\n\t\tMediaStreamTrack = virtGlobal.MediaStreamTrack;\n\t\tattachMediaStream = function (element, stream) {\n\t\t\telement.src = URL.createObjectURL(stream);\n\t\t\treturn element;\n\t\t};\n\t\tcanRenegotiate = false;\n\t\toldSpecRTCOfferOptions = false;\n\t\t// WebRTC plugin required. For example IE or Safari with the Temasys plugin.\n\t} else if (\n\t\toptions.plugin &&\n\t\ttypeof options.plugin.isRequired === 'function' &&\n\t\toptions.plugin.isRequired() &&\n\t\ttypeof options.plugin.isInstalled === 'function' &&\n\t\toptions.plugin.isInstalled()\n\t) {\n\t\tvar pluginiface = options.plugin.interface;\n\n\t\thasWebRTC = true;\n\t\tgetUserMedia = pluginiface.getUserMedia;\n\t\tRTCPeerConnection = pluginiface.RTCPeerConnection;\n\t\tRTCSessionDescription = pluginiface.RTCSessionDescription;\n\t\tRTCIceCandidate = pluginiface.RTCIceCandidate;\n\t\tMediaStreamTrack = pluginiface.MediaStreamTrack;\n\t\tif (MediaStreamTrack && MediaStreamTrack.getSources) {\n\t\t\tgetMediaDevices = MediaStreamTrack.getSources.bind(MediaStreamTrack);\n\t\t} else if (virtNavigator.getMediaDevices) {\n\t\t\tgetMediaDevices = virtNavigator.getMediaDevices.bind(virtNavigator);\n\t\t}\n\t\tattachMediaStream = pluginiface.attachMediaStream;\n\t\tcanRenegotiate = pluginiface.canRenegotiate;\n\t\toldSpecRTCOfferOptions = true; // TODO: Update when fixed in the plugin.\n\t// Best effort (may be adater.js is loaded).\n\t} else if (virtNavigator.getUserMedia && virtGlobal.RTCPeerConnection) {\n\t\thasWebRTC = true;\n\t\tgetUserMedia = virtNavigator.getUserMedia.bind(virtNavigator);\n\t\tRTCPeerConnection = virtGlobal.RTCPeerConnection;\n\t\tRTCSessionDescription = virtGlobal.RTCSessionDescription;\n\t\tRTCIceCandidate = virtGlobal.RTCIceCandidate;\n\t\tMediaStreamTrack = virtGlobal.MediaStreamTrack;\n\t\tif (MediaStreamTrack && MediaStreamTrack.getSources) {\n\t\t\tgetMediaDevices = MediaStreamTrack.getSources.bind(MediaStreamTrack);\n\t\t} else if (virtNavigator.getMediaDevices) {\n\t\t\tgetMediaDevices = virtNavigator.getMediaDevices.bind(virtNavigator);\n\t\t}\n\t\tattachMediaStream = virtGlobal.attachMediaStream || function (element, stream) {\n\t\t\telement.src = URL.createObjectURL(stream);\n\t\t\treturn element;\n\t\t};\n\t\tcanRenegotiate = false;\n\t\toldSpecRTCOfferOptions = false;\n\t}\n\n\n\tfunction throwNonSupported(item) {\n\t\treturn function () {\n\t\t\tthrow new Error('rtcninja: WebRTC not supported, missing ' + item +\n\t\t\t' [browser: ' + browser.name + ' ' + browser.version + ']');\n\t\t};\n\t}\n\n\n\t// Public API.\n\n\t// Expose a WebRTC checker.\n\tAdapter.hasWebRTC = function () {\n\t\treturn hasWebRTC;\n\t};\n\n\t// Expose getUserMedia.\n\tif (getUserMedia) {\n\t\tAdapter.getUserMedia = function (constraints, successCallback, errorCallback) {\n\t\t\tdebug('getUserMedia() | constraints: %o', constraints);\n\n\t\t\ttry {\n\t\t\t\tgetUserMedia(constraints,\n\t\t\t\t\tfunction (stream) {\n\t\t\t\t\t\tdebug('getUserMedia() | success');\n\t\t\t\t\t\tif (successCallback) {\n\t\t\t\t\t\t\tsuccessCallback(stream);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tfunction (error) {\n\t\t\t\t\t\tdebug('getUserMedia() | error:', error);\n\t\t\t\t\t\tif (errorCallback) {\n\t\t\t\t\t\t\terrorCallback(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t\tcatch (error) {\n\t\t\t\tdebugerror('getUserMedia() | error:', error);\n\t\t\t\tif (errorCallback) {\n\t\t\t\t\terrorCallback(error);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} else {\n\t\tAdapter.getUserMedia = function (constraints, successCallback, errorCallback) {\n\t\t\tdebugerror('getUserMedia() | WebRTC not supported');\n\t\t\tif (errorCallback) {\n\t\t\t\terrorCallback(new Error('rtcninja: WebRTC not supported, missing ' +\n\t\t\t\t'getUserMedia [browser: ' + browser.name + ' ' + browser.version + ']'));\n\t\t\t} else {\n\t\t\t\tthrowNonSupported('getUserMedia');\n\t\t\t}\n\t\t};\n\t}\n\n\t// Expose RTCPeerConnection.\n\tAdapter.RTCPeerConnection = RTCPeerConnection || throwNonSupported('RTCPeerConnection');\n\n\t// Expose RTCSessionDescription.\n\tAdapter.RTCSessionDescription = RTCSessionDescription || throwNonSupported('RTCSessionDescription');\n\n\t// Expose RTCIceCandidate.\n\tAdapter.RTCIceCandidate = RTCIceCandidate || throwNonSupported('RTCIceCandidate');\n\n\t// Expose MediaStreamTrack.\n\tAdapter.MediaStreamTrack = MediaStreamTrack || throwNonSupported('MediaStreamTrack');\n\n\t// Expose getMediaDevices.\n\tAdapter.getMediaDevices = getMediaDevices;\n\n\t// Expose MediaStreamTrack.\n\tAdapter.attachMediaStream = attachMediaStream || throwNonSupported('attachMediaStream');\n\n\t// Expose canRenegotiate attribute.\n\tAdapter.canRenegotiate = canRenegotiate;\n\n\t// Expose closeMediaStream.\n\tAdapter.closeMediaStream = function (stream) {\n\t\tif (!stream) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Latest spec states that MediaStream has no stop() method and instead must\n\t\t// call stop() on every MediaStreamTrack.\n\t\tif (MediaStreamTrack && MediaStreamTrack.prototype && MediaStreamTrack.prototype.stop) {\n\t\t\tdebug('closeMediaStream() | calling stop() on all the MediaStreamTrack');\n\n\t\t\tvar tracks, i, len;\n\n\t\t\tif (stream.getTracks) {\n\t\t\t\ttracks = stream.getTracks();\n\t\t\t\tfor (i = 0, len = tracks.length; i < len; i += 1) {\n\t\t\t\t\ttracks[i].stop();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttracks = stream.getAudioTracks();\n\t\t\t\tfor (i = 0, len = tracks.length; i < len; i += 1) {\n\t\t\t\t\ttracks[i].stop();\n\t\t\t\t}\n\n\t\t\t\ttracks = stream.getVideoTracks();\n\t\t\t\tfor (i = 0, len = tracks.length; i < len; i += 1) {\n\t\t\t\t\ttracks[i].stop();\n\t\t\t\t}\n\t\t\t}\n\t\t// Deprecated by the spec, but still in use.\n\t\t} else if (typeof stream.stop === 'function') {\n\t\t\tdebug('closeMediaStream() | calling stop() on the MediaStream');\n\n\t\t\tstream.stop();\n\t\t}\n\t};\n\n\t// Expose fixPeerConnectionConfig.\n\tAdapter.fixPeerConnectionConfig = function (pcConfig) {\n\t\tvar i, len, iceServer, hasUrls, hasUrl;\n\n\t\tif (!Array.isArray(pcConfig.iceServers)) {\n\t\t\tpcConfig.iceServers = [];\n\t\t}\n\n\t\tfor (i = 0, len = pcConfig.iceServers.length; i < len; i += 1) {\n\t\t\ticeServer = pcConfig.iceServers[i];\n\t\t\thasUrls = iceServer.hasOwnProperty('urls');\n\t\t\thasUrl = iceServer.hasOwnProperty('url');\n\n\t\t\tif (typeof iceServer === 'object') {\n\t\t\t\t// Has .urls but not .url, so add .url with a single string value.\n\t\t\t\tif (hasUrls && !hasUrl) {\n\t\t\t\t\ticeServer.url = (Array.isArray(iceServer.urls) ? iceServer.urls[0] : iceServer.urls);\n\t\t\t\t// Has .url but not .urls, so add .urls with same value.\n\t\t\t\t} else if (!hasUrls && hasUrl) {\n\t\t\t\t\ticeServer.urls = (Array.isArray(iceServer.url) ? iceServer.url.slice() : iceServer.url);\n\t\t\t\t}\n\n\t\t\t\t// Ensure .url is a single string.\n\t\t\t\tif (hasUrl && Array.isArray(iceServer.url)) {\n\t\t\t\t\ticeServer.url = iceServer.url[0];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t// Expose fixRTCOfferOptions.\n\tAdapter.fixRTCOfferOptions = function (options) {\n\t\toptions = options || {};\n\n\t\t// New spec.\n\t\tif (!oldSpecRTCOfferOptions) {\n\t\t\tif (options.mandatory && options.mandatory.OfferToReceiveAudio) {\n\t\t\t\toptions.offerToReceiveAudio = 1;\n\t\t\t}\n\t\t\tif (options.mandatory && options.mandatory.OfferToReceiveVideo) {\n\t\t\t\toptions.offerToReceiveVideo = 1;\n\t\t\t}\n\t\t\tdelete options.mandatory;\n\t\t// Old spec.\n\t\t} else {\n\t\t\tif (options.offerToReceiveAudio) {\n\t\t\t\toptions.mandatory = options.mandatory || {};\n\t\t\t\toptions.mandatory.OfferToReceiveAudio = true;\n\t\t\t}\n\t\t\tif (options.offerToReceiveVideo) {\n\t\t\t\toptions.mandatory = options.mandatory || {};\n\t\t\t\toptions.mandatory.OfferToReceiveVideo = true;\n\t\t\t}\n\t\t}\n\t};\n\n\treturn Adapter;\n}\n","'use strict';\n\n// Expose the RTCPeerConnection class.\nmodule.exports = RTCPeerConnection;\n\n\n// Dependencies.\n\nvar merge = require('merge'),\n\tdebug = require('debug')('rtcninja:RTCPeerConnection'),\n\tdebugerror = require('debug')('rtcninja:ERROR:RTCPeerConnection'),\n\tAdapter = require('./Adapter'),\n\n\t// Internal constants.\n\tC = {\n\t\tREGEXP_NORMALIZED_CANDIDATE: new RegExp(/^candidate:/i),\n\t\tREGEXP_FIX_CANDIDATE: new RegExp(/(^a=|\\r|\\n)/gi),\n\t\tREGEXP_RELAY_CANDIDATE: new RegExp(/ relay /i),\n\t\tREGEXP_SDP_CANDIDATES: new RegExp(/^a=candidate:.*\\r\\n/igm),\n\t\tREGEXP_SDP_NON_RELAY_CANDIDATES: new RegExp(/^a=candidate:(.(?!relay ))*\\r\\n/igm)\n\t},\n\n\t// Internal variables.\n\tVAR = {\n\t\tnormalizeCandidate: null\n\t};\n\ndebugerror.log = console.warn.bind(console);\n\n\n// Constructor\n\nfunction RTCPeerConnection(pcConfig, pcConstraints) {\n\tdebug('new | pcConfig: %o', pcConfig);\n\n\t// Set this.pcConfig and this.options.\n\tsetConfigurationAndOptions.call(this, pcConfig);\n\n\t// NOTE: Deprecated pcConstraints argument.\n\tthis.pcConstraints = pcConstraints;\n\n\t// Own version of the localDescription.\n\tthis.ourLocalDescription = null;\n\n\t// Latest values of PC attributes to avoid events with same value.\n\tthis.ourSignalingState = null;\n\tthis.ourIceConnectionState = null;\n\tthis.ourIceGatheringState = null;\n\n\t// Timer for options.gatheringTimeout.\n\tthis.timerGatheringTimeout = null;\n\n\t// Timer for options.gatheringTimeoutAfterRelay.\n\tthis.timerGatheringTimeoutAfterRelay = null;\n\n\t// Flag to ignore new gathered ICE candidates.\n\tthis.ignoreIceGathering = false;\n\n\t// Flag set when closed.\n\tthis.closed = false;\n\n\t// Set RTCPeerConnection.\n\tsetPeerConnection.call(this);\n\n\t// Set properties.\n\tsetProperties.call(this);\n}\n\n\n// Public API.\n\nRTCPeerConnection.prototype.createOffer = function (successCallback, failureCallback, options) {\n\tdebug('createOffer()');\n\n\tvar self = this;\n\n\tAdapter.fixRTCOfferOptions(options);\n\n\tthis.pc.createOffer(\n\t\tfunction (offer) {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebug('createOffer() | success');\n\t\t\tif (successCallback) {\n\t\t\t\tsuccessCallback(offer);\n\t\t\t}\n\t\t},\n\t\tfunction (error) {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebugerror('createOffer() | error:', error);\n\t\t\tif (failureCallback) {\n\t\t\t\tfailureCallback(error);\n\t\t\t}\n\t\t},\n\t\toptions\n\t);\n};\n\n\nRTCPeerConnection.prototype.createAnswer = function (successCallback, failureCallback, options) {\n\tdebug('createAnswer()');\n\n\tvar self = this;\n\n\tthis.pc.createAnswer(\n\t\tfunction (answer) {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebug('createAnswer() | success');\n\t\t\tif (successCallback) {\n\t\t\t\tsuccessCallback(answer);\n\t\t\t}\n\t\t},\n\t\tfunction (error) {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebugerror('createAnswer() | error:', error);\n\t\t\tif (failureCallback) {\n\t\t\t\tfailureCallback(error);\n\t\t\t}\n\t\t},\n\t\toptions\n\t);\n};\n\n\nRTCPeerConnection.prototype.setLocalDescription = function (description, successCallback, failureCallback) {\n\tdebug('setLocalDescription()');\n\n\tvar self = this;\n\n\tthis.pc.setLocalDescription(\n\t\tdescription,\n\t\t// success.\n\t\tfunction () {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebug('setLocalDescription() | success');\n\n\t\t\t// Clear gathering timers.\n\t\t\tclearTimeout(self.timerGatheringTimeout);\n\t\t\tdelete self.timerGatheringTimeout;\n\t\t\tclearTimeout(self.timerGatheringTimeoutAfterRelay);\n\t\t\tdelete self.timerGatheringTimeoutAfterRelay;\n\n\t\t\trunTimerGatheringTimeout();\n\t\t\tif (successCallback) {\n\t\t\t\tsuccessCallback();\n\t\t\t}\n\t\t},\n\t\t// failure\n\t\tfunction (error) {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebugerror('setLocalDescription() | error:', error);\n\t\t\tif (failureCallback) {\n\t\t\t\tfailureCallback(error);\n\t\t\t}\n\t\t}\n\t);\n\n\t// Enable (again) ICE gathering.\n\tthis.ignoreIceGathering = false;\n\n\t// Handle gatheringTimeout.\n\tfunction runTimerGatheringTimeout() {\n\t\tif (typeof self.options.gatheringTimeout !== 'number') {\n\t\t\treturn;\n\t\t}\n\t\t// If setLocalDescription was already called, it may happen that\n\t\t// ICE gathering is not needed, so don't run this timer.\n\t\tif (self.pc.iceGatheringState === 'complete') {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('setLocalDescription() | ending gathering in %d ms (gatheringTimeout option)',\n\t\t\tself.options.gatheringTimeout);\n\n\t\tself.timerGatheringTimeout = setTimeout(function () {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdebug('forced end of candidates after gatheringTimeout timeout');\n\n\t\t\t// Clear gathering timers.\n\t\t\tdelete self.timerGatheringTimeout;\n\t\t\tclearTimeout(self.timerGatheringTimeoutAfterRelay);\n\t\t\tdelete self.timerGatheringTimeoutAfterRelay;\n\n\t\t\t// Ignore new candidates.\n\t\t\tself.ignoreIceGathering = true;\n\t\t\tif (self.onicecandidate) {\n\t\t\t\tself.onicecandidate({ candidate: null }, null);\n\t\t\t}\n\n\t\t}, self.options.gatheringTimeout);\n\t}\n};\n\n\nRTCPeerConnection.prototype.setRemoteDescription = function (description, successCallback, failureCallback) {\n\tdebug('setRemoteDescription()');\n\n\tvar self = this;\n\n\tthis.pc.setRemoteDescription(\n\t\tdescription,\n\t\tfunction () {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebug('setRemoteDescription() | success');\n\t\t\tif (successCallback) {\n\t\t\t\tsuccessCallback();\n\t\t\t}\n\t\t},\n\t\tfunction (error) {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebugerror('setRemoteDescription() | error:', error);\n\t\t\tif (failureCallback) {\n\t\t\t\tfailureCallback(error);\n\t\t\t}\n\t\t}\n\t);\n};\n\n\nRTCPeerConnection.prototype.updateIce = function (pcConfig) {\n\tdebug('updateIce() | pcConfig: %o', pcConfig);\n\n\t// Update this.pcConfig and this.options.\n\tsetConfigurationAndOptions.call(this, pcConfig);\n\n\tthis.pc.updateIce(this.pcConfig);\n\n\t// Enable (again) ICE gathering.\n\tthis.ignoreIceGathering = false;\n};\n\n\nRTCPeerConnection.prototype.addIceCandidate = function (candidate, successCallback, failureCallback) {\n\tdebug('addIceCandidate() | candidate: %o', candidate);\n\n\tvar self = this;\n\n\tthis.pc.addIceCandidate(\n\t\tcandidate,\n\t\tfunction () {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebug('addIceCandidate() | success');\n\t\t\tif (successCallback) {\n\t\t\t\tsuccessCallback();\n\t\t\t}\n\t\t},\n\t\tfunction (error) {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebugerror('addIceCandidate() | error:', error);\n\t\t\tif (failureCallback) {\n\t\t\t\tfailureCallback(error);\n\t\t\t}\n\t\t}\n\t);\n};\n\n\nRTCPeerConnection.prototype.getConfiguration = function () {\n\tdebug('getConfiguration()');\n\n\treturn this.pc.getConfiguration();\n};\n\n\nRTCPeerConnection.prototype.getLocalStreams = function () {\n\tdebug('getLocalStreams()');\n\n\treturn this.pc.getLocalStreams();\n};\n\n\nRTCPeerConnection.prototype.getRemoteStreams = function () {\n\tdebug('getRemoteStreams()');\n\n\treturn this.pc.getRemoteStreams();\n};\n\n\nRTCPeerConnection.prototype.getStreamById = function (streamId) {\n\tdebug('getStreamById() | streamId: %s', streamId);\n\n\treturn this.pc.getStreamById(streamId);\n};\n\n\nRTCPeerConnection.prototype.addStream = function (stream) {\n\tdebug('addStream() | stream: %s', stream);\n\n\tthis.pc.addStream(stream);\n};\n\n\nRTCPeerConnection.prototype.removeStream = function (stream) {\n\tdebug('removeStream() | stream: %o', stream);\n\n\tthis.pc.removeStream(stream);\n};\n\n\nRTCPeerConnection.prototype.close = function () {\n\tdebug('close()');\n\n\tthis.closed = true;\n\n\t// Clear gathering timers.\n\tclearTimeout(this.timerGatheringTimeout);\n\tdelete this.timerGatheringTimeout;\n\tclearTimeout(this.timerGatheringTimeoutAfterRelay);\n\tdelete this.timerGatheringTimeoutAfterRelay;\n\n\tthis.pc.close();\n};\n\n\nRTCPeerConnection.prototype.createDataChannel = function () {\n\tdebug('createDataChannel()');\n\n\treturn this.pc.createDataChannel.apply(this.pc, arguments);\n};\n\n\nRTCPeerConnection.prototype.createDTMFSender = function (track) {\n\tdebug('createDTMFSender()');\n\n\treturn this.pc.createDTMFSender(track);\n};\n\n\nRTCPeerConnection.prototype.getStats = function () {\n\tdebug('getStats()');\n\n\treturn this.pc.getStats.apply(this.pc, arguments);\n};\n\n\nRTCPeerConnection.prototype.setIdentityProvider = function () {\n\tdebug('setIdentityProvider()');\n\n\treturn this.pc.setIdentityProvider.apply(this.pc, arguments);\n};\n\n\nRTCPeerConnection.prototype.getIdentityAssertion = function () {\n\tdebug('getIdentityAssertion()');\n\n\treturn this.pc.getIdentityAssertion();\n};\n\n\nRTCPeerConnection.prototype.reset = function (pcConfig) {\n\tdebug('reset() | pcConfig: %o', pcConfig);\n\n\tvar pc = this.pc;\n\n\t// Remove events in the old PC.\n\tpc.onnegotiationneeded = null;\n\tpc.onicecandidate = null;\n\tpc.onaddstream = null;\n\tpc.onremovestream = null;\n\tpc.ondatachannel = null;\n\tpc.onsignalingstatechange = null;\n\tpc.oniceconnectionstatechange = null;\n\tpc.onicegatheringstatechange = null;\n\tpc.onidentityresult = null;\n\tpc.onpeeridentity = null;\n\tpc.onidpassertionerror = null;\n\tpc.onidpvalidationerror = null;\n\n\t// Clear gathering timers.\n\tclearTimeout(this.timerGatheringTimeout);\n\tdelete this.timerGatheringTimeout;\n\tclearTimeout(this.timerGatheringTimeoutAfterRelay);\n\tdelete this.timerGatheringTimeoutAfterRelay;\n\n\t// Silently close the old PC.\n\tdebug('reset() | closing current peerConnection');\n\tpc.close();\n\n\t// Set this.pcConfig and this.options.\n\tsetConfigurationAndOptions.call(this, pcConfig);\n\n\t// Create a new PC.\n\tsetPeerConnection.call(this);\n};\n\n\n// Private Helpers.\n\nfunction setConfigurationAndOptions(pcConfig) {\n\t// Clone pcConfig.\n\tthis.pcConfig = merge(true, pcConfig);\n\n\t// Fix pcConfig.\n\tAdapter.fixPeerConnectionConfig(this.pcConfig);\n\n\tthis.options = {\n\t\ticeTransportsRelay: (this.pcConfig.iceTransports === 'relay'),\n\t\ticeTransportsNone: (this.pcConfig.iceTransports === 'none'),\n\t\tgatheringTimeout: this.pcConfig.gatheringTimeout,\n\t\tgatheringTimeoutAfterRelay: this.pcConfig.gatheringTimeoutAfterRelay\n\t};\n\n\t// Remove custom rtcninja.RTCPeerConnection options from pcConfig.\n\tdelete this.pcConfig.gatheringTimeout;\n\tdelete this.pcConfig.gatheringTimeoutAfterRelay;\n\n\tdebug('setConfigurationAndOptions | processed pcConfig: %o', this.pcConfig);\n}\n\n\nfunction isClosed() {\n\treturn ((this.closed) || (this.pc && this.pc.iceConnectionState === 'closed'));\n}\n\n\nfunction setEvents() {\n\tvar self = this,\n\t\tpc = this.pc;\n\n\tpc.onnegotiationneeded = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onnegotiationneeded()');\n\t\tif (self.onnegotiationneeded) {\n\t\t\tself.onnegotiationneeded(event);\n\t\t}\n\t};\n\n\tpc.onicecandidate = function (event) {\n\t\tvar candidate, isRelay, newCandidate;\n\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\t\tif (self.ignoreIceGathering) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ignore any candidate (event the null one) if iceTransports:'none' is set.\n\t\tif (self.options.iceTransportsNone) {\n\t\t\treturn;\n\t\t}\n\n\t\tcandidate = event.candidate;\n\n\t\tif (candidate) {\n\t\t\tisRelay = C.REGEXP_RELAY_CANDIDATE.test(candidate.candidate);\n\n\t\t\t// Ignore if just relay candidates are requested.\n\t\t\tif (self.options.iceTransportsRelay && !isRelay) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Handle gatheringTimeoutAfterRelay.\n\t\t\tif (isRelay && !self.timerGatheringTimeoutAfterRelay &&\n\t\t\t\t(typeof self.options.gatheringTimeoutAfterRelay === 'number')) {\n\t\t\t\tdebug('onicecandidate() | first relay candidate found, ending gathering in %d ms', self.options.gatheringTimeoutAfterRelay);\n\n\t\t\t\tself.timerGatheringTimeoutAfterRelay = setTimeout(function () {\n\t\t\t\t\tif (isClosed.call(self)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tdebug('forced end of candidates after timeout');\n\n\t\t\t\t\t// Clear gathering timers.\n\t\t\t\t\tdelete self.timerGatheringTimeoutAfterRelay;\n\t\t\t\t\tclearTimeout(self.timerGatheringTimeout);\n\t\t\t\t\tdelete self.timerGatheringTimeout;\n\n\t\t\t\t\t// Ignore new candidates.\n\t\t\t\t\tself.ignoreIceGathering = true;\n\t\t\t\t\tif (self.onicecandidate) {\n\t\t\t\t\t\tself.onicecandidate({candidate: null}, null);\n\t\t\t\t\t}\n\t\t\t\t}, self.options.gatheringTimeoutAfterRelay);\n\t\t\t}\n\n\t\t\tnewCandidate = new Adapter.RTCIceCandidate({\n\t\t\t\tsdpMid: candidate.sdpMid,\n\t\t\t\tsdpMLineIndex: candidate.sdpMLineIndex,\n\t\t\t\tcandidate: candidate.candidate\n\t\t\t});\n\n\t\t\t// Force correct candidate syntax (just check it once).\n\t\t\tif (VAR.normalizeCandidate === null) {\n\t\t\t\tif (C.REGEXP_NORMALIZED_CANDIDATE.test(candidate.candidate)) {\n\t\t\t\t\tVAR.normalizeCandidate = false;\n\t\t\t\t} else {\n\t\t\t\t\tdebug('onicecandidate() | normalizing ICE candidates syntax (remove \"a=\" and \"\\\\r\\\\n\")');\n\t\t\t\t\tVAR.normalizeCandidate = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (VAR.normalizeCandidate) {\n\t\t\t\tnewCandidate.candidate = candidate.candidate.replace(C.REGEXP_FIX_CANDIDATE, '');\n\t\t\t}\n\n\t\t\tdebug(\n\t\t\t\t'onicecandidate() | m%d(%s) %s',\n\t\t\t\tnewCandidate.sdpMLineIndex,\n\t\t\t\tnewCandidate.sdpMid || 'no mid', newCandidate.candidate);\n\t\t\tif (self.onicecandidate) {\n\t\t\t\tself.onicecandidate(event, newCandidate);\n\t\t\t}\n\t\t// Null candidate (end of candidates).\n\t\t} else {\n\t\t\tdebug('onicecandidate() | end of candidates');\n\n\t\t\t// Clear gathering timers.\n\t\t\tclearTimeout(self.timerGatheringTimeout);\n\t\t\tdelete self.timerGatheringTimeout;\n\t\t\tclearTimeout(self.timerGatheringTimeoutAfterRelay);\n\t\t\tdelete self.timerGatheringTimeoutAfterRelay;\n\t\t\tif (self.onicecandidate) {\n\t\t\t\tself.onicecandidate(event, null);\n\t\t\t}\n\t\t}\n\t};\n\n\tpc.onaddstream = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onaddstream() | stream: %o', event.stream);\n\t\tif (self.onaddstream) {\n\t\t\tself.onaddstream(event, event.stream);\n\t\t}\n\t};\n\n\tpc.onremovestream = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onremovestream() | stream: %o', event.stream);\n\t\tif (self.onremovestream) {\n\t\t\tself.onremovestream(event, event.stream);\n\t\t}\n\t};\n\n\tpc.ondatachannel = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('ondatachannel() | datachannel: %o', event.channel);\n\t\tif (self.ondatachannel) {\n\t\t\tself.ondatachannel(event, event.channel);\n\t\t}\n\t};\n\n\tpc.onsignalingstatechange = function (event) {\n\t\tif (pc.signalingState === self.ourSignalingState) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onsignalingstatechange() | signalingState: %s', pc.signalingState);\n\t\tself.ourSignalingState = pc.signalingState;\n\t\tif (self.onsignalingstatechange) {\n\t\t\tself.onsignalingstatechange(event, pc.signalingState);\n\t\t}\n\t};\n\n\tpc.oniceconnectionstatechange = function (event) {\n\t\tif (pc.iceConnectionState === self.ourIceConnectionState) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('oniceconnectionstatechange() | iceConnectionState: %s', pc.iceConnectionState);\n\t\tself.ourIceConnectionState = pc.iceConnectionState;\n\t\tif (self.oniceconnectionstatechange) {\n\t\t\tself.oniceconnectionstatechange(event, pc.iceConnectionState);\n\t\t}\n\t};\n\n\tpc.onicegatheringstatechange = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (pc.iceGatheringState === self.ourIceGatheringState) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onicegatheringstatechange() | iceGatheringState: %s', pc.iceGatheringState);\n\t\tself.ourIceGatheringState = pc.iceGatheringState;\n\t\tif (self.onicegatheringstatechange) {\n\t\t\tself.onicegatheringstatechange(event, pc.iceGatheringState);\n\t\t}\n\t};\n\n\tpc.onidentityresult = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onidentityresult()');\n\t\tif (self.onidentityresult) {\n\t\t\tself.onidentityresult(event);\n\t\t}\n\t};\n\n\tpc.onpeeridentity = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onpeeridentity()');\n\t\tif (self.onpeeridentity) {\n\t\t\tself.onpeeridentity(event);\n\t\t}\n\t};\n\n\tpc.onidpassertionerror = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onidpassertionerror()');\n\t\tif (self.onidpassertionerror) {\n\t\t\tself.onidpassertionerror(event);\n\t\t}\n\t};\n\n\tpc.onidpvalidationerror = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onidpvalidationerror()');\n\t\tif (self.onidpvalidationerror) {\n\t\t\tself.onidpvalidationerror(event);\n\t\t}\n\t};\n}\n\n\nfunction setPeerConnection() {\n\t// Create a RTCPeerConnection.\n\tif (!this.pcConstraints) {\n\t\tthis.pc = new Adapter.RTCPeerConnection(this.pcConfig);\n\t} else {\n\t\t// NOTE: Deprecated.\n\t\tthis.pc = new Adapter.RTCPeerConnection(this.pcConfig, this.pcConstraints);\n\t}\n\n\t// Set RTC events.\n\tsetEvents.call(this);\n}\n\n\nfunction getLocalDescription() {\n\tvar pc = this.pc,\n\t\toptions = this.options,\n\t\tsdp = null;\n\n\tif (!pc.localDescription) {\n\t\tthis.ourLocalDescription = null;\n\t\treturn null;\n\t}\n\n\t// Mangle the SDP string.\n\tif (options.iceTransportsRelay) {\n\t\tsdp = pc.localDescription.sdp.replace(C.REGEXP_SDP_NON_RELAY_CANDIDATES, '');\n\t} else if (options.iceTransportsNone) {\n\t\tsdp = pc.localDescription.sdp.replace(C.REGEXP_SDP_CANDIDATES, '');\n\t}\n\n\tthis.ourLocalDescription = new Adapter.RTCSessionDescription({\n\t\ttype: pc.localDescription.type,\n\t\tsdp: sdp || pc.localDescription.sdp\n\t});\n\n\treturn this.ourLocalDescription;\n}\n\n\nfunction setProperties() {\n\tvar self = this;\n\n\tObject.defineProperties(this, {\n\t\tpeerConnection: {\n\t\t\tget: function () {\n\t\t\t\treturn self.pc;\n\t\t\t}\n\t\t},\n\n\t\tsignalingState: {\n\t\t\tget: function () {\n\t\t\t\treturn self.pc.signalingState;\n\t\t\t}\n\t\t},\n\n\t\ticeConnectionState: {\n\t\t\tget: function () {\n\t\t\t\treturn self.pc.iceConnectionState;\n\t\t\t}\n\t\t},\n\n\t\ticeGatheringState: {\n\t\t\tget: function () {\n\t\t\t\treturn self.pc.iceGatheringState;\n\t\t\t}\n\t\t},\n\n\t\tlocalDescription: {\n\t\t\tget: function () {\n\t\t\t\treturn getLocalDescription.call(self);\n\t\t\t}\n\t\t},\n\n\t\tremoteDescription: {\n\t\t\tget: function () {\n\t\t\t\treturn self.pc.remoteDescription;\n\t\t\t}\n\t\t},\n\n\t\tpeerIdentity: {\n\t\t\tget: function () {\n\t\t\t\treturn self.pc.peerIdentity;\n\t\t\t}\n\t\t}\n\t});\n}\n","'use strict';\n\nmodule.exports = rtcninja;\n\n\n// Dependencies.\n\nvar browser = require('bowser').browser,\n\tdebug = require('debug')('rtcninja'),\n\tdebugerror = require('debug')('rtcninja:ERROR'),\n\tversion = require('./version'),\n\tAdapter = require('./Adapter'),\n\tRTCPeerConnection = require('./RTCPeerConnection'),\n\n\t// Internal vars.\n\tcalled = false;\n\ndebugerror.log = console.warn.bind(console);\ndebug('version %s', version);\ndebug('detected browser: %s %s [mobile:%s, tablet:%s, android:%s, ios:%s]',\n\t\tbrowser.name, browser.version, !!browser.mobile, !!browser.tablet,\n\t\t!!browser.android, !!browser.ios);\n\n\n// Constructor.\n\nfunction rtcninja(options) {\n\t// Load adapter\n\tvar iface = Adapter(options || {}); // jshint ignore:line\n\n\tcalled = true;\n\n\t// Expose RTCPeerConnection class.\n\trtcninja.RTCPeerConnection = RTCPeerConnection;\n\n\t// Expose WebRTC API and utils.\n\trtcninja.getUserMedia = iface.getUserMedia;\n\trtcninja.RTCSessionDescription = iface.RTCSessionDescription;\n\trtcninja.RTCIceCandidate = iface.RTCIceCandidate;\n\trtcninja.MediaStreamTrack = iface.MediaStreamTrack;\n\trtcninja.getMediaDevices = iface.getMediaDevices;\n\trtcninja.attachMediaStream = iface.attachMediaStream;\n\trtcninja.closeMediaStream = iface.closeMediaStream;\n\trtcninja.canRenegotiate = iface.canRenegotiate;\n\n\t// Log WebRTC support.\n\tif (iface.hasWebRTC()) {\n\t\tdebug('WebRTC supported');\n\t\treturn true;\n\t} else {\n\t\tdebugerror('WebRTC not supported');\n\t\treturn false;\n\t}\n}\n\n\n// Public API.\n\n// If called without calling rtcninja(), call it.\nrtcninja.hasWebRTC = function () {\n\tif (!called) {\n\t\trtcninja();\n\t}\n\n\treturn Adapter.hasWebRTC();\n};\n\n\n// Expose version property.\nObject.defineProperty(rtcninja, 'version', {\n\tget: function () {\n\t\treturn version;\n\t}\n});\n\n\n// Expose called property.\nObject.defineProperty(rtcninja, 'called', {\n\tget: function () {\n\t\treturn called;\n\t}\n});\n\n\n// Exposing stuff.\n\nrtcninja.debug = require('debug');\nrtcninja.browser = browser;\n","'use strict';\n\n// Expose the 'version' field of package.json.\nmodule.exports = require('../package.json').version;\n\n","/*!\n * Bowser - a browser detector\n * https://github.com/ded/bowser\n * MIT License | (c) Dustin Diaz 2014\n */\n\n!function (name, definition) {\n if (typeof module != 'undefined' && module.exports) module.exports['browser'] = definition()\n else if (typeof define == 'function' && define.amd) define(definition)\n else this[name] = definition()\n}('bowser', function () {\n /**\n * See useragents.js for examples of navigator.userAgent\n */\n\n var t = true\n\n function detect(ua) {\n\n function getFirstMatch(regex) {\n var match = ua.match(regex);\n return (match && match.length > 1 && match[1]) || '';\n }\n\n function getSecondMatch(regex) {\n var match = ua.match(regex);\n return (match && match.length > 1 && match[2]) || '';\n }\n\n var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase()\n , likeAndroid = /like android/i.test(ua)\n , android = !likeAndroid && /android/i.test(ua)\n , edgeVersion = getFirstMatch(/edge\\/(\\d+(\\.\\d+)?)/i)\n , versionIdentifier = getFirstMatch(/version\\/(\\d+(\\.\\d+)?)/i)\n , tablet = /tablet/i.test(ua)\n , mobile = !tablet && /[^-]mobi/i.test(ua)\n , result\n\n if (/opera|opr/i.test(ua)) {\n result = {\n name: 'Opera'\n , opera: t\n , version: versionIdentifier || getFirstMatch(/(?:opera|opr)[\\s\\/](\\d+(\\.\\d+)?)/i)\n }\n }\n else if (/windows phone/i.test(ua)) {\n result = {\n name: 'Windows Phone'\n , windowsphone: t\n }\n if (edgeVersion) {\n result.msedge = t\n result.version = edgeVersion\n }\n else {\n result.msie = t\n result.version = getFirstMatch(/iemobile\\/(\\d+(\\.\\d+)?)/i)\n }\n }\n else if (/msie|trident/i.test(ua)) {\n result = {\n name: 'Internet Explorer'\n , msie: t\n , version: getFirstMatch(/(?:msie |rv:)(\\d+(\\.\\d+)?)/i)\n }\n }\n else if (/chrome.+? edge/i.test(ua)) {\n result = {\n name: 'Microsoft Edge'\n , msedge: t\n , version: edgeVersion\n }\n }\n else if (/chrome|crios|crmo/i.test(ua)) {\n result = {\n name: 'Chrome'\n , chrome: t\n , version: getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.\\d+)?)/i)\n }\n }\n else if (iosdevice) {\n result = {\n name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod'\n }\n // WTF: version is not part of user agent in web apps\n if (versionIdentifier) {\n result.version = versionIdentifier\n }\n }\n else if (/sailfish/i.test(ua)) {\n result = {\n name: 'Sailfish'\n , sailfish: t\n , version: getFirstMatch(/sailfish\\s?browser\\/(\\d+(\\.\\d+)?)/i)\n }\n }\n else if (/seamonkey\\//i.test(ua)) {\n result = {\n name: 'SeaMonkey'\n , seamonkey: t\n , version: getFirstMatch(/seamonkey\\/(\\d+(\\.\\d+)?)/i)\n }\n }\n else if (/firefox|iceweasel/i.test(ua)) {\n result = {\n name: 'Firefox'\n , firefox: t\n , version: getFirstMatch(/(?:firefox|iceweasel)[ \\/](\\d+(\\.\\d+)?)/i)\n }\n if (/\\((mobile|tablet);[^\\)]*rv:[\\d\\.]+\\)/i.test(ua)) {\n result.firefoxos = t\n }\n }\n else if (/silk/i.test(ua)) {\n result = {\n name: 'Amazon Silk'\n , silk: t\n , version : getFirstMatch(/silk\\/(\\d+(\\.\\d+)?)/i)\n }\n }\n else if (android) {\n result = {\n name: 'Android'\n , version: versionIdentifier\n }\n }\n else if (/phantom/i.test(ua)) {\n result = {\n name: 'PhantomJS'\n , phantom: t\n , version: getFirstMatch(/phantomjs\\/(\\d+(\\.\\d+)?)/i)\n }\n }\n else if (/blackberry|\\bbb\\d+/i.test(ua) || /rim\\stablet/i.test(ua)) {\n result = {\n name: 'BlackBerry'\n , blackberry: t\n , version: versionIdentifier || getFirstMatch(/blackberry[\\d]+\\/(\\d+(\\.\\d+)?)/i)\n }\n }\n else if (/(web|hpw)os/i.test(ua)) {\n result = {\n name: 'WebOS'\n , webos: t\n , version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\\/(\\d+(\\.\\d+)?)/i)\n };\n /touchpad\\//i.test(ua) && (result.touchpad = t)\n }\n else if (/bada/i.test(ua)) {\n result = {\n name: 'Bada'\n , bada: t\n , version: getFirstMatch(/dolfin\\/(\\d+(\\.\\d+)?)/i)\n };\n }\n else if (/tizen/i.test(ua)) {\n result = {\n name: 'Tizen'\n , tizen: t\n , version: getFirstMatch(/(?:tizen\\s?)?browser\\/(\\d+(\\.\\d+)?)/i) || versionIdentifier\n };\n }\n else if (/safari/i.test(ua)) {\n result = {\n name: 'Safari'\n , safari: t\n , version: versionIdentifier\n }\n }\n else {\n result = {\n name: getFirstMatch(/^(.*)\\/(.*) /),\n version: getSecondMatch(/^(.*)\\/(.*) /)\n };\n }\n\n // set webkit or gecko flag for browsers based on these engines\n if (!result.msedge && /(apple)?webkit/i.test(ua)) {\n result.name = result.name || \"Webkit\"\n result.webkit = t\n if (!result.version && versionIdentifier) {\n result.version = versionIdentifier\n }\n } else if (!result.opera && /gecko\\//i.test(ua)) {\n result.name = result.name || \"Gecko\"\n result.gecko = t\n result.version = result.version || getFirstMatch(/gecko\\/(\\d+(\\.\\d+)?)/i)\n }\n\n // set OS flags for platforms that have multiple browsers\n if (!result.msedge && (android || result.silk)) {\n result.android = t\n } else if (iosdevice) {\n result[iosdevice] = t\n result.ios = t\n }\n\n // OS version extraction\n var osVersion = '';\n if (result.windowsphone) {\n osVersion = getFirstMatch(/windows phone (?:os)?\\s?(\\d+(\\.\\d+)*)/i);\n } else if (iosdevice) {\n osVersion = getFirstMatch(/os (\\d+([_\\s]\\d+)*) like mac os x/i);\n osVersion = osVersion.replace(/[_\\s]/g, '.');\n } else if (android) {\n osVersion = getFirstMatch(/android[ \\/-](\\d+(\\.\\d+)*)/i);\n } else if (result.webos) {\n osVersion = getFirstMatch(/(?:web|hpw)os\\/(\\d+(\\.\\d+)*)/i);\n } else if (result.blackberry) {\n osVersion = getFirstMatch(/rim\\stablet\\sos\\s(\\d+(\\.\\d+)*)/i);\n } else if (result.bada) {\n osVersion = getFirstMatch(/bada\\/(\\d+(\\.\\d+)*)/i);\n } else if (result.tizen) {\n osVersion = getFirstMatch(/tizen[\\/\\s](\\d+(\\.\\d+)*)/i);\n }\n if (osVersion) {\n result.osversion = osVersion;\n }\n\n // device type extraction\n var osMajorVersion = osVersion.split('.')[0];\n if (tablet || iosdevice == 'ipad' || (android && (osMajorVersion == 3 || (osMajorVersion == 4 && !mobile))) || result.silk) {\n result.tablet = t\n } else if (mobile || iosdevice == 'iphone' || iosdevice == 'ipod' || android || result.blackberry || result.webos || result.bada) {\n result.mobile = t\n }\n\n // Graded Browser Support\n // http://developer.yahoo.com/yui/articles/gbs\n if (result.msedge ||\n (result.msie && result.version >= 10) ||\n (result.chrome && result.version >= 20) ||\n (result.firefox && result.version >= 20.0) ||\n (result.safari && result.version >= 6) ||\n (result.opera && result.version >= 10.0) ||\n (result.ios && result.osversion && result.osversion.split(\".\")[0] >= 6) ||\n (result.blackberry && result.version >= 10.1)\n ) {\n result.a = t;\n }\n else if ((result.msie && result.version < 10) ||\n (result.chrome && result.version < 20) ||\n (result.firefox && result.version < 20.0) ||\n (result.safari && result.version < 6) ||\n (result.opera && result.version < 10.0) ||\n (result.ios && result.osversion && result.osversion.split(\".\")[0] < 6)\n ) {\n result.c = t\n } else result.x = t\n\n return result\n }\n\n var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '')\n\n bowser.test = function (browserList) {\n for (var i = 0; i < browserList.length; ++i) {\n var browserItem = browserList[i];\n if (typeof browserItem=== 'string') {\n if (browserItem in bowser) {\n return true;\n }\n }\n }\n return false;\n }\n\n /*\n * Set our detect method to the main bowser object so we can\n * reuse it to test other user agents.\n * This is needed to implement future tests.\n */\n bowser._detect = detect;\n\n return bowser\n});\n","/*!\r\n * @name JavaScript/NodeJS Merge v1.2.0\r\n * @author yeikos\r\n * @repository https://github.com/yeikos/js.merge\r\n\r\n * Copyright 2014 yeikos - MIT license\r\n * https://raw.github.com/yeikos/js.merge/master/LICENSE\r\n */\r\n\r\n;(function(isNode) {\r\n\r\n\t/**\r\n\t * Merge one or more objects \r\n\t * @param bool? clone\r\n\t * @param mixed,... arguments\r\n\t * @return object\r\n\t */\r\n\r\n\tvar Public = function(clone) {\r\n\r\n\t\treturn merge(clone === true, false, arguments);\r\n\r\n\t}, publicName = 'merge';\r\n\r\n\t/**\r\n\t * Merge two or more objects recursively \r\n\t * @param bool? clone\r\n\t * @param mixed,... arguments\r\n\t * @return object\r\n\t */\r\n\r\n\tPublic.recursive = function(clone) {\r\n\r\n\t\treturn merge(clone === true, true, arguments);\r\n\r\n\t};\r\n\r\n\t/**\r\n\t * Clone the input removing any reference\r\n\t * @param mixed input\r\n\t * @return mixed\r\n\t */\r\n\r\n\tPublic.clone = function(input) {\r\n\r\n\t\tvar output = input,\r\n\t\t\ttype = typeOf(input),\r\n\t\t\tindex, size;\r\n\r\n\t\tif (type === 'array') {\r\n\r\n\t\t\toutput = [];\r\n\t\t\tsize = input.length;\r\n\r\n\t\t\tfor (index=0;index=0.10.32\"\n },\n \"dependencies\": {\n \"bowser\": \"^0.7.3\",\n \"debug\": \"^2.2.0\",\n \"merge\": \"^1.2.0\"\n },\n \"devDependencies\": {\n \"browserify\": \"^10.2.3\",\n \"gulp\": \"git+https://github.com/gulpjs/gulp.git#4.0\",\n \"gulp-expect-file\": \"0.0.7\",\n \"gulp-filelog\": \"^0.4.1\",\n \"gulp-header\": \"^1.2.2\",\n \"gulp-jscs\": \"^1.6.0\",\n \"gulp-jscs-stylish\": \"^1.1.0\",\n \"gulp-jshint\": \"^1.11.0\",\n \"gulp-rename\": \"^1.2.2\",\n \"gulp-uglify\": \"^1.2.0\",\n \"jshint-stylish\": \"^1.0.2\",\n \"retire\": \"^1.1.0\",\n \"shelljs\": \"^0.5.0\",\n \"vinyl-source-stream\": \"^1.1.0\"\n },\n \"gitHead\": \"9ddf6664289d9ab9da786edcd2f8b61b0633f013\",\n \"bugs\": {\n \"url\": \"https://github.com/eface2face/rtcninja.js/issues\"\n },\n \"_id\": \"rtcninja@0.6.2\",\n \"scripts\": {},\n \"_shasum\": \"ac274f4184c64d2d98c1da2cca914a2725dfcf09\",\n \"_from\": \"rtcninja@>=0.6.2 <0.7.0\",\n \"_npmVersion\": \"2.5.1\",\n \"_nodeVersion\": \"0.12.0\",\n \"_npmUser\": {\n \"name\": \"ibc\",\n \"email\": \"ibc@aliax.net\"\n },\n \"dist\": {\n \"shasum\": \"ac274f4184c64d2d98c1da2cca914a2725dfcf09\",\n \"tarball\": \"http://registry.npmjs.org/rtcninja/-/rtcninja-0.6.2.tgz\"\n },\n \"maintainers\": [\n {\n \"name\": \"ibc\",\n \"email\": \"ibc@aliax.net\"\n }\n ],\n \"directories\": {},\n \"_resolved\": \"https://registry.npmjs.org/rtcninja/-/rtcninja-0.6.2.tgz\",\n \"readme\": \"ERROR: No README data found!\"\n}\n","var _global = (function() { return this; })();\nvar nativeWebSocket = _global.WebSocket || _global.MozWebSocket;\n\n\n/**\n * Expose a W3C WebSocket class with just one or two arguments.\n */\nfunction W3CWebSocket(uri, protocols) {\n\tvar native_instance;\n\n\tif (protocols) {\n\t\tnative_instance = new nativeWebSocket(uri, protocols);\n\t}\n\telse {\n\t\tnative_instance = new nativeWebSocket(uri);\n\t}\n\n\t/**\n\t * 'native_instance' is an instance of nativeWebSocket (the browser's WebSocket\n\t * class). Since it is an Object it will be returned as it is when creating an\n\t * instance of W3CWebSocket via 'new W3CWebSocket()'.\n\t *\n\t * ECMAScript 5: http://bclary.com/2004/11/07/#a-13.2.2\n\t */\n\treturn native_instance;\n}\n\n\n/**\n * Module exports.\n */\nmodule.exports = {\n 'w3cwebsocket' : nativeWebSocket ? W3CWebSocket : null,\n 'version' : require('./version')\n};\n","module.exports = require('../package.json').version;\n","module.exports={\n \"name\": \"websocket\",\n \"description\": \"Websocket Client & Server Library implementing the WebSocket protocol as specified in RFC 6455.\",\n \"keywords\": [\n \"websocket\",\n \"websockets\",\n \"socket\",\n \"networking\",\n \"comet\",\n \"push\",\n \"RFC-6455\",\n \"realtime\",\n \"server\",\n \"client\"\n ],\n \"author\": {\n \"name\": \"Brian McKelvey\",\n \"email\": \"brian@worlize.com\",\n \"url\": \"https://www.worlize.com/\"\n },\n \"version\": \"1.0.19\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/theturtle32/WebSocket-Node.git\"\n },\n \"homepage\": \"https://github.com/theturtle32/WebSocket-Node\",\n \"engines\": {\n \"node\": \">=0.8.0\"\n },\n \"dependencies\": {\n \"debug\": \"~2.1.0\",\n \"nan\": \"1.8.x\",\n \"typedarray-to-buffer\": \"~3.0.0\"\n },\n \"devDependencies\": {\n \"buffer-equal\": \"0.0.1\",\n \"faucet\": \"0.0.1\",\n \"gulp\": \"git+https://github.com/gulpjs/gulp.git#4.0\",\n \"gulp-jshint\": \"^1.9.0\",\n \"jshint-stylish\": \"^1.0.0\",\n \"tape\": \"^3.0.0\"\n },\n \"config\": {\n \"verbose\": false\n },\n \"scripts\": {\n \"install\": \"(node-gyp rebuild 2> builderror.log) || (exit 0)\",\n \"test\": \"faucet test/unit\",\n \"gulp\": \"gulp\"\n },\n \"main\": \"index\",\n \"directories\": {\n \"lib\": \"./lib\"\n },\n \"browser\": \"lib/browser.js\",\n \"license\": \"Apache-2.0\",\n \"gitHead\": \"da3bd5b04e9442c84881b2e9c13432cdbbae1f16\",\n \"bugs\": {\n \"url\": \"https://github.com/theturtle32/WebSocket-Node/issues\"\n },\n \"_id\": \"websocket@1.0.19\",\n \"_shasum\": \"e62dbf1a3c5e0767425db7187cfa38f921dfb42c\",\n \"_from\": \"websocket@>=1.0.19 <2.0.0\",\n \"_npmVersion\": \"2.10.1\",\n \"_nodeVersion\": \"0.12.4\",\n \"_npmUser\": {\n \"name\": \"theturtle32\",\n \"email\": \"brian@worlize.com\"\n },\n \"maintainers\": [\n {\n \"name\": \"theturtle32\",\n \"email\": \"brian@worlize.com\"\n }\n ],\n \"dist\": {\n \"shasum\": \"e62dbf1a3c5e0767425db7187cfa38f921dfb42c\",\n \"tarball\": \"http://registry.npmjs.org/websocket/-/websocket-1.0.19.tgz\"\n },\n \"_resolved\": \"https://registry.npmjs.org/websocket/-/websocket-1.0.19.tgz\",\n \"readme\": \"ERROR: No README data found!\"\n}\n"]} \ No newline at end of file +{"version":3,"sources":["node_modules/browserify/node_modules/browser-pack/_prelude.js","lib/account.js","lib/call.js","lib/connection.js","lib/sylkrtc.js","node_modules/blueimp-md5/js/md5.js","node_modules/browserify/node_modules/events/events.js","node_modules/browserify/node_modules/process/browser.js","node_modules/browserify/node_modules/timers-browserify/main.js","node_modules/debug/browser.js","node_modules/debug/debug.js","node_modules/debug/node_modules/ms/index.js","node_modules/node-uuid/uuid.js","node_modules/rtcninja/lib/Adapter.js","node_modules/rtcninja/lib/RTCPeerConnection.js","node_modules/rtcninja/lib/rtcninja.js","node_modules/rtcninja/lib/version.js","node_modules/rtcninja/node_modules/bowser/bowser.js","node_modules/rtcninja/node_modules/merge/merge.js","node_modules/rtcninja/package.json","node_modules/websocket/lib/browser.js","node_modules/websocket/lib/version.js","node_modules/websocket/package.json"],"names":[],"mappings":"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AC,6BAA6B,CAAC,CAAC;KAClD;;AAED,QAAI,IAAI,GAAG,IAAA,WAAA,CAVN,UAAU,CAUW,OAAO,CAAC,CAAC;AACnC,QAAI,CAAC,WAAW,EAAE,CAAC;AACnB,WAAO,IAAI,CAAC;CACf;;;;AAKD,SAAS,iBAAiB,GAAG;AACzB,WAAO,UAAA,CAAA,SAAA,CAAA,CAAS,SAAS,EAAE,CAAC;CAC/B;;AAED,SAAS,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE;AACxC,WAAO,UAAA,CAAA,SAAA,CAAA,CAAS,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;CACtD;;AAED,SAAS,gBAAgB,CAAC,MAAM,EAAE;AAC9B,cAAA,CAAA,SAAA,CAAA,CAAS,gBAAgB,CAAC,MAAM,CAAC,CAAC;CACrC;;AAcD,OAAO,CAAC,SAAS,CAAC,GAXH;AACX,oBAAgB,EAAhB,gBAAgB;AAChB,SAAK,EAAA,OAAA,CAAA,SAAA,CAAA;AACL,qBAAiB,EAAjB,iBAAiB,EAAE,gBAAgB,EAAhB,gBAAgB,EAAE,iBAAiB,EAAjB,iBAAiB;CACzD,CAAA;AAYD,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;;;ACnDpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACvPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC5SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7uBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxFA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"sylkrtc.js","sourceRoot":"/source/","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o {\n if (error) {\n DEBUG('Register error: %s', error);\n const oldState = this._registrationState;\n const newState = 'failed';\n let data = {reason: error.toString()};\n this._registrationState = newState;\n this.emit('registrationStateChanged', oldState, newState, data);\n }\n });\n }\n\n unregister() {\n let req = {\n sylkrtc: 'account-unregister',\n account: this._id,\n };\n this._sendRequest(req, (error) => {\n if (error) {\n DEBUG('Unregister error: %s', error);\n }\n const oldState = this._registrationState;\n const newState = null;\n this._registrationState = newState;\n this.emit('registrationStateChanged', oldState, newState, {});\n });\n }\n\n call(uri, options={}) {\n let call = new Call(this);\n call._initOutgoing(uri, options);\n this._calls.set(call.id, call);\n this.emit('outgoingCall', call);\n return call;\n }\n\n // Private API\n\n _handleEvent(message) {\n DEBUG('Received account event: %s', message.event);\n switch (message.event) {\n case 'registration_state':\n const oldState = this._registrationState;\n const newState = message.data.state;\n let data = {};\n this._registrationState = newState;\n if (newState === 'failed') {\n data.reason = message.data.reason;\n }\n this.emit('registrationStateChanged', oldState, newState, data);\n break;\n case 'incoming_session':\n let call = new Call(this);\n call._initIncoming(message.session, message.data.originator, message.data.sdp);\n this._calls.set(call.id, call);\n this.emit('incomingCall', call);\n break;\n default:\n break;\n }\n }\n\n _sendRequest(req, cb) {\n this._connection._sendRequest(req, cb);\n }\n\n}\n\n\nexport { Account };\n","'use strict';\n\nimport debug from 'debug';\nimport uuid from 'node-uuid';\nimport rtcninja from 'rtcninja';\n\nimport { EventEmitter } from 'events';\n\nconst DEBUG = debug('sylkrtc:Call');\n\n\nclass Call extends EventEmitter {\n constructor(account) {\n super();\n this._account = account;\n this._id = null;\n this._direction = null;\n this._pc = null;\n this._state = null;\n this._terminated = false;\n this._incomingSdp = null;\n this._remoteIdentity = null;\n }\n\n get account() {\n return this._account;\n }\n\n get id() {\n return this._id;\n }\n\n get direction() {\n return this._direction;\n }\n\n get state() {\n return this._state;\n }\n\n get localIdentity() {\n return this._account.id;\n }\n\n get remoteIdentity() {\n return this._remoteIdentity;\n }\n\n getLocalStreams() {\n if (this._pc !== null) {\n return this._pc.getLocalStreams();\n } else {\n return [];\n }\n }\n\n getRemoteStreams() {\n if (this._pc !== null) {\n return this._pc.getRemoteStreams();\n } else {\n return [];\n }\n }\n\n answer(options = {}) {\n if (this._state !== 'incoming') {\n throw new Error('Call is not in the incoming state: ' + this._state);\n }\n\n const self = this;\n const pcConfig = options.pcConfig || {iceServers:[]};\n const mediaConstraints = options.mediaConstraints || {audio: true, video: true};\n const answerOptions = options.answerOptions;\n\n // Create the RTCPeerConnection\n this._initRTCPeerConnection(pcConfig);\n\n // Get the user media\n rtcninja.getUserMedia(\n mediaConstraints,\n userMediaSucceeded,\n userMediaFailed\n );\n\n function userMediaSucceeded(stream) {\n // adding a local stream doesn't trigger the 'onaddstream' callback\n self._pc.addStream(stream);\n self.emit('localStreamAdded', stream);\n\n self._pc.setRemoteDescription(\n new rtcninja.RTCSessionDescription({type: 'offer', sdp: self._incomingSdp}),\n // success\n function() {\n self._createLocalSDP(\n 'answer',\n answerOptions,\n // success\n function(sdp) {\n DEBUG('Local SDP: %s', sdp);\n self._sendAnswer(sdp);\n },\n // failure\n function(error) {\n DEBUG('Error creating local SDP: %s', error);\n self.terminate();\n }\n );\n },\n // failure\n function(error) {\n DEBUG('Error setting remote description: %s', error);\n self.terminate();\n }\n );\n }\n\n function userMediaFailed(error) {\n DEBUG('Error getting user media: %s', error);\n self.terminate();\n }\n }\n\n terminate() {\n if (this._terminated) {\n return;\n }\n\n this._sendTerminate();\n }\n\n // Private API\n\n _initOutgoing(uri, options={}) {\n if (uri.indexOf('@') === -1) {\n throw new Error('Invalid URI');\n }\n\n this._id = uuid.v4();\n this._direction = 'outgoing';\n this._remoteIdentity = uri;\n\n const self = this;\n const pcConfig = options.pcConfig || {iceServers:[]};\n const mediaConstraints = options.mediaConstraints || {audio: true, video: true};\n const offerOptions = options.offerOptions;\n\n // Create the RTCPeerConnection\n this._initRTCPeerConnection(pcConfig);\n\n // Get the user media\n rtcninja.getUserMedia(\n mediaConstraints,\n userMediaSucceeded,\n userMediaFailed\n );\n\n function userMediaSucceeded(stream) {\n // adding a local stream doesn't trigger the 'onaddstream' callback\n self._pc.addStream(stream);\n self.emit('localStreamAdded', stream);\n\n self._createLocalSDP(\n 'offer',\n offerOptions,\n // success\n function(sdp) {\n DEBUG('Local SDP: %s', sdp);\n self._sendCall(uri, sdp);\n },\n // failure\n function(error) {\n DEBUG('Error creating local SDP: %s', error);\n self._localTerminate(error);\n }\n );\n }\n\n function userMediaFailed(error) {\n DEBUG('Error getting user media: %s', error);\n self._localTerminate(error);\n }\n }\n\n _initIncoming(id, caller, sdp) {\n this._id = id;\n this._remoteIdentity = caller;\n this._incomingSdp = sdp;\n this._direction = 'incoming';\n this._state = 'incoming';\n }\n\n _handleEvent(message) {\n DEBUG('Call event: %o', message);\n switch (message.event) {\n case 'state':\n const oldState = this._state;\n const newState = message.data.state;\n this._state = newState;\n let data = {};\n\n if (newState === 'accepted' && this._direction === 'outgoing') {\n const self = this;\n this._pc.setRemoteDescription(\n new rtcninja.RTCSessionDescription({type: 'answer', sdp: message.data.sdp}),\n // success\n function() {\n DEBUG('Call accepted');\n self.emit('stateChanged', oldState, newState, data);\n },\n // failure\n function(error) {\n DEBUG('Error accepting call: %s', error);\n self.terminate();\n }\n );\n } else {\n if (newState === 'terminated') {\n data.reason = message.data.reason;\n this._terminated = true;\n }\n this.emit('stateChanged', oldState, newState, data);\n if (newState === 'terminated') {\n this._closeRTCPeerConnection();\n }\n }\n break;\n default:\n break;\n }\n }\n\n _initRTCPeerConnection(pcConfig) {\n if (this._pc !== null) {\n throw new Error('RTCPeerConnection already initialized');\n }\n\n const self = this;\n this._pc = new rtcninja.RTCPeerConnection(pcConfig);\n this._pc.onaddstream = function(event, stream) {\n DEBUG('Stream added');\n self.emit('streamAdded', stream);\n };\n this._pc.onicecandidate = function(event) {\n let candidate = null;\n if (event.candidate !== null) {\n candidate = {\n 'candidate': event.candidate.candidate,\n 'sdpMid': event.candidate.sdpMid,\n 'sdpMLineIndex': event.candidate.sdpMLineIndex\n };\n DEBUG('New ICE candidate %o', candidate);\n }\n self._sendTrickle(candidate);\n };\n }\n\n _createLocalSDP(type, options, onSuccess, onFailure) {\n const self = this;\n\n if (type === 'offer') {\n this._pc.createOffer(\n // success\n createSucceeded,\n // failure\n failure,\n // options\n options\n );\n } else if (type === 'answer') {\n this._pc.createAnswer(\n // success\n createSucceeded,\n // failure\n failure,\n // options\n options\n );\n } else {\n throw new Error('type must be \"offer\" or \"answer\", but \"' +type+ '\" was given');\n }\n\n function createSucceeded(desc) {\n self._pc.setLocalDescription(\n desc,\n // success\n function() {\n onSuccess(self._pc.localDescription.sdp);\n },\n // failure\n failure\n );\n }\n\n function failure(error) {\n onFailure(error);\n }\n }\n\n _sendRequest(req, cb) {\n this._account._sendRequest(req, cb);\n }\n\n _sendCall(uri, sdp) {\n let req = {\n sylkrtc: 'session-create',\n account: this.account.id,\n session: this.id,\n uri: uri,\n sdp: sdp\n };\n const self = this;\n this._sendRequest(req, function(error) {\n if (error) {\n DEBUG('Call error: %s', error);\n self._localTerminate(error);\n }\n });\n }\n\n _sendTerminate() {\n let req = {\n sylkrtc: 'session-terminate',\n session: this.id\n };\n const self = this;\n this._sendRequest(req, function(error) {\n if (error) {\n DEBUG('Error terminating call: %s', error);\n self._localTerminate(error);\n }\n self._terminated = true;\n });\n }\n\n _sendTrickle(candidate) {\n let req = {\n sylkrtc: 'session-trickle',\n session: this.id,\n candidates: candidate !== null ? [candidate] : [],\n };\n this._sendRequest(req, null);\n }\n\n _sendAnswer(sdp) {\n let req = {\n sylkrtc: 'session-answer',\n session: this.id,\n sdp: sdp\n };\n const self = this;\n this._sendRequest(req, function(error) {\n if (error) {\n DEBUG('Answer error: %s', error);\n self.terminate();\n }\n });\n }\n\n _closeRTCPeerConnection() {\n DEBUG('Closing RTCPeerConnection');\n if (this._pc !== null) {\n for (let stream of this._pc.getLocalStreams()) {\n rtcninja.closeMediaStream(stream);\n }\n for (let stream of this._pc.getRemoteStreams()) {\n rtcninja.closeMediaStream(stream);\n }\n this._pc.close();\n this._pc = null;\n }\n }\n\n _localTerminate(error) {\n if (this._terminated) {\n return;\n }\n this._account._calls.delete(this.id);\n this._terminated = true;\n const oldState = this._state;\n const newState = 'terminated';\n let data = {\n reason: error.toString()\n };\n this.emit('stateChanged', oldState, newState, data);\n this._closeRTCPeerConnection();\n }\n}\n\n\nexport { Call };\n","'use strict';\n\nimport debug from 'debug';\nimport uuid from 'node-uuid';\n\nimport { EventEmitter } from 'events';\nimport { setImmediate } from 'timers';\nimport { w3cwebsocket as W3CWebSocket } from 'websocket';\nimport { Account } from './account';\n\nconst SYLKRTC_PROTO = 'sylkRTC-1';\nconst DEBUG = debug('sylkrtc:Connection');\nconst INITIAL_DELAY = 0.5 * 1000;\n\n\nclass Connection extends EventEmitter {\n constructor(options = {}) {\n if (!options.server) {\n throw new Error('\\\"server\\\" must be specified');\n }\n super();\n this._wsUri = options.server;\n this._sock = null;\n this._state = null;\n this._closed = false;\n this._timer = null;\n this._delay = INITIAL_DELAY;\n this._accounts = new Map();\n this._requests = new Map();\n }\n\n get state() {\n return this._state;\n }\n\n close() {\n if (this._closed) {\n return;\n }\n this._closed = true;\n if (this._timer) {\n clearTimeout(this._timer);\n this._timer = null;\n }\n if (this._sock) {\n this._sock.close();\n this._sock = null;\n } else {\n setImmediate(() => {\n this._setState('closed');\n });\n }\n }\n\n addAccount(options = {}, cb = null) {\n if (typeof options.account !== 'string' || typeof options.password !== 'string') {\n throw new Error('Invalid options, \\\"account\\\" and \\\"password\\\" must be supplied');\n }\n if (this._accounts.has(options.account)) {\n throw new Error('Account already added');\n }\n\n let acc = new Account(options.account, options.password, this);\n // add it early to the set so we don't add it more than once, ever\n this._accounts.set(acc.id, acc);\n\n let req = {\n sylkrtc: 'account-add',\n account: acc.id,\n password: acc.password\n };\n this._sendRequest(req, (error) => {\n if (error) {\n DEBUG('add_account error: %s', error);\n this._accounts.delete(acc.id);\n acc = null;\n }\n if (cb) {\n cb(error, acc);\n }\n });\n\n }\n\n removeAccount(account, cb=null) {\n const acc = this._accounts.get(account.id);\n if (account !== acc) {\n throw new Error('Unknown account');\n }\n\n // delete the account from the mapping, regardless of the result\n this._accounts.delete(account.id);\n\n let req = {\n sylkrtc: 'account-remove',\n account: acc.id\n };\n this._sendRequest(req, (error) => {\n if (error) {\n DEBUG('remove_account error: %s', error);\n }\n if (cb) {\n cb();\n }\n });\n\n }\n\n // Private API\n\n _initialize() {\n if (this._sock !== null) {\n throw new Error('WebSocket already initialized');\n }\n if (this._timer !== null) {\n throw new Error('Initialize is in progress');\n }\n\n DEBUG('Initializing');\n\n if (process.browser) {\n window.addEventListener('beforeunload', () => {\n if (this._sock !== null) {\n let noop = function() {};\n this._sock.onerror = noop;\n this._sock.onmessage = noop;\n this._sock.onclose = noop;\n this._sock.close();\n }\n });\n }\n\n this._timer = setTimeout(() => {\n this._connect();\n }, this._delay);\n }\n\n _connect() {\n DEBUG('WebSocket connecting');\n this._setState('connecting');\n\n this._sock = new W3CWebSocket(this._wsUri, SYLKRTC_PROTO);\n this._sock.onopen = () => {\n DEBUG('WebSocket connection open');\n this._onOpen();\n };\n this._sock.onerror = () => {\n DEBUG('WebSocket connection got error');\n };\n this._sock.onclose = (event) => {\n DEBUG('WebSocket connection closed: %d: (reason=\\\"%s\\\", clean=%s)', event.code, event.reason, event.wasClean);\n this._onClose();\n };\n this._sock.onmessage = (event) => {\n DEBUG('WebSocket received message: %o', event);\n this._onMessage(event);\n };\n }\n\n _sendRequest(req, cb) {\n const transaction = uuid.v4();\n req.transaction = transaction;\n if (this._state !== 'ready') {\n setImmediate(() => {\n cb(new Error('Connection is not ready'));\n });\n return;\n }\n this._requests.set(transaction, {req: req, cb: cb});\n this._sock.send(JSON.stringify(req));\n }\n\n _setState(newState) {\n DEBUG('Set state: %s -> %s', this._state, newState);\n const oldState = this._state;\n this._state = newState;\n this.emit('stateChanged', oldState, newState);\n }\n\n // WebSocket callbacks\n\n _onOpen() {\n clearTimeout(this._timer);\n this._timer = null;\n this._delay = INITIAL_DELAY;\n this._setState('connected');\n }\n\n _onClose() {\n this._sock = null;\n if (this._timer) {\n clearTimeout(this._timer);\n this._timer = null;\n }\n\n // remove all accounts, the server no longer has them anyway\n this._accounts.clear();\n\n this._setState('disconnected');\n if (!this._closed) {\n this._delay = this._delay * 2;\n if (this._delay > Number.MAX_VALUE) {\n this._delay = INITIAL_DELAY;\n }\n DEBUG('Retrying connection in %s seconds', this._delay / 1000);\n this._timer = setTimeout(() => {\n this._connect();\n }, this._delay);\n } else {\n this._setState('closed');\n }\n }\n\n _onMessage(event) {\n let message = JSON.parse(event.data);\n if (typeof message.sylkrtc === 'undefined') {\n DEBUG('Unrecognized message received');\n return;\n }\n\n DEBUG('Received \\\"%s\\\" message: %o', message.sylkrtc, message);\n\n if (message.sylkrtc === 'event') {\n DEBUG('Received event: \\\"%s\\\"', message.event);\n switch (message.event) {\n case 'ready':\n this._setState('ready');\n break;\n default:\n break;\n }\n } else if (message.sylkrtc === 'account_event') {\n let acc = this._accounts.get(message.account);\n if (!acc) {\n DEBUG('Account %s not found', message.account);\n return;\n }\n acc._handleEvent(message);\n } else if (message.sylkrtc === 'session_event') {\n const sessionId = message.session;\n for (let acc of this._accounts.values()) {\n let call = acc._calls.get(sessionId);\n if (call) {\n call._handleEvent(message);\n break;\n }\n }\n } else if (message.sylkrtc === 'ack' || message.sylkrtc === 'error') {\n const transaction = message.transaction;\n const data = this._requests.get(transaction);\n if (!data) {\n DEBUG('Could not find transaction %s', transaction);\n return;\n }\n this._requests.delete(transaction);\n DEBUG('Received \\\"%s\\\" for request: %o', message.sylkrtc, data.req);\n if (data.cb) {\n if (message.sylkrtc === 'ack') {\n data.cb(null);\n } else {\n data.cb(new Error(message.error));\n }\n }\n }\n }\n\n}\n\n\nexport { Connection };\n","'use strict';\n\nimport debug from 'debug';\nimport rtcninja from 'rtcninja';\nimport { Connection } from './connection';\n\n\n// Public API\n\nfunction createConnection(options = {}) {\n if (!rtcninja.hasWebRTC()) {\n throw new Error('WebRTC support not detected');\n }\n\n let conn = new Connection(options);\n conn._initialize();\n return conn;\n}\n\n\n// Some proxied functions from rtcninja\n\nfunction isWebRTCSupported() {\n return rtcninja.hasWebRTC();\n}\n\nfunction attachMediaStream(element, stream) {\n return rtcninja.attachMediaStream(element, stream);\n}\n\nfunction closeMediaStream(stream) {\n rtcninja.closeMediaStream(stream);\n}\n\n\nexport default {\n createConnection,\n debug,\n attachMediaStream, closeMediaStream, isWebRTCSupported\n};\n","/*\n * JavaScript MD5 1.0.1\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/MIT\n * \n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/*jslint bitwise: true */\n/*global unescape, define */\n\n(function ($) {\n 'use strict';\n\n /*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n function safe_add(x, y) {\n var lsw = (x & 0xFFFF) + (y & 0xFFFF),\n msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xFFFF);\n }\n\n /*\n * Bitwise rotate a 32-bit number to the left.\n */\n function bit_rol(num, cnt) {\n return (num << cnt) | (num >>> (32 - cnt));\n }\n\n /*\n * These functions implement the four basic operations the algorithm uses.\n */\n function md5_cmn(q, a, b, x, s, t) {\n return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);\n }\n function md5_ff(a, b, c, d, x, s, t) {\n return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);\n }\n function md5_gg(a, b, c, d, x, s, t) {\n return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);\n }\n function md5_hh(a, b, c, d, x, s, t) {\n return md5_cmn(b ^ c ^ d, a, b, x, s, t);\n }\n function md5_ii(a, b, c, d, x, s, t) {\n return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);\n }\n\n /*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n function binl_md5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << (len % 32);\n x[(((len + 64) >>> 9) << 4) + 14] = len;\n\n var i, olda, oldb, oldc, oldd,\n a = 1732584193,\n b = -271733879,\n c = -1732584194,\n d = 271733878;\n\n for (i = 0; i < x.length; i += 16) {\n olda = a;\n oldb = b;\n oldc = c;\n oldd = d;\n\n a = md5_ff(a, b, c, d, x[i], 7, -680876936);\n d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);\n\n a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5_gg(b, c, d, a, x[i], 20, -373897302);\n a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);\n\n a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5_hh(d, a, b, c, x[i], 11, -358537222);\n c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);\n\n a = md5_ii(a, b, c, d, x[i], 6, -198630844);\n d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);\n\n a = safe_add(a, olda);\n b = safe_add(b, oldb);\n c = safe_add(c, oldc);\n d = safe_add(d, oldd);\n }\n return [a, b, c, d];\n }\n\n /*\n * Convert an array of little-endian words to a string\n */\n function binl2rstr(input) {\n var i,\n output = '';\n for (i = 0; i < input.length * 32; i += 8) {\n output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);\n }\n return output;\n }\n\n /*\n * Convert a raw string to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n function rstr2binl(input) {\n var i,\n output = [];\n output[(input.length >> 2) - 1] = undefined;\n for (i = 0; i < output.length; i += 1) {\n output[i] = 0;\n }\n for (i = 0; i < input.length * 8; i += 8) {\n output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);\n }\n return output;\n }\n\n /*\n * Calculate the MD5 of a raw string\n */\n function rstr_md5(s) {\n return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));\n }\n\n /*\n * Calculate the HMAC-MD5, of a key and some data (raw strings)\n */\n function rstr_hmac_md5(key, data) {\n var i,\n bkey = rstr2binl(key),\n ipad = [],\n opad = [],\n hash;\n ipad[15] = opad[15] = undefined;\n if (bkey.length > 16) {\n bkey = binl_md5(bkey, key.length * 8);\n }\n for (i = 0; i < 16; i += 1) {\n ipad[i] = bkey[i] ^ 0x36363636;\n opad[i] = bkey[i] ^ 0x5C5C5C5C;\n }\n hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\n return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));\n }\n\n /*\n * Convert a raw string to a hex string\n */\n function rstr2hex(input) {\n var hex_tab = '0123456789abcdef',\n output = '',\n x,\n i;\n for (i = 0; i < input.length; i += 1) {\n x = input.charCodeAt(i);\n output += hex_tab.charAt((x >>> 4) & 0x0F) +\n hex_tab.charAt(x & 0x0F);\n }\n return output;\n }\n\n /*\n * Encode a string as utf-8\n */\n function str2rstr_utf8(input) {\n return unescape(encodeURIComponent(input));\n }\n\n /*\n * Take string arguments and return either raw or hex encoded strings\n */\n function raw_md5(s) {\n return rstr_md5(str2rstr_utf8(s));\n }\n function hex_md5(s) {\n return rstr2hex(raw_md5(s));\n }\n function raw_hmac_md5(k, d) {\n return rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d));\n }\n function hex_hmac_md5(k, d) {\n return rstr2hex(raw_hmac_md5(k, d));\n }\n\n function md5(string, key, raw) {\n if (!key) {\n if (!raw) {\n return hex_md5(string);\n }\n return raw_md5(string);\n }\n if (!raw) {\n return hex_hmac_md5(key, string);\n }\n return raw_hmac_md5(key, string);\n }\n\n if (typeof define === 'function' && define.amd) {\n define(function () {\n return md5;\n });\n } else {\n $.md5 = md5;\n }\n}(this));\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n this._events = this._events || {};\n this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n if (!isNumber(n) || n < 0 || isNaN(n))\n throw TypeError('n must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n var er, handler, len, args, i, listeners;\n\n if (!this._events)\n this._events = {};\n\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events.error ||\n (isObject(this._events.error) && !this._events.error.length)) {\n er = arguments[1];\n if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n }\n throw TypeError('Uncaught, unspecified \"error\" event.');\n }\n }\n\n handler = this._events[type];\n\n if (isUndefined(handler))\n return false;\n\n if (isFunction(handler)) {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n len = arguments.length;\n args = new Array(len - 1);\n for (i = 1; i < len; i++)\n args[i - 1] = arguments[i];\n handler.apply(this, args);\n }\n } else if (isObject(handler)) {\n len = arguments.length;\n args = new Array(len - 1);\n for (i = 1; i < len; i++)\n args[i - 1] = arguments[i];\n\n listeners = handler.slice();\n len = listeners.length;\n for (i = 0; i < len; i++)\n listeners[i].apply(this, args);\n }\n\n return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n var m;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events)\n this._events = {};\n\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (this._events.newListener)\n this.emit('newListener', type,\n isFunction(listener.listener) ?\n listener.listener : listener);\n\n if (!this._events[type])\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n else if (isObject(this._events[type]))\n // If we've already got an array, just append.\n this._events[type].push(listener);\n else\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n\n // Check for listener leak\n if (isObject(this._events[type]) && !this._events[type].warned) {\n var m;\n if (!isUndefined(this._maxListeners)) {\n m = this._maxListeners;\n } else {\n m = EventEmitter.defaultMaxListeners;\n }\n\n if (m && m > 0 && this._events[type].length > m) {\n this._events[type].warned = true;\n console.error('(node) warning: possible EventEmitter memory ' +\n 'leak detected. %d listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit.',\n this._events[type].length);\n if (typeof console.trace === 'function') {\n // not supported in IE 10\n console.trace();\n }\n }\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n var fired = false;\n\n function g() {\n this.removeListener(type, g);\n\n if (!fired) {\n fired = true;\n listener.apply(this, arguments);\n }\n }\n\n g.listener = listener;\n this.on(type, g);\n\n return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n var list, position, length, i;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events || !this._events[type])\n return this;\n\n list = this._events[type];\n length = list.length;\n position = -1;\n\n if (list === listener ||\n (isFunction(list.listener) && list.listener === listener)) {\n delete this._events[type];\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n\n } else if (isObject(list)) {\n for (i = length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list.length = 0;\n delete this._events[type];\n } else {\n list.splice(position, 1);\n }\n\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n var key, listeners;\n\n if (!this._events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!this._events.removeListener) {\n if (arguments.length === 0)\n this._events = {};\n else if (this._events[type])\n delete this._events[type];\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n for (key in this._events) {\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = {};\n return this;\n }\n\n listeners = this._events[type];\n\n if (isFunction(listeners)) {\n this.removeListener(type, listeners);\n } else {\n // LIFO order\n while (listeners.length)\n this.removeListener(type, listeners[listeners.length - 1]);\n }\n delete this._events[type];\n\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n var ret;\n if (!this._events || !this._events[type])\n ret = [];\n else if (isFunction(this._events[type]))\n ret = [this._events[type]];\n else\n ret = this._events[type].slice();\n return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n var ret;\n if (!emitter._events || !emitter._events[type])\n ret = 0;\n else if (isFunction(emitter._events[type]))\n ret = 1;\n else\n ret = emitter._events[type].length;\n return ret;\n};\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\n","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n currentQueue[queueIndex].run();\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\n// TODO(shtylman)\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","var nextTick = require('process/browser.js').nextTick;\nvar apply = Function.prototype.apply;\nvar slice = Array.prototype.slice;\nvar immediateIds = {};\nvar nextImmediateId = 0;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) { timeout.close(); };\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// That's not how node.js implements it but the exposed api is the same.\nexports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n var id = nextImmediateId++;\n var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\n immediateIds[id] = true;\n\n nextTick(function onNextTick() {\n if (immediateIds[id]) {\n // fn.call() is faster so we optimize for the common use-case\n // @see http://jsperf.com/call-apply-segu\n if (args) {\n fn.apply(null, args);\n } else {\n fn.call(null);\n }\n // Prevent ids from leaking\n exports.clearImmediate(id);\n }\n });\n\n return id;\n};\n\nexports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n delete immediateIds[id];\n};","\n/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n && 'undefined' != typeof chrome.storage\n ? chrome.storage.local\n : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n 'lightseagreen',\n 'forestgreen',\n 'goldenrod',\n 'dodgerblue',\n 'darkorchid',\n 'crimson'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n // is webkit? http://stackoverflow.com/a/16459606/376773\n return ('WebkitAppearance' in document.documentElement.style) ||\n // is firebug? http://stackoverflow.com/a/398120/376773\n (window.console && (console.firebug || (console.exception && console.table))) ||\n // is firefox >= v31?\n // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n (navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31);\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n return JSON.stringify(v);\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs() {\n var args = arguments;\n var useColors = this.useColors;\n\n args[0] = (useColors ? '%c' : '')\n + this.namespace\n + (useColors ? ' %c' : ' ')\n + args[0]\n + (useColors ? '%c ' : ' ')\n + '+' + exports.humanize(this.diff);\n\n if (!useColors) return args;\n\n var c = 'color: ' + this.color;\n args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1));\n\n // the final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n var index = 0;\n var lastC = 0;\n args[0].replace(/%[a-z%]/g, function(match) {\n if ('%%' === match) return;\n index++;\n if ('%c' === match) {\n // we only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index;\n }\n });\n\n args.splice(lastC, 0, c);\n return args;\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n // this hackery is required for IE8/9, where\n // the `console.log` function doesn't have 'apply'\n return 'object' === typeof console\n && console.log\n && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n try {\n if (null == namespaces) {\n exports.storage.removeItem('debug');\n } else {\n exports.storage.debug = namespaces;\n }\n } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n var r;\n try {\n r = exports.storage.debug;\n } catch(e) {}\n return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage(){\n try {\n return window.localStorage;\n } catch (e) {}\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = debug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = require('ms');\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lowercased letter, i.e. \"n\".\n */\n\nexports.formatters = {};\n\n/**\n * Previously assigned color.\n */\n\nvar prevColor = 0;\n\n/**\n * Previous log timestamp.\n */\n\nvar prevTime;\n\n/**\n * Select a color.\n *\n * @return {Number}\n * @api private\n */\n\nfunction selectColor() {\n return exports.colors[prevColor++ % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction debug(namespace) {\n\n // define the `disabled` version\n function disabled() {\n }\n disabled.enabled = false;\n\n // define the `enabled` version\n function enabled() {\n\n var self = enabled;\n\n // set `diff` timestamp\n var curr = +new Date();\n var ms = curr - (prevTime || curr);\n self.diff = ms;\n self.prev = prevTime;\n self.curr = curr;\n prevTime = curr;\n\n // add the `color` if not set\n if (null == self.useColors) self.useColors = exports.useColors();\n if (null == self.color && self.useColors) self.color = selectColor();\n\n var args = Array.prototype.slice.call(arguments);\n\n args[0] = exports.coerce(args[0]);\n\n if ('string' !== typeof args[0]) {\n // anything else let's inspect with %o\n args = ['%o'].concat(args);\n }\n\n // apply any `formatters` transformations\n var index = 0;\n args[0] = args[0].replace(/%([a-z%])/g, function(match, format) {\n // if we encounter an escaped % then don't increase the array index\n if (match === '%%') return match;\n index++;\n var formatter = exports.formatters[format];\n if ('function' === typeof formatter) {\n var val = args[index];\n match = formatter.call(self, val);\n\n // now we need to remove `args[index]` since it's inlined in the `format`\n args.splice(index, 1);\n index--;\n }\n return match;\n });\n\n if ('function' === typeof exports.formatArgs) {\n args = exports.formatArgs.apply(self, args);\n }\n var logFn = enabled.log || exports.log || console.log.bind(console);\n logFn.apply(self, args);\n }\n enabled.enabled = true;\n\n var fn = exports.enabled(namespace) ? enabled : disabled;\n\n fn.namespace = namespace;\n\n return fn;\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n exports.save(namespaces);\n\n var split = (namespaces || '').split(/[\\s,]+/);\n var len = split.length;\n\n for (var i = 0; i < len; i++) {\n if (!split[i]) continue; // ignore empty strings\n namespaces = split[i].replace(/\\*/g, '.*?');\n if (namespaces[0] === '-') {\n exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n } else {\n exports.names.push(new RegExp('^' + namespaces + '$'));\n }\n }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n var i, len;\n for (i = 0, len = exports.skips.length; i < len; i++) {\n if (exports.skips[i].test(name)) {\n return false;\n }\n }\n for (i = 0, len = exports.names.length; i < len; i++) {\n if (exports.names[i].test(name)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n if (val instanceof Error) return val.stack || val.message;\n return val;\n}\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} options\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options){\n options = options || {};\n if ('string' == typeof val) return parse(val);\n return options.long\n ? long(val)\n : short(val);\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = '' + str;\n if (str.length > 10000) return;\n var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str);\n if (!match) return;\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction short(ms) {\n if (ms >= d) return Math.round(ms / d) + 'd';\n if (ms >= h) return Math.round(ms / h) + 'h';\n if (ms >= m) return Math.round(ms / m) + 'm';\n if (ms >= s) return Math.round(ms / s) + 's';\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction long(ms) {\n return plural(ms, d, 'day')\n || plural(ms, h, 'hour')\n || plural(ms, m, 'minute')\n || plural(ms, s, 'second')\n || ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n if (ms < n) return;\n if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name;\n return Math.ceil(ms / n) + ' ' + name + 's';\n}\n","// uuid.js\n//\n// Copyright (c) 2010-2012 Robert Kieffer\n// MIT License - http://opensource.org/licenses/mit-license.php\n\n(function() {\n var _global = this;\n\n // Unique ID creation requires a high quality random # generator. We feature\n // detect to determine the best RNG source, normalizing to a function that\n // returns 128-bits of randomness, since that's what's usually required\n var _rng;\n\n // Node.js crypto-based RNG - http://nodejs.org/docs/v0.6.2/api/crypto.html\n //\n // Moderately fast, high quality\n if (typeof(_global.require) == 'function') {\n try {\n var _rb = _global.require('crypto').randomBytes;\n _rng = _rb && function() {return _rb(16);};\n } catch(e) {}\n }\n\n if (!_rng && _global.crypto && crypto.getRandomValues) {\n // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto\n //\n // Moderately fast, high quality\n var _rnds8 = new Uint8Array(16);\n _rng = function whatwgRNG() {\n crypto.getRandomValues(_rnds8);\n return _rnds8;\n };\n }\n\n if (!_rng) {\n // Math.random()-based (RNG)\n //\n // If all else fails, use Math.random(). It's fast, but is of unspecified\n // quality.\n var _rnds = new Array(16);\n _rng = function() {\n for (var i = 0, r; i < 16; i++) {\n if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n }\n\n return _rnds;\n };\n }\n\n // Buffer class to use\n var BufferClass = typeof(_global.Buffer) == 'function' ? _global.Buffer : Array;\n\n // Maps for number <-> hex string conversion\n var _byteToHex = [];\n var _hexToByte = {};\n for (var i = 0; i < 256; i++) {\n _byteToHex[i] = (i + 0x100).toString(16).substr(1);\n _hexToByte[_byteToHex[i]] = i;\n }\n\n // **`parse()` - Parse a UUID into it's component bytes**\n function parse(s, buf, offset) {\n var i = (buf && offset) || 0, ii = 0;\n\n buf = buf || [];\n s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) {\n if (ii < 16) { // Don't overflow!\n buf[i + ii++] = _hexToByte[oct];\n }\n });\n\n // Zero out remaining bytes if string was short\n while (ii < 16) {\n buf[i + ii++] = 0;\n }\n\n return buf;\n }\n\n // **`unparse()` - Convert UUID byte array (ala parse()) into a string**\n function unparse(buf, offset) {\n var i = offset || 0, bth = _byteToHex;\n return bth[buf[i++]] + bth[buf[i++]] +\n bth[buf[i++]] + bth[buf[i++]] + '-' +\n bth[buf[i++]] + bth[buf[i++]] + '-' +\n bth[buf[i++]] + bth[buf[i++]] + '-' +\n bth[buf[i++]] + bth[buf[i++]] + '-' +\n bth[buf[i++]] + bth[buf[i++]] +\n bth[buf[i++]] + bth[buf[i++]] +\n bth[buf[i++]] + bth[buf[i++]];\n }\n\n // **`v1()` - Generate time-based UUID**\n //\n // Inspired by https://github.com/LiosK/UUID.js\n // and http://docs.python.org/library/uuid.html\n\n // random #'s we need to init node and clockseq\n var _seedBytes = _rng();\n\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n var _nodeId = [\n _seedBytes[0] | 0x01,\n _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5]\n ];\n\n // Per 4.2.2, randomize (14 bit) clockseq\n var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff;\n\n // Previous uuid creation time\n var _lastMSecs = 0, _lastNSecs = 0;\n\n // See https://github.com/broofa/node-uuid for API details\n function v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || [];\n\n options = options || {};\n\n var clockseq = options.clockseq != null ? options.clockseq : _clockseq;\n\n // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n var msecs = options.msecs != null ? options.msecs : new Date().getTime();\n\n // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n var nsecs = options.nsecs != null ? options.nsecs : _lastNSecs + 1;\n\n // Time since last uuid creation (in msecs)\n var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;\n\n // Per 4.2.1.2, Bump clockseq on clock regression\n if (dt < 0 && options.clockseq == null) {\n clockseq = clockseq + 1 & 0x3fff;\n }\n\n // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) {\n nsecs = 0;\n }\n\n // Per 4.2.1.2 Throw error if too many uuids are requested\n if (nsecs >= 10000) {\n throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq;\n\n // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n msecs += 12219292800000;\n\n // `time_low`\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff;\n\n // `time_mid`\n var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff;\n\n // `time_high_and_version`\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n b[i++] = tmh >>> 16 & 0xff;\n\n // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n b[i++] = clockseq >>> 8 | 0x80;\n\n // `clock_seq_low`\n b[i++] = clockseq & 0xff;\n\n // `node`\n var node = options.node || _nodeId;\n for (var n = 0; n < 6; n++) {\n b[i + n] = node[n];\n }\n\n return buf ? buf : unparse(b);\n }\n\n // **`v4()` - Generate random UUID**\n\n // See https://github.com/broofa/node-uuid for API details\n function v4(options, buf, offset) {\n // Deprecated - 'format' argument, as supported in v1.2\n var i = buf && offset || 0;\n\n if (typeof(options) == 'string') {\n buf = options == 'binary' ? new BufferClass(16) : null;\n options = null;\n }\n options = options || {};\n\n var rnds = options.random || (options.rng || _rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n for (var ii = 0; ii < 16; ii++) {\n buf[i + ii] = rnds[ii];\n }\n }\n\n return buf || unparse(rnds);\n }\n\n // Export public API\n var uuid = v4;\n uuid.v1 = v1;\n uuid.v4 = v4;\n uuid.parse = parse;\n uuid.unparse = unparse;\n uuid.BufferClass = BufferClass;\n\n if (typeof(module) != 'undefined' && module.exports) {\n // Publish as node.js module\n module.exports = uuid;\n } else if (typeof define === 'function' && define.amd) {\n // Publish as AMD module\n define(function() {return uuid;});\n \n\n } else {\n // Publish as global (in browsers)\n var _previousRoot = _global.uuid;\n\n // **`noConflict()` - (browser only) to reset global 'uuid' var**\n uuid.noConflict = function() {\n _global.uuid = _previousRoot;\n return uuid;\n };\n\n _global.uuid = uuid;\n }\n}).call(this);\n","'use strict';\n\n// Expose the Adapter function/object.\nmodule.exports = Adapter;\n\n\n// Dependencies\n\nvar browser = require('bowser'),\n\tdebug = require('debug')('rtcninja:Adapter'),\n\tdebugerror = require('debug')('rtcninja:ERROR:Adapter'),\n\n\t// Internal vars\n\tgetUserMedia = null,\n\tRTCPeerConnection = null,\n\tRTCSessionDescription = null,\n\tRTCIceCandidate = null,\n\tMediaStreamTrack = null,\n\tgetMediaDevices = null,\n\tattachMediaStream = null,\n\tcanRenegotiate = false,\n\toldSpecRTCOfferOptions = false,\n\tbrowserVersion = Number(browser.version) || 0,\n\tisDesktop = !!(!browser.mobile && !browser.tablet),\n\thasWebRTC = false,\n\tvirtGlobal, virtNavigator;\n\ndebugerror.log = console.warn.bind(console);\n\n// Dirty trick to get this library working in a Node-webkit env with browserified libs\nvirtGlobal = global.window || global;\n// Don't fail in Node\nvirtNavigator = virtGlobal.navigator || {};\n\n\n// Constructor.\n\nfunction Adapter(options) {\n\t// Chrome desktop, Chrome Android, Opera desktop, Opera Android, Android native browser\n\t// or generic Webkit browser.\n\tif (\n\t\t(isDesktop && browser.chrome && browserVersion >= 32) ||\n\t\t(browser.android && browser.chrome && browserVersion >= 39) ||\n\t\t(isDesktop && browser.opera && browserVersion >= 27) ||\n\t\t(browser.android && browser.opera && browserVersion >= 24) ||\n\t\t(browser.android && browser.webkit && !browser.chrome && browserVersion >= 37) ||\n\t\t(virtNavigator.webkitGetUserMedia && virtGlobal.webkitRTCPeerConnection)\n\t) {\n\t\thasWebRTC = true;\n\t\tgetUserMedia = virtNavigator.webkitGetUserMedia.bind(virtNavigator);\n\t\tRTCPeerConnection = virtGlobal.webkitRTCPeerConnection;\n\t\tRTCSessionDescription = virtGlobal.RTCSessionDescription;\n\t\tRTCIceCandidate = virtGlobal.RTCIceCandidate;\n\t\tMediaStreamTrack = virtGlobal.MediaStreamTrack;\n\t\tif (MediaStreamTrack && MediaStreamTrack.getSources) {\n\t\t\tgetMediaDevices = MediaStreamTrack.getSources.bind(MediaStreamTrack);\n\t\t} else if (virtNavigator.getMediaDevices) {\n\t\t\tgetMediaDevices = virtNavigator.getMediaDevices.bind(virtNavigator);\n\t\t}\n\t\tattachMediaStream = function (element, stream) {\n\t\t\telement.src = URL.createObjectURL(stream);\n\t\t\treturn element;\n\t\t};\n\t\tcanRenegotiate = true;\n\t\toldSpecRTCOfferOptions = false;\n\t// Firefox desktop, Firefox Android.\n\t} else if (\n\t\t(isDesktop && browser.firefox && browserVersion >= 22) ||\n\t\t(browser.android && browser.firefox && browserVersion >= 33) ||\n\t\t(virtNavigator.mozGetUserMedia && virtGlobal.mozRTCPeerConnection)\n\t) {\n\t\thasWebRTC = true;\n\t\tgetUserMedia = virtNavigator.mozGetUserMedia.bind(virtNavigator);\n\t\tRTCPeerConnection = virtGlobal.mozRTCPeerConnection;\n\t\tRTCSessionDescription = virtGlobal.mozRTCSessionDescription;\n\t\tRTCIceCandidate = virtGlobal.mozRTCIceCandidate;\n\t\tMediaStreamTrack = virtGlobal.MediaStreamTrack;\n\t\tattachMediaStream = function (element, stream) {\n\t\t\telement.src = URL.createObjectURL(stream);\n\t\t\treturn element;\n\t\t};\n\t\tcanRenegotiate = false;\n\t\toldSpecRTCOfferOptions = false;\n\t\t// WebRTC plugin required. For example IE or Safari with the Temasys plugin.\n\t} else if (\n\t\toptions.plugin &&\n\t\ttypeof options.plugin.isRequired === 'function' &&\n\t\toptions.plugin.isRequired() &&\n\t\ttypeof options.plugin.isInstalled === 'function' &&\n\t\toptions.plugin.isInstalled()\n\t) {\n\t\tvar pluginiface = options.plugin.interface;\n\n\t\thasWebRTC = true;\n\t\tgetUserMedia = pluginiface.getUserMedia;\n\t\tRTCPeerConnection = pluginiface.RTCPeerConnection;\n\t\tRTCSessionDescription = pluginiface.RTCSessionDescription;\n\t\tRTCIceCandidate = pluginiface.RTCIceCandidate;\n\t\tMediaStreamTrack = pluginiface.MediaStreamTrack;\n\t\tif (MediaStreamTrack && MediaStreamTrack.getSources) {\n\t\t\tgetMediaDevices = MediaStreamTrack.getSources.bind(MediaStreamTrack);\n\t\t} else if (virtNavigator.getMediaDevices) {\n\t\t\tgetMediaDevices = virtNavigator.getMediaDevices.bind(virtNavigator);\n\t\t}\n\t\tattachMediaStream = pluginiface.attachMediaStream;\n\t\tcanRenegotiate = pluginiface.canRenegotiate;\n\t\toldSpecRTCOfferOptions = true; // TODO: Update when fixed in the plugin.\n\t// Best effort (may be adater.js is loaded).\n\t} else if (virtNavigator.getUserMedia && virtGlobal.RTCPeerConnection) {\n\t\thasWebRTC = true;\n\t\tgetUserMedia = virtNavigator.getUserMedia.bind(virtNavigator);\n\t\tRTCPeerConnection = virtGlobal.RTCPeerConnection;\n\t\tRTCSessionDescription = virtGlobal.RTCSessionDescription;\n\t\tRTCIceCandidate = virtGlobal.RTCIceCandidate;\n\t\tMediaStreamTrack = virtGlobal.MediaStreamTrack;\n\t\tif (MediaStreamTrack && MediaStreamTrack.getSources) {\n\t\t\tgetMediaDevices = MediaStreamTrack.getSources.bind(MediaStreamTrack);\n\t\t} else if (virtNavigator.getMediaDevices) {\n\t\t\tgetMediaDevices = virtNavigator.getMediaDevices.bind(virtNavigator);\n\t\t}\n\t\tattachMediaStream = virtGlobal.attachMediaStream || function (element, stream) {\n\t\t\telement.src = URL.createObjectURL(stream);\n\t\t\treturn element;\n\t\t};\n\t\tcanRenegotiate = false;\n\t\toldSpecRTCOfferOptions = false;\n\t}\n\n\n\tfunction throwNonSupported(item) {\n\t\treturn function () {\n\t\t\tthrow new Error('rtcninja: WebRTC not supported, missing ' + item +\n\t\t\t' [browser: ' + browser.name + ' ' + browser.version + ']');\n\t\t};\n\t}\n\n\n\t// Public API.\n\n\t// Expose a WebRTC checker.\n\tAdapter.hasWebRTC = function () {\n\t\treturn hasWebRTC;\n\t};\n\n\t// Expose getUserMedia.\n\tif (getUserMedia) {\n\t\tAdapter.getUserMedia = function (constraints, successCallback, errorCallback) {\n\t\t\tdebug('getUserMedia() | constraints: %o', constraints);\n\n\t\t\ttry {\n\t\t\t\tgetUserMedia(constraints,\n\t\t\t\t\tfunction (stream) {\n\t\t\t\t\t\tdebug('getUserMedia() | success');\n\t\t\t\t\t\tif (successCallback) {\n\t\t\t\t\t\t\tsuccessCallback(stream);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tfunction (error) {\n\t\t\t\t\t\tdebug('getUserMedia() | error:', error);\n\t\t\t\t\t\tif (errorCallback) {\n\t\t\t\t\t\t\terrorCallback(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t\tcatch (error) {\n\t\t\t\tdebugerror('getUserMedia() | error:', error);\n\t\t\t\tif (errorCallback) {\n\t\t\t\t\terrorCallback(error);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} else {\n\t\tAdapter.getUserMedia = function (constraints, successCallback, errorCallback) {\n\t\t\tdebugerror('getUserMedia() | WebRTC not supported');\n\t\t\tif (errorCallback) {\n\t\t\t\terrorCallback(new Error('rtcninja: WebRTC not supported, missing ' +\n\t\t\t\t'getUserMedia [browser: ' + browser.name + ' ' + browser.version + ']'));\n\t\t\t} else {\n\t\t\t\tthrowNonSupported('getUserMedia');\n\t\t\t}\n\t\t};\n\t}\n\n\t// Expose RTCPeerConnection.\n\tAdapter.RTCPeerConnection = RTCPeerConnection || throwNonSupported('RTCPeerConnection');\n\n\t// Expose RTCSessionDescription.\n\tAdapter.RTCSessionDescription = RTCSessionDescription || throwNonSupported('RTCSessionDescription');\n\n\t// Expose RTCIceCandidate.\n\tAdapter.RTCIceCandidate = RTCIceCandidate || throwNonSupported('RTCIceCandidate');\n\n\t// Expose MediaStreamTrack.\n\tAdapter.MediaStreamTrack = MediaStreamTrack || throwNonSupported('MediaStreamTrack');\n\n\t// Expose getMediaDevices.\n\tAdapter.getMediaDevices = getMediaDevices;\n\n\t// Expose MediaStreamTrack.\n\tAdapter.attachMediaStream = attachMediaStream || throwNonSupported('attachMediaStream');\n\n\t// Expose canRenegotiate attribute.\n\tAdapter.canRenegotiate = canRenegotiate;\n\n\t// Expose closeMediaStream.\n\tAdapter.closeMediaStream = function (stream) {\n\t\tif (!stream) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Latest spec states that MediaStream has no stop() method and instead must\n\t\t// call stop() on every MediaStreamTrack.\n\t\tif (MediaStreamTrack && MediaStreamTrack.prototype && MediaStreamTrack.prototype.stop) {\n\t\t\tdebug('closeMediaStream() | calling stop() on all the MediaStreamTrack');\n\n\t\t\tvar tracks, i, len;\n\n\t\t\tif (stream.getTracks) {\n\t\t\t\ttracks = stream.getTracks();\n\t\t\t\tfor (i = 0, len = tracks.length; i < len; i += 1) {\n\t\t\t\t\ttracks[i].stop();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttracks = stream.getAudioTracks();\n\t\t\t\tfor (i = 0, len = tracks.length; i < len; i += 1) {\n\t\t\t\t\ttracks[i].stop();\n\t\t\t\t}\n\n\t\t\t\ttracks = stream.getVideoTracks();\n\t\t\t\tfor (i = 0, len = tracks.length; i < len; i += 1) {\n\t\t\t\t\ttracks[i].stop();\n\t\t\t\t}\n\t\t\t}\n\t\t// Deprecated by the spec, but still in use.\n\t\t} else if (typeof stream.stop === 'function') {\n\t\t\tdebug('closeMediaStream() | calling stop() on the MediaStream');\n\n\t\t\tstream.stop();\n\t\t}\n\t};\n\n\t// Expose fixPeerConnectionConfig.\n\tAdapter.fixPeerConnectionConfig = function (pcConfig) {\n\t\tvar i, len, iceServer, hasUrls, hasUrl;\n\n\t\tif (!Array.isArray(pcConfig.iceServers)) {\n\t\t\tpcConfig.iceServers = [];\n\t\t}\n\n\t\tfor (i = 0, len = pcConfig.iceServers.length; i < len; i += 1) {\n\t\t\ticeServer = pcConfig.iceServers[i];\n\t\t\thasUrls = iceServer.hasOwnProperty('urls');\n\t\t\thasUrl = iceServer.hasOwnProperty('url');\n\n\t\t\tif (typeof iceServer === 'object') {\n\t\t\t\t// Has .urls but not .url, so add .url with a single string value.\n\t\t\t\tif (hasUrls && !hasUrl) {\n\t\t\t\t\ticeServer.url = (Array.isArray(iceServer.urls) ? iceServer.urls[0] : iceServer.urls);\n\t\t\t\t// Has .url but not .urls, so add .urls with same value.\n\t\t\t\t} else if (!hasUrls && hasUrl) {\n\t\t\t\t\ticeServer.urls = (Array.isArray(iceServer.url) ? iceServer.url.slice() : iceServer.url);\n\t\t\t\t}\n\n\t\t\t\t// Ensure .url is a single string.\n\t\t\t\tif (hasUrl && Array.isArray(iceServer.url)) {\n\t\t\t\t\ticeServer.url = iceServer.url[0];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t// Expose fixRTCOfferOptions.\n\tAdapter.fixRTCOfferOptions = function (options) {\n\t\toptions = options || {};\n\n\t\t// New spec.\n\t\tif (!oldSpecRTCOfferOptions) {\n\t\t\tif (options.mandatory && options.mandatory.OfferToReceiveAudio) {\n\t\t\t\toptions.offerToReceiveAudio = 1;\n\t\t\t}\n\t\t\tif (options.mandatory && options.mandatory.OfferToReceiveVideo) {\n\t\t\t\toptions.offerToReceiveVideo = 1;\n\t\t\t}\n\t\t\tdelete options.mandatory;\n\t\t// Old spec.\n\t\t} else {\n\t\t\tif (options.offerToReceiveAudio) {\n\t\t\t\toptions.mandatory = options.mandatory || {};\n\t\t\t\toptions.mandatory.OfferToReceiveAudio = true;\n\t\t\t}\n\t\t\tif (options.offerToReceiveVideo) {\n\t\t\t\toptions.mandatory = options.mandatory || {};\n\t\t\t\toptions.mandatory.OfferToReceiveVideo = true;\n\t\t\t}\n\t\t}\n\t};\n\n\treturn Adapter;\n}\n","'use strict';\n\n// Expose the RTCPeerConnection class.\nmodule.exports = RTCPeerConnection;\n\n\n// Dependencies.\n\nvar merge = require('merge'),\n\tdebug = require('debug')('rtcninja:RTCPeerConnection'),\n\tdebugerror = require('debug')('rtcninja:ERROR:RTCPeerConnection'),\n\tAdapter = require('./Adapter'),\n\n\t// Internal constants.\n\tC = {\n\t\tREGEXP_NORMALIZED_CANDIDATE: new RegExp(/^candidate:/i),\n\t\tREGEXP_FIX_CANDIDATE: new RegExp(/(^a=|\\r|\\n)/gi),\n\t\tREGEXP_RELAY_CANDIDATE: new RegExp(/ relay /i),\n\t\tREGEXP_SDP_CANDIDATES: new RegExp(/^a=candidate:.*\\r\\n/igm),\n\t\tREGEXP_SDP_NON_RELAY_CANDIDATES: new RegExp(/^a=candidate:(.(?!relay ))*\\r\\n/igm)\n\t},\n\n\t// Internal variables.\n\tVAR = {\n\t\tnormalizeCandidate: null\n\t};\n\ndebugerror.log = console.warn.bind(console);\n\n\n// Constructor\n\nfunction RTCPeerConnection(pcConfig, pcConstraints) {\n\tdebug('new | pcConfig: %o', pcConfig);\n\n\t// Set this.pcConfig and this.options.\n\tsetConfigurationAndOptions.call(this, pcConfig);\n\n\t// NOTE: Deprecated pcConstraints argument.\n\tthis.pcConstraints = pcConstraints;\n\n\t// Own version of the localDescription.\n\tthis.ourLocalDescription = null;\n\n\t// Latest values of PC attributes to avoid events with same value.\n\tthis.ourSignalingState = null;\n\tthis.ourIceConnectionState = null;\n\tthis.ourIceGatheringState = null;\n\n\t// Timer for options.gatheringTimeout.\n\tthis.timerGatheringTimeout = null;\n\n\t// Timer for options.gatheringTimeoutAfterRelay.\n\tthis.timerGatheringTimeoutAfterRelay = null;\n\n\t// Flag to ignore new gathered ICE candidates.\n\tthis.ignoreIceGathering = false;\n\n\t// Flag set when closed.\n\tthis.closed = false;\n\n\t// Set RTCPeerConnection.\n\tsetPeerConnection.call(this);\n\n\t// Set properties.\n\tsetProperties.call(this);\n}\n\n\n// Public API.\n\nRTCPeerConnection.prototype.createOffer = function (successCallback, failureCallback, options) {\n\tdebug('createOffer()');\n\n\tvar self = this;\n\n\tAdapter.fixRTCOfferOptions(options);\n\n\tthis.pc.createOffer(\n\t\tfunction (offer) {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebug('createOffer() | success');\n\t\t\tif (successCallback) {\n\t\t\t\tsuccessCallback(offer);\n\t\t\t}\n\t\t},\n\t\tfunction (error) {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebugerror('createOffer() | error:', error);\n\t\t\tif (failureCallback) {\n\t\t\t\tfailureCallback(error);\n\t\t\t}\n\t\t},\n\t\toptions\n\t);\n};\n\n\nRTCPeerConnection.prototype.createAnswer = function (successCallback, failureCallback, options) {\n\tdebug('createAnswer()');\n\n\tvar self = this;\n\n\tthis.pc.createAnswer(\n\t\tfunction (answer) {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebug('createAnswer() | success');\n\t\t\tif (successCallback) {\n\t\t\t\tsuccessCallback(answer);\n\t\t\t}\n\t\t},\n\t\tfunction (error) {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebugerror('createAnswer() | error:', error);\n\t\t\tif (failureCallback) {\n\t\t\t\tfailureCallback(error);\n\t\t\t}\n\t\t},\n\t\toptions\n\t);\n};\n\n\nRTCPeerConnection.prototype.setLocalDescription = function (description, successCallback, failureCallback) {\n\tdebug('setLocalDescription()');\n\n\tvar self = this;\n\n\tthis.pc.setLocalDescription(\n\t\tdescription,\n\t\t// success.\n\t\tfunction () {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebug('setLocalDescription() | success');\n\n\t\t\t// Clear gathering timers.\n\t\t\tclearTimeout(self.timerGatheringTimeout);\n\t\t\tdelete self.timerGatheringTimeout;\n\t\t\tclearTimeout(self.timerGatheringTimeoutAfterRelay);\n\t\t\tdelete self.timerGatheringTimeoutAfterRelay;\n\n\t\t\trunTimerGatheringTimeout();\n\t\t\tif (successCallback) {\n\t\t\t\tsuccessCallback();\n\t\t\t}\n\t\t},\n\t\t// failure\n\t\tfunction (error) {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebugerror('setLocalDescription() | error:', error);\n\t\t\tif (failureCallback) {\n\t\t\t\tfailureCallback(error);\n\t\t\t}\n\t\t}\n\t);\n\n\t// Enable (again) ICE gathering.\n\tthis.ignoreIceGathering = false;\n\n\t// Handle gatheringTimeout.\n\tfunction runTimerGatheringTimeout() {\n\t\tif (typeof self.options.gatheringTimeout !== 'number') {\n\t\t\treturn;\n\t\t}\n\t\t// If setLocalDescription was already called, it may happen that\n\t\t// ICE gathering is not needed, so don't run this timer.\n\t\tif (self.pc.iceGatheringState === 'complete') {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('setLocalDescription() | ending gathering in %d ms (gatheringTimeout option)',\n\t\t\tself.options.gatheringTimeout);\n\n\t\tself.timerGatheringTimeout = setTimeout(function () {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdebug('forced end of candidates after gatheringTimeout timeout');\n\n\t\t\t// Clear gathering timers.\n\t\t\tdelete self.timerGatheringTimeout;\n\t\t\tclearTimeout(self.timerGatheringTimeoutAfterRelay);\n\t\t\tdelete self.timerGatheringTimeoutAfterRelay;\n\n\t\t\t// Ignore new candidates.\n\t\t\tself.ignoreIceGathering = true;\n\t\t\tif (self.onicecandidate) {\n\t\t\t\tself.onicecandidate({ candidate: null }, null);\n\t\t\t}\n\n\t\t}, self.options.gatheringTimeout);\n\t}\n};\n\n\nRTCPeerConnection.prototype.setRemoteDescription = function (description, successCallback, failureCallback) {\n\tdebug('setRemoteDescription()');\n\n\tvar self = this;\n\n\tthis.pc.setRemoteDescription(\n\t\tdescription,\n\t\tfunction () {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebug('setRemoteDescription() | success');\n\t\t\tif (successCallback) {\n\t\t\t\tsuccessCallback();\n\t\t\t}\n\t\t},\n\t\tfunction (error) {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebugerror('setRemoteDescription() | error:', error);\n\t\t\tif (failureCallback) {\n\t\t\t\tfailureCallback(error);\n\t\t\t}\n\t\t}\n\t);\n};\n\n\nRTCPeerConnection.prototype.updateIce = function (pcConfig) {\n\tdebug('updateIce() | pcConfig: %o', pcConfig);\n\n\t// Update this.pcConfig and this.options.\n\tsetConfigurationAndOptions.call(this, pcConfig);\n\n\tthis.pc.updateIce(this.pcConfig);\n\n\t// Enable (again) ICE gathering.\n\tthis.ignoreIceGathering = false;\n};\n\n\nRTCPeerConnection.prototype.addIceCandidate = function (candidate, successCallback, failureCallback) {\n\tdebug('addIceCandidate() | candidate: %o', candidate);\n\n\tvar self = this;\n\n\tthis.pc.addIceCandidate(\n\t\tcandidate,\n\t\tfunction () {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebug('addIceCandidate() | success');\n\t\t\tif (successCallback) {\n\t\t\t\tsuccessCallback();\n\t\t\t}\n\t\t},\n\t\tfunction (error) {\n\t\t\tif (isClosed.call(self)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdebugerror('addIceCandidate() | error:', error);\n\t\t\tif (failureCallback) {\n\t\t\t\tfailureCallback(error);\n\t\t\t}\n\t\t}\n\t);\n};\n\n\nRTCPeerConnection.prototype.getConfiguration = function () {\n\tdebug('getConfiguration()');\n\n\treturn this.pc.getConfiguration();\n};\n\n\nRTCPeerConnection.prototype.getLocalStreams = function () {\n\tdebug('getLocalStreams()');\n\n\treturn this.pc.getLocalStreams();\n};\n\n\nRTCPeerConnection.prototype.getRemoteStreams = function () {\n\tdebug('getRemoteStreams()');\n\n\treturn this.pc.getRemoteStreams();\n};\n\n\nRTCPeerConnection.prototype.getStreamById = function (streamId) {\n\tdebug('getStreamById() | streamId: %s', streamId);\n\n\treturn this.pc.getStreamById(streamId);\n};\n\n\nRTCPeerConnection.prototype.addStream = function (stream) {\n\tdebug('addStream() | stream: %s', stream);\n\n\tthis.pc.addStream(stream);\n};\n\n\nRTCPeerConnection.prototype.removeStream = function (stream) {\n\tdebug('removeStream() | stream: %o', stream);\n\n\tthis.pc.removeStream(stream);\n};\n\n\nRTCPeerConnection.prototype.close = function () {\n\tdebug('close()');\n\n\tthis.closed = true;\n\n\t// Clear gathering timers.\n\tclearTimeout(this.timerGatheringTimeout);\n\tdelete this.timerGatheringTimeout;\n\tclearTimeout(this.timerGatheringTimeoutAfterRelay);\n\tdelete this.timerGatheringTimeoutAfterRelay;\n\n\tthis.pc.close();\n};\n\n\nRTCPeerConnection.prototype.createDataChannel = function () {\n\tdebug('createDataChannel()');\n\n\treturn this.pc.createDataChannel.apply(this.pc, arguments);\n};\n\n\nRTCPeerConnection.prototype.createDTMFSender = function (track) {\n\tdebug('createDTMFSender()');\n\n\treturn this.pc.createDTMFSender(track);\n};\n\n\nRTCPeerConnection.prototype.getStats = function () {\n\tdebug('getStats()');\n\n\treturn this.pc.getStats.apply(this.pc, arguments);\n};\n\n\nRTCPeerConnection.prototype.setIdentityProvider = function () {\n\tdebug('setIdentityProvider()');\n\n\treturn this.pc.setIdentityProvider.apply(this.pc, arguments);\n};\n\n\nRTCPeerConnection.prototype.getIdentityAssertion = function () {\n\tdebug('getIdentityAssertion()');\n\n\treturn this.pc.getIdentityAssertion();\n};\n\n\nRTCPeerConnection.prototype.reset = function (pcConfig) {\n\tdebug('reset() | pcConfig: %o', pcConfig);\n\n\tvar pc = this.pc;\n\n\t// Remove events in the old PC.\n\tpc.onnegotiationneeded = null;\n\tpc.onicecandidate = null;\n\tpc.onaddstream = null;\n\tpc.onremovestream = null;\n\tpc.ondatachannel = null;\n\tpc.onsignalingstatechange = null;\n\tpc.oniceconnectionstatechange = null;\n\tpc.onicegatheringstatechange = null;\n\tpc.onidentityresult = null;\n\tpc.onpeeridentity = null;\n\tpc.onidpassertionerror = null;\n\tpc.onidpvalidationerror = null;\n\n\t// Clear gathering timers.\n\tclearTimeout(this.timerGatheringTimeout);\n\tdelete this.timerGatheringTimeout;\n\tclearTimeout(this.timerGatheringTimeoutAfterRelay);\n\tdelete this.timerGatheringTimeoutAfterRelay;\n\n\t// Silently close the old PC.\n\tdebug('reset() | closing current peerConnection');\n\tpc.close();\n\n\t// Set this.pcConfig and this.options.\n\tsetConfigurationAndOptions.call(this, pcConfig);\n\n\t// Create a new PC.\n\tsetPeerConnection.call(this);\n};\n\n\n// Private Helpers.\n\nfunction setConfigurationAndOptions(pcConfig) {\n\t// Clone pcConfig.\n\tthis.pcConfig = merge(true, pcConfig);\n\n\t// Fix pcConfig.\n\tAdapter.fixPeerConnectionConfig(this.pcConfig);\n\n\tthis.options = {\n\t\ticeTransportsRelay: (this.pcConfig.iceTransports === 'relay'),\n\t\ticeTransportsNone: (this.pcConfig.iceTransports === 'none'),\n\t\tgatheringTimeout: this.pcConfig.gatheringTimeout,\n\t\tgatheringTimeoutAfterRelay: this.pcConfig.gatheringTimeoutAfterRelay\n\t};\n\n\t// Remove custom rtcninja.RTCPeerConnection options from pcConfig.\n\tdelete this.pcConfig.gatheringTimeout;\n\tdelete this.pcConfig.gatheringTimeoutAfterRelay;\n\n\tdebug('setConfigurationAndOptions | processed pcConfig: %o', this.pcConfig);\n}\n\n\nfunction isClosed() {\n\treturn ((this.closed) || (this.pc && this.pc.iceConnectionState === 'closed'));\n}\n\n\nfunction setEvents() {\n\tvar self = this,\n\t\tpc = this.pc;\n\n\tpc.onnegotiationneeded = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onnegotiationneeded()');\n\t\tif (self.onnegotiationneeded) {\n\t\t\tself.onnegotiationneeded(event);\n\t\t}\n\t};\n\n\tpc.onicecandidate = function (event) {\n\t\tvar candidate, isRelay, newCandidate;\n\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\t\tif (self.ignoreIceGathering) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ignore any candidate (event the null one) if iceTransports:'none' is set.\n\t\tif (self.options.iceTransportsNone) {\n\t\t\treturn;\n\t\t}\n\n\t\tcandidate = event.candidate;\n\n\t\tif (candidate) {\n\t\t\tisRelay = C.REGEXP_RELAY_CANDIDATE.test(candidate.candidate);\n\n\t\t\t// Ignore if just relay candidates are requested.\n\t\t\tif (self.options.iceTransportsRelay && !isRelay) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Handle gatheringTimeoutAfterRelay.\n\t\t\tif (isRelay && !self.timerGatheringTimeoutAfterRelay &&\n\t\t\t\t(typeof self.options.gatheringTimeoutAfterRelay === 'number')) {\n\t\t\t\tdebug('onicecandidate() | first relay candidate found, ending gathering in %d ms', self.options.gatheringTimeoutAfterRelay);\n\n\t\t\t\tself.timerGatheringTimeoutAfterRelay = setTimeout(function () {\n\t\t\t\t\tif (isClosed.call(self)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tdebug('forced end of candidates after timeout');\n\n\t\t\t\t\t// Clear gathering timers.\n\t\t\t\t\tdelete self.timerGatheringTimeoutAfterRelay;\n\t\t\t\t\tclearTimeout(self.timerGatheringTimeout);\n\t\t\t\t\tdelete self.timerGatheringTimeout;\n\n\t\t\t\t\t// Ignore new candidates.\n\t\t\t\t\tself.ignoreIceGathering = true;\n\t\t\t\t\tif (self.onicecandidate) {\n\t\t\t\t\t\tself.onicecandidate({candidate: null}, null);\n\t\t\t\t\t}\n\t\t\t\t}, self.options.gatheringTimeoutAfterRelay);\n\t\t\t}\n\n\t\t\tnewCandidate = new Adapter.RTCIceCandidate({\n\t\t\t\tsdpMid: candidate.sdpMid,\n\t\t\t\tsdpMLineIndex: candidate.sdpMLineIndex,\n\t\t\t\tcandidate: candidate.candidate\n\t\t\t});\n\n\t\t\t// Force correct candidate syntax (just check it once).\n\t\t\tif (VAR.normalizeCandidate === null) {\n\t\t\t\tif (C.REGEXP_NORMALIZED_CANDIDATE.test(candidate.candidate)) {\n\t\t\t\t\tVAR.normalizeCandidate = false;\n\t\t\t\t} else {\n\t\t\t\t\tdebug('onicecandidate() | normalizing ICE candidates syntax (remove \"a=\" and \"\\\\r\\\\n\")');\n\t\t\t\t\tVAR.normalizeCandidate = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (VAR.normalizeCandidate) {\n\t\t\t\tnewCandidate.candidate = candidate.candidate.replace(C.REGEXP_FIX_CANDIDATE, '');\n\t\t\t}\n\n\t\t\tdebug(\n\t\t\t\t'onicecandidate() | m%d(%s) %s',\n\t\t\t\tnewCandidate.sdpMLineIndex,\n\t\t\t\tnewCandidate.sdpMid || 'no mid', newCandidate.candidate);\n\t\t\tif (self.onicecandidate) {\n\t\t\t\tself.onicecandidate(event, newCandidate);\n\t\t\t}\n\t\t// Null candidate (end of candidates).\n\t\t} else {\n\t\t\tdebug('onicecandidate() | end of candidates');\n\n\t\t\t// Clear gathering timers.\n\t\t\tclearTimeout(self.timerGatheringTimeout);\n\t\t\tdelete self.timerGatheringTimeout;\n\t\t\tclearTimeout(self.timerGatheringTimeoutAfterRelay);\n\t\t\tdelete self.timerGatheringTimeoutAfterRelay;\n\t\t\tif (self.onicecandidate) {\n\t\t\t\tself.onicecandidate(event, null);\n\t\t\t}\n\t\t}\n\t};\n\n\tpc.onaddstream = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onaddstream() | stream: %o', event.stream);\n\t\tif (self.onaddstream) {\n\t\t\tself.onaddstream(event, event.stream);\n\t\t}\n\t};\n\n\tpc.onremovestream = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onremovestream() | stream: %o', event.stream);\n\t\tif (self.onremovestream) {\n\t\t\tself.onremovestream(event, event.stream);\n\t\t}\n\t};\n\n\tpc.ondatachannel = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('ondatachannel() | datachannel: %o', event.channel);\n\t\tif (self.ondatachannel) {\n\t\t\tself.ondatachannel(event, event.channel);\n\t\t}\n\t};\n\n\tpc.onsignalingstatechange = function (event) {\n\t\tif (pc.signalingState === self.ourSignalingState) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onsignalingstatechange() | signalingState: %s', pc.signalingState);\n\t\tself.ourSignalingState = pc.signalingState;\n\t\tif (self.onsignalingstatechange) {\n\t\t\tself.onsignalingstatechange(event, pc.signalingState);\n\t\t}\n\t};\n\n\tpc.oniceconnectionstatechange = function (event) {\n\t\tif (pc.iceConnectionState === self.ourIceConnectionState) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('oniceconnectionstatechange() | iceConnectionState: %s', pc.iceConnectionState);\n\t\tself.ourIceConnectionState = pc.iceConnectionState;\n\t\tif (self.oniceconnectionstatechange) {\n\t\t\tself.oniceconnectionstatechange(event, pc.iceConnectionState);\n\t\t}\n\t};\n\n\tpc.onicegatheringstatechange = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (pc.iceGatheringState === self.ourIceGatheringState) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onicegatheringstatechange() | iceGatheringState: %s', pc.iceGatheringState);\n\t\tself.ourIceGatheringState = pc.iceGatheringState;\n\t\tif (self.onicegatheringstatechange) {\n\t\t\tself.onicegatheringstatechange(event, pc.iceGatheringState);\n\t\t}\n\t};\n\n\tpc.onidentityresult = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onidentityresult()');\n\t\tif (self.onidentityresult) {\n\t\t\tself.onidentityresult(event);\n\t\t}\n\t};\n\n\tpc.onpeeridentity = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onpeeridentity()');\n\t\tif (self.onpeeridentity) {\n\t\t\tself.onpeeridentity(event);\n\t\t}\n\t};\n\n\tpc.onidpassertionerror = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onidpassertionerror()');\n\t\tif (self.onidpassertionerror) {\n\t\t\tself.onidpassertionerror(event);\n\t\t}\n\t};\n\n\tpc.onidpvalidationerror = function (event) {\n\t\tif (isClosed.call(self)) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebug('onidpvalidationerror()');\n\t\tif (self.onidpvalidationerror) {\n\t\t\tself.onidpvalidationerror(event);\n\t\t}\n\t};\n}\n\n\nfunction setPeerConnection() {\n\t// Create a RTCPeerConnection.\n\tif (!this.pcConstraints) {\n\t\tthis.pc = new Adapter.RTCPeerConnection(this.pcConfig);\n\t} else {\n\t\t// NOTE: Deprecated.\n\t\tthis.pc = new Adapter.RTCPeerConnection(this.pcConfig, this.pcConstraints);\n\t}\n\n\t// Set RTC events.\n\tsetEvents.call(this);\n}\n\n\nfunction getLocalDescription() {\n\tvar pc = this.pc,\n\t\toptions = this.options,\n\t\tsdp = null;\n\n\tif (!pc.localDescription) {\n\t\tthis.ourLocalDescription = null;\n\t\treturn null;\n\t}\n\n\t// Mangle the SDP string.\n\tif (options.iceTransportsRelay) {\n\t\tsdp = pc.localDescription.sdp.replace(C.REGEXP_SDP_NON_RELAY_CANDIDATES, '');\n\t} else if (options.iceTransportsNone) {\n\t\tsdp = pc.localDescription.sdp.replace(C.REGEXP_SDP_CANDIDATES, '');\n\t}\n\n\tthis.ourLocalDescription = new Adapter.RTCSessionDescription({\n\t\ttype: pc.localDescription.type,\n\t\tsdp: sdp || pc.localDescription.sdp\n\t});\n\n\treturn this.ourLocalDescription;\n}\n\n\nfunction setProperties() {\n\tvar self = this;\n\n\tObject.defineProperties(this, {\n\t\tpeerConnection: {\n\t\t\tget: function () {\n\t\t\t\treturn self.pc;\n\t\t\t}\n\t\t},\n\n\t\tsignalingState: {\n\t\t\tget: function () {\n\t\t\t\treturn self.pc.signalingState;\n\t\t\t}\n\t\t},\n\n\t\ticeConnectionState: {\n\t\t\tget: function () {\n\t\t\t\treturn self.pc.iceConnectionState;\n\t\t\t}\n\t\t},\n\n\t\ticeGatheringState: {\n\t\t\tget: function () {\n\t\t\t\treturn self.pc.iceGatheringState;\n\t\t\t}\n\t\t},\n\n\t\tlocalDescription: {\n\t\t\tget: function () {\n\t\t\t\treturn getLocalDescription.call(self);\n\t\t\t}\n\t\t},\n\n\t\tremoteDescription: {\n\t\t\tget: function () {\n\t\t\t\treturn self.pc.remoteDescription;\n\t\t\t}\n\t\t},\n\n\t\tpeerIdentity: {\n\t\t\tget: function () {\n\t\t\t\treturn self.pc.peerIdentity;\n\t\t\t}\n\t\t}\n\t});\n}\n","'use strict';\n\nmodule.exports = rtcninja;\n\n\n// Dependencies.\n\nvar browser = require('bowser'),\n\tdebug = require('debug')('rtcninja'),\n\tdebugerror = require('debug')('rtcninja:ERROR'),\n\tversion = require('./version'),\n\tAdapter = require('./Adapter'),\n\tRTCPeerConnection = require('./RTCPeerConnection'),\n\n\t// Internal vars.\n\tcalled = false;\n\ndebugerror.log = console.warn.bind(console);\ndebug('version %s', version);\ndebug('detected browser: %s %s [mobile:%s, tablet:%s, android:%s, ios:%s]',\n\t\tbrowser.name, browser.version, !!browser.mobile, !!browser.tablet,\n\t\t!!browser.android, !!browser.ios);\n\n\n// Constructor.\n\nfunction rtcninja(options) {\n\t// Load adapter\n\tvar iface = Adapter(options || {}); // jshint ignore:line\n\n\tcalled = true;\n\n\t// Expose RTCPeerConnection class.\n\trtcninja.RTCPeerConnection = RTCPeerConnection;\n\n\t// Expose WebRTC API and utils.\n\trtcninja.getUserMedia = iface.getUserMedia;\n\trtcninja.RTCSessionDescription = iface.RTCSessionDescription;\n\trtcninja.RTCIceCandidate = iface.RTCIceCandidate;\n\trtcninja.MediaStreamTrack = iface.MediaStreamTrack;\n\trtcninja.getMediaDevices = iface.getMediaDevices;\n\trtcninja.attachMediaStream = iface.attachMediaStream;\n\trtcninja.closeMediaStream = iface.closeMediaStream;\n\trtcninja.canRenegotiate = iface.canRenegotiate;\n\n\t// Log WebRTC support.\n\tif (iface.hasWebRTC()) {\n\t\tdebug('WebRTC supported');\n\t\treturn true;\n\t} else {\n\t\tdebugerror('WebRTC not supported');\n\t\treturn false;\n\t}\n}\n\n\n// Public API.\n\n// If called without calling rtcninja(), call it.\nrtcninja.hasWebRTC = function () {\n\tif (!called) {\n\t\trtcninja();\n\t}\n\n\treturn Adapter.hasWebRTC();\n};\n\n\n// Expose version property.\nObject.defineProperty(rtcninja, 'version', {\n\tget: function () {\n\t\treturn version;\n\t}\n});\n\n\n// Expose called property.\nObject.defineProperty(rtcninja, 'called', {\n\tget: function () {\n\t\treturn called;\n\t}\n});\n\n\n// Exposing stuff.\n\nrtcninja.debug = require('debug');\nrtcninja.browser = browser;\n","'use strict';\n\n// Expose the 'version' field of package.json.\nmodule.exports = require('../package.json').version;\n\n","/*!\n * Bowser - a browser detector\n * https://github.com/ded/bowser\n * MIT License | (c) Dustin Diaz 2015\n */\n\n!function (name, definition) {\n if (typeof module != 'undefined' && module.exports) module.exports = definition()\n else if (typeof define == 'function' && define.amd) define(definition)\n else this[name] = definition()\n}('bowser', function () {\n /**\n * See useragents.js for examples of navigator.userAgent\n */\n\n var t = true\n\n function detect(ua) {\n\n function getFirstMatch(regex) {\n var match = ua.match(regex);\n return (match && match.length > 1 && match[1]) || '';\n }\n\n function getSecondMatch(regex) {\n var match = ua.match(regex);\n return (match && match.length > 1 && match[2]) || '';\n }\n\n var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase()\n , likeAndroid = /like android/i.test(ua)\n , android = !likeAndroid && /android/i.test(ua)\n , chromeBook = /CrOS/.test(ua)\n , edgeVersion = getFirstMatch(/edge\\/(\\d+(\\.\\d+)?)/i)\n , versionIdentifier = getFirstMatch(/version\\/(\\d+(\\.\\d+)?)/i)\n , tablet = /tablet/i.test(ua)\n , mobile = !tablet && /[^-]mobi/i.test(ua)\n , result\n\n if (/opera|opr/i.test(ua)) {\n result = {\n name: 'Opera'\n , opera: t\n , version: versionIdentifier || getFirstMatch(/(?:opera|opr)[\\s\\/](\\d+(\\.\\d+)?)/i)\n }\n }\n else if (/yabrowser/i.test(ua)) {\n result = {\n name: 'Yandex Browser'\n , yandexbrowser: t\n , version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\\s\\/](\\d+(\\.\\d+)?)/i)\n }\n }\n else if (/windows phone/i.test(ua)) {\n result = {\n name: 'Windows Phone'\n , windowsphone: t\n }\n if (edgeVersion) {\n result.msedge = t\n result.version = edgeVersion\n }\n else {\n result.msie = t\n result.version = getFirstMatch(/iemobile\\/(\\d+(\\.\\d+)?)/i)\n }\n }\n else if (/msie|trident/i.test(ua)) {\n result = {\n name: 'Internet Explorer'\n , msie: t\n , version: getFirstMatch(/(?:msie |rv:)(\\d+(\\.\\d+)?)/i)\n }\n } else if (chromeBook) {\n result = {\n name: 'Chrome'\n , chromeBook: t\n , chrome: t\n , version: getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.\\d+)?)/i)\n }\n } else if (/chrome.+? edge/i.test(ua)) {\n result = {\n name: 'Microsoft Edge'\n , msedge: t\n , version: edgeVersion\n }\n }\n else if (/chrome|crios|crmo/i.test(ua)) {\n result = {\n name: 'Chrome'\n , chrome: t\n , version: getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.\\d+)?)/i)\n }\n }\n else if (iosdevice) {\n result = {\n name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod'\n }\n // WTF: version is not part of user agent in web apps\n if (versionIdentifier) {\n result.version = versionIdentifier\n }\n }\n else if (/sailfish/i.test(ua)) {\n result = {\n name: 'Sailfish'\n , sailfish: t\n , version: getFirstMatch(/sailfish\\s?browser\\/(\\d+(\\.\\d+)?)/i)\n }\n }\n else if (/seamonkey\\//i.test(ua)) {\n result = {\n name: 'SeaMonkey'\n , seamonkey: t\n , version: getFirstMatch(/seamonkey\\/(\\d+(\\.\\d+)?)/i)\n }\n }\n else if (/firefox|iceweasel/i.test(ua)) {\n result = {\n name: 'Firefox'\n , firefox: t\n , version: getFirstMatch(/(?:firefox|iceweasel)[ \\/](\\d+(\\.\\d+)?)/i)\n }\n if (/\\((mobile|tablet);[^\\)]*rv:[\\d\\.]+\\)/i.test(ua)) {\n result.firefoxos = t\n }\n }\n else if (/silk/i.test(ua)) {\n result = {\n name: 'Amazon Silk'\n , silk: t\n , version : getFirstMatch(/silk\\/(\\d+(\\.\\d+)?)/i)\n }\n }\n else if (android) {\n result = {\n name: 'Android'\n , version: versionIdentifier\n }\n }\n else if (/phantom/i.test(ua)) {\n result = {\n name: 'PhantomJS'\n , phantom: t\n , version: getFirstMatch(/phantomjs\\/(\\d+(\\.\\d+)?)/i)\n }\n }\n else if (/blackberry|\\bbb\\d+/i.test(ua) || /rim\\stablet/i.test(ua)) {\n result = {\n name: 'BlackBerry'\n , blackberry: t\n , version: versionIdentifier || getFirstMatch(/blackberry[\\d]+\\/(\\d+(\\.\\d+)?)/i)\n }\n }\n else if (/(web|hpw)os/i.test(ua)) {\n result = {\n name: 'WebOS'\n , webos: t\n , version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\\/(\\d+(\\.\\d+)?)/i)\n };\n /touchpad\\//i.test(ua) && (result.touchpad = t)\n }\n else if (/bada/i.test(ua)) {\n result = {\n name: 'Bada'\n , bada: t\n , version: getFirstMatch(/dolfin\\/(\\d+(\\.\\d+)?)/i)\n };\n }\n else if (/tizen/i.test(ua)) {\n result = {\n name: 'Tizen'\n , tizen: t\n , version: getFirstMatch(/(?:tizen\\s?)?browser\\/(\\d+(\\.\\d+)?)/i) || versionIdentifier\n };\n }\n else if (/safari/i.test(ua)) {\n result = {\n name: 'Safari'\n , safari: t\n , version: versionIdentifier\n }\n }\n else {\n result = {\n name: getFirstMatch(/^(.*)\\/(.*) /),\n version: getSecondMatch(/^(.*)\\/(.*) /)\n };\n }\n\n // set webkit or gecko flag for browsers based on these engines\n if (!result.msedge && /(apple)?webkit/i.test(ua)) {\n result.name = result.name || \"Webkit\"\n result.webkit = t\n if (!result.version && versionIdentifier) {\n result.version = versionIdentifier\n }\n } else if (!result.opera && /gecko\\//i.test(ua)) {\n result.name = result.name || \"Gecko\"\n result.gecko = t\n result.version = result.version || getFirstMatch(/gecko\\/(\\d+(\\.\\d+)?)/i)\n }\n\n // set OS flags for platforms that have multiple browsers\n if (!result.msedge && (android || result.silk)) {\n result.android = t\n } else if (iosdevice) {\n result[iosdevice] = t\n result.ios = t\n }\n\n // OS version extraction\n var osVersion = '';\n if (result.windowsphone) {\n osVersion = getFirstMatch(/windows phone (?:os)?\\s?(\\d+(\\.\\d+)*)/i);\n } else if (iosdevice) {\n osVersion = getFirstMatch(/os (\\d+([_\\s]\\d+)*) like mac os x/i);\n osVersion = osVersion.replace(/[_\\s]/g, '.');\n } else if (android) {\n osVersion = getFirstMatch(/android[ \\/-](\\d+(\\.\\d+)*)/i);\n } else if (result.webos) {\n osVersion = getFirstMatch(/(?:web|hpw)os\\/(\\d+(\\.\\d+)*)/i);\n } else if (result.blackberry) {\n osVersion = getFirstMatch(/rim\\stablet\\sos\\s(\\d+(\\.\\d+)*)/i);\n } else if (result.bada) {\n osVersion = getFirstMatch(/bada\\/(\\d+(\\.\\d+)*)/i);\n } else if (result.tizen) {\n osVersion = getFirstMatch(/tizen[\\/\\s](\\d+(\\.\\d+)*)/i);\n }\n if (osVersion) {\n result.osversion = osVersion;\n }\n\n // device type extraction\n var osMajorVersion = osVersion.split('.')[0];\n if (tablet || iosdevice == 'ipad' || (android && (osMajorVersion == 3 || (osMajorVersion == 4 && !mobile))) || result.silk) {\n result.tablet = t\n } else if (mobile || iosdevice == 'iphone' || iosdevice == 'ipod' || android || result.blackberry || result.webos || result.bada) {\n result.mobile = t\n }\n\n // Graded Browser Support\n // http://developer.yahoo.com/yui/articles/gbs\n if (result.msedge ||\n (result.msie && result.version >= 10) ||\n (result.yandexbrowser && result.version >= 15) ||\n (result.chrome && result.version >= 20) ||\n (result.firefox && result.version >= 20.0) ||\n (result.safari && result.version >= 6) ||\n (result.opera && result.version >= 10.0) ||\n (result.ios && result.osversion && result.osversion.split(\".\")[0] >= 6) ||\n (result.blackberry && result.version >= 10.1)\n ) {\n result.a = t;\n }\n else if ((result.msie && result.version < 10) ||\n (result.chrome && result.version < 20) ||\n (result.firefox && result.version < 20.0) ||\n (result.safari && result.version < 6) ||\n (result.opera && result.version < 10.0) ||\n (result.ios && result.osversion && result.osversion.split(\".\")[0] < 6)\n ) {\n result.c = t\n } else result.x = t\n\n return result\n }\n\n var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '')\n\n bowser.test = function (browserList) {\n for (var i = 0; i < browserList.length; ++i) {\n var browserItem = browserList[i];\n if (typeof browserItem=== 'string') {\n if (browserItem in bowser) {\n return true;\n }\n }\n }\n return false;\n }\n\n /*\n * Set our detect method to the main bowser object so we can\n * reuse it to test other user agents.\n * This is needed to implement future tests.\n */\n bowser._detect = detect;\n\n return bowser\n});\n","/*!\r\n * @name JavaScript/NodeJS Merge v1.2.0\r\n * @author yeikos\r\n * @repository https://github.com/yeikos/js.merge\r\n\r\n * Copyright 2014 yeikos - MIT license\r\n * https://raw.github.com/yeikos/js.merge/master/LICENSE\r\n */\r\n\r\n;(function(isNode) {\r\n\r\n\t/**\r\n\t * Merge one or more objects \r\n\t * @param bool? clone\r\n\t * @param mixed,... arguments\r\n\t * @return object\r\n\t */\r\n\r\n\tvar Public = function(clone) {\r\n\r\n\t\treturn merge(clone === true, false, arguments);\r\n\r\n\t}, publicName = 'merge';\r\n\r\n\t/**\r\n\t * Merge two or more objects recursively \r\n\t * @param bool? clone\r\n\t * @param mixed,... arguments\r\n\t * @return object\r\n\t */\r\n\r\n\tPublic.recursive = function(clone) {\r\n\r\n\t\treturn merge(clone === true, true, arguments);\r\n\r\n\t};\r\n\r\n\t/**\r\n\t * Clone the input removing any reference\r\n\t * @param mixed input\r\n\t * @return mixed\r\n\t */\r\n\r\n\tPublic.clone = function(input) {\r\n\r\n\t\tvar output = input,\r\n\t\t\ttype = typeOf(input),\r\n\t\t\tindex, size;\r\n\r\n\t\tif (type === 'array') {\r\n\r\n\t\t\toutput = [];\r\n\t\t\tsize = input.length;\r\n\r\n\t\t\tfor (index=0;index=0.10.32\"\n },\n \"dependencies\": {\n \"bowser\": \"^1.0.0\",\n \"debug\": \"^2.2.0\",\n \"merge\": \"^1.2.0\"\n },\n \"devDependencies\": {\n \"browserify\": \"^11.0.1\",\n \"gulp\": \"git+https://github.com/gulpjs/gulp.git#4.0\",\n \"gulp-expect-file\": \"0.0.7\",\n \"gulp-filelog\": \"^0.4.1\",\n \"gulp-header\": \"^1.7.1\",\n \"gulp-jscs\": \"^2.0.0\",\n \"gulp-jscs-stylish\": \"^1.1.2\",\n \"gulp-jshint\": \"^1.11.2\",\n \"gulp-rename\": \"^1.2.2\",\n \"gulp-uglify\": \"^1.4.0\",\n \"jshint-stylish\": \"^2.0.1\",\n \"retire\": \"^1.1.1\",\n \"shelljs\": \"^0.5.3\",\n \"vinyl-source-stream\": \"^1.1.0\"\n },\n \"gitHead\": \"18789cbefdb5a6c6c038ab4f1ce8e9e3813135b0\",\n \"bugs\": {\n \"url\": \"https://github.com/eface2face/rtcninja.js/issues\"\n },\n \"_id\": \"rtcninja@0.6.4\",\n \"scripts\": {},\n \"_shasum\": \"7ede8577ce978cb431772d877967c53aadeb5e99\",\n \"_from\": \"rtcninja@0.6.4\",\n \"_npmVersion\": \"2.5.1\",\n \"_nodeVersion\": \"0.12.0\",\n \"_npmUser\": {\n \"name\": \"ibc\",\n \"email\": \"ibc@aliax.net\"\n },\n \"dist\": {\n \"shasum\": \"7ede8577ce978cb431772d877967c53aadeb5e99\",\n \"tarball\": \"http://registry.npmjs.org/rtcninja/-/rtcninja-0.6.4.tgz\"\n },\n \"maintainers\": [\n {\n \"name\": \"ibc\",\n \"email\": \"ibc@aliax.net\"\n }\n ],\n \"directories\": {},\n \"_resolved\": \"https://registry.npmjs.org/rtcninja/-/rtcninja-0.6.4.tgz\"\n}\n","var _global = (function() { return this; })();\nvar nativeWebSocket = _global.WebSocket || _global.MozWebSocket;\n\n\n/**\n * Expose a W3C WebSocket class with just one or two arguments.\n */\nfunction W3CWebSocket(uri, protocols) {\n\tvar native_instance;\n\n\tif (protocols) {\n\t\tnative_instance = new nativeWebSocket(uri, protocols);\n\t}\n\telse {\n\t\tnative_instance = new nativeWebSocket(uri);\n\t}\n\n\t/**\n\t * 'native_instance' is an instance of nativeWebSocket (the browser's WebSocket\n\t * class). Since it is an Object it will be returned as it is when creating an\n\t * instance of W3CWebSocket via 'new W3CWebSocket()'.\n\t *\n\t * ECMAScript 5: http://bclary.com/2004/11/07/#a-13.2.2\n\t */\n\treturn native_instance;\n}\n\n\n/**\n * Module exports.\n */\nmodule.exports = {\n 'w3cwebsocket' : nativeWebSocket ? W3CWebSocket : null,\n 'version' : require('./version')\n};\n","module.exports = require('../package.json').version;\n","module.exports={\n \"name\": \"websocket\",\n \"description\": \"Websocket Client & Server Library implementing the WebSocket protocol as specified in RFC 6455.\",\n \"keywords\": [\n \"websocket\",\n \"websockets\",\n \"socket\",\n \"networking\",\n \"comet\",\n \"push\",\n \"RFC-6455\",\n \"realtime\",\n \"server\",\n \"client\"\n ],\n \"author\": {\n \"name\": \"Brian McKelvey\",\n \"email\": \"brian@worlize.com\",\n \"url\": \"https://www.worlize.com/\"\n },\n \"contributors\": [\n {\n \"name\": \"Iñaki Baz Castillo\",\n \"email\": \"ibc@aliax.net\",\n \"url\": \"http://dev.sipdoc.net\"\n }\n ],\n \"version\": \"1.0.21\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/theturtle32/WebSocket-Node.git\"\n },\n \"homepage\": \"https://github.com/theturtle32/WebSocket-Node\",\n \"engines\": {\n \"node\": \">=0.8.0\"\n },\n \"dependencies\": {\n \"debug\": \"~2.2.0\",\n \"nan\": \"~1.8.x\",\n \"typedarray-to-buffer\": \"~3.0.3\",\n \"yaeti\": \"~0.0.4\"\n },\n \"devDependencies\": {\n \"buffer-equal\": \"^0.0.1\",\n \"faucet\": \"^0.0.1\",\n \"gulp\": \"git+https://github.com/gulpjs/gulp.git#4.0\",\n \"gulp-jshint\": \"^1.11.2\",\n \"jshint-stylish\": \"^1.0.2\",\n \"tape\": \"^4.0.1\"\n },\n \"config\": {\n \"verbose\": false\n },\n \"scripts\": {\n \"install\": \"(node-gyp rebuild 2> builderror.log) || (exit 0)\",\n \"test\": \"faucet test/unit\",\n \"gulp\": \"gulp\"\n },\n \"main\": \"index\",\n \"directories\": {\n \"lib\": \"./lib\"\n },\n \"browser\": \"lib/browser.js\",\n \"license\": \"Apache-2.0\",\n \"gitHead\": \"8f5d5f3ef3d946324fe016d525893546ff6500e1\",\n \"bugs\": {\n \"url\": \"https://github.com/theturtle32/WebSocket-Node/issues\"\n },\n \"_id\": \"websocket@1.0.21\",\n \"_shasum\": \"f51f0a96ed19629af39922470ab591907f1c5bd9\",\n \"_from\": \"websocket@1.0.21\",\n \"_npmVersion\": \"2.12.1\",\n \"_nodeVersion\": \"2.3.4\",\n \"_npmUser\": {\n \"name\": \"theturtle32\",\n \"email\": \"brian@worlize.com\"\n },\n \"maintainers\": [\n {\n \"name\": \"theturtle32\",\n \"email\": \"brian@worlize.com\"\n }\n ],\n \"dist\": {\n \"shasum\": \"f51f0a96ed19629af39922470ab591907f1c5bd9\",\n \"tarball\": \"http://registry.npmjs.org/websocket/-/websocket-1.0.21.tgz\"\n },\n \"_resolved\": \"https://registry.npmjs.org/websocket/-/websocket-1.0.21.tgz\",\n \"readme\": \"ERROR: No README data found!\"\n}\n"]} \ No newline at end of file