@ale-rainbow/rainbow-notification
Version:
Alcatel-Lucent Enterprise Rainbow Notification
420 lines (418 loc) • 94.7 kB
JavaScript
/**
* lodash (Custom Build) <https://lodash.com/>
* Build: `lodash modularize exports="npm" -o ./`
* Copyright jQuery Foundation and other contributors <https://jquery.org/>
* Released under MIT license <https://lodash.com/license>
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
*/
/** Used as references for various `Number` constants. */
const INFINITY = 1 / 0;
/** `Object#toString` result references. */
const symbolTag = '[object Symbol]';
/** Used to match HTML entities and HTML characters. */
const reUnescapedHtml = /[&<>"'`]/g;
const reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
/** Used to map characters to HTML entities. */
const htmlEscapes = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": ''',
'`': '`'
};
/** Detect free variable `global` from Node.js. */
const freeGlobal = typeof global === 'object' && global && global.Object === Object && global;
/** Detect free variable `self`. */
const freeSelf = typeof self === 'object' && self && self.Object === Object && self;
/** Used as a reference to the global object. */
const root = freeGlobal || freeSelf || Function('return this')();
/**
* The base implementation of `_.propertyOf` without support for deep paths.
*
* @private
* @param {object} object The object to query.
* @returns {Function} Returns the new accessor function.
*/
function basePropertyOf(object) {
return function (key) {
return object == null ? undefined : object[key];
};
}
/**
* Used by `_.escape` to convert characters to HTML entities.
*
* @private
* @param {string} chr The matched character to escape.
* @returns {string} Returns the escaped character.
*/
const escapeHtmlChar = basePropertyOf(htmlEscapes);
/** Used for built-in method references. */
const objectProto = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
const objectToString = objectProto.toString;
/** Built-in value references. */
const Symbol = root.Symbol;
/** Used to convert symbols to primitives and strings. */
const symbolProto = Symbol ? Symbol.prototype : undefined;
const symbolToString = symbolProto ? symbolProto.toString : undefined;
/**
* The base implementation of `_.toString` which doesn't convert nullish
* values to empty strings.
*
* @private
* @param {*} value The value to process.
* @returns {string} Returns the string.
*/
function baseToString(value) {
// Exit early for strings to avoid a performance hit in some environments.
if (typeof value === 'string') {
return value;
}
if (isSymbol(value)) {
return symbolToString ? symbolToString.call(value) : '';
}
const result = (String(value));
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
}
/**
* Checks if `value` is object-like. A value is object-like if it's not `null`
* and has a `typeof` result of "object".
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
* @example
*
* _.isObjectLike({});
* // => true
*
* _.isObjectLike([1, 2, 3]);
* // => true
*
* _.isObjectLike(_.noop);
* // => false
*
* _.isObjectLike(null);
* // => false
*/
function isObjectLike(value) {
return Boolean(value) && typeof value === 'object';
}
/**
* Checks if `value` is classified as a `Symbol` primitive or object.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
* @example
*
* _.isSymbol(Symbol.iterator);
* // => true
*
* _.isSymbol('abc');
* // => false
*/
function isSymbol(value) {
return typeof value === 'symbol' ||
(isObjectLike(value) && objectToString.call(value) == symbolTag);
}
/**
* Converts `value` to a string. An empty string is returned for `null`
* and `undefined` values. The sign of `-0` is preserved.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to process.
* @returns {string} Returns the string.
* @example
*
* _.toString(null);
* // => ''
*
* _.toString(-0);
* // => '-0'
*
* _.toString([1, 2, 3]);
* // => '1,2,3'
*/
function toString(value) {
return value == null ? '' : baseToString(value);
}
/**
* Converts the characters "&", "<", ">", '"', "'", and "\`" in `string` to
* their corresponding HTML entities.
*
* **Note:** No other characters are escaped. To escape additional
* characters use a third-party library like [_he_](https://mths.be/he).
*
* Though the ">" character is escaped for symmetry, characters like
* ">" and "/" don't need escaping in HTML and have no special meaning
* unless they're part of a tag or unquoted attribute value. See
* [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
* (under "semi-related fun fact") for more details.
*
* Backticks are escaped because in IE < 9, they can break out of
* attribute values or HTML comments. See [#59](https://html5sec.org/#59),
* [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and
* [#133](https://html5sec.org/#133) of the
* [HTML5 Security Cheatsheet](https://html5sec.org/) for more details.
*
* When working with HTML you should always
* [quote attribute values](http://wonko.com/post/html-escaping) to reduce
* XSS vectors.
*
* @static
* @since 0.1.0
* @memberOf _
* @category String
* @param {string} [string=''] The string to escape.
* @returns {string} Returns the escaped string.
* @example
*
* _.escape('fred, barney, & pebbles');
* // => 'fred, barney, & pebbles'
*/
const _escape = function escape(string) {
string = toString(string);
return (string && reHasUnescapedHtml.test(string)) ?
string.replace(reUnescapedHtml, escapeHtmlChar) :
string;
};
/* eslint-disable no-multi-str */
class RainbowNotificationAction {
constructor() {
this.optionsDefaultLabel = 'default';
this.optionsHeaderLabel = null;
this.choiceTitleLabel = null;
this.handler = null;
this.focus = false;
this.choiceVisible = false;
this.optionVisible = false;
}
static create(config) {
const action = new RainbowNotificationAction();
Object.keys(config).forEach((key) => { if (config[key])
action[key] = config[key]; });
return action;
}
toogleChoice(notif) {
return () => {
const choiceElem = document.getElementById(`callNotif_choice_${notif.id}_${this.name}`);
const choiceActionElem = document.getElementById(`callNotif_${notif.id}_${this.name}`);
if (choiceElem && choiceActionElem) {
this.choiceVisible = !this.choiceVisible;
choiceElem.style.opacity = this.choiceVisible ? 1 : 0;
choiceElem.style.zIndex = this.choiceVisible ? 1 : -1;
choiceActionElem.textContent = this.choiceVisible ? this.choiceCloseLabel : this.label;
}
};
}
toogleOption(notif) {
const optionElem = document.getElementById(`callNotif_option_${notif.id}_${this.name}`);
if (optionElem) {
this.optionVisible = !this.optionVisible;
optionElem.style.opacity = this.optionVisible ? 1 : 0;
optionElem.style.zIndex = this.optionVisible ? 1 : -1;
}
}
choiceAction(choiceId) { return () => { this.choiceHandler(choiceId); }; }
optionAction(optionId) { return () => { this.optionHandler(optionId); }; }
}
class RainbowNotification {
constructor() {
this.id = null;
this.convId = null;
this.type = null;
this.message = null;
this.mdMessage = null;
this.origin = null;
this.avatarURL = null;
this.avatarURLs = null;
this.webinarAvatarURL = null;
this.infoTitle = null;
this.infoMessage = null;
this.callSubject = null;
this.called = null;
this.calledMessage = null;
this.urgency = 'std';
this.urgencyLabel = null;
this.delay = 15000;
this.delayTimeout = null;
this.autoCloseAction = null;
this.infoHandler = null;
this.actions = null;
this.iconPath = 'assets/images';
this.urgencyIcon = null;
this.urgencyClass = null;
this.isDarkTheme = false;
this.close = false;
}
static create(config) {
const rainbowNotification = new RainbowNotification();
Object.keys(config).forEach((key) => {
if (config[key] && rainbowNotification[key] !== undefined) {
rainbowNotification[key] = config[key];
}
});
if (rainbowNotification.urgency) {
const icons = { std: null, low: 'bulb', middle: 'problem-alert', high: 'siren' };
const classes = { std: null, low: 'extCallNotif__urg-notify', middle: 'extCallNotif__urg-warning', high: 'extCallNotif__urg-emergency' };
rainbowNotification.urgencyIcon = `${rainbowNotification.iconPath}/sprite.svg#${icons[rainbowNotification.urgency]}`;
rainbowNotification.urgencyClass = classes[rainbowNotification.urgency];
}
return rainbowNotification;
}
getHTMLContent() {
const close = this.close ? `<div class='extCallNotif__close' id="callNotif_${this.id}_closeButton"><svg><use href="${this.iconPath}/sprite.svg#close"></svg></div>` : '';
const urgency = (this.urgencyLabel && this.urgencyLabel !== 'std') ? `<div class='extCallNotif__urg ${this.urgencyClass}'><svg><use href="${this.urgencyIcon}"></svg>${this.urgencyLabel}</div>` : '';
let avatar = this.avatarURL ? `<img class='extCallNotif__img' src='${this.avatarURL}' draggable='false' alt='' />` : '';
if (this.avatarURLs) {
avatar = this.getRoomAvatar();
}
if (this.webinarAvatarURL) {
avatar = this.getWebinarAvatar();
}
const origin = this.origin ? `<div class='extCallNotif__origin'>${_escape(this.origin)}</div>` : '';
const message = `<div class='extCallNotif__message'>${this.message}</div>`;
const infoTitle = this.infoTitle ? `<div class='extCallNotif__infoTitle'>${this.infoTitle}</div>` : '';
const infoMessage = this.infoMessage ? `<div class='extCallNotif__infoMessage'>${this.infoMessage}</div>` : '';
const callSubject = this.callSubject ? `<div class='extCallNotif__callSubject'>${_escape(this.callSubject)}</div>` : '';
const calledMessage = this.calledMessage ? `<div class='extCallNotif__calledMessage'>${this.calledMessage}</div>` : '';
const called = this.called ? `<div class='extCallNotif__called'>${this.called}</div>` : '';
const mdMessage = this.mdMessage ? `<div class='extCallNotif__mdMessage'>${this.mdMessage}</div>` : '';
let actionsArea = '';
if (this.actions) {
actionsArea = this.actions.reduce((buffer, action) => {
if (action.name === 'closeButton')
return buffer;
if (action.choice) {
const choiceTitle = action.choiceTitleLabel ? `<div id='choiceTitle' class='extCallNotif__choice-title'>${action.choiceTitleLabel}</div>` : '';
let choices = action.choice.reduce((buff, choice) => {
return buff + `<li id='${choice.id}' class='extCallNotif__choice' tabindex='0' role="menuitem">${choice.label}</li>`;
}, '');
choices += `<section id='callNotif_choice_close_${this.id}_${action.name}' class='extCallNotif__choiceClose'>${action.choiceCloseLabel}</section>`;
buffer += `<ul id='callNotif_choice_${this.id}_${action.name}' class='extCallNotif__choices' role='menu' aria-labelledby='callNotif_${this.id}_${action.name}'>${choiceTitle}${choices}</ul>`;
}
let arrow = '';
let options = '';
if (action.options) {
const optionsHeader = `<div class='extCallNotif__option--header'>${action.optionsHeaderLabel}</div>`;
const optionsItems = action.options.reduce((buff, option, ind) => {
return buff + `<div id='${option.id}' class='extCallNotif__option'><svg draggable='false'><use xlink:href='${this.iconPath}/sprite.svg#${option.icon}'></use></svg>${option.label}${ind ? '' : ' (' + action.optionsDefaultLabel + ')'}</div>`;
}, '');
options = `<div id='callNotif_option_${this.id}_${action.name}' class='extCallNotif__options'>${optionsHeader}${optionsItems}</div>`;
action.label = action.options[0].label;
arrow = `<div class='extCallNotif__arrow' id='callNotif_${this.id}_${action.name}_options'><div><svg draggable='false'><use xlink:href ='${this.iconPath}/sprite.svg#arrow_dropup'></use></svg></div></div>`;
}
const icon = action.icon ? `<svg class='extCallNotif__icon' draggable='false'><use xlink:href='${this.iconPath}/sprite.svg#${action.icon}'></use></svg>` : '';
return buffer + `<button type="button" id='callNotif_${this.id}_${action.name}' class='extCallNotif__button extCallNotif__button--${action.color} extCallNotification-reset--button' aria-haspopup='true' aria-expanded='${this.actions}' aria-controls='callNotif_choice_${this.id}_${action.name}'>${options}<span class='extCallNotif__button--content'>${icon}${action.label}</span>${arrow}</button>`;
}, '');
actionsArea = `<div class='extCallNotif__actions'>${actionsArea}</div>`;
}
return `<div class='extCallNotification'>
${close}
${urgency}
<div class='extCallNotificationMain'>\
${avatar}${infoTitle}${infoMessage}\
<div class='extCallNotificationContent'>${origin}${message}${mdMessage}${calledMessage}${called}${callSubject}${actionsArea} </div>\
</div>\
</div>`;
}
attachActionHandlers(attach = true) {
if (this.actions) {
const methodName = attach ? 'addEventListener' : 'removeEventListener';
this.actions.forEach((action) => {
const actionButtonElem = document.getElementById(`callNotif_${this.id}_${action.name}`);
if (actionButtonElem) {
if (action.choice) {
actionButtonElem[methodName]('click', action.toogleChoice(this));
const childnodes = Array.from(document.getElementById(`callNotif_choice_${this.id}_${action.name}`).childNodes);
childnodes.forEach((choiceElem) => {
if (choiceElem.id !== 'choiceTitle') {
if (choiceElem.id.includes('callNotif_choice_close')) {
choiceElem[methodName]('click', action.toogleChoice(this));
}
else {
choiceElem[methodName]('click', action.choiceAction(choiceElem.id));
}
}
});
}
else if (action.options) {
actionButtonElem[methodName]('click', (event) => { action.optionAction(action.options[0].id)(); event.stopPropagation(); });
const actionButtonOptionsElem = document.getElementById(`callNotif_${this.id}_${action.name}_options`);
actionButtonOptionsElem[methodName]('click', (event) => { action.toogleOption(this); event.stopPropagation(); });
const childnodes = Array.from(document.getElementsByClassName(`extCallNotif__option`));
childnodes.forEach((optionElem) => {
optionElem[methodName]('click', (event) => { action.optionAction(optionElem.getAttribute('id'))(); event.stopPropagation(); });
});
}
else {
actionButtonElem[methodName]('click', (event) => { action.handler(event); event.stopPropagation(); });
}
}
});
}
}
getRoomAvatar() {
let buffer = '<div class="extCallNotif__roomImg"><div class="extCallNotif__trivial--big">';
if (this.avatarURLs.length === 1) {
buffer += `
<div class="extCallNotif__trivial__avatar extCallNotif__trivial__avatar--1o2"><img class="extCallNotif__trivial__img" draggable="false" src="${this.avatarURLs[0]}" alt=""/></div> \
<div class="extCallNotif__trivial__avatar extCallNotif__trivial__avatar--2o2 extCallNotif__trival__avatar--grey"></div>
`;
}
if (this.avatarURLs.length === 2) {
buffer += `
<div class="extCallNotif__trivial__avatar extCallNotif__trivial__avatar--1o2"><img class="extCallNotif__trivial__img" draggable="false" src="${this.avatarURLs[0]}" alt="" /></div> \
<div class="extCallNotif__trivial__avatar extCallNotif__trivial__avatar--2o2"><img class="extCallNotif__trivial__img" draggable="false" src="${this.avatarURLs[1]}" alt="" /></div>
`;
}
if (this.avatarURLs.length > 2) {
buffer += `
<div class="extCallNotif__trivial__avatar extCallNotif__trivial__avatar--1o3"><img class="extCallNotif__trivial__img" draggable="false" src="${this.avatarURLs[0]}" alt="" /></div> \
<div class="extCallNotif__trivial__avatar extCallNotif__trivial__avatar--2o3"><img class="extCallNotif__trivial__img" draggable="false" src="${this.avatarURLs[1]}" alt="" /></div> \
<div class="extCallNotif__trivial__avatar extCallNotif__trivial__avatar--3o3"><img class="extCallNotif__trivial__img" draggable="false" src="${this.avatarURLs[2]}" alt="" /></div>
`;
}
buffer += '</div></div>';
return buffer;
}
getWebinarAvatar() {
if (this.webinarAvatarURL === 'default') {
const colorClass = this.computeWebinarColor(this.origin);
const buffer = '<svg class="webinar-banner" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 304 152"><defs><linearGradient id="Dégradé_sans_nom_587" x1="312.59" y1="92.98" x2="-43.17" y2="0.13" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff" stop-opacity="0.1"/><stop offset="0.56" stop-color="#281e00" stop-opacity="0.4"/><stop offset="1" stop-color="#140000" stop-opacity="0.8"/></linearGradient><linearGradient id="Dégradé_sans_nom_585" x1="414.86" y1="134.51" x2="208.64" y2="70" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff" stop-opacity="0.1"/><stop offset="0.52" stop-color="#281e00" stop-opacity="0.4"/><stop offset="1" stop-color="#140000" stop-opacity="0.9"/></linearGradient><linearGradient id="Dégradé_sans_nom_588" x1="-114.57" y1="26.11" x2="86.11" y2="113.43" xlink:href="#Dégradé_sans_nom_587"/></defs><rect style="fill: ' + colorClass + ';" x="" y="0" width="304" height="152" /><g class="gradients"><polygon points="0.18 0 104.78 104.97 210.13 0 0.18 0" style="fill:url(#Dégradé_sans_nom_587)"/><polygon points="304 0 210.18 0 104.81 105 151.64 152 304 152 304 0" style="fill:url(#Dégradé_sans_nom_585)"/><polygon points="0.18 0 0 0 0 152 151.64 152 0.18 0" style="fill:url(#Dégradé_sans_nom_588)"/></g><g class="decorations"><circle cx="268.39" cy="23.51" r="3"/><path d="M38.53,87.4,14.7,88.67l5.06,6.26-1.17,6.21,3.93-2.79,5.19,6.43L38.57,87.45Zm-11,13.94-3.94-4.88,6.52-4.09-8.69,1.4-2.68-3.31,16.15-.86Z"/><path d="M38.56,12.07a3,3,0,1,1-3,3,3,3,0,0,1,3-3m0-3a6,6,0,1,0,6,6,6,6,0,0,0-6-6Z"/><path d="M288.94,116.71a1.5,1.5,0,1,1-1.5,1.5,1.5,1.5,0,0,1,1.5-1.5m0-3a4.5,4.5,0,1,0,4.5,4.5,4.51,4.51,0,0,0-4.5-4.5Z"/><path d="M84.17,88h-2V86a1,1,0,0,0-1-1h-1a1,1,0,0,0-1,1v2h-2a1,1,0,0,0-1,1v1a1,1,0,0,0,1,1h2v2a1,1,0,0,0,1,1h1a1,1,0,0,0,1-1V91h2a1,1,0,0,0,1-1V89A1,1,0,0,0,84.17,88Z"/><path d="M22.46,23.36a26.15,26.15,0,0,1,1.39,2.46l2.69-1.33A26.87,26.87,0,0,0,25,21.74Z"/><path d="M18.92,18.89c.67.7,1.3,1.43,1.88,2.16l2.35-1.87c-.64-.8-1.33-1.59-2.06-2.36Z"/><path d="M16,63.37l2.44,1.74c.61-.85,1.18-1.69,1.73-2.52l-2.51-1.65C17.1,61.74,16.54,62.55,16,63.37Z"/><path d="M14.61,15.06c.78.6,1.53,1.21,2.23,1.84l2-2.24c-.76-.68-1.57-1.34-2.4-2Z"/><path d="M28.06,46l-2.89-.8c-.25.9-.55,1.83-.87,2.76l2.82,1C27.48,48,27.79,47,28.06,46Z"/><path d="M26,51.84l-2.76-1.18c-.37.87-.78,1.76-1.21,2.65l2.69,1.33C25.18,53.7,25.61,52.75,26,51.84Z"/><path d="M19.2,58.45,21.76,60c.55-.9,1.06-1.78,1.54-2.65l-2.63-1.45C20.21,56.75,19.72,57.59,19.2,58.45Z"/><path d="M12.4,68.09,14.74,70c.65-.81,1.27-1.61,1.87-2.4l-2.4-1.81C13.63,66.52,13,67.3,12.4,68.09Z"/><path d="M29.23,39.86l-3-.3c-.09.93-.23,1.88-.41,2.83l2.94.57C29,41.92,29.12,40.88,29.23,39.86Z"/><path d="M27.78,27.4l-2.82,1a23.16,23.16,0,0,1,.79,2.7l2.93-.68A27.77,27.77,0,0,0,27.78,27.4Z"/><path d="M4.91,77.53l2.41,1.79c.58-.77,1.17-1.56,1.8-2.37L6.74,75.12Z"/><path d="M2.29,86.64,0,85.2v3.51l.77.45C1.24,88.34,1.75,87.5,2.29,86.64Z"/><path d="M0,4.46V7.23c.6.23,1.22.46,1.88.73L3,5.18C2,4.76,1,4.4.13,4.09Z"/><path d="M1.41,82.49,3.9,84.16c.53-.79,1.09-1.6,1.68-2.44L3.13,80C2.53,80.84,2,81.68,1.41,82.49Z"/><path d="M9.77,11.82c.86.5,1.69,1,2.48,1.55l1.66-2.49c-.83-.56-1.71-1.11-2.62-1.64Z"/><path d="M2.19,111A9.47,9.47,0,0,1,0,110.61v3.09a13.09,13.09,0,0,0,2.11.25Z"/><path d="M26.23,33.89a26.55,26.55,0,0,1,.15,2.83h3a29.78,29.78,0,0,0-.17-3.15Z"/><path d="M11,74.61l1.88-2.31-2.32-1.9c-.65.79-1.29,1.57-1.9,2.34Z"/><path d="M4.58,9.12c.89.41,1.78.85,2.63,1.29L8.59,7.75C7.7,7.28,6.77,6.83,5.83,6.4Z"/><path d="M11.51,110.38a4.84,4.84,0,0,0,1.19-3.09,4,4,0,0,0-.12-1L9.66,107a1.76,1.76,0,0,1,0,.31,1.85,1.85,0,0,1-.51,1.18Z"/><path d="M4.83,110.71l.61,2.93a13,13,0,0,0,3.19-1.08L7.3,109.87A10.88,10.88,0,0,1,4.83,110.71Z"/><path d="M284.45,141.81c-.85-.49-1.68-1-2.47-1.55l-1.67,2.5c.84.56,1.73,1.11,2.62,1.64Z"/><path d="M281.82,85.54l-2.34-1.87c-.65.81-1.27,1.61-1.87,2.4L280,87.88C280.59,87.11,281.19,86.33,281.82,85.54Z"/><path d="M279.61,138.58c-.77-.6-1.53-1.22-2.23-1.84l-2,2.24c.76.67,1.57,1.34,2.4,2Z"/><path d="M289.31,76.1l-2.41-1.79q-.87,1.17-1.8,2.37l2.38,1.84Z"/><path d="M278.26,90.27l-2.45-1.74c-.6.85-1.17,1.69-1.72,2.52l2.5,1.65C277.12,91.9,277.68,91.09,278.26,90.27Z"/><path d="M282.72,43.25a4.85,4.85,0,0,0-1.2,3.09,4,4,0,0,0,.12,1l2.92-.67a1.76,1.76,0,0,1,0-.31,1.85,1.85,0,0,1,.51-1.18Z"/><path d="M283.27,79c-.61.76-1.23,1.53-1.88,2.31l2.31,1.91,1.91-2.34Z"/><path d="M265,113.78l3,.29c.09-.92.23-1.87.41-2.83l-2.94-.56C265.25,111.72,265.09,112.76,265,113.78Z"/><path d="M266.16,107.64l2.89.8c.25-.91.54-1.84.87-2.76l-2.83-1C266.74,105.67,266.43,106.67,266.16,107.64Z"/><path d="M275,95.18l-2.57-1.55c-.54.89-1.05,1.78-1.53,2.65l2.63,1.44C274,96.89,274.5,96,275,95.18Z"/><path d="M266.44,126.23l2.82-1a25.29,25.29,0,0,1-.79-2.7l-2.93.68A27,27,0,0,0,266.44,126.23Z"/><path d="M271.77,130.28a25.47,25.47,0,0,1-1.4-2.47l-2.69,1.34a30,30,0,0,0,1.56,2.74Z"/><path d="M275.3,134.74c-.67-.7-1.3-1.42-1.88-2.15l-2.35,1.86c.64.8,1.33,1.6,2.07,2.36Z"/><path d="M268.22,101.8,271,103c.37-.87.78-1.76,1.21-2.65L269.5,99C269,99.94,268.61,100.88,268.22,101.8Z"/><path d="M300.8,44.84A8.42,8.42,0,0,0,298.61,42l-1.94,2.29a5.4,5.4,0,0,1,1.41,1.86Z"/><path d="M301.76,49.58c0-.47,0-.94-.06-1.38l-3,.31a9.25,9.25,0,0,1,.05,1.07,14.81,14.81,0,0,1-.09,1.59l3,.35A16.46,16.46,0,0,0,301.76,49.58Z"/><path d="M299.68,151.27v0l.09,0,.09-.39,1.14-2.3-.21-.1-.35-.14s-1-.22-2.56-.7l-.88,2.87c1.3.4,2.21.63,2.59.72Z"/><path d="M298.13,53.9a26.52,26.52,0,0,1-.87,2.72l2.82,1c.38-1,.7-2,.95-3Z"/><path d="M268,119.74a24.11,24.11,0,0,1-.16-2.82h-3a30.12,30.12,0,0,0,.17,3.16Z"/><path d="M304,149.94l-.33-.14-.94,2.2H304Z"/><path d="M289.65,144.51c-.91-.41-1.8-.85-2.64-1.28l-1.38,2.66c.88.46,1.81.91,2.77,1.35Z"/><path d="M292.81,71.15l-2.49-1.67q-.79,1.18-1.68,2.43l2.44,1.74C291.69,72.79,292.27,72,292.81,71.15Z"/><path d="M295.09,146.72c-.93-.33-1.85-.68-2.74-1l-1.13,2.78c.93.37,1.89.74,2.87,1.09Z"/><path d="M289.4,42.92,288.79,40a13.54,13.54,0,0,0-3.2,1.08l1.33,2.69A11,11,0,0,1,289.4,42.92Z"/><path d="M293.45,64.48c-.47.81-1,1.65-1.52,2.52l2.54,1.59c.56-.89,1.09-1.76,1.58-2.61Z"/><path d="M295.49,40.25a11.83,11.83,0,0,0-3.37-.56l-.09,3a8.48,8.48,0,0,1,2.53.42Z"/><path d="M298.89,60.53l-2.73-1.24c-.39.84-.82,1.72-1.29,2.62l2.66,1.39C298,62.35,298.48,61.42,298.89,60.53Z"/></g><g class="elements"><path d="M96.55,136.5H91.38l-2.9-11.25c-.1-.4-.29-1.22-.55-2.48s-.4-2.1-.44-2.53c-.06.53-.21,1.38-.44,2.55s-.42,2-.54,2.49L83.62,136.5H78.46L73,115.09h4.47l2.74,11.69c.48,2.16.82,4,1,5.61.06-.56.19-1.42.4-2.59s.41-2.07.59-2.72l3.12-12h4.3l3.12,12c.13.54.3,1.36.51,2.47s.36,2,.47,2.84c.09-.76.25-1.71.47-2.85s.41-2.06.58-2.76l2.73-11.69H102Z" style="fill:#fff"/><path d="M120,136.5H107.7V115.09H120v3.72h-7.79v4.7h7.25v3.72h-7.25v5.52H120Z" style="fill:#fff"/><path d="M127.5,115.09h6.67c3,0,5.24.43,6.61,1.29a4.53,4.53,0,0,1,2.06,4.13,5.2,5.2,0,0,1-.9,3.15,3.62,3.62,0,0,1-2.4,1.48v.14a4.75,4.75,0,0,1,2.94,1.7,5.54,5.54,0,0,1,.9,3.31,5.45,5.45,0,0,1-2.12,4.57,9.1,9.1,0,0,1-5.75,1.64h-8Zm4.54,8.48h2.64a4.81,4.81,0,0,0,2.67-.57,2.13,2.13,0,0,0,.83-1.89,1.9,1.9,0,0,0-.9-1.77,5.87,5.87,0,0,0-2.85-.53H132Zm0,3.6v5.58h3a4.46,4.46,0,0,0,2.77-.71,2.64,2.64,0,0,0,.89-2.2q0-2.67-3.81-2.67Z" style="fill:#fff"/><path d="M150.66,136.5V115.09h4.54V136.5Z" style="fill:#fff"/><path d="M182.59,136.5h-5.77l-9.32-16.2h-.13c.18,2.86.28,4.91.28,6.13V136.5h-4.06V115.09h5.73l9.3,16h.1c-.15-2.79-.22-4.75-.22-5.91V115.09h4.09Z" style="fill:#fff"/><path d="M204.09,136.5l-1.55-5.09h-7.81l-1.55,5.09h-4.9l7.56-21.5h5.55L209,136.5Zm-2.64-8.9q-2.14-6.93-2.42-7.84c-.18-.6-.31-1.08-.39-1.43q-.48,1.88-2.77,9.27Z" style="fill:#fff"/><path d="M219.22,128.29v8.21h-4.54V115.09h6.24q4.37,0,6.46,1.59a6.34,6.34,0,0,1,1.05,8.19,6.79,6.79,0,0,1-2.94,2.3q4.83,7.23,6.3,9.33h-5l-5.11-8.21Zm0-3.7h1.46a5.59,5.59,0,0,0,3.18-.71,2.55,2.55,0,0,0,1-2.26,2.35,2.35,0,0,0-1-2.17,6.36,6.36,0,0,0-3.24-.64h-1.38Z" style="fill:#fff"/><path d="M263.58,70.23,234.1,65a1.87,1.87,0,0,0-2.17,1.52L228,88.66a1.87,1.87,0,0,0,1.52,2.17L259,96a1.87,1.87,0,0,0,2.17-1.52l3.9-22.11A1.87,1.87,0,0,0,263.58,70.23ZM250.47,88.32l-5.62-1-9.35-1.65,8.7-11.05,3.14,9.28L251,79.68l3.23,9.3Zm5-12.31a2,2,0,1,1-1.62-2.32A2,2,0,0,1,255.48,76Z" style="fill:#f8f8f8"/><path d="M60.48,48.9a6.81,6.81,0,1,0,7.9,5.53A6.81,6.81,0,0,0,60.48,48.9Zm0,11.49-1.56-8.86,6.6,2.89.17,1Z" style="fill:#f8f8f8"/><path d="M81.3,63.32,77.48,41.65A2,2,0,0,0,75.17,40L43.65,45.59A2,2,0,0,0,42,47.9l3.82,21.67a2,2,0,0,0,2.32,1.62l31.51-5.55A2,2,0,0,0,81.3,63.32ZM63.4,65.46a10,10,0,1,1,8.12-11.58A10,10,0,0,1,63.4,65.46Z" style="fill:#f8f8f8"/><g id="guy"><path d="M157.74,40h0a2.88,2.88,0,0,1,0-5.75h0v5.48c0,.09,0,.18,0,.27Z" style="fill:#fff"/><path d="M160.07,29.29c0-8.22,2.23-13.32,13.32-13.32a4.06,4.06,0,0,0,1.87-.51l.91-.46.1-.32h.13l0,.08a2.61,2.61,0,0,0,1.71,1.2c6.07,1.17,8.54,5,8.54,13.32v.26h-1.95l-3.23-4.29-1.12-1.49-1.71.78-9.11,4.06,1.85-4.95-5.86,3.65L162,29.55h-1.88Z" style="fill:#fff"/><path d="M189.21,40h-.16c0-.09,0-.17,0-.26V34.29l.14,0h0a2.88,2.88,0,0,1,0,5.75Z" style="fill:#fff"/><path d="M183.27,59.69l.65.25c1.62.66,5.39,2.47,5.39,4.87V87H157.43V64.81c0-2.4,3.77-4.21,5.4-4.87l.67-.25h0c1.4,2.06,5.31,3.55,9.89,3.55S181.87,61.75,183.27,59.69Z" style="fill:#fff"/><path d="M180.82,58.9a5.72,5.72,0,0,1-1.12.71,16.38,16.38,0,0,1-12.67,0,6.23,6.23,0,0,1-1.12-.71c.85-.24,1.74-.44,2.67-.62l1.91-.36V55.15h0a15.63,15.63,0,0,0,2.92.28,15.82,15.82,0,0,0,2.85-.26v2.76l1.91.36C179.08,58.46,180,58.66,180.82,58.9Z" style="fill:#fff"/><path d="M183.61,31.92l-3.92-5.23-11.75,5.23h-2.08l1-2.61-4.22,2.61h-2.55v7.83a13.32,13.32,0,0,0,26.64,0V31.92Zm-16.77,5.21a1.31,1.31,0,1,1,0-2.61h0a1.31,1.31,0,0,1,0,2.61Zm14.38-1.3a1.31,1.31,0,1,1-1.3-1.31,1.31,1.31,0,0,1,1.3,1.31Z" style="fill:#fff"/><g class="border"> \
<path d="M166.85,34.52h0a1.31,1.31,0,1,0,1.3,1.31A1.3,1.3,0,0,0,166.84,34.52Z"/><path d="M179.92,34.52a1.31,1.31,0,1,0,1.3,1.31h0A1.31,1.31,0,0,0,179.92,34.52Z"/><path d="M189.21,31.92l-.15,0v0h0V29.31c0-7.38-1.8-14-10.44-15.67-.72-.14.78-2.54,0-2.61h-.06A8.53,8.53,0,0,0,176,12.36h-.07c-.45,0-2-1.36-2.43-1.36v0h-.06c-.26.14,1.07,2.21.84,2.35a2.26,2.26,0,0,1-.84.28c-13.06,0-15.67,7-15.67,15.67v2.6a5.23,5.23,0,1,0,0,10.45l.25,0a15.65,15.65,0,0,0,10.21,12.17V56c-6,1.15-13.09,4.1-13.09,8.86V89.35h36.55V64.81c0-3.42-3.64-5.91-7.93-7.46a2.49,2.49,0,0,1,.13.67,2.29,2.29,0,0,0-.14-.68,32.23,32.23,0,0,0-5.1-1.36V54.52h0a15.68,15.68,0,0,0,10.25-12.18h0l.36,0a5.23,5.23,0,0,0,5.24-5.21v0A5.24,5.24,0,0,0,189.21,31.92ZM157.74,40h0a2.88,2.88,0,0,1,0-5.75h0v5.48c0,.09,0,.18,0,.27Zm2.33-10.73c0-8.22,2.23-13.32,13.32-13.32a4.06,4.06,0,0,0,1.87-.51l.91-.46.1-.32h.13l0,.08a2.61,2.61,0,0,0,1.71,1.2c6.07,1.17,8.54,5,8.54,13.32v.26h-1.95l-3.23-4.29-1.12-1.49-1.71.78-9.11,4.06,1.85-4.95-5.86,3.65L162,29.55h-1.88Zm23.2,30.4.65.25c1.62.66,5.39,2.47,5.39,4.87V87H157.43V64.81c0-2.4,3.77-4.21,5.4-4.87l.67-.25h0c1.4,2.06,5.31,3.55,9.89,3.55S181.87,61.75,183.27,59.69Zm-2.45-.79a5.72,5.72,0,0,1-1.12.71,16.38,16.38,0,0,1-12.67,0,6.23,6.23,0,0,1-1.12-.71c.85-.24,1.74-.44,2.67-.62l1.91-.36V55.15h0a15.63,15.63,0,0,0,2.92.28,15.82,15.82,0,0,0,2.85-.26v2.76l1.91.36C179.08,58.46,180,58.66,180.82,58.9Zm5.89-19.15a13.32,13.32,0,0,1-26.64,0V31.92h2.55l4.22-2.61-1,2.61h2.08l11.75-5.23,3.92,5.23h3.1Zm2.5.27h-.16c0-.09,0-.17,0-.26V34.29l.14,0h0a2.88,2.88,0,0,1,0,5.75Z"/></g></g><g id="screen"><rect x="117.65" y="58.79" width="4.94" height="23.04" style="fill:#fff"/><rect x="124.23" y="63.18" width="4.94" height="18.65" style="fill:#fff"/><rect x="130.81" y="68.66" width="4.94" height="13.16" style="fill:#fff"/><rect x="111.07" y="68.66" width="4.94" height="13.16" style="fill:#fff"/><path d="M120.39,41.24V34.1a7.14,7.14,0,1,0,7.13,7.14Z" style="fill:#fff"/><path d="M122,39.59h7.13A7.13,7.13,0,0,0,122,32.46Z" style="fill:#fff"/><path d="M200.21,22.41H193.3c.11,1.31.17,2.65.18,4h6.73V86.75H106V26.41h48.19c0-1.35.06-2.69.17-4H106a4,4,0,0,0-4,4V86.75a4,4,0,0,0,4,4h41.36A20.84,20.84,0,0,1,145.7,98h.12a2,2,0,0,0-.65,1.47v.11H162.1v-.11a2,2,0,0,0-.65-1.47h.12a21.09,21.09,0,0,1-1.66-7.21h40.3a4,4,0,0,0,4-4V26.41A4,4,0,0,0,200.21,22.41Z" style="fill:#fff"/></g></g></svg>';
return `<div class="extCallNotif__webinarImg">${buffer}</div>`;
}
return `<img class="extCallNotif__webinarImg" src="${this.webinarAvatarURL}" alt="" />`;
}
getActionByName(actionName) {
return this.actions.find((action) => { return action.name === actionName; });
}
computeWebinarColor(name) {
const upperCaseWebinarName = name.toUpperCase();
const colors = ["#d3a575", "#eb8d8d", "#d47ab0", "#b38deb", "#9aa3ed", "#76a6e5", "#92d0de", "#a7d6bc", "#99c86b", "#b4d43d", "#dcd33b", "#eec838"];
let sum = 0;
for (let i = 0; i < upperCaseWebinarName.length; i++) {
sum += upperCaseWebinarName.charCodeAt(i);
}
return colors[sum % 12];
}
}
export { RainbowNotification, RainbowNotificationAction };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9lc2NhcGUuanMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xuY29uc3QgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xuY29uc3Qgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIEhUTUwgZW50aXRpZXMgYW5kIEhUTUwgY2hhcmFjdGVycy4gKi9cbmNvbnN0IHJlVW5lc2NhcGVkSHRtbCA9IC9bJjw+XCInYF0vZztcbmNvbnN0IHJlSGFzVW5lc2NhcGVkSHRtbCA9IFJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTtcblxuLyoqIFVzZWQgdG8gbWFwIGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy4gKi9cbmNvbnN0IGh0bWxFc2NhcGVzID0ge1xuICAgICcmJzogJyZhbXA7JyxcbiAgICAnPCc6ICcmbHQ7JyxcbiAgICAnPic6ICcmZ3Q7JyxcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyYjMzk7JyxcbiAgICAnYCc6ICcmIzk2Oydcbn07XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG5jb25zdCBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG5jb25zdCBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG5jb25zdCByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnByb3BlcnR5T2ZgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VQcm9wZXJ0eU9mKG9iamVjdCkge1xuICAgIHJldHVybiBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gICAgfTtcbn1cblxuLyoqXG4gKiBVc2VkIGJ5IGBfLmVzY2FwZWAgdG8gY29udmVydCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLlxuICovXG5jb25zdCBlc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xuY29uc3Qgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG5jb25zdCBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbmNvbnN0IFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbmNvbnN0IHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZDtcbmNvbnN0IHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAqIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpIHtcbiAgICAvLyBFeGl0IGVhcmx5IGZvciBzdHJpbmdzIHRvIGF2b2lkIGEgcGVyZm9ybWFuY2UgaGl0IGluIHNvbWUgZW52aXJvbm1lbnRzLlxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSAoU3RyaW5nKHZhbHVlKSk7XG4gICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odmFsdWUpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvU3RyaW5nKG51bGwpO1xuICogLy8gPT4gJydcbiAqXG4gKiBfLnRvU3RyaW5nKC0wKTtcbiAqIC8vID0+ICctMCdcbiAqXG4gKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiAnMSwyLDMnXG4gKi9cbmZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgdGhlIGNoYXJhY3RlcnMgXCImXCIsIFwiPFwiLCBcIj5cIiwgJ1wiJywgXCInXCIsIGFuZCBcIlxcYFwiIGluIGBzdHJpbmdgIHRvXG4gKiB0aGVpciBjb3JyZXNwb25kaW5nIEhUTUwgZW50aXRpZXMuXG4gKlxuICogKipOb3RlOioqIE5vIG90aGVyIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQuIFRvIGVzY2FwZSBhZGRpdGlvbmFsXG4gKiBjaGFyYWN0ZXJzIHVzZSBhIHRoaXJkLXBhcnR5IGxpYnJhcnkgbGlrZSBbX2hlX10oaHR0cHM6Ly9tdGhzLmJlL2hlKS5cbiAqXG4gKiBUaG91Z2ggdGhlIFwiPlwiIGNoYXJhY3RlciBpcyBlc2NhcGVkIGZvciBzeW1tZXRyeSwgY2hhcmFjdGVycyBsaWtlXG4gKiBcIj5cIiBhbmQgXCIvXCIgZG9uJ3QgbmVlZCBlc2NhcGluZyBpbiBIVE1MIGFuZCBoYXZlIG5vIHNwZWNpYWwgbWVhbmluZ1xuICogdW5sZXNzIHRoZXkncmUgcGFydCBvZiBhIHRhZyBvciB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuIFNlZVxuICogW01hdGhpYXMgQnluZW5zJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2FtYmlndW91cy1hbXBlcnNhbmRzKVxuICogKHVuZGVyIFwic2VtaS1yZWxhdGVkIGZ1biBmYWN0XCIpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQmFja3RpY2tzIGFyZSBlc2NhcGVkIGJlY2F1c2UgaW4gSUUgPCA5LCB0aGV5IGNhbiBicmVhayBvdXQgb2ZcbiAqIGF0dHJpYnV0ZSB2YWx1ZXMgb3IgSFRNTCBjb21tZW50cy4gU2VlIFsjNTldKGh0dHBzOi8vaHRtbDVzZWMub3JnLyM1OSksXG4gKiBbIzEwMl0oaHR0cHM6Ly9odG1sNXNlYy5vcmcvIzEwMiksIFsjMTA4XShodHRwczovL2h0bWw1c2VjLm9yZy8jMTA4KSwgYW5kXG4gKiBbIzEzM10oaHR0cHM6Ly9odG1sNXNlYy5vcmcvIzEzMykgb2YgdGhlXG4gKiBbSFRNTDUgU2VjdXJpdHkgQ2hlYXRzaGVldF0oaHR0cHM6Ly9odG1sNXNlYy5vcmcvKSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFdoZW4gd29ya2luZyB3aXRoIEhUTUwgeW91IHNob3VsZCBhbHdheXNcbiAqIFtxdW90ZSBhdHRyaWJ1dGUgdmFsdWVzXShodHRwOi8vd29ua28uY29tL3Bvc3QvaHRtbC1lc2NhcGluZykgdG8gcmVkdWNlXG4gKiBYU1MgdmVjdG9ycy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gKiAvLyA9PiAnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJ1xuICovXG5jb25zdCBfZXNjYXBlID0gZnVuY3Rpb24gZXNjYXBlKHN0cmluZykge1xuICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSkgP1xuICAgICAgICBzdHJpbmcucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsIGVzY2FwZUh0bWxDaGFyKSA6XG4gICAgICAgIHN0cmluZztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IF9lc2NhcGU7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1tdWx0aS1zdHIgKi9cbmltcG9ydCBfZXNjYXBlIGZyb20gJy4vZXNjYXBlJztcbmV4cG9ydCBjbGFzcyBSYWluYm93Tm90aWZpY2F0aW9uQWN0aW9uIHtcblxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIGxhYmVsOiBzdHJpbmc7XG4gICAgcHVibGljIGNvbG9yOiBzdHJpbmc7XG4gICAgcHVibGljIGljb246IHN0cmluZztcbiAgICBwdWJsaWMgb3B0aW9uczogYW55W107XG4gICAgcHVibGljIG9wdGlvbnNEZWZhdWx0TGFiZWw6IHN0cmluZyA9ICdkZWZhdWx0JztcbiAgICBwdWJsaWMgb3B0aW9uc0hlYWRlckxhYmVsOiBzdHJpbmcgPSBudWxsO1xuICAgIHB1YmxpYyBvcHRpb25IYW5kbGVyOiBhbnk7XG4gICAgcHVibGljIGNob2ljZTogYW55W107XG4gICAgcHVibGljIGNob2ljZVRpdGxlTGFiZWw6IHN0cmluZyA9IG51bGw7XG4gICAgcHVibGljIGNob2ljZUNsb3NlTGFiZWw6IHN0cmluZztcbiAgICBwdWJsaWMgY2hvaWNlSGFuZGxlcjogYW55O1xuICAgIHB1YmxpYyBoYW5kbGVyOiBhbnkgPSBudWxsO1xuICAgIHB1YmxpYyBmb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBjaG9pY2VWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBvcHRpb25WaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShjb25maWc6IGFueSk6IFJhaW5ib3dOb3RpZmljYXRpb25BY3Rpb24ge1xuICAgICAgICBjb25zdCBhY3Rpb24gPSBuZXcgUmFpbmJvd05vdGlmaWNhdGlvbkFjdGlvbigpO1xuICAgICAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7IGlmIChjb25maWdba2V5XSkgYWN0aW9uW2tleV0gPSBjb25maWdba2V5XTsgfSk7XG4gICAgICAgIHJldHVybiBhY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIHRvb2dsZUNob2ljZShub3RpZjogUmFpbmJvd05vdGlmaWNhdGlvbik6IGFueSB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaG9pY2VFbGVtOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgY2FsbE5vdGlmX2Nob2ljZV8ke25vdGlmLmlkfV8ke3RoaXMubmFtZX1gKTtcbiAgICAgICAgICAgIGNvbnN0IGNob2ljZUFjdGlvbkVsZW06IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBjYWxsTm90aWZfJHtub3RpZi5pZH1fJHt0aGlzLm5hbWV9YCk7XG4gICAgICAgICAgICBpZiAoY2hvaWNlRWxlbSAmJiBjaG9pY2VBY3Rpb25FbGVtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaG9pY2VWaXNpYmxlID0gIXRoaXMuY2hvaWNlVmlzaWJsZTtcbiAgICAgICAgICAgICAgICBjaG9pY2VFbGVtLnN0eWxlLm9wYWNpdHkgPSB0aGlzLmNob2ljZVZpc2libGUgPyAxIDogMDtcbiAgICAgICAgICAgICAgICBjaG9pY2VFbGVtLnN0eWxlLnpJbmRleCA9IHRoaXMuY2hvaWNlVmlzaWJsZSA/IDEgOiAtMTtcbiAgICAgICAgICAgICAgICBjaG9pY2VBY3Rpb25FbGVtLnRleHRDb250ZW50ID0gdGhpcy5jaG9pY2VWaXNpYmxlID8gdGhpcy5jaG9pY2VDbG9zZUxhYmVsIDogdGhpcy5sYWJlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9vZ2xlT3B0aW9uKG5vdGlmOiBSYWluYm93Tm90aWZpY2F0aW9uKTogYW55IHtcbiAgICAgICAgY29uc3Qgb3B0aW9uRWxlbTogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGNhbGxOb3RpZl9vcHRpb25fJHtub3RpZi5pZH1fJHt0aGlzLm5hbWV9YCk7XG4gICAgICAgIGlmIChvcHRpb25FbGVtKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvblZpc2libGUgPSAhdGhpcy5vcHRpb25WaXNpYmxlO1xuICAgICAgICAgICAgb3B0aW9uRWxlbS5zdHlsZS5vcGFjaXR5ID0gdGhpcy5vcHRpb25WaXNpYmxlID8gMSA6IDA7XG4gICAgICAgICAgICBvcHRpb25FbGVtLnN0eWxlLnpJbmRleCA9IHRoaXMub3B0aW9uVmlzaWJsZSA/IDEgOiAtMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjaG9pY2VBY3Rpb24oY2hvaWNlSWQ6IHN0cmluZykgeyByZXR1cm4gKCkgPT4geyB0aGlzLmNob2ljZUhhbmRsZXIoY2hvaWNlSWQpOyB9OyB9XG4gICAgcHVibGljIG9wdGlvbkFjdGlvbihvcHRpb25JZDogc3RyaW5nKSB7IHJldHVybiAoKSA9PiB7IHRoaXMub3B0aW9uSGFuZGxlcihvcHRpb25JZCk7IH07IH1cbn1cblxuZXhwb3J0IGNsYXNzIFJhaW5ib3dOb3RpZmljYXRpb24ge1xuXG4gICAgcHVibGljIGlkOiBzdHJpbmcgPSBudWxsO1xuICAgIHB1YmxpYyBjb252SWQ6IHN0cmluZyA9IG51bGw7XG4gICAgcHVibGljIHR5cGU6IHN0cmluZyA9IG51bGw7XG4gICAgcHVibGljIG1lc3NhZ2U6IHN0cmluZyA9IG51bGw7XG4gICAgcHVibGljIG1kTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcbiAgICBwdWJsaWMgb3JpZ2luOiBzdHJpbmcgPSBudWxsO1xuICAgIHB1YmxpYyBhdmF0YXJVUkw6IHN0cmluZyA9IG51bGw7XG4gICAgcHVibGljIGF2YXRhclVSTHM6IHN0cmluZ1tdID0gbnVsbDtcbiAgICBwdWJsaWMgd2ViaW5hckF2YXRhclVSTDogc3RyaW5nID0gbnVsbDtcbiAgICBwdWJsaWMgaW5mb1RpdGxlOiBzdHJpbmcgPSBudWxsO1xuICAgIHB1YmxpYyBpbmZvTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcbiAgICBwdWJsaWMgY2FsbFN1YmplY3Q6IHN0cmluZyA9IG51bGw7XG4gICAgcHVibGljIGNhbGxlZDogc3RyaW5nID0gbnVsbDtcbiAgICBwdWJsaWMgY2FsbGVkTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcbiAgICBwdWJsaWMgdXJnZW5jeTogc3RyaW5nID0gJ3N0ZCc7XG4gICAgcHVibGljIHVyZ2VuY3lMYWJlbDogc3RyaW5nID0gbnVsbDtcbiAgICBwdWJsaWMgZGVsYXk6IG51bWJlciA9IDE1MDAwO1xuICAgIHB1YmxpYyBkZWxheVRpbWVvdXQgPSBudWxsO1xuICAgIHB1YmxpYyBhdXRvQ2xvc2VBY3Rpb24gPSBudWxsO1xuICAgIHB1YmxpYyBpbmZvSGFuZGxlcjogYW55ID0gbnVsbDtcbiAgICBwdWJsaWMgYWN0aW9uczogUmFpbmJvd05vdGlmaWNhdGlvbkFjdGlvbltdID0gbnVsbDtcbiAgICBwdWJsaWMgaWNvblBhdGg6IHN0cmluZyA9ICdhc3NldHMvaW1hZ2VzJztcbiAgICBwdWJsaWMgdXJnZW5jeUljb246IHN0cmluZyA9IG51bGw7XG4gICAgcHVibGljIHVyZ2VuY3lDbGFzczogc3RyaW5nID0gbnVsbDtcbiAgICBwdWJsaWMgaXNEYXJrVGhlbWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY2xvc2U6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGNvbmZpZzogYW55KSB7XG4gICAgICAgIGNvbnN0IHJhaW5ib3dOb3RpZmljYXRpb24gPSBuZXcgUmFpbmJvd05vdGlmaWNhdGlvbigpO1xuICAgICAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29uZmlnW2tleV0gJiYgcmFpbmJvd05vdGlmaWNhdGlvbltrZXldICE9PSB1bmRlZmluZWQpIHsgcmFpbmJvd05vdGlmaWNhdGlvbltrZXldID0gY29uZmlnW2tleV07IH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJhaW5ib3dOb3RpZmljYXRpb24udXJnZW5jeSkge1xuICAgICAgICAgICAgY29uc3QgaWNvbnMgPSB7IHN0ZDogbnVsbCwgbG93OiAnYnVsYicsIG1pZGRsZTogJ3Byb2JsZW0tYWxlcnQnLCBoaWdoOiAnc2lyZW4nIH07XG4gICAgICAgICAgICBjb25zdCBjbGFzc2VzID0geyBzdGQ6IG51bGwsIGxvdzogJ2V4dENhbGxOb3RpZl9fdXJnLW5vdGlmeScsIG1pZGRsZTogJ2V4dENhbGxOb3RpZl9fdXJnLXdhcm5pbmcnLCBoaWdoOiAnZXh0Q2FsbE5vdGlmX191cmctZW1lcmdlbmN5JyB9O1xuICAgICAgICAgICAgcmFpbmJvd05vdGlmaWNhdGlvbi51cmdlbmN5SWNvbiA9IGAke3JhaW5ib3dOb3RpZmljYXRpb24uaWNvblBhdGh9L3Nwcml0ZS5zdmcjJHtpY29uc1tyYWluYm93Tm90aWZpY2F0aW9uLnVyZ2VuY3ldfWA7XG4gICAgICAgICAgICByYWluYm93Tm90aWZpY2F0aW9uLnVyZ2VuY3lDbGFzcyA9IGNsYXNzZXNbcmFpbmJvd05vdGlmaWNhdGlvbi51cmdlbmN5XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmFpbmJvd05vdGlmaWNhdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SFRNTENvbnRlbnQoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgY2xvc2UgPSB0aGlzLmNsb3NlID8gYDxkaXYgY2xhc3M9J2V4dENhbGxOb3RpZl9fY2xvc2UnIGlkPVwiY2FsbE5vdGlmXyR7dGhpcy5pZH1fY2xvc2VCdXR0b25cIj48c3ZnPjx1c2UgaHJlZj1cIiR7dGhpcy5pY29uUGF0aH0vc3ByaXRlLnN2ZyNjbG9zZVwiPjwvc3ZnPjwvZGl2PmAgOiAnJztcbiAgICAgICAgY29uc3QgdXJnZW5jeSA9ICh0aGlzLnVyZ2VuY3lMYWJlbCAmJiB0aGlzLnVyZ2VuY3lMYWJlbCAhPT0gJ3N0ZCcpID8gYDxkaXYgY2xhc3M9J2V4dENhbGxOb3RpZl9fdXJnICR7dGhpcy51cmdlbmN5Q2xhc3N9Jz48c3ZnPjx1c2UgaHJlZj1cIiR7dGhpcy51cmdlbmN5SWNvbn1cIj48L3N2Zz4ke3RoaXMudXJnZW5jeUxhYmVsfTwvZGl2PmAgOiAnJztcbiAgICAgICAgbGV0IGF2YXRhciA9IHRoaXMuYXZhdGFyVVJMID8gYDxpbWcgY2xhc3M9J2V4dENhbGxOb3RpZl9faW1nJyBzcmM9JyR7dGhpcy5hdmF0YXJVUkx9JyBkcmFnZ2FibGU9J2ZhbHNlJyBhbHQ9JycgLz5gIDogJyc7XG4gICAgICAgIGlmICh0aGlzLmF2YXRhclVSTHMpIHsgYXZhdGFyID0gdGhpcy5nZXRSb29tQXZhdGFyKCk7IH1cbiAgICAgICAgaWYgKHRoaXMud2ViaW5hckF2YXRhclVSTCkgeyBhdmF0YXIgPSB0aGlzLmdldFdlYmluYXJBdmF0YXIoKTsgfVxuICAgICAgICBjb25zdCBvcmlnaW4gPSB0aGlzLm9yaWdpbiA/IGA8ZGl2IGNsYXNzPSdleHRDYWxsTm90aWZfX29yaWdpbic+JHtfZXNjYXBlKHRoaXMub3JpZ2luKX08L2Rpdj5gIDogJyc7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgPGRpdiBjbGFzcz0nZXh0Q2FsbE5vdGlmX19tZXNzYWdlJz4ke3RoaXMubWVzc2FnZX08L2Rpdj5gO1xuICAgICAgICBjb25zdCBpbmZvVGl0bGUgPSB0aGlzLmluZm9UaXRsZSA/IGA8ZGl2IGNsYXNzPSdleHRDYWxsTm90aWZfX2luZm9UaXRsZSc+JHt0aGlzLmluZm9UaXRsZX08L2Rpdj5gIDogJyc7XG4gICAgICAgIGNvbnN0IGluZm9NZXNzYWdlID0gdGhpcy5pbmZvTWVzc2FnZSA/IGA8ZGl2IGNsYXNzPSdleHRDYWxsTm90aWZfX2luZm9NZXNzYWdlJz4ke3RoaXMuaW5mb01lc3NhZ2V9PC9kaXY+YCA6ICcnO1xuICAgICAgICBjb25zdCBjYWxsU3ViamVjdCA9IHRoaXMuY2FsbFN1YmplY3QgPyBgPGRpdiBjbGFzcz0nZXh0Q2FsbE5vdGlmX19jYWxsU3ViamVjdCc+JHtfZXNjYXBlKHRoaXMuY2FsbFN1YmplY3QpfTwvZGl2PmAgOiAnJztcbiAgICAgICAgY29uc3QgY2FsbGVkTWVzc2FnZSA9IHRoaXMuY2FsbGVkTWVzc2FnZSA/IGA8ZGl2IGNsYXNzPSdleHRDYWxsTm90aWZfX2NhbGxlZE1lc3NhZ2UnPiR7dGhpcy5jYWxsZWRNZXNzYWdlfTwvZGl2PmAgOiAnJztcbiAgICAgICAgY29uc3QgY2FsbGVkID0gdGhpcy5jYWxsZWQgPyBgPGRpdiBjbGFzcz0nZXh0Q2FsbE5vdGlmX19jYWxsZWQnPiR7dGhpcy5jYWxsZWR9PC9kaXY+YCA6ICcnO1xuICAgICAgICBjb25zdCBtZE1lc3NhZ2UgPSB0aGlzLm1kTWVzc2FnZSA/IGA8ZGl2IGNsYXNzPSdleHRDYWxsTm90aWZfX21kTWVzc2FnZSc+JHt0aGlzLm1kTWVzc2FnZX08L2Rpdj5gIDogJyc7XG5cbiAgICAgICAgbGV0IGFjdGlvbnNBcmVhID0gJyc7XG4gICAgICAgIGlmICh0aGlzLmFjdGlvbnMpIHtcbiAgICAgICAgICAgIGFjdGlvbnNBcmVhID0gdGhpcy5hY3Rpb25zLnJlZHVjZSgoYnVmZmVyOiBzdHJpbmcsIGFjdGlvbjogUmFpbmJvd05vdGlmaWNhdGlvbkFjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhY3Rpb24ubmFtZSA9PT0gJ2Nsb3NlQnV0dG9uJykgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmNob2ljZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaG9pY2VUaXRsZSA9IGFjdGlvbi5jaG9pY2VUaXRsZUxhYmVsID8gYDxkaXYgaWQ9J2Nob2ljZVRpdGxlJyBjbGFzcz0nZXh0Q2FsbE5vdGlmX19jaG9pY2UtdGl0bGUnPiR7YWN0aW9uLmNob2ljZVRpdGxlTGFiZWx9PC9kaXY+YCA6ICcnO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2hvaWNlcyA9IGFjdGlvbi5jaG9pY2UucmVkdWNlKChidWZmOiBzdHJpbmcsIGNob2ljZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVmZiArIGA8bGkgaWQ9JyR7Y2hvaWNlLmlkfScgY2xhc3M9J2V4dENhbGxOb3RpZl9fY2hvaWNlJyB0YWJpbmRleD0nMCcgcm9sZT1cIm1lbnVpdGVtXCI+JHtjaG9pY2UubGFiZWx9PC9saT5gO1xuICAgICAgICAgICAgICAgICAgICB9LCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIGNob2ljZXMgKz0gYDxzZWN0aW9uIGlkPSdjYWxsTm90aWZfY2hvaWNlX2Nsb3NlXyR7dGhpcy5pZH1fJHthY3Rpb24ubmFtZX0nIGNsYXNzPSdleHRDYWxsTm90aWZfX2Nob2ljZUNsb3NlJz4ke2FjdGlvbi5jaG9pY2VDbG9zZUxhYmVsfTwvc2VjdGlvbj5gO1xuICAgICAgICAgICAgICAgICAgICBidWZmZXIgKz0gYDx1bCBpZD0nY2FsbE5vdGlmX2Nob2ljZV8ke3RoaXMuaWR9XyR7YWN0aW9uLm5hbWV9JyBjbGFzcz0nZXh0Q2FsbE5vdGlmX19jaG9pY2VzJyByb2xlPSdtZW51JyBhcmlhLWxhYmVsbGVkYnk9J2NhbGxOb3RpZl8ke3RoaXMuaWR9XyR7YWN0aW9uLm5hbWV9Jz4ke2Nob2ljZVRpdGxlfSR7Y2hvaWNlc308L3VsPmA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGFycm93ID0gJyc7XG4gICAgICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAg