ngx-input-color
Version:
Angular color input component and color picker (with HSL, HSV, RGB, CMYK, HEX, alpha, eye-dropper, etc)
228 lines • 29.4 kB
JavaScript
import { Directive, ElementRef, EventEmitter, HostListener, Inject, Input, Output, forwardRef, } from '@angular/core';
import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
import { NgxInputGradientComponent } from '../lib/ngx-input-gradient/ngx-input-gradient.component';
import { DOCUMENT } from '@angular/common';
import { isValidGradient, parseGradient } from '../utils/build-gradient';
import * as i0 from "@angular/core";
export class NgxInputGradientDirective {
set ngxInputColor(el) {
this.isHostInput = false;
if (el instanceof ElementRef) {
this._targetInput = el.nativeElement;
}
else if (el instanceof HTMLInputElement) {
this.isHostInput = true;
this._targetInput = el;
}
else {
this._targetInput = undefined;
}
if (this._targetInput) {
this._targetInput.addEventListener('input', this.boundInputHandler);
}
}
constructor(_doc, el, renderer, viewContainerRef) {
this._doc = _doc;
this.el = el;
this.renderer = renderer;
this.viewContainerRef = viewContainerRef;
this.setInputBackground = true;
this.theme = 'auto';
this.change = new EventEmitter();
this.boundInputHandler = (e) => {
this.writeValue(e.target.value);
};
this.isHostInput = false;
this.isDisabled = false;
this.value = '';
this._onChange = (value) => { };
this._onTouched = () => { };
this._onValidateChange = () => { };
}
onClick(ev) {
ev.stopPropagation();
ev.preventDefault();
this.toggleColorPicker();
}
ngAfterViewInit() {
setTimeout(() => {
if (this._targetInput && this._targetInput.tagName.toLowerCase() === 'input') {
this.writeValue(this._targetInput.value);
}
});
}
registerOnChange(fn) {
this._onChange = fn;
}
registerOnTouched(fn) {
this._onTouched = fn;
}
setDisabledState(disabled) {
this.isDisabled = disabled;
}
registerOnValidatorChange(fn) {
this._onValidateChange = fn;
}
validate(control) {
return null;
}
ngOnDestroy() {
this.destroyPicker();
}
writeValue(value) {
this.value = value;
if (value && isValidGradient(value)) {
const parsed = parseGradient(value);
if (parsed.valid && this.setInputBackground) {
this.renderer.setStyle(this.el.nativeElement, 'background', value);
}
// اگر دایرکتیو روی input باشه (ControlValueAccessor)
if (this.isHostInput) {
const input = this.el.nativeElement;
input.value = this.value;
}
this._onValidateChange();
}
}
toggleColorPicker() {
if (this.pickerComponentRef) {
this.destroyPicker();
return;
}
// ایجاد کامپوننت
this.pickerComponentRef = this.viewContainerRef.createComponent(NgxInputGradientComponent);
const instance = this.pickerComponentRef.instance;
instance.setTheme = this.theme;
instance.writeValue(this.value);
instance.change.subscribe((c) => {
this.emitChange(c);
});
// بکدراپ
this.backdrop = this.renderer.createElement('div');
if (this.backdrop) {
this.backdrop.style.cssText = `
background: #5e5e5e1e;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
overflow: auto;
transition: all 300ms;
z-index: 1000;
`;
this.backdrop.onclick = () => this.destroyPicker();
}
// گرفتن المنت کامپوننت واقعی
this.pickerEl = this.pickerComponentRef.hostView.rootNodes[0];
this.renderer.appendChild(this.backdrop, this.pickerEl);
this.renderer.appendChild(this._doc.body, this.backdrop);
this.setPosition();
}
setPosition() {
//setTimeout(() => {
if (!this.pickerEl || !this.pickerComponentRef)
return;
const hostRect = this.el.nativeElement.getBoundingClientRect();
const pickerEl = this.pickerEl;
// اعمال موقتی برای گرفتن سایز دقیق
this.renderer.setStyle(pickerEl, 'position', 'absolute');
this.renderer.setStyle(pickerEl, 'z-index', '1001');
this._doc.body.appendChild(pickerEl); // لازم برای محاسبه دقیق اندازه
const pickerRect = pickerEl.getBoundingClientRect();
// وسطچین کردن افقی
let left = hostRect.left + hostRect.width / 2 - pickerRect.width / 2;
let top = hostRect.bottom;
// جلوگیری از بیرون زدن از راست
if (left + pickerRect.width > window.innerWidth) {
left = window.innerWidth - pickerRect.width - 8;
}
// جلوگیری از بیرون زدن از چپ
if (left < 8) {
left = 8;
}
// اگر از پایین بیرون زد، ببر بالا
if (top + pickerRect.height > window.innerHeight) {
top = hostRect.top - pickerRect.height;
}
// جلوگیری از بیرون زدن از بالا
if (top < 8) {
top = 8;
}
this.renderer.setStyle(pickerEl, 'top', `${top}px`);
this.renderer.setStyle(pickerEl, 'left', `${left}px`);
//});
}
destroyPicker() {
if (this.pickerComponentRef) {
this.pickerComponentRef.destroy();
this.pickerComponentRef = undefined;
}
if (this.backdrop && this.backdrop.parentNode) {
this.renderer.removeChild(this._doc.body, this.backdrop);
this.backdrop = undefined;
}
this.pickerEl = undefined;
}
async emitChange(c) {
if (this.setInputBackground) {
this.renderer.setStyle(this.el.nativeElement, 'background', c);
}
// اگر روی input باشیم، مقدار رو در input قرار بده
if (this.isHostInput) {
const input = this.el.nativeElement;
input.value = c;
}
// اگر targetInput وجود داره، در اونم مقدار ست کن
if (this._targetInput instanceof HTMLInputElement) {
this._targetInput.value = c;
const event = new Event('input', { bubbles: true });
this._targetInput.dispatchEvent(event);
}
this._onChange(c);
this.change.emit(c);
this._onTouched();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgxInputGradientDirective, deps: [{ token: DOCUMENT }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: NgxInputGradientDirective, selector: "[ngxInputGradient]", inputs: { setInputBackground: "setInputBackground", theme: "theme", ngxInputColor: "ngxInputColor" }, outputs: { change: "change" }, host: { listeners: { "click": "onClick($event)", "window:resize": "setPosition($event)" } }, providers: [
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxInputGradientDirective), multi: true },
{
provide: NG_VALIDATORS,
multi: true,
useExisting: NgxInputGradientDirective,
},
], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgxInputGradientDirective, decorators: [{
type: Directive,
args: [{
selector: '[ngxInputGradient]',
providers: [
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxInputGradientDirective), multi: true },
{
provide: NG_VALIDATORS,
multi: true,
useExisting: NgxInputGradientDirective,
},
],
}]
}], ctorParameters: () => [{ type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ViewContainerRef }], propDecorators: { setInputBackground: [{
type: Input
}], theme: [{
type: Input
}], ngxInputColor: [{
type: Input,
args: ['ngxInputColor']
}], change: [{
type: Output
}], onClick: [{
type: HostListener,
args: ['click', ['$event']]
}], setPosition: [{
type: HostListener,
args: ['window:resize', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWlucHV0LWdyYWRpZW50LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1pbnB1dC1jb2xvci9zcmMvZGlyZWN0aXZlcy9uZ3gtaW5wdXQtZ3JhZGllbnQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBR04sVUFBVSxHQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxhQUFhLEVBQ2IsaUJBQWlCLEdBR2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDbkcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBYXpFLE1BQU0sT0FBTyx5QkFBeUI7SUFJcEMsSUFBNEIsYUFBYSxDQUN2QyxFQUEyRTtRQUUzRSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLEVBQUUsWUFBWSxVQUFVLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDdkMsQ0FBQzthQUFNLElBQUksRUFBRSxZQUFZLGdCQUFnQixFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDekIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUM7SUFpQkQsWUFDNEIsSUFBYyxFQUNoQyxFQUFjLEVBQ2QsUUFBbUIsRUFDbkIsZ0JBQWtDO1FBSGhCLFNBQUksR0FBSixJQUFJLENBQVU7UUFDaEMsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQXhDbkMsdUJBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQzFCLFVBQUssR0FBOEIsTUFBTSxDQUFDO1FBbUJ6QyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUV0QyxzQkFBaUIsR0FBRyxDQUFDLENBQVEsRUFBRSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUUsQ0FBQyxDQUFDLE1BQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsQ0FBQyxDQUFDO1FBQ00sZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFJNUIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRVgsY0FBUyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDbEMsZUFBVSxHQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUN0QixzQkFBaUIsR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFNMUIsQ0FBQztJQUUrQixPQUFPLENBQUMsRUFBUztRQUNsRCxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckIsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFDRCxlQUFlO1FBQ2IsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDN0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxFQUFPO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxnQkFBZ0IsQ0FBQyxRQUFpQjtRQUNoQyxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztJQUM3QixDQUFDO0lBQ0QseUJBQXlCLENBQUMsRUFBYztRQUN0QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxRQUFRLENBQUMsT0FBd0I7UUFDL0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQVU7UUFDbkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxLQUFLLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEMsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BDLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JFLENBQUM7WUFDRCxxREFBcUQ7WUFDckQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBaUMsQ0FBQztnQkFDeEQsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQzNCLENBQUM7WUFDRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLE9BQU87UUFDVCxDQUFDO1FBRUQsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFFM0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQztRQUNsRCxRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDL0IsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFTLEVBQUUsRUFBRTtZQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsVUFBVTtRQUNWLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHOzs7Ozs7Ozs7O1NBVTNCLENBQUM7WUFDSixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckQsQ0FBQztRQUNELDZCQUE2QjtRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQWdCLENBQUM7UUFDdEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBR0QsV0FBVztRQUNULG9CQUFvQjtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0I7WUFBRSxPQUFPO1FBQ3ZELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDL0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUUvQixtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXBELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtRQUVyRSxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUVwRCxvQkFBb0I7UUFDcEIsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBRTFCLCtCQUErQjtRQUMvQixJQUFJLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoRCxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBRUQsNkJBQTZCO1FBQzdCLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2IsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNYLENBQUM7UUFFRCxrQ0FBa0M7UUFDbEMsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakQsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUN6QyxDQUFDO1FBRUQsK0JBQStCO1FBQy9CLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ1osR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUN0RCxLQUFLO0lBQ1AsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBQzVCLENBQUM7SUFFTyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQVM7UUFDaEMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELGtEQUFrRDtRQUNsRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWlDLENBQUM7WUFDeEQsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUVELGlEQUFpRDtRQUNqRCxJQUFJLElBQUksQ0FBQyxZQUFZLFlBQVksZ0JBQWdCLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7K0dBL01VLHlCQUF5QixrQkFzQzFCLFFBQVE7bUdBdENQLHlCQUF5QiwrUUFUekI7WUFDVCxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHlCQUF5QixDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtZQUNyRztnQkFDRSxPQUFPLEVBQUUsYUFBYTtnQkFDdEIsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsV0FBVyxFQUFFLHlCQUF5QjthQUN2QztTQUNGOzs0RkFFVSx5QkFBeUI7a0JBWHJDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsU0FBUyxFQUFFO3dCQUNULEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDBCQUEwQixDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTt3QkFDckc7NEJBQ0UsT0FBTyxFQUFFLGFBQWE7NEJBQ3RCLEtBQUssRUFBRSxJQUFJOzRCQUNYLFdBQVcsMkJBQTJCO3lCQUN2QztxQkFDRjtpQkFDRjs7MEJBdUNJLE1BQU07MkJBQUMsUUFBUTt5SEFyQ1Qsa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFFc0IsYUFBYTtzQkFBeEMsS0FBSzt1QkFBQyxlQUFlO2dCQWlCWixNQUFNO3NCQUFmLE1BQU07Z0JBdUI0QixPQUFPO3NCQUF6QyxZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF1RmpDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPdXRwdXQsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbiAgZm9yd2FyZFJlZixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXHJcbiAgTkdfVkFMSURBVE9SUyxcclxuICBOR19WQUxVRV9BQ0NFU1NPUixcclxuICBWYWxpZGF0aW9uRXJyb3JzLFxyXG4gIFZhbGlkYXRvcixcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbG9ySW5zcGVjdG9yIH0gZnJvbSAnLi4vbW9kZWxzL0NvbG9ySW5zcGVjdG9yLmVudW0nO1xyXG5pbXBvcnQgeyBOZ3hJbnB1dEdyYWRpZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vbGliL25neC1pbnB1dC1ncmFkaWVudC9uZ3gtaW5wdXQtZ3JhZGllbnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBpc1ZhbGlkR3JhZGllbnQsIHBhcnNlR3JhZGllbnQgfSBmcm9tICcuLi91dGlscy9idWlsZC1ncmFkaWVudCc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tuZ3hJbnB1dEdyYWRpZW50XScsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7IHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ3hJbnB1dEdyYWRpZW50RGlyZWN0aXZlKSwgbXVsdGk6IHRydWUgfSxcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBOZ3hJbnB1dEdyYWRpZW50RGlyZWN0aXZlLFxyXG4gICAgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd4SW5wdXRHcmFkaWVudERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciB7XHJcbiAgQElucHV0KCkgc2V0SW5wdXRCYWNrZ3JvdW5kID0gdHJ1ZTtcclxuICBASW5wdXQoKSB0aGVtZTogJ2xpZ2h0JyB8ICdkYXJrJyB8ICdhdXRvJyA9ICdhdXRvJztcclxuICBwcml2YXRlIF90YXJnZXRJbnB1dD86IEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgQElucHV0KCduZ3hJbnB1dENvbG9yJykgc2V0IG5neElucHV0Q29sb3IoXHJcbiAgICBlbDogSFRNTElucHV0RWxlbWVudCB8IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4gfCBudWxsIHwgdW5kZWZpbmVkIHwgJydcclxuICApIHtcclxuICAgIHRoaXMuaXNIb3N0SW5wdXQgPSBmYWxzZTtcclxuICAgIGlmIChlbCBpbnN0YW5jZW9mIEVsZW1lbnRSZWYpIHtcclxuICAgICAgdGhpcy5fdGFyZ2V0SW5wdXQgPSBlbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgfSBlbHNlIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5pc0hvc3RJbnB1dCA9IHRydWU7XHJcbiAgICAgIHRoaXMuX3RhcmdldElucHV0ID0gZWw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl90YXJnZXRJbnB1dCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fdGFyZ2V0SW5wdXQpIHtcclxuICAgICAgdGhpcy5fdGFyZ2V0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCB0aGlzLmJvdW5kSW5wdXRIYW5kbGVyKTtcclxuICAgIH1cclxuICB9XHJcbiAgQE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICBwcml2YXRlIGJvdW5kSW5wdXRIYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XHJcbiAgICB0aGlzLndyaXRlVmFsdWUoKGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKTtcclxuICB9O1xyXG4gIHByaXZhdGUgaXNIb3N0SW5wdXQgPSBmYWxzZTtcclxuICBwcml2YXRlIHBpY2tlckNvbXBvbmVudFJlZj86IENvbXBvbmVudFJlZjxOZ3hJbnB1dEdyYWRpZW50Q29tcG9uZW50PjtcclxuICBwcml2YXRlIGJhY2tkcm9wPzogSFRNTERpdkVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBwaWNrZXJFbD86IEhUTUxFbGVtZW50O1xyXG4gIGlzRGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgdmFsdWUgPSAnJztcclxuXHJcbiAgX29uQ2hhbmdlID0gKHZhbHVlOiBzdHJpbmcpID0+IHt9O1xyXG4gIF9vblRvdWNoZWQgPSAoKSA9PiB7fTtcclxuICBfb25WYWxpZGF0ZUNoYW5nZSA9ICgpID0+IHt9O1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jOiBEb2N1bWVudCxcclxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWZcclxuICApIHt9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSkgb25DbGljayhldjogRXZlbnQpIHtcclxuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMudG9nZ2xlQ29sb3JQaWNrZXIoKTtcclxuICB9XHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLl90YXJnZXRJbnB1dCAmJiB0aGlzLl90YXJnZXRJbnB1dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcpIHtcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5fdGFyZ2V0SW5wdXQudmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLl9vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcbiAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5pc0Rpc2FibGVkID0gZGlzYWJsZWQ7XHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMuX29uVmFsaWRhdGVDaGFuZ2UgPSBmbjtcclxuICB9XHJcbiAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveVBpY2tlcigpO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICBpZiAodmFsdWUgJiYgaXNWYWxpZEdyYWRpZW50KHZhbHVlKSkge1xyXG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUdyYWRpZW50KHZhbHVlKTtcclxuICAgICAgaWYgKHBhcnNlZC52YWxpZCAmJiB0aGlzLnNldElucHV0QmFja2dyb3VuZCkge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnYmFja2dyb3VuZCcsIHZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDYp9qv2LEg2K/Yp9uM2LHaqdiq24zZiCDYsdmI24wgaW5wdXQg2KjYp9i02YcgKENvbnRyb2xWYWx1ZUFjY2Vzc29yKVxyXG4gICAgICBpZiAodGhpcy5pc0hvc3RJbnB1dCkge1xyXG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLnZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX29uVmFsaWRhdGVDaGFuZ2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZUNvbG9yUGlja2VyKCkge1xyXG4gICAgaWYgKHRoaXMucGlja2VyQ29tcG9uZW50UmVmKSB7XHJcbiAgICAgIHRoaXMuZGVzdHJveVBpY2tlcigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8g2KfbjNis2KfYryDaqdin2YXZvtmI2YbZhtiqXHJcbiAgICB0aGlzLnBpY2tlckNvbXBvbmVudFJlZiA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoTmd4SW5wdXRHcmFkaWVudENvbXBvbmVudCk7XHJcblxyXG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLnBpY2tlckNvbXBvbmVudFJlZi5pbnN0YW5jZTtcclxuICAgIGluc3RhbmNlLnNldFRoZW1lID0gdGhpcy50aGVtZTtcclxuICAgIGluc3RhbmNlLndyaXRlVmFsdWUodGhpcy52YWx1ZSk7XHJcbiAgICBpbnN0YW5jZS5jaGFuZ2Uuc3Vic2NyaWJlKChjOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy5lbWl0Q2hhbmdlKGMpO1xyXG4gICAgfSk7XHJcbiAgICAvLyDYqNqp4oCM2K/Ysdin2b5cclxuICAgIHRoaXMuYmFja2Ryb3AgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgaWYgKHRoaXMuYmFja2Ryb3ApIHtcclxuICAgICAgdGhpcy5iYWNrZHJvcC5zdHlsZS5jc3NUZXh0ID0gYFxyXG4gICAgICAgICAgYmFja2dyb3VuZDogIzVlNWU1ZTFlO1xyXG4gICAgICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICAgICAgdG9wOiAwO1xyXG4gICAgICAgICAgbGVmdDogMDtcclxuICAgICAgICAgIHJpZ2h0OiAwO1xyXG4gICAgICAgICAgYm90dG9tOiAwO1xyXG4gICAgICAgICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMzAwbXM7XHJcbiAgICAgICAgICB6LWluZGV4OiAxMDAwO1xyXG4gICAgICAgIGA7XHJcbiAgICAgIHRoaXMuYmFja2Ryb3Aub25jbGljayA9ICgpID0+IHRoaXMuZGVzdHJveVBpY2tlcigpO1xyXG4gICAgfVxyXG4gICAgLy8g2q/YsdmB2KrZhiDYp9mE2YXZhtiqINqp2KfZhdm+2YjZhtmG2Kog2YjYp9mC2LnbjFxyXG4gICAgdGhpcy5waWNrZXJFbCA9ICh0aGlzLnBpY2tlckNvbXBvbmVudFJlZi5ob3N0VmlldyBhcyBhbnkpLnJvb3ROb2Rlc1swXSBhcyBIVE1MRWxlbWVudDtcclxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5iYWNrZHJvcCwgdGhpcy5waWNrZXJFbCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuX2RvYy5ib2R5LCB0aGlzLmJhY2tkcm9wKTtcclxuICAgIHRoaXMuc2V0UG9zaXRpb24oKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxyXG4gIHNldFBvc2l0aW9uKCkge1xyXG4gICAgLy9zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgIGlmICghdGhpcy5waWNrZXJFbCB8fCAhdGhpcy5waWNrZXJDb21wb25lbnRSZWYpIHJldHVybjtcclxuICAgIGNvbnN0IGhvc3RSZWN0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgcGlja2VyRWwgPSB0aGlzLnBpY2tlckVsO1xyXG5cclxuICAgIC8vINin2LnZhdin2YQg2YXZiNmC2KrbjCDYqNix2KfbjCDar9ix2YHYqtmGINiz2KfbjNiyINiv2YLbjNmCXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHBpY2tlckVsLCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocGlja2VyRWwsICd6LWluZGV4JywgJzEwMDEnKTtcclxuXHJcbiAgICB0aGlzLl9kb2MuYm9keS5hcHBlbmRDaGlsZChwaWNrZXJFbCk7IC8vINmE2KfYstmFINio2LHYp9uMINmF2K3Yp9iz2KjZhyDYr9mC24zZgiDYp9mG2K/Yp9iy2YdcclxuXHJcbiAgICBjb25zdCBwaWNrZXJSZWN0ID0gcGlja2VyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgLy8g2YjYs9i34oCM2obbjNmGINqp2LHYr9mGINin2YHZgtuMXHJcbiAgICBsZXQgbGVmdCA9IGhvc3RSZWN0LmxlZnQgKyBob3N0UmVjdC53aWR0aCAvIDIgLSBwaWNrZXJSZWN0LndpZHRoIC8gMjtcclxuICAgIGxldCB0b3AgPSBob3N0UmVjdC5ib3R0b207XHJcblxyXG4gICAgLy8g2KzZhNmI2q/bjNix24wg2KfYsiDYqNuM2LHZiNmGINiy2K/ZhiDYp9iyINix2KfYs9iqXHJcbiAgICBpZiAobGVmdCArIHBpY2tlclJlY3Qud2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xyXG4gICAgICBsZWZ0ID0gd2luZG93LmlubmVyV2lkdGggLSBwaWNrZXJSZWN0LndpZHRoIC0gODtcclxuICAgIH1cclxuXHJcbiAgICAvLyDYrNmE2Yjar9uM2LHbjCDYp9iyINio24zYsdmI2YYg2LLYr9mGINin2LIg2obZvlxyXG4gICAgaWYgKGxlZnQgPCA4KSB7XHJcbiAgICAgIGxlZnQgPSA4O1xyXG4gICAgfVxyXG5cclxuICAgIC8vINin2q/YsSDYp9iyINm+2KfbjNuM2YYg2KjbjNix2YjZhiDYstiv2Iwg2KjYqNixINio2KfZhNinXHJcbiAgICBpZiAodG9wICsgcGlja2VyUmVjdC5oZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcclxuICAgICAgdG9wID0gaG9zdFJlY3QudG9wIC0gcGlja2VyUmVjdC5oZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g2KzZhNmI2q/bjNix24wg2KfYsiDYqNuM2LHZiNmGINiy2K/ZhiDYp9iyINio2KfZhNinXHJcbiAgICBpZiAodG9wIDwgOCkge1xyXG4gICAgICB0b3AgPSA4O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocGlja2VyRWwsICd0b3AnLCBgJHt0b3B9cHhgKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocGlja2VyRWwsICdsZWZ0JywgYCR7bGVmdH1weGApO1xyXG4gICAgLy99KTtcclxuICB9XHJcblxyXG4gIGRlc3Ryb3lQaWNrZXIoKSB7XHJcbiAgICBpZiAodGhpcy5waWNrZXJDb21wb25lbnRSZWYpIHtcclxuICAgICAgdGhpcy5waWNrZXJDb21wb25lbnRSZWYuZGVzdHJveSgpO1xyXG4gICAgICB0aGlzLnBpY2tlckNvbXBvbmVudFJlZiA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmJhY2tkcm9wICYmIHRoaXMuYmFja2Ryb3AucGFyZW50Tm9kZSkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMuX2RvYy5ib2R5LCB0aGlzLmJhY2tkcm9wKTtcclxuICAgICAgdGhpcy5iYWNrZHJvcCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIHRoaXMucGlja2VyRWwgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGVtaXRDaGFuZ2UoYzogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5zZXRJbnB1dEJhY2tncm91bmQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdiYWNrZ3JvdW5kJywgYyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g2Kfar9ixINix2YjbjCBpbnB1dCDYqNin2LTbjNmF2Iwg2YXZgtiv2KfYsSDYsdmIINiv2LEgaW5wdXQg2YLYsdin2LEg2KjYr9mHXHJcbiAgICBpZiAodGhpcy5pc0hvc3RJbnB1dCkge1xyXG4gICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICBpbnB1dC52YWx1ZSA9IGM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g2Kfar9ixIHRhcmdldElucHV0INmI2KzZiNivINiv2KfYsdmH2Iwg2K/YsSDYp9mI2YbZhSDZhdmC2K/Yp9ixINiz2Kog2qnZhlxyXG4gICAgaWYgKHRoaXMuX3RhcmdldElucHV0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xyXG4gICAgICB0aGlzLl90YXJnZXRJbnB1dC52YWx1ZSA9IGM7XHJcbiAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KTtcclxuICAgICAgdGhpcy5fdGFyZ2V0SW5wdXQuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fb25DaGFuZ2UoYyk7XHJcbiAgICB0aGlzLmNoYW5nZS5lbWl0KGMpO1xyXG4gICAgdGhpcy5fb25Ub3VjaGVkKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==