@uex/web-extensions
Version:
Uex extensions for Angular 6+ web projects
268 lines • 25.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/modules/button/directives/ripple.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, ElementRef, Input, HostListener } from '@angular/core';
import * as _ from 'lodash';
/**
* Adiciona o efeito "ripple" ao clicar em um elemento
* @abstract
*/
export class RippleDirectiveBase {
/**
* @param {?} elementRef
*/
constructor(elementRef) {
this.elementRef = elementRef;
/**
* @ignore
*/
this._no_ripple = false;
this._default_ripple_opacity = '0.15';
}
/**
* @private
* @param {?} no_ripple
* @return {?}
*/
set set_no_ripple(no_ripple) {
this.no_ripple = _.isString(no_ripple) && no_ripple == '' ? true : (_.isBoolean(no_ripple) ? ((/** @type {?} */ (no_ripple))) : true);
}
/**
* @param {?} value
* @return {?}
*/
set no_ripple(value) {
this._no_ripple = value;
}
/**
* @return {?}
*/
get no_ripple() {
return this._no_ripple;
}
/**
* @param {?} e
* @return {?}
*/
_onClick(e) {
if (this.no_ripple) {
return;
}
/** @type {?} */
const targetEl = this.elementRef ? this.elementRef.nativeElement : null;
if (!targetEl) {
return;
}
if (this._animate_timeout) {
clearTimeout(this._animate_timeout);
}
/** @type {?} */
let rippleEl = ((/** @type {?} */ (targetEl.querySelector('.ripple'))));
if (!!rippleEl) {
rippleEl.classList.remove('animate');
}
else {
rippleEl = document.createElement('span');
rippleEl.classList.add('ripple');
targetEl.appendChild(rippleEl);
}
/** @type {?} */
let offset_x = e.offsetX;
/** @type {?} */
let offset_y = e.offsetY;
if (e.target != targetEl) {
/** @type {?} */
const relative_offset = this._relativeOffset((/** @type {?} */ (e.target)), targetEl);
offset_x += relative_offset.left;
offset_y += relative_offset.top;
}
rippleEl.style.width = rippleEl.style.height = Math.max(targetEl.offsetWidth, targetEl.offsetHeight) + 'px';
rippleEl.style.left = (offset_x - rippleEl.offsetWidth / 2) + 'px';
rippleEl.style.top = (offset_y - rippleEl.offsetHeight / 2) + 'px';
// Apply element color and background color to wrapper
/** @type {?} */
const element_style = window.getComputedStyle(targetEl, null);
/** @type {?} */
const color = element_style.color;
/** @type {?} */
const background_contrast_color = this._contrast(this._contrast(color));
rippleEl.style.color = color;
rippleEl.style.background = background_contrast_color;
rippleEl.classList.add('animate');
this._animate_timeout = setTimeout((/**
* @return {?}
*/
() => rippleEl.classList.remove('animate')), 650);
}
/**
* @private
* @param {?} color
* @param {?=} bw
* @return {?}
*/
_contrast(color, bw = true) {
/** @type {?} */
let colorHex = this._toHexadecimal(color);
if (!/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(colorHex)) {
return '#FFFFFF';
}
if (colorHex.length === 4) {
colorHex = colorHex.replace(/^#(.)(.)(.)/i, '#$1$1$2$2$3$3');
}
/** @type {?} */
const r = parseInt(colorHex.substr(1, 2), 16);
/** @type {?} */
const g = parseInt(colorHex.substr(3, 2), 16);
/** @type {?} */
const b = parseInt(colorHex.substr(5, 2), 16);
if (bw) {
// https://github.com/lffg/yiq/blob/master/index.js
/** @type {?} */
const yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000;
return this._toRGBA(yiq >= 128 ? '#000000' : '#FFFFFF');
}
return this._toRGBA(`#${this._padZero(r)}${this._padZero(g)}${this._padZero(b)}`);
}
/**
* @private
* @param {?} color
* @param {?=} allow_alpha
* @return {?}
*/
_toHexadecimal(color, allow_alpha = false) {
if (!color || (color && color.indexOf('(') == -1)) {
return color;
}
/** @type {?} */
const parts = color.replace(/(rgba|rgb)/g, '').replace(/[\(\)]/g, '').split(',').map((/**
* @param {?} part
* @return {?}
*/
(part) => _.trim(part)));
/** @type {?} */
const r = this._padZero(parseInt(parts[0], 10).toString(16));
/** @type {?} */
const g = this._padZero(parseInt(parts[1], 10).toString(16));
/** @type {?} */
const b = this._padZero(parseInt(parts[2], 10).toString(16));
if (parts[3] && allow_alpha) {
/** @type {?} */
const a = parseFloat(parseFloat(parts[3].substring(0, parts[3].length - 1)).toFixed(2));
return `#${r}${g}${b}${this._padZero((a * 255).toString(16).substring(0, 2))}`;
}
return `#${r}${g}${b}`;
}
/**
* @private
* @param {?} color
* @param {?=} opacity
* @return {?}
*/
_toRGBA(color, opacity = this._default_ripple_opacity) {
/** @type {?} */
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(color);
return result ? `rgba(${parseInt(result[1], 16)}, ${parseInt(result[2], 16)}, ${parseInt(result[3], 16)}, ${opacity})` : color;
}
/**
* @private
* @param {?} str
* @param {?=} len
* @return {?}
*/
_padZero(str, len = 2) {
if (_.isNumber(str)) {
str = str.toString();
}
/** @type {?} */
const zeros = new Array(len).join('0');
return (zeros + str).slice(-len);
}
/**
* @private
* @param {?} child_element
* @param {?} parent_element
* @return {?}
*/
_relativeOffset(child_element, parent_element) {
/** @type {?} */
const offset_parent_element = ((/** @type {?} */ (child_element.offsetParent)));
/** @type {?} */
const parent_rect = offset_parent_element.getBoundingClientRect();
/** @type {?} */
const child_rect = child_element.getBoundingClientRect();
/** @type {?} */
const offset = {
top: child_rect.top - parent_rect.top,
left: child_rect.left - parent_rect.left
}
// Reached top of document
;
// Reached top of document
if (offset_parent_element.tagName === 'BODY') {
return offset;
}
// Parent element contains the 'top' element we want the offset to be relative to
if (child_element.parentElement === parent_element) {
return offset;
}
// Reached the 'top' element we want the offset to be relative to
if (offset_parent_element === parent_element) {
return offset;
}
// Get parent's relative offset
/** @type {?} */
const parent_offset = this._relativeOffset(offset_parent_element, parent_element);
offset.top += parent_offset.top;
offset.left += parent_offset.left;
return offset;
}
}
RippleDirectiveBase.propDecorators = {
set_no_ripple: [{ type: Input, args: ['no-ripple',] }],
_onClick: [{ type: HostListener, args: ['mousedown', ['$event'],] }]
};
if (false) {
/**
* @ignore
* @type {?}
* @protected
*/
RippleDirectiveBase.prototype._no_ripple;
/**
* @type {?}
* @private
*/
RippleDirectiveBase.prototype._default_ripple_opacity;
/**
* @type {?}
* @private
*/
RippleDirectiveBase.prototype._animate_timeout;
/** @type {?} */
RippleDirectiveBase.prototype.elementRef;
}
export class RippleDirective extends RippleDirectiveBase {
/**
* @param {?} elementRef
*/
constructor(elementRef) {
super(elementRef);
this.elementRef = elementRef;
}
}
RippleDirective.decorators = [
{ type: Directive, args: [{
selector: '[with-ripple], .with-ripple'
},] }
];
/** @nocollapse */
RippleDirective.ctorParameters = () => [
{ type: ElementRef }
];
if (false) {
/** @type {?} */
RippleDirective.prototype.elementRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlwcGxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1ZXgvd2ViLWV4dGVuc2lvbnMvIiwic291cmNlcyI6WyJsaWIvbW9kdWxlcy9idXR0b24vZGlyZWN0aXZlcy9yaXBwbGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzRSxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQzs7Ozs7QUFLNUIsTUFBTSxPQUFnQixtQkFBbUI7Ozs7SUFPdkMsWUFDUyxVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZOzs7O1FBYXJCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFckIsNEJBQXVCLEdBQUcsTUFBTSxDQUFDO0lBZHRDLENBQUM7Ozs7OztJQVBKLElBQ1ksYUFBYSxDQUFDLFNBQTJCO1FBQ25ELElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBUyxTQUFTLEVBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1SCxDQUFDOzs7OztJQU1ELElBQVcsU0FBUyxDQUFDLEtBQWM7UUFDakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQzs7OztJQUNELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQzs7Ozs7SUFVNkMsUUFBUSxDQUFDLENBQWE7UUFDbEUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQUUsT0FBTztTQUFFOztjQUV6QixRQUFR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LENBQUMsSUFBSTtTQUN6QztRQUVELDBCQUEwQjs7UUFBMUIsMEJBQTBCO1FBQzFCLElBQUkscUJBQXFCLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRTtZQUFFLE9BQU8sTUFBTSxDQUFDO1NBQUU7UUFFaEUsaUZBQWlGO1FBQ2pGLElBQUksYUFBYSxDQUFDLGFBQWEsS0FBSyxjQUFjLEVBQUU7WUFBRSxPQUFPLE1BQU0sQ0FBQztTQUFFO1FBRXRFLGlFQUFpRTtRQUNqRSxJQUFJLHFCQUFxQixLQUFLLGNBQWMsRUFBRTtZQUFFLE9BQU8sTUFBTSxDQUFDO1NBQUU7OztjQUcxRCxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsRUFBRSxjQUFjLENBQUM7UUFDakYsTUFBTSxDQUFDLEdBQUcsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxJQUFJLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOzs7NEJBbEpBLEtBQUssU0FBQyxXQUFXO3VCQXdCakIsWUFBWSxTQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7Ozs7Ozs7SUFMckMseUNBQTZCOzs7OztJQUU3QixzREFBeUM7Ozs7O0lBQ3pDLCtDQUE4Qjs7SUFoQjVCLHlDQUE2Qjs7QUFrSmpDLE1BQU0sT0FBTyxlQUFnQixTQUFRLG1CQUFtQjs7OztJQUN0RCxZQUNTLFVBQXNCO1FBRTdCLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUZWLGVBQVUsR0FBVixVQUFVLENBQVk7SUFHL0IsQ0FBQzs7O1lBUkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSw2QkFBNkI7YUFDeEM7Ozs7WUFoS21CLFVBQVU7Ozs7SUFtSzFCLHFDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xyXG5cclxuLyoqXHJcbiAqIEFkaWNpb25hIG8gZWZlaXRvIFwicmlwcGxlXCIgYW8gY2xpY2FyIGVtIHVtIGVsZW1lbnRvXHJcbiAqL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmlwcGxlRGlyZWN0aXZlQmFzZSB7XHJcblxyXG4gIEBJbnB1dCgnbm8tcmlwcGxlJylcclxuICBwcml2YXRlIHNldCBzZXRfbm9fcmlwcGxlKG5vX3JpcHBsZTogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5ub19yaXBwbGUgPSBfLmlzU3RyaW5nKG5vX3JpcHBsZSkgJiYgbm9fcmlwcGxlID09ICcnID8gdHJ1ZSA6IChfLmlzQm9vbGVhbihub19yaXBwbGUpID8gKDxib29sZWFuPm5vX3JpcHBsZSkgOiB0cnVlKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWZcclxuICApIHt9XHJcblxyXG4gIHB1YmxpYyBzZXQgbm9fcmlwcGxlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9ub19yaXBwbGUgPSB2YWx1ZTtcclxuICB9XHJcbiAgcHVibGljIGdldCBub19yaXBwbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbm9fcmlwcGxlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBfbm9fcmlwcGxlID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX2RlZmF1bHRfcmlwcGxlX29wYWNpdHkgPSAnMC4xNSc7XHJcbiAgcHJpdmF0ZSBfYW5pbWF0ZV90aW1lb3V0OiBhbnk7XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pIHB1YmxpYyBfb25DbGljayhlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5ub19yaXBwbGUpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0RWwgPSB0aGlzLmVsZW1lbnRSZWYgPyB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCA6IG51bGw7XHJcbiAgICBpZiAoIXRhcmdldEVsKSB7IHJldHVybjsgfVxyXG5cclxuICAgIGlmICh0aGlzLl9hbmltYXRlX3RpbWVvdXQpIHsgY2xlYXJUaW1lb3V0KHRoaXMuX2FuaW1hdGVfdGltZW91dCk7IH1cclxuXHJcbiAgICBsZXQgcmlwcGxlRWwgPSAoPEhUTUxFbGVtZW50PnRhcmdldEVsLnF1ZXJ5U2VsZWN0b3IoJy5yaXBwbGUnKSk7XHJcblxyXG4gICAgaWYgKCEhcmlwcGxlRWwpIHtcclxuICAgICAgcmlwcGxlRWwuY2xhc3NMaXN0LnJlbW92ZSgnYW5pbWF0ZScpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmlwcGxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIHJpcHBsZUVsLmNsYXNzTGlzdC5hZGQoJ3JpcHBsZScpO1xyXG4gICAgICB0YXJnZXRFbC5hcHBlbmRDaGlsZChyaXBwbGVFbCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG9mZnNldF94ID0gZS5vZmZzZXRYO1xyXG4gICAgbGV0IG9mZnNldF95ID0gZS5vZmZzZXRZO1xyXG5cclxuICAgIGlmIChlLnRhcmdldCAhPSB0YXJnZXRFbCkge1xyXG4gICAgICBjb25zdCByZWxhdGl2ZV9vZmZzZXQgPSB0aGlzLl9yZWxhdGl2ZU9mZnNldCg8SFRNTEVsZW1lbnQ+ZS50YXJnZXQsIHRhcmdldEVsKTtcclxuXHJcbiAgICAgIG9mZnNldF94ICs9IHJlbGF0aXZlX29mZnNldC5sZWZ0O1xyXG4gICAgICBvZmZzZXRfeSArPSByZWxhdGl2ZV9vZmZzZXQudG9wO1xyXG4gICAgfVxyXG5cclxuICAgIHJpcHBsZUVsLnN0eWxlLndpZHRoID0gcmlwcGxlRWwuc3R5bGUuaGVpZ2h0ID0gTWF0aC5tYXgodGFyZ2V0RWwub2Zmc2V0V2lkdGgsIHRhcmdldEVsLm9mZnNldEhlaWdodCkgKyAncHgnO1xyXG4gICAgcmlwcGxlRWwuc3R5bGUubGVmdCA9IChvZmZzZXRfeCAtIHJpcHBsZUVsLm9mZnNldFdpZHRoIC8gMikgKyAncHgnO1xyXG4gICAgcmlwcGxlRWwuc3R5bGUudG9wID0gKG9mZnNldF95IC0gcmlwcGxlRWwub2Zmc2V0SGVpZ2h0IC8gMikgKyAncHgnO1xyXG5cclxuICAgIC8vIEFwcGx5IGVsZW1lbnQgY29sb3IgYW5kIGJhY2tncm91bmQgY29sb3IgdG8gd3JhcHBlclxyXG4gICAgY29uc3QgZWxlbWVudF9zdHlsZSAgICA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldEVsLCBudWxsKTtcclxuICAgIGNvbnN0IGNvbG9yICAgICAgICAgICA9IGVsZW1lbnRfc3R5bGUuY29sb3I7XHJcblxyXG4gICAgY29uc3QgYmFja2dyb3VuZF9jb250cmFzdF9jb2xvciA9IHRoaXMuX2NvbnRyYXN0KHRoaXMuX2NvbnRyYXN0KGNvbG9yKSk7XHJcblxyXG4gICAgcmlwcGxlRWwuc3R5bGUuY29sb3IgPSBjb2xvcjtcclxuICAgIHJpcHBsZUVsLnN0eWxlLmJhY2tncm91bmQgPSBiYWNrZ3JvdW5kX2NvbnRyYXN0X2NvbG9yO1xyXG5cclxuICAgIHJpcHBsZUVsLmNsYXNzTGlzdC5hZGQoJ2FuaW1hdGUnKTtcclxuICAgIHRoaXMuX2FuaW1hdGVfdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmlwcGxlRWwuY2xhc3NMaXN0LnJlbW92ZSgnYW5pbWF0ZScpLCA2NTApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY29udHJhc3QoY29sb3I6IHN0cmluZywgYnc6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgY29sb3JIZXggPSB0aGlzLl90b0hleGFkZWNpbWFsKGNvbG9yKTtcclxuXHJcbiAgICBpZiAoISAvKF4jWzAtOUEtRl17Nn0kKXwoXiNbMC05QS1GXXszfSQpL2kudGVzdChjb2xvckhleCkpIHtcclxuICAgICAgcmV0dXJuICcjRkZGRkZGJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29sb3JIZXgubGVuZ3RoID09PSA0KSB7XHJcbiAgICAgIGNvbG9ySGV4ID0gY29sb3JIZXgucmVwbGFjZSgvXiMoLikoLikoLikvaSwgJyMkMSQxJDIkMiQzJDMnKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByID0gcGFyc2VJbnQoY29sb3JIZXguc3Vic3RyKDEsIDIpLCAxNik7XHJcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoY29sb3JIZXguc3Vic3RyKDMsIDIpLCAxNik7XHJcbiAgICBjb25zdCBiID0gcGFyc2VJbnQoY29sb3JIZXguc3Vic3RyKDUsIDIpLCAxNik7XHJcblxyXG4gICAgaWYgKGJ3KSB7XHJcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9sZmZnL3lpcS9ibG9iL21hc3Rlci9pbmRleC5qc1xyXG4gICAgICBjb25zdCB5aXEgPSAoKHIgKiAyOTkpICsgKGcgKiA1ODcpICsgKGIgKiAxMTQpKSAvIDEwMDA7XHJcbiAgICAgIHJldHVybiB0aGlzLl90b1JHQkEoeWlxID49IDEyOCA/ICcjMDAwMDAwJyA6ICcjRkZGRkZGJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3RvUkdCQShgIyR7dGhpcy5fcGFkWmVybyhyKX0ke3RoaXMuX3BhZFplcm8oZyl9JHt0aGlzLl9wYWRaZXJvKGIpfWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdG9IZXhhZGVjaW1hbChjb2xvcjogc3RyaW5nLCBhbGxvd19hbHBoYTogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcclxuICAgIGlmICghY29sb3IgfHwgKGNvbG9yICYmIGNvbG9yLmluZGV4T2YoJygnKSA9PSAtMSkpIHsgcmV0dXJuIGNvbG9yOyB9XHJcblxyXG4gICAgY29uc3QgcGFydHMgPSBjb2xvci5yZXBsYWNlKC8ocmdiYXxyZ2IpL2csICcnKS5yZXBsYWNlKC9bXFwoXFwpXS9nLCAnJykuc3BsaXQoJywnKS5tYXAoKHBhcnQpID0+IF8udHJpbShwYXJ0KSk7XHJcblxyXG4gICAgY29uc3QgciA9IHRoaXMuX3BhZFplcm8ocGFyc2VJbnQocGFydHNbMF0sIDEwKS50b1N0cmluZygxNikpO1xyXG4gICAgY29uc3QgZyA9IHRoaXMuX3BhZFplcm8ocGFyc2VJbnQocGFydHNbMV0sIDEwKS50b1N0cmluZygxNikpO1xyXG4gICAgY29uc3QgYiA9IHRoaXMuX3BhZFplcm8ocGFyc2VJbnQocGFydHNbMl0sIDEwKS50b1N0cmluZygxNikpO1xyXG5cclxuICAgIGlmIChwYXJ0c1szXSAmJiBhbGxvd19hbHBoYSkge1xyXG4gICAgICBjb25zdCBhID0gcGFyc2VGbG9hdChwYXJzZUZsb2F0KHBhcnRzWzNdLnN1YnN0cmluZygwLCBwYXJ0c1szXS5sZW5ndGggLSAxKSkudG9GaXhlZCgyKSk7XHJcbiAgICAgIHJldHVybiBgIyR7cn0ke2d9JHtifSR7dGhpcy5fcGFkWmVybygoYSAqIDI1NSkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygwLCAyKSl9YDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYCMke3J9JHtnfSR7Yn1gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdG9SR0JBKGNvbG9yOiBzdHJpbmcsIG9wYWNpdHk6IHN0cmluZyA9IHRoaXMuX2RlZmF1bHRfcmlwcGxlX29wYWNpdHkpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kuZXhlYyhjb2xvcik7XHJcbiAgICByZXR1cm4gcmVzdWx0ID8gYHJnYmEoJHtwYXJzZUludChyZXN1bHRbMV0sIDE2KX0sICR7cGFyc2VJbnQocmVzdWx0WzJdLCAxNil9LCAke3BhcnNlSW50KHJlc3VsdFszXSwgMTYpfSwgJHtvcGFjaXR5fSlgIDogY29sb3I7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wYWRaZXJvKHN0cjogc3RyaW5nIHwgbnVtYmVyLCBsZW46IG51bWJlciA9IDIpOiBzdHJpbmcge1xyXG4gICAgaWYgKF8uaXNOdW1iZXIoc3RyKSkgeyBzdHIgPSBzdHIudG9TdHJpbmcoKTsgfVxyXG4gICAgY29uc3QgemVyb3MgPSBuZXcgQXJyYXkobGVuKS5qb2luKCcwJyk7XHJcbiAgICByZXR1cm4gKHplcm9zICsgc3RyKS5zbGljZSgtbGVuKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JlbGF0aXZlT2Zmc2V0KGNoaWxkX2VsZW1lbnQ6IEhUTUxFbGVtZW50LCBwYXJlbnRfZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgIGNvbnN0IG9mZnNldF9wYXJlbnRfZWxlbWVudCA9ICg8SFRNTEVsZW1lbnQ+Y2hpbGRfZWxlbWVudC5vZmZzZXRQYXJlbnQpO1xyXG4gICAgY29uc3QgcGFyZW50X3JlY3QgPSBvZmZzZXRfcGFyZW50X2VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBjaGlsZF9yZWN0ID0gY2hpbGRfZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICBjb25zdCBvZmZzZXQgPSB7XHJcbiAgICAgIHRvcDogY2hpbGRfcmVjdC50b3AgLSBwYXJlbnRfcmVjdC50b3AsXHJcbiAgICAgIGxlZnQ6IGNoaWxkX3JlY3QubGVmdCAtIHBhcmVudF9yZWN0LmxlZnRcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZWFjaGVkIHRvcCBvZiBkb2N1bWVudFxyXG4gICAgaWYgKG9mZnNldF9wYXJlbnRfZWxlbWVudC50YWdOYW1lID09PSAnQk9EWScpIHsgcmV0dXJuIG9mZnNldDsgfVxyXG5cclxuICAgIC8vIFBhcmVudCBlbGVtZW50IGNvbnRhaW5zIHRoZSAndG9wJyBlbGVtZW50IHdlIHdhbnQgdGhlIG9mZnNldCB0byBiZSByZWxhdGl2ZSB0b1xyXG4gICAgaWYgKGNoaWxkX2VsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gcGFyZW50X2VsZW1lbnQpIHsgcmV0dXJuIG9mZnNldDsgfVxyXG5cclxuICAgIC8vIFJlYWNoZWQgdGhlICd0b3AnIGVsZW1lbnQgd2Ugd2FudCB0aGUgb2Zmc2V0IHRvIGJlIHJlbGF0aXZlIHRvXHJcbiAgICBpZiAob2Zmc2V0X3BhcmVudF9lbGVtZW50ID09PSBwYXJlbnRfZWxlbWVudCkgeyByZXR1cm4gb2Zmc2V0OyB9XHJcblxyXG4gICAgLy8gR2V0IHBhcmVudCdzIHJlbGF0aXZlIG9mZnNldFxyXG4gICAgY29uc3QgcGFyZW50X29mZnNldCA9IHRoaXMuX3JlbGF0aXZlT2Zmc2V0KG9mZnNldF9wYXJlbnRfZWxlbWVudCwgcGFyZW50X2VsZW1lbnQpO1xyXG4gICAgb2Zmc2V0LnRvcCArPSBwYXJlbnRfb2Zmc2V0LnRvcDtcclxuICAgIG9mZnNldC5sZWZ0ICs9IHBhcmVudF9vZmZzZXQubGVmdDtcclxuICAgIHJldHVybiBvZmZzZXQ7XHJcbiAgfVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1t3aXRoLXJpcHBsZV0sIC53aXRoLXJpcHBsZSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFJpcHBsZURpcmVjdGl2ZSBleHRlbmRzIFJpcHBsZURpcmVjdGl2ZUJhc2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWZcclxuICApIHtcclxuICAgIHN1cGVyKGVsZW1lbnRSZWYpXHJcbiAgfVxyXG59XHJcbiJdfQ==