@asi-ngtools/lib
Version:
This project is a little components library, simple to use, which will help you to simplify your project.
243 lines (242 loc) • 19.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input, ViewChild, Renderer2, ElementRef, forwardRef, ContentChild } from '@angular/core';
import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
import { AsiComponentTemplateTreeLeafDef, AsiComponentTemplateTreeNodeDef, AsiComponentTemplateClearDef } from '../common/asi-component-template';
import { AsiTreeViewComponent } from '../asi-tree-view/asi-tree-view.component';
import { DefaultControlValueAccessor } from '../common/default-control-value-accessor';
import * as nh from '../../native-helper';
export class AsiTreeSelectComponent extends DefaultControlValueAccessor {
/**
* @param {?} renderer
* @param {?} elementRef
*/
constructor(renderer, elementRef) {
super();
this.renderer = renderer;
this.elementRef = elementRef;
/**
* Label position
*/
this.labelPosition = 'top';
/**
* Field containing the label of the item to display
*/
this.labelField = 'label';
/**
* Field containing the children of an item
*/
this.childrenField = 'children';
/**
* Allow selection of nodes which have children
*/
this.allowParentSelection = false;
/**
* Display a clear button
*/
this.clearButton = false;
this.formControl = new FormControl();
this.dropdownOpened = false;
this.isLeaf = (item) => {
return item && nh.isEmpty(item[this.childrenField]);
};
}
/**
* @return {?}
*/
ngOnInit() {
this.renderer.addClass(this.elementRef.nativeElement, 'label-' + this.labelPosition);
}
/**
* @param {?} node
* @return {?}
*/
onNodeSelected(node) {
/** @type {?} */
const item = node.data;
if (this.isLeaf(item) || this.allowParentSelection) {
this.asiTreeView.filterNodes(() => true);
this.dropdownOpened = false;
if (item && item[this.labelField]) {
this.value = item;
this.formControl.setValue(item[this.labelField], { emitEvent: false });
}
else {
this.value = null;
this.formControl.setValue(null, { emitEvent: false });
}
}
}
/**
* @param {?} filter
* @return {?}
*/
onFilter(filter) {
if (filter) {
if (this.filter) {
this.asiTreeView.filterNodes((item) => {
return this.filter && this.filter(item, filter);
});
}
}
else {
this.asiTreeView.filterNodes(() => true);
}
}
/**
* @return {?}
*/
toggleDropdown() {
this.dropdownOpened = !this.disabled && !this.dropdownOpened;
}
/**
* @return {?}
*/
onDropdownClosed() {
this.dropdownOpened = false;
}
/**
* @return {?}
*/
clear() {
this.dropdownOpened = false;
this.value = null;
this.formControl.reset();
}
/**
* @return {?}
*/
displayClearButton() {
return this.clearButton && this.value;
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
this._value = value;
if (this.value && this.value[this.labelField]) {
this.formControl.setValue(this.value[this.labelField], { emitEvent: false });
}
else {
this.formControl.reset();
}
}
}
AsiTreeSelectComponent.decorators = [
{ type: Component, args: [{
selector: 'asi-tree-select',
template: "<label class=\"input-label\" *ngIf=\"label\">{{label | translate}}</label>\n\n<div class=\"select\" [class.disabled]=\"disabled\">\n <div class=\"header asi-focus-error\" #selectHeader>\n <asi-input [placeholder]=\"placeholder\" [formControl]=\"formControl\" [disabled]=\"disabled\" [id]=\"id\" [name]=\"name\"\n (onValueChange)=\"onFilter($event)\" (click)=\"toggleDropdown()\"></asi-input>\n <asi-fa-icon *ngIf=\"displayClearButton()\" (click)=\"clear()\" icon=\"fas fa-times\" class=\"smaller\"></asi-fa-icon>\n <asi-fa-icon [icon]=\"(dropdownOpened) ? 'fa fa-chevron-up' : 'fa fa-chevron-down'\" [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"></asi-fa-icon>\n </div>\n\n <div class=\"options\">\n <asi-dropdown [relativeTo]=\"selectHeaderContainer\" [calculWidth]=\"true\" [open]=\"dropdownOpened\"\n (onClose)=\"onDropdownClosed()\" dropDownClass=\"asi-tree-select-dropdown\">\n <div class=\"drop-down-tree-select\">\n <div class=\"drop-down-panel\">\n <div *ngIf=\"clearDef\" (click)=\"clear()\" class=\"clear-value-item\">\n <ng-template [ngTemplateOutlet]=\"clearDef.template\"></ng-template>\n </div>\n\n <asi-tree-view [data]=\"data\" [isLeaf]=\"isLeaf\" [nodeName]=\"childrenField\"\n (onNodeSelected)=\"onNodeSelected($event)\" iconOpen=\"far fa-plus-square\" iconClose=\"far fa-minus-square\">\n <asi-tree-node *asiTreeNodeDef=\"let node\">\n <div class=\"drop-down-item\">\n <ng-template [ngTemplateOutlet]=\"nodeDef.template\" [ngTemplateOutletContext]=\"{$implicit : node}\">\n </ng-template>\n </div>\n </asi-tree-node>\n\n <asi-tree-leaf *asiTreeLeafDef=\"let node\">\n <div class=\"drop-down-item\">\n <ng-template [ngTemplateOutlet]=\"leafDef.template\" [ngTemplateOutletContext]=\"{$implicit : node}\">\n </ng-template>\n </div>\n </asi-tree-leaf>\n </asi-tree-view>\n </div>\n </div>\n </asi-dropdown>\n </div>\n</div>\n",
host: { 'class': 'asi-component asi-tree-select' },
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AsiTreeSelectComponent),
multi: true
}
]
}] }
];
/** @nocollapse */
AsiTreeSelectComponent.ctorParameters = () => [
{ type: Renderer2 },
{ type: ElementRef }
];
AsiTreeSelectComponent.propDecorators = {
id: [{ type: Input }],
name: [{ type: Input }],
label: [{ type: Input }],
labelPosition: [{ type: Input }],
placeholder: [{ type: Input }],
data: [{ type: Input }],
labelField: [{ type: Input }],
childrenField: [{ type: Input }],
allowParentSelection: [{ type: Input }],
filter: [{ type: Input }],
clearButton: [{ type: Input }],
selectHeaderContainer: [{ type: ViewChild, args: ['selectHeader',] }],
asiTreeView: [{ type: ViewChild, args: [AsiTreeViewComponent,] }],
clearDef: [{ type: ContentChild, args: [AsiComponentTemplateClearDef,] }],
nodeDef: [{ type: ContentChild, args: [AsiComponentTemplateTreeNodeDef,] }],
leafDef: [{ type: ContentChild, args: [AsiComponentTemplateTreeLeafDef,] }]
};
if (false) {
/**
* html id
* @type {?}
*/
AsiTreeSelectComponent.prototype.id;
/**
* html name
* @type {?}
*/
AsiTreeSelectComponent.prototype.name;
/**
* Label to display (is translated)
* @type {?}
*/
AsiTreeSelectComponent.prototype.label;
/**
* Label position
* @type {?}
*/
AsiTreeSelectComponent.prototype.labelPosition;
/**
* Placeholder
* @type {?}
*/
AsiTreeSelectComponent.prototype.placeholder;
/**
* Select data
* @type {?}
*/
AsiTreeSelectComponent.prototype.data;
/**
* Field containing the label of the item to display
* @type {?}
*/
AsiTreeSelectComponent.prototype.labelField;
/**
* Field containing the children of an item
* @type {?}
*/
AsiTreeSelectComponent.prototype.childrenField;
/**
* Allow selection of nodes which have children
* @type {?}
*/
AsiTreeSelectComponent.prototype.allowParentSelection;
/**
* Functions used to decide if an item should be displayed when a filter is applied (returns a boolean)
* @type {?}
*/
AsiTreeSelectComponent.prototype.filter;
/**
* Display a clear button
* @type {?}
*/
AsiTreeSelectComponent.prototype.clearButton;
/** @type {?} */
AsiTreeSelectComponent.prototype.selectHeaderContainer;
/** @type {?} */
AsiTreeSelectComponent.prototype.asiTreeView;
/** @type {?} */
AsiTreeSelectComponent.prototype.clearDef;
/** @type {?} */
AsiTreeSelectComponent.prototype.nodeDef;
/** @type {?} */
AsiTreeSelectComponent.prototype.leafDef;
/** @type {?} */
AsiTreeSelectComponent.prototype.formControl;
/** @type {?} */
AsiTreeSelectComponent.prototype.dropdownOpened;
/** @type {?} */
AsiTreeSelectComponent.prototype.isLeaf;
/** @type {?} */
AsiTreeSelectComponent.prototype.renderer;
/** @type {?} */
AsiTreeSelectComponent.prototype.elementRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLXRyZWUtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhc2ktbmd0b29scy9saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hc2ktdHJlZS1zZWxlY3QvYXNpLXRyZWUtc2VsZWN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNySCxPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEUsT0FBTyxFQUNMLCtCQUErQixFQUMvQiwrQkFBK0IsRUFDL0IsNEJBQTRCLEVBQzdCLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFaEYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDdkYsT0FBTyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQWMxQyxNQUFNLDZCQUE4QixTQUFRLDJCQUEyQjs7Ozs7SUE2Q3JFLFlBQ1UsVUFDQTtRQUNOLEtBQUssRUFBRSxDQUFDO1FBRkYsYUFBUSxHQUFSLFFBQVE7UUFDUixlQUFVLEdBQVYsVUFBVTs7Ozs2QkFuQzJFLEtBQUs7Ozs7MEJBUzlFLE9BQU87Ozs7NkJBR0osVUFBVTs7OztvQ0FHSCxLQUFLOzs7OzJCQU1kLEtBQUs7MkJBU2QsSUFBSSxXQUFXLEVBQUU7OEJBQ2QsS0FBSztzQkFXYixDQUFDLElBQVMsRUFBRSxFQUFFO1lBQ3JCLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7U0FDckQ7S0FSYTs7OztJQUVkLFFBQVE7UUFD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QUssRUFBRSxDQUFDO1NBQzFCO0tBQ0Y7OztZQTVIRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtnQkFDM0Isc2xFQUE2QztnQkFDN0MsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLCtCQUErQixFQUFFO2dCQUNsRCxTQUFTLEVBQUU7b0JBQ1Q7d0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjt3QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQzt3QkFDckQsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0Y7YUFDRjs7OztZQXhCNkMsU0FBUztZQUFFLFVBQVU7OztpQkE0QmhFLEtBQUs7bUJBR0wsS0FBSztvQkFHTCxLQUFLOzRCQUdMLEtBQUs7MEJBR0wsS0FBSzttQkFHTCxLQUFLO3lCQUdMLEtBQUs7NEJBR0wsS0FBSzttQ0FHTCxLQUFLO3FCQUdMLEtBQUs7MEJBR0wsS0FBSztvQ0FFTCxTQUFTLFNBQUMsY0FBYzswQkFDeEIsU0FBUyxTQUFDLG9CQUFvQjt1QkFFOUIsWUFBWSxTQUFDLDRCQUE0QjtzQkFDekMsWUFBWSxTQUFDLCtCQUErQjtzQkFDNUMsWUFBWSxTQUFDLCtCQUErQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIFZpZXdDaGlsZCwgT25Jbml0LCBSZW5kZXJlcjIsIEVsZW1lbnRSZWYsIGZvcndhcmRSZWYsIENvbnRlbnRDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1xuICBBc2lDb21wb25lbnRUZW1wbGF0ZVRyZWVMZWFmRGVmLFxuICBBc2lDb21wb25lbnRUZW1wbGF0ZVRyZWVOb2RlRGVmLFxuICBBc2lDb21wb25lbnRUZW1wbGF0ZUNsZWFyRGVmXG59IGZyb20gJy4uL2NvbW1vbi9hc2ktY29tcG9uZW50LXRlbXBsYXRlJztcbmltcG9ydCB7IEFzaVRyZWVWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi4vYXNpLXRyZWUtdmlldy9hc2ktdHJlZS12aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBc2lUcmVlVmlld05vZGVDb21wb25lbnQgfSBmcm9tICcuLi9hc2ktdHJlZS12aWV3L25vZGUvYXNpLXRyZWUtdmlldy1ub2RlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEZWZhdWx0Q29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICcuLi9jb21tb24vZGVmYXVsdC1jb250cm9sLXZhbHVlLWFjY2Vzc29yJztcbmltcG9ydCAqIGFzIG5oIGZyb20gJy4uLy4uL25hdGl2ZS1oZWxwZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhc2ktdHJlZS1zZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJ2FzaS10cmVlLXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgJ2NsYXNzJzogJ2FzaS1jb21wb25lbnQgYXNpLXRyZWUtc2VsZWN0JyB9LFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFzaVRyZWVTZWxlY3RDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQXNpVHJlZVNlbGVjdENvbXBvbmVudCBleHRlbmRzIERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgLyoqIGh0bWwgaWQgKi9cbiAgQElucHV0KCkgaWQ6IHN0cmluZztcblxuICAvKiogaHRtbCBuYW1lICovXG4gIEBJbnB1dCgpIG5hbWU6IHN0cmluZztcblxuICAvKiogTGFiZWwgdG8gZGlzcGxheSAoaXMgdHJhbnNsYXRlZCkgKi9cbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcblxuICAvKiogTGFiZWwgcG9zaXRpb24gKi9cbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogJ3RvcCcgfCAnbGVmdCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnYm90dG9tLWNlbnRlcicgfCAndG9wLWNlbnRlcicgPSAndG9wJztcblxuICAvKiogUGxhY2Vob2xkZXIgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcblxuICAvKiogU2VsZWN0IGRhdGEgKi9cbiAgQElucHV0KCkgZGF0YTogYW55W107XG5cbiAgLyoqIEZpZWxkIGNvbnRhaW5pbmcgdGhlIGxhYmVsIG9mIHRoZSBpdGVtIHRvIGRpc3BsYXkgKi9cbiAgQElucHV0KCkgbGFiZWxGaWVsZCA9ICdsYWJlbCc7XG5cbiAgLyoqIEZpZWxkIGNvbnRhaW5pbmcgdGhlIGNoaWxkcmVuIG9mIGFuIGl0ZW0gKi9cbiAgQElucHV0KCkgY2hpbGRyZW5GaWVsZCA9ICdjaGlsZHJlbic7XG5cbiAgLyoqIEFsbG93IHNlbGVjdGlvbiBvZiBub2RlcyB3aGljaCBoYXZlIGNoaWxkcmVuICovXG4gIEBJbnB1dCgpIGFsbG93UGFyZW50U2VsZWN0aW9uID0gZmFsc2U7XG5cbiAgLyoqIEZ1bmN0aW9ucyB1c2VkIHRvIGRlY2lkZSBpZiBhbiBpdGVtIHNob3VsZCBiZSBkaXNwbGF5ZWQgd2hlbiBhIGZpbHRlciBpcyBhcHBsaWVkIChyZXR1cm5zIGEgYm9vbGVhbikgKi9cbiAgQElucHV0KCkgZmlsdGVyOiAoaXRlbTogYW55LCBmaWx0ZXI6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKiogRGlzcGxheSBhIGNsZWFyIGJ1dHRvbiAqL1xuICBASW5wdXQoKSBjbGVhckJ1dHRvbiA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdEhlYWRlcicpIHNlbGVjdEhlYWRlckNvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZChBc2lUcmVlVmlld0NvbXBvbmVudCkgYXNpVHJlZVZpZXc6IEFzaVRyZWVWaWV3Q29tcG9uZW50O1xuXG4gIEBDb250ZW50Q2hpbGQoQXNpQ29tcG9uZW50VGVtcGxhdGVDbGVhckRlZikgY2xlYXJEZWY6IEFzaUNvbXBvbmVudFRlbXBsYXRlQ2xlYXJEZWY7XG4gIEBDb250ZW50Q2hpbGQoQXNpQ29tcG9uZW50VGVtcGxhdGVUcmVlTm9kZURlZikgbm9kZURlZjogQXNpQ29tcG9uZW50VGVtcGxhdGVUcmVlTm9kZURlZjtcbiAgQENvbnRlbnRDaGlsZChBc2lDb21wb25lbnRUZW1wbGF0ZVRyZWVMZWFmRGVmKSBsZWFmRGVmOiBBc2lDb21wb25lbnRUZW1wbGF0ZVRyZWVMZWFmRGVmO1xuXG4gIGZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XG4gIGRyb3Bkb3duT3BlbmVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZlxuICApIHsgc3VwZXIoKTsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdsYWJlbC0nICsgdGhpcy5sYWJlbFBvc2l0aW9uKTtcbiAgfVxuXG4gIGlzTGVhZiA9IChpdGVtOiBhbnkpID0+IHtcbiAgICByZXR1cm4gaXRlbSAmJiBuaC5pc0VtcHR5KGl0ZW1bdGhpcy5jaGlsZHJlbkZpZWxkXSk7XG4gIH07XG5cbiAgb25Ob2RlU2VsZWN0ZWQobm9kZTogQXNpVHJlZVZpZXdOb2RlQ29tcG9uZW50KSB7XG4gICAgY29uc3QgaXRlbSA9IG5vZGUuZGF0YTtcbiAgICBpZiAodGhpcy5pc0xlYWYoaXRlbSkgfHwgdGhpcy5hbGxvd1BhcmVudFNlbGVjdGlvbikge1xuICAgICAgdGhpcy5hc2lUcmVlVmlldy5maWx0ZXJOb2RlcygoKSA9PiB0cnVlKTtcbiAgICAgIHRoaXMuZHJvcGRvd25PcGVuZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKGl0ZW0gJiYgaXRlbVt0aGlzLmxhYmVsRmllbGRdKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBpdGVtO1xuICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKGl0ZW1bdGhpcy5sYWJlbEZpZWxkXSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRmlsdGVyKGZpbHRlcjogc3RyaW5nKSB7XG4gICAgaWYgKGZpbHRlcikge1xuICAgICAgaWYgKHRoaXMuZmlsdGVyKSB7XG4gICAgICAgIHRoaXMuYXNpVHJlZVZpZXcuZmlsdGVyTm9kZXMoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlciAmJiB0aGlzLmZpbHRlcihpdGVtLCBmaWx0ZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hc2lUcmVlVmlldy5maWx0ZXJOb2RlcygoKSA9PiB0cnVlKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVEcm9wZG93bigpIHtcbiAgICB0aGlzLmRyb3Bkb3duT3BlbmVkID0gIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMuZHJvcGRvd25PcGVuZWQ7XG4gIH1cblxuICBvbkRyb3Bkb3duQ2xvc2VkKCkge1xuICAgIHRoaXMuZHJvcGRvd25PcGVuZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuZHJvcGRvd25PcGVuZWQgPSBmYWxzZTtcbiAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB0aGlzLmZvcm1Db250cm9sLnJlc2V0KCk7XG4gIH1cblxuICBkaXNwbGF5Q2xlYXJCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2xlYXJCdXR0b24gJiYgdGhpcy52YWx1ZTtcbiAgfVxuXG4gIC8vIG92ZXJyaWRlIERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciN3cml0ZVZhbHVlXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZVt0aGlzLmxhYmVsRmllbGRdKSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMudmFsdWVbdGhpcy5sYWJlbEZpZWxkXSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnJlc2V0KCk7XG4gICAgfVxuICB9XG5cbn1cbiJdfQ==