UNPKG

@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
/** * @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==