UNPKG

angular-bootstrap-md

Version:

Bootstrap 4 & Angular 15 UI KIT - 700+ components, MIT license, simple installation.

206 lines 27.1 kB
import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { Directive, EventEmitter, HostListener, Input, Output, } from '@angular/core'; import * as i0 from "@angular/core"; var SortDirection; (function (SortDirection) { SortDirection["ASC"] = "ascending"; SortDirection["DESC"] = "descending"; SortDirection["CONST"] = "constant"; })(SortDirection || (SortDirection = {})); export class MdbTableSortDirective { constructor(el, renderer) { this.el = el; this.renderer = renderer; this.data = []; this.sortedInto = true; this.order = SortDirection.CONST; this.dataSource = []; this._sortIcon = false; this._resetSortDirection = false; this.sortEnd = new EventEmitter(); this.sorted = new EventEmitter(); } get sortIcon() { return this._sortIcon; } set sortIcon(value) { this._sortIcon = coerceBooleanProperty(value); } get resetSortDirection() { return this._resetSortDirection; } set resetSortDirection(value) { this._resetSortDirection = coerceBooleanProperty(value); } onclick() { this.sortDataBy(this.trimWhiteSigns(this.sortBy.toString())); this.sortEnd.emit(this.dataSource); this.sorted.emit({ data: this.dataSource, sortOrder: this.order, sortBy: this.sortBy, }); this.removeSort(); } trimWhiteSigns(headElement) { return headElement.replace(/ /g, ''); } moveArrayItem(arr, oldIndex, newIndex) { while (oldIndex < 0) { oldIndex += arr.length; } while (newIndex < 0) { newIndex += arr.length; } if (newIndex >= arr.length) { let k = newIndex - arr.length; while (k-- + 1) { arr.push(null); } } arr.splice(newIndex, 0, arr.splice(oldIndex, 1)[0]); return arr; } sortDataBy(key) { let ariaPass = true; const setAria = (sort, id) => { if (ariaPass) { let nextSortType = ''; if (this.resetSortDirection) { if (sort === SortDirection.CONST) { nextSortType = SortDirection.DESC; } else if (sort === SortDirection.DESC) { nextSortType = SortDirection.ASC; } else if (sort === SortDirection.ASC) { nextSortType = SortDirection.CONST; } } else { if (sort === SortDirection.DESC) { nextSortType = SortDirection.ASC; } else if (sort === SortDirection.ASC) { nextSortType = SortDirection.DESC; } } this.renderer.setAttribute(this.el.nativeElement, 'aria-sort', sort); this.renderer.setAttribute(this.el.nativeElement, 'aria-label', `${id}: activate to sort column ${nextSortType}`); ariaPass = false; } }; key = key.split('.'); if (this.resetSortDirection) { const sortFn = (a, b) => { a = a[key]; b = b[key]; return a > b ? -1 : 1; }; if (this.order === SortDirection.CONST) { setAria(SortDirection.DESC, key); this.order = SortDirection.DESC; this.dataSource.sort(sortFn); } else if (this.order === SortDirection.DESC) { setAria(SortDirection.ASC, key); this.order = SortDirection.ASC; this.dataSource.sort(sortFn).reverse(); } else if (this.order === SortDirection.ASC) { setAria(SortDirection.CONST, key); this.order = SortDirection.CONST; this.data.map((el, index) => { this.dataSource[index] = el; }); } } else { this.dataSource.sort((a, b) => { let i = 0; while (i < key.length) { a = a[key[i]]; b = b[key[i]]; i++; } if (a < b) { setAria(SortDirection.ASC, key); this.order = SortDirection.ASC; return this.sortedInto ? 1 : -1; } else if (a > b) { setAria(SortDirection.DESC, key); this.order = SortDirection.DESC; return this.sortedInto ? -1 : 1; } else if (a == null || b == null) { this.order = SortDirection.CONST; return 1; } else { this.order = SortDirection.CONST; return 0; } }); this.sortedInto = !this.sortedInto; } } ngOnInit() { const key = this.trimWhiteSigns(this.sortBy.toString()).split('.'); this.renderer.setAttribute(this.el.nativeElement, 'aria-label', `${key}: activate to sort column descending`); if (this.data.length === 0) { // this.dataSource.map((element: any) => { // this.data.push(element); // }) this.data = Array.from(this.dataSource); } } ngAfterViewInit() { if (this.sortIcon) { this.createIcon(); } } createIcon() { // eslint-disable-next-line max-len const iconUp = `<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="arrow-up" class="svg-inline--fa fa-arrow-up fa-w-14 ascending" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M34.9 289.5l-22.2-22.2c-9.4-9.4-9.4-24.6 0-33.9L207 39c9.4-9.4 24.6-9.4 33.9 0l194.3 194.3c9.4 9.4 9.4 24.6 0 33.9L413 289.4c-9.5 9.5-25 9.3-34.3-.4L264 168.6V456c0 13.3-10.7 24-24 24h-32c-13.3 0-24-10.7-24-24V168.6L69.2 289.1c-9.3 9.8-24.8 10-34.3.4z"></path></svg>`; // eslint-disable-next-line max-len const iconDown = `<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="arrow-down" class="svg-inline--fa fa-arrow-down fa-w-14 descending" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M413.1 222.5l22.2 22.2c9.4 9.4 9.4 24.6 0 33.9L241 473c-9.4 9.4-24.6 9.4-33.9 0L12.7 278.6c-9.4-9.4-9.4-24.6 0-33.9l22.2-22.2c9.5-9.5 25-9.3 34.3.4L184 343.4V56c0-13.3 10.7-24 24-24h32c13.3 0 24 10.7 24 24v287.4l114.8-120.5c9.3-9.8 24.8-10 34.3-.4z"></path></svg>`; const title = this.el.nativeElement.innerHTML; this.el.nativeElement.innerHTML = `${title} ${iconUp} ${iconDown}`; } removeSort() { const nodes = this.el.nativeElement.parentElement.childNodes; if (nodes) { Array.from(nodes).map((node) => { if (node !== this.el.nativeElement && node.nodeName !== '#comment') { this.renderer.removeAttribute(node, 'aria-sort'); } }); } } } MdbTableSortDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: MdbTableSortDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); MdbTableSortDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.1", type: MdbTableSortDirective, selector: "[mdbTableSort]", inputs: { dataSource: ["mdbTableSort", "dataSource"], sortBy: "sortBy", sortIcon: "sortIcon", resetSortDirection: "resetSortDirection" }, outputs: { sortEnd: "sortEnd", sorted: "sorted" }, host: { listeners: { "click": "onclick()" } }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: MdbTableSortDirective, decorators: [{ type: Directive, args: [{ selector: '[mdbTableSort]', }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { dataSource: [{ type: Input, args: ['mdbTableSort'] }], sortBy: [{ type: Input }], sortIcon: [{ type: Input }], resetSortDirection: [{ type: Input }], sortEnd: [{ type: Output }], sorted: [{ type: Output }], onclick: [{ type: HostListener, args: ['click'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRiLXRhYmxlLXNvcnQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1ib290c3RyYXAtbWQvc3JjL2xpYi9mcmVlL3RhYmxlcy9kaXJlY3RpdmVzL21kYi10YWJsZS1zb3J0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7O0FBRXZCLElBQUssYUFJSjtBQUpELFdBQUssYUFBYTtJQUNoQixrQ0FBaUIsQ0FBQTtJQUNqQixvQ0FBbUIsQ0FBQTtJQUNuQixtQ0FBa0IsQ0FBQTtBQUNwQixDQUFDLEVBSkksYUFBYSxLQUFiLGFBQWEsUUFJakI7QUFXRCxNQUFNLE9BQU8scUJBQXFCO0lBNkJoQyxZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUE1Qi9ELFNBQUksR0FBVSxFQUFFLENBQUM7UUFDakIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQixVQUFLLEdBQWlFLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFFbkUsZUFBVSxHQUFlLEVBQUUsQ0FBQztRQVUzQyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBU2xCLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUUxQixZQUFPLEdBQXdCLElBQUksWUFBWSxFQUFTLENBQUM7UUFDekQsV0FBTSxHQUE2QixJQUFJLFlBQVksRUFBYyxDQUFDO0lBRVYsQ0FBQztJQXJCbkUsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxLQUFt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O3NCQUFoQixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFJZ0IsT0FBTztzQkFBN0IsWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5lbnVtIFNvcnREaXJlY3Rpb24ge1xuICBBU0MgPSAnYXNjZW5kaW5nJyxcbiAgREVTQyA9ICdkZXNjZW5kaW5nJyxcbiAgQ09OU1QgPSAnY29uc3RhbnQnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRlZERhdGEge1xuICBkYXRhOiBhbnlbXTtcbiAgc29ydE9yZGVyOiBzdHJpbmc7XG4gIHNvcnRCeTogc3RyaW5nO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbWRiVGFibGVTb3J0XScsXG59KVxuZXhwb3J0IGNsYXNzIE1kYlRhYmxlU29ydERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIGRhdGE6IGFueVtdID0gW107XG4gIHNvcnRlZEludG8gPSB0cnVlO1xuICBvcmRlcjogU29ydERpcmVjdGlvbi5BU0MgfCBTb3J0RGlyZWN0aW9uLkRFU0MgfCBTb3J0RGlyZWN0aW9uLkNPTlNUID0gU29ydERpcmVjdGlvbi5DT05TVDtcblxuICBASW5wdXQoJ21kYlRhYmxlU29ydCcpIGRhdGFTb3VyY2U6IEFycmF5PGFueT4gPSBbXTtcbiAgQElucHV0KCkgc29ydEJ5OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgZ2V0IHNvcnRJY29uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0SWNvbjtcbiAgfVxuICBzZXQgc29ydEljb24odmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3NvcnRJY29uID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9zb3J0SWNvbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGdldCByZXNldFNvcnREaXJlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc2V0U29ydERpcmVjdGlvbjtcbiAgfVxuICBzZXQgcmVzZXRTb3J0RGlyZWN0aW9uKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9yZXNldFNvcnREaXJlY3Rpb24gPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX3Jlc2V0U29ydERpcmVjdGlvbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBzb3J0RW5kOiBFdmVudEVtaXR0ZXI8YW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcbiAgQE91dHB1dCgpIHNvcnRlZDogRXZlbnRFbWl0dGVyPFNvcnRlZERhdGE+ID0gbmV3IEV2ZW50RW1pdHRlcjxTb3J0ZWREYXRhPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycpIG9uY2xpY2soKSB7XG4gICAgdGhpcy5zb3J0RGF0YUJ5KHRoaXMudHJpbVdoaXRlU2lnbnModGhpcy5zb3J0QnkudG9TdHJpbmcoKSkpO1xuICAgIHRoaXMuc29ydEVuZC5lbWl0KHRoaXMuZGF0YVNvdXJjZSk7XG4gICAgdGhpcy5zb3J0ZWQuZW1pdCh7XG4gICAgICBkYXRhOiB0aGlzLmRhdGFTb3VyY2UsXG4gICAgICBzb3J0T3JkZXI6IHRoaXMub3JkZXIsXG4gICAgICBzb3J0Qnk6IHRoaXMuc29ydEJ5LFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZW1vdmVTb3J0KCk7XG4gIH1cblxuICB0cmltV2hpdGVTaWducyhoZWFkRWxlbWVudDogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gaGVhZEVsZW1lbnQucmVwbGFjZSgvIC9nLCAnJyk7XG4gIH1cblxuICBwdWJsaWMgbW92ZUFycmF5SXRlbShhcnI6IGFueSwgb2xkSW5kZXg6IG51bWJlciwgbmV3SW5kZXg6IG51bWJlcikge1xuICAgIHdoaWxlIChvbGRJbmRleCA8IDApIHtcbiAgICAgIG9sZEluZGV4ICs9IGFyci5sZW5ndGg7XG4gICAgfVxuICAgIHdoaWxlIChuZXdJbmRleCA8IDApIHtcbiAgICAgIG5ld0luZGV4ICs9IGFyci5sZW5ndGg7XG4gICAgfVxuICAgIGlmIChuZXdJbmRleCA+PSBhcnIubGVuZ3RoKSB7XG4gICAgICBsZXQgayA9IG5ld0luZGV4IC0gYXJyLmxlbmd0aDtcbiAgICAgIHdoaWxlIChrLS0gKyAxKSB7XG4gICAgICAgIGFyci5wdXNoKG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgICBhcnIuc3BsaWNlKG5ld0luZGV4LCAwLCBhcnIuc3BsaWNlKG9sZEluZGV4LCAxKVswXSk7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG4gIHNvcnREYXRhQnkoa2V5OiBzdHJpbmcgfCBhbnkpIHtcbiAgICBsZXQgYXJpYVBhc3MgPSB0cnVlO1xuXG4gICAgY29uc3Qgc2V0QXJpYSA9IChcbiAgICAgIHNvcnQ6IFNvcnREaXJlY3Rpb24uQVNDIHwgU29ydERpcmVjdGlvbi5DT05TVCB8IFNvcnREaXJlY3Rpb24uREVTQyxcbiAgICAgIGlkOiBhbnlcbiAgICApID0+IHtcbiAgICAgIGlmIChhcmlhUGFzcykge1xuICAgICAgICBsZXQgbmV4dFNvcnRUeXBlID0gJyc7XG5cbiAgICAgICAgaWYgKHRoaXMucmVzZXRTb3J0RGlyZWN0aW9uKSB7XG4gICAgICAgICAgaWYgKHNvcnQgPT09IFNvcnREaXJlY3Rpb24uQ09OU1QpIHtcbiAgICAgICAgICAgIG5leHRTb3J0VHlwZSA9IFNvcnREaXJlY3Rpb24uREVTQztcbiAgICAgICAgICB9IGVsc2UgaWYgKHNvcnQgPT09IFNvcnREaXJlY3Rpb24uREVTQykge1xuICAgICAgICAgICAgbmV4dFNvcnRUeXBlID0gU29ydERpcmVjdGlvbi5BU0M7XG4gICAgICAgICAgfSBlbHNlIGlmIChzb3J0ID09PSBTb3J0RGlyZWN0aW9uLkFTQykge1xuICAgICAgICAgICAgbmV4dFNvcnRUeXBlID0gU29ydERpcmVjdGlvbi5DT05TVDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNvcnQgPT09IFNvcnREaXJlY3Rpb24uREVTQykge1xuICAgICAgICAgICAgbmV4dFNvcnRUeXBlID0gU29ydERpcmVjdGlvbi5BU0M7XG4gICAgICAgICAgfSBlbHNlIGlmIChzb3J0ID09PSBTb3J0RGlyZWN0aW9uLkFTQykge1xuICAgICAgICAgICAgbmV4dFNvcnRUeXBlID0gU29ydERpcmVjdGlvbi5ERVNDO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2FyaWEtc29ydCcsIHNvcnQpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgJ2FyaWEtbGFiZWwnLFxuICAgICAgICAgIGAke2lkfTogYWN0aXZhdGUgdG8gc29ydCBjb2x1bW4gJHtuZXh0U29ydFR5cGV9YFxuICAgICAgICApO1xuICAgICAgICBhcmlhUGFzcyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBrZXkgPSBrZXkuc3BsaXQoJy4nKTtcblxuICAgIGlmICh0aGlzLnJlc2V0U29ydERpcmVjdGlvbikge1xuICAgICAgY29uc3Qgc29ydEZuID0gKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICAgIGEgPSBhW2tleV07XG4gICAgICAgIGIgPSBiW2tleV07XG5cbiAgICAgICAgcmV0dXJuIGEgPiBiID8gLTEgOiAxO1xuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLm9yZGVyID09PSBTb3J0RGlyZWN0aW9uLkNPTlNUKSB7XG4gICAgICAgIHNldEFyaWEoU29ydERpcmVjdGlvbi5ERVNDLCBrZXkpO1xuICAgICAgICB0aGlzLm9yZGVyID0gU29ydERpcmVjdGlvbi5ERVNDO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydChzb3J0Rm4pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9yZGVyID09PSBTb3J0RGlyZWN0aW9uLkRFU0MpIHtcbiAgICAgICAgc2V0QXJpYShTb3J0RGlyZWN0aW9uLkFTQywga2V5KTtcbiAgICAgICAgdGhpcy5vcmRlciA9IFNvcnREaXJlY3Rpb24uQVNDO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydChzb3J0Rm4pLnJldmVyc2UoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcmRlciA9PT0gU29ydERpcmVjdGlvbi5BU0MpIHtcbiAgICAgICAgc2V0QXJpYShTb3J0RGlyZWN0aW9uLkNPTlNULCBrZXkpO1xuICAgICAgICB0aGlzLm9yZGVyID0gU29ydERpcmVjdGlvbi5DT05TVDtcbiAgICAgICAgdGhpcy5kYXRhLm1hcCgoZWw6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZVtpbmRleF0gPSBlbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwga2V5Lmxlbmd0aCkge1xuICAgICAgICAgIGEgPSBhW2tleVtpXV07XG4gICAgICAgICAgYiA9IGJba2V5W2ldXTtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgICBzZXRBcmlhKFNvcnREaXJlY3Rpb24uQVNDLCBrZXkpO1xuICAgICAgICAgIHRoaXMub3JkZXIgPSBTb3J0RGlyZWN0aW9uLkFTQztcblxuICAgICAgICAgIHJldHVybiB0aGlzLnNvcnRlZEludG8gPyAxIDogLTE7XG4gICAgICAgIH0gZWxzZSBpZiAoYSA+IGIpIHtcbiAgICAgICAgICBzZXRBcmlhKFNvcnREaXJlY3Rpb24uREVTQywga2V5KTtcbiAgICAgICAgICB0aGlzLm9yZGVyID0gU29ydERpcmVjdGlvbi5ERVNDO1xuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc29ydGVkSW50byA/IC0xIDogMTtcbiAgICAgICAgfSBlbHNlIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5vcmRlciA9IFNvcnREaXJlY3Rpb24uQ09OU1Q7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcmRlciA9IFNvcnREaXJlY3Rpb24uQ09OU1Q7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvcnRlZEludG8gPSAhdGhpcy5zb3J0ZWRJbnRvO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGtleSA9IHRoaXMudHJpbVdoaXRlU2lnbnModGhpcy5zb3J0QnkudG9TdHJpbmcoKSkuc3BsaXQoJy4nKTtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKFxuICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LFxuICAgICAgJ2FyaWEtbGFiZWwnLFxuICAgICAgYCR7a2V5fTogYWN0aXZhdGUgdG8gc29ydCBjb2x1bW4gZGVzY2VuZGluZ2BcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIHRoaXMuZGF0YVNvdXJjZS5tYXAoKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgLy8gICB0aGlzLmRhdGEucHVzaChlbGVtZW50KTtcbiAgICAgIC8vIH0pXG5cbiAgICAgIHRoaXMuZGF0YSA9IEFycmF5LmZyb20odGhpcy5kYXRhU291cmNlKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMuc29ydEljb24pIHtcbiAgICAgIHRoaXMuY3JlYXRlSWNvbigpO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUljb24oKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICBjb25zdCBpY29uVXAgPSBgPHN2ZyBhcmlhLWhpZGRlbj1cInRydWVcIiBmb2N1c2FibGU9XCJmYWxzZVwiIGRhdGEtcHJlZml4PVwiZmFzXCIgZGF0YS1pY29uPVwiYXJyb3ctdXBcIiBjbGFzcz1cInN2Zy1pbmxpbmUtLWZhIGZhLWFycm93LXVwIGZhLXctMTQgYXNjZW5kaW5nXCIgcm9sZT1cImltZ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDQ0OCA1MTJcIj48cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk0zNC45IDI4OS41bC0yMi4yLTIyLjJjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45TDIwNyAzOWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMGwxOTQuMyAxOTQuM2M5LjQgOS40IDkuNCAyNC42IDAgMzMuOUw0MTMgMjg5LjRjLTkuNSA5LjUtMjUgOS4zLTM0LjMtLjRMMjY0IDE2OC42VjQ1NmMwIDEzLjMtMTAuNyAyNC0yNCAyNGgtMzJjLTEzLjMgMC0yNC0xMC43LTI0LTI0VjE2OC42TDY5LjIgMjg5LjFjLTkuMyA5LjgtMjQuOCAxMC0zNC4zLjR6XCI+PC9wYXRoPjwvc3ZnPmA7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgIGNvbnN0IGljb25Eb3duID0gYDxzdmcgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZm9jdXNhYmxlPVwiZmFsc2VcIiBkYXRhLXByZWZpeD1cImZhc1wiIGRhdGEtaWNvbj1cImFycm93LWRvd25cIiBjbGFzcz1cInN2Zy1pbmxpbmUtLWZhIGZhLWFycm93LWRvd24gZmEtdy0xNCBkZXNjZW5kaW5nXCIgcm9sZT1cImltZ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDQ0OCA1MTJcIj48cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk00MTMuMSAyMjIuNWwyMi4yIDIyLjJjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlMMjQxIDQ3M2MtOS40IDkuNC0yNC42IDkuNC0zMy45IDBMMTIuNyAyNzguNmMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlsMjIuMi0yMi4yYzkuNS05LjUgMjUtOS4zIDM0LjMuNEwxODQgMzQzLjRWNTZjMC0xMy4zIDEwLjctMjQgMjQtMjRoMzJjMTMuMyAwIDI0IDEwLjcgMjQgMjR2Mjg3LjRsMTE0LjgtMTIwLjVjOS4zLTkuOCAyNC44LTEwIDM0LjMtLjR6XCI+PC9wYXRoPjwvc3ZnPmA7XG5cbiAgICBjb25zdCB0aXRsZSA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5pbm5lckhUTUw7XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IGAke3RpdGxlfSAke2ljb25VcH0gJHtpY29uRG93bn1gO1xuICB9XG5cbiAgcmVtb3ZlU29ydCgpIHtcbiAgICBjb25zdCBub2RlcyA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgaWYgKG5vZGVzKSB7XG4gICAgICBBcnJheS5mcm9tKG5vZGVzKS5tYXAoKG5vZGU6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChub2RlICE9PSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQgJiYgbm9kZS5ub2RlTmFtZSAhPT0gJyNjb21tZW50Jykge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKG5vZGUsICdhcmlhLXNvcnQnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=