emitter-pubsub-broker
Advanced tools
Comparing version 0.3.0 to 0.4.0
@@ -5,2 +5,17 @@ # Change Log | ||
<a name="0.4.0"></a> | ||
# [0.4.0](https://github.com/an-sh/emitter-pubsub-broker/compare/v0.3.0...v0.4.0) (2016-11-29) | ||
### Chores | ||
* use es2015-node4 preset ([5e05222](https://github.com/an-sh/emitter-pubsub-broker/commit/5e05222)) | ||
### BREAKING CHANGES | ||
* Possible node 4.x regression due to the preset change. | ||
<a name="0.3.0"></a> | ||
@@ -7,0 +22,0 @@ # [0.3.0](https://github.com/an-sh/emitter-pubsub-broker/compare/v0.2.1...v0.3.0) (2016-10-21) |
'use strict'; | ||
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray'); | ||
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } } | ||
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); | ||
const Promise = require('bluebird'); | ||
const Redis = require('ioredis'); | ||
const msgpack = require('msgpack-lite'); | ||
var _getIterator2 = require('babel-runtime/core-js/get-iterator'); | ||
var _getIterator3 = _interopRequireDefault(_getIterator2); | ||
var _set = require('babel-runtime/core-js/set'); | ||
var _set2 = _interopRequireDefault(_set); | ||
var _map = require('babel-runtime/core-js/map'); | ||
var _map2 = _interopRequireDefault(_map); | ||
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); | ||
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); | ||
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); | ||
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); | ||
var _createClass2 = require('babel-runtime/helpers/createClass'); | ||
var _createClass3 = _interopRequireDefault(_createClass2); | ||
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); | ||
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); | ||
var _inherits2 = require('babel-runtime/helpers/inherits'); | ||
var _inherits3 = _interopRequireDefault(_inherits2); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
var Promise = require('bluebird'); | ||
var Redis = require('ioredis'); | ||
var msgpack = require('msgpack-lite'); | ||
var _require = require('eventemitter3'); | ||
var EventEmitter = _require.EventEmitter; | ||
const EventEmitter = _require.EventEmitter; | ||
@@ -107,85 +71,57 @@ /** | ||
var RedisConnector = function (_EventEmitter) { | ||
(0, _inherits3.default)(RedisConnector, _EventEmitter); | ||
class RedisConnector extends EventEmitter { | ||
constructor(options) { | ||
super(); | ||
this.pub = new Redis(options); | ||
this.sub = new Redis(options); | ||
this.sub.subscribe().catchReturn(); | ||
this.sub.on('messageBuffer', this._onMessage.bind(this)); | ||
this.sub.on('error', this.emit.bind(this)); | ||
this.pub.on('error', this.emit.bind(this)); | ||
} | ||
function RedisConnector(options) { | ||
(0, _classCallCheck3.default)(this, RedisConnector); | ||
_onMessage(buf, data) { | ||
let ch = buf.toString(); | ||
this.emit('message', ch, data); | ||
} | ||
var _this = (0, _possibleConstructorReturn3.default)(this, (RedisConnector.__proto__ || (0, _getPrototypeOf2.default)(RedisConnector)).call(this)); | ||
publish(ch, data) { | ||
return this.pub.publish(ch, data); | ||
} | ||
_this.pub = new Redis(options); | ||
_this.sub = new Redis(options); | ||
_this.sub.subscribe().catchReturn(); | ||
_this.sub.on('messageBuffer', _this._onMessage.bind(_this)); | ||
_this.sub.on('error', _this.emit.bind(_this)); | ||
_this.pub.on('error', _this.emit.bind(_this)); | ||
return _this; | ||
subscribe(ch) { | ||
return this.sub.subscribe(ch); | ||
} | ||
(0, _createClass3.default)(RedisConnector, [{ | ||
key: '_onMessage', | ||
value: function _onMessage(buf, data) { | ||
var ch = buf.toString(); | ||
this.emit('message', ch, data); | ||
} | ||
}, { | ||
key: 'publish', | ||
value: function publish(ch, data) { | ||
return this.pub.publish(ch, data); | ||
} | ||
}, { | ||
key: 'subscribe', | ||
value: function subscribe(ch) { | ||
return this.sub.subscribe(ch); | ||
} | ||
}, { | ||
key: 'unsubscribe', | ||
value: function unsubscribe(ch) { | ||
return this.sub.unsubscribe(ch); | ||
} | ||
}, { | ||
key: 'close', | ||
value: function close() { | ||
return Promise.all([this.pub.quit(), this.sub.quit()]); | ||
} | ||
}]); | ||
return RedisConnector; | ||
}(EventEmitter); | ||
unsubscribe(ch) { | ||
return this.sub.unsubscribe(ch); | ||
} | ||
var MemoryConnector = function (_EventEmitter2) { | ||
(0, _inherits3.default)(MemoryConnector, _EventEmitter2); | ||
close() { | ||
return Promise.all([this.pub.quit(), this.sub.quit()]); | ||
} | ||
} | ||
function MemoryConnector(options) { | ||
(0, _classCallCheck3.default)(this, MemoryConnector); | ||
return (0, _possibleConstructorReturn3.default)(this, (MemoryConnector.__proto__ || (0, _getPrototypeOf2.default)(MemoryConnector)).call(this)); | ||
class MemoryConnector extends EventEmitter { | ||
constructor(options) { | ||
super(); | ||
} | ||
(0, _createClass3.default)(MemoryConnector, [{ | ||
key: 'publish', | ||
value: function publish(ch, data) { | ||
var _this3 = this; | ||
publish(ch, data) { | ||
return Promise.resolve().then(() => this.emit('message', ch, data)); | ||
} | ||
return Promise.resolve().then(function () { | ||
return _this3.emit('message', ch, data); | ||
}); | ||
} | ||
}, { | ||
key: 'subscribe', | ||
value: function subscribe(ch) { | ||
return Promise.resolve(); | ||
} | ||
}, { | ||
key: 'unsubscribe', | ||
value: function unsubscribe(ch) { | ||
return Promise.resolve(); | ||
} | ||
}, { | ||
key: 'close', | ||
value: function close() { | ||
return Promise.resolve(); | ||
} | ||
}]); | ||
return MemoryConnector; | ||
}(EventEmitter); | ||
subscribe(ch) { | ||
return Promise.resolve(); | ||
} | ||
unsubscribe(ch) { | ||
return Promise.resolve(); | ||
} | ||
close() { | ||
return Promise.resolve(); | ||
} | ||
} | ||
/** | ||
@@ -204,7 +140,3 @@ * @typedef {Object} EmitterPubsubBroker.Options | ||
*/ | ||
var EmitterPubsubBroker = function (_EventEmitter3) { | ||
(0, _inherits3.default)(EmitterPubsubBroker, _EventEmitter3); | ||
class EmitterPubsubBroker extends EventEmitter { | ||
/** | ||
@@ -217,22 +149,19 @@ * Creates a broker. | ||
*/ | ||
function EmitterPubsubBroker(options) { | ||
(0, _classCallCheck3.default)(this, EmitterPubsubBroker); | ||
var _this4 = (0, _possibleConstructorReturn3.default)(this, (EmitterPubsubBroker.__proto__ || (0, _getPrototypeOf2.default)(EmitterPubsubBroker)).call(this)); | ||
constructor(options) { | ||
super(); | ||
if (options == null || typeof options === 'string') { | ||
options = { connect: options }; | ||
} | ||
_this4.prefix = options.prefix || 'emitter-pubsub-broker:'; | ||
_this4.includeChannel = options.includeChannel; | ||
_this4.clientChannels = new _map2.default(); | ||
_this4.channelClients = new _map2.default(); | ||
this.prefix = options.prefix || 'emitter-pubsub-broker:'; | ||
this.includeChannel = options.includeChannel; | ||
this.clientChannels = new Map(); | ||
this.channelClients = new Map(); | ||
if (options.connect || options.connector) { | ||
_this4.connector = options.connector || new RedisConnector(options.connect); | ||
_this4.serialize = true; | ||
this.connector = options.connector || new RedisConnector(options.connect); | ||
this.serialize = true; | ||
} else { | ||
_this4.connector = new MemoryConnector(); | ||
_this4.serialize = false; | ||
this.connector = new MemoryConnector(); | ||
this.serialize = false; | ||
} | ||
_this4.connector.on('message', _this4._dispatch.bind(_this4)); | ||
this.connector.on('message', this._dispatch.bind(this)); | ||
/** | ||
@@ -245,247 +174,177 @@ * Connector error. Does not throw if there are no listeners. | ||
*/ | ||
_this4.connector.on('error', _this4.emit.bind(_this4)); | ||
return _this4; | ||
this.connector.on('error', this.emit.bind(this)); | ||
} | ||
(0, _createClass3.default)(EmitterPubsubBroker, [{ | ||
key: '_channelAddClient', | ||
value: function _channelAddClient(client, ch) { | ||
var clients = this.channelClients.get(ch); | ||
if (clients == null) { | ||
clients = new _set2.default(); | ||
this.channelClients.set(ch, clients); | ||
clients.add(client); | ||
return this.connector.subscribe(ch); | ||
} else { | ||
clients.add(client); | ||
return Promise.resolve(); | ||
} | ||
_channelAddClient(client, ch) { | ||
let clients = this.channelClients.get(ch); | ||
if (clients == null) { | ||
clients = new Set(); | ||
this.channelClients.set(ch, clients); | ||
clients.add(client); | ||
return this.connector.subscribe(ch); | ||
} else { | ||
clients.add(client); | ||
return Promise.resolve(); | ||
} | ||
}, { | ||
key: '_channelRemoveClient', | ||
value: function _channelRemoveClient(client, ch) { | ||
var clients = this.channelClients.get(ch); | ||
var nclients = void 0; | ||
if (clients != null) { | ||
clients.delete(client); | ||
nclients = clients.size; | ||
} | ||
if (nclients === 0) { | ||
return this.connector.unsubscribe(ch); | ||
} else { | ||
return Promise.resolve(); | ||
} | ||
} | ||
_channelRemoveClient(client, ch) { | ||
let clients = this.channelClients.get(ch); | ||
let nclients; | ||
if (clients != null) { | ||
clients.delete(client); | ||
nclients = clients.size; | ||
} | ||
}, { | ||
key: '_makeMessage', | ||
value: function _makeMessage(msg) { | ||
return this.serialize ? msgpack.encode(msg) : msg; | ||
if (nclients === 0) { | ||
return this.connector.unsubscribe(ch); | ||
} else { | ||
return Promise.resolve(); | ||
} | ||
} | ||
/** | ||
* Subscribes emitter to a channel. | ||
* | ||
* @param {EventEmitter} client Emitter. | ||
* @param {string} channel Channel. | ||
* @return {Promise<undefined>} | ||
*/ | ||
_makeMessage(msg) { | ||
return this.serialize ? msgpack.encode(msg) : msg; | ||
} | ||
}, { | ||
key: 'subscribe', | ||
value: function subscribe(client, channel) { | ||
var channels = this.clientChannels.get(client); | ||
if (!channels) { | ||
channels = new _set2.default(); | ||
this.clientChannels.set(client, channels); | ||
} | ||
var ch = this.prefix + channel; | ||
channels.add(ch); | ||
return this._channelAddClient(client, ch); | ||
/** | ||
* Subscribes emitter to a channel. | ||
* | ||
* @param {EventEmitter} client Emitter. | ||
* @param {string} channel Channel. | ||
* @return {Promise<undefined>} | ||
*/ | ||
subscribe(client, channel) { | ||
let channels = this.clientChannels.get(client); | ||
if (!channels) { | ||
channels = new Set(); | ||
this.clientChannels.set(client, channels); | ||
} | ||
let ch = this.prefix + channel; | ||
channels.add(ch); | ||
return this._channelAddClient(client, ch); | ||
} | ||
/** | ||
* Unsubscribes emitter from a channel. | ||
* | ||
* @param {EventEmitter} client Emitter. | ||
* @param {string} channel Channel. | ||
* @return {Promise<undefined>} | ||
*/ | ||
/** | ||
* Unsubscribes emitter from a channel. | ||
* | ||
* @param {EventEmitter} client Emitter. | ||
* @param {string} channel Channel. | ||
* @return {Promise<undefined>} | ||
*/ | ||
unsubscribe(client, channel) { | ||
let channels = this.clientChannels.get(client); | ||
let ch = this.prefix + channel; | ||
if (channels) { | ||
channels.delete(ch); | ||
} | ||
return this._channelRemoveClient(client, ch); | ||
} | ||
}, { | ||
key: 'unsubscribe', | ||
value: function unsubscribe(client, channel) { | ||
var channels = this.clientChannels.get(client); | ||
var ch = this.prefix + channel; | ||
if (channels) { | ||
channels.delete(ch); | ||
} | ||
return this._channelRemoveClient(client, ch); | ||
/** | ||
* Unsubscribes emitter from all channel. | ||
* | ||
* @param {EventEmitter} client Emitter. | ||
* @return {Promise<undefined>} | ||
*/ | ||
unsubscribeall(client) { | ||
let channels = this.clientChannels.get(client); | ||
this.clientChannels.delete(client); | ||
if (channels) { | ||
return Promise.each(channels, this._channelRemoveClient.bind(this, client)); | ||
} else { | ||
return Promise.resolve(); | ||
} | ||
} | ||
/** | ||
* Unsubscribes emitter from all channel. | ||
* | ||
* @param {EventEmitter} client Emitter. | ||
* @return {Promise<undefined>} | ||
*/ | ||
}, { | ||
key: 'unsubscribeall', | ||
value: function unsubscribeall(client) { | ||
var channels = this.clientChannels.get(client); | ||
this.clientChannels.delete(client); | ||
if (channels) { | ||
return Promise.each(channels, this._channelRemoveClient.bind(this, client)); | ||
} else { | ||
return Promise.resolve(); | ||
} | ||
/** | ||
* Publish an event to a channel. | ||
* | ||
* @param {string} channel Channel. | ||
* @param {string} name Event name. | ||
* @param {*} args Arguments. | ||
* @return {Promise<undefined>} | ||
*/ | ||
publish(channel, name) { | ||
for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { | ||
args[_key - 2] = arguments[_key]; | ||
} | ||
/** | ||
* Publish an event to a channel. | ||
* | ||
* @param {string} channel Channel. | ||
* @param {string} name Event name. | ||
* @param {*} args Arguments. | ||
* @return {Promise<undefined>} | ||
*/ | ||
let ch = this.prefix + channel; | ||
let msg = this._makeMessage({ name: name, args: args }); | ||
return this.connector.publish(ch, msg); | ||
} | ||
}, { | ||
key: 'publish', | ||
value: function publish(channel, name) { | ||
for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { | ||
args[_key - 2] = arguments[_key]; | ||
} | ||
var ch = this.prefix + channel; | ||
var msg = this._makeMessage({ name: name, args: args }); | ||
return this.connector.publish(ch, msg); | ||
/** | ||
* Publish an event to a channel, excluding the sender. The client | ||
* object __MUST__ have an unique `id` field. | ||
* | ||
* @param {EventEmitter} client Emitter. | ||
* @param {string} channel Channel. | ||
* @param {string} name Event name. | ||
* @param {*} args Arguments. | ||
* @return {Promise<undefined>} | ||
*/ | ||
send(client, channel, name) { | ||
for (var _len2 = arguments.length, args = Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) { | ||
args[_key2 - 3] = arguments[_key2]; | ||
} | ||
/** | ||
* Publish an event to a channel, excluding the sender. The client | ||
* object __MUST__ have an unique `id` field. | ||
* | ||
* @param {EventEmitter} client Emitter. | ||
* @param {string} channel Channel. | ||
* @param {string} name Event name. | ||
* @param {*} args Arguments. | ||
* @return {Promise<undefined>} | ||
*/ | ||
let ch = this.prefix + channel; | ||
let sender = client.id; | ||
let msg = this._makeMessage({ sender: sender, name: name, args: args }); | ||
return this.connector.publish(ch, msg); | ||
} | ||
}, { | ||
key: 'send', | ||
value: function send(client, channel, name) { | ||
for (var _len2 = arguments.length, args = Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) { | ||
args[_key2 - 3] = arguments[_key2]; | ||
/** | ||
* Returns client subscriptions. | ||
* | ||
* @param {EventEmitter} client Emitter. | ||
* @return {Array<string>} | ||
*/ | ||
getSubscriptions(client) { | ||
let channels = this.clientChannels.get(client); | ||
let res = []; | ||
if (channels) { | ||
let plen = this.prefix.length; | ||
for (let channel of channels) { | ||
res.push(channel.slice(plen)); | ||
} | ||
var ch = this.prefix + channel; | ||
var sender = client.id; | ||
var msg = this._makeMessage({ sender: sender, name: name, args: args }); | ||
return this.connector.publish(ch, msg); | ||
} | ||
return res; | ||
} | ||
/** | ||
* Returns client subscriptions. | ||
* | ||
* @param {EventEmitter} client Emitter. | ||
* @return {Array<string>} | ||
*/ | ||
/** | ||
* Closes broker. | ||
* | ||
* @return {Promise<undefined>} | ||
*/ | ||
close() { | ||
this.channelClients.clear(); | ||
this.clientChannels.clear(); | ||
return this.connector.close(); | ||
} | ||
}, { | ||
key: 'getSubscriptions', | ||
value: function getSubscriptions(client) { | ||
var channels = this.clientChannels.get(client); | ||
var res = []; | ||
if (channels) { | ||
var plen = this.prefix.length; | ||
var _iteratorNormalCompletion = true; | ||
var _didIteratorError = false; | ||
var _iteratorError = undefined; | ||
try { | ||
for (var _iterator = (0, _getIterator3.default)(channels), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | ||
var channel = _step.value; | ||
res.push(channel.slice(plen)); | ||
} | ||
} catch (err) { | ||
_didIteratorError = true; | ||
_iteratorError = err; | ||
} finally { | ||
try { | ||
if (!_iteratorNormalCompletion && _iterator.return) { | ||
_iterator.return(); | ||
} | ||
} finally { | ||
if (_didIteratorError) { | ||
throw _iteratorError; | ||
} | ||
} | ||
_dispatch(ch, data) { | ||
let channel = ch.slice(this.prefix.length); | ||
let message = this.serialize ? msgpack.decode(data) : data; | ||
let clients = this.channelClients.get(ch); | ||
/* istanbul ignore else */ | ||
if (clients) { | ||
let args; | ||
if (this.includeChannel) { | ||
args = [message.name, channel].concat(_toConsumableArray(message.args)); | ||
} else { | ||
args = [message.name].concat(_toConsumableArray(message.args)); | ||
} | ||
for (let client of clients) { | ||
if (!message.sender || client.id !== message.sender) { | ||
client.emit.apply(client, _toConsumableArray(args)); | ||
} | ||
} | ||
return res; | ||
} | ||
} | ||
/** | ||
* Closes broker. | ||
* | ||
* @return {Promise<undefined>} | ||
*/ | ||
} | ||
}, { | ||
key: 'close', | ||
value: function close() { | ||
this.channelClients.clear(); | ||
this.clientChannels.clear(); | ||
return this.connector.close(); | ||
} | ||
}, { | ||
key: '_dispatch', | ||
value: function _dispatch(ch, data) { | ||
var channel = ch.slice(this.prefix.length); | ||
var message = this.serialize ? msgpack.decode(data) : data; | ||
var clients = this.channelClients.get(ch); | ||
/* istanbul ignore else */ | ||
if (clients) { | ||
var args = void 0; | ||
if (this.includeChannel) { | ||
args = [message.name, channel].concat((0, _toConsumableArray3.default)(message.args)); | ||
} else { | ||
args = [message.name].concat((0, _toConsumableArray3.default)(message.args)); | ||
} | ||
var _iteratorNormalCompletion2 = true; | ||
var _didIteratorError2 = false; | ||
var _iteratorError2 = undefined; | ||
try { | ||
for (var _iterator2 = (0, _getIterator3.default)(clients), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | ||
var client = _step2.value; | ||
if (!message.sender || client.id !== message.sender) { | ||
client.emit.apply(client, (0, _toConsumableArray3.default)(args)); | ||
} | ||
} | ||
} catch (err) { | ||
_didIteratorError2 = true; | ||
_iteratorError2 = err; | ||
} finally { | ||
try { | ||
if (!_iteratorNormalCompletion2 && _iterator2.return) { | ||
_iterator2.return(); | ||
} | ||
} finally { | ||
if (_didIteratorError2) { | ||
throw _iteratorError2; | ||
} | ||
} | ||
} | ||
} | ||
} | ||
}]); | ||
return EmitterPubsubBroker; | ||
}(EventEmitter); | ||
module.exports = EmitterPubsubBroker; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9FbWl0dGVyUHVic3ViQnJva2VyLmpzIl0sIm5hbWVzIjpbIlByb21pc2UiLCJyZXF1aXJlIiwiUmVkaXMiLCJtc2dwYWNrIiwiRXZlbnRFbWl0dGVyIiwiUmVkaXNDb25uZWN0b3IiLCJvcHRpb25zIiwicHViIiwic3ViIiwic3Vic2NyaWJlIiwiY2F0Y2hSZXR1cm4iLCJvbiIsIl9vbk1lc3NhZ2UiLCJiaW5kIiwiZW1pdCIsImJ1ZiIsImRhdGEiLCJjaCIsInRvU3RyaW5nIiwicHVibGlzaCIsInVuc3Vic2NyaWJlIiwiYWxsIiwicXVpdCIsIk1lbW9yeUNvbm5lY3RvciIsInJlc29sdmUiLCJ0aGVuIiwiRW1pdHRlclB1YnN1YkJyb2tlciIsImNvbm5lY3QiLCJwcmVmaXgiLCJpbmNsdWRlQ2hhbm5lbCIsImNsaWVudENoYW5uZWxzIiwiY2hhbm5lbENsaWVudHMiLCJjb25uZWN0b3IiLCJzZXJpYWxpemUiLCJfZGlzcGF0Y2giLCJjbGllbnQiLCJjbGllbnRzIiwiZ2V0Iiwic2V0IiwiYWRkIiwibmNsaWVudHMiLCJkZWxldGUiLCJzaXplIiwibXNnIiwiZW5jb2RlIiwiY2hhbm5lbCIsImNoYW5uZWxzIiwiX2NoYW5uZWxBZGRDbGllbnQiLCJfY2hhbm5lbFJlbW92ZUNsaWVudCIsImVhY2giLCJuYW1lIiwiYXJncyIsIl9tYWtlTWVzc2FnZSIsInNlbmRlciIsImlkIiwicmVzIiwicGxlbiIsImxlbmd0aCIsInB1c2giLCJzbGljZSIsImNsZWFyIiwiY2xvc2UiLCJtZXNzYWdlIiwiZGVjb2RlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxVQUFVQyxRQUFRLFVBQVIsQ0FBaEI7QUFDQSxJQUFNQyxRQUFRRCxRQUFRLFNBQVIsQ0FBZDtBQUNBLElBQU1FLFVBQVVGLFFBQVEsY0FBUixDQUFoQjs7ZUFDeUJBLFFBQVEsZUFB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QUFQLEtBQWNRLFFBQVFULE1BQTdDLEVBQXFEO0FBQ25EbEIscUJBQU9yQixJQUFQLGdEQUFlcUMsSUFBZjtBQUNEO0FBQ0Y7QUFYVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBWVo7QUFDRjs7O0VBbk0rQi9DLFk7O0FBdU1sQzRELE9BQU9DLE9BQVAsR0FBaUJ2QyxtQkFBakIiLCJmaWxlIjoiRW1pdHRlclB1YnN1YkJyb2tlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBQcm9taXNlID0gcmVxdWlyZSgnYmx1ZWJpcmQnKVxuY29uc3QgUmVkaXMgPSByZXF1aXJlKCdpb3JlZGlzJylcbmNvbnN0IG1zZ3BhY2sgPSByZXF1aXJlKCdtc2dwYWNrLWxpdGUnKVxuY29uc3QgeyBFdmVudEVtaXR0ZXIgfSA9IHJlcXVpcmUoJ2V2ZW50ZW1pdHRlcjMnKVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgY29ubmVjdG9yIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAaW50ZXJmYWNlIENvbm5lY3RvclxuICogQGV4dGVuZHMgRXZlbnRFbWl0dGVyXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIHB1Ymxpc2hcbiAqIEBtZW1iZXJPZiBDb25uZWN0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIENoYW5uZWwuXG4gKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBEYXRhLlxuICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovXG5cbi8qKlxuICogQG1ldGhvZFxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBzdWJzY3JpYmVcbiAqIEBtZW1iZXJPZiBDb25uZWN0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIENoYW5uZWwuXG4gKiBAcmV0dXJuIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIHVuc3Vic2NyaWJlXG4gKiBAbWVtYmVyT2YgQ29ubmVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCBDaGFubmVsLlxuICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovXG5cbi8qKlxuICogQG1ldGhvZFxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBjbG9zZVxuICogQG1lbWJlck9mIENvbm5lY3RvclxuICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovXG5cbi8qKlxuICogQGV2ZW50IG1lc3NhZ2VcbiAqIEBtZW1iZXJPZiBDb25uZWN0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCBFdmVudCBuYW1lLlxuICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgRXZlbnQgZGF0YS5cbiAqL1xuXG4vKipcbiAqIEV2ZW50IHdpbGwgYmUgbGlzdGVuZWQgYnkge0BsaW5rIEVtaXR0ZXJQdWJzdWJCcm9rZXJ9IGluc3RhbmNlLlxuICpcbiAqIEBldmVudCBlcnJvclxuICogQG1lbWJlck9mIENvbm5lY3RvclxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgRXJyb3IuXG4gKi9cblxuY2xhc3MgUmVkaXNDb25uZWN0b3IgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLnB1YiA9IG5ldyBSZWRpcyhvcHRpb25zKVxuICAgIHRoaXMuc3ViID0gbmV3IFJlZGlzKG9wdGlvbnMpXG4gICAgdGhpcy5zdWIuc3Vic2NyaWJlKCkuY2F0Y2hSZXR1cm4oKVxuICAgIHRoaXMuc3ViLm9uKCdtZXNzYWdlQnVmZmVyJywgdGhpcy5fb25NZXNzYWdlLmJpbmQodGhpcykpXG4gICAgdGhpcy5zdWIub24oJ2Vycm9yJywgdGhpcy5lbWl0LmJpbmQodGhpcykpXG4gICAgdGhpcy5wdWIub24oJ2Vycm9yJywgdGhpcy5lbWl0LmJpbmQodGhpcykpXG4gIH1cblxuICBfb25NZXNzYWdlIChidWYsIGRhdGEpIHtcbiAgICBsZXQgY2ggPSBidWYudG9TdHJpbmcoKVxuICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIGNoLCBkYXRhKVxuICB9XG5cbiAgcHVibGlzaCAoY2gsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5wdWIucHVibGlzaChjaCwgZGF0YSlcbiAgfVxuXG4gIHN1YnNjcmliZSAoY2gpIHtcbiAgICByZXR1cm4gdGhpcy5zdWIuc3Vic2NyaWJlKGNoKVxuICB9XG5cbiAgdW5zdWJzY3JpYmUgKGNoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3ViLnVuc3Vic2NyaWJlKGNoKVxuICB9XG5cbiAgY2xvc2UgKCkge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChbdGhpcy5wdWIucXVpdCgpLCB0aGlzLnN1Yi5xdWl0KCldKVxuICB9XG59XG5cbmNsYXNzIE1lbW9yeUNvbm5lY3RvciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRpb25zKSB7XG4gICAgc3VwZXIoKVxuICB9XG5cbiAgcHVibGlzaCAoY2gsIGRhdGEpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIC50aGVuKCgpID0+IHRoaXMuZW1pdCgnbWVzc2FnZScsIGNoLCBkYXRhKSlcbiAgfVxuXG4gIHN1YnNjcmliZSAoY2gpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgfVxuXG4gIHVuc3Vic2NyaWJlIChjaCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICB9XG5cbiAgY2xvc2UgKCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRW1pdHRlclB1YnN1YkJyb2tlci5PcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbm5lY3QgQ29ubmVjdCBzdHJpbmcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ByZWZpeD0nZW1pdHRlci1wdWJzdWItYnJva2VyOiddIFByZWZpeC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2luY2x1ZGVDaGFubmVsPWZhbHNlXSBJbmNsdWRlIGNoYW5uZWwgYXMgdGhlXG4gKiBmaXJzdCBhcmd1bWVudC5cbiAqIEBwcm9wZXJ0eSB7Q29ubmVjdG9yfSBbY29ubmVjdG9yXSBDdXN0b20gY29ubmVjdG9yIGltcGxlbWVudGF0aW9uLlxuICovXG5cbi8qKlxuICogQGV4dGVuZHMgRXZlbnRFbWl0dGVyXG4gKi9cbmNsYXNzIEVtaXR0ZXJQdWJzdWJCcm9rZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGJyb2tlci5cbiAgICpcbiAgICogQHBhcmFtIHtFbWl0dGVyUHVic3ViQnJva2VyLk9wdGlvbnN8c3RyaW5nfSBvcHRpb25zIE9wdGlvbnMgb3IgYVxuICAgKiBjb25uZWN0IGlmIGEgc3RyaW5nLiBJZiBjb25uZWN0IHN0cmluZyBpcyBlbXB0eSwgdGhlbiBhblxuICAgKiBpbi1tZW1vcnkgY29ubmVjdG9yIGlzIHVzZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgIHN1cGVyKClcbiAgICBpZiAob3B0aW9ucyA9PSBudWxsIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdDogb3B0aW9ucyB9XG4gICAgfVxuICAgIHRoaXMucHJlZml4ID0gb3B0aW9ucy5wcmVmaXggfHwgJ2VtaXR0ZXItcHVic3ViLWJyb2tlcjonXG4gICAgdGhpcy5pbmNsdWRlQ2hhbm5lbCA9IG9wdGlvbnMuaW5jbHVkZUNoYW5uZWxcbiAgICB0aGlzLmNsaWVudENoYW5uZWxzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5jaGFubmVsQ2xpZW50cyA9IG5ldyBNYXAoKVxuICAgIGlmIChvcHRpb25zLmNvbm5lY3QgfHwgb3B0aW9ucy5jb25uZWN0b3IpIHtcbiAgICAgIHRoaXMuY29ubmVjdG9yID0gb3B0aW9ucy5jb25uZWN0b3IgfHwgbmV3IFJlZGlzQ29ubmVjdG9yKG9wdGlvbnMuY29ubmVjdClcbiAgICAgIHRoaXMuc2VyaWFsaXplID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbm5lY3RvciA9IG5ldyBNZW1vcnlDb25uZWN0b3IoKVxuICAgICAgdGhpcy5zZXJpYWxpemUgPSBmYWxzZVxuICAgIH1cbiAgICB0aGlzLmNvbm5lY3Rvci5vbignbWVzc2FnZScsIHRoaXMuX2Rpc3BhdGNoLmJpbmQodGhpcykpXG4gICAgLyoqXG4gICAgICogQ29ubmVjdG9yIGVycm9yLiBEb2VzIG5vdCB0aHJvdyBpZiB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQGV2ZW50IGVycm9yXG4gICAgICogQG1lbWJlck9mIEVtaXR0ZXJQdWJzdWJCcm9rZXJcbiAgICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciBFcnJvci5cbiAgICAgKi9cbiAgICB0aGlzLmNvbm5lY3Rvci5vbignZXJyb3InLCB0aGlzLmVtaXQuYmluZCh0aGlzKSlcbiAgfVxuXG4gIF9jaGFubmVsQWRkQ2xpZW50IChjbGllbnQsIGNoKSB7XG4gICAgbGV0IGNsaWVudHMgPSB0aGlzLmNoYW5uZWxDbGllbnRzLmdldChjaClcbiAgICBpZiAoY2xpZW50cyA9PSBudWxsKSB7XG4gICAgICBjbGllbnRzID0gbmV3IFNldCgpXG4gICAgICB0aGlzLmNoYW5uZWxDbGllbnRzLnNldChjaCwgY2xpZW50cylcbiAgICAgIGNsaWVudHMuYWRkKGNsaWVudClcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5zdWJzY3JpYmUoY2gpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNsaWVudHMuYWRkKGNsaWVudClcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH1cbiAgfVxuXG4gIF9jaGFubmVsUmVtb3ZlQ2xpZW50IChjbGllbnQsIGNoKSB7XG4gICAgbGV0IGNsaWVudHMgPSB0aGlzLmNoYW5uZWxDbGllbnRzLmdldChjaClcbiAgICBsZXQgbmNsaWVudHNcbiAgICBpZiAoY2xpZW50cyAhPSBudWxsKSB7XG4gICAgICBjbGllbnRzLmRlbGV0ZShjbGllbnQpXG4gICAgICBuY2xpZW50cyA9IGNsaWVudHMuc2l6ZVxuICAgIH1cbiAgICBpZiAobmNsaWVudHMgPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci51bnN1YnNjcmliZShjaClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuICB9XG5cbiAgX21ha2VNZXNzYWdlIChtc2cpIHtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemUgPyBtc2dwYWNrLmVuY29kZShtc2cpIDogbXNnXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBlbWl0dGVyIHRvIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IGNsaWVudCBFbWl0dGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCBDaGFubmVsLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gICAqL1xuICBzdWJzY3JpYmUgKGNsaWVudCwgY2hhbm5lbCkge1xuICAgIGxldCBjaGFubmVscyA9IHRoaXMuY2xpZW50Q2hhbm5lbHMuZ2V0KGNsaWVudClcbiAgICBpZiAoIWNoYW5uZWxzKSB7XG4gICAgICBjaGFubmVscyA9IG5ldyBTZXQoKVxuICAgICAgdGhpcy5jbGllbnRDaGFubmVscy5zZXQoY2xpZW50LCBjaGFubmVscylcbiAgICB9XG4gICAgbGV0IGNoID0gdGhpcy5wcmVmaXggKyBjaGFubmVsXG4gICAgY2hhbm5lbHMuYWRkKGNoKVxuICAgIHJldHVybiB0aGlzLl9jaGFubmVsQWRkQ2xpZW50KGNsaWVudCwgY2gpXG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVzIGVtaXR0ZXIgZnJvbSBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBjbGllbnQgRW1pdHRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgQ2hhbm5lbC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICAgKi9cbiAgdW5zdWJzY3JpYmUgKGNsaWVudCwgY2hhbm5lbCkge1xuICAgIGxldCBjaGFubmVscyA9IHRoaXMuY2xpZW50Q2hhbm5lbHMuZ2V0KGNsaWVudClcbiAgICBsZXQgY2ggPSB0aGlzLnByZWZpeCArIGNoYW5uZWxcbiAgICBpZiAoY2hhbm5lbHMpIHtcbiAgICAgIGNoYW5uZWxzLmRlbGV0ZShjaClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5uZWxSZW1vdmVDbGllbnQoY2xpZW50LCBjaClcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgZW1pdHRlciBmcm9tIGFsbCBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gY2xpZW50IEVtaXR0ZXIuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAgICovXG4gIHVuc3Vic2NyaWJlYWxsIChjbGllbnQpIHtcbiAgICBsZXQgY2hhbm5lbHMgPSB0aGlzLmNsaWVudENoYW5uZWxzLmdldChjbGllbnQpXG4gICAgdGhpcy5jbGllbnRDaGFubmVscy5kZWxldGUoY2xpZW50KVxuICAgIGlmIChjaGFubmVscykge1xuICAgICAgcmV0dXJuIFByb21pc2UuZWFjaChcbiAgICAgICAgY2hhbm5lbHMsIHRoaXMuX2NoYW5uZWxSZW1vdmVDbGllbnQuYmluZCh0aGlzLCBjbGllbnQpKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhbiBldmVudCB0byBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIENoYW5uZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEV2ZW50IG5hbWUuXG4gICAqIEBwYXJhbSB7Kn0gYXJncyBBcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAgICovXG4gIHB1Ymxpc2ggKGNoYW5uZWwsIG5hbWUsIC4uLmFyZ3MpIHtcbiAgICBsZXQgY2ggPSB0aGlzLnByZWZpeCArIGNoYW5uZWxcbiAgICBsZXQgbXNnID0gdGhpcy5fbWFrZU1lc3NhZ2Uoe25hbWUsIGFyZ3N9KVxuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5wdWJsaXNoKGNoLCBtc2cpXG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhbiBldmVudCB0byBhIGNoYW5uZWwsIGV4Y2x1ZGluZyB0aGUgc2VuZGVyLiBUaGUgY2xpZW50XG4gICAqIG9iamVjdCBfX01VU1RfXyBoYXZlIGFuIHVuaXF1ZSBgaWRgIGZpZWxkLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gY2xpZW50IEVtaXR0ZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIENoYW5uZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEV2ZW50IG5hbWUuXG4gICAqIEBwYXJhbSB7Kn0gYXJncyBBcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAgICovXG4gIHNlbmQgKGNsaWVudCwgY2hhbm5lbCwgbmFtZSwgLi4uYXJncykge1xuICAgIGxldCBjaCA9IHRoaXMucHJlZml4ICsgY2hhbm5lbFxuICAgIGxldCBzZW5kZXIgPSBjbGllbnQuaWRcbiAgICBsZXQgbXNnID0gdGhpcy5fbWFrZU1lc3NhZ2Uoe3NlbmRlciwgbmFtZSwgYXJnc30pXG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnB1Ymxpc2goY2gsIG1zZylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGNsaWVudCBzdWJzY3JpcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gY2xpZW50IEVtaXR0ZXIuXG4gICAqIEByZXR1cm4ge0FycmF5PHN0cmluZz59XG4gICAqL1xuICBnZXRTdWJzY3JpcHRpb25zIChjbGllbnQpIHtcbiAgICBsZXQgY2hhbm5lbHMgPSB0aGlzLmNsaWVudENoYW5uZWxzLmdldChjbGllbnQpXG4gICAgbGV0IHJlcyA9IFtdXG4gICAgaWYgKGNoYW5uZWxzKSB7XG4gICAgICBsZXQgcGxlbiA9IHRoaXMucHJlZml4Lmxlbmd0aFxuICAgICAgZm9yIChsZXQgY2hhbm5lbCBvZiBjaGFubmVscykge1xuICAgICAgICByZXMucHVzaChjaGFubmVsLnNsaWNlKHBsZW4pKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGJyb2tlci5cbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICAgKi9cbiAgY2xvc2UgKCkge1xuICAgIHRoaXMuY2hhbm5lbENsaWVudHMuY2xlYXIoKVxuICAgIHRoaXMuY2xpZW50Q2hhbm5lbHMuY2xlYXIoKVxuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5jbG9zZSgpXG4gIH1cblxuICBfZGlzcGF0Y2ggKGNoLCBkYXRhKSB7XG4gICAgbGV0IGNoYW5uZWwgPSBjaC5zbGljZSh0aGlzLnByZWZpeC5sZW5ndGgpXG4gICAgbGV0IG1lc3NhZ2UgPSB0aGlzLnNlcmlhbGl6ZSA/IG1zZ3BhY2suZGVjb2RlKGRhdGEpIDogZGF0YVxuICAgIGxldCBjbGllbnRzID0gdGhpcy5jaGFubmVsQ2xpZW50cy5nZXQoY2gpXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoY2xpZW50cykge1xuICAgICAgbGV0IGFyZ3NcbiAgICAgIGlmICh0aGlzLmluY2x1ZGVDaGFubmVsKSB7XG4gICAgICAgIGFyZ3MgPSBbbWVzc2FnZS5uYW1lLCBjaGFubmVsLCAuLi5tZXNzYWdlLmFyZ3NdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcmdzID0gW21lc3NhZ2UubmFtZSwgLi4ubWVzc2FnZS5hcmdzXVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgY2xpZW50IG9mIGNsaWVudHMpIHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLnNlbmRlciB8fCBjbGllbnQuaWQgIT09IG1lc3NhZ2Uuc2VuZGVyKSB7XG4gICAgICAgICAgY2xpZW50LmVtaXQoLi4uYXJncylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG5cbm1vZHVsZS5leHBvcnRzID0gRW1pdHRlclB1YnN1YkJyb2tlclxuIl19 | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9FbWl0dGVyUHVic3ViQnJva2VyLmpzIl0sIm5hbWVzIjpbIlByb21pc2UiLCJyZXF1aXJlIiwiUmVkaXMiLCJtc2dwYWNrIiwiRXZlbnRFbWl0dGVyIiwiUmVkaXNDb25uZWN0b3IiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJwdWIiLCJzdWIiLCJzdWJzY3JpYmUiLCJjYXRjaFJldHVybiIsIm9uIiwiX29uTWVzc2FnZSIsImJpbmQiLCJlbWl0IiwiYnVmIiwiZGF0YSIsImNoIiwidG9TdHJpbmciLCJwdWJsaXNoIiwidW5zdWJzY3JpYmUiLCJjbG9zZSIsImFsbCIsInF1aXQiLCJNZW1vcnlDb25uZWN0b3IiLCJyZXNvbHZlIiwidGhlbiIsIkVtaXR0ZXJQdWJzdWJCcm9rZXIiLCJjb25uZWN0IiwicHJlZml4IiwiaW5jbHVkZUNoYW5uZWwiLCJjbGllbnRDaGFubmVscyIsIk1hcCIsImNoYW5uZWxDbGllbnRzIiwiY29ubmVjdG9yIiwic2VyaWFsaXplIiwiX2Rpc3BhdGNoIiwiX2NoYW5uZWxBZGRDbGllbnQiLCJjbGllbnQiLCJjbGllbnRzIiwiZ2V0IiwiU2V0Iiwic2V0IiwiYWRkIiwiX2NoYW5uZWxSZW1vdmVDbGllbnQiLCJuY2xpZW50cyIsImRlbGV0ZSIsInNpemUiLCJfbWFrZU1lc3NhZ2UiLCJtc2ciLCJlbmNvZGUiLCJjaGFubmVsIiwiY2hhbm5lbHMiLCJ1bnN1YnNjcmliZWFsbCIsImVhY2giLCJuYW1lIiwiYXJncyIsInNlbmQiLCJzZW5kZXIiLCJpZCIsImdldFN1YnNjcmlwdGlvbnMiLCJyZXMiLCJwbGVuIiwibGVuZ3RoIiwicHVzaCIsInNsaWNlIiwiY2xlYXIiLCJtZXNzYWdlIiwiZGVjb2RlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFFQSxNQUFNQSxVQUFVQyxRQUFRLFVBQVIsQ0FBaEI7QUFDQSxNQUFNQyxRQUFRRCxRQUFRLFNBQVIsQ0FBZDtBQUNBLE1BQU1FLFVBQVVG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LElBQWhCLEVBQXNCSixPQUF0Qiw0QkFBa0NnQixRQUFRWCxJQUExQztBQUNELE9BRkQsTUFFTztBQUNMQSxnQkFBUVcsUUFBUVosSUFBaEIsNEJBQXlCWSxRQUFRWCxJQUFqQztBQUNEO0FBQ0QsV0FBSyxJQUFJbEIsTUFBVCxJQUFtQkMsT0FBbkIsRUFBNEI7QUFDMUIsWUFBSSxDQUFDNEIsUUFBUVQsTUFBVCxJQUFtQnBCLE9BQU9xQixFQUFQLEtBQWNRLFFBQVFULE1BQTdDLEVBQXFEO0FBQ25EcEIsaUJBQU94QixJQUFQLGtDQUFlMEMsSUFBZjtBQUNEO0FBQ0Y7QUFDRjtBQUNGOztBQW5NNEM7O0FBdU0vQ2EsT0FBT0MsT0FBUCxHQUFpQjNDLG1CQUFqQiIsImZpbGUiOiJFbWl0dGVyUHVic3ViQnJva2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFByb21pc2UgPSByZXF1aXJlKCdibHVlYmlyZCcpXG5jb25zdCBSZWRpcyA9IHJlcXVpcmUoJ2lvcmVkaXMnKVxuY29uc3QgbXNncGFjayA9IHJlcXVpcmUoJ21zZ3BhY2stbGl0ZScpXG5jb25zdCB7IEV2ZW50RW1pdHRlciB9ID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpXG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBjb25uZWN0b3IgaW1wbGVtZW50YXRpb25zLlxuICpcbiAqIEBpbnRlcmZhY2UgQ29ubmVjdG9yXG4gKiBAZXh0ZW5kcyBFdmVudEVtaXR0ZXJcbiAqL1xuXG4vKipcbiAqIEBtZXRob2RcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgcHVibGlzaFxuICogQG1lbWJlck9mIENvbm5lY3RvclxuICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgQ2hhbm5lbC5cbiAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIERhdGEuXG4gKiBAcmV0dXJuIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIHN1YnNjcmliZVxuICogQG1lbWJlck9mIENvbm5lY3RvclxuICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgQ2hhbm5lbC5cbiAqIEByZXR1cm4ge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2RcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgdW5zdWJzY3JpYmVcbiAqIEBtZW1iZXJPZiBDb25uZWN0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIENoYW5uZWwuXG4gKiBAcmV0dXJuIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIGNsb3NlXG4gKiBAbWVtYmVyT2YgQ29ubmVjdG9yXG4gKiBAcmV0dXJuIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi9cblxuLyoqXG4gKiBAZXZlbnQgbWVzc2FnZVxuICogQG1lbWJlck9mIENvbm5lY3RvclxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IEV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBFdmVudCBkYXRhLlxuICovXG5cbi8qKlxuICogRXZlbnQgd2lsbCBiZSBsaXN0ZW5lZCBieSB7QGxpbmsgRW1pdHRlclB1YnN1YkJyb2tlcn0gaW5zdGFuY2UuXG4gKlxuICogQGV2ZW50IGVycm9yXG4gKiBAbWVtYmVyT2YgQ29ubmVjdG9yXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciBFcnJvci5cbiAqL1xuXG5jbGFzcyBSZWRpc0Nvbm5lY3RvciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRpb25zKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMucHViID0gbmV3IFJlZGlzKG9wdGlvbnMpXG4gICAgdGhpcy5zdWIgPSBuZXcgUmVkaXMob3B0aW9ucylcbiAgICB0aGlzLnN1Yi5zdWJzY3JpYmUoKS5jYXRjaFJldHVybigpXG4gICAgdGhpcy5zdWIub24oJ21lc3NhZ2VCdWZmZXInLCB0aGlzLl9vbk1lc3NhZ2UuYmluZCh0aGlzKSlcbiAgICB0aGlzLnN1Yi5vbignZXJyb3InLCB0aGlzLmVtaXQuYmluZCh0aGlzKSlcbiAgICB0aGlzLnB1Yi5vbignZXJyb3InLCB0aGlzLmVtaXQuYmluZCh0aGlzKSlcbiAgfVxuXG4gIF9vbk1lc3NhZ2UgKGJ1ZiwgZGF0YSkge1xuICAgIGxldCBjaCA9IGJ1Zi50b1N0cmluZygpXG4gICAgdGhpcy5lbWl0KCdtZXNzYWdlJywgY2gsIGRhdGEpXG4gIH1cblxuICBwdWJsaXNoIChjaCwgZGF0YSkge1xuICAgIHJldHVybiB0aGlzLnB1Yi5wdWJsaXNoKGNoLCBkYXRhKVxuICB9XG5cbiAgc3Vic2NyaWJlIChjaCkge1xuICAgIHJldHVybiB0aGlzLnN1Yi5zdWJzY3JpYmUoY2gpXG4gIH1cblxuICB1bnN1YnNjcmliZSAoY2gpIHtcbiAgICByZXR1cm4gdGhpcy5zdWIudW5zdWJzY3JpYmUoY2gpXG4gIH1cblxuICBjbG9zZSAoKSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFt0aGlzLnB1Yi5xdWl0KCksIHRoaXMuc3ViLnF1aXQoKV0pXG4gIH1cbn1cblxuY2xhc3MgTWVtb3J5Q29ubmVjdG9yIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IgKG9wdGlvbnMpIHtcbiAgICBzdXBlcigpXG4gIH1cblxuICBwdWJsaXNoIChjaCwgZGF0YSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5lbWl0KCdtZXNzYWdlJywgY2gsIGRhdGEpKVxuICB9XG5cbiAgc3Vic2NyaWJlIChjaCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICB9XG5cbiAgdW5zdWJzY3JpYmUgKGNoKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gIH1cblxuICBjbG9zZSAoKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBFbWl0dGVyUHVic3ViQnJva2VyLk9wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29ubmVjdCBDb25uZWN0IHN0cmluZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJlZml4PSdlbWl0dGVyLXB1YnN1Yi1icm9rZXI6J10gUHJlZml4LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbaW5jbHVkZUNoYW5uZWw9ZmFsc2VdIEluY2x1ZGUgY2hhbm5lbCBhcyB0aGVcbiAqIGZpcnN0IGFyZ3VtZW50LlxuICogQHByb3BlcnR5IHtDb25uZWN0b3J9IFtjb25uZWN0b3JdIEN1c3RvbSBjb25uZWN0b3IgaW1wbGVtZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAZXh0ZW5kcyBFdmVudEVtaXR0ZXJcbiAqL1xuY2xhc3MgRW1pdHRlclB1YnN1YkJyb2tlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYnJva2VyLlxuICAgKlxuICAgKiBAcGFyYW0ge0VtaXR0ZXJQdWJzdWJCcm9rZXIuT3B0aW9uc3xzdHJpbmd9IG9wdGlvbnMgT3B0aW9ucyBvciBhXG4gICAqIGNvbm5lY3QgaWYgYSBzdHJpbmcuIElmIGNvbm5lY3Qgc3RyaW5nIGlzIGVtcHR5LCB0aGVuIGFuXG4gICAqIGluLW1lbW9yeSBjb25uZWN0b3IgaXMgdXNlZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yIChvcHRpb25zKSB7XG4gICAgc3VwZXIoKVxuICAgIGlmIChvcHRpb25zID09IG51bGwgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBvcHRpb25zID0geyBjb25uZWN0OiBvcHRpb25zIH1cbiAgICB9XG4gICAgdGhpcy5wcmVmaXggPSBvcHRpb25zLnByZWZpeCB8fCAnZW1pdHRlci1wdWJzdWItYnJva2VyOidcbiAgICB0aGlzLmluY2x1ZGVDaGFubmVsID0gb3B0aW9ucy5pbmNsdWRlQ2hhbm5lbFxuICAgIHRoaXMuY2xpZW50Q2hhbm5lbHMgPSBuZXcgTWFwKClcbiAgICB0aGlzLmNoYW5uZWxDbGllbnRzID0gbmV3IE1hcCgpXG4gICAgaWYgKG9wdGlvbnMuY29ubmVjdCB8fCBvcHRpb25zLmNvbm5lY3Rvcikge1xuICAgICAgdGhpcy5jb25uZWN0b3IgPSBvcHRpb25zLmNvbm5lY3RvciB8fCBuZXcgUmVkaXNDb25uZWN0b3Iob3B0aW9ucy5jb25uZWN0KVxuICAgICAgdGhpcy5zZXJpYWxpemUgPSB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29ubmVjdG9yID0gbmV3IE1lbW9yeUNvbm5lY3RvcigpXG4gICAgICB0aGlzLnNlcmlhbGl6ZSA9IGZhbHNlXG4gICAgfVxuICAgIHRoaXMuY29ubmVjdG9yLm9uKCdtZXNzYWdlJywgdGhpcy5fZGlzcGF0Y2guYmluZCh0aGlzKSlcbiAgICAvKipcbiAgICAgKiBDb25uZWN0b3IgZXJyb3IuIERvZXMgbm90IHRocm93IGlmIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgZXJyb3JcbiAgICAgKiBAbWVtYmVyT2YgRW1pdHRlclB1YnN1YkJyb2tlclxuICAgICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIEVycm9yLlxuICAgICAqL1xuICAgIHRoaXMuY29ubmVjdG9yLm9uKCdlcnJvcicsIHRoaXMuZW1pdC5iaW5kKHRoaXMpKVxuICB9XG5cbiAgX2NoYW5uZWxBZGRDbGllbnQgKGNsaWVudCwgY2gpIHtcbiAgICBsZXQgY2xpZW50cyA9IHRoaXMuY2hhbm5lbENsaWVudHMuZ2V0KGNoKVxuICAgIGlmIChjbGllbnRzID09IG51bGwpIHtcbiAgICAgIGNsaWVudHMgPSBuZXcgU2V0KClcbiAgICAgIHRoaXMuY2hhbm5lbENsaWVudHMuc2V0KGNoLCBjbGllbnRzKVxuICAgICAgY2xpZW50cy5hZGQoY2xpZW50KVxuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnN1YnNjcmliZShjaClcbiAgICB9IGVsc2Uge1xuICAgICAgY2xpZW50cy5hZGQoY2xpZW50KVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuICB9XG5cbiAgX2NoYW5uZWxSZW1vdmVDbGllbnQgKGNsaWVudCwgY2gpIHtcbiAgICBsZXQgY2xpZW50cyA9IHRoaXMuY2hhbm5lbENsaWVudHMuZ2V0KGNoKVxuICAgIGxldCBuY2xpZW50c1xuICAgIGlmIChjbGllbnRzICE9IG51bGwpIHtcbiAgICAgIGNsaWVudHMuZGVsZXRlKGNsaWVudClcbiAgICAgIG5jbGllbnRzID0gY2xpZW50cy5zaXplXG4gICAgfVxuICAgIGlmIChuY2xpZW50cyA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnVuc3Vic2NyaWJlKGNoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9XG4gIH1cblxuICBfbWFrZU1lc3NhZ2UgKG1zZykge1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZSA/IG1zZ3BhY2suZW5jb2RlKG1zZykgOiBtc2dcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGVtaXR0ZXIgdG8gYSBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gY2xpZW50IEVtaXR0ZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIENoYW5uZWwuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAgICovXG4gIHN1YnNjcmliZSAoY2xpZW50LCBjaGFubmVsKSB7XG4gICAgbGV0IGNoYW5uZWxzID0gdGhpcy5jbGllbnRDaGFubmVscy5nZXQoY2xpZW50KVxuICAgIGlmICghY2hhbm5lbHMpIHtcbiAgICAgIGNoYW5uZWxzID0gbmV3IFNldCgpXG4gICAgICB0aGlzLmNsaWVudENoYW5uZWxzLnNldChjbGllbnQsIGNoYW5uZWxzKVxuICAgIH1cbiAgICBsZXQgY2ggPSB0aGlzLnByZWZpeCArIGNoYW5uZWxcbiAgICBjaGFubmVscy5hZGQoY2gpXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5uZWxBZGRDbGllbnQoY2xpZW50LCBjaClcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgZW1pdHRlciBmcm9tIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IGNsaWVudCBFbWl0dGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCBDaGFubmVsLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gICAqL1xuICB1bnN1YnNjcmliZSAoY2xpZW50LCBjaGFubmVsKSB7XG4gICAgbGV0IGNoYW5uZWxzID0gdGhpcy5jbGllbnRDaGFubmVscy5nZXQoY2xpZW50KVxuICAgIGxldCBjaCA9IHRoaXMucHJlZml4ICsgY2hhbm5lbFxuICAgIGlmIChjaGFubmVscykge1xuICAgICAgY2hhbm5lbHMuZGVsZXRlKGNoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2hhbm5lbFJlbW92ZUNsaWVudChjbGllbnQsIGNoKVxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlcyBlbWl0dGVyIGZyb20gYWxsIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBjbGllbnQgRW1pdHRlci5cbiAgICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICAgKi9cbiAgdW5zdWJzY3JpYmVhbGwgKGNsaWVudCkge1xuICAgIGxldCBjaGFubmVscyA9IHRoaXMuY2xpZW50Q2hhbm5lbHMuZ2V0KGNsaWVudClcbiAgICB0aGlzLmNsaWVudENoYW5uZWxzLmRlbGV0ZShjbGllbnQpXG4gICAgaWYgKGNoYW5uZWxzKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5lYWNoKFxuICAgICAgICBjaGFubmVscywgdGhpcy5fY2hhbm5lbFJlbW92ZUNsaWVudC5iaW5kKHRoaXMsIGNsaWVudCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIGFuIGV2ZW50IHRvIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgQ2hhbm5lbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgRXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIHsqfSBhcmdzIEFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICAgKi9cbiAgcHVibGlzaCAoY2hhbm5lbCwgbmFtZSwgLi4uYXJncykge1xuICAgIGxldCBjaCA9IHRoaXMucHJlZml4ICsgY2hhbm5lbFxuICAgIGxldCBtc2cgPSB0aGlzLl9tYWtlTWVzc2FnZSh7bmFtZSwgYXJnc30pXG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnB1Ymxpc2goY2gsIG1zZylcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIGFuIGV2ZW50IHRvIGEgY2hhbm5lbCwgZXhjbHVkaW5nIHRoZSBzZW5kZXIuIFRoZSBjbGllbnRcbiAgICogb2JqZWN0IF9fTVVTVF9fIGhhdmUgYW4gdW5pcXVlIGBpZGAgZmllbGQuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBjbGllbnQgRW1pdHRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgQ2hhbm5lbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgRXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIHsqfSBhcmdzIEFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICAgKi9cbiAgc2VuZCAoY2xpZW50LCBjaGFubmVsLCBuYW1lLCAuLi5hcmdzKSB7XG4gICAgbGV0IGNoID0gdGhpcy5wcmVmaXggKyBjaGFubmVsXG4gICAgbGV0IHNlbmRlciA9IGNsaWVudC5pZFxuICAgIGxldCBtc2cgPSB0aGlzLl9tYWtlTWVzc2FnZSh7c2VuZGVyLCBuYW1lLCBhcmdzfSlcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IucHVibGlzaChjaCwgbXNnKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY2xpZW50IHN1YnNjcmlwdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBjbGllbnQgRW1pdHRlci5cbiAgICogQHJldHVybiB7QXJyYXk8c3RyaW5nPn1cbiAgICovXG4gIGdldFN1YnNjcmlwdGlvbnMgKGNsaWVudCkge1xuICAgIGxldCBjaGFubmVscyA9IHRoaXMuY2xpZW50Q2hhbm5lbHMuZ2V0KGNsaWVudClcbiAgICBsZXQgcmVzID0gW11cbiAgICBpZiAoY2hhbm5lbHMpIHtcbiAgICAgIGxldCBwbGVuID0gdGhpcy5wcmVmaXgubGVuZ3RoXG4gICAgICBmb3IgKGxldCBjaGFubmVsIG9mIGNoYW5uZWxzKSB7XG4gICAgICAgIHJlcy5wdXNoKGNoYW5uZWwuc2xpY2UocGxlbikpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgYnJva2VyLlxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gICAqL1xuICBjbG9zZSAoKSB7XG4gICAgdGhpcy5jaGFubmVsQ2xpZW50cy5jbGVhcigpXG4gICAgdGhpcy5jbGllbnRDaGFubmVscy5jbGVhcigpXG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmNsb3NlKClcbiAgfVxuXG4gIF9kaXNwYXRjaCAoY2gsIGRhdGEpIHtcbiAgICBsZXQgY2hhbm5lbCA9IGNoLnNsaWNlKHRoaXMucHJlZml4Lmxlbmd0aClcbiAgICBsZXQgbWVzc2FnZSA9IHRoaXMuc2VyaWFsaXplID8gbXNncGFjay5kZWNvZGUoZGF0YSkgOiBkYXRhXG4gICAgbGV0IGNsaWVudHMgPSB0aGlzLmNoYW5uZWxDbGllbnRzLmdldChjaClcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChjbGllbnRzKSB7XG4gICAgICBsZXQgYXJnc1xuICAgICAgaWYgKHRoaXMuaW5jbHVkZUNoYW5uZWwpIHtcbiAgICAgICAgYXJncyA9IFttZXNzYWdlLm5hbWUsIGNoYW5uZWwsIC4uLm1lc3NhZ2UuYXJnc11cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFyZ3MgPSBbbWVzc2FnZS5uYW1lLCAuLi5tZXNzYWdlLmFyZ3NdXG4gICAgICB9XG4gICAgICBmb3IgKGxldCBjbGllbnQgb2YgY2xpZW50cykge1xuICAgICAgICBpZiAoIW1lc3NhZ2Uuc2VuZGVyIHx8IGNsaWVudC5pZCAhPT0gbWVzc2FnZS5zZW5kZXIpIHtcbiAgICAgICAgICBjbGllbnQuZW1pdCguLi5hcmdzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFbWl0dGVyUHVic3ViQnJva2VyXG4iXX0= |
{ | ||
"name": "emitter-pubsub-broker", | ||
"version": "0.3.0", | ||
"version": "0.4.0", | ||
"private": false, | ||
@@ -35,3 +35,2 @@ "description": "An utility for connecting EventEmitters via a pubsub.", | ||
"dependencies": { | ||
"babel-runtime": "^6.9.2", | ||
"bluebird": "^3.3.5", | ||
@@ -45,4 +44,3 @@ "eventemitter3": "^2.0.2", | ||
"babel-cli": "^6.11.4", | ||
"babel-plugin-transform-runtime": "^6.9.0", | ||
"babel-preset-es2015": "^6.9.0", | ||
"babel-preset-es2015-node4": "^2.1.0", | ||
"chai": "^3.5.0", | ||
@@ -54,3 +52,3 @@ "codecov": "^1.0.1", | ||
"mocha": "^3.0.0", | ||
"nyc": "^8.1.0", | ||
"nyc": "^10.0.0", | ||
"standard": "^8.0.0" | ||
@@ -57,0 +55,0 @@ }, |
@@ -49,3 +49,3 @@ | ||
[API](https://an-sh.github.io/emitter-pubsub-broker/0.3/index.html) | ||
[API](https://an-sh.github.io/emitter-pubsub-broker/0.4/index.html) | ||
documentation is available online. | ||
@@ -52,0 +52,0 @@ |
Sorry, the diff of this file is not supported yet
5
10
48235
765
- Removedbabel-runtime@^6.9.2
- Removedbabel-runtime@6.26.0(transitive)
- Removedcore-js@2.6.12(transitive)
- Removedregenerator-runtime@0.11.1(transitive)