UNPKG

@c-standard/angular-devui-extension

Version:

an extensional components lib for devui

145 lines 23.4 kB
import { Component, ContentChildren, EventEmitter, forwardRef, Input, Output, ViewChild, } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { DropDownDirective } from 'ng-devui'; import { TemplateDirective } from '@c-standard/angular-devui-extension/template'; import { ObjToValuePipe } from '@c-standard/angular-devui-extension/utils'; import * as i0 from "@angular/core"; import * as i1 from "@c-standard/angular-devui-extension/utils"; import * as i2 from "ng-devui"; import * as i3 from "@angular/common"; import * as i4 from "@c-standard/angular-devui-extension/template"; const SELECT_BOX_PRO_CONTROL_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SelectBoxProComponent), multi: true, }; export class SelectBoxProComponent { constructor(_ref, _obj2value) { this._ref = _ref; this._obj2value = _obj2value; this.disabled = false; this.contentTemplate = 'template'; this.valueChange = new EventEmitter(); this.initialized = new EventEmitter(); this.expanded = new EventEmitter(); this.collapsed = new EventEmitter(); this.options = []; this.expand = false; this.displayValue = null; this.onTouchedCallback = () => { }; this.onChangeCallback = (_v) => { }; } get value() { return this._value; } set value(value) { this._value = value; if (this._value) { this.onChangeCallback(value); this.writeDisplayText(); } } get dataSource() { return this._dataSource || []; } set dataSource(value) { this._dataSource = value; if (this.dataSource instanceof Array) { this.options = this.dataSource; } } ngOnInit() { this.initialized.emit({ element: this._ref.nativeElement, component: this, }); } registerOnChange(fn) { this.onChangeCallback = fn; } registerOnTouched(fn) { this.onTouchedCallback = fn; } setDisabledState(isDisabled) { this.disabled = isDisabled; } writeValue(value) { this._value = value; this.writeDisplayText(); } onDropDownBoxToggle(expanded) { if (expanded) { this.expand = true; this.expanded.emit(); } else { this.expand = false; this.collapsed.emit(); } } collapse() { if (this.dropDownBox?.isOpen) { this.expand = false; return this.dropDownBox.toggle(); } return false; } get templates() { if (this.definitions != null) { const templates = {}; for (const definition of this.definitions.toArray()) { templates[definition.template] = definition.templateRef; } return templates; } else { return {}; } } writeDisplayText() { if (this.value instanceof Object && this.displayExpr != undefined) { this.displayValue = this.value[this.displayExpr]; } else { this.displayValue = this.value; } } } SelectBoxProComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SelectBoxProComponent, deps: [{ token: i0.ElementRef }, { token: i1.ObjToValuePipe }], target: i0.ɵɵFactoryTarget.Component }); SelectBoxProComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SelectBoxProComponent, selector: "d-select-box-pro", inputs: { value: "value", dataSource: "dataSource", disabled: "disabled", valueExpr: "valueExpr", displayExpr: "displayExpr", placeholder: "placeholder", contentTemplate: "contentTemplate" }, outputs: { valueChange: "valueChange", initialized: "initialized", expanded: "expanded", collapsed: "collapsed" }, providers: [ObjToValuePipe, SELECT_BOX_PRO_CONTROL_VALUE_ACCESSOR], queries: [{ propertyName: "definitions", predicate: TemplateDirective }], viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }, { propertyName: "dropDownBox", first: true, predicate: ["dropDownBox"], descendants: true, read: DropDownDirective }], ngImport: i0, template: "<div\r\n dDropDown\r\n #dropDownBox=\"d-dropdown\"\r\n class=\"dropdown-box devui-input-group devui-dropdown-origin\"\r\n [trigger]=\"'manually'\"\r\n [closeScope]=\"'blank'\"\r\n (toggleEvent)=\"onDropDownBoxToggle($event)\"\r\n>\r\n <input\r\n #input\r\n dDropDownToggle\r\n class=\"devui-form-control devui-select-input devui-input\"\r\n autocomplete=\"off\"\r\n readonly=\"readonly\"\r\n [placeholder]=\"placeholder\"\r\n (click)=\"dropDownBox.toggle()\"\r\n [value]=\"displayValue\"\r\n />\r\n <div\r\n class=\"devui-input-group-addon\"\r\n (click)=\"dropDownBox.toggle()\"\r\n >\r\n <i\r\n class=\"icon-chevron-down dropdown-icon\"\r\n [ngClass]=\"{ 'expand':expand, 'collapse': !expand }\"\r\n ></i>\r\n </div>\r\n\r\n <div\r\n dDropDownMenu\r\n class=\"devui-dropdown-menu\"\r\n >\r\n <ng-container\r\n *ngIf=\"options.length > 0\"\r\n [ngTemplateOutletContext]=\"{ $implicit: {data:options, value:value} }\"\r\n [ngTemplateOutlet]=\"templates[contentTemplate]\"\r\n >\r\n <!-- todo \u4F18\u5316\u9ED8\u8BA4\u9009\u9879\u7684\u5C55\u793A\u65B9\u5F0F -->\r\n <div *xTemplate=\"let data of 'template'\">{{ options.length }}</div>\r\n </ng-container>\r\n <div *ngIf=\"options.length <= 0\" class=\"x-no-data-tip\">\u65E0\u6570\u636E</div>\r\n </div>\r\n</div>\r\n", styles: [".dropdown-box{width:100%;display:flex;align-items:center}.dropdown-box .dropdown-icon{transition:all .3s}.dropdown-box .devui-dropdown-menu{width:100%}.x-no-data-tip{-webkit-user-select:none;user-select:none;cursor:not-allowed;padding:10px;color:var(--devui-disabled-text, #cfd0d3);background-color:var(--devui-disabled-bg, #f5f5f5)}.expand{transform:rotate(180deg)}.collapse{transform:rotate(0)}\n"], directives: [{ type: i2.DropDownDirective, selector: "[dDropDown]", inputs: ["isOpen", "disabled", "showAnimation", "trigger", "closeScope", "closeOnMouseLeaveMenu"], outputs: ["toggleEvent"], exportAs: ["d-dropdown"] }, { type: i2.DropDownToggleDirective, selector: "[dDropDownToggle]", inputs: ["toggleOnFocus", "autoFocus"], exportAs: ["d-dropdown-toggle"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.DropDownMenuDirective, selector: "[dDropDownMenu]", exportAs: ["d-dropdown-menu"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i4.TemplateDirective, selector: "[xTemplate][xTemplateOf]", inputs: ["xTemplateOf"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SelectBoxProComponent, decorators: [{ type: Component, args: [{ selector: 'd-select-box-pro', providers: [ObjToValuePipe, SELECT_BOX_PRO_CONTROL_VALUE_ACCESSOR], template: "<div\r\n dDropDown\r\n #dropDownBox=\"d-dropdown\"\r\n class=\"dropdown-box devui-input-group devui-dropdown-origin\"\r\n [trigger]=\"'manually'\"\r\n [closeScope]=\"'blank'\"\r\n (toggleEvent)=\"onDropDownBoxToggle($event)\"\r\n>\r\n <input\r\n #input\r\n dDropDownToggle\r\n class=\"devui-form-control devui-select-input devui-input\"\r\n autocomplete=\"off\"\r\n readonly=\"readonly\"\r\n [placeholder]=\"placeholder\"\r\n (click)=\"dropDownBox.toggle()\"\r\n [value]=\"displayValue\"\r\n />\r\n <div\r\n class=\"devui-input-group-addon\"\r\n (click)=\"dropDownBox.toggle()\"\r\n >\r\n <i\r\n class=\"icon-chevron-down dropdown-icon\"\r\n [ngClass]=\"{ 'expand':expand, 'collapse': !expand }\"\r\n ></i>\r\n </div>\r\n\r\n <div\r\n dDropDownMenu\r\n class=\"devui-dropdown-menu\"\r\n >\r\n <ng-container\r\n *ngIf=\"options.length > 0\"\r\n [ngTemplateOutletContext]=\"{ $implicit: {data:options, value:value} }\"\r\n [ngTemplateOutlet]=\"templates[contentTemplate]\"\r\n >\r\n <!-- todo \u4F18\u5316\u9ED8\u8BA4\u9009\u9879\u7684\u5C55\u793A\u65B9\u5F0F -->\r\n <div *xTemplate=\"let data of 'template'\">{{ options.length }}</div>\r\n </ng-container>\r\n <div *ngIf=\"options.length <= 0\" class=\"x-no-data-tip\">\u65E0\u6570\u636E</div>\r\n </div>\r\n</div>\r\n", styles: [".dropdown-box{width:100%;display:flex;align-items:center}.dropdown-box .dropdown-icon{transition:all .3s}.dropdown-box .devui-dropdown-menu{width:100%}.x-no-data-tip{-webkit-user-select:none;user-select:none;cursor:not-allowed;padding:10px;color:var(--devui-disabled-text, #cfd0d3);background-color:var(--devui-disabled-bg, #f5f5f5)}.expand{transform:rotate(180deg)}.collapse{transform:rotate(0)}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.ObjToValuePipe }]; }, propDecorators: { value: [{ type: Input }], dataSource: [{ type: Input }], disabled: [{ type: Input }], valueExpr: [{ type: Input }], displayExpr: [{ type: Input }], placeholder: [{ type: Input }], contentTemplate: [{ type: Input }], valueChange: [{ type: Output }], initialized: [{ type: Output }], expanded: [{ type: Output }], collapsed: [{ type: Output }], input: [{ type: ViewChild, args: ['input'] }], dropDownBox: [{ type: ViewChild, args: ['dropDownBox', { read: DropDownDirective }] }], definitions: [{ type: ContentChildren, args: [TemplateDirective] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LWJveC1wcm8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zZWxlY3Qvc2VsZWN0LWJveC1wcm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zZWxlY3Qvc2VsZWN0LWJveC1wcm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQWMsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUEwQixTQUFTLEdBQUcsTUFBTSxlQUFlLENBQUM7QUFDNUosT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUU3QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNqRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkNBQTJDLENBQUM7Ozs7OztBQUUzRSxNQUFNLHFDQUFxQyxHQUFRO0lBRS9DLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztJQUNwRCxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFRRixNQUFNLE9BQU8scUJBQXFCO0lBaUQ5QixZQUFvQixJQUFnQixFQUFVLFVBQTBCO1FBQXBELFNBQUksR0FBSixJQUFJLENBQVk7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFnQjtRQXJCL0QsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUkxQixvQkFBZSxHQUFXLFVBQVUsQ0FBQztRQUNwQyxnQkFBVyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3pELGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFDekQsYUFBUSxH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ZWYsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRHJvcERvd25EaXJlY3RpdmUgfSBmcm9tICduZy1kZXZ1aSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICdAYy1zdGFuZGFyZC9hbmd1bGFyLWRldnVpLWV4dGVuc2lvbi90ZW1wbGF0ZSc7XHJcbmltcG9ydCB7IE9ialRvVmFsdWVQaXBlIH0gZnJvbSAnQGMtc3RhbmRhcmQvYW5ndWxhci1kZXZ1aS1leHRlbnNpb24vdXRpbHMnO1xyXG5cclxuY29uc3QgU0VMRUNUX0JPWF9QUk9fQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xyXG5cclxuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2VsZWN0Qm94UHJvQ29tcG9uZW50KSxcclxuICAgIG11bHRpOiB0cnVlLFxyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2Qtc2VsZWN0LWJveC1wcm8nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdC1ib3gtcHJvLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3NlbGVjdC1ib3gtcHJvLmNvbXBvbmVudC5sZXNzJ10sXHJcbiAgICBwcm92aWRlcnM6IFtPYmpUb1ZhbHVlUGlwZSwgU0VMRUNUX0JPWF9QUk9fQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZWxlY3RCb3hQcm9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICAgIHByaXZhdGUgX3ZhbHVlOiBhbnk7XHJcbiAgICBnZXQgdmFsdWUoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5fdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy53cml0ZURpc3BsYXlUZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2RhdGFTb3VyY2U/OiBhbnlbXSB8IE9ic2VydmFibGU8YW55PjtcclxuICAgIGdldCBkYXRhU291cmNlKCk6IGFueVtdIHwgT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZSB8fCBbXTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IGRhdGFTb3VyY2UodmFsdWU6IGFueVtdIHwgT2JzZXJ2YWJsZTxhbnk+KSB7XHJcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSA9IHZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2UgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmRhdGFTb3VyY2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSB2YWx1ZUV4cHI/OiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBkaXNwbGF5RXhwcj86IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgY29udGVudFRlbXBsYXRlOiBzdHJpbmcgPSAndGVtcGxhdGUnO1xyXG4gICAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIGluaXRpYWxpemVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIGV4cGFuZGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIGNvbGxhcHNlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdpbnB1dCcpIGlucHV0PzogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ2Ryb3BEb3duQm94Jywge3JlYWQ6IERyb3BEb3duRGlyZWN0aXZlfSkgZHJvcERvd25Cb3g/OiBEcm9wRG93bkRpcmVjdGl2ZTtcclxuICAgIEBDb250ZW50Q2hpbGRyZW4oVGVtcGxhdGVEaXJlY3RpdmUpIGRlZmluaXRpb25zPzogUXVlcnlMaXN0PFRlbXBsYXRlRGlyZWN0aXZlPjtcclxuXHJcbiAgICBvcHRpb25zOiBhbnlbXSA9IFtdO1xyXG4gICAgZXhwYW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBkaXNwbGF5VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHByaXZhdGUgb25Ub3VjaGVkQ2FsbGJhY2sgPSAoKSA9PiB7fTtcclxuICAgIHByaXZhdGUgb25DaGFuZ2VDYWxsYmFjayA9IChfdjogYW55KSA9PiB7fTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgX29iajJ2YWx1ZTogT2JqVG9WYWx1ZVBpcGUpIHt9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZC5lbWl0KHtcclxuICAgICAgICAgICAgZWxlbWVudDogdGhpcy5fcmVmLm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gICAgfVxyXG5cclxuICAgIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy53cml0ZURpc3BsYXlUZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Ecm9wRG93bkJveFRvZ2dsZShleHBhbmRlZDogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChleHBhbmRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmV4cGFuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kZWQuZW1pdCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuY29sbGFwc2VkLmVtaXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29sbGFwc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZHJvcERvd25Cb3g/LmlzT3Blbikge1xyXG4gICAgICAgICAgICB0aGlzLmV4cGFuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kcm9wRG93bkJveC50b2dnbGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGVtcGxhdGVzKCk6IHsgW2tleTogc3RyaW5nXTogVGVtcGxhdGVSZWY8YW55PiB9IHtcclxuICAgICAgICBpZiAodGhpcy5kZWZpbml0aW9ucyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlczogeyBba2V5OiBzdHJpbmddOiBUZW1wbGF0ZVJlZjxhbnk+IH0gPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBkZWZpbml0aW9uIG9mIHRoaXMuZGVmaW5pdGlvbnMudG9BcnJheSgpKSB7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZXNbZGVmaW5pdGlvbi50ZW1wbGF0ZV0gPSBkZWZpbml0aW9uLnRlbXBsYXRlUmVmO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZXM7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB3cml0ZURpc3BsYXlUZXh0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmIHRoaXMuZGlzcGxheUV4cHIgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gdGhpcy52YWx1ZVt0aGlzLmRpc3BsYXlFeHByXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHRoaXMudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIjxkaXZcclxuICAgIGREcm9wRG93blxyXG4gICAgI2Ryb3BEb3duQm94PVwiZC1kcm9wZG93blwiXHJcbiAgICBjbGFzcz1cImRyb3Bkb3duLWJveCBkZXZ1aS1pbnB1dC1ncm91cCBkZXZ1aS1kcm9wZG93bi1vcmlnaW5cIlxyXG4gICAgW3RyaWdnZXJdPVwiJ21hbnVhbGx5J1wiXHJcbiAgICBbY2xvc2VTY29wZV09XCInYmxhbmsnXCJcclxuICAgICh0b2dnbGVFdmVudCk9XCJvbkRyb3BEb3duQm94VG9nZ2xlKCRldmVudClcIlxyXG4+XHJcbiAgICA8aW5wdXRcclxuICAgICAgICAjaW5wdXRcclxuICAgICAgICBkRHJvcERvd25Ub2dnbGVcclxuICAgICAgICBjbGFzcz1cImRldnVpLWZvcm0tY29udHJvbCBkZXZ1aS1zZWxlY3QtaW5wdXQgZGV2dWktaW5wdXRcIlxyXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgcmVhZG9ubHk9XCJyZWFkb25seVwiXHJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgICAoY2xpY2spPVwiZHJvcERvd25Cb3gudG9nZ2xlKClcIlxyXG4gICAgICAgIFt2YWx1ZV09XCJkaXNwbGF5VmFsdWVcIlxyXG4gICAgLz5cclxuICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImRldnVpLWlucHV0LWdyb3VwLWFkZG9uXCJcclxuICAgICAgICAoY2xpY2spPVwiZHJvcERvd25Cb3gudG9nZ2xlKClcIlxyXG4gICAgPlxyXG4gICAgICAgIDxpXHJcbiAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1jaGV2cm9uLWRvd24gZHJvcGRvd24taWNvblwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2V4cGFuZCc6ZXhwYW5kLCAnY29sbGFwc2UnOiAhZXhwYW5kIH1cIlxyXG4gICAgICAgID48L2k+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2XHJcbiAgICAgICAgZERyb3BEb3duTWVudVxyXG4gICAgICAgIGNsYXNzPVwiZGV2dWktZHJvcGRvd24tbWVudVwiXHJcbiAgICA+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAqbmdJZj1cIm9wdGlvbnMubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDoge2RhdGE6b3B0aW9ucywgdmFsdWU6dmFsdWV9IH1cIlxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZXNbY29udGVudFRlbXBsYXRlXVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8IS0tIHRvZG8g5LyY5YyW6buY6K6k6YCJ6aG555qE5bGV56S65pa55byPIC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICp4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAndGVtcGxhdGUnXCI+e3sgb3B0aW9ucy5sZW5ndGggfX08L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwib3B0aW9ucy5sZW5ndGggPD0gMFwiIGNsYXNzPVwieC1uby1kYXRhLXRpcFwiPuaXoOaVsOaNrjwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=