UNPKG

officebot-alerts

Version:

A simple Growl-like alert service for Angular.js apps

201 lines (175 loc) 15.6 kB
(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})({"/Users/andrew/dev/office-bot/andrew-prior-ob-alerts/officebot-alerts/src/alerts.directive.js":[function(require,module,exports){ /** * @name alertsDirective * @desc Simple directive to bind the server and DOM together * @memberof Alerts * @namespace Alerts.Directive * @param {provider} alerts * @returns {this} */ module.exports = function alertsDirective(officebotAlerts) { 'use strict'; 'ngInject'; var tmpl = "<div class='officebot-alerts-container bottom'> \ <div ng-repeat='alert in _alertVM.alerts' class='col-xs-12 col-sm-4 col-sm-offset-8 single-alert' ng-class='{\"done\" : alert.isDone}'> \ <div class='alert alert-dismissible' ng-class='alert.alertClass' role='alert'> \ <strong ng-show='alert.title'>{{alert.title}} </strong>{{alert.message || ''}} \ <button type='button' class='close' ng-click='_alertVM.dismiss(alert)' aria-label='Close'>\ <span aria-hidden='true'></span>\ <i class=\"material-icons close-icon\">close</i>\ </button> \ </div> \ </div>"; // var tmpl = "<div class='officebot-alerts-container bottom'> \ // <div ng-repeat='alert in _alertVM.alerts' class='col-xs-12 col-sm-3 col-sm-offset-9 single-alert' ng-class='{\"done\" : alert.isDone}'> \ // <div class='alert' role='alert'> \ // <strong ng-show='alert.title'>{{alert.title}} </strong>{{alert.message || ''}} \ // </div> \ // </div> \ // </div>"; return { restrict : 'AE', template : tmpl, controller : function($rootScope, $interval) { var vm = this || {}; vm.alerts = []; vm.dismiss = dismiss; $rootScope.$on('alerts.new', onNewAlert); return vm; function dismiss(alert) { alert.isDone = true; } function onNewAlert(event, newAlert) { vm.alerts.push(newAlert); } }, controllerAs : '_alertVM' }; }; },{}],"/Users/andrew/dev/office-bot/andrew-prior-ob-alerts/officebot-alerts/src/alerts.service.js":[function(require,module,exports){ /** * @name alertsService * @desc simple service layer so the rest of our code can talk to our directive * @memberof Alerts * @namespace Alerts.Service * @param {provider} $timeout * @returns {null} */ module.exports = function alertsService($timeout, $rootScope, $window) { 'use strict'; var alerts = []; var defaultTimeout = 3000; //in milliseconds this.info = info; this.success = success; this.warning = warning; this.error = danger; this.danger = danger; this.alert = alert; this.get = get; this.clear = clear; /** * @desc Displays an info message * @memberof Alerts.Service * @param {string} title * @param {string=} message * @param {number=} timeout * @returns {number} Alerts array length */ function info(title, message, timeout) { return alert(title, message, 'alert-info', timeout); } /** * @desc Displays a warning message * @memberof Alerts.Service * @param {string} title * @param {string=} message * @param {number=} timeout * @returns {number} Alerts array length */ function warning(title, message, timeout) { return alert(title, message, 'alert-warning', timeout); } /** * @desc Displays a danger message * @memberof Alerts.Service * @param {string} title * @param {string=} message * @param {number=} timeout * @returns {number} Alerts array length */ function danger(title, message, timeout) { return alert(title, message, 'alert-danger', timeout || 5000); } /** * @desc Displays a success message * @memberof Alerts.Service * @param {string} title * @param {string=} message * @param {number=} timeout * @returns {number} Alerts array length */ function success(title, message, timeout) { return alert(title, message, 'alert-success', timeout); } /** * @desc Displays an alert message * @memberof Alerts.Service * @param {string} title * @param {string=} message * @param {string} class * @param {number=} timeout * @returns {number} Alerts array length */ function alert(title, message, alertClass, timeout ) { var alertTimeout = timeout || defaultTimeout; var newAlert = { "title" : title, "message" : message, "alertClass" : alertClass, "timeout" : alertTimeout, "isDone" : false, "timestamp" : new Date().toString() }; var len = alerts.push(newAlert); //Instead of adding these to the window object, we should create some logging of some kind $rootScope.$emit('alerts.new', newAlert); if (timeout <= 0) { return len; } $timeout(function() { newAlert.isDone = true; }, alertTimeout); return len; } /** * @desc Returns the current alert array * @memberof Alerts.Service * @returns {object[]} alerts */ function get() { return alerts; } /** * @desc Clears the current alert array * @memberof Alerts.Service * @returns {object[]} alerts */ function clear() { alerts = []; return alerts; } }; },{}],"/Users/andrew/dev/office-bot/andrew-prior-ob-alerts/officebot-alerts/src/index.js":[function(require,module,exports){ var angular = require('angular'); var moduleName = 'officebotAlertsModule'; /** * @namespace Alerts * @requires angular */ angular .module(moduleName, []) .service('officebotAlerts', require('./alerts.service.js')) .directive('officebotAlertsPane', require('./alerts.directive.js')); module.exports = moduleName; },{"./alerts.directive.js":"/Users/andrew/dev/office-bot/andrew-prior-ob-alerts/officebot-alerts/src/alerts.directive.js","./alerts.service.js":"/Users/andrew/dev/office-bot/andrew-prior-ob-alerts/officebot-alerts/src/alerts.service.js","angular":"angular"}]},{},["/Users/andrew/dev/office-bot/andrew-prior-ob-alerts/officebot-alerts/src/index.js"]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvYWxlcnRzLmRpcmVjdGl2ZS5qcyIsInNyYy9hbGVydHMuc2VydmljZS5qcyIsInNyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLyoqXG5cdCogQG5hbWUgYWxlcnRzRGlyZWN0aXZlXG5cdCogQGRlc2MgU2ltcGxlIGRpcmVjdGl2ZSB0byBiaW5kIHRoZSBzZXJ2ZXIgYW5kIERPTSB0b2dldGhlclxuXHQqIEBtZW1iZXJvZiBBbGVydHNcblx0KiBAbmFtZXNwYWNlIEFsZXJ0cy5EaXJlY3RpdmVcblx0KiBAcGFyYW0ge3Byb3ZpZGVyfSBhbGVydHNcblx0KiBAcmV0dXJucyB7dGhpc31cblx0Ki9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYWxlcnRzRGlyZWN0aXZlKG9mZmljZWJvdEFsZXJ0cykge1xuXHQndXNlIHN0cmljdCc7XG5cdCduZ0luamVjdCc7XG5cblx0dmFyIHRtcGwgPSBcIjxkaXYgY2xhc3M9J29mZmljZWJvdC1hbGVydHMtY29udGFpbmVyIGJvdHRvbSc+IFxcXG5cdFx0PGRpdiBuZy1yZXBlYXQ9J2FsZXJ0IGluIF9hbGVydFZNLmFsZXJ0cycgY2xhc3M9J2NvbC14cy0xMiBjb2wtc20tNCBjb2wtc20tb2Zmc2V0LTggc2luZ2xlLWFsZXJ0JyBuZy1jbGFzcz0ne1xcXCJkb25lXFxcIiA6IGFsZXJ0LmlzRG9uZX0nPiBcXFxuXHRcdFx0PGRpdiBjbGFzcz0nYWxlcnQgYWxlcnQtZGlzbWlzc2libGUnIG5nLWNsYXNzPSdhbGVydC5hbGVydENsYXNzJyByb2xlPSdhbGVydCc+IFxcXG5cdFx0XHRcdDxzdHJvbmcgbmctc2hvdz0nYWxlcnQudGl0bGUnPnt7YWxlcnQudGl0bGV9fSA8L3N0cm9uZz57e2FsZXJ0Lm1lc3NhZ2UgfHwgJyd9fSBcXFxuXHRcdFx0XHQ8YnV0dG9uIHR5cGU9J2J1dHRvbicgY2xhc3M9J2Nsb3NlJyBuZy1jbGljaz0nX2FsZXJ0Vk0uZGlzbWlzcyhhbGVydCknIGFyaWEtbGFiZWw9J0Nsb3NlJz5cXFxuXHRcdFx0XHRcdDxzcGFuIGFyaWEtaGlkZGVuPSd0cnVlJz48L3NwYW4+XFxcblx0XHRcdFx0XHQ8aSBjbGFzcz1cXFwibWF0ZXJpYWwtaWNvbnMgY2xvc2UtaWNvblxcXCI+Y2xvc2U8L2k+XFxcblx0XHRcdFx0PC9idXR0b24+IFxcXG5cdFx0PC9kaXY+IFxcXG5cdDwvZGl2PlwiO1xuXG5cdC8vIHZhciB0bXBsID0gXCI8ZGl2IGNsYXNzPSdvZmZpY2Vib3QtYWxlcnRzLWNvbnRhaW5lciBib3R0b20nPiBcXFxuXHQvLyBcdDxkaXYgbmctcmVwZWF0PSdhbGVydCBpbiBfYWxlcnRWTS5hbGVydHMnIGNsYXNzPSdjb2wteHMtMTIgY29sLXNtLTMgY29sLXNtLW9mZnNldC05IHNpbmdsZS1hbGVydCcgbmctY2xhc3M9J3tcXFwiZG9uZVxcXCIgOiBhbGVydC5pc0RvbmV9Jz4gXFxcblx0Ly8gXHRcdDxkaXYgY2xhc3M9J2FsZXJ0JyByb2xlPSdhbGVydCc+IFxcXG5cdC8vIFx0XHRcdDxzdHJvbmcgbmctc2hvdz0nYWxlcnQudGl0bGUnPnt7YWxlcnQudGl0bGV9fSA8L3N0cm9uZz57e2FsZXJ0Lm1lc3NhZ2UgfHwgJyd9fSBcXFxuXHQvLyBcdFx0PC9kaXY+IFxcXG5cdC8vIFx0PC9kaXY+IFxcXG5cdC8vIDwvZGl2PlwiO1xuXG5cdHJldHVybiB7XG5cdFx0cmVzdHJpY3QgOiAnQUUnLFxuXHRcdHRlbXBsYXRlIDogdG1wbCxcblx0XHRjb250cm9sbGVyIDogZnVuY3Rpb24oJHJvb3RTY29wZSwgJGludGVydmFsKSB7XG5cdFx0XHR2YXIgdm0gPSB0aGlzIHx8IHt9O1xuXHRcdFx0dm0uYWxlcnRzID0gW107XG5cdFx0XHR2bS5kaXNtaXNzID0gZGlzbWlzcztcblx0XHRcdCRyb290U2NvcGUuJG9uKCdhbGVydHMubmV3Jywgb25OZXdBbGVydCk7XG5cdFx0XHRyZXR1cm4gdm07XG5cblx0XHRcdGZ1bmN0aW9uIGRpc21pc3MoYWxlcnQpIHtcblx0XHRcdFx0YWxlcnQuaXNEb25lID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gb25OZXdBbGVydChldmVudCwgbmV3QWxlcnQpIHtcblx0XHRcdFx0dm0uYWxlcnRzLnB1c2gobmV3QWxlcnQpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Y29udHJvbGxlckFzIDogJ19hbGVydFZNJ1xuXHR9O1xufTtcbiIsIi8qKlxuXHQqIEBuYW1lIGFsZXJ0c1NlcnZpY2Vcblx0KiBAZGVzYyBzaW1wbGUgc2VydmljZSBsYXllciBzbyB0aGUgcmVzdCBvZiBvdXIgY29kZSBjYW4gdGFsayB0byBvdXIgZGlyZWN0aXZlXG5cdCogQG1lbWJlcm9mIEFsZXJ0c1xuXHQqIEBuYW1lc3BhY2UgQWxlcnRzLlNlcnZpY2Vcblx0KiBAcGFyYW0ge3Byb3ZpZGVyfSAkdGltZW91dFxuXHQqIEByZXR1cm5zIHtudWxsfVxuXHQqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhbGVydHNTZXJ2aWNlKCR0aW1lb3V0LCAkcm9vdFNjb3BlLCAkd2luZG93KSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgYWxlcnRzID0gW107XG5cdHZhciBkZWZhdWx0VGltZW91dCA9IDMwMDA7IC8vaW4gbWlsbGlzZWNvbmRzXG5cblx0dGhpcy5pbmZvID0gaW5mbztcblx0dGhpcy5zdWNjZXNzID0gc3VjY2Vzcztcblx0dGhpcy53YXJuaW5nID0gd2FybmluZztcblx0dGhpcy5lcnJvciA9IGRhbmdlcjtcblx0dGhpcy5kYW5nZXIgPSBkYW5nZXI7XG5cdHRoaXMuYWxlcnQgPSBhbGVydDtcblxuXHR0aGlzLmdldCA9IGdldDtcblx0dGhpcy5jbGVhciA9IGNsZWFyO1xuXG5cdC8qKlxuXHRcdCogQGRlc2MgRGlzcGxheXMgYW4gaW5mbyBtZXNzYWdlXG5cdFx0KiBAbWVtYmVyb2YgQWxlcnRzLlNlcnZpY2Vcblx0XHQqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuXHRcdCogQHBhcmFtIHtzdHJpbmc9fSBtZXNzYWdlXG5cdFx0KiBAcGFyYW0ge251bWJlcj19IHRpbWVvdXRcblx0XHQqIEByZXR1cm5zIHtudW1iZXJ9IEFsZXJ0cyBhcnJheSBsZW5ndGhcblx0XHQqL1xuXHRmdW5jdGlvbiBpbmZvKHRpdGxlLCBtZXNzYWdlLCB0aW1lb3V0KSB7XG5cdFx0cmV0dXJuIGFsZXJ0KHRpdGxlLCBtZXNzYWdlLCAnYWxlcnQtaW5mbycsIHRpbWVvdXQpO1xuXHR9XG5cblx0LyoqXG5cdFx0KiBAZGVzYyBEaXNwbGF5cyBhIHdhcm5pbmcgbWVzc2FnZVxuXHRcdCogQG1lbWJlcm9mIEFsZXJ0cy5TZXJ2aWNlXG5cdFx0KiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcblx0XHQqIEBwYXJhbSB7c3RyaW5nPX0gbWVzc2FnZVxuXHRcdCogQHBhcmFtIHtudW1iZXI9fSB0aW1lb3V0XG5cdFx0KiBAcmV0dXJucyB7bnVtYmVyfSBBbGVydHMgYXJyYXkgbGVuZ3RoXG5cdFx0Ki9cblx0ZnVuY3Rpb24gd2FybmluZyh0aXRsZSwgbWVzc2FnZSwgdGltZW91dCkge1xuXHRcdHJldHVybiBhbGVydCh0aXRsZSwgbWVzc2FnZSwgJ2FsZXJ0LXdhcm5pbmcnLCB0aW1lb3V0KTtcblx0fVxuXG5cdC8qKlxuXHRcdCogQGRlc2MgRGlzcGxheXMgYSBkYW5nZXIgbWVzc2FnZVxuXHRcdCogQG1lbWJlcm9mIEFsZXJ0cy5TZXJ2aWNlXG5cdFx0KiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcblx0XHQqIEBwYXJhbSB7c3RyaW5nPX0gbWVzc2FnZVxuXHRcdCogQHBhcmFtIHtudW1iZXI9fSB0aW1lb3V0XG5cdFx0KiBAcmV0dXJucyB7bnVtYmVyfSBBbGVydHMgYXJyYXkgbGVuZ3RoXG5cdFx0Ki9cblx0ZnVuY3Rpb24gZGFuZ2VyKHRpdGxlLCBtZXNzYWdlLCB0aW1lb3V0KSB7XG5cdFx0cmV0dXJuIGFsZXJ0KHRpdGxlLCBtZXNzYWdlLCAnYWxlcnQtZGFuZ2VyJywgdGltZW91dCB8fCA1MDAwKTtcblx0fVxuXG5cdC8qKlxuXHRcdCogQGRlc2MgRGlzcGxheXMgYSBzdWNjZXNzIG1lc3NhZ2Vcblx0XHQqIEBtZW1iZXJvZiBBbGVydHMuU2VydmljZVxuXHRcdCogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG5cdFx0KiBAcGFyYW0ge3N0cmluZz19IG1lc3NhZ2Vcblx0XHQqIEBwYXJhbSB7bnVtYmVyPX0gdGltZW91dFxuXHRcdCogQHJldHVybnMge251bWJlcn0gQWxlcnRzIGFycmF5IGxlbmd0aFxuXHRcdCovXG5cdGZ1bmN0aW9uIHN1Y2Nlc3ModGl0bGUsIG1lc3NhZ2UsIHRpbWVvdXQpIHtcblx0XHRyZXR1cm4gYWxlcnQodGl0bGUsIG1lc3NhZ2UsICdhbGVydC1zdWNjZXNzJywgdGltZW91dCk7XG5cdH1cblxuXHQvKipcblx0XHQqIEBkZXNjIERpc3BsYXlzIGFuIGFsZXJ0IG1lc3NhZ2Vcblx0XHQqIEBtZW1iZXJvZiBBbGVydHMuU2VydmljZVxuXHRcdCogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG5cdFx0KiBAcGFyYW0ge3N0cmluZz19IG1lc3NhZ2Vcblx0XHQqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1xuXHRcdCogQHBhcmFtIHtudW1iZXI9fSB0aW1lb3V0XG5cdFx0KiBAcmV0dXJucyB7bnVtYmVyfSBBbGVydHMgYXJyYXkgbGVuZ3RoXG5cdFx0Ki9cblx0ZnVuY3Rpb24gYWxlcnQodGl0bGUsIG1lc3NhZ2UsIGFsZXJ0Q2xhc3MsIHRpbWVvdXQgKSB7XG5cdFx0dmFyIGFsZXJ0VGltZW91dCA9IHRpbWVvdXQgfHwgZGVmYXVsdFRpbWVvdXQ7XG5cblx0XHR2YXIgbmV3QWxlcnQgPSB7XG5cdFx0XHRcInRpdGxlXCIgOiB0aXRsZSxcblx0XHRcdFwibWVzc2FnZVwiIDogbWVzc2FnZSxcblx0XHRcdFwiYWxlcnRDbGFzc1wiIDogYWxlcnRDbGFzcyxcblx0XHRcdFwidGltZW91dFwiIDogYWxlcnRUaW1lb3V0LFxuXHRcdFx0XCJpc0RvbmVcIiA6IGZhbHNlLFxuXHRcdFx0XCJ0aW1lc3RhbXBcIiA6IG5ldyBEYXRlKCkudG9TdHJpbmcoKVxuXHRcdH07XG5cblx0XHR2YXIgbGVuID0gYWxlcnRzLnB1c2gobmV3QWxlcnQpO1xuXHRcdC8vSW5zdGVhZCBvZiBhZGRpbmcgdGhlc2UgdG8gdGhlIHdpbmRvdyBvYmplY3QsIHdlIHNob3VsZCBjcmVhdGUgc29tZSBsb2dnaW5nIG9mIHNvbWUga2luZFxuXHRcdCRyb290U2NvcGUuJGVtaXQoJ2FsZXJ0cy5uZXcnLCBuZXdBbGVydCk7XG5cblx0XHRpZiAodGltZW91dCA8PSAwKSB7XG5cdFx0XHRyZXR1cm4gbGVuO1xuXHRcdH1cblxuXHRcdCR0aW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdFx0bmV3QWxlcnQuaXNEb25lID0gdHJ1ZTtcblxuXHRcdH0sIGFsZXJ0VGltZW91dCk7XG5cblx0XHRyZXR1cm4gbGVuO1xuXHR9XG5cblx0LyoqXG5cdFx0KiBAZGVzYyBSZXR1cm5zIHRoZSBjdXJyZW50IGFsZXJ0IGFycmF5XG5cdFx0KiBAbWVtYmVyb2YgQWxlcnRzLlNlcnZpY2Vcblx0XHQqIEByZXR1cm5zIHtvYmplY3RbXX0gYWxlcnRzXG5cdFx0Ki9cblx0ZnVuY3Rpb24gZ2V0KCkge1xuXHRcdHJldHVybiBhbGVydHM7XG5cdH1cblxuXHQvKipcblx0XHQqIEBkZXNjIENsZWFycyB0aGUgY3VycmVudCBhbGVydCBhcnJheVxuXHRcdCogQG1lbWJlcm9mIEFsZXJ0cy5TZXJ2aWNlXG5cdFx0KiBAcmV0dXJucyB7b2JqZWN0W119IGFsZXJ0c1xuXHRcdCovXG5cdGZ1bmN0aW9uIGNsZWFyKCkge1xuXHRcdGFsZXJ0cyA9IFtdO1xuXHRcdHJldHVybiBhbGVydHM7XG5cdH1cbn07XG4iLCJ2YXIgYW5ndWxhciA9IHJlcXVpcmUoJ2FuZ3VsYXInKTtcbnZhciBtb2R1bGVOYW1lID0gJ29mZmljZWJvdEFsZXJ0c01vZHVsZSc7XG5cbi8qKlxuXHQqIEBuYW1lc3BhY2UgQWxlcnRzXG5cdCogQHJlcXVpcmVzIGFuZ3VsYXJcblx0Ki9cbmFuZ3VsYXJcblx0Lm1vZHVsZShtb2R1bGVOYW1lLCBbXSlcblx0LnNlcnZpY2UoJ29mZmljZWJvdEFsZXJ0cycsIHJlcXVpcmUoJy4vYWxlcnRzLnNlcnZpY2UuanMnKSlcblx0LmRpcmVjdGl2ZSgnb2ZmaWNlYm90QWxlcnRzUGFuZScsIHJlcXVpcmUoJy4vYWxlcnRzLmRpcmVjdGl2ZS5qcycpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBtb2R1bGVOYW1lOyJdfQ==