New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

ws-messaging

Package Overview
Dependencies
Maintainers
1
Versions
19
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

ws-messaging - npm Package Compare versions

Comparing version 0.5.1 to 0.5.2

10

CHANGELOG.md

@@ -5,2 +5,12 @@ # Change Log

<a name="0.5.2"></a>
## [0.5.2](https://github.com/an-sh/ws-messaging/compare/v0.5.1...v0.5.2) (2016-10-27)
### Features
* add client socket constructor customisation ([b9b76e0](https://github.com/an-sh/ws-messaging/commit/b9b76e0))
<a name="0.5.1"></a>

@@ -7,0 +17,0 @@ ## [0.5.1](https://github.com/an-sh/ws-messaging/compare/v0.5.0...v0.5.1) (2016-10-21)

8

lib/Client.js

@@ -147,3 +147,5 @@ 'use strict';

receiveHook: null,
skipValidation: false
skipValidation: false,
WebSocket: undefined,
w3c: undefined
};

@@ -169,3 +171,3 @@

_this2.WebSocket = WebSocket;
_this2.w3c = true;
_this2.w3c = _this2.w3c === undefined ? true : _this2.w3c;
}

@@ -484,2 +486,2 @@

module.exports = Client;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9DbGllbnQuanMiXSwibmFtZXMiOlsiRXZlbnRFbWl0dGVyIiwicmVxdWlyZSIsImFzc2lnbiIsImF0dGVtcHQiLCJmcm9tQ2FsbGJhY2siLCJQcm9taXNlIiwiYmxhY2tsaXN0IiwiY29uY2F0IiwiYmluZCIsImVtaXQiLCJwcm90b3R5cGUiLCJpc0JsYWNrbGlzdGVkRXZlbnQiLCJuYW1lIiwiaW5kZXhPZiIsImdldE93blByb3AiLCJvYmoiLCJoYXNPd25Qcm9wZXJ0eSIsInVuZGVmaW5lZCIsIkNvbm5lY3Rpb25FcnJvciIsImlkIiwiT2JqZWN0IiwiY3JlYXRlIiwiRXJyb3IiLCJUaW1lb3V0RXJyb3IiLCJOb1Byb2NlZHVyZUVycm9yIiwicHJvY2VkdXJlIiwidmFsaWRhdGVJZCIsInZhbGlkYXRlIiwibWVzc2FnZSIsInBhc3NlZCIsImFyZ3MiLCJBcnJheSIsIm5wcm9wcyIsImtleXMiLCJsZW5ndGgiLCJBY2siLCJ0aW1lb3V0IiwiY2IiLCJwcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNldFRpbWVvdXQiLCJmb3JjZU5hY2siLCJlcnJvciIsImNsZWFyVGltZW91dCIsInJlc3VsdCIsInJldHJ5Q29uZmlnIiwiZmFjdG9yIiwibWF4VGltZW91dCIsIkluZmluaXR5IiwibWluVGltZW91dCIsInJhbmRvbWl6ZSIsInJldHJpZXMiLCJkZWZhdWx0cyIsImFja1RpbWVvdXQiLCJhdXRoIiwiYXV0b1JlY29ubmVjdCIsImF1dG9SZWNvbm5lY3RPcHRpb25zIiwiYmluYXJ5VHlwZSIsImRlY29kZXIiLCJKU09OIiwicGFyc2UiLCJlbmNvZGVyIiwic3RyaW5naWZ5IiwiZXJyb3JGb3JtYXR0ZXIiLCJTdHJpbmciLCJwaW5nSW50ZXJ2YWwiLCJwaW5nVGltZW91dCIsInByb3RvY29scyIsInJlY2VpdmVIb29rIiwic2tpcFZhbGlkYXRpb24iLCJDbGllbnQiLCJ1cmwiLCJvcHRpb25zIiwiV2ViU29ja2V0IiwidzNjIiwiY29ubmVjdGVkIiwiY291bnRlciIsImRhdGEiLCJoYW5kbGVycyIsInBlbmRpbmdBY2tzIiwidGVybWluYXRlZCIsInJlZ2lzdGVyIiwicmVjb25uZWN0IiwidGhlbiIsIm1zZyIsIl9kaXNwYXRjaCIsImNhdGNoIiwic2VuZCIsInNvY2tldCIsIm9ub3BlbiIsIm9uZXJyb3IiLCJvbmNsb3NlIiwiX29uQ2xvc2UiLCJvbm1lc3NhZ2UiLCJfb25NZXNzYWdlIiwicGluZ1RpbWVvdXRJZCIsImNhbGwiLCJfbWFrZU1lc3NhZ2UiLCJfc2VuZCIsIl9waW5nIiwiY2xvc2UiLCJyZWFkeVN0YXRlIiwicmFuZCIsIk1hdGgiLCJyYW5kb20iLCJtaW4iLCJwb3ciLCJyZWNvbm5lY3RUaW1lb3V0SWQiLCJjb25uZWN0SGFuZGxlciIsImF1dGhUaW1lb3V0SWQiLCJvcGVuSGFuZGxlciIsIm9uY2UiLCJfc2V0RXZlbnRzIiwiZXYiLCJvZmYiLCJjb2RlIiwiYWNrIiwiX3JlY29ubmVjdCIsIm5lZWRzQWNrIiwiZm4iLCJhcHBseSIsInNldHRsZSIsImJpbmFyeSIsImV2ZW50IiwiaGFuZGxlciIsIl9pc09wZW4iLCJfb3BlbiIsInN0ciIsInRlcm1pbmF0ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7QUFHQSxJQUFNQSxlQUFlQyxRQUFRLGVBQVIsQ0FBckI7O2VBQ21EQSxRQUFRLFNBQVIsQzs7SUFBM0NDLE0sWUFBQUEsTTtJQUFRQyxPLFlBQUFBLE87SUFBU0MsWSxZQUFBQSxZO0lBQWNDLE8sWUFBQUEsTzs7O0FBRXZDLElBQU1DLFlBQVksQ0FBRSxPQUFGLEVBQVcsTUFBWCxFQUFtQixPQUFuQixFQUE0QixNQUE1QixFQUFvQyxPQUFwQyxDQUFsQjs7QUFJQSxJQUFNQyxTQUFTLEdBQUdBLE1BQUgsQ0FBVUMsSUFBVixDQUFlLEVBQWYsQ0FBZjs7QUFFQSxJQUFNQyxPQUFPVCxhQUFhVSxTQUFiLENBQXVCRCxJQUFwQzs7QUFFQSxTQUFTRSxrQkFBVCxDQUE2QkMsSUFB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QUFDQStDLE9BQU9oRCxZQUFQLEdBQXNCQSxZQUF0Qjs7QUFFQTJHLE9BQU9DLE9BQVAsR0FBaUI1RCxNQUFqQiIsImZpbGUiOiJDbGllbnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcbi8qIGdsb2JhbCBXZWJTb2NrZXQgKi9cblxuY29uc3QgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpXG5jb25zdCB7IGFzc2lnbiwgYXR0ZW1wdCwgZnJvbUNhbGxiYWNrLCBQcm9taXNlIH0gPSByZXF1aXJlKCcuL3V0aWxzJylcblxuY29uc3QgYmxhY2tsaXN0ID0gWyAnY2xvc2UnLCAnb3BlbicsICdlcnJvcicsICdwb25nJywgJ3JldHJ5JyBdXG5cbi8vIHV0aWxzXG5cbmNvbnN0IGNvbmNhdCA9IFtdLmNvbmNhdC5iaW5kKFtdKVxuXG5jb25zdCBlbWl0ID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0XG5cbmZ1bmN0aW9uIGlzQmxhY2tsaXN0ZWRFdmVudCAobmFtZSkge1xuICByZXR1cm4gYmxhY2tsaXN0LmluZGV4T2YobmFtZSkgPj0gMFxufVxuXG5mdW5jdGlvbiBnZXRPd25Qcm9wIChvYmosIG5hbWUpIHtcbiAgcmV0dXJuIG9iai5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IG9ialtuYW1lXSA6IHVuZGVmaW5lZFxufVxuXG4vLyBlcnJvcnNcblxuZnVuY3Rpb24gQ29ubmVjdGlvbkVycm9yIChpZCkge1xuICB0aGlzLm5hbWUgPSAnQ29ubmVjdGlvbkVycm9yJ1xuICB0aGlzLmlkID0gaWRcbn1cblxuQ29ubmVjdGlvbkVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKVxuXG5mdW5jdGlvbiBUaW1lb3V0RXJyb3IgKGlkKSB7XG4gIHRoaXMubmFtZSA9ICdUaW1lb3V0RXJyb3InXG4gIHRoaXMuaWQgPSBpZFxufVxuXG5UaW1lb3V0RXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpXG5cbmZ1bmN0aW9uIE5vUHJvY2VkdXJlRXJyb3IgKHByb2NlZHVyZSkge1xuICB0aGlzLm5hbWUgPSAnTm9Qcm9jZWR1cmVFcnJvcidcbiAgdGhpcy5wcm9jZWR1cmUgPSBwcm9jZWR1cmVcbn1cblxuTm9Qcm9jZWR1cmVFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSlcblxuLy8gdmFsaWRhdGlvblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUlkIChpZCkge1xuICByZXR1cm4gdHlwZW9mIGlkID09PSAnbnVtYmVyJyAmJiAoaWQgJSAxKSA9PT0gMCAmJiBpZCA+IDBcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGUgKG1lc3NhZ2UpIHtcbiAgbGV0IHBhc3NlZCA9IGZhbHNlXG4gIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgaWYgKG1lc3NhZ2UubmFtZSkgeyAvLyBtZXNzYWdlXG4gICAgICBpZiAodHlwZW9mIG1lc3NhZ2UubmFtZSA9PT0gJ3N0cmluZycgJiYgbWVzc2FnZS5hcmdzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgbGV0IG5wcm9wcyA9IE9iamVjdC5rZXlzKG1lc3NhZ2UpLmxlbmd0aFxuICAgICAgICBpZiAobnByb3BzID09PSAyIHx8IChucHJvcHMgPT09IDMgJiYgdmFsaWRhdGVJZChtZXNzYWdlLmlkKSkpIHtcbiAgICAgICAgICBwYXNzZWQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyBhY2sgbWVzc2FnZVxuICAgICAgbGV0IG5wcm9wcyA9IE9iamVjdC5rZXlzKG1lc3NhZ2UpLmxlbmd0aFxuICAgICAgaWYgKG5wcm9wcyA9PT0gMiAmJiB2YWxpZGF0ZUlkKG1lc3NhZ2UuaWQpKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmhhc093blByb3BlcnR5KCdlcnJvcicpIHx8IG1lc3NhZ2UuaGFzT3duUHJvcGVydHkoJ3Jlc3VsdCcpKSB7XG4gICAgICAgICAgcGFzc2VkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICghcGFzc2VkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdWYWxpZGF0aW9uIGVycm9yJylcbiAgfVxufVxuXG4vLyBhY2tcblxuY2xhc3MgQWNrIHtcbiAgY29uc3RydWN0b3IgKGlkLCB0aW1lb3V0LCBjYikge1xuICAgIHRoaXMuaWQgPSBpZFxuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZSA9IHJlc29sdmVcbiAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0XG4gICAgfSlcbiAgICB0aGlzLmNiID0gY2JcbiAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZm9yY2VOYWNrKG5ldyBUaW1lb3V0RXJyb3IoaWQpKSwgdGltZW91dClcbiAgfVxuXG4gIGZvcmNlTmFjayAoZXJyb3IpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KVxuICAgIHRoaXMuY2IoKVxuICAgIHRoaXMucmVqZWN0KGVycm9yKVxuICB9XG5cbiAgc2V0dGxlIChtZXNzYWdlKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dClcbiAgICB0aGlzLmNiKClcbiAgICBpZiAobWVzc2FnZS5oYXNPd25Qcm9wZXJ0eSgnZXJyb3InKSkge1xuICAgICAgdGhpcy5yZWplY3QobWVzc2FnZS5lcnJvcilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXNvbHZlKG1lc3NhZ2UucmVzdWx0KVxuICAgIH1cbiAgfVxufVxuXG4vLyBjbGllbnRcblxuLyoqXG4gKiBHZW5lcmFsIGZvcm1hdCBmb3IgYWxsIGRhdGEgdGhhdCBpcyBzZW50IG9yIHJlY2VpdmVkIG92ZXIgYVxuICogd2Vic29ja2V0LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENsaWVudC5NZXNzYWdlXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtpZF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV1cbiAqIEBwcm9wZXJ0eSB7QXJyYXl9IFthcmdzXVxuICogQHByb3BlcnR5IHtPYmplY3R9IFtyZXN1bHRdXG4gKiBAcHJvcGVydHkge09iamVjdH0gW2Vycm9yXVxuICovXG5cbi8qKlxuICogTWVzc2FnZXMgZGVjb2Rlci4gTWF5IGFsc28gcmV0dXJuIHByb21pc2VzIGZvciBhbiBhc3luY2hyb25vdXNcbiAqIGV4ZWN1dGlvbi5cbiAqXG4gKiBAY2FsbGJhY2sgQ2xpZW50LkVuY29kZXJcbiAqIEBwYXJhbSB7Q2xpZW50Lk1lc3NhZ2V9IG1lc3NhZ2UgTWVzc2FnZS5cbiAqIEByZXR1cm4ge1Byb21pc2U8T2JqZWN0PnxPYmplY3R9IERhdGEgdG8gc2VuZC5cbiAqL1xuXG4vKipcbiAqIE1lc3NhZ2VzIGVuY29kZXIuIE1heSBhbHNvIHJldHVybiBwcm9taXNlcyBmb3IgYW4gYXN5bmNocm9ub3VzXG4gKiBleGVjdXRpb24uXG4gKlxuICogQGNhbGxiYWNrIENsaWVudC5EZWNvZGVyXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSBSZWNlaXZlZCBkYXRhLlxuICogQHJldHVybiB7UHJvbWlzZTxDbGllbnQuTWVzc2FnZT58Q2xpZW50Lk1lc3NhZ2V9IE1lc3NhZ2UuXG4gKi9cblxuLyoqXG4gKiBSZWNlaXZlIGhvb2sgaXMgcnVuIHdoZW4gYSBjbGllbnQgcmVjZWl2ZXMgYSB2YWxpZCBtZXNzYWdlIHZpYSBhXG4gKiB3ZWJzb2NrZXQuIE1heSBhbHNvIHJldHVybiBwcm9taXNlcyBmb3IgYW4gYXN5bmNocm9ub3VzIGV4ZWN1dGlvbi5cbiAqXG4gKiBAY2FsbGJhY2sgQ2xpZW50LlJlY2VpdmVIb29rXG4gKiBAcGFyYW0ge0NsaWVudC5NZXNzYWdlfSBtZXNzYWdlIE1lc3NhZ2UuXG4gKiBAcmV0dXJuIHtQcm9taXNlPHVuZGVmaW5lZD58dW5kZWZpbmVkfSBQcm9taXNlLCBpZiBpdCBpcyByZWplY3RlZCBub1xuICogaGFuZGxlcnMgd2lsbCBiZSBjYWxsZWQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDbGllbnQuUmV0cnlDb25maWdcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2ZhY3Rvcj0yXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhUaW1lb3V0PUluZmluaXR5XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttaW5UaW1lb3V0PTEwMDBdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyYW5kb21pemU9dHJ1ZV1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmV0cmllcz0xMF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENsaWVudC5Tb2NrZXRPcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFthY2tUaW1lb3V0PTIwMDAwXSBSZXN1bHQgd2FpdCB0aW1lb3V0IGZvclxuICoge0BsaW5rIENsaWVudCNpbnZva2V9IGluIG1zLlxuICogQHByb3BlcnR5IHtPYmplY3R9IFthdXRoPXt9XSBBdXRoIGRhdGEuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthdXRvUmVjb25uZWN0PXRydWVdIEVuYWJsZSBhdXRvIHJlY29ubmVjdC5cbiAqIEBwcm9wZXJ0eSB7Q2xpZW50LlJldHJ5Q29uZmlnfSBbYXV0b1JlY29ubmVjdE9wdGlvbnNdIEF1dG9cbiAqIHJlY29ubmVjdCBjb25maWcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2JpbmFyeVR5cGU9J2FycmF5YnVmZmVyJ10gVzNDIFdlYlNvY2tldFxuICogYmluYXJ5IGRhdGEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7Q2xpZW50LkRlY29kZXJ9IFtkZWNvZGVyPUpTT04ucGFyc2VdIE1lc3NhZ2VzIGRlY29kZXIuXG4gKiBAcHJvcGVydHkge0NsaWVudC5FbmNvZGVyfSBbZW5jb2Rlcj1KU09OLnN0cmluZ2lmeV0gTWVzc2FnZXNcbiAqIGVuY29kZXIuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBbZXJyb3JGb3JtYXR0ZXI9U3RyaW5nXSBDb252ZXJ0ZXIgZm9yIEpTXG4gKiBlcnJvcnMgdG8gc29tZSBuZXR3b3JrIGZvcm1hdC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcGluZ0ludGVydmFsPTEwMDAwXSBQaW5nIGludGVydmFsIGluIG1zLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwaW5nVGltZW91dD01MDAwXSBQaW5nIHRpbWVvdXQgaW4gbXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ3xBcnJheTxzdHJpbmc+fSBbcHJvdG9jb2xzPSd3cy1tZXNzYWdpbmcnXVxuICogV2ViU29ja2V0IHByb3RvY29scy5cbiAqIEBwcm9wZXJ0eSB7Q2xpZW50LlJlY2VpdmVIb29rfSBbcmVjZWl2ZUhvb2tdIFJlY2VpdmUgaG9vay5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3NraXBWYWxpZGF0aW9uPWZhbHNlXSBTa2lwcyBidWlsZC1pblxuICogbWVzc2FnZXMgdmFsaWRhdGlvbi5cbiAqL1xuXG5jb25zdCByZXRyeUNvbmZpZyA9IHtcbiAgZmFjdG9yOiAyLFxuICBtYXhUaW1lb3V0OiBJbmZpbml0eSxcbiAgbWluVGltZW91dDogMTAwMCxcbiAgcmFuZG9taXplOiB0cnVlLFxuICByZXRyaWVzOiAxMFxufVxuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgYWNrVGltZW91dDogMjAwMDAsXG4gIGF1dGg6IHt9LFxuICBhdXRvUmVjb25uZWN0OiB0cnVlLFxuICBhdXRvUmVjb25uZWN0T3B0aW9uczogcmV0cnlDb25maWcsXG4gIGJpbmFyeVR5cGU6ICdhcnJheWJ1ZmZlcicsXG4gIGRlY29kZXI6IEpTT04ucGFyc2UsXG4gIGVuY29kZXI6IEpTT04uc3RyaW5naWZ5LFxuICBlcnJvckZvcm1hdHRlcjogU3RyaW5nLFxuICBwaW5nSW50ZXJ2YWw6IDEwMDAwLFxuICBwaW5nVGltZW91dDogNTAwMCxcbiAgcHJvdG9jb2xzOiAnd3MtbWVzc2FnaW5nJyxcbiAgcmVjZWl2ZUhvb2s6IG51bGwsXG4gIHNraXBWYWxpZGF0aW9uOiBmYWxzZVxufVxuXG4vKipcbiAqIEBleHRlbmRzIEV2ZW50RW1pdHRlclxuICpcbiAqIEBlbWl0cyBDbGllbnQjY2xvc2VcbiAqIEBlbWl0cyBDbGllbnQjb3BlblxuICogQGVtaXRzIENsaWVudCNlcnJvclxuICogQGVtaXRzIENsaWVudCNjb25uZWN0XG4gKi9cbmNsYXNzIENsaWVudCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2xpZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFdlYlNvY2tldCBjb25uZWN0aW9uIHVybC5cbiAgICogQHBhcmFtIHtDbGllbnQuU29ja2V0T3B0aW9uc30gW29wdGlvbnNdIFNvY2tldCBvcHRpb25zLlxuICAgKi9cbiAgY29uc3RydWN0b3IgKHVybCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMudXJsID0gdXJsXG4gICAgLyoqXG4gICAgICogQ2xpZW50IGlkLiBTZXJ2ZXItc2lkZSBvbmx5LlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICB0aGlzLmlkXG4gICAgYXNzaWduKHRoaXMsIGRlZmF1bHRzLCBvcHRpb25zKVxuICAgIHRoaXMucmV0cnlDb25maWcgPSB7fVxuICAgIGFzc2lnbih0aGlzLnJldHJ5Q29uZmlnLCByZXRyeUNvbmZpZywgb3B0aW9ucy5hdXRvUmVjb25uZWN0T3B0aW9ucylcbiAgICBpZiAoIXRoaXMuV2ViU29ja2V0KSB7XG4gICAgICB0aGlzLldlYlNvY2tldCA9IFdlYlNvY2tldFxuICAgICAgdGhpcy53M2MgPSB0cnVlXG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRydWUsIHRoZW4gYSBjbGllbnQgaXMgY29ubmVjdGVkLlxuICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZVxuICAgIHRoaXMuY291bnRlciA9IDFcbiAgICB0aGlzLmRhdGEgPSB7fVxuICAgIHRoaXMuaGFuZGxlcnMgPSB7fVxuICAgIHRoaXMucGVuZGluZ0Fja3MgPSB7fVxuICAgIHRoaXMuYXR0ZW1wdCA9IDBcbiAgICAvKipcbiAgICAgKiBJZiB0cnVlLCB0aGVuIGEgY2xpZW50IHdhcyBjbG9zZWQgdmlhIGEgY2xvc2UgbWV0aG9kIG9yIGFuIGF1dGhcbiAgICAgKiBlcnJvciBvY2N1cnJlZC5cbiAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIHRoaXMudGVybWluYXRlZCA9IGZhbHNlXG4gICAgdGhpcy5yZWdpc3RlcigncGluZycsICgpID0+IFByb21pc2UucmVzb2x2ZSgpKVxuICAgIHRoaXMucmVjb25uZWN0KClcbiAgfVxuXG4gIF9vbk1lc3NhZ2UgKGRhdGEpIHtcbiAgICBsZXQgbWVzc2FnZVxuICAgIGF0dGVtcHQoKCkgPT4gdGhpcy5kZWNvZGVyKGRhdGEuZGF0YSkpXG4gICAgICAudGhlbihtc2cgPT4geyBtZXNzYWdlID0gbXNnIH0pXG4gICAgICAudGhlbigoKSA9PiB7IGlmICghdGhpcy5za2lwVmFsaWRhdGlvbikgeyB2YWxpZGF0ZShtZXNzYWdlKSB9IH0pXG4gICAgICAudGhlbigoKSA9PiB7IGlmICh0aGlzLnJlY2VpdmVIb29rKSB7IHRoaXMucmVjZWl2ZUhvb2sobWVzc2FnZSkgfSB9KVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5fZGlzcGF0Y2gobWVzc2FnZSkpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4gdGhpcy5zZW5kKCdwcmVwcm9jZXNzaW5nRXJyb3InLCB0aGlzLmVycm9yRm9ybWF0dGVyKGVycm9yKSkpXG4gIH1cblxuICBfc2V0RXZlbnRzICgpIHtcbiAgICAvKipcbiAgICAgKiBFbWl0cyB3M2Mgb25vcGVuIFdlYlNvY2tldCBldmVudHMuXG4gICAgICogQGV2ZW50IENsaWVudCNvcGVuXG4gICAgICovXG4gICAgdGhpcy5zb2NrZXQub25vcGVuID0gZW1pdC5iaW5kKHRoaXMsICdvcGVuJylcbiAgICAvKipcbiAgICAgKiBFbWl0cyB3M2Mgb25lcnJvciBXZWJTb2NrZXQgZXZlbnRzLiBEb2VzIG5vdCB0aHJvdyBpZiB0aGVyZSBhcmVcbiAgICAgKiBubyBsaXN0ZW5lcnMuXG4gICAgICogQGV2ZW50IENsaWVudCNlcnJvclxuICAgICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIEVycm9yLlxuICAgICAqL1xuICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSBlbWl0LmJpbmQodGhpcywgJ2Vycm9yJylcbiAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gdGhpcy5fb25DbG9zZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fb25NZXNzYWdlLmJpbmQodGhpcylcbiAgfVxuXG4gIF9waW5nICgpIHtcbiAgICB0aGlzLnBpbmdUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGVtaXQuY2FsbCh0aGlzLCAncGluZycpXG4gICAgICBsZXQgdGltZW91dCA9IHRoaXMucGluZ1RpbWVvdXRcbiAgICAgIGxldCB7IG1lc3NhZ2UsIHByb21pc2UgfSA9IHRoaXMuX21ha2VNZXNzYWdlKCdwaW5nJywgW10sIHRydWUsIHRpbWVvdXQpXG4gICAgICB0aGlzLl9zZW5kKG1lc3NhZ2UpLnRoZW4oKCkgPT4gcHJvbWlzZSlcbiAgICAgICAgLnRoZW4oKCkgPT4gZW1pdC5jYWxsKHRoaXMsICdwb25nJykpXG4gICAgICAgIC50aGVuKCgpID0+IHRoaXMuX3BpbmcoKSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHRoaXMuY2xvc2UoNDAwOCwgJ1BpbmcgdGltZW91dCcsIGZhbHNlKSlcbiAgICB9LCB0aGlzLnBpbmdJbnRlcnZhbClcbiAgfVxuXG4gIF9pc09wZW4gKCkge1xuICAgIHJldHVybiB0aGlzLnNvY2tldCAmJlxuICAgICAgKHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IDAgfHwgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gMSlcbiAgfVxuXG4gIF9yZWNvbm5lY3QgKCkge1xuICAgIGxldCB7IGZhY3RvciwgbWF4VGltZW91dCwgbWluVGltZW91dCwgcmFuZG9taXplLCByZXRyaWVzIH0gPSB0aGlzLnJldHJ5Q29uZmlnXG4gICAgaWYgKHRoaXMuYXR0ZW1wdCA+PSByZXRyaWVzIHx8IHRoaXMudGVybWluYXRlZCkgeyByZXR1cm4gfVxuICAgIGxldCByYW5kID0gMSArIChyYW5kb21pemUgPyBNYXRoLnJhbmRvbSgpIDogMClcbiAgICBsZXQgdGltZW91dCA9IE1hdGgubWluKHJhbmQgKiBtaW5UaW1lb3V0ICogTWF0aC5wb3coZmFjdG9yLCB0aGlzLmF0dGVtcHQpLCBtYXhUaW1lb3V0KVxuICAgIHRoaXMucmVjb25uZWN0VGltZW91dElkID0gc2V0VGltZW91dCh0aGlzLnJlY29ubmVjdC5iaW5kKHRoaXMpLCB0aW1lb3V0KVxuICAgIHRoaXMuYXR0ZW1wdCsrXG4gIH1cblxuICBfb3BlbiAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMucmVjb25uZWN0VGltZW91dElkKVxuICAgIC8qKlxuICAgICAqIFVuZGVybHlpbmcgd2Vic29ja2V0LlxuICAgICAqIEBtZW1iZXIge1dlYlNvY2tldH1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICB0aGlzLnNvY2tldCA9IG5ldyB0aGlzLldlYlNvY2tldCh0aGlzLnVybCwgdGhpcy5wcm90b2NvbHMpXG4gICAgaWYgKHRoaXMudzNjKSB7IHRoaXMuc29ja2V0LmJpbmFyeVR5cGUgPSB0aGlzLmJpbmFyeVR5cGUgfVxuICAgIHRoaXMuY29ubmVjdEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWVcbiAgICAgIHRoaXMuYXR0ZW1wdCA9IDBcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmF1dGhUaW1lb3V0SWQpXG4gICAgICB0aGlzLl9waW5nKClcbiAgICB9XG4gICAgdGhpcy5vcGVuSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMuX3NlbmQodGhpcy5hdXRoKVxuICAgICAgdGhpcy5hdXRoVGltZW91dElkID0gc2V0VGltZW91dChcbiAgICAgICAgdGhpcy5jbG9zZS5iaW5kKHRoaXMsIDQwMDgsICdBdXRoIHRpbWVvdXQnLCBmYWxzZSksXG4gICAgICAgIHRoaXMuYWNrVGltZW91dClcbiAgICAgIHRoaXMub25jZSgnY29ubmVjdCcsIHRoaXMuY29ubmVjdEhhbmRsZXIpXG4gICAgfVxuICAgIHRoaXMub25jZSgnb3BlbicsIHRoaXMub3BlbkhhbmRsZXIpXG4gICAgdGhpcy5fc2V0RXZlbnRzKClcbiAgICBpZiAodGhpcy5hdHRlbXB0ID4gMCkge1xuICAgICAgLyoqXG4gICAgICAgKiBFbWl0cyByZXRyeSBldmVudHMgd2hlbiBhdXRvIHJlY29ubmVjdGluZy5cbiAgICAgICAqIEBldmVudCBDbGllbnQjcmV0cnlcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdHRlbXB0IEF0dGVtcHQgbnVtYmVyIHN0YXJ0aW5nIGZyb20gYDBgLlxuICAgICAgICovXG4gICAgICBlbWl0LmNhbGwodGhpcywgJ3JldHJ5JywgdGhpcy5hdHRlbXB0IC0gMSlcbiAgICB9XG4gIH1cblxuICBfb25DbG9zZSAoZXYpIHtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMucGluZ1RpbWVvdXRJZClcbiAgICBjbGVhclRpbWVvdXQodGhpcy5hdXRoVGltZW91dElkKVxuICAgIGNsZWFyVGltZW91dCh0aGlzLnJlY29ubmVjdFRpbWVvdXRJZClcbiAgICB0aGlzLm9mZignY29ubmVjdCcsIHRoaXMuY29ubmVjdEhhbmRsZXIpXG4gICAgdGhpcy5vZmYoJ29wZW4nLCB0aGlzLm9wZW5IYW5kbGVyKVxuICAgIGlmIChldi5jb2RlID09PSA0MDAzIHx8ICF0aGlzLnVybCkgeyB0aGlzLnRlcm1pbmF0ZWQgPSB0cnVlIH1cbiAgICBmb3IgKGxldCBpZCBpbiB0aGlzLnBlbmRpbmdBY2tzKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHRoaXMucGVuZGluZ0Fja3MuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICAgIGxldCBhY2sgPSB0aGlzLnBlbmRpbmdBY2tzW2lkXVxuICAgICAgICBhY2suZm9yY2VOYWNrKG5ldyBDb25uZWN0aW9uRXJyb3IoaWQpKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdBY2tzID0ge31cbiAgICBpZiAoIXRoaXMudGVybWluYXRlZCAmJiB0aGlzLmF1dG9SZWNvbm5lY3QpIHsgdGhpcy5fcmVjb25uZWN0KCkgfVxuICAgIC8qKlxuICAgICAqIEVtaXRzIHczYyBvbmNsb3NlIFdlYlNvY2tldCBldmVudHMuXG4gICAgICogQGV2ZW50IENsaWVudCNjbG9zZVxuICAgICAqIEBwYXJhbSB7Q2xvc2VFdmVudH0gZGF0YSBDbG9zZSBldmVudCBkYXRhLlxuICAgICAqL1xuICAgIGVtaXQuY2FsbCh0aGlzLCAnY2xvc2UnLCBldilcbiAgfVxuXG4gIF9tYWtlTWVzc2FnZSAobmFtZSwgYXJncywgbmVlZHNBY2ssIGFja1RpbWVvdXQgPSB0aGlzLmFja1RpbWVvdXQpIHtcbiAgICBsZXQgcHJvbWlzZSwgbWVzc2FnZVxuICAgIG1lc3NhZ2UgPSB7bmFtZSwgYXJnc31cbiAgICBpZiAobmVlZHNBY2spIHtcbiAgICAgIGxldCBpZCA9IHRoaXMuY291bnRlcisrXG4gICAgICBsZXQgYWNrID0gbmV3IEFjayhpZCwgYWNrVGltZW91dCwgKCkgPT4gZGVsZXRlIHRoaXMucGVuZGluZ0Fja3NbaWRdKVxuICAgICAgdGhpcy5wZW5kaW5nQWNrc1tpZF0gPSBhY2tcbiAgICAgIHByb21pc2UgPSBhY2sucHJvbWlzZVxuICAgICAgbWVzc2FnZS5pZCA9IGlkXG4gICAgfVxuICAgIHJldHVybiB7IG1lc3NhZ2UsIHByb21pc2UgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNvY2tldCBjb25uZWN0aW9uIGlzIG9wZW4gYW5kIGNsaWVudCBoYXMgcGFzc2VkIGFuIGF1dGhcbiAgICogY2hlY2suIENsaWVudC1zaWRlIG9ubHkuXG4gICAqIEBldmVudCBDbGllbnQjY29ubmVjdFxuICAgKiBAcGFyYW0ge09iamVjdHx1bmRlZmluZWR9IGRhdGEgQXV0aCByZXBseSBkYXRhLlxuICAgKi9cbiAgX2Rpc3BhdGNoIChtZXNzYWdlKSB7XG4gICAgaWYgKG1lc3NhZ2UubmFtZSkge1xuICAgICAgaWYgKGlzQmxhY2tsaXN0ZWRFdmVudChtZXNzYWdlLm5hbWUpKSB7IHJldHVybiB9XG4gICAgICBpZiAobWVzc2FnZS5uYW1lID09PSAnY29ubmVjdCcgJiYgdGhpcy5jb25uZWN0ZWQpIHsgcmV0dXJuIH1cbiAgICAgIGlmIChtZXNzYWdlLmlkKSB7XG4gICAgICAgIGxldCBpZCA9IG1lc3NhZ2UuaWRcbiAgICAgICAgbGV0IGZuID0gZ2V0T3duUHJvcCh0aGlzLmhhbmRsZXJzLCBtZXNzYWdlLm5hbWUpXG4gICAgICAgIGlmIChmbikge1xuICAgICAgICAgIGF0dGVtcHQoKCkgPT4gZm4uYXBwbHkobnVsbCwgbWVzc2FnZS5hcmdzKSlcbiAgICAgICAgICAgIC50aGVuKChyZXN1bHQgPSBudWxsKSA9PiB0aGlzLl9zZW5kKHtpZCwgcmVzdWx0fSkpXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gdGhpcy5fc2VuZCh7aWQsIGVycm9yOiB0aGlzLmVycm9yRm9ybWF0dGVyKGVycm9yKX0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBlcnJvciA9IHRoaXMuZXJyb3JGb3JtYXR0ZXIobmV3IE5vUHJvY2VkdXJlRXJyb3IobWVzc2FnZS5uYW1lKSlcbiAgICAgICAgICB0aGlzLl9zZW5kKHtpZCwgZXJyb3J9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbWl0LmFwcGx5KHRoaXMsIGNvbmNhdChtZXNzYWdlLm5hbWUsIG1lc3NhZ2UuYXJncykpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBhY2sgPSB0aGlzLnBlbmRpbmdBY2tzW21lc3NhZ2UuaWRdXG4gICAgICBpZiAoYWNrKSB7IGFjay5zZXR0bGUobWVzc2FnZSkgfVxuICAgIH1cbiAgfVxuXG4gIF9zZW5kIChtZXNzYWdlKSB7XG4gICAgcmV0dXJuIGF0dGVtcHQoKCkgPT4gdGhpcy5lbmNvZGVyKG1lc3NhZ2UpKS50aGVuKGRhdGEgPT4ge1xuICAgICAgaWYgKHRoaXMudzNjKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvY2tldC5zZW5kKGRhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgYmluYXJ5ID0gdHlwZW9mIGRhdGEgIT09ICdzdHJpbmcnXG4gICAgICAgIHJldHVybiBmcm9tQ2FsbGJhY2soY2IgPT4gdGhpcy5zb2NrZXQuc2VuZChkYXRhLCB7YmluYXJ5fSwgY2IpKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBldmVudCwgbm8gcmVwbHkuIFVzZSB7QGxpbmsgb259IG9yIHtAbGluayBvbmNlfSBtZXRob2RzXG4gICAqIHRvIGxpc3RlbiBldmVudHMgb24gYSByZWNpcGllbnQgc2lkZS4gUmVzZXJ2ZWQgZXZlbnQgbmFtZXNcbiAgICogKF9fTVVTVCBOT1RfXyBiZSB1c2VkKTogYGNvbm5lY3RgLCBgY2xvc2VgLCBgb3BlbmAsIGBlcnJvcmAsXG4gICAqIGBwaW5nYCwgYHBvbmdgLCBgcmV0cnlgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgRXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIHsqfSBbYXJnc10gQXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fSBSZXNvbHZlcyB3aGVuIGEgZGF0YSBoYXMgYmVlbiBzZW50LlxuICAgKi9cbiAgc2VuZCAoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBsZXQgeyBtZXNzYWdlIH0gPSB0aGlzLl9tYWtlTWVzc2FnZShldmVudCwgYXJncywgZmFsc2UpXG4gICAgcmV0dXJuIHRoaXMuX3NlbmQobWVzc2FnZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgYW4gUlBDIHByb2NlZHVyZS4gVXNlIHtAbGluayBDbGllbnQjcmVnaXN0ZXJ9IG1ldGhvZCB0b1xuICAgKiBhc3NpZ24gYW4gUlBDIG1ldGhvZCBoYW5kbGVyLiBSZXNlcnZlZCBwcm9jZWR1cmUgbmFtZXMgKF9fTVVTVFxuICAgKiBOT1RfXyBiZSB1c2VkKTogYGNvbm5lY3RgLCBgY2xvc2VgLCBgb3BlbmAsIGBlcnJvcmAsIGBwaW5nYCxcbiAgICogYHBvbmdgLCBgcmV0cnlgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBQcm9jZWR1cmUgbmFtZS5cbiAgICogQHBhcmFtIHsqfSBbYXJnc10gQXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBSZXNvbHZlcyBvciByZWplY3RzIHdoZW4gYSByZXBseSBpc1xuICAgKiByZWNlaXZlZC5cbiAgICovXG4gIGludm9rZSAobmFtZSwgLi4uYXJncykge1xuICAgIGxldCB7IG1lc3NhZ2UsIHByb21pc2UgfSA9IHRoaXMuX21ha2VNZXNzYWdlKG5hbWUsIGFyZ3MsIHRydWUpXG4gICAgcmV0dXJuIHRoaXMuX3NlbmQobWVzc2FnZSkudGhlbigoKSA9PiBwcm9taXNlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFuIFJQQyBoYW5kbGVyLiBFYWNoIG5hbWUgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiBhIG9uZVxuICAgKiBoYW5kbGVyLCBzbyBpdCB0aHJvd3MgYW4gZXJyb3Igb24gYSBkdXBsaWNhdGUgaGFuZGxlclxuICAgKiByZWdpc3RyYXRpb24gYXR0ZW1wdC4gVXNlIHtAbGluayBDbGllbnQjaW52b2tlfSB0byBjYWxsIGEgbWV0aG9kLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBQcm9jZWR1cmUgbmFtZS5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlciBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIFByb21pc2UuXG4gICAqL1xuICByZWdpc3RlciAobmFtZSwgaGFuZGxlcikge1xuICAgIGlmIChnZXRPd25Qcm9wKHRoaXMuaGFuZGxlcnMsIG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHJlZ2lzdGVyIGEgZHVwbGljYXRlIFJQQyBoYW5kbGVyIGZvciAke25hbWV9YClcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVyc1tuYW1lXSA9IGhhbmRsZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbm5lY3QuIENsaWVudC1zaWRlIG9ubHkuXG4gICAqL1xuICByZWNvbm5lY3QgKCkge1xuICAgIHRoaXMudGVybWluYXRlZCA9IGZhbHNlXG4gICAgaWYgKHRoaXMuX2lzT3BlbigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2UgaWYgKHRoaXMuV2ViU29ja2V0ICYmIHRoaXMudXJsKSB7XG4gICAgICB0aGlzLl9vcGVuKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYWxmb3JtZWQgY29uZmlndXJhdGlvbiBvcHRpb25zJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGEgY2xpZW50IGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbY29kZT0xMDAwXSBDb2RlIGFzIHBlciBXZWJTb2NrZXQgc3BlYy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJdIE9wdGlvbmFsIHN0cmluZy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbdGVybWluYXRlPXRydWVdIERpc2FibGUgcmVjb25uZWN0LlxuICAgKi9cbiAgY2xvc2UgKGNvZGUgPSAxMDAwLCBzdHIsIHRlcm1pbmF0ZSA9IHRydWUpIHtcbiAgICBpZiAoIXRoaXMudGVybWluYXRlZCkge1xuICAgICAgdGhpcy50ZXJtaW5hdGVkID0gdGVybWluYXRlXG4gICAgICBpZiAodGhpcy5faXNPcGVuKCkpIHsgdGhpcy5zb2NrZXQuY2xvc2UoY29kZSwgc3RyKSB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBDbGllbnQjc2VuZH0uXG4gKiBAbWV0aG9kXG4gKiBAbmFtZSBDbGllbnQjZW1pdFxuICovXG5DbGllbnQucHJvdG90eXBlLmVtaXQgPSBDbGllbnQucHJvdG90eXBlLnNlbmRcblxuQ2xpZW50LkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvclxuQ2xpZW50Lk5vUHJvY2VkdXJlRXJyb3IgPSBOb1Byb2NlZHVyZUVycm9yXG5DbGllbnQuVGltZW91dEVycm9yID0gVGltZW91dEVycm9yXG5cbm1vZHVsZS5leHBvcnRzID0gQ2xpZW50XG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9DbGllbnQuanMiXSwibmFtZXMiOlsiRXZlbnRFbWl0dGVyIiwicmVxdWlyZSIsImFzc2lnbiIsImF0dGVtcHQiLCJmcm9tQ2FsbGJhY2siLCJQcm9taXNlIiwiYmxhY2tsaXN0IiwiY29uY2F0IiwiYmluZCIsImVtaXQiLCJwcm90b3R5cGUiLCJpc0JsYWNrbGlzdGVkRXZlbnQiLCJuYW1lIiwiaW5kZXhPZiIsImdldE93blByb3AiLCJvYmoiLCJoYXNPd25Qcm9wZXJ0eSIsInVuZGVmaW5lZCIsIkNvbm5lY3Rpb25FcnJvciIsImlkIiwiT2JqZWN0IiwiY3JlYXRlIiwiRXJyb3IiLCJUaW1lb3V0RXJyb3IiLCJOb1Byb2NlZHVyZUVycm9yIiwicHJvY2VkdXJlIiwidmFsaWRhdGVJZCIsInZhbGlkYXRlIiwibWVzc2FnZSIsInBhc3NlZCIsImFyZ3MiLCJBcnJheSIsIm5wcm9wcyIsImtleXMiLCJsZW5ndGgiLCJBY2siLCJ0aW1lb3V0IiwiY2IiLCJwcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNldFRpbWVvdXQiLCJmb3JjZU5hY2siLCJlcnJvciIsImNsZWFyVGltZW91dCIsInJlc3VsdCIsInJldHJ5Q29uZmlnIiwiZmFjdG9yIiwibWF4VGltZW91dCIsIkluZmluaXR5IiwibWluVGltZW91dCIsInJhbmRvbWl6ZSIsInJldHJpZXMiLCJkZWZhdWx0cyIsImFja1RpbWVvdXQiLCJhdXRoIiwiYXV0b1JlY29ubmVjdCIsImF1dG9SZWNvbm5lY3RPcHRpb25zIiwiYmluYXJ5VHlwZSIsImRlY29kZXIiLCJKU09OIiwicGFyc2UiLCJlbmNvZGVyIiwic3RyaW5naWZ5IiwiZXJyb3JGb3JtYXR0ZXIiLCJTdHJpbmciLCJwaW5nSW50ZXJ2YWwiLCJwaW5nVGltZW91dCIsInByb3RvY29scyIsInJlY2VpdmVIb29rIiwic2tpcFZhbGlkYXRpb24iLCJXZWJTb2NrZXQiLCJ3M2MiLCJDbGllbnQiLCJ1cmwiLCJvcHRpb25zIiwiY29ubmVjdGVkIiwiY291bnRlciIsImRhdGEiLCJoYW5kbGVycyIsInBlbmRpbmdBY2tzIiwidGVybWluYXRlZCIsInJlZ2lzdGVyIiwicmVjb25uZWN0IiwidGhlbiIsIm1zZyIsIl9kaXNwYXRjaCIsImNhdGNoIiwic2VuZCIsInNvY2tldCIsIm9ub3BlbiIsIm9uZXJyb3IiLCJvbmNsb3NlIiwiX29uQ2xvc2UiLCJvbm1lc3NhZ2UiLCJfb25NZXNzYWdlIiwicGluZ1RpbWVvdXRJZCIsImNhbGwiLCJfbWFrZU1lc3NhZ2UiLCJfc2VuZCIsIl9waW5nIiwiY2xvc2UiLCJyZWFkeVN0YXRlIiwicmFuZCIsIk1hdGgiLCJyYW5kb20iLCJtaW4iLCJwb3ciLCJyZWNvbm5lY3RUaW1lb3V0SWQiLCJjb25uZWN0SGFuZGxlciIsImF1dGhUaW1lb3V0SWQiLCJvcGVuSGFuZGxlciIsIm9uY2UiLCJfc2V0RXZlbnRzIiwiZXYiLCJvZmYiLCJjb2RlIiwiYWNrIiwiX3JlY29ubmVjdCIsIm5lZWRzQWNrIiwiZm4iLCJhcHBseSIsInNldHRsZSIsImJpbmFyeSIsImV2ZW50IiwiaGFuZGxlciIsIl9pc09wZW4iLCJfb3BlbiIsInN0ciIsInRlcm1pbmF0ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7QUFHQSxJQUFNQSxlQUFlQyxRQUFRLGVBQVIsQ0FBckI7O2VBQ21EQSxRQUFRLFNBQVIsQzs7SUFBM0NDLE0sWUFBQUEsTTtJQUFRQyxPLFlBQUFBLE87SUFBU0MsWSxZQUFBQSxZO0lBQWNDLE8sWUFBQUEsTzs7O0FBRXZDLElBQU1DLFlBQVksQ0FBRSxPQUFGLEVBQVcsTUFBWCxFQUFtQixPQUFuQixFQUE0QixNQUE1QixFQUFvQyxPQUFwQyxDQUFsQjs7QUFJQSxJQUFNQyxTQUFTLEdBQUdBLE1BQUgsQ0FBVUMsSUFBVixDQUFlLEVBQWYsQ0FBZjs7QUFFQSxJQUFNQyxPQUFPVCxhQUFhVSxTQUFiLENBQXVCRCxJQUFwQzs7QUFFQSxTQUFTRSxrQkFBVCxDQUE2QkMsSUFB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L0QsU0FBUCxDQUFpQjhFLElBQXpDOztBQUVBZixPQUFPdkQsZUFBUCxHQUF5QkEsZUFBekI7QUFDQXVELE9BQU9qRCxnQkFBUCxHQUEwQkEsZ0JBQTFCO0FBQ0FpRCxPQUFPbEQsWUFBUCxHQUFzQkEsWUFBdEI7O0FBRUEyRyxPQUFPQyxPQUFQLEdBQWlCMUQsTUFBakIiLCJmaWxlIjoiQ2xpZW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG4vKiBnbG9iYWwgV2ViU29ja2V0ICovXG5cbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50ZW1pdHRlcjMnKVxuY29uc3QgeyBhc3NpZ24sIGF0dGVtcHQsIGZyb21DYWxsYmFjaywgUHJvbWlzZSB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5cbmNvbnN0IGJsYWNrbGlzdCA9IFsgJ2Nsb3NlJywgJ29wZW4nLCAnZXJyb3InLCAncG9uZycsICdyZXRyeScgXVxuXG4vLyB1dGlsc1xuXG5jb25zdCBjb25jYXQgPSBbXS5jb25jYXQuYmluZChbXSlcblxuY29uc3QgZW1pdCA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdFxuXG5mdW5jdGlvbiBpc0JsYWNrbGlzdGVkRXZlbnQgKG5hbWUpIHtcbiAgcmV0dXJuIGJsYWNrbGlzdC5pbmRleE9mKG5hbWUpID49IDBcbn1cblxuZnVuY3Rpb24gZ2V0T3duUHJvcCAob2JqLCBuYW1lKSB7XG4gIHJldHVybiBvYmouaGFzT3duUHJvcGVydHkobmFtZSkgPyBvYmpbbmFtZV0gOiB1bmRlZmluZWRcbn1cblxuLy8gZXJyb3JzXG5cbmZ1bmN0aW9uIENvbm5lY3Rpb25FcnJvciAoaWQpIHtcbiAgdGhpcy5uYW1lID0gJ0Nvbm5lY3Rpb25FcnJvcidcbiAgdGhpcy5pZCA9IGlkXG59XG5cbkNvbm5lY3Rpb25FcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSlcblxuZnVuY3Rpb24gVGltZW91dEVycm9yIChpZCkge1xuICB0aGlzLm5hbWUgPSAnVGltZW91dEVycm9yJ1xuICB0aGlzLmlkID0gaWRcbn1cblxuVGltZW91dEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKVxuXG5mdW5jdGlvbiBOb1Byb2NlZHVyZUVycm9yIChwcm9jZWR1cmUpIHtcbiAgdGhpcy5uYW1lID0gJ05vUHJvY2VkdXJlRXJyb3InXG4gIHRoaXMucHJvY2VkdXJlID0gcHJvY2VkdXJlXG59XG5cbk5vUHJvY2VkdXJlRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpXG5cbi8vIHZhbGlkYXRpb25cblxuZnVuY3Rpb24gdmFsaWRhdGVJZCAoaWQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpZCA9PT0gJ251bWJlcicgJiYgKGlkICUgMSkgPT09IDAgJiYgaWQgPiAwXG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlIChtZXNzYWdlKSB7XG4gIGxldCBwYXNzZWQgPSBmYWxzZVxuICBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIGlmIChtZXNzYWdlLm5hbWUpIHsgLy8gbWVzc2FnZVxuICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlLm5hbWUgPT09ICdzdHJpbmcnICYmIG1lc3NhZ2UuYXJncyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGxldCBucHJvcHMgPSBPYmplY3Qua2V5cyhtZXNzYWdlKS5sZW5ndGhcbiAgICAgICAgaWYgKG5wcm9wcyA9PT0gMiB8fCAobnByb3BzID09PSAzICYmIHZhbGlkYXRlSWQobWVzc2FnZS5pZCkpKSB7XG4gICAgICAgICAgcGFzc2VkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHsgLy8gYWNrIG1lc3NhZ2VcbiAgICAgIGxldCBucHJvcHMgPSBPYmplY3Qua2V5cyhtZXNzYWdlKS5sZW5ndGhcbiAgICAgIGlmIChucHJvcHMgPT09IDIgJiYgdmFsaWRhdGVJZChtZXNzYWdlLmlkKSkge1xuICAgICAgICBpZiAobWVzc2FnZS5oYXNPd25Qcm9wZXJ0eSgnZXJyb3InKSB8fCBtZXNzYWdlLmhhc093blByb3BlcnR5KCdyZXN1bHQnKSkge1xuICAgICAgICAgIHBhc3NlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoIXBhc3NlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVmFsaWRhdGlvbiBlcnJvcicpXG4gIH1cbn1cblxuLy8gYWNrXG5cbmNsYXNzIEFjayB7XG4gIGNvbnN0cnVjdG9yIChpZCwgdGltZW91dCwgY2IpIHtcbiAgICB0aGlzLmlkID0gaWRcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlXG4gICAgICB0aGlzLnJlamVjdCA9IHJlamVjdFxuICAgIH0pXG4gICAgdGhpcy5jYiA9IGNiXG4gICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvcmNlTmFjayhuZXcgVGltZW91dEVycm9yKGlkKSksIHRpbWVvdXQpXG4gIH1cblxuICBmb3JjZU5hY2sgKGVycm9yKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dClcbiAgICB0aGlzLmNiKClcbiAgICB0aGlzLnJlamVjdChlcnJvcilcbiAgfVxuXG4gIHNldHRsZSAobWVzc2FnZSkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpXG4gICAgdGhpcy5jYigpXG4gICAgaWYgKG1lc3NhZ2UuaGFzT3duUHJvcGVydHkoJ2Vycm9yJykpIHtcbiAgICAgIHRoaXMucmVqZWN0KG1lc3NhZ2UuZXJyb3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzb2x2ZShtZXNzYWdlLnJlc3VsdClcbiAgICB9XG4gIH1cbn1cblxuLy8gY2xpZW50XG5cbi8qKlxuICogR2VuZXJhbCBmb3JtYXQgZm9yIGFsbCBkYXRhIHRoYXQgaXMgc2VudCBvciByZWNlaXZlZCBvdmVyIGFcbiAqIHdlYnNvY2tldC5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDbGllbnQuTWVzc2FnZVxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaWRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdXG4gKiBAcHJvcGVydHkge0FycmF5fSBbYXJnc11cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbcmVzdWx0XVxuICogQHByb3BlcnR5IHtPYmplY3R9IFtlcnJvcl1cbiAqL1xuXG4vKipcbiAqIE1lc3NhZ2VzIGRlY29kZXIuIE1heSBhbHNvIHJldHVybiBwcm9taXNlcyBmb3IgYW4gYXN5bmNocm9ub3VzXG4gKiBleGVjdXRpb24uXG4gKlxuICogQGNhbGxiYWNrIENsaWVudC5FbmNvZGVyXG4gKiBAcGFyYW0ge0NsaWVudC5NZXNzYWdlfSBtZXNzYWdlIE1lc3NhZ2UuXG4gKiBAcmV0dXJuIHtQcm9taXNlPE9iamVjdD58T2JqZWN0fSBEYXRhIHRvIHNlbmQuXG4gKi9cblxuLyoqXG4gKiBNZXNzYWdlcyBlbmNvZGVyLiBNYXkgYWxzbyByZXR1cm4gcHJvbWlzZXMgZm9yIGFuIGFzeW5jaHJvbm91c1xuICogZXhlY3V0aW9uLlxuICpcbiAqIEBjYWxsYmFjayBDbGllbnQuRGVjb2RlclxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgUmVjZWl2ZWQgZGF0YS5cbiAqIEByZXR1cm4ge1Byb21pc2U8Q2xpZW50Lk1lc3NhZ2U+fENsaWVudC5NZXNzYWdlfSBNZXNzYWdlLlxuICovXG5cbi8qKlxuICogUmVjZWl2ZSBob29rIGlzIHJ1biB3aGVuIGEgY2xpZW50IHJlY2VpdmVzIGEgdmFsaWQgbWVzc2FnZSB2aWEgYVxuICogd2Vic29ja2V0LiBNYXkgYWxzbyByZXR1cm4gcHJvbWlzZXMgZm9yIGFuIGFzeW5jaHJvbm91cyBleGVjdXRpb24uXG4gKlxuICogQGNhbGxiYWNrIENsaWVudC5SZWNlaXZlSG9va1xuICogQHBhcmFtIHtDbGllbnQuTWVzc2FnZX0gbWVzc2FnZSBNZXNzYWdlLlxuICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fHVuZGVmaW5lZH0gUHJvbWlzZSwgaWYgaXQgaXMgcmVqZWN0ZWQgbm9cbiAqIGhhbmRsZXJzIHdpbGwgYmUgY2FsbGVkLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2xpZW50LlJldHJ5Q29uZmlnXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtmYWN0b3I9Ml1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4VGltZW91dD1JbmZpbml0eV1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWluVGltZW91dD0xMDAwXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbcmFuZG9taXplPXRydWVdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3JldHJpZXM9MTBdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDbGllbnQuU29ja2V0T3B0aW9uc1xuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbYWNrVGltZW91dD0yMDAwMF0gUmVzdWx0IHdhaXQgdGltZW91dCBmb3JcbiAqIHtAbGluayBDbGllbnQjaW52b2tlfSBpbiBtcy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbYXV0aD17fV0gQXV0aCBkYXRhLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbYXV0b1JlY29ubmVjdD10cnVlXSBFbmFibGUgYXV0byByZWNvbm5lY3QuXG4gKiBAcHJvcGVydHkge0NsaWVudC5SZXRyeUNvbmZpZ30gW2F1dG9SZWNvbm5lY3RPcHRpb25zXSBBdXRvXG4gKiByZWNvbm5lY3QgY29uZmlnLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtiaW5hcnlUeXBlPSdhcnJheWJ1ZmZlciddIFczQyBXZWJTb2NrZXRcbiAqIGJpbmFyeSBkYXRhIHR5cGUuXG4gKiBAcHJvcGVydHkge0NsaWVudC5EZWNvZGVyfSBbZGVjb2Rlcj1KU09OLnBhcnNlXSBNZXNzYWdlcyBkZWNvZGVyLlxuICogQHByb3BlcnR5IHtDbGllbnQuRW5jb2Rlcn0gW2VuY29kZXI9SlNPTi5zdHJpbmdpZnldIE1lc3NhZ2VzXG4gKiBlbmNvZGVyLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gW2Vycm9yRm9ybWF0dGVyPVN0cmluZ10gQ29udmVydGVyIGZvciBKU1xuICogZXJyb3JzIHRvIHNvbWUgbmV0d29yayBmb3JtYXQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BpbmdJbnRlcnZhbD0xMDAwMF0gUGluZyBpbnRlcnZhbCBpbiBtcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcGluZ1RpbWVvdXQ9NTAwMF0gUGluZyB0aW1lb3V0IGluIG1zLlxuICogQHByb3BlcnR5IHtzdHJpbmd8QXJyYXk8c3RyaW5nPn0gW3Byb3RvY29scz0nd3MtbWVzc2FnaW5nJ11cbiAqIFdlYlNvY2tldCBwcm90b2NvbHMuXG4gKiBAcHJvcGVydHkge0NsaWVudC5SZWNlaXZlSG9va30gW3JlY2VpdmVIb29rXSBSZWNlaXZlIGhvb2suXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtza2lwVmFsaWRhdGlvbj1mYWxzZV0gU2tpcHMgYnVpbGQtaW5cbiAqIG1lc3NhZ2VzIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge09iamVjdH0gW1dlYlNvY2tldD11bmRlZmluZWRdIEFsdGVybmF0aXZlIHdlYnNvY2tldFxuICogY29uc3RydWN0b3IsIGlmIGl0IGlzIHVuZGVmaW5lZCB0aGVuIGEgZ2xvYmFsIFdlYlNvY2tldCBpcyB1c2VkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdzNjPXVuZGVmaW5lZF0gSWYgV2ViU29ja2V0IGlzIHVzaW5nIGEgdzNjXG4gKiBzZW5kIEFQSSwgb3IgYSB3cyBvbmUgKGZyb20gTm9kZS5qcyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gd2l0aCBhXG4gKiBjYWxsYmFjaykuIEJ5IGRlZmF1bHQgaWYgYSBnbG9iYWwgdmFsdWUgaXMgdXNlZCwgdGhlbiBpdCBpcyBgdHJ1ZWBcbiAqIGFuZCBgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmNvbnN0IHJldHJ5Q29uZmlnID0ge1xuICBmYWN0b3I6IDIsXG4gIG1heFRpbWVvdXQ6IEluZmluaXR5LFxuICBtaW5UaW1lb3V0OiAxMDAwLFxuICByYW5kb21pemU6IHRydWUsXG4gIHJldHJpZXM6IDEwXG59XG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuICBhY2tUaW1lb3V0OiAyMDAwMCxcbiAgYXV0aDoge30sXG4gIGF1dG9SZWNvbm5lY3Q6IHRydWUsXG4gIGF1dG9SZWNvbm5lY3RPcHRpb25zOiByZXRyeUNvbmZpZyxcbiAgYmluYXJ5VHlwZTogJ2FycmF5YnVmZmVyJyxcbiAgZGVjb2RlcjogSlNPTi5wYXJzZSxcbiAgZW5jb2RlcjogSlNPTi5zdHJpbmdpZnksXG4gIGVycm9yRm9ybWF0dGVyOiBTdHJpbmcsXG4gIHBpbmdJbnRlcnZhbDogMTAwMDAsXG4gIHBpbmdUaW1lb3V0OiA1MDAwLFxuICBwcm90b2NvbHM6ICd3cy1tZXNzYWdpbmcnLFxuICByZWNlaXZlSG9vazogbnVsbCxcbiAgc2tpcFZhbGlkYXRpb246IGZhbHNlLFxuICBXZWJTb2NrZXQ6IHVuZGVmaW5lZCxcbiAgdzNjOiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBAZXh0ZW5kcyBFdmVudEVtaXR0ZXJcbiAqXG4gKiBAZW1pdHMgQ2xpZW50I2Nsb3NlXG4gKiBAZW1pdHMgQ2xpZW50I29wZW5cbiAqIEBlbWl0cyBDbGllbnQjZXJyb3JcbiAqIEBlbWl0cyBDbGllbnQjY29ubmVjdFxuICovXG5jbGFzcyBDbGllbnQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGNsaWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBXZWJTb2NrZXQgY29ubmVjdGlvbiB1cmwuXG4gICAqIEBwYXJhbSB7Q2xpZW50LlNvY2tldE9wdGlvbnN9IFtvcHRpb25zXSBTb2NrZXQgb3B0aW9ucy5cbiAgICovXG4gIGNvbnN0cnVjdG9yICh1cmwsIG9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLnVybCA9IHVybFxuICAgIC8qKlxuICAgICAqIENsaWVudCBpZC4gU2VydmVyLXNpZGUgb25seS5cbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgdGhpcy5pZFxuICAgIGFzc2lnbih0aGlzLCBkZWZhdWx0cywgb3B0aW9ucylcbiAgICB0aGlzLnJldHJ5Q29uZmlnID0ge31cbiAgICBhc3NpZ24odGhpcy5yZXRyeUNvbmZpZywgcmV0cnlDb25maWcsIG9wdGlvbnMuYXV0b1JlY29ubmVjdE9wdGlvbnMpXG4gICAgaWYgKCF0aGlzLldlYlNvY2tldCkge1xuICAgICAgdGhpcy5XZWJTb2NrZXQgPSBXZWJTb2NrZXRcbiAgICAgIHRoaXMudzNjID0gdGhpcy53M2MgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB0aGlzLnczY1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0cnVlLCB0aGVuIGEgY2xpZW50IGlzIGNvbm5lY3RlZC5cbiAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2VcbiAgICB0aGlzLmNvdW50ZXIgPSAxXG4gICAgdGhpcy5kYXRhID0ge31cbiAgICB0aGlzLmhhbmRsZXJzID0ge31cbiAgICB0aGlzLnBlbmRpbmdBY2tzID0ge31cbiAgICB0aGlzLmF0dGVtcHQgPSAwXG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSwgdGhlbiBhIGNsaWVudCB3YXMgY2xvc2VkIHZpYSBhIGNsb3NlIG1ldGhvZCBvciBhbiBhdXRoXG4gICAgICogZXJyb3Igb2NjdXJyZWQuXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICB0aGlzLnRlcm1pbmF0ZWQgPSBmYWxzZVxuICAgIHRoaXMucmVnaXN0ZXIoJ3BpbmcnLCAoKSA9PiBQcm9taXNlLnJlc29sdmUoKSlcbiAgICB0aGlzLnJlY29ubmVjdCgpXG4gIH1cblxuICBfb25NZXNzYWdlIChkYXRhKSB7XG4gICAgbGV0IG1lc3NhZ2VcbiAgICBhdHRlbXB0KCgpID0+IHRoaXMuZGVjb2RlcihkYXRhLmRhdGEpKVxuICAgICAgLnRoZW4obXNnID0+IHsgbWVzc2FnZSA9IG1zZyB9KVxuICAgICAgLnRoZW4oKCkgPT4geyBpZiAoIXRoaXMuc2tpcFZhbGlkYXRpb24pIHsgdmFsaWRhdGUobWVzc2FnZSkgfSB9KVxuICAgICAgLnRoZW4oKCkgPT4geyBpZiAodGhpcy5yZWNlaXZlSG9vaykgeyB0aGlzLnJlY2VpdmVIb29rKG1lc3NhZ2UpIH0gfSlcbiAgICAgIC50aGVuKCgpID0+IHRoaXMuX2Rpc3BhdGNoKG1lc3NhZ2UpKVxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgb3RoZXIgc2lkZSBmYWlsZWQgdG8gZGVjb2RlIG9yIHZhbGlkYXRlIGFcbiAgICAgKiB3ZWJzb2NrZXQgbWVzc2FnZSwgbmFtZWx5IGFuIGVycm9yIGlzIG9jY3VycmVkIGluc2lkZSBlaXRoZXJcbiAgICAgKiBgZGVjb2RlcmAgb3IgYHJlY2VpdmVIb29rYC5cbiAgICAgKiBAZXZlbnQgQ2xpZW50I3ByZXByb2Nlc3NpbmdFcnJvclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlcnJvciBDb252ZXJ0ZWQgZXJyb3IuXG4gICAgICovXG4gICAgICAuY2F0Y2goZXJyb3IgPT4gdGhpcy5zZW5kKCdwcmVwcm9jZXNzaW5nRXJyb3InLCB0aGlzLmVycm9yRm9ybWF0dGVyKGVycm9yKSkpXG4gIH1cblxuICBfc2V0RXZlbnRzICgpIHtcbiAgICAvKipcbiAgICAgKiBFbWl0cyB3M2Mgb25vcGVuIFdlYlNvY2tldCBldmVudHMuXG4gICAgICogQGV2ZW50IENsaWVudCNvcGVuXG4gICAgICovXG4gICAgdGhpcy5zb2NrZXQub25vcGVuID0gZW1pdC5iaW5kKHRoaXMsICdvcGVuJylcbiAgICAvKipcbiAgICAgKiBFbWl0cyB3M2Mgb25lcnJvciBXZWJTb2NrZXQgZXZlbnRzLiBEb2VzIG5vdCB0aHJvdyBpZiB0aGVyZSBhcmVcbiAgICAgKiBubyBsaXN0ZW5lcnMuXG4gICAgICogQGV2ZW50IENsaWVudCNlcnJvclxuICAgICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIEVycm9yLlxuICAgICAqL1xuICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSBlbWl0LmJpbmQodGhpcywgJ2Vycm9yJylcbiAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gdGhpcy5fb25DbG9zZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fb25NZXNzYWdlLmJpbmQodGhpcylcbiAgfVxuXG4gIF9waW5nICgpIHtcbiAgICB0aGlzLnBpbmdUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGVtaXQuY2FsbCh0aGlzLCAncGluZycpXG4gICAgICBsZXQgdGltZW91dCA9IHRoaXMucGluZ1RpbWVvdXRcbiAgICAgIGxldCB7IG1lc3NhZ2UsIHByb21pc2UgfSA9IHRoaXMuX21ha2VNZXNzYWdlKCdwaW5nJywgW10sIHRydWUsIHRpbWVvdXQpXG4gICAgICB0aGlzLl9zZW5kKG1lc3NhZ2UpLnRoZW4oKCkgPT4gcHJvbWlzZSlcbiAgICAgICAgLnRoZW4oKCkgPT4gZW1pdC5jYWxsKHRoaXMsICdwb25nJykpXG4gICAgICAgIC50aGVuKCgpID0+IHRoaXMuX3BpbmcoKSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHRoaXMuY2xvc2UoNDAwOCwgJ1BpbmcgdGltZW91dCcsIGZhbHNlKSlcbiAgICB9LCB0aGlzLnBpbmdJbnRlcnZhbClcbiAgfVxuXG4gIF9pc09wZW4gKCkge1xuICAgIHJldHVybiB0aGlzLnNvY2tldCAmJlxuICAgICAgKHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IDAgfHwgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gMSlcbiAgfVxuXG4gIF9yZWNvbm5lY3QgKCkge1xuICAgIGxldCB7IGZhY3RvciwgbWF4VGltZW91dCwgbWluVGltZW91dCwgcmFuZG9taXplLCByZXRyaWVzIH0gPSB0aGlzLnJldHJ5Q29uZmlnXG4gICAgaWYgKHRoaXMuYXR0ZW1wdCA+PSByZXRyaWVzIHx8IHRoaXMudGVybWluYXRlZCkgeyByZXR1cm4gfVxuICAgIGxldCByYW5kID0gMSArIChyYW5kb21pemUgPyBNYXRoLnJhbmRvbSgpIDogMClcbiAgICBsZXQgdGltZW91dCA9IE1hdGgubWluKHJhbmQgKiBtaW5UaW1lb3V0ICogTWF0aC5wb3coZmFjdG9yLCB0aGlzLmF0dGVtcHQpLCBtYXhUaW1lb3V0KVxuICAgIHRoaXMucmVjb25uZWN0VGltZW91dElkID0gc2V0VGltZW91dCh0aGlzLnJlY29ubmVjdC5iaW5kKHRoaXMpLCB0aW1lb3V0KVxuICAgIHRoaXMuYXR0ZW1wdCsrXG4gIH1cblxuICBfb3BlbiAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMucmVjb25uZWN0VGltZW91dElkKVxuICAgIC8qKlxuICAgICAqIFVuZGVybHlpbmcgd2Vic29ja2V0LlxuICAgICAqIEBtZW1iZXIge1dlYlNvY2tldH1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICB0aGlzLnNvY2tldCA9IG5ldyB0aGlzLldlYlNvY2tldCh0aGlzLnVybCwgdGhpcy5wcm90b2NvbHMpXG4gICAgaWYgKHRoaXMudzNjKSB7IHRoaXMuc29ja2V0LmJpbmFyeVR5cGUgPSB0aGlzLmJpbmFyeVR5cGUgfVxuICAgIHRoaXMuY29ubmVjdEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWVcbiAgICAgIHRoaXMuYXR0ZW1wdCA9IDBcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmF1dGhUaW1lb3V0SWQpXG4gICAgICB0aGlzLl9waW5nKClcbiAgICB9XG4gICAgdGhpcy5vcGVuSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMuX3NlbmQodGhpcy5hdXRoKVxuICAgICAgdGhpcy5hdXRoVGltZW91dElkID0gc2V0VGltZW91dChcbiAgICAgICAgdGhpcy5jbG9zZS5iaW5kKHRoaXMsIDQwMDgsICdBdXRoIHRpbWVvdXQnLCBmYWxzZSksXG4gICAgICAgIHRoaXMuYWNrVGltZW91dClcbiAgICAgIHRoaXMub25jZSgnY29ubmVjdCcsIHRoaXMuY29ubmVjdEhhbmRsZXIpXG4gICAgfVxuICAgIHRoaXMub25jZSgnb3BlbicsIHRoaXMub3BlbkhhbmRsZXIpXG4gICAgdGhpcy5fc2V0RXZlbnRzKClcbiAgICBpZiAodGhpcy5hdHRlbXB0ID4gMCkge1xuICAgICAgLyoqXG4gICAgICAgKiBFbWl0cyByZXRyeSBldmVudHMgd2hlbiBhdXRvIHJlY29ubmVjdGluZy5cbiAgICAgICAqIEBldmVudCBDbGllbnQjcmV0cnlcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdHRlbXB0IEF0dGVtcHQgbnVtYmVyIHN0YXJ0aW5nIGZyb20gYDBgLlxuICAgICAgICovXG4gICAgICBlbWl0LmNhbGwodGhpcywgJ3JldHJ5JywgdGhpcy5hdHRlbXB0IC0gMSlcbiAgICB9XG4gIH1cblxuICBfb25DbG9zZSAoZXYpIHtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMucGluZ1RpbWVvdXRJZClcbiAgICBjbGVhclRpbWVvdXQodGhpcy5hdXRoVGltZW91dElkKVxuICAgIGNsZWFyVGltZW91dCh0aGlzLnJlY29ubmVjdFRpbWVvdXRJZClcbiAgICB0aGlzLm9mZignY29ubmVjdCcsIHRoaXMuY29ubmVjdEhhbmRsZXIpXG4gICAgdGhpcy5vZmYoJ29wZW4nLCB0aGlzLm9wZW5IYW5kbGVyKVxuICAgIGlmIChldi5jb2RlID09PSA0MDAzIHx8ICF0aGlzLnVybCkgeyB0aGlzLnRlcm1pbmF0ZWQgPSB0cnVlIH1cbiAgICBmb3IgKGxldCBpZCBpbiB0aGlzLnBlbmRpbmdBY2tzKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHRoaXMucGVuZGluZ0Fja3MuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICAgIGxldCBhY2sgPSB0aGlzLnBlbmRpbmdBY2tzW2lkXVxuICAgICAgICBhY2suZm9yY2VOYWNrKG5ldyBDb25uZWN0aW9uRXJyb3IoaWQpKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdBY2tzID0ge31cbiAgICBpZiAoIXRoaXMudGVybWluYXRlZCAmJiB0aGlzLmF1dG9SZWNvbm5lY3QpIHsgdGhpcy5fcmVjb25uZWN0KCkgfVxuICAgIC8qKlxuICAgICAqIEVtaXRzIHczYyBvbmNsb3NlIFdlYlNvY2tldCBldmVudHMuXG4gICAgICogQGV2ZW50IENsaWVudCNjbG9zZVxuICAgICAqIEBwYXJhbSB7Q2xvc2VFdmVudH0gZGF0YSBDbG9zZSBldmVudCBkYXRhLlxuICAgICAqL1xuICAgIGVtaXQuY2FsbCh0aGlzLCAnY2xvc2UnLCBldilcbiAgfVxuXG4gIF9tYWtlTWVzc2FnZSAobmFtZSwgYXJncywgbmVlZHNBY2ssIGFja1RpbWVvdXQgPSB0aGlzLmFja1RpbWVvdXQpIHtcbiAgICBsZXQgcHJvbWlzZSwgbWVzc2FnZVxuICAgIG1lc3NhZ2UgPSB7bmFtZSwgYXJnc31cbiAgICBpZiAobmVlZHNBY2spIHtcbiAgICAgIGxldCBpZCA9IHRoaXMuY291bnRlcisrXG4gICAgICBsZXQgYWNrID0gbmV3IEFjayhpZCwgYWNrVGltZW91dCwgKCkgPT4gZGVsZXRlIHRoaXMucGVuZGluZ0Fja3NbaWRdKVxuICAgICAgdGhpcy5wZW5kaW5nQWNrc1tpZF0gPSBhY2tcbiAgICAgIHByb21pc2UgPSBhY2sucHJvbWlzZVxuICAgICAgbWVzc2FnZS5pZCA9IGlkXG4gICAgfVxuICAgIHJldHVybiB7IG1lc3NhZ2UsIHByb21pc2UgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNvY2tldCBjb25uZWN0aW9uIGlzIG9wZW4gYW5kIGNsaWVudCBoYXMgcGFzc2VkIGFuIGF1dGhcbiAgICogY2hlY2suIENsaWVudC1zaWRlIG9ubHkuXG4gICAqIEBldmVudCBDbGllbnQjY29ubmVjdFxuICAgKiBAcGFyYW0ge09iamVjdHx1bmRlZmluZWR9IGRhdGEgQXV0aCByZXBseSBkYXRhLlxuICAgKi9cbiAgX2Rpc3BhdGNoIChtZXNzYWdlKSB7XG4gICAgaWYgKG1lc3NhZ2UubmFtZSkge1xuICAgICAgaWYgKGlzQmxhY2tsaXN0ZWRFdmVudChtZXNzYWdlLm5hbWUpKSB7IHJldHVybiB9XG4gICAgICBpZiAobWVzc2FnZS5uYW1lID09PSAnY29ubmVjdCcgJiYgdGhpcy5jb25uZWN0ZWQpIHsgcmV0dXJuIH1cbiAgICAgIGlmIChtZXNzYWdlLmlkKSB7XG4gICAgICAgIGxldCBpZCA9IG1lc3NhZ2UuaWRcbiAgICAgICAgbGV0IGZuID0gZ2V0T3duUHJvcCh0aGlzLmhhbmRsZXJzLCBtZXNzYWdlLm5hbWUpXG4gICAgICAgIGlmIChmbikge1xuICAgICAgICAgIGF0dGVtcHQoKCkgPT4gZm4uYXBwbHkobnVsbCwgbWVzc2FnZS5hcmdzKSlcbiAgICAgICAgICAgIC50aGVuKChyZXN1bHQgPSBudWxsKSA9PiB0aGlzLl9zZW5kKHtpZCwgcmVzdWx0fSkpXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gdGhpcy5fc2VuZCh7aWQsIGVycm9yOiB0aGlzLmVycm9yRm9ybWF0dGVyKGVycm9yKX0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBlcnJvciA9IHRoaXMuZXJyb3JGb3JtYXR0ZXIobmV3IE5vUHJvY2VkdXJlRXJyb3IobWVzc2FnZS5uYW1lKSlcbiAgICAgICAgICB0aGlzLl9zZW5kKHtpZCwgZXJyb3J9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbWl0LmFwcGx5KHRoaXMsIGNvbmNhdChtZXNzYWdlLm5hbWUsIG1lc3NhZ2UuYXJncykpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBhY2sgPSB0aGlzLnBlbmRpbmdBY2tzW21lc3NhZ2UuaWRdXG4gICAgICBpZiAoYWNrKSB7IGFjay5zZXR0bGUobWVzc2FnZSkgfVxuICAgIH1cbiAgfVxuXG4gIF9zZW5kIChtZXNzYWdlKSB7XG4gICAgcmV0dXJuIGF0dGVtcHQoKCkgPT4gdGhpcy5lbmNvZGVyKG1lc3NhZ2UpKS50aGVuKGRhdGEgPT4ge1xuICAgICAgaWYgKHRoaXMudzNjKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvY2tldC5zZW5kKGRhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgYmluYXJ5ID0gdHlwZW9mIGRhdGEgIT09ICdzdHJpbmcnXG4gICAgICAgIHJldHVybiBmcm9tQ2FsbGJhY2soY2IgPT4gdGhpcy5zb2NrZXQuc2VuZChkYXRhLCB7YmluYXJ5fSwgY2IpKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBldmVudCwgbm8gcmVwbHkuIFVzZSB7QGxpbmsgb259IG9yIHtAbGluayBvbmNlfSBtZXRob2RzXG4gICAqIHRvIGxpc3RlbiBldmVudHMgb24gYSByZWNpcGllbnQgc2lkZS4gUmVzZXJ2ZWQgZXZlbnQgbmFtZXNcbiAgICogKF9fTVVTVCBOT1RfXyBiZSB1c2VkKTogYGNvbm5lY3RgLCBgY2xvc2VgLCBgb3BlbmAsIGBlcnJvcmAsXG4gICAqIGBwaW5nYCwgYHBvbmdgLCBgcmV0cnlgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgRXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIHsqfSBbYXJnc10gQXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fSBSZXNvbHZlcyB3aGVuIGEgZGF0YSBoYXMgYmVlbiBzZW50LlxuICAgKi9cbiAgc2VuZCAoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBsZXQgeyBtZXNzYWdlIH0gPSB0aGlzLl9tYWtlTWVzc2FnZShldmVudCwgYXJncywgZmFsc2UpXG4gICAgcmV0dXJuIHRoaXMuX3NlbmQobWVzc2FnZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgYW4gUlBDIHByb2NlZHVyZS4gVXNlIHtAbGluayBDbGllbnQjcmVnaXN0ZXJ9IG1ldGhvZCB0b1xuICAgKiBhc3NpZ24gYW4gUlBDIG1ldGhvZCBoYW5kbGVyLiBSZXNlcnZlZCBwcm9jZWR1cmUgbmFtZXMgKF9fTVVTVFxuICAgKiBOT1RfXyBiZSB1c2VkKTogYGNvbm5lY3RgLCBgY2xvc2VgLCBgb3BlbmAsIGBlcnJvcmAsIGBwaW5nYCxcbiAgICogYHBvbmdgLCBgcmV0cnlgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBQcm9jZWR1cmUgbmFtZS5cbiAgICogQHBhcmFtIHsqfSBbYXJnc10gQXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBSZXNvbHZlcyBvciByZWplY3RzIHdoZW4gYSByZXBseSBpc1xuICAgKiByZWNlaXZlZC5cbiAgICovXG4gIGludm9rZSAobmFtZSwgLi4uYXJncykge1xuICAgIGxldCB7IG1lc3NhZ2UsIHByb21pc2UgfSA9IHRoaXMuX21ha2VNZXNzYWdlKG5hbWUsIGFyZ3MsIHRydWUpXG4gICAgcmV0dXJuIHRoaXMuX3NlbmQobWVzc2FnZSkudGhlbigoKSA9PiBwcm9taXNlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFuIFJQQyBoYW5kbGVyLiBFYWNoIG5hbWUgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiBhIG9uZVxuICAgKiBoYW5kbGVyLCBzbyBpdCB0aHJvd3MgYW4gZXJyb3Igb24gYSBkdXBsaWNhdGUgaGFuZGxlclxuICAgKiByZWdpc3RyYXRpb24gYXR0ZW1wdC4gVXNlIHtAbGluayBDbGllbnQjaW52b2tlfSB0byBjYWxsIGEgbWV0aG9kLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBQcm9jZWR1cmUgbmFtZS5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlciBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIFByb21pc2UuXG4gICAqL1xuICByZWdpc3RlciAobmFtZSwgaGFuZGxlcikge1xuICAgIGlmIChnZXRPd25Qcm9wKHRoaXMuaGFuZGxlcnMsIG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHJlZ2lzdGVyIGEgZHVwbGljYXRlIFJQQyBoYW5kbGVyIGZvciAke25hbWV9YClcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVyc1tuYW1lXSA9IGhhbmRsZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbm5lY3QuIENsaWVudC1zaWRlIG9ubHkuXG4gICAqL1xuICByZWNvbm5lY3QgKCkge1xuICAgIHRoaXMudGVybWluYXRlZCA9IGZhbHNlXG4gICAgaWYgKHRoaXMuX2lzT3BlbigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2UgaWYgKHRoaXMuV2ViU29ja2V0ICYmIHRoaXMudXJsKSB7XG4gICAgICB0aGlzLl9vcGVuKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYWxmb3JtZWQgY29uZmlndXJhdGlvbiBvcHRpb25zJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGEgY2xpZW50IGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbY29kZT0xMDAwXSBDb2RlIGFzIHBlciBXZWJTb2NrZXQgc3BlYy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJdIE9wdGlvbmFsIHN0cmluZy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbdGVybWluYXRlPXRydWVdIERpc2FibGUgcmVjb25uZWN0LlxuICAgKi9cbiAgY2xvc2UgKGNvZGUgPSAxMDAwLCBzdHIsIHRlcm1pbmF0ZSA9IHRydWUpIHtcbiAgICBpZiAoIXRoaXMudGVybWluYXRlZCkge1xuICAgICAgdGhpcy50ZXJtaW5hdGVkID0gdGVybWluYXRlXG4gICAgICBpZiAodGhpcy5faXNPcGVuKCkpIHsgdGhpcy5zb2NrZXQuY2xvc2UoY29kZSwgc3RyKSB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBDbGllbnQjc2VuZH0uXG4gKiBAbWV0aG9kXG4gKiBAbmFtZSBDbGllbnQjZW1pdFxuICovXG5DbGllbnQucHJvdG90eXBlLmVtaXQgPSBDbGllbnQucHJvdG90eXBlLnNlbmRcblxuQ2xpZW50LkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvclxuQ2xpZW50Lk5vUHJvY2VkdXJlRXJyb3IgPSBOb1Byb2NlZHVyZUVycm9yXG5DbGllbnQuVGltZW91dEVycm9yID0gVGltZW91dEVycm9yXG5cbm1vZHVsZS5leHBvcnRzID0gQ2xpZW50XG4iXX0=

@@ -29,3 +29,2 @@

var fromCallback = _require2.fromCallback;
var toEmit = _require2.toEmit;

@@ -63,3 +62,5 @@

this.wss = new this.WebSocketServer(wssOptions, toEmit(this));
this.wss = new this.WebSocketServer(wssOptions, function (error) {
error ? _this2.emit('error', error) : _this2.emit('ready');
});

@@ -170,2 +171,2 @@ this.wss.on('error', this.emit.bind(this));

module.exports = Server;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TZXJ2ZXIuanMiXSwibmFtZXMiOlsiQ2xpZW50IiwicmVxdWlyZSIsIkV2ZW50RW1pdHRlciIsIldlYlNvY2tldCIsIldlYlNvY2tldFNlcnZlciIsIlNlcnZlciIsInVpZCIsIkNMT1NFX0ZPUkJJRERFTiIsImFzc2lnbiIsImF0dGVtcHQiLCJmcm9tQ2FsbGJhY2siLCJ0b0VtaXQiLCJkZWZhdWx0cyIsImNvbm5lY3Rpb25Ib29rIiwiYXV0aFRpbWVvdXQiLCJ3c3NPcHRpb25zIiwic2VydmVyT3B0aW9ucyIsInNvY2tldE9wdGlvbnMiLCJjbGllbnRzIiwiTWFwIiwiX3NldEV2ZW50cyIsIndzcyIsIm9uIiwiZW1pdCIsImJpbmQiLCJfb25Db25uZWN0aW9uIiwic29ja2V0IiwidGltZW91dCIsInNldFRpbWVvdXQiLCJjbG9zZSIsIm9uY2UiLCJfYWRkQ2xpZW50IiwiZGF0YSIsImNsaWVudCIsImNsZWFyVGltZW91dCIsInRoZW4iLCJpZCIsImF1dG9SZWNvbm5lY3QiLCJzZXQiLCJfcmVtb3ZlQ2xpZW50IiwiZGVjb2RlciIsImF1dGhEYXRhIiwiX2lzT3BlbiIsImNvbm5lY3RlZCIsInNlbmQiLCJhdXRoUmVwbHlEYXRhIiwiX3BpbmciLCJjYXRjaCIsInN0ciIsImVycm9yIiwidG9TdHJpbmciLCJkZWxldGUiLCJnZXQiLCJjb2RlIiwiY2xlYXIiLCJjYiIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7QUFDQTs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEsU0FBU0MsUUFBUSxVQUFSLENBQWY7QUFDQSxJQUFNQyxlQUFlRCxRQUFRLGVBQVIsQ0FBckI7QUFDQSxJQUFNRSxZQUFZRixRQUFRLElBQVIsQ0FBbEI7QUFDQSxJQUFNRyxrQkFBa0JILFFBQVEsSUFBUixFQUFjSSxNQUF0QztBQUNBLElBQU1DLE1BQU1MLFFBQVEsVUFBUixDQUFaOztlQUM0QkEsUUFBUSxhQUFSLEM7O0lBQXBCTSxlLFlBQUFBLGU7O2dCQUMwQ04s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QUFNQyxNQUFNQyxRQUFOLEVBQVY7QUFDQWpCLGlCQUFPSixLQUFQLENBQWF0QixlQUFiLEVBQThCeUMsR0FBOUI7QUFDRDtBQUNGLE9BdEJEO0FBdUJEOzs7a0NBRWNaLEUsRUFBZ0M7QUFDN0MsV0FBS2xCLE9BQUwsQ0FBYWlDLE1BQWIsQ0FBb0JmLEVBQXBCO0FBQ0Q7Ozs4QkFPVUEsRSxFQUFrQztBQUMzQyxhQUFPLEtBQUtsQixPQUFMLENBQWFrQyxHQUFiLENBQWlCaEIsRUFBakIsQ0FBUDtBQUNEOzs7NEJBT3dEO0FBQUE7O0FBQUEsVUFBbERpQixJQUFrRCx1RUFBNUIsSUFBNEI7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFDdkQsNkJBQXVCLEtBQUtuQyxPQUE1Qiw4SEFBcUM7QUFBQTs7QUFBQSxjQUF6QmUsTUFBeUI7O0FBQ25DQSxpQkFBT0osS0FBUCxDQUFhd0IsSUFBYjtBQUNEO0FBSHNEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBSXZELFdBQUtuQyxPQUFMLENBQWFvQyxLQUFiO0FBQ0EsYUFBTzVDLGFBQWE7QUFBQSxlQUFNLE9BQUtXLEdBQUwsQ0FBU1EsS0FBVCxDQUFlMEIsRUFBZixDQUFOO0FBQUEsT0FBYixDQUFQO0FBQ0Q7Ozs7RUF4R2tCckQsWTs7QUEyR3JCc0QsT0FBT0MsT0FBUCxHQUFpQnBELE1BQWpCIiwiZmlsZSI6IlNlcnZlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEBmbG93XG4ndXNlIHN0cmljdCdcblxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi9DbGllbnQnKVxuY29uc3QgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpXG5jb25zdCBXZWJTb2NrZXQgPSByZXF1aXJlKCd3cycpXG5jb25zdCBXZWJTb2NrZXRTZXJ2ZXIgPSByZXF1aXJlKCd3cycpLlNlcnZlclxuY29uc3QgdWlkID0gcmVxdWlyZSgndWlkLXNhZmUnKVxuY29uc3QgeyBDTE9TRV9GT1JCSURERU4gfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsgYXNzaWduLCBhdHRlbXB0LCBmcm9tQ2FsbGJhY2ssIHRvRW1pdCB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuICBXZWJTb2NrZXRTZXJ2ZXIsXG4gIGNvbm5lY3Rpb25Ib29rOiBudWxsLFxuICBhdXRoVGltZW91dDogMjAwMDBcbn1cblxuLyoqXG4gKiBDb25uZWN0aW9uIGhvb2sgaXMgcnVuIHdoZW4gYSBjbGllbnQgY29ubmVjdHMgdG8gYSBzZXJ2ZXIuIFRoZVxuICogcmVzdWx0IGlzIHVzZWQgYXMgYW4gYXV0aCByZXBseSBkYXRhLiBNYXkgYWxzbyByZXR1cm4gcHJvbWlzZXMgZm9yXG4gKiBhbiBhc3luY2hyb25vdXMgZXhlY3V0aW9uLiBJZiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCBvciBhbiBlcnJvclxuICogaXMgdGhyb3duLCB0aGVuIGF1dGggaGFzIGZhaWxlZCBhbmQgdGhlIHNvY2tldCB3aWxsIGJlIGNsb3NlZC5cbiAqXG4gKiBAY2FsbGJhY2sgU2VydmVyLkNvbm5lY3Rpb25Ib29rXG4gKlxuICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCBDbGllbnQuXG4gKiBAcGFyYW0ge09iamVjdH0gYXV0aCBBdXRoIGRhdGEuXG4gKiBAcmV0dXJuIHtQcm9taXNlPE9iamVjdHx1bmRlZmluZWQ+fE9iamVjdHx1bmRlZmluZWR9IEF1dGggcmVwbHlcbiAqIGRhdGEuXG4gKi9cbi8qIDo6IHR5cGUgQ29ubmVjdGlvbkhvb2sgPSAoY2xpZW50OiBDbGllbnQsIGRhdGE/OiBhbnkpID0+IFByb21pc2U8YW55PiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNlcnZlci5TZXJ2ZXJPcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHtTZXJ2ZXIuQ29ubmVjdGlvbkhvb2t9IFtjb25uZWN0aW9uSG9va10gQ29ubmVjdGlvblxuICogaG9vay5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbV2ViU29ja2V0U2VydmVyXSBBbHRlcm5hdGl2ZSBjb25zdHJ1Y3RvciBmb3Igd3NcbiAqIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbYXV0aFRpbWVvdXQ9MjAwMDBdIEF1dGggbWVzc2FnZSB3YWl0IHRpbWVvdXQgaW5cbiAqIG1zLlxuICovXG4vKiA6OlxudHlwZSBTZXJ2ZXJPcHRpb25zID0geyBXZWJTb2NrZXRTZXJ2ZXI/OiBjb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkhvb2s/OiBDb25uZWN0aW9uSG9vayxcbiAgICAgICAgICAgICAgICAgICAgICAgYXV0aFRpbWVvdXQ/OiBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgIH1cbiovXG5cbi8qIDo6IHR5cGUgU29ja2V0T3B0aW9ucyA9IE9iamVjdCAqL1xuXG4vKipcbiAqIEBleHRlbmRzIEV2ZW50RW1pdHRlclxuICpcbiAqIEBlbWl0cyBTZXJ2ZXIjcmVhZHlcbiAqIEBlbWl0cyBTZXJ2ZXIjZXJyb3JcbiAqL1xuY2xhc3MgU2VydmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyogOjpcbiAgYXV0aFRpbWVvdXQ6IG51bWJlclxuICBXZWJTb2NrZXRTZXJ2ZXI6IGNvbnN0cnVjdG9yXG4gIGNsaWVudHM6IE1hcDxzdHJpbmcsIE9iamVjdD5cbiAgY29ubmVjdGlvbkhvb2s6IENvbm5lY3Rpb25Ib29rXG4gIHNvY2tldE9wdGlvbnM6IE9iamVjdFxuICB3c3M6IE9iamVjdFxuICAgKi9cblxuICAvKipcbiAgICogU3RhcnRzIGEgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gd3NzT3B0aW9ucyBPcHRpb25zIHRoYXQgYXJlIHBhc3NlZCB0byB3cyBzZXJ2ZXIuXG4gICAqIEBwYXJhbSB7U2VydmVyLlNlcnZlck9wdGlvbnN9IFtzZXJ2ZXJPcHRpb25zXSBTZXJ2ZXIgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtDbGllbnQuU29ja2V0T3B0aW9uc30gW3NvY2tldE9wdGlvbnNdIFNvY2tldCBvcHRpb25zLlxuICAgKi9cbiAgY29uc3RydWN0b3IgKHdzc09wdGlvbnMgLyogOiBPYmplY3QgKi8sXG4gICAgICAgICAgICAgICBzZXJ2ZXJPcHRpb25zIC8qIDogU2VydmVyT3B0aW9ucyAqLyA9IHt9LFxuICAgICAgICAgICAgICAgc29ja2V0T3B0aW9ucyAvKiA6IFNvY2tldE9wdGlvbnMgICovID0ge30pIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5zb2NrZXRPcHRpb25zID0geyBXZWJTb2NrZXQgfVxuICAgIGFzc2lnbih0aGlzLnNvY2tldE9wdGlvbnMsIHNvY2tldE9wdGlvbnMpXG4gICAgYXNzaWduKHRoaXMsIGRlZmF1bHRzLCBzZXJ2ZXJPcHRpb25zKVxuICAgIHRoaXMuY2xpZW50cyA9IG5ldyBNYXAoKVxuICAgIHRoaXMuX3NldEV2ZW50cyh3c3NPcHRpb25zKVxuICB9XG5cbiAgX3NldEV2ZW50cyAod3NzT3B0aW9ucyAvKiA6IE9iamVjdCAqLykgLyogOiB2b2lkICovIHtcbiAgICAvKipcbiAgICAgKiBFbWl0cyBhIHJlYWR5IGV2ZW50LlxuICAgICAqIEBldmVudCBTZXJ2ZXIjcmVhZHlcbiAgICAgKi9cbiAgICB0aGlzLndzcyA9IG5ldyB0aGlzLldlYlNvY2tldFNlcnZlcih3c3NPcHRpb25zLCB0b0VtaXQodGhpcykpXG4gICAgLyoqXG4gICAgICogRW1pdHMgd3NzIGVycm9yIGV2ZW50cy4gRG9lcyBub3QgdGhyb3cgaWYgdGhlcmUgYXJlIG5vXG4gICAgICogbGlzdGVuZXJzLlxuICAgICAqIEBldmVudCBTZXJ2ZXIjZXJyb3JcbiAgICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciBFcnJvci5cbiAgICAgKi9cbiAgICB0aGlzLndzcy5vbignZXJyb3InLCB0aGlzLmVtaXQuYmluZCh0aGlzKSlcbiAgICB0aGlzLndzcy5vbignY29ubmVjdGlvbicsIHNvY2tldCA9PiB0aGlzLl9vbkNvbm5lY3Rpb24oc29ja2V0KSlcbiAgfVxuXG4gIF9vbkNvbm5lY3Rpb24gKHNvY2tldCAvKiA6IE9iamVjdCAmIEV2ZW50RW1pdHRlciAqLykgLyogOiB2b2lkICovIHtcbiAgICBsZXQgdGltZW91dCA9IHNldFRpbWVvdXQoXG4gICAgICBzb2NrZXQuY2xvc2UuYmluZChzb2NrZXQsIENMT1NFX0ZPUkJJRERFTiksIHRoaXMuYXV0aFRpbWVvdXQpXG4gICAgc29ja2V0Lm9uY2UoJ21lc3NhZ2UnLCBkYXRhID0+IHRoaXMuX2FkZENsaWVudChzb2NrZXQsIGRhdGEsIHRpbWVvdXQpKVxuICB9XG5cbiAgX2FkZENsaWVudCAoc29ja2V0IC8qIDogRXZlbnRFbWl0dGVyICovLFxuICAgICAgICAgICAgICBkYXRhIC8qIDogYW55ICovLFxuICAgICAgICAgICAgICB0aW1lb3V0IC8qIDogbnVtYmVyICovKSAvKiA6IHZvaWQgKi8ge1xuICAgIGxldCBjbGllbnRcbiAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICB1aWQoMTgpLnRoZW4oaWQgPT4ge1xuICAgICAgY2xpZW50ID0gbmV3IENsaWVudChudWxsLCBhc3NpZ24oe3NvY2tldCwgaWR9LCB0aGlzLnNvY2tldE9wdGlvbnMpKVxuICAgICAgY2xpZW50LmF1dG9SZWNvbm5lY3QgPSBmYWxzZVxuICAgICAgdGhpcy5jbGllbnRzLnNldChjbGllbnQuaWQsIGNsaWVudClcbiAgICAgIGNsaWVudC5vbignY2xvc2UnLCAoKSA9PiB0aGlzLl9yZW1vdmVDbGllbnQoY2xpZW50LmlkKSlcbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25Ib29rKSB7XG4gICAgICAgIHJldHVybiBhdHRlbXB0KCgpID0+IGNsaWVudC5kZWNvZGVyKGRhdGEpKVxuICAgICAgICAgIC50aGVuKGF1dGhEYXRhID0+IHRoaXMuY29ubmVjdGlvbkhvb2soY2xpZW50LCBhdXRoRGF0YSkpXG4gICAgICB9XG4gICAgfSkudGhlbihhdXRoUmVwbHlEYXRhID0+IHtcbiAgICAgIGlmIChjbGllbnQuX2lzT3BlbigpKSB7XG4gICAgICAgIGNsaWVudC5fc2V0RXZlbnRzKClcbiAgICAgICAgY2xpZW50LmNvbm5lY3RlZCA9IHRydWVcbiAgICAgICAgY2xpZW50LnNlbmQoJ2Nvbm5lY3QnLCBhdXRoUmVwbHlEYXRhKVxuICAgICAgICBjbGllbnQuX3BpbmcoKVxuICAgICAgfVxuICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAoY2xpZW50KSB7XG4gICAgICAgIGxldCBzdHIgPSBlcnJvci50b1N0cmluZygpXG4gICAgICAgIGNsaWVudC5jbG9zZShDTE9TRV9GT1JCSURERU4sIHN0cilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgX3JlbW92ZUNsaWVudCAoaWQgLyogOiBzdHJpbmcgKi8pIC8qIDogdm9pZCAqLyB7XG4gICAgdGhpcy5jbGllbnRzLmRlbGV0ZShpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXQgYSBjbGllbnQgYnkgaWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBDbGllbnQgaWQuXG4gICAqIEByZXR1cm5zIHtDbGllbnR8dW5kZWZpbmVkfSBDbGllbnQgaWYgZm91bmQuXG4gICAqL1xuICBnZXRDbGllbnQgKGlkIC8qIDogc3RyaW5nICovKSAvKiA6IENsaWVudCAqLyB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50cy5nZXQoaWQpXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGEgc2VydmVyLlxuICAgKiBAcGFyYW0ge2NvZGV9IFtjb2RlPTEwMDBdIENvZGUgYXMgcGVyIFdlYlNvY2tldCBzcGVjLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fSBQcm9taXNlLlxuICAgKi9cbiAgY2xvc2UgKGNvZGUgLyogOiBudW1iZXIgKi8gPSAxMDAwKSAvKiA6IFByb21pc2U8dm9pZD4gKi8ge1xuICAgIGZvciAobGV0IFssIGNsaWVudF0gb2YgdGhpcy5jbGllbnRzKSB7XG4gICAgICBjbGllbnQuY2xvc2UoY29kZSlcbiAgICB9XG4gICAgdGhpcy5jbGllbnRzLmNsZWFyKClcbiAgICByZXR1cm4gZnJvbUNhbGxiYWNrKGNiID0+IHRoaXMud3NzLmNsb3NlKGNiKSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNlcnZlclxuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TZXJ2ZXIuanMiXSwibmFtZXMiOlsiQ2xpZW50IiwicmVxdWlyZSIsIkV2ZW50RW1pdHRlciIsIldlYlNvY2tldCIsIldlYlNvY2tldFNlcnZlciIsIlNlcnZlciIsInVpZCIsIkNMT1NFX0ZPUkJJRERFTiIsImFzc2lnbiIsImF0dGVtcHQiLCJmcm9tQ2FsbGJhY2siLCJkZWZhdWx0cyIsImNvbm5lY3Rpb25Ib29rIiwiYXV0aFRpbWVvdXQiLCJ3c3NPcHRpb25zIiwic2VydmVyT3B0aW9ucyIsInNvY2tldE9wdGlvbnMiLCJjbGllbnRzIiwiTWFwIiwiX3NldEV2ZW50cyIsIndzcyIsImVycm9yIiwiZW1pdCIsIm9uIiwiYmluZCIsIl9vbkNvbm5lY3Rpb24iLCJzb2NrZXQiLCJ0aW1lb3V0Iiwic2V0VGltZW91dCIsImNsb3NlIiwib25jZSIsIl9hZGRDbGllbnQiLCJkYXRhIiwiY2xpZW50IiwiY2xlYXJUaW1lb3V0IiwidGhlbiIsImlkIiwiYXV0b1JlY29ubmVjdCIsInNldCIsIl9yZW1vdmVDbGllbnQiLCJkZWNvZGVyIiwiYXV0aERhdGEiLCJfaXNPcGVuIiwiY29ubmVjdGVkIiwic2VuZCIsImF1dGhSZXBseURhdGEiLCJfcGluZyIsImNhdGNoIiwic3RyIiwidG9TdHJpbmciLCJkZWxldGUiLCJnZXQiLCJjb2RlIiwiY2xlYXIiLCJjYiIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7QUFDQTs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEsU0FBU0MsUUFBUSxVQUFSLENBQWY7QUFDQSxJQUFNQyxlQUFlRCxRQUFRLGVBQVIsQ0FBckI7QUFDQSxJQUFNRSxZQUFZRixRQUFRLElBQVIsQ0FBbEI7QUFDQSxJQUFNRyxrQkFBa0JILFFBQVEsSUFBUixFQUFjSSxNQUF0QztBQUNBLElBQU1DLE1BQU1MLFFBQVEsVUFBUixDQUFaOztlQUM0QkEsUUFBUSxhQUFSLEM7O0lBQXBCTSxlLFlBQUFBLGU7O2dCQUNrQ04sUUFBUSxTQUFS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QUNGLE9BaEJELEVBZ0JHQyxLQWhCSCxDQWdCUyxpQkFBUztBQUVoQixZQUFJZCxNQUFKLEVBQVk7QUFDVixjQUFJZSxNQUFNM0IsTUFBTTRCLFFBQU4sRUFBVjtBQUNBaEIsaUJBQU9KLEtBQVAsQ0FBYXRCLGVBQWIsRUFBOEJ5QyxHQUE5QjtBQUNEO0FBQ0YsT0F0QkQ7QUF1QkQ7OztrQ0FFY1osRSxFQUFnQztBQUM3QyxXQUFLbkIsT0FBTCxDQUFhaUMsTUFBYixDQUFvQmQsRUFBcEI7QUFDRDs7OzhCQU9VQSxFLEVBQWtDO0FBQzNDLGFBQU8sS0FBS25CLE9BQUwsQ0FBYWtDLEdBQWIsQ0FBaUJmLEVBQWpCLENBQVA7QUFDRDs7OzRCQU93RDtBQUFBOztBQUFBLFVBQWxEZ0IsSUFBa0QsdUVBQTVCLElBQTRCO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQ3ZELDZCQUF1QixLQUFLbkMsT0FBNUIsOEhBQXFDO0FBQUE7O0FBQUEsY0FBekJnQixNQUF5Qjs7QUFDbkNBLGlCQUFPSixLQUFQLENBQWF1QixJQUFiO0FBQ0Q7QUFIc0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFJdkQsV0FBS25DLE9BQUwsQ0FBYW9DLEtBQWI7QUFDQSxhQUFPM0MsYUFBYTtBQUFBLGVBQU0sT0FBS1UsR0FBTCxDQUFTUyxLQUFULENBQWV5QixFQUFmLENBQU47QUFBQSxPQUFiLENBQVA7QUFDRDs7OztFQTVHa0JwRCxZOztBQStHckJxRCxPQUFPQyxPQUFQLEdBQWlCbkQsTUFBakIiLCJmaWxlIjoiU2VydmVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcbid1c2Ugc3RyaWN0J1xuXG5jb25zdCBDbGllbnQgPSByZXF1aXJlKCcuL0NsaWVudCcpXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJylcbmNvbnN0IFdlYlNvY2tldCA9IHJlcXVpcmUoJ3dzJylcbmNvbnN0IFdlYlNvY2tldFNlcnZlciA9IHJlcXVpcmUoJ3dzJykuU2VydmVyXG5jb25zdCB1aWQgPSByZXF1aXJlKCd1aWQtc2FmZScpXG5jb25zdCB7IENMT1NFX0ZPUkJJRERFTiB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBhc3NpZ24sIGF0dGVtcHQsIGZyb21DYWxsYmFjayB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuICBXZWJTb2NrZXRTZXJ2ZXIsXG4gIGNvbm5lY3Rpb25Ib29rOiBudWxsLFxuICBhdXRoVGltZW91dDogMjAwMDBcbn1cblxuLyoqXG4gKiBDb25uZWN0aW9uIGhvb2sgaXMgcnVuIHdoZW4gYSBjbGllbnQgY29ubmVjdHMgdG8gYSBzZXJ2ZXIuIFRoZVxuICogcmVzdWx0IGlzIHVzZWQgYXMgYW4gYXV0aCByZXBseSBkYXRhLiBNYXkgYWxzbyByZXR1cm4gcHJvbWlzZXMgZm9yXG4gKiBhbiBhc3luY2hyb25vdXMgZXhlY3V0aW9uLiBJZiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCBvciBhbiBlcnJvclxuICogaXMgdGhyb3duLCB0aGVuIGF1dGggaGFzIGZhaWxlZCBhbmQgdGhlIHNvY2tldCB3aWxsIGJlIGNsb3NlZC5cbiAqXG4gKiBAY2FsbGJhY2sgU2VydmVyLkNvbm5lY3Rpb25Ib29rXG4gKlxuICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCBDbGllbnQuXG4gKiBAcGFyYW0ge09iamVjdH0gYXV0aCBBdXRoIGRhdGEuXG4gKiBAcmV0dXJuIHtQcm9taXNlPE9iamVjdHx1bmRlZmluZWQ+fE9iamVjdHx1bmRlZmluZWR9IEF1dGggcmVwbHlcbiAqIGRhdGEuXG4gKi9cbi8qIDo6IHR5cGUgQ29ubmVjdGlvbkhvb2sgPSAoY2xpZW50OiBDbGllbnQsIGRhdGE/OiBhbnkpID0+IFByb21pc2U8YW55PiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNlcnZlci5TZXJ2ZXJPcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHtTZXJ2ZXIuQ29ubmVjdGlvbkhvb2t9IFtjb25uZWN0aW9uSG9va10gQ29ubmVjdGlvblxuICogaG9vay5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbV2ViU29ja2V0U2VydmVyXSBBbHRlcm5hdGl2ZSBjb25zdHJ1Y3RvciBmb3Igd3NcbiAqIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbYXV0aFRpbWVvdXQ9MjAwMDBdIEF1dGggbWVzc2FnZSB3YWl0IHRpbWVvdXQgaW5cbiAqIG1zLlxuICovXG4vKiA6OlxudHlwZSBTZXJ2ZXJPcHRpb25zID0geyBXZWJTb2NrZXRTZXJ2ZXI/OiBjb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkhvb2s/OiBDb25uZWN0aW9uSG9vayxcbiAgICAgICAgICAgICAgICAgICAgICAgYXV0aFRpbWVvdXQ/OiBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgIH1cbiovXG5cbi8qIDo6IHR5cGUgU29ja2V0T3B0aW9ucyA9IE9iamVjdCAqL1xuXG4vKipcbiAqIEBleHRlbmRzIEV2ZW50RW1pdHRlclxuICpcbiAqIEBlbWl0cyBTZXJ2ZXIjcmVhZHlcbiAqIEBlbWl0cyBTZXJ2ZXIjZXJyb3JcbiAqL1xuY2xhc3MgU2VydmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyogOjpcbiAgYXV0aFRpbWVvdXQ6IG51bWJlclxuICBXZWJTb2NrZXRTZXJ2ZXI6IGNvbnN0cnVjdG9yXG4gIGNsaWVudHM6IE1hcDxzdHJpbmcsIE9iamVjdD5cbiAgY29ubmVjdGlvbkhvb2s6IENvbm5lY3Rpb25Ib29rXG4gIHNvY2tldE9wdGlvbnM6IE9iamVjdFxuICB3c3M6IE9iamVjdFxuICAgKi9cblxuICAvKipcbiAgICogU3RhcnRzIGEgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gd3NzT3B0aW9ucyBPcHRpb25zIHRoYXQgYXJlIHBhc3NlZCB0byB3cyBzZXJ2ZXIuXG4gICAqIEBwYXJhbSB7U2VydmVyLlNlcnZlck9wdGlvbnN9IFtzZXJ2ZXJPcHRpb25zXSBTZXJ2ZXIgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtDbGllbnQuU29ja2V0T3B0aW9uc30gW3NvY2tldE9wdGlvbnNdIFNvY2tldCBvcHRpb25zLlxuICAgKi9cbiAgY29uc3RydWN0b3IgKHdzc09wdGlvbnMgLyogOiBPYmplY3QgKi8sXG4gICAgICAgICAgICAgICBzZXJ2ZXJPcHRpb25zIC8qIDogU2VydmVyT3B0aW9ucyAqLyA9IHt9LFxuICAgICAgICAgICAgICAgc29ja2V0T3B0aW9ucyAvKiA6IFNvY2tldE9wdGlvbnMgICovID0ge30pIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5zb2NrZXRPcHRpb25zID0geyBXZWJTb2NrZXQgfVxuICAgIGFzc2lnbih0aGlzLnNvY2tldE9wdGlvbnMsIHNvY2tldE9wdGlvbnMpXG4gICAgYXNzaWduKHRoaXMsIGRlZmF1bHRzLCBzZXJ2ZXJPcHRpb25zKVxuICAgIHRoaXMuY2xpZW50cyA9IG5ldyBNYXAoKVxuICAgIHRoaXMuX3NldEV2ZW50cyh3c3NPcHRpb25zKVxuICB9XG5cbiAgX3NldEV2ZW50cyAod3NzT3B0aW9ucyAvKiA6IE9iamVjdCAqLykgLyogOiB2b2lkICovIHtcbiAgICAvKipcbiAgICAgKiBFbWl0cyBhIHJlYWR5IGV2ZW50LlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGV2ZW50IFNlcnZlciNyZWFkeVxuICAgICAqL1xuICAgIHRoaXMud3NzID0gbmV3IHRoaXMuV2ViU29ja2V0U2VydmVyKHdzc09wdGlvbnMsIChlcnJvcikgPT4ge1xuICAgICAgZXJyb3IgPyB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpIDogdGhpcy5lbWl0KCdyZWFkeScpXG4gICAgfSlcbiAgICAvKipcbiAgICAgKiBFbWl0cyB3c3MgZXJyb3IgZXZlbnRzLiBEb2VzIG5vdCB0aHJvdyBpZiB0aGVyZSBhcmUgbm9cbiAgICAgKiBsaXN0ZW5lcnMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZXZlbnQgU2VydmVyI2Vycm9yXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgRXJyb3IuXG4gICAgICovXG4gICAgdGhpcy53c3Mub24oJ2Vycm9yJywgdGhpcy5lbWl0LmJpbmQodGhpcykpXG4gICAgdGhpcy53c3Mub24oJ2Nvbm5lY3Rpb24nLCBzb2NrZXQgPT4gdGhpcy5fb25Db25uZWN0aW9uKHNvY2tldCkpXG4gIH1cblxuICBfb25Db25uZWN0aW9uIChzb2NrZXQgLyogOiBPYmplY3QgJiBFdmVudEVtaXR0ZXIgKi8pIC8qIDogdm9pZCAqLyB7XG4gICAgbGV0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KFxuICAgICAgc29ja2V0LmNsb3NlLmJpbmQoc29ja2V0LCBDTE9TRV9GT1JCSURERU4pLCB0aGlzLmF1dGhUaW1lb3V0KVxuICAgIHNvY2tldC5vbmNlKCdtZXNzYWdlJywgZGF0YSA9PiB0aGlzLl9hZGRDbGllbnQoc29ja2V0LCBkYXRhLCB0aW1lb3V0KSlcbiAgfVxuXG4gIF9hZGRDbGllbnQgKHNvY2tldCAvKiA6IEV2ZW50RW1pdHRlciAqLyxcbiAgICAgICAgICAgICAgZGF0YSAvKiA6IGFueSAqLyxcbiAgICAgICAgICAgICAgdGltZW91dCAvKiA6IG51bWJlciAqLykgLyogOiB2b2lkICovIHtcbiAgICBsZXQgY2xpZW50XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgdWlkKDE4KS50aGVuKGlkID0+IHtcbiAgICAgIGNsaWVudCA9IG5ldyBDbGllbnQobnVsbCwgYXNzaWduKHtzb2NrZXQsIGlkfSwgdGhpcy5zb2NrZXRPcHRpb25zKSlcbiAgICAgIGNsaWVudC5hdXRvUmVjb25uZWN0ID0gZmFsc2VcbiAgICAgIHRoaXMuY2xpZW50cy5zZXQoY2xpZW50LmlkLCBjbGllbnQpXG4gICAgICBjbGllbnQub24oJ2Nsb3NlJywgKCkgPT4gdGhpcy5fcmVtb3ZlQ2xpZW50KGNsaWVudC5pZCkpXG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uSG9vaykge1xuICAgICAgICByZXR1cm4gYXR0ZW1wdCgoKSA9PiBjbGllbnQuZGVjb2RlcihkYXRhKSlcbiAgICAgICAgICAudGhlbihhdXRoRGF0YSA9PiB0aGlzLmNvbm5lY3Rpb25Ib29rKGNsaWVudCwgYXV0aERhdGEpKVxuICAgICAgfVxuICAgIH0pLnRoZW4oYXV0aFJlcGx5RGF0YSA9PiB7XG4gICAgICBpZiAoY2xpZW50Ll9pc09wZW4oKSkge1xuICAgICAgICBjbGllbnQuX3NldEV2ZW50cygpXG4gICAgICAgIGNsaWVudC5jb25uZWN0ZWQgPSB0cnVlXG4gICAgICAgIGNsaWVudC5zZW5kKCdjb25uZWN0JywgYXV0aFJlcGx5RGF0YSlcbiAgICAgICAgY2xpZW50Ll9waW5nKClcbiAgICAgIH1cbiAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICBsZXQgc3RyID0gZXJyb3IudG9TdHJpbmcoKVxuICAgICAgICBjbGllbnQuY2xvc2UoQ0xPU0VfRk9SQklEREVOLCBzdHIpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIF9yZW1vdmVDbGllbnQgKGlkIC8qIDogc3RyaW5nICovKSAvKiA6IHZvaWQgKi8ge1xuICAgIHRoaXMuY2xpZW50cy5kZWxldGUoaWQpXG4gIH1cblxuICAvKipcbiAgICogR2l0IGEgY2xpZW50IGJ5IGlkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgQ2xpZW50IGlkLlxuICAgKiBAcmV0dXJucyB7Q2xpZW50fHVuZGVmaW5lZH0gQ2xpZW50IGlmIGZvdW5kLlxuICAgKi9cbiAgZ2V0Q2xpZW50IChpZCAvKiA6IHN0cmluZyAqLykgLyogOiBDbGllbnQgKi8ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudHMuZ2V0KGlkKVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyBhIHNlcnZlci5cbiAgICogQHBhcmFtIHtjb2RlfSBbY29kZT0xMDAwXSBDb2RlIGFzIHBlciBXZWJTb2NrZXQgc3BlYy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn0gUHJvbWlzZS5cbiAgICovXG4gIGNsb3NlIChjb2RlIC8qIDogbnVtYmVyICovID0gMTAwMCkgLyogOiBQcm9taXNlPHZvaWQ+ICovIHtcbiAgICBmb3IgKGxldCBbLCBjbGllbnRdIG9mIHRoaXMuY2xpZW50cykge1xuICAgICAgY2xpZW50LmNsb3NlKGNvZGUpXG4gICAgfVxuICAgIHRoaXMuY2xpZW50cy5jbGVhcigpXG4gICAgcmV0dXJuIGZyb21DYWxsYmFjayhjYiA9PiB0aGlzLndzcy5jbG9zZShjYikpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTZXJ2ZXJcbiJdfQ==

@@ -36,12 +36,2 @@ 'use strict';

function toEmit(emitter) {
return function (error) {
if (error) {
emitter.emit('error', error);
} else {
emitter.emit('ready');
}
};
}
module.exports = {

@@ -51,5 +41,4 @@ assign: assign,

fromCallback: fromCallback,
toEmit: toEmit,
Promise: Promise
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy5qcyJdLCJuYW1lcyI6WyJQcm9taXNlIiwicmVxdWlyZSIsImFzc2lnbiIsInRhcmdldCIsImkiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJzb3VyY2UiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSIsImF0dGVtcHQiLCJmbiIsInJlc29sdmUiLCJ0aGVuIiwiZnJvbUNhbGxiYWNrIiwicmVqZWN0IiwiZXJyb3IiLCJyZXN1bHQiLCJ0b0VtaXQiLCJlbWl0dGVyIiwiZW1pdCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBLElBQU1BLFVBQVVDLFFBQVEsa0JBQVIsQ0FBaEI7O0FBRUEsU0FBU0MsTUFBVCxDQUFpQkMsTUFBakIsRUFBeUI7QUFDdkIsT0FBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlDLFVBQVVDLE1BQTlCLEVBQXNDRixHQUF0QyxFQUEyQztBQUN6QyxRQUFJRyxTQUFTRixVQUFVRCxDQUFWLENBQWI7QUFDQSxRQUFJLENBQUNHLE1BQUwsRUFBYTtBQUFFO0FBQVU7QUFDekIsU0FBSyxJQUFJQyxHQUFULElBQWdCRCxNQUFoQixFQUF3QjtBQUV0QixVQUFJQSxPQUFPRSxjQUFQLENBQXNCRCxHQUF0QixDQUFKLEVBQWdDO0FBQzlCTCxlQUFPSyxHQUFQLElBQWNELE9BQU9DLEdBQVAsQ0FBZDtBQUNEO0FBQ0Y7QUFDRjtBQUNELFNBQU9MLE1BQVA7QUFDRDs7QUFFRCxTQUFTTyxPQUFULENBQWtCQyxFQUFsQixFQUFzQjtBQUNwQixTQUFPWCxRQUFRWSxPQUFSLEdBQWtCQyxJQUFsQixDQUF1QkYsRUFBdkIsQ0FBUDtBQUNEOztBQUVELFNBQVNHLFlBQVQsQ0FBdUJILEVBQXZCLEVBQTJCO0FBQ3pCLFNBQU8sSUFBSVgsT0FBSixDQUFZLFVBQUNZLE9BQUQsRUFBVUcsTUFBVixFQUFxQjtBQUN0Q0osT0FBRyxVQUFDSyxLQUFELEVBQVFDLE1BQVIsRUFBbUI7QUFDcEIsVUFBSUQsS0FBSixFQUFXO0FBQ1RELGVBQU9DLEtBQVA7QUFDRCxPQUZELE1BRU87QUFDTEosZ0JBQVFLLE1BQVI7QUFDRDtBQUNGLEtBTkQ7QUFPRCxHQVJNLENBQVA7QUFTRDs7QUFFRCxTQUFTQyxNQUFULENBQWlCQyxPQUFqQixFQUEwQjtBQUN4QixTQUFPLGlCQUFTO0FBQ2QsUUFBSUgsS0FBSixFQUFXO0FBQ1RHLGNBQVFDLElBQVIsQ0FBYSxPQUFiLEVBQXNCSixLQUF0QjtBQUNELEtBRkQsTUFFTztBQUNMRyxjQUFRQyxJQUFSLENBQWEsT0FBYjtBQUNEO0FBQ0YsR0FORDtBQU9EOztBQUVEQyxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZwQixnQkFEZTtBQUVmUSxrQkFGZTtBQUdmSSw0QkFIZTtBQUlmSSxnQkFKZTtBQUtmbEI7QUFMZSxDQUFqQiIsImZpbGUiOiJ1dGlscy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBQcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZS1wb2x5ZmlsbCcpXG5cbmZ1bmN0aW9uIGFzc2lnbiAodGFyZ2V0KSB7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IHNvdXJjZSA9IGFyZ3VtZW50c1tpXVxuICAgIGlmICghc291cmNlKSB7IGNvbnRpbnVlIH1cbiAgICBmb3IgKGxldCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldFxufVxuXG5mdW5jdGlvbiBhdHRlbXB0IChmbikge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbilcbn1cblxuZnVuY3Rpb24gZnJvbUNhbGxiYWNrIChmbikge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGZuKChlcnJvciwgcmVzdWx0KSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICB9XG4gICAgfSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gdG9FbWl0IChlbWl0dGVyKSB7XG4gIHJldHVybiBlcnJvciA9PiB7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBlbWl0dGVyLmVtaXQoJ2Vycm9yJywgZXJyb3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXR0ZXIuZW1pdCgncmVhZHknKVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYXNzaWduLFxuICBhdHRlbXB0LFxuICBmcm9tQ2FsbGJhY2ssXG4gIHRvRW1pdCxcbiAgUHJvbWlzZVxufVxuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy5qcyJdLCJuYW1lcyI6WyJQcm9taXNlIiwicmVxdWlyZSIsImFzc2lnbiIsInRhcmdldCIsImkiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJzb3VyY2UiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSIsImF0dGVtcHQiLCJmbiIsInJlc29sdmUiLCJ0aGVuIiwiZnJvbUNhbGxiYWNrIiwicmVqZWN0IiwiZXJyb3IiLCJyZXN1bHQiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQSxJQUFNQSxVQUFVQyxRQUFRLGtCQUFSLENBQWhCOztBQUVBLFNBQVNDLE1BQVQsQ0FBaUJDLE1BQWpCLEVBQXlCO0FBQ3ZCLE9BQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJQyxVQUFVQyxNQUE5QixFQUFzQ0YsR0FBdEMsRUFBMkM7QUFDekMsUUFBSUcsU0FBU0YsVUFBVUQsQ0FBVixDQUFiO0FBQ0EsUUFBSSxDQUFDRyxNQUFMLEVBQWE7QUFBRTtBQUFVO0FBQ3pCLFNBQUssSUFBSUMsR0FBVCxJQUFnQkQsTUFBaEIsRUFBd0I7QUFFdEIsVUFBSUEsT0FBT0UsY0FBUCxDQUFzQkQsR0FBdEIsQ0FBSixFQUFnQztBQUM5QkwsZUFBT0ssR0FBUCxJQUFjRCxPQUFPQyxHQUFQLENBQWQ7QUFDRDtBQUNGO0FBQ0Y7QUFDRCxTQUFPTCxNQUFQO0FBQ0Q7O0FBRUQsU0FBU08sT0FBVCxDQUFrQkMsRUFBbEIsRUFBc0I7QUFDcEIsU0FBT1gsUUFBUVksT0FBUixHQUFrQkMsSUFBbEIsQ0FBdUJGLEVBQXZCLENBQVA7QUFDRDs7QUFFRCxTQUFTRyxZQUFULENBQXVCSCxFQUF2QixFQUEyQjtBQUN6QixTQUFPLElBQUlYLE9BQUosQ0FBWSxVQUFDWSxPQUFELEVBQVVHLE1BQVYsRUFBcUI7QUFDdENKLE9BQUcsVUFBQ0ssS0FBRCxFQUFRQyxNQUFSLEVBQW1CO0FBQ3BCLFVBQUlELEtBQUosRUFBVztBQUNURCxlQUFPQyxLQUFQO0FBQ0QsT0FGRCxNQUVPO0FBQ0xKLGdCQUFRSyxNQUFSO0FBQ0Q7QUFDRixLQU5EO0FBT0QsR0FSTSxDQUFQO0FBU0Q7O0FBRURDLE9BQU9DLE9BQVAsR0FBaUI7QUFDZmpCLGdCQURlO0FBRWZRLGtCQUZlO0FBR2ZJLDRCQUhlO0FBSWZkO0FBSmUsQ0FBakIiLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxuY29uc3QgUHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UtcG9seWZpbGwnKVxuXG5mdW5jdGlvbiBhc3NpZ24gKHRhcmdldCkge1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBzb3VyY2UgPSBhcmd1bWVudHNbaV1cbiAgICBpZiAoIXNvdXJjZSkgeyBjb250aW51ZSB9XG4gICAgZm9yIChsZXQga2V5IGluIHNvdXJjZSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXRcbn1cblxuZnVuY3Rpb24gYXR0ZW1wdCAoZm4pIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZm4pXG59XG5cbmZ1bmN0aW9uIGZyb21DYWxsYmFjayAoZm4pIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBmbigoZXJyb3IsIHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhc3NpZ24sXG4gIGF0dGVtcHQsXG4gIGZyb21DYWxsYmFjayxcbiAgUHJvbWlzZVxufVxuIl19
{
"name": "ws-messaging",
"version": "0.5.1",
"version": "0.5.2",
"description": "A minimalistic abstraction layer for websockets.",

@@ -15,2 +15,3 @@ "main": "index.js",

"prepublish": "npm run bundle-client",
"pretest": "npm run compile",
"test": "cross-env NODE_ENV=test nyc mocha"

@@ -17,0 +18,0 @@ },

@@ -11,3 +11,3 @@ # ws-messaging

Just a really thin abstraction layer on top of WebSocket for Node.js
and Web browsers with a Promises and EventEmitter based APIs.
and Web Browsers with Promise and EventEmitter based APIs.

@@ -37,2 +37,4 @@ ### Features

- [API](#api)
- [Network format description](#network-format-description)
- [Data validation](#data-validation)
- [Contribute](#contribute)

@@ -97,3 +99,6 @@ - [License](#license)

See tests in `test/index.js` for more usage examples.
Essentially there are two usage patterns that are working in both
directions. Fire and forget via `send`/`on`, and RPC-style via
`invoke`/`register`. Unlike `on`, only a single handler function can
be registered per a method name.

@@ -106,3 +111,46 @@ ## API

## Network format description
This section describes what data is actually passed to an encoder.
There are only two types of messages. The first one is for normal
messages:
```javascript
{
name: string,
args: Array,
id?: number
}
```
An `id` field is present for `invoke` calls. The second one is for
ack (replies for `invoke` calls) messages:
```javascript
{
id: number
result?: Object
error?: Object
}
```
Either a `result` or an `error` field is included. Note that an
`error` is the value returned by an `errorFormatter`, by default
`String` is used as an `errorFormatter`.
## Data validation
All incoming data must be validated on a server side, including errors
that are passed to a catch callback. By default only the
[network format](network-format-description) itself is
validated. Validation can be made by a custom decoder (useful when a
decoder is already using some scheme) or via a `receiveHook`, or
inside a handler itself (useful for registered procedures). When
validation is done inside `decoder`/`receiveHook`, just throw an error
or reject a promise to fail a validation and prevent handlers
execution. Also note that a promise returned by `invoke` can be
rejected locally either with `Client.ConnectionError` or with
`Client.TimeoutError`.
## Contribute

@@ -109,0 +157,0 @@

@@ -182,2 +182,8 @@ 'use strict'

* messages validation.
* @property {Object} [WebSocket=undefined] Alternative websocket
* constructor, if it is undefined then a global WebSocket is used.
* @property {boolean} [w3c=undefined] If WebSocket is using a w3c
* send API, or a ws one (from Node.js server implementation with a
* callback). By default if a global value is used, then it is `true`
* and `false otherwise.
*/

@@ -206,3 +212,5 @@

receiveHook: null,
skipValidation: false
skipValidation: false,
WebSocket: undefined,
w3c: undefined
}

@@ -239,3 +247,3 @@

this.WebSocket = WebSocket
this.w3c = true
this.w3c = this.w3c === undefined ? true : this.w3c
}

@@ -271,2 +279,9 @@ /**

.then(() => this._dispatch(message))
/**
* Emitted when the other side failed to decode or validate a
* websocket message, namely an error is occurred inside either
* `decoder` or `receiveHook`.
* @event Client#preprocessingError
* @param {Object} error Converted error.
*/
.catch(error => this.send('preprocessingError', this.errorFormatter(error)))

@@ -273,0 +288,0 @@ }

@@ -10,3 +10,3 @@ // @flow

const { CLOSE_FORBIDDEN } = require('./constants')
const { assign, attempt, fromCallback, toEmit } = require('./utils')
const { assign, attempt, fromCallback } = require('./utils')

@@ -90,8 +90,12 @@ const defaults = {

* Emits a ready event.
* @private
* @event Server#ready
*/
this.wss = new this.WebSocketServer(wssOptions, toEmit(this))
this.wss = new this.WebSocketServer(wssOptions, (error) => {
error ? this.emit('error', error) : this.emit('ready')
})
/**
* Emits wss error events. Does not throw if there are no
* listeners.
* @private
* @event Server#error

@@ -98,0 +102,0 @@ * @param {Error} error Error.

@@ -35,12 +35,2 @@ 'use strict'

function toEmit (emitter) {
return error => {
if (error) {
emitter.emit('error', error)
} else {
emitter.emit('ready')
}
}
}
module.exports = {

@@ -50,4 +40,3 @@ assign,

fromCallback,
toEmit,
Promise
}

@@ -524,6 +524,4 @@ 'use strict'

})
})
describe('ws-messaging utils', function () {
it('should reject promise on error', function () {
it('should reject promises on errors', function () {
return utils.fromCallback(cb => cb(new Error()))

@@ -533,10 +531,2 @@ .then(notReachable)

})
it('should emit errors', function () {
let ee = new EventEmitter()
let fn = utils.toEmit(ee)
let p = eventToPromise(ee, 'error')
fn(new Error())
return p
})
})
(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.wsMessaging = 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<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
"use strict";function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function isBlacklistedEvent(e){return blacklist.indexOf(e)>=0}function getOwnProp(e,t){return e.hasOwnProperty(t)?e[t]:void 0}function ConnectionError(e){this.name="ConnectionError",this.id=e}function TimeoutError(e){this.name="TimeoutError",this.id=e}function NoProcedureError(e){this.name="NoProcedureError",this.procedure=e}function validateId(e){return"number"==typeof e&&e%1===0&&e>0}function validate(e){var t=!1;if(e instanceof Object)if(e.name){if("string"==typeof e.name&&e.args instanceof Array){var n=Object.keys(e).length;(2===n||3===n&&validateId(e.id))&&(t=!0)}}else{var r=Object.keys(e).length;2===r&&validateId(e.id)&&(e.hasOwnProperty("error")||e.hasOwnProperty("result"))&&(t=!0)}if(!t)throw new Error("Validation error")}var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_createClass=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),EventEmitter=require("eventemitter3"),_require=require("./utils"),assign=_require.assign,attempt=_require.attempt,fromCallback=_require.fromCallback,Promise=_require.Promise,blacklist=["close","open","error","pong","retry"],concat=[].concat.bind([]),emit=EventEmitter.prototype.emit;ConnectionError.prototype=Object.create(Error.prototype),TimeoutError.prototype=Object.create(Error.prototype),NoProcedureError.prototype=Object.create(Error.prototype);var Ack=function(){function e(t,n,r){var o=this;_classCallCheck(this,e),this.id=t,this.promise=new Promise(function(e,t){o.resolve=e,o.reject=t}),this.cb=r,this.timeout=setTimeout(function(){return o.forceNack(new TimeoutError(t))},n)}return _createClass(e,[{key:"forceNack",value:function(e){clearTimeout(this.timeout),this.cb(),this.reject(e)}},{key:"settle",value:function(e){clearTimeout(this.timeout),this.cb(),e.hasOwnProperty("error")?this.reject(e.error):this.resolve(e.result)}}]),e}(),retryConfig={factor:2,maxTimeout:1/0,minTimeout:1e3,randomize:!0,retries:10},defaults={ackTimeout:2e4,auth:{},autoReconnect:!0,autoReconnectOptions:retryConfig,binaryType:"arraybuffer",decoder:JSON.parse,encoder:JSON.stringify,errorFormatter:String,pingInterval:1e4,pingTimeout:5e3,protocols:"ws-messaging",receiveHook:null,skipValidation:!1},Client=function(e){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};_classCallCheck(this,t);var r=_possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return r.url=e,r.id,assign(r,defaults,n),r.retryConfig={},assign(r.retryConfig,retryConfig,n.autoReconnectOptions),r.WebSocket||(r.WebSocket=WebSocket,r.w3c=!0),r.connected=!1,r.counter=1,r.data={},r.handlers={},r.pendingAcks={},r.attempt=0,r.terminated=!1,r.register("ping",function(){return Promise.resolve()}),r.reconnect(),r}return _inherits(t,e),_createClass(t,[{key:"_onMessage",value:function(e){var t=this,n=void 0;attempt(function(){return t.decoder(e.data)}).then(function(e){n=e}).then(function(){t.skipValidation||validate(n)}).then(function(){t.receiveHook&&t.receiveHook(n)}).then(function(){return t._dispatch(n)}).catch(function(e){return t.send("preprocessingError",t.errorFormatter(e))})}},{key:"_setEvents",value:function(){this.socket.onopen=emit.bind(this,"open"),this.socket.onerror=emit.bind(this,"error"),this.socket.onclose=this._onClose.bind(this),this.socket.onmessage=this._onMessage.bind(this)}},{key:"_ping",value:function(){var e=this;this.pingTimeoutId=setTimeout(function(){emit.call(e,"ping");var t=e.pingTimeout,n=e._makeMessage("ping",[],!0,t),r=n.message,o=n.promise;e._send(r).then(function(){return o}).then(function(){return emit.call(e,"pong")}).then(function(){return e._ping()}).catch(function(){return e.close(4008,"Ping timeout",!1)})},this.pingInterval)}},{key:"_isOpen",value:function(){return this.socket&&(0===this.socket.readyState||1===this.socket.readyState)}},{key:"_reconnect",value:function(){var e=this.retryConfig,t=e.factor,n=e.maxTimeout,r=e.minTimeout,o=e.randomize,i=e.retries;if(!(this.attempt>=i||this.terminated)){var s=1+(o?Math.random():0),c=Math.min(s*r*Math.pow(t,this.attempt),n);this.reconnectTimeoutId=setTimeout(this.reconnect.bind(this),c),this.attempt++}}},{key:"_open",value:function(){var e=this;clearTimeout(this.reconnectTimeoutId),this.socket=new this.WebSocket(this.url,this.protocols),this.w3c&&(this.socket.binaryType=this.binaryType),this.connectHandler=function(){e.connected=!0,e.attempt=0,clearTimeout(e.authTimeoutId),e._ping()},this.openHandler=function(){e._send(e.auth),e.authTimeoutId=setTimeout(e.close.bind(e,4008,"Auth timeout",!1),e.ackTimeout),e.once("connect",e.connectHandler)},this.once("open",this.openHandler),this._setEvents(),this.attempt>0&&emit.call(this,"retry",this.attempt-1)}},{key:"_onClose",value:function(e){this.connected=!1,clearTimeout(this.pingTimeoutId),clearTimeout(this.authTimeoutId),clearTimeout(this.reconnectTimeoutId),this.off("connect",this.connectHandler),this.off("open",this.openHandler),4003!==e.code&&this.url||(this.terminated=!0);for(var t in this.pendingAcks)if(this.pendingAcks.hasOwnProperty(t)){var n=this.pendingAcks[t];n.forceNack(new ConnectionError(t))}this.pendingAcks={},!this.terminated&&this.autoReconnect&&this._reconnect(),emit.call(this,"close",e)}},{key:"_makeMessage",value:function(e,t,n){var r=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:this.ackTimeout,i=void 0,s=void 0;return s={name:e,args:t},n&&!function(){var e=r.counter++,t=new Ack(e,o,function(){return delete r.pendingAcks[e]});r.pendingAcks[e]=t,i=t.promise,s.id=e}(),{message:s,promise:i}}},{key:"_dispatch",value:function(e){var t=this;if(e.name){if(isBlacklistedEvent(e.name))return;if("connect"===e.name&&this.connected)return;e.id?!function(){var n=e.id,r=getOwnProp(t.handlers,e.name);if(r)attempt(function(){return r.apply(null,e.args)}).then(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return t._send({id:n,result:e})}).catch(function(e){return t._send({id:n,error:t.errorFormatter(e)})});else{var o=t.errorFormatter(new NoProcedureError(e.name));t._send({id:n,error:o})}}():emit.apply(this,concat(e.name,e.args))}else{var n=this.pendingAcks[e.id];n&&n.settle(e)}}},{key:"_send",value:function(e){var t=this;return attempt(function(){return t.encoder(e)}).then(function(e){if(t.w3c)return t.socket.send(e);var n=function(){var n="string"!=typeof e;return{v:fromCallback(function(r){return t.socket.send(e,{binary:n},r)})}}();return"object"===("undefined"==typeof n?"undefined":_typeof(n))?n.v:void 0})}},{key:"send",value:function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];var o=this._makeMessage(e,n,!1),i=o.message;return this._send(i)}},{key:"invoke",value:function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];var o=this._makeMessage(e,n,!0),i=o.message,s=o.promise;return this._send(i).then(function(){return s})}},{key:"register",value:function(e,t){if(getOwnProp(this.handlers,e))throw new Error("Can't register a duplicate RPC handler for "+e);this.handlers[e]=t}},{key:"reconnect",value:function(){if(this.terminated=!1,!this._isOpen()){if(!this.WebSocket||!this.url)throw new Error("Malformed configuration options");this._open()}}},{key:"close",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1e3,t=arguments[1],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];this.terminated||(this.terminated=n,this._isOpen()&&this.socket.close(e,t))}}]),t}(EventEmitter);Client.prototype.emit=Client.prototype.send,Client.ConnectionError=ConnectionError,Client.NoProcedureError=NoProcedureError,Client.TimeoutError=TimeoutError,module.exports=Client;
"use strict";function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function isBlacklistedEvent(e){return blacklist.indexOf(e)>=0}function getOwnProp(e,t){return e.hasOwnProperty(t)?e[t]:void 0}function ConnectionError(e){this.name="ConnectionError",this.id=e}function TimeoutError(e){this.name="TimeoutError",this.id=e}function NoProcedureError(e){this.name="NoProcedureError",this.procedure=e}function validateId(e){return"number"==typeof e&&e%1===0&&e>0}function validate(e){var t=!1;if(e instanceof Object)if(e.name){if("string"==typeof e.name&&e.args instanceof Array){var n=Object.keys(e).length;(2===n||3===n&&validateId(e.id))&&(t=!0)}}else{var r=Object.keys(e).length;2===r&&validateId(e.id)&&(e.hasOwnProperty("error")||e.hasOwnProperty("result"))&&(t=!0)}if(!t)throw new Error("Validation error")}var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_createClass=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),EventEmitter=require("eventemitter3"),_require=require("./utils"),assign=_require.assign,attempt=_require.attempt,fromCallback=_require.fromCallback,Promise=_require.Promise,blacklist=["close","open","error","pong","retry"],concat=[].concat.bind([]),emit=EventEmitter.prototype.emit;ConnectionError.prototype=Object.create(Error.prototype),TimeoutError.prototype=Object.create(Error.prototype),NoProcedureError.prototype=Object.create(Error.prototype);var Ack=function(){function e(t,n,r){var o=this;_classCallCheck(this,e),this.id=t,this.promise=new Promise(function(e,t){o.resolve=e,o.reject=t}),this.cb=r,this.timeout=setTimeout(function(){return o.forceNack(new TimeoutError(t))},n)}return _createClass(e,[{key:"forceNack",value:function(e){clearTimeout(this.timeout),this.cb(),this.reject(e)}},{key:"settle",value:function(e){clearTimeout(this.timeout),this.cb(),e.hasOwnProperty("error")?this.reject(e.error):this.resolve(e.result)}}]),e}(),retryConfig={factor:2,maxTimeout:1/0,minTimeout:1e3,randomize:!0,retries:10},defaults={ackTimeout:2e4,auth:{},autoReconnect:!0,autoReconnectOptions:retryConfig,binaryType:"arraybuffer",decoder:JSON.parse,encoder:JSON.stringify,errorFormatter:String,pingInterval:1e4,pingTimeout:5e3,protocols:"ws-messaging",receiveHook:null,skipValidation:!1,WebSocket:void 0,w3c:void 0},Client=function(e){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};_classCallCheck(this,t);var r=_possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return r.url=e,r.id,assign(r,defaults,n),r.retryConfig={},assign(r.retryConfig,retryConfig,n.autoReconnectOptions),r.WebSocket||(r.WebSocket=WebSocket,r.w3c=void 0===r.w3c||r.w3c),r.connected=!1,r.counter=1,r.data={},r.handlers={},r.pendingAcks={},r.attempt=0,r.terminated=!1,r.register("ping",function(){return Promise.resolve()}),r.reconnect(),r}return _inherits(t,e),_createClass(t,[{key:"_onMessage",value:function(e){var t=this,n=void 0;attempt(function(){return t.decoder(e.data)}).then(function(e){n=e}).then(function(){t.skipValidation||validate(n)}).then(function(){t.receiveHook&&t.receiveHook(n)}).then(function(){return t._dispatch(n)}).catch(function(e){return t.send("preprocessingError",t.errorFormatter(e))})}},{key:"_setEvents",value:function(){this.socket.onopen=emit.bind(this,"open"),this.socket.onerror=emit.bind(this,"error"),this.socket.onclose=this._onClose.bind(this),this.socket.onmessage=this._onMessage.bind(this)}},{key:"_ping",value:function(){var e=this;this.pingTimeoutId=setTimeout(function(){emit.call(e,"ping");var t=e.pingTimeout,n=e._makeMessage("ping",[],!0,t),r=n.message,o=n.promise;e._send(r).then(function(){return o}).then(function(){return emit.call(e,"pong")}).then(function(){return e._ping()}).catch(function(){return e.close(4008,"Ping timeout",!1)})},this.pingInterval)}},{key:"_isOpen",value:function(){return this.socket&&(0===this.socket.readyState||1===this.socket.readyState)}},{key:"_reconnect",value:function(){var e=this.retryConfig,t=e.factor,n=e.maxTimeout,r=e.minTimeout,o=e.randomize,i=e.retries;if(!(this.attempt>=i||this.terminated)){var s=1+(o?Math.random():0),c=Math.min(s*r*Math.pow(t,this.attempt),n);this.reconnectTimeoutId=setTimeout(this.reconnect.bind(this),c),this.attempt++}}},{key:"_open",value:function(){var e=this;clearTimeout(this.reconnectTimeoutId),this.socket=new this.WebSocket(this.url,this.protocols),this.w3c&&(this.socket.binaryType=this.binaryType),this.connectHandler=function(){e.connected=!0,e.attempt=0,clearTimeout(e.authTimeoutId),e._ping()},this.openHandler=function(){e._send(e.auth),e.authTimeoutId=setTimeout(e.close.bind(e,4008,"Auth timeout",!1),e.ackTimeout),e.once("connect",e.connectHandler)},this.once("open",this.openHandler),this._setEvents(),this.attempt>0&&emit.call(this,"retry",this.attempt-1)}},{key:"_onClose",value:function(e){this.connected=!1,clearTimeout(this.pingTimeoutId),clearTimeout(this.authTimeoutId),clearTimeout(this.reconnectTimeoutId),this.off("connect",this.connectHandler),this.off("open",this.openHandler),4003!==e.code&&this.url||(this.terminated=!0);for(var t in this.pendingAcks)if(this.pendingAcks.hasOwnProperty(t)){var n=this.pendingAcks[t];n.forceNack(new ConnectionError(t))}this.pendingAcks={},!this.terminated&&this.autoReconnect&&this._reconnect(),emit.call(this,"close",e)}},{key:"_makeMessage",value:function(e,t,n){var r=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:this.ackTimeout,i=void 0,s=void 0;return s={name:e,args:t},n&&!function(){var e=r.counter++,t=new Ack(e,o,function(){return delete r.pendingAcks[e]});r.pendingAcks[e]=t,i=t.promise,s.id=e}(),{message:s,promise:i}}},{key:"_dispatch",value:function(e){var t=this;if(e.name){if(isBlacklistedEvent(e.name))return;if("connect"===e.name&&this.connected)return;e.id?!function(){var n=e.id,r=getOwnProp(t.handlers,e.name);if(r)attempt(function(){return r.apply(null,e.args)}).then(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return t._send({id:n,result:e})}).catch(function(e){return t._send({id:n,error:t.errorFormatter(e)})});else{var o=t.errorFormatter(new NoProcedureError(e.name));t._send({id:n,error:o})}}():emit.apply(this,concat(e.name,e.args))}else{var n=this.pendingAcks[e.id];n&&n.settle(e)}}},{key:"_send",value:function(e){var t=this;return attempt(function(){return t.encoder(e)}).then(function(e){if(t.w3c)return t.socket.send(e);var n=function(){var n="string"!=typeof e;return{v:fromCallback(function(r){return t.socket.send(e,{binary:n},r)})}}();return"object"===("undefined"==typeof n?"undefined":_typeof(n))?n.v:void 0})}},{key:"send",value:function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];var o=this._makeMessage(e,n,!1),i=o.message;return this._send(i)}},{key:"invoke",value:function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];var o=this._makeMessage(e,n,!0),i=o.message,s=o.promise;return this._send(i).then(function(){return s})}},{key:"register",value:function(e,t){if(getOwnProp(this.handlers,e))throw new Error("Can't register a duplicate RPC handler for "+e);this.handlers[e]=t}},{key:"reconnect",value:function(){if(this.terminated=!1,!this._isOpen()){if(!this.WebSocket||!this.url)throw new Error("Malformed configuration options");this._open()}}},{key:"close",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1e3,t=arguments[1],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];this.terminated||(this.terminated=n,this._isOpen()&&this.socket.close(e,t))}}]),t}(EventEmitter);Client.prototype.emit=Client.prototype.send,Client.ConnectionError=ConnectionError,Client.NoProcedureError=NoProcedureError,Client.TimeoutError=TimeoutError,module.exports=Client;
},{"./utils":2,"eventemitter3":3}],2:[function(require,module,exports){
"use strict";function assign(r){for(var t=1;t<arguments.length;t++){var e=arguments[t];if(e)for(var o in e)e.hasOwnProperty(o)&&(r[o]=e[o])}return r}function attempt(r){return Promise.resolve().then(r)}function fromCallback(r){return new Promise(function(t,e){r(function(r,o){r?e(r):t(o)})})}function toEmit(r){return function(t){t?r.emit("error",t):r.emit("ready")}}var Promise=require("promise-polyfill");module.exports={assign:assign,attempt:attempt,fromCallback:fromCallback,toEmit:toEmit,Promise:Promise};
"use strict";function assign(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];if(t)for(var n in t)t.hasOwnProperty(n)&&(r[n]=t[n])}return r}function attempt(r){return Promise.resolve().then(r)}function fromCallback(r){return new Promise(function(e,t){r(function(r,n){r?t(r):e(n)})})}var Promise=require("promise-polyfill");module.exports={assign:assign,attempt:attempt,fromCallback:fromCallback,Promise:Promise};

@@ -7,0 +7,0 @@ },{"promise-polyfill":4}],3:[function(require,module,exports){

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc