| Server IP : 85.158.181.41 / Your IP : 216.73.217.12 Web Server : Apache System : Linux cloud9-vm129 6.1.178+1-ph #ph SMP PREEMPT_DYNAMIC Wed Jul 29 09:00:54 UTC 2026 x86_64 User : moncbefd ( 1024) PHP Version : 7.3.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/moncbefd/www.moneta.at/public/tmp/theme210318125255/javascripts/system/libs/ |
Upload File : |
'use strict';
/* --------------------------------------------------------------
modal.js 2016-07-07
Gambio GmbH
http://www.gambio.de
Copyright (c) 2016 Gambio GmbH
Released under the GNU General Public License (Version 2)
[http://www.gnu.org/licenses/gpl-2.0.html]
--------------------------------------------------------------
*/
jse.libs.theme.modal = jse.libs.theme.modal || {};
/**
* ## Honeygrid Modal Dialogs Library
*
* Library-function to open default modal layer. This function depends on jQuery & jQuery UI.
*
* @module Honeygrid/Libs/modal
* @exports jse.libs.theme.modal
* @ignore
*/
(function (exports) {
'use strict';
var $body = $('body'),
tplStore = [],
extension = null,
// Object for default buttons
buttons = {
yes: {
name: jse.core.lang.translate('yes', 'buttons'),
type: 'success',
class: 'btn-success'
},
no: {
name: jse.core.lang.translate('no', 'buttons'),
type: 'fail',
class: 'btn-default'
},
abort: {
name: jse.core.lang.translate('abort', 'buttons'),
type: 'fail',
class: 'btn-default'
},
ok: {
name: jse.core.lang.translate('ok', 'buttons'),
type: 'success',
class: 'btn-success'
},
close: {
name: jse.core.lang.translate('close', 'buttons'),
type: 'fail',
class: 'btn-default'
}
};
/**
* Function to get all form data stored inside
* the layer
*
* @param {object} $self jQuery selection of the layer
* @return {json} Returns a JSON with all form data
*/
var _getFormData = function _getFormData($self, checkform) {
var $forms = $self.filter('form').add($self.find('form')),
formdata = {},
valid = true,
promises = [];
if ($forms.length) {
$forms.each(function () {
var $form = $(this);
if (checkform) {
var localDeferred = $.Deferred();
promises.push(localDeferred);
$form.trigger('validator.validate', { deferred: localDeferred });
}
formdata[$form.attr('name') || $form.attr('id') || 'form_' + new Date().getTime() * Math.random()] = jse.libs.form.getData($form);
});
}
return $.when.apply(undefined, promises).then(function () {
return formdata;
}, function () {
return formdata;
}).promise();
};
/**
* Function to transform the custom buttons object (which is
* incompatible with jQuery UI) to a jQuery UI compatible format
*
* @param {object} dataset Custom buttons object for the dialog
* @param {promise} deferred deferred-object to resolve / reject on close
* @return {array} Returns a jQuery UI dialog compatible buttons array
*/
var _genButtons = function _genButtons(options, extensionDeferred) {
// Check if buttons are available
if (options.buttons) {
var rejectHandler = extension.getRejectHandler,
resolveHandler = extension.getResolveHandler;
$.each(options.buttons, function (k, v) {
// Setup click handler
options.buttons[k].event = function () {
var $self = $(this);
// If a callback is given, execute it with
// the current scope
if (typeof v.callback === 'function') {
if (!v.callback.apply($self, [])) {
return false;
}
}
// Add the default behaviour
// for the close functionality
// On fail, reject the deferred
// object, else resolve it
switch (v.type) {
case 'fail':
rejectHandler($self, extensionDeferred, _getFormData);
break;
case 'success':
resolveHandler($self, extensionDeferred, _getFormData);
break;
case 'link':
location.href = v.value;
break;
default:
break;
}
};
});
}
};
var _finalizeLayer = function _finalizeLayer($container, options) {
// Prevent submit on enter in inner forms
var $forms = $container.find('form');
if ($forms.length) {
$forms.on('submit', function (e) {
e.preventDefault();
});
}
if (window.gambio && window.gambio.widgets && window.gambio.widgets.init) {
window.gambio.widgets.init($container);
}
};
var _setLayer = function _setLayer(name) {
if (jse.libs.theme.modal[name]) {
extension = jse.libs.theme.modal[name];
} else {
jse.core.debug.error('[MODAL] Can\'t set modal: "' + name + '". Extension doesn\'t exist');
}
};
var _transferOptions = function _transferOptions(options) {
var mapper = extension.getMapper(),
result = {};
$.each(options, function (k, v) {
if (mapper[k] === false) {
return true;
} else if (mapper[k] === undefined) {
result[k] = v;
} else if (typeof mapper[k] === 'function') {
var mapperResult = mapper[k](k, v);
result[mapperResult[0]] = mapperResult[1];
} else {
result[mapper[k]] = v;
}
});
return result;
};
var _getTheme = function _getTheme(options, iframe) {
var $selection = [],
deferred = $.Deferred();
if (options.noTheme) {
deferred.resolve('');
} else if (iframe) {
deferred.resolve('<iframe width="100%" height="100%" frameborder="0" src="' + options.theme + '" />');
} else {
if (options.storeTheme && tplStore[options.theme]) {
deferred.resolve(tplStore[options.theme]);
} else {
try {
$selection = $(options.theme);
} catch (err) {}
if ($selection.length) {
deferred.resolve($selection.html());
} else {
jse.libs.xhr.ajax({ url: options.theme, dataType: 'html' }).done(function (result) {
if (options.sectionSelector) {
result = $(result).find(options.sectionSelector).html();
}
if (options.storeTheme) {
tplStore[options.theme] = result;
}
deferred.resolve(result);
}).fail(function () {
deferred.reject();
});
}
}
}
return deferred;
};
var _createLayer = function _createLayer(options, title, className, defbuttons, theme) {
// Setup defaults & deferred objects
var deferred = $.Deferred(),
promise = deferred.promise(),
iframe = theme === 'iframe',
defaults = {
title: title,
dialogClass: className,
modal: true,
buttons: defbuttons || [],
closeOnEscape: true,
theme: theme || null,
storeTheme: false,
closeX: true,
closeOnOuter: true
},
instance = null,
$forms = null,
extensionDeferred = $.Deferred();
// Merge custom settings with default settings
options = options || {};
options = $.extend({}, defaults, options);
var tplRequest = _getTheme(options, iframe).done(function (result) {
extensionDeferred.done(function (result) {
deferred.resolve(result);
}).fail(function (result) {
deferred.reject(result);
});
// Generate theme
options.theme = $(Mustache.render(result, options));
jse.libs.theme.helpers.setupWidgetAttr(options.theme);
options.theme = $('<div>').append(options.theme.clone()).html();
// Generate default button object
_genButtons(options, extensionDeferred);
// Transfer options object to extension option object
var originalOptions = $.extend({}, options);
options = _transferOptions(options);
// Call extension
extension.openLayer(options, extensionDeferred, _getFormData, originalOptions);
// Passthrough of the close method of the layer
// to the layer caller
promise.close = function (success) {
extensionDeferred.close(success);
};
}).fail(function () {
deferred.reject({ error: 'Theme not found' });
});
// Temporary close handler if the upper
// deferred isn't finished now. It will be
// overwritten after the layer opens
if (!promise.close) {
promise.close = function () {
tplRequest.reject('Closed after opening');
};
}
return promise;
};
/**
* Shortcut function for an alert-layer
* @param {object} options Options that are passed to the modal layer
* @return {promise} Returns a promise
*/
var _alert = function _alert(options) {
return _createLayer(options, jse.core.lang.translate('hint', 'labels'), '', [buttons.close], '#modal_alert');
};
/**
* Shortcut function for an confirm-layer
* @param {object} options Options that are passed to the modal layer
* @return {promise} Returns a promise
*/
var _confirm = function _confirm(options) {
return _createLayer(options, jse.core.lang.translate('confirm', 'labels'), 'confirm_dialog', [buttons.yes, buttons.no], '#modal_alert');
};
/**
* Shortcut function for a prompt-layer
* @param {object} options Options that are passed to the modal layer
* @return {promise} Returns a promise
*/
var _prompt = function _prompt(options) {
return _createLayer(options, jse.core.lang.translate('prompt', 'labels'), 'prompt_dialog', [buttons.ok, buttons.abort], '#modal_prompt');
};
/**
* Shortcut function for an success-layer
* @param {object} options Options that are passed to the modal layer
* @return {promise} Returns a promise
*/
var _success = function _success(options) {
return _createLayer(options, jse.core.lang.translate('success', 'labels'), 'success_dialog', [], '#modal_alert');
};
/**
* Shortcut function for an error-layer
* @param {object} options Options that are passed to the modal layer
* @return {promise} Returns a promise
*/
var _error = function _error(options) {
return _createLayer(options, jse.core.lang.translate('errors', 'labels'), 'error_dialog', [], '#modal_alert');
};
/**
* Shortcut function for a warning-layer
* @param {object} options Options that are passed to the modal layer
* @return {promise} Returns a promise
*/
var _warn = function _warn(options) {
return _createLayer(options, jse.core.lang.translate('warning', 'labels'), 'warn_dialog', [], '#modal_alert');
};
/**
* Shortcut function for an info-layer
* @param {object} options Options that are passed to the modal layer
* @return {promise} Returns a promise
*/
var _info = function _info(options) {
return _createLayer(options, jse.core.lang.translate('info', 'labels'), 'info_dialog', [], '#modal_alert');
};
/**
* Shortcut function for an iframe-layer
* @param {object} options Options that are passed to the modal layer
* @return {promise} Returns a promise
*/
var _iframe = function _iframe(options) {
if (options.convertModal) {
jse.libs.theme.modal[options.convertModal](options, jse.core.lang.translate('info', 'labels'), options.convertModal + '_dialog', [], '#modal_alert');
return;
}
return _createLayer(options, jse.core.lang.translate('info', 'labels'), 'iframe_layer', [], 'iframe');
};
// ########## VARIABLE EXPORT ##########
exports.error = _error;
exports.warn = _warn;
exports.info = _info;
exports.success = _success;
exports.alert = _alert;
exports.prompt = _prompt;
exports.confirm = _confirm;
exports.iframe = _iframe;
exports.custom = _createLayer;
exports.setLayer = _setLayer;
exports.finalizeLayer = _finalizeLayer;
// Set default layer.
var currentTimestamp = Date.now,
lifetime = 10000; // 10 sec
extension = jse.core.registry.get('mainModalLayer');
var intv = setInterval(function () {
if (jse.libs.theme.modal[extension] !== undefined) {
_setLayer(extension);
clearInterval(intv);
}
if (Date.now - currentTimestamp > lifetime) {
throw new Error('Modal extension was not loaded: ' + extension);
}
}, 300);
})(jse.libs.theme.modal);
jse.libs.template = jse.libs.template || {};
jse.libs.template.modal = jse.libs.theme.modal;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYnMvbW9kYWwuanMiXSwibmFtZXMiOlsianNlIiwibGlicyIsInRoZW1lIiwibW9kYWwiLCJleHBvcnRzIiwiJGJvZHkiLCIkIiwidHBsU3RvcmUiLCJleHRlbnNpb24iLCJidXR0b25zIiwieWVzIiwibmFtZSIsImNvcmUiLCJsYW5nIiwidHJhbnNsYXRlIiwidHlwZSIsImNsYXNzIiwibm8iLCJhYm9ydCIsIm9rIiwiY2xvc2UiLCJfZ2V0Rm9ybURhdGEiLCIkc2VsZiIsImNoZWNrZm9ybSIsIiRmb3JtcyIsImZpbHRlciIsImFkZCIsImZpbmQiLCJmb3JtZGF0YSIsInZhbGlkIiwicHJvbWlzZXMiLCJsZW5ndGgiLCJlYWNoIiwiJGZvcm0iLCJsb2NhbERlZmVycmVkIiwiRGVmZXJyZWQiLCJwdXNoIiwidHJpZ2dlciIsImRlZmVycmVkIiwiYXR0ciIsIkRhdGUiLCJnZXRUaW1lIiwiTWF0aCIsInJhbmRvbSIsImZvcm0iLCJnZXREYXRhIiwid2hlbiIsImFwcGx5IiwidW5kZWZpbmVkIiwidGhlbiIsInByb21pc2UiLCJfZ2VuQnV0dG9ucyIsIm9wdGlvbnMiLCJleHRlbnNpb25EZWZlcnJlZCIsInJlamVjdEhhbmRsZXIiLCJnZXRSZWplY3RIYW5kbGVyIiwicmVzb2x2ZUhhbmRsZXIiLCJnZXRSZXNvbHZlSGFuZGxlciIsImsiLCJ2IiwiZXZlbnQiLCJjYWxsYmFjayIsImxvY2F0aW9uIiwiaHJlZiIsInZhbHVlIiwiX2ZpbmFsaXplTGF5ZXIiLCIkY29udGFpbmVyIiwib24iLCJlIiwicHJldmVudERlZmF1bHQiLCJ3aW5kb3ciLCJnYW1iaW8iLCJ3aWRnZXRzIiwiaW5pdCIsIl9zZXRMYXllciIsImRlYnVnIiwiZXJyb3IiLCJfdHJhbnNmZXJPcHRpb25zIiwibWFwcGVyIiwiZ2V0TWFwcGVyIiwicmVzdWx0IiwibWFwcGVyUmVzdWx0IiwiX2dldFRoZW1lIiwiaWZyYW1lIiwiJHNlbGVjdGlvbiIsIm5vVGhlbWUiLCJyZXNvbHZlIiwic3RvcmVUaGVtZSIsImVyciIsImh0bWwiLCJ4aHIiLCJhamF4IiwidXJsIiwiZGF0YVR5cGUiLCJkb25lIiwic2VjdGlvblNlbGVjdG9yIiwiZmFpbCIsInJlamVjdCIsIl9jcmVhdGVMYXllciIsInRpdGxlIiwiY2xhc3NOYW1lIiwiZGVmYnV0dG9ucyIsImRlZmF1bHRzIiwiZGlhbG9nQ2xhc3MiLCJjbG9zZU9uRXNjYXBlIiwiY2xvc2VYIiwiY2xvc2VPbk91dGVyIiwiaW5zdGFuY2UiLCJleHRlbmQiLCJ0cGxSZXF1ZXN0IiwiTXVzdGFjaGUiLCJyZW5kZXIiLCJoZWxwZXJzIiwic2V0dXBXaWRnZXRBdHRyIiwiYXBwZW5kIiwiY2xvbmUiLCJvcmlnaW5hbE9wdGlvbnMiLCJvcGVuTGF5ZXIiLCJzdWNjZXNzIiwiX2FsZXJ0IiwiX2NvbmZpcm0iLCJfcHJvbXB0IiwiX3N1Y2Nlc3MiLCJfZXJyb3IiLCJfd2FybiIsIl9pbmZvIiwiX2lmcmFtZSIsImNvbnZlcnRNb2RhbCIsIndhcm4iLCJpbmZvIiwiYWxlcnQiLCJwcm9tcHQiLCJjb25maXJtIiwiY3VzdG9tIiwic2V0TGF5ZXIiLCJmaW5hbGl6ZUxheWVyIiwiY3VycmVudFRpbWVzdGFtcCIsIm5vdyIsImxpZmV0aW1lIiwicmVnaXN0cnkiLCJnZXQiLCJpbnR2Iiwic2V0SW50ZXJ2YWwiLCJjbGVhckludGVydmFsIiwiRXJyb3IiLCJ0ZW1wbGF0ZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7Ozs7OztBQVVBQSxJQUFJQyxJQUFKLENBQVNDLEtBQVQsQ0FBZUMsS0FBZixHQUF1QkgsSUFBSUMsSUFBSixDQUFTQyxLQUFULENBQWVDLEtBQWYsSUFBd0IsRUFBL0M7O0FBRUE7Ozs7Ozs7OztBQVNDLFdBQVVDLE9BQVYsRUFBbUI7QUFDaEI7O0FBRUEsUUFBSUMsUUFBUUMsRUFBRSxNQUFGLENBQVo7QUFBQSxRQUNJQyxXQUFXLEVBRGY7QUFBQSxRQUVJQyxZQUFZLElBRmhCOztBQUdJO0FBQ0FDLGNBQVU7QUFDTkMsYUFBSztBQUNEQyxrQkFBTVgsSUFBSVksSUFBSixDQUFTQyxJQUFULENBQWNDLFNBQWQsQ0FBd0IsS0FBeEIsRUFBK0IsU0FBL0IsQ0FETDtBQUVEQyxrQkFBTSxTQUZMO0FBR0RDLG1CQUFPO0FBSE4sU0FEQztBQU1OQyxZQUFJO0FBQ0FOLGtCQUFNWCxJQUFJWSxJQUFKLENBQVNDLElBQVQsQ0FBY0MsU0FBZCxDQUF3QixJQUF4QixFQUE4QixTQUE5QixDQUROO0FBRUFDLGtCQUFNLE1BRk47QUFHQUMsbUJBQU87QUFIUCxTQU5FO0FBV05FLGVBQU87QUFDSFAsa0JBQU1YLElBQUlZLElBQUosQ0FBU0MsSUFBVCxDQUFjQyxTQUFkLENBQXdCLE9BQXhCLEVBQWlDLFNBQWpDLENBREg7QUFFSEMsa0JBQU0sTUFGSDtBQUdIQyxtQkFBTztBQUhKLFNBWEQ7QUFnQk5HLFlBQUk7QUFDQVIsa0JBQU1YLElBQUlZLElBQUosQ0FBU0MsSUFBVCxDQUFjQyxTQUFkLENBQXdCLElBQXhCLEVBQThCLFNBQTlCLENBRE47QUFFQUMsa0JBQU0sU0FGTjtBQUdBQyxtQkFBTztBQUhQLFNBaEJFO0FBcUJOSSxlQUFPO0FBQ0hULGtCQUFNWCxJQUFJWSxJQUFKLENBQVNDLElBQVQsQ0FBY0MsU0FBZCxDQUF3QixPQUF4QixFQUFpQyxTQUFqQyxDQURIO0FBRUhDLGtCQUFNLE1BRkg7QUFHSEMsbUJBQU87QUFISjtBQXJCRCxLQUpkOztBQWdDQTs7Ozs7OztBQU9BLFFBQUlLLGVBQWUsU0FBZkEsWUFBZSxDQUFVQyxLQUFWLEVBQWlCQyxTQUFqQixFQUE0QjtBQUMzQyxZQUFJQyxTQUFTRixNQUNKRyxNQURJLENBQ0csTUFESCxFQUVKQyxHQUZJLENBRUFKLE1BQU1LLElBQU4sQ0FBVyxNQUFYLENBRkEsQ0FBYjtBQUFBLFlBR0lDLFdBQVcsRUFIZjtBQUFBLFlBSUlDLFFBQVEsSUFKWjtBQUFBLFlBS0lDLFdBQVcsRUFMZjs7QUFPQSxZQUFJTixPQUFPTyxNQUFYLEVBQW1CO0FBQ2ZQLG1CQUFPUSxJQUFQLENBQVksWUFBWTtBQUNwQixvQkFBSUMsUUFBUTNCLEVBQUUsSUFBRixDQUFaOztBQUVBLG9CQUFJaUIsU0FBSixFQUFlO0FBQ1gsd0JBQUlXLGdCQUFnQjVCLEVBQUU2QixRQUFGLEVBQXBCO0FBQ0FMLDZCQUFTTSxJQUFULENBQWNGLGFBQWQ7QUFDQUQsMEJBQU1JLE9BQU4sQ0FBYyxvQkFBZCxFQUFvQyxFQUFDQyxVQUFVSixhQUFYLEVBQXBDO0FBQ0g7O0FBRUROLHlCQUFTSyxNQUFNTSxJQUFOLENBQVcsTUFBWCxLQUFzQk4sTUFBTU0sSUFBTixDQUFXLElBQVgsQ0FBdEIsSUFBMkMsVUFBVSxJQUFJQyxJQUFKLEdBQVdDLE9BQVgsS0FBdUJDLEtBQUtDLE1BQUwsRUFBckYsSUFDTTNDLElBQUlDLElBQUosQ0FBUzJDLElBQVQsQ0FBY0MsT0FBZCxDQUFzQlosS0FBdEIsQ0FETjtBQUVILGFBWEQ7QUFZSDs7QUFFRCxlQUFPM0IsRUFBRXdDLElBQUYsQ0FDRkMsS0FERSxDQUNJQyxTQURKLEVBQ2VsQixRQURmLEVBRUZtQixJQUZFLENBRUcsWUFBWTtBQUNkLG1CQUFPckIsUUFBUDtBQUNILFNBSkUsRUFJQSxZQUFZO0FBQ1gsbUJBQU9BLFFBQVA7QUFDSCxTQU5FLEVBT0ZzQixPQVBFLEVBQVA7QUFRSCxLQS9CRDs7QUFpQ0E7Ozs7Ozs7O0FBUUEsUUFBSUMsY0FBYyxTQUFkQSxXQUFjLENBQVVDLE9BQVYsRUFBbUJDLGlCQUFuQixFQUFzQzs7QUFFcEQ7QUFDQSxZQUFJRCxRQUFRM0MsT0FBWixFQUFxQjs7QUFFakIsZ0JBQUk2QyxnQkFBZ0I5QyxVQUFVK0MsZ0JBQTlCO0FBQUEsZ0JBQ0lDLGlCQUFpQmhELFVBQVVpRCxpQkFEL0I7O0FBR0FuRCxjQUFFMEIsSUFBRixDQUFPb0IsUUFBUTNDLE9BQWYsRUFBd0IsVUFBVWlELENBQVYsRUFBYUMsQ0FBYixFQUFnQjs7QUFFcEM7QUFDQVAsd0JBQVEzQyxPQUFSLENBQWdCaUQsQ0FBaEIsRUFBbUJFLEtBQW5CLEdBQTJCLFlBQVk7QUFDbkMsd0JBQUl0QyxRQUFRaEIsRUFBRSxJQUFGLENBQVo7O0FBRUE7QUFDQTtBQUNBLHdCQUFJLE9BQU9xRCxFQUFFRSxRQUFULEtBQXNCLFVBQTFCLEVBQXNDO0FBQ2xDLDRCQUFJLENBQUNGLEVBQUVFLFFBQUYsQ0FBV2QsS0FBWCxDQUFpQnpCLEtBQWpCLEVBQXdCLEVBQXhCLENBQUwsRUFBa0M7QUFDOUIsbUNBQU8sS0FBUDtBQUNIO0FBQ0o7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBUXFDLEVBQUU1QyxJQUFWO0FBQ0ksNkJBQUssTUFBTDtBQUNJdUMsMENBQWNoQyxLQUFkLEVBQXFCK0IsaUJBQXJCLEVBQXdDaEMsWUFBeEM7QUFDQTtBQUNKLDZCQUFLLFNBQUw7QUFDSW1DLDJDQUFlbEMsS0FBZixFQUFzQitCLGlCQUF0QixFQUF5Q2hDLFlBQXpDO0FBQ0E7QUFDSiw2QkFBSyxNQUFMO0FBQ0l5QyxxQ0FBU0MsSUFBVCxHQUFnQkosRUFBRUssS0FBbEI7QUFDQTtBQUNKO0FBQ0k7QUFYUjtBQWFILGlCQTVCRDtBQThCSCxhQWpDRDtBQW1DSDtBQUVKLEtBN0NEOztBQWdEQSxRQUFJQyxpQkFBaUIsU0FBakJBLGNBQWlCLENBQVVDLFVBQVYsRUFBc0JkLE9BQXRCLEVBQStCO0FBQ2hEO0FBQ0EsWUFBSTVCLFNBQVMwQyxXQUFXdkMsSUFBWCxDQUFnQixNQUFoQixDQUFiO0FBQ0EsWUFBSUgsT0FBT08sTUFBWCxFQUFtQjtBQUNmUCxtQkFBTzJDLEVBQVAsQ0FBVSxRQUFWLEVBQW9CLFVBQVVDLENBQVYsRUFBYTtBQUM3QkEsa0JBQUVDLGNBQUY7QUFDSCxhQUZEO0FBR0g7O0FBRUQsWUFBSUMsT0FBT0MsTUFBUCxJQUFpQkQsT0FBT0MsTUFBUCxDQUFjQyxPQUEvQixJQUEwQ0YsT0FBT0MsTUFBUCxDQUFjQyxPQUFkLENBQXNCQyxJQUFwRSxFQUEwRTtBQUN0RUgsbUJBQU9DLE1BQVAsQ0FBY0MsT0FBZCxDQUFzQkMsSUFBdEIsQ0FBMkJQLFVBQTNCO0FBQ0g7QUFDSixLQVpEOztBQWNBLFFBQUlRLFlBQVksU0FBWkEsU0FBWSxDQUFVL0QsSUFBVixFQUFnQjtBQUM1QixZQUFJWCxJQUFJQyxJQUFKLENBQVNDLEtBQVQsQ0FBZUMsS0FBZixDQUFxQlEsSUFBckIsQ0FBSixFQUFnQztBQUM1Qkgsd0JBQVlSLElBQUlDLElBQUosQ0FBU0MsS0FBVCxDQUFlQyxLQUFmLENBQXFCUSxJQUFyQixDQUFaO0FBQ0gsU0FGRCxNQUVPO0FBQ0hYLGdCQUFJWSxJQUFKLENBQVMrRCxLQUFULENBQWVDLEtBQWYsQ0FBcUIsZ0NBQWdDakUsSUFBaEMsR0FBdUMsNkJBQTVEO0FBQ0g7QUFDSixLQU5EOztBQVFBLFFBQUlrRSxtQkFBbUIsU0FBbkJBLGdCQUFtQixDQUFVekIsT0FBVixFQUFtQjtBQUN0QyxZQUFJMEIsU0FBU3RFLFVBQVV1RSxTQUFWLEVBQWI7QUFBQSxZQUNJQyxTQUFTLEVBRGI7O0FBR0ExRSxVQUFFMEIsSUFBRixDQUFPb0IsT0FBUCxFQUFnQixVQUFVTSxDQUFWLEVBQWFDLENBQWIsRUFBZ0I7O0FBRTVCLGdCQUFJbUIsT0FBT3BCLENBQVAsTUFBYyxLQUFsQixFQUF5QjtBQUNyQix1QkFBTyxJQUFQO0FBQ0gsYUFGRCxNQUVPLElBQUlvQixPQUFPcEIsQ0FBUCxNQUFjVixTQUFsQixFQUE2QjtBQUNoQ2dDLHVCQUFPdEIsQ0FBUCxJQUFZQyxDQUFaO0FBQ0gsYUFGTSxNQUVBLElBQUksT0FBT21CLE9BQU9wQixDQUFQLENBQVAsS0FBcUIsVUFBekIsRUFBcUM7QUFDeEMsb0JBQUl1QixlQUFlSCxPQUFPcEIsQ0FBUCxFQUFVQSxDQUFWLEVBQWFDLENBQWIsQ0FBbkI7QUFDQXFCLHVCQUFPQyxhQUFhLENBQWIsQ0FBUCxJQUEwQkEsYUFBYSxDQUFiLENBQTFCO0FBQ0gsYUFITSxNQUdBO0FBQ0hELHVCQUFPRixPQUFPcEIsQ0FBUCxDQUFQLElBQW9CQyxDQUFwQjtBQUNIO0FBRUosU0FiRDs7QUFlQSxlQUFPcUIsTUFBUDtBQUVILEtBckJEOztBQXVCQSxRQUFJRSxZQUFZLFNBQVpBLFNBQVksQ0FBVTlCLE9BQVYsRUFBbUIrQixNQUFuQixFQUEyQjs7QUFFdkMsWUFBSUMsYUFBYSxFQUFqQjtBQUFBLFlBQ0k5QyxXQUFXaEMsRUFBRTZCLFFBQUYsRUFEZjs7QUFHQSxZQUFJaUIsUUFBUWlDLE9BQVosRUFBcUI7QUFDakIvQyxxQkFBU2dELE9BQVQsQ0FBaUIsRUFBakI7QUFDSCxTQUZELE1BRU8sSUFBSUgsTUFBSixFQUFZO0FBQ2Y3QyxxQkFBU2dELE9BQVQsQ0FBaUIsNkRBQTZEbEMsUUFBUWxELEtBQXJFLEdBQTZFLE1BQTlGO0FBQ0gsU0FGTSxNQUVBO0FBQ0gsZ0JBQUlrRCxRQUFRbUMsVUFBUixJQUFzQmhGLFNBQVM2QyxRQUFRbEQsS0FBakIsQ0FBMUIsRUFBbUQ7QUFDL0NvQyx5QkFBU2dELE9BQVQsQ0FBaUIvRSxTQUFTNkMsUUFBUWxELEtBQWpCLENBQWpCO0FBQ0gsYUFGRCxNQUVPOztBQUVILG9CQUFJO0FBQ0FrRixpQ0FBYTlFLEVBQUU4QyxRQUFRbEQsS0FBVixDQUFiO0FBQ0gsaUJBRkQsQ0FFRSxPQUFPc0YsR0FBUCxFQUFZLENBQ2I7O0FBRUQsb0JBQUlKLFdBQVdyRCxNQUFmLEVBQXVCO0FBQ25CTyw2QkFBU2dELE9BQVQsQ0FBaUJGLFdBQVdLLElBQVgsRUFBakI7QUFDSCxpQkFGRCxNQUVPO0FBQ0h6Rix3QkFBSUMsSUFBSixDQUFTeUYsR0FBVCxDQUFhQyxJQUFiLENBQWtCLEVBQUNDLEtBQUt4QyxRQUFRbEQsS0FBZCxFQUFxQjJGLFVBQVUsTUFBL0IsRUFBbEIsRUFBMERDLElBQTFELENBQStELFVBQVVkLE1BQVYsRUFBa0I7QUFDN0UsNEJBQUk1QixRQUFRMkMsZUFBWixFQUE2QjtBQUN6QmYscUNBQVMxRSxFQUFFMEUsTUFBRixFQUFVckQsSUFBVixDQUFleUIsUUFBUTJDLGVBQXZCLEVBQXdDTixJQUF4QyxFQUFUO0FBQ0g7O0FBRUQsNEJBQUlyQyxRQUFRbUMsVUFBWixFQUF3QjtBQUNwQmhGLHFDQUFTNkMsUUFBUWxELEtBQWpCLElBQTBCOEUsTUFBMUI7QUFDSDtBQUNEMUMsaUNBQVNnRCxPQUFULENBQWlCTixNQUFqQjtBQUNILHFCQVRELEVBU0dnQixJQVRILENBU1EsWUFBWTtBQUNoQjFELGlDQUFTMkQsTUFBVDtBQUNILHFCQVhEO0FBWUg7QUFDSjtBQUNKOztBQUVELGVBQU8zRCxRQUFQO0FBQ0gsS0F2Q0Q7O0FBeUNBLFFBQUk0RCxlQUFlLFNBQWZBLFlBQWUsQ0FBVTlDLE9BQVYsRUFBbUIrQyxLQUFuQixFQUEwQkMsU0FBMUIsRUFBcUNDLFVBQXJDLEVBQWlEbkcsS0FBakQsRUFBd0Q7QUFDdkU7QUFDQSxZQUFJb0MsV0FBV2hDLEVBQUU2QixRQUFGLEVBQWY7QUFBQSxZQUNJZSxVQUFVWixTQUFTWSxPQUFULEVBRGQ7QUFBQSxZQUVJaUMsU0FBVWpGLFVBQVUsUUFGeEI7QUFBQSxZQUdJb0csV0FBVztBQUNQSCxtQkFBT0EsS0FEQTtBQUVQSSx5QkFBYUgsU0FGTjtBQUdQakcsbUJBQU8sSUFIQTtBQUlQTSxxQkFBUzRGLGNBQWMsRUFKaEI7QUFLUEcsMkJBQWUsSUFMUjtBQU1QdEcsbUJBQU9BLFNBQVMsSUFOVDtBQU9QcUYsd0JBQVksS0FQTDtBQVFQa0Isb0JBQVEsSUFSRDtBQVNQQywwQkFBYztBQVRQLFNBSGY7QUFBQSxZQWNJQyxXQUFXLElBZGY7QUFBQSxZQWVJbkYsU0FBUyxJQWZiO0FBQUEsWUFnQkk2QixvQkFBb0IvQyxFQUFFNkIsUUFBRixFQWhCeEI7O0FBa0JBO0FBQ0FpQixrQkFBVUEsV0FBVyxFQUFyQjtBQUNBQSxrQkFBVTlDLEVBQUVzRyxNQUFGLENBQVMsRUFBVCxFQUFhTixRQUFiLEVBQXVCbEQsT0FBdkIsQ0FBVjs7QUFFQSxZQUFJeUQsYUFBYTNCLFVBQVU5QixPQUFWLEVBQW1CK0IsTUFBbkIsRUFBMkJXLElBQTNCLENBQWdDLFVBQVVkLE1BQVYsRUFBa0I7O0FBRS9EM0IsOEJBQWtCeUMsSUFBbEIsQ0FBdUIsVUFBVWQsTUFBVixFQUFrQjtBQUNyQzFDLHlCQUFTZ0QsT0FBVCxDQUFpQk4sTUFBakI7QUFDSCxhQUZELEVBRUdnQixJQUZILENBRVEsVUFBVWhCLE1BQVYsRUFBa0I7QUFDdEIxQyx5QkFBUzJELE1BQVQsQ0FBZ0JqQixNQUFoQjtBQUNILGFBSkQ7O0FBTUE7QUFDQTVCLG9CQUFRbEQsS0FBUixHQUFnQkksRUFBRXdHLFNBQVNDLE1BQVQsQ0FBZ0IvQixNQUFoQixFQUF3QjVCLE9BQXhCLENBQUYsQ0FBaEI7QUFDQXBELGdCQUFJQyxJQUFKLENBQVNDLEtBQVQsQ0FBZThHLE9BQWYsQ0FBdUJDLGVBQXZCLENBQXVDN0QsUUFBUWxELEtBQS9DO0FBQ0FrRCxvQkFBUWxELEtBQVIsR0FBZ0JJLEVBQUUsT0FBRixFQUFXNEcsTUFBWCxDQUFrQjlELFFBQVFsRCxLQUFSLENBQWNpSCxLQUFkLEVBQWxCLEVBQXlDMUIsSUFBekMsRUFBaEI7O0FBRUE7QUFDQXRDLHdCQUFZQyxPQUFaLEVBQXFCQyxpQkFBckI7O0FBRUE7QUFDQSxnQkFBSStELGtCQUFrQjlHLEVBQUVzRyxNQUFGLENBQVMsRUFBVCxFQUFheEQsT0FBYixDQUF0QjtBQUNBQSxzQkFBVXlCLGlCQUFpQnpCLE9BQWpCLENBQVY7O0FBRUE7QUFDQTVDLHNCQUFVNkcsU0FBVixDQUFvQmpFLE9BQXBCLEVBQTZCQyxpQkFBN0IsRUFBZ0RoQyxZQUFoRCxFQUE4RCtGLGVBQTlEOztBQUVBO0FBQ0E7QUFDQWxFLG9CQUFROUIsS0FBUixHQUFnQixVQUFVa0csT0FBVixFQUFtQjtBQUMvQmpFLGtDQUFrQmpDLEtBQWxCLENBQXdCa0csT0FBeEI7QUFDSCxhQUZEO0FBSUgsU0E3QmdCLEVBNkJkdEIsSUE3QmMsQ0E2QlQsWUFBWTtBQUNoQjFELHFCQUFTMkQsTUFBVCxDQUFnQixFQUFDckIsT0FBTyxpQkFBUixFQUFoQjtBQUNILFNBL0JnQixDQUFqQjs7QUFpQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBSSxDQUFDMUIsUUFBUTlCLEtBQWIsRUFBb0I7QUFDaEI4QixvQkFBUTlCLEtBQVIsR0FBZ0IsWUFBWTtBQUN4QnlGLDJCQUFXWixNQUFYLENBQWtCLHNCQUFsQjtBQUNILGFBRkQ7QUFHSDs7QUFFRCxlQUFPL0MsT0FBUDtBQUNILEtBbkVEOztBQXNFQTs7Ozs7QUFLQSxRQUFJcUUsU0FBUyxTQUFUQSxNQUFTLENBQVVuRSxPQUFWLEVBQW1CO0FBQzVCLGVBQU84QyxhQUFhOUMsT0FBYixFQUFzQnBELElBQUlZLElBQUosQ0FBU0MsSUFBVCxDQUFjQyxTQUFkLENBQXdCLE1BQXhCLEVBQWdDLFFBQWhDLENBQXRCLEVBQWlFLEVBQWpFLEVBQXFFLENBQUNMLFFBQVFXLEtBQVQsQ0FBckUsRUFBc0YsY0FBdEYsQ0FBUDtBQUNILEtBRkQ7O0FBSUE7Ozs7O0FBS0EsUUFBSW9HLFdBQVcsU0FBWEEsUUFBVyxDQUFVcEUsT0FBVixFQUFtQjtBQUM5QixlQUFPOEMsYUFBYTlDLE9BQWIsRUFBc0JwRCxJQUFJWSxJQUFKLENBQVNDLElBQVQsQ0FBY0MsU0FBZCxDQUF3QixTQUF4QixFQUFtQyxRQUFuQyxDQUF0QixFQUFvRSxnQkFBcEUsRUFBc0YsQ0FDekZMLFFBQVFDLEdBRGlGLEVBRXpGRCxRQUFRUSxFQUZpRixDQUF0RixFQUdKLGNBSEksQ0FBUDtBQUlILEtBTEQ7O0FBT0E7Ozs7O0FBS0EsUUFBSXdHLFVBQVUsU0FBVkEsT0FBVSxDQUFVckUsT0FBVixFQUFtQjtBQUM3QixlQUFPOEMsYUFBYTlDLE9BQWIsRUFBc0JwRCxJQUFJWSxJQUFKLENBQVNDLElBQVQsQ0FBY0MsU0FBZCxDQUF3QixRQUF4QixFQUFrQyxRQUFsQyxDQUF0QixFQUFtRSxlQUFuRSxFQUFvRixDQUN2RkwsUUFBUVUsRUFEK0UsRUFFdkZWLFFBQVFTLEtBRitFLENBQXBGLEVBR0osZUFISSxDQUFQO0FBSUgsS0FMRDs7QUFPQTs7Ozs7QUFLQSxRQUFJd0csV0FBVyxTQUFYQSxRQUFXLENBQVV0RSxPQUFWLEVBQW1CO0FBQzlCLGVBQU84QyxhQUFhOUMsT0FBYixFQUFzQnBELElBQUlZLElBQUosQ0FBU0MsSUFBVCxDQUFjQyxTQUFkLENBQXdCLFNBQXhCLEVBQW1DLFFBQW5DLENBQXRCLEVBQW9FLGdCQUFwRSxFQUFzRixFQUF0RixFQUEwRixjQUExRixDQUFQO0FBQ0gsS0FGRDs7QUFJQTs7Ozs7QUFLQSxRQUFJNkcsU0FBUyxTQUFUQSxNQUFTLENBQVV2RSxPQUFWLEVBQW1CO0FBQzVCLGVBQU84QyxhQUFhOUMsT0FBYixFQUFzQnBELElBQUlZLElBQUosQ0FBU0MsSUFBVCxDQUFjQyxTQUFkLENBQXdCLFFBQXhCLEVBQWtDLFFBQWxDLENBQXRCLEVBQW1FLGNBQW5FLEVBQW1GLEVBQW5GLEVBQXVGLGNBQXZGLENBQVA7QUFDSCxLQUZEOztBQUlBOzs7OztBQUtBLFFBQUk4RyxRQUFRLFNBQVJBLEtBQVEsQ0FBVXhFLE9BQVYsRUFBbUI7QUFDM0IsZUFBTzhDLGFBQWE5QyxPQUFiLEVBQXNCcEQsSUFBSVksSUFBSixDQUFTQyxJQUFULENBQWNDLFNBQWQsQ0FBd0IsU0FBeEIsRUFBbUMsUUFBbkMsQ0FBdEIsRUFBb0UsYUFBcEUsRUFBbUYsRUFBbkYsRUFBdUYsY0FBdkYsQ0FBUDtBQUNILEtBRkQ7O0FBSUE7Ozs7O0FBS0EsUUFBSStHLFFBQVEsU0FBUkEsS0FBUSxDQUFVekUsT0FBVixFQUFtQjtBQUMzQixlQUFPOEMsYUFBYTlDLE9BQWIsRUFBc0JwRCxJQUFJWSxJQUFKLENBQVNDLElBQVQsQ0FBY0MsU0FBZCxDQUF3QixNQUF4QixFQUFnQyxRQUFoQyxDQUF0QixFQUFpRSxhQUFqRSxFQUFnRixFQUFoRixFQUFvRixjQUFwRixDQUFQO0FBQ0gsS0FGRDs7QUFJQTs7Ozs7QUFLQSxRQUFJZ0gsVUFBVSxTQUFWQSxPQUFVLENBQVUxRSxPQUFWLEVBQW1CO0FBQzdCLFlBQUlBLFFBQVEyRSxZQUFaLEVBQTBCO0FBQ3RCL0gsZ0JBQUlDLElBQUosQ0FBU0MsS0FBVCxDQUFlQyxLQUFmLENBQXFCaUQsUUFBUTJFLFlBQTdCLEVBQTJDM0UsT0FBM0MsRUFBb0RwRCxJQUFJWSxJQUFKLENBQVNDLElBQVQsQ0FBY0MsU0FBZCxDQUF3QixNQUF4QixFQUFnQyxRQUFoQyxDQUFwRCxFQUNJc0MsUUFBUTJFLFlBQVIsR0FBdUIsU0FEM0IsRUFDc0MsRUFEdEMsRUFDMEMsY0FEMUM7QUFFQTtBQUNIOztBQUVELGVBQU83QixhQUFhOUMsT0FBYixFQUFzQnBELElBQUlZLElBQUosQ0FBU0MsSUFBVCxDQUFjQyxTQUFkLENBQXdCLE1BQXhCLEVBQWdDLFFBQWhDLENBQXRCLEVBQWlFLGNBQWpFLEVBQWlGLEVBQWpGLEVBQXFGLFFBQXJGLENBQVA7QUFDSCxLQVJEOztBQVVKOztBQUVJVixZQUFRd0UsS0FBUixHQUFnQitDLE1BQWhCO0FBQ0F2SCxZQUFRNEgsSUFBUixHQUFlSixLQUFmO0FBQ0F4SCxZQUFRNkgsSUFBUixHQUFlSixLQUFmO0FBQ0F6SCxZQUFRa0gsT0FBUixHQUFrQkksUUFBbEI7QUFDQXRILFlBQVE4SCxLQUFSLEdBQWdCWCxNQUFoQjtBQUNBbkgsWUFBUStILE1BQVIsR0FBaUJWLE9BQWpCO0FBQ0FySCxZQUFRZ0ksT0FBUixHQUFrQlosUUFBbEI7QUFDQXBILFlBQVErRSxNQUFSLEdBQWlCMkMsT0FBakI7QUFDQTFILFlBQVFpSSxNQUFSLEdBQWlCbkMsWUFBakI7QUFDQTlGLFlBQVFrSSxRQUFSLEdBQW1CNUQsU0FBbkI7QUFDQXRFLFlBQVFtSSxhQUFSLEdBQXdCdEUsY0FBeEI7O0FBRUE7QUFDQSxRQUFJdUUsbUJBQW1CaEcsS0FBS2lHLEdBQTVCO0FBQUEsUUFDSUMsV0FBVyxLQURmLENBbFlnQixDQW1ZTTs7QUFFdEJsSSxnQkFBWVIsSUFBSVksSUFBSixDQUFTK0gsUUFBVCxDQUFrQkMsR0FBbEIsQ0FBc0IsZ0JBQXRCLENBQVo7O0FBRUEsUUFBSUMsT0FBT0MsWUFBWSxZQUFZO0FBQy9CLFlBQUk5SSxJQUFJQyxJQUFKLENBQVNDLEtBQVQsQ0FBZUMsS0FBZixDQUFxQkssU0FBckIsTUFBb0N3QyxTQUF4QyxFQUFtRDtBQUMvQzBCLHNCQUFVbEUsU0FBVjtBQUNBdUksMEJBQWNGLElBQWQ7QUFDSDs7QUFFRCxZQUFJckcsS0FBS2lHLEdBQUwsR0FBV0QsZ0JBQVgsR0FBOEJFLFFBQWxDLEVBQTRDO0FBQ3hDLGtCQUFNLElBQUlNLEtBQUosQ0FBVSxxQ0FBcUN4SSxTQUEvQyxDQUFOO0FBQ0g7QUFDSixLQVRVLEVBU1IsR0FUUSxDQUFYO0FBWUgsQ0FuWkEsRUFtWkNSLElBQUlDLElBQUosQ0FBU0MsS0FBVCxDQUFlQyxLQW5aaEIsQ0FBRDs7QUFxWkFILElBQUlDLElBQUosQ0FBU2dKLFFBQVQsR0FBb0JqSixJQUFJQyxJQUFKLENBQVNnSixRQUFULElBQXFCLEVBQXpDO0FBQ0FqSixJQUFJQyxJQUFKLENBQVNnSixRQUFULENBQWtCOUksS0FBbEIsR0FBMEJILElBQUlDLElBQUosQ0FBU0MsS0FBVCxDQUFlQyxLQUF6QyIsImZpbGUiOiJsaWJzL21vZGFsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiBtb2RhbC5qcyAyMDE2LTA3LTA3XG4gR2FtYmlvIEdtYkhcbiBodHRwOi8vd3d3LmdhbWJpby5kZVxuIENvcHlyaWdodCAoYykgMjAxNiBHYW1iaW8gR21iSFxuIFJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKVxuIFtodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sXVxuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuanNlLmxpYnMudGhlbWUubW9kYWwgPSBqc2UubGlicy50aGVtZS5tb2RhbCB8fCB7fTtcblxuLyoqXG4gKiAjIyBIb25leWdyaWQgTW9kYWwgRGlhbG9ncyBMaWJyYXJ5XG4gKlxuICogTGlicmFyeS1mdW5jdGlvbiB0byBvcGVuIGRlZmF1bHQgbW9kYWwgbGF5ZXIuICBUaGlzIGZ1bmN0aW9uIGRlcGVuZHMgb24galF1ZXJ5ICYgalF1ZXJ5IFVJLlxuICpcbiAqIEBtb2R1bGUgSG9uZXlncmlkL0xpYnMvbW9kYWxcbiAqIEBleHBvcnRzIGpzZS5saWJzLnRoZW1lLm1vZGFsXG4gKiBAaWdub3JlXG4gKi9cbihmdW5jdGlvbiAoZXhwb3J0cykge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciAkYm9keSA9ICQoJ2JvZHknKSxcbiAgICAgICAgdHBsU3RvcmUgPSBbXSxcbiAgICAgICAgZXh0ZW5zaW9uID0gbnVsbCxcbiAgICAgICAgLy8gT2JqZWN0IGZvciBkZWZhdWx0IGJ1dHRvbnNcbiAgICAgICAgYnV0dG9ucyA9IHtcbiAgICAgICAgICAgIHllczoge1xuICAgICAgICAgICAgICAgIG5hbWU6IGpzZS5jb3JlLmxhbmcudHJhbnNsYXRlKCd5ZXMnLCAnYnV0dG9ucycpLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICBjbGFzczogJ2J0bi1zdWNjZXNzJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5vOiB7XG4gICAgICAgICAgICAgICAgbmFtZToganNlLmNvcmUubGFuZy50cmFuc2xhdGUoJ25vJywgJ2J1dHRvbnMnKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZmFpbCcsXG4gICAgICAgICAgICAgICAgY2xhc3M6ICdidG4tZGVmYXVsdCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhYm9ydDoge1xuICAgICAgICAgICAgICAgIG5hbWU6IGpzZS5jb3JlLmxhbmcudHJhbnNsYXRlKCdhYm9ydCcsICdidXR0b25zJyksXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ZhaWwnLFxuICAgICAgICAgICAgICAgIGNsYXNzOiAnYnRuLWRlZmF1bHQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb2s6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBqc2UuY29yZS5sYW5nLnRyYW5zbGF0ZSgnb2snLCAnYnV0dG9ucycpLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICBjbGFzczogJ2J0bi1zdWNjZXNzJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsb3NlOiB7XG4gICAgICAgICAgICAgICAgbmFtZToganNlLmNvcmUubGFuZy50cmFuc2xhdGUoJ2Nsb3NlJywgJ2J1dHRvbnMnKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZmFpbCcsXG4gICAgICAgICAgICAgICAgY2xhc3M6ICdidG4tZGVmYXVsdCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgIC8qKlxuICAgICAqICAgIEZ1bmN0aW9uIHRvIGdldCBhbGwgZm9ybSBkYXRhIHN0b3JlZCBpbnNpZGVcbiAgICAgKiAgICB0aGUgbGF5ZXJcbiAgICAgKlxuICAgICAqICAgIEBwYXJhbSAgICAgICAge29iamVjdH0gICAgJHNlbGYgICAgICAgIGpRdWVyeSBzZWxlY3Rpb24gb2YgdGhlIGxheWVyXG4gICAgICogICAgQHJldHVybiAgICB7anNvbn0gICAgICAgICAgICAgICAgICAgIFJldHVybnMgYSBKU09OIHdpdGggYWxsIGZvcm0gZGF0YVxuICAgICAqL1xuICAgIHZhciBfZ2V0Rm9ybURhdGEgPSBmdW5jdGlvbiAoJHNlbGYsIGNoZWNrZm9ybSkge1xuICAgICAgICB2YXIgJGZvcm1zID0gJHNlbGZcbiAgICAgICAgICAgICAgICAuZmlsdGVyKCdmb3JtJylcbiAgICAgICAgICAgICAgICAuYWRkKCRzZWxmLmZpbmQoJ2Zvcm0nKSksXG4gICAgICAgICAgICBmb3JtZGF0YSA9IHt9LFxuICAgICAgICAgICAgdmFsaWQgPSB0cnVlLFxuICAgICAgICAgICAgcHJvbWlzZXMgPSBbXTtcblxuICAgICAgICBpZiAoJGZvcm1zLmxlbmd0aCkge1xuICAgICAgICAgICAgJGZvcm1zLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciAkZm9ybSA9ICQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tmb3JtKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbERlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGxvY2FsRGVmZXJyZWQpO1xuICAgICAgICAgICAgICAgICAgICAkZm9ybS50cmlnZ2VyKCd2YWxpZGF0b3IudmFsaWRhdGUnLCB7ZGVmZXJyZWQ6IGxvY2FsRGVmZXJyZWR9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3JtZGF0YVskZm9ybS5hdHRyKCduYW1lJykgfHwgJGZvcm0uYXR0cignaWQnKSB8fCAoJ2Zvcm1fJyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpICogTWF0aC5yYW5kb20oKSldXG4gICAgICAgICAgICAgICAgICAgID0ganNlLmxpYnMuZm9ybS5nZXREYXRhKCRmb3JtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICQud2hlblxuICAgICAgICAgICAgLmFwcGx5KHVuZGVmaW5lZCwgcHJvbWlzZXMpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1kYXRhO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtZGF0YTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucHJvbWlzZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAgICBGdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGN1c3RvbSBidXR0b25zIG9iamVjdCAod2hpY2ggaXNcbiAgICAgKiAgICBpbmNvbXBhdGlibGUgd2l0aCBqUXVlcnkgVUkpIHRvIGEgalF1ZXJ5IFVJIGNvbXBhdGlibGUgZm9ybWF0XG4gICAgICpcbiAgICAgKiAgICBAcGFyYW0gICAgICAgIHtvYmplY3R9ICAgIGRhdGFzZXQgICAgICAgIEN1c3RvbSBidXR0b25zIG9iamVjdCBmb3IgdGhlIGRpYWxvZ1xuICAgICAqICAgIEBwYXJhbSAgICAgICAge3Byb21pc2V9ICAgIGRlZmVycmVkICAgIGRlZmVycmVkLW9iamVjdCB0byByZXNvbHZlIC8gcmVqZWN0IG9uIGNsb3NlXG4gICAgICogICAgQHJldHVybiAgICB7YXJyYXl9ICAgICAgICAgICAgICAgICAgICBSZXR1cm5zIGEgalF1ZXJ5IFVJIGRpYWxvZyBjb21wYXRpYmxlIGJ1dHRvbnMgYXJyYXlcbiAgICAgKi9cbiAgICB2YXIgX2dlbkJ1dHRvbnMgPSBmdW5jdGlvbiAob3B0aW9ucywgZXh0ZW5zaW9uRGVmZXJyZWQpIHtcblxuICAgICAgICAvLyBDaGVjayBpZiBidXR0b25zIGFyZSBhdmFpbGFibGVcbiAgICAgICAgaWYgKG9wdGlvbnMuYnV0dG9ucykge1xuXG4gICAgICAgICAgICB2YXIgcmVqZWN0SGFuZGxlciA9IGV4dGVuc2lvbi5nZXRSZWplY3RIYW5kbGVyLFxuICAgICAgICAgICAgICAgIHJlc29sdmVIYW5kbGVyID0gZXh0ZW5zaW9uLmdldFJlc29sdmVIYW5kbGVyO1xuXG4gICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5idXR0b25zLCBmdW5jdGlvbiAoaywgdikge1xuXG4gICAgICAgICAgICAgICAgLy8gU2V0dXAgY2xpY2sgaGFuZGxlclxuICAgICAgICAgICAgICAgIG9wdGlvbnMuYnV0dG9uc1trXS5ldmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyICRzZWxmID0gJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGNhbGxiYWNrIGlzIGdpdmVuLCBleGVjdXRlIGl0IHdpdGhcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgc2NvcGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2LmNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXYuY2FsbGJhY2suYXBwbHkoJHNlbGYsIFtdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgZGVmYXVsdCBiZWhhdmlvdXJcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBjbG9zZSAgZnVuY3Rpb25hbGl0eVxuICAgICAgICAgICAgICAgICAgICAvLyBPbiBmYWlsLCByZWplY3QgdGhlIGRlZmVycmVkXG4gICAgICAgICAgICAgICAgICAgIC8vIG9iamVjdCwgZWxzZSByZXNvbHZlIGl0XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodi50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmYWlsJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3RIYW5kbGVyKCRzZWxmLCBleHRlbnNpb25EZWZlcnJlZCwgX2dldEZvcm1EYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N1Y2Nlc3MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVIYW5kbGVyKCRzZWxmLCBleHRlbnNpb25EZWZlcnJlZCwgX2dldEZvcm1EYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSB2LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH1cblxuICAgIH07XG5cblxuICAgIHZhciBfZmluYWxpemVMYXllciA9IGZ1bmN0aW9uICgkY29udGFpbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8vIFByZXZlbnQgc3VibWl0IG9uIGVudGVyIGluIGlubmVyIGZvcm1zXG4gICAgICAgIHZhciAkZm9ybXMgPSAkY29udGFpbmVyLmZpbmQoJ2Zvcm0nKTtcbiAgICAgICAgaWYgKCRmb3Jtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICRmb3Jtcy5vbignc3VibWl0JywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh3aW5kb3cuZ2FtYmlvICYmIHdpbmRvdy5nYW1iaW8ud2lkZ2V0cyAmJiB3aW5kb3cuZ2FtYmlvLndpZGdldHMuaW5pdCkge1xuICAgICAgICAgICAgd2luZG93LmdhbWJpby53aWRnZXRzLmluaXQoJGNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIF9zZXRMYXllciA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGlmIChqc2UubGlicy50aGVtZS5tb2RhbFtuYW1lXSkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uID0ganNlLmxpYnMudGhlbWUubW9kYWxbbmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBqc2UuY29yZS5kZWJ1Zy5lcnJvcignW01PREFMXSBDYW5cXCd0IHNldCBtb2RhbDogXCInICsgbmFtZSArICdcIi4gRXh0ZW5zaW9uIGRvZXNuXFwndCBleGlzdCcpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBfdHJhbnNmZXJPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIG1hcHBlciA9IGV4dGVuc2lvbi5nZXRNYXBwZXIoKSxcbiAgICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICAgICQuZWFjaChvcHRpb25zLCBmdW5jdGlvbiAoaywgdikge1xuXG4gICAgICAgICAgICBpZiAobWFwcGVyW2tdID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXBwZXJba10gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtrXSA9IHY7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBtYXBwZXJba10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB2YXIgbWFwcGVyUmVzdWx0ID0gbWFwcGVyW2tdKGssIHYpO1xuICAgICAgICAgICAgICAgIHJlc3VsdFttYXBwZXJSZXN1bHRbMF1dID0gbWFwcGVyUmVzdWx0WzFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbbWFwcGVyW2tdXSA9IHY7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIH07XG5cbiAgICB2YXIgX2dldFRoZW1lID0gZnVuY3Rpb24gKG9wdGlvbnMsIGlmcmFtZSkge1xuXG4gICAgICAgIHZhciAkc2VsZWN0aW9uID0gW10sXG4gICAgICAgICAgICBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5ub1RoZW1lKSB7XG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCcnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpZnJhbWUpIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoJzxpZnJhbWUgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiIGZyYW1lYm9yZGVyPVwiMFwiIHNyYz1cIicgKyBvcHRpb25zLnRoZW1lICsgJ1wiIC8+Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zdG9yZVRoZW1lICYmIHRwbFN0b3JlW29wdGlvbnMudGhlbWVdKSB7XG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh0cGxTdG9yZVtvcHRpb25zLnRoZW1lXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgJHNlbGVjdGlvbiA9ICQob3B0aW9ucy50aGVtZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCRzZWxlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoJHNlbGVjdGlvbi5odG1sKCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGpzZS5saWJzLnhoci5hamF4KHt1cmw6IG9wdGlvbnMudGhlbWUsIGRhdGFUeXBlOiAnaHRtbCd9KS5kb25lKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNlY3Rpb25TZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICQocmVzdWx0KS5maW5kKG9wdGlvbnMuc2VjdGlvblNlbGVjdG9yKS5odG1sKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnN0b3JlVGhlbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cGxTdG9yZVtvcHRpb25zLnRoZW1lXSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmVycmVkO1xuICAgIH07XG5cbiAgICB2YXIgX2NyZWF0ZUxheWVyID0gZnVuY3Rpb24gKG9wdGlvbnMsIHRpdGxlLCBjbGFzc05hbWUsIGRlZmJ1dHRvbnMsIHRoZW1lKSB7XG4gICAgICAgIC8vIFNldHVwIGRlZmF1bHRzICYgZGVmZXJyZWQgb2JqZWN0c1xuICAgICAgICB2YXIgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCksXG4gICAgICAgICAgICBwcm9taXNlID0gZGVmZXJyZWQucHJvbWlzZSgpLFxuICAgICAgICAgICAgaWZyYW1lID0gKHRoZW1lID09PSAnaWZyYW1lJyksXG4gICAgICAgICAgICBkZWZhdWx0cyA9IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICAgICAgZGlhbG9nQ2xhc3M6IGNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICBtb2RhbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBidXR0b25zOiBkZWZidXR0b25zIHx8IFtdLFxuICAgICAgICAgICAgICAgIGNsb3NlT25Fc2NhcGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdGhlbWU6IHRoZW1lIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgc3RvcmVUaGVtZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgY2xvc2VYOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNsb3NlT25PdXRlcjogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluc3RhbmNlID0gbnVsbCxcbiAgICAgICAgICAgICRmb3JtcyA9IG51bGwsXG4gICAgICAgICAgICBleHRlbnNpb25EZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICAvLyBNZXJnZSBjdXN0b20gc2V0dGluZ3Mgd2l0aCBkZWZhdWx0IHNldHRpbmdzXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIGRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgICAgICB2YXIgdHBsUmVxdWVzdCA9IF9nZXRUaGVtZShvcHRpb25zLCBpZnJhbWUpLmRvbmUoZnVuY3Rpb24gKHJlc3VsdCkge1xuXG4gICAgICAgICAgICBleHRlbnNpb25EZWZlcnJlZC5kb25lKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9KS5mYWlsKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QocmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBHZW5lcmF0ZSB0aGVtZVxuICAgICAgICAgICAgb3B0aW9ucy50aGVtZSA9ICQoTXVzdGFjaGUucmVuZGVyKHJlc3VsdCwgb3B0aW9ucykpO1xuICAgICAgICAgICAganNlLmxpYnMudGhlbWUuaGVscGVycy5zZXR1cFdpZGdldEF0dHIob3B0aW9ucy50aGVtZSk7XG4gICAgICAgICAgICBvcHRpb25zLnRoZW1lID0gJCgnPGRpdj4nKS5hcHBlbmQob3B0aW9ucy50aGVtZS5jbG9uZSgpKS5odG1sKCk7XG5cbiAgICAgICAgICAgIC8vIEdlbmVyYXRlIGRlZmF1bHQgYnV0dG9uIG9iamVjdFxuICAgICAgICAgICAgX2dlbkJ1dHRvbnMob3B0aW9ucywgZXh0ZW5zaW9uRGVmZXJyZWQpO1xuXG4gICAgICAgICAgICAvLyBUcmFuc2ZlciBvcHRpb25zIG9iamVjdCB0byBleHRlbnNpb24gb3B0aW9uIG9iamVjdFxuICAgICAgICAgICAgdmFyIG9yaWdpbmFsT3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKTtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBfdHJhbnNmZXJPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAvLyBDYWxsIGV4dGVuc2lvblxuICAgICAgICAgICAgZXh0ZW5zaW9uLm9wZW5MYXllcihvcHRpb25zLCBleHRlbnNpb25EZWZlcnJlZCwgX2dldEZvcm1EYXRhLCBvcmlnaW5hbE9wdGlvbnMpO1xuXG4gICAgICAgICAgICAvLyBQYXNzdGhyb3VnaCBvZiB0aGUgY2xvc2UgbWV0aG9kIG9mIHRoZSBsYXllclxuICAgICAgICAgICAgLy8gdG8gdGhlIGxheWVyIGNhbGxlclxuICAgICAgICAgICAgcHJvbWlzZS5jbG9zZSA9IGZ1bmN0aW9uIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uRGVmZXJyZWQuY2xvc2Uoc3VjY2Vzcyk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KHtlcnJvcjogJ1RoZW1lIG5vdCBmb3VuZCd9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVGVtcG9yYXJ5IGNsb3NlIGhhbmRsZXIgaWYgdGhlIHVwcGVyXG4gICAgICAgIC8vIGRlZmVycmVkIGlzbid0IGZpbmlzaGVkIG5vdy4gSXQgd2lsbCBiZVxuICAgICAgICAvLyBvdmVyd3JpdHRlbiBhZnRlciB0aGUgbGF5ZXIgb3BlbnNcbiAgICAgICAgaWYgKCFwcm9taXNlLmNsb3NlKSB7XG4gICAgICAgICAgICBwcm9taXNlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRwbFJlcXVlc3QucmVqZWN0KCdDbG9zZWQgYWZ0ZXIgb3BlbmluZycpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cblxuICAgIC8qKlxuICAgICAqICAgIFNob3J0Y3V0IGZ1bmN0aW9uIGZvciBhbiBhbGVydC1sYXllclxuICAgICAqICAgIEBwYXJhbSAgICAgICAge29iamVjdH0gICAgb3B0aW9ucyBPcHRpb25zIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgbW9kYWwgbGF5ZXJcbiAgICAgKiAgICBAcmV0dXJuICAgIHtwcm9taXNlfSAgICAgICAgICAgIFJldHVybnMgYSBwcm9taXNlXG4gICAgICovXG4gICAgdmFyIF9hbGVydCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfY3JlYXRlTGF5ZXIob3B0aW9ucywganNlLmNvcmUubGFuZy50cmFuc2xhdGUoJ2hpbnQnLCAnbGFiZWxzJyksICcnLCBbYnV0dG9ucy5jbG9zZV0sICcjbW9kYWxfYWxlcnQnKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogICAgU2hvcnRjdXQgZnVuY3Rpb24gZm9yIGFuIGNvbmZpcm0tbGF5ZXJcbiAgICAgKiAgICBAcGFyYW0gICAgICAgIHtvYmplY3R9ICAgIG9wdGlvbnMgT3B0aW9ucyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIG1vZGFsIGxheWVyXG4gICAgICogICAgQHJldHVybiAgICB7cHJvbWlzZX0gICAgICAgICAgICBSZXR1cm5zIGEgcHJvbWlzZVxuICAgICAqL1xuICAgIHZhciBfY29uZmlybSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfY3JlYXRlTGF5ZXIob3B0aW9ucywganNlLmNvcmUubGFuZy50cmFuc2xhdGUoJ2NvbmZpcm0nLCAnbGFiZWxzJyksICdjb25maXJtX2RpYWxvZycsIFtcbiAgICAgICAgICAgIGJ1dHRvbnMueWVzLFxuICAgICAgICAgICAgYnV0dG9ucy5ub1xuICAgICAgICBdLCAnI21vZGFsX2FsZXJ0Jyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqICAgIFNob3J0Y3V0IGZ1bmN0aW9uIGZvciBhIHByb21wdC1sYXllclxuICAgICAqICAgIEBwYXJhbSAgICAgICAge29iamVjdH0gICAgb3B0aW9ucyBPcHRpb25zIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgbW9kYWwgbGF5ZXJcbiAgICAgKiAgICBAcmV0dXJuICAgIHtwcm9taXNlfSAgICAgICAgICAgIFJldHVybnMgYSBwcm9taXNlXG4gICAgICovXG4gICAgdmFyIF9wcm9tcHQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX2NyZWF0ZUxheWVyKG9wdGlvbnMsIGpzZS5jb3JlLmxhbmcudHJhbnNsYXRlKCdwcm9tcHQnLCAnbGFiZWxzJyksICdwcm9tcHRfZGlhbG9nJywgW1xuICAgICAgICAgICAgYnV0dG9ucy5vayxcbiAgICAgICAgICAgIGJ1dHRvbnMuYWJvcnRcbiAgICAgICAgXSwgJyNtb2RhbF9wcm9tcHQnKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogICAgU2hvcnRjdXQgZnVuY3Rpb24gZm9yIGFuIHN1Y2Nlc3MtbGF5ZXJcbiAgICAgKiAgICBAcGFyYW0gICAgICAgIHtvYmplY3R9ICAgIG9wdGlvbnMgT3B0aW9ucyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIG1vZGFsIGxheWVyXG4gICAgICogICAgQHJldHVybiAgICB7cHJvbWlzZX0gICAgICAgICAgICBSZXR1cm5zIGEgcHJvbWlzZVxuICAgICAqL1xuICAgIHZhciBfc3VjY2VzcyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfY3JlYXRlTGF5ZXIob3B0aW9ucywganNlLmNvcmUubGFuZy50cmFuc2xhdGUoJ3N1Y2Nlc3MnLCAnbGFiZWxzJyksICdzdWNjZXNzX2RpYWxvZycsIFtdLCAnI21vZGFsX2FsZXJ0Jyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqICAgIFNob3J0Y3V0IGZ1bmN0aW9uIGZvciBhbiBlcnJvci1sYXllclxuICAgICAqICAgIEBwYXJhbSAgICAgICAge29iamVjdH0gICAgb3B0aW9ucyBPcHRpb25zIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgbW9kYWwgbGF5ZXJcbiAgICAgKiAgICBAcmV0dXJuICAgIHtwcm9taXNlfSAgICAgICAgICAgIFJldHVybnMgYSBwcm9taXNlXG4gICAgICovXG4gICAgdmFyIF9lcnJvciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfY3JlYXRlTGF5ZXIob3B0aW9ucywganNlLmNvcmUubGFuZy50cmFuc2xhdGUoJ2Vycm9ycycsICdsYWJlbHMnKSwgJ2Vycm9yX2RpYWxvZycsIFtdLCAnI21vZGFsX2FsZXJ0Jyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqICAgIFNob3J0Y3V0IGZ1bmN0aW9uIGZvciBhIHdhcm5pbmctbGF5ZXJcbiAgICAgKiAgICBAcGFyYW0gICAgICAgIHtvYmplY3R9ICAgIG9wdGlvbnMgT3B0aW9ucyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIG1vZGFsIGxheWVyXG4gICAgICogICAgQHJldHVybiAgICB7cHJvbWlzZX0gICAgICAgICAgICBSZXR1cm5zIGEgcHJvbWlzZVxuICAgICAqL1xuICAgIHZhciBfd2FybiA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfY3JlYXRlTGF5ZXIob3B0aW9ucywganNlLmNvcmUubGFuZy50cmFuc2xhdGUoJ3dhcm5pbmcnLCAnbGFiZWxzJyksICd3YXJuX2RpYWxvZycsIFtdLCAnI21vZGFsX2FsZXJ0Jyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqICAgIFNob3J0Y3V0IGZ1bmN0aW9uIGZvciBhbiBpbmZvLWxheWVyXG4gICAgICogICAgQHBhcmFtICAgICAgICB7b2JqZWN0fSAgICBvcHRpb25zIE9wdGlvbnMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBtb2RhbCBsYXllclxuICAgICAqICAgIEByZXR1cm4gICAge3Byb21pc2V9ICAgICAgICAgICAgUmV0dXJucyBhIHByb21pc2VcbiAgICAgKi9cbiAgICB2YXIgX2luZm8gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX2NyZWF0ZUxheWVyKG9wdGlvbnMsIGpzZS5jb3JlLmxhbmcudHJhbnNsYXRlKCdpbmZvJywgJ2xhYmVscycpLCAnaW5mb19kaWFsb2cnLCBbXSwgJyNtb2RhbF9hbGVydCcpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAgICBTaG9ydGN1dCBmdW5jdGlvbiBmb3IgYW4gaWZyYW1lLWxheWVyXG4gICAgICogICAgQHBhcmFtICAgICAgICB7b2JqZWN0fSAgICBvcHRpb25zIE9wdGlvbnMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBtb2RhbCBsYXllclxuICAgICAqICAgIEByZXR1cm4gICAge3Byb21pc2V9ICAgICAgICAgICAgUmV0dXJucyBhIHByb21pc2VcbiAgICAgKi9cbiAgICB2YXIgX2lmcmFtZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmNvbnZlcnRNb2RhbCkge1xuICAgICAgICAgICAganNlLmxpYnMudGhlbWUubW9kYWxbb3B0aW9ucy5jb252ZXJ0TW9kYWxdKG9wdGlvbnMsIGpzZS5jb3JlLmxhbmcudHJhbnNsYXRlKCdpbmZvJywgJ2xhYmVscycpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udmVydE1vZGFsICsgJ19kaWFsb2cnLCBbXSwgJyNtb2RhbF9hbGVydCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9jcmVhdGVMYXllcihvcHRpb25zLCBqc2UuY29yZS5sYW5nLnRyYW5zbGF0ZSgnaW5mbycsICdsYWJlbHMnKSwgJ2lmcmFtZV9sYXllcicsIFtdLCAnaWZyYW1lJyk7XG4gICAgfTtcblxuLy8gIyMjIyMjIyMjIyBWQVJJQUJMRSBFWFBPUlQgIyMjIyMjIyMjI1xuXG4gICAgZXhwb3J0cy5lcnJvciA9IF9lcnJvcjtcbiAgICBleHBvcnRzLndhcm4gPSBfd2FybjtcbiAgICBleHBvcnRzLmluZm8gPSBfaW5mbztcbiAgICBleHBvcnRzLnN1Y2Nlc3MgPSBfc3VjY2VzcztcbiAgICBleHBvcnRzLmFsZXJ0ID0gX2FsZXJ0O1xuICAgIGV4cG9ydHMucHJvbXB0ID0gX3Byb21wdDtcbiAgICBleHBvcnRzLmNvbmZpcm0gPSBfY29uZmlybTtcbiAgICBleHBvcnRzLmlmcmFtZSA9IF9pZnJhbWU7XG4gICAgZXhwb3J0cy5jdXN0b20gPSBfY3JlYXRlTGF5ZXI7XG4gICAgZXhwb3J0cy5zZXRMYXllciA9IF9zZXRMYXllcjtcbiAgICBleHBvcnRzLmZpbmFsaXplTGF5ZXIgPSBfZmluYWxpemVMYXllcjtcblxuICAgIC8vIFNldCBkZWZhdWx0IGxheWVyLlxuICAgIHZhciBjdXJyZW50VGltZXN0YW1wID0gRGF0ZS5ub3csXG4gICAgICAgIGxpZmV0aW1lID0gMTAwMDA7IC8vIDEwIHNlY1xuXG4gICAgZXh0ZW5zaW9uID0ganNlLmNvcmUucmVnaXN0cnkuZ2V0KCdtYWluTW9kYWxMYXllcicpO1xuXG4gICAgdmFyIGludHYgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChqc2UubGlicy50aGVtZS5tb2RhbFtleHRlbnNpb25dICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIF9zZXRMYXllcihleHRlbnNpb24pO1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnR2KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEYXRlLm5vdyAtIGN1cnJlbnRUaW1lc3RhbXAgPiBsaWZldGltZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb2RhbCBleHRlbnNpb24gd2FzIG5vdCBsb2FkZWQ6ICcgKyBleHRlbnNpb24pO1xuICAgICAgICB9XG4gICAgfSwgMzAwKTtcblxuXG59KGpzZS5saWJzLnRoZW1lLm1vZGFsKSk7XG5cbmpzZS5saWJzLnRlbXBsYXRlID0ganNlLmxpYnMudGVtcGxhdGUgfHwge307XG5qc2UubGlicy50ZW1wbGF0ZS5tb2RhbCA9IGpzZS5saWJzLnRoZW1lLm1vZGFsO1xuIl19