UNPKG

@hxui/angular

Version:

* * *

229 lines (226 loc) 20.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import { Component, ElementRef, ViewEncapsulation, HostListener } from '@angular/core'; import { latinize } from './typeahead-utils'; export class TypeaheadContainerComponent { /** * @param {?} element */ constructor(element) { this.isFocused = false; this._matches = []; this.element = element; } /** * @return {?} */ get active() { return this._active; } /** * @return {?} */ get matches() { return this._matches; } /** * @param {?} value * @return {?} */ set matches(value) { this._matches = value; if (this._matches.length > 0) { this._active = this._matches[0]; if (this._active.isHeader()) { this.nextActiveMatch(); } } } /** * @return {?} */ get optionsListTemplate() { return this.parent ? this.parent.optionsListTemplate : undefined; } /** * @return {?} */ get itemTemplate() { return this.parent ? this.parent.typeaheadItemTemplate : undefined; } /** * @return {?} */ selectActiveMatch() { this.selectMatch(this._active); } /** * @return {?} */ prevActiveMatch() { /** @type {?} */ let index = this.matches.indexOf(this._active); this._active = this.matches[index - 1 < 0 ? this.matches.length - 1 : index - 1]; if (this._active.isHeader()) { this.prevActiveMatch(); } } /** * @return {?} */ nextActiveMatch() { /** @type {?} */ let index = this.matches.indexOf(this._active); this._active = this.matches[index + 1 > this.matches.length - 1 ? 0 : index + 1]; if (this._active.isHeader()) { this.nextActiveMatch(); } } /** * @param {?} value * @return {?} */ selectActive(value) { this.isFocused = true; this._active = value; } /** * @param {?} match * @param {?} query * @return {?} */ hightlight(match, query) { /** @type {?} */ let itemStr = match.value; /** @type {?} */ let itemStrHelper = (this.parent && this.parent.typeaheadLatinize ? latinize(itemStr) : itemStr).toLowerCase(); /** @type {?} */ let startIdx; /** @type {?} */ let tokenLen; // Replaces the capture string with the same string inside of a "strong" tag if (typeof query === 'object') { /** @type {?} */ let queryLen = query.length; for (let i = 0; i < queryLen; i += 1) { // query[i] is already latinized and lower case startIdx = itemStrHelper.indexOf(query[i]); tokenLen = query[i].length; if (startIdx >= 0 && tokenLen > 0) { itemStr = itemStr.substring(0, startIdx) + '<strong>' + itemStr.substring(startIdx, startIdx + tokenLen) + '</strong>' + itemStr.substring(startIdx + tokenLen); itemStrHelper = itemStrHelper.substring(0, startIdx) + ' ' + ' '.repeat(tokenLen) + ' ' + itemStrHelper.substring(startIdx + tokenLen); } } } else if (query) { // query is already latinized and lower case startIdx = itemStrHelper.indexOf(query); tokenLen = query.length; if (startIdx >= 0 && tokenLen > 0) { itemStr = itemStr.substring(0, startIdx) + '<strong>' + itemStr.substring(startIdx, startIdx + tokenLen) + '</strong>' + itemStr.substring(startIdx + tokenLen); } } return itemStr; } /** * @return {?} */ focusLost() { this.isFocused = false; } /** * @param {?} value * @return {?} */ isActive(value) { return this._active === value; } /** * @param {?} value * @param {?=} e * @return {?} */ selectMatch(value, e = void 0) { if (e) { e.stopPropagation(); e.preventDefault(); } this.parent.changeModel(value); setTimeout(() => this.parent.typeaheadOnSelect.emit(value), 0); return false; } } TypeaheadContainerComponent.decorators = [ { type: Component, args: [{ selector: 'hx-typeahead-container', // tslint:disable-next-line template: ` <!-- inject options list template --> <ng-template [ngTemplateOutlet]="optionsListTemplate || optionListTemplate" [ngTemplateOutletContext]="{matches:matches, itemTemplate:itemTemplate, query:query}"></ng-template> <!-- default options item template --> <ng-template #hxItemTemplate let-match="match" let-query="query"><span [innerHtml]="hightlight(match, query)"></span></ng-template> <!-- options list template --> <ng-template #optionListTemplate > <ng-template ngFor let-match let-i="index" [ngForOf]="matches"> <h6 *ngIf="match.isHeader()" class="hx-dropdown-header">{{match}}</h6> <ng-template [ngIf]="!match.isHeader()"> <a href="#" class="hx-dropdown-item" (click)="selectMatch(match, $event)" (mouseenter)="selectActive(match)" [class.active]="isActive(match)"> <ng-template [ngTemplateOutlet]="itemTemplate || hxItemTemplate" [ngTemplateOutletContext]="{item:match.item, index:i, match:match, query:query}"></ng-template> </a> </ng-template> </ng-template> </ng-template> `, // tslint:disable host: { 'class': 'hx-dropdown is-open hx-dropdown-menu', style: 'position: absolute;display: block;' }, // tslint: enable encapsulation: ViewEncapsulation.None },] }, ]; /** @nocollapse */ TypeaheadContainerComponent.ctorParameters = () => [ { type: ElementRef } ]; TypeaheadContainerComponent.propDecorators = { focusLost: [{ type: HostListener, args: ['mouseleave',] }, { type: HostListener, args: ['blur',] }] }; if (false) { /** @type {?} */ TypeaheadContainerComponent.prototype.parent; /** @type {?} */ TypeaheadContainerComponent.prototype.query; /** @type {?} */ TypeaheadContainerComponent.prototype.element; /** @type {?} */ TypeaheadContainerComponent.prototype.isFocused; /** @type {?} */ TypeaheadContainerComponent.prototype.top; /** @type {?} */ TypeaheadContainerComponent.prototype.left; /** @type {?} */ TypeaheadContainerComponent.prototype.display; /** @type {?} */ TypeaheadContainerComponent.prototype.placement; /** @type {?} */ TypeaheadContainerComponent.prototype._active; /** @type {?} */ TypeaheadContainerComponent.prototype._matches; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWFoZWFkLWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaHh1aS9hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL3R5cGVhaGVhZC90eXBlYWhlYWQtY29udGFpbmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxVQUFVLEVBQWUsaUJBQWlCLEVBQUUsWUFBWSxFQUNwRSxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUF1QzdDLE1BQU0sT0FBTywyQkFBMkI7Ozs7SUFjdEMsWUFBbUIsT0FBbUI7UUFWL0IsY0FBUyxHQUFZLEtBQUssQ0FBQztRQVF4QixhQUFRLEdBQXFCLEVBQUUsQ0FBQztRQUd4QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUN6QixDQUFDOzs7O0lBRUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7Ozs7SUFFRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7Ozs7O0lBRUQsSUFBVyxPQUFPLENBQUMsS0FBdUI7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFdEIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDM0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2FBQ3hCO1NBQ0Y7SUFDSCxDQUFDOzs7O0lBRUQsSUFBVyxtQkFBbUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJ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VUFBVSxDQUFDLEdBQUcsRUFBRSxDQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FDN0MsQ0FBQztRQUNGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs7O1lBbEtGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsd0JBQXdCOztnQkFFbEMsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBeUJYOztnQkFFQyxJQUFJLEVBQUU7b0JBQ0osT0FBTyxFQUFFLHNDQUFzQztvQkFDL0MsS0FBSyxFQUFFLG9DQUFvQztpQkFDNUM7O2dCQUVELGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2FBQ3RDOzs7O1lBMUNZLFVBQVU7Ozt3QkFvSnBCLFlBQVksU0FBQyxZQUFZLGNBQ3pCLFlBQVksU0FBQyxNQUFNOzs7O0lBekdwQiw2Q0FBa0M7O0lBQ2xDLDRDQUFrQjs7SUFDbEIsOENBQTJCOztJQUMzQixnREFBa0M7O0lBQ2xDLDBDQUFtQjs7SUFDbkIsMkNBQW9COztJQUNwQiw4Q0FBdUI7O0lBQ3ZCLGdEQUF5Qjs7SUFHekIsOENBQWtDOztJQUNsQywrQ0FBMEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCwgRWxlbWVudFJlZiwgVGVtcGxhdGVSZWYsIFZpZXdFbmNhcHN1bGF0aW9uLCBIb3N0TGlzdGVuZXJcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVHlwZWFoZWFkRGlyZWN0aXZlIH0gZnJvbSAnLi90eXBlYWhlYWQuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgVHlwZWFoZWFkTWF0Y2ggfSBmcm9tICcuL3R5cGVhaGVhZC1tYXRjaC5jbGFzcyc7XHJcbmltcG9ydCB7IGxhdGluaXplIH0gZnJvbSAnLi90eXBlYWhlYWQtdXRpbHMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdoeC10eXBlYWhlYWQtY29udGFpbmVyJyxcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcclxuICB0ZW1wbGF0ZTogYFxyXG48IS0tIGluamVjdCBvcHRpb25zIGxpc3QgdGVtcGxhdGUgLS0+XHJcbjxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25zTGlzdFRlbXBsYXRlIHx8IG9wdGlvbkxpc3RUZW1wbGF0ZVwiXHJcbiAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInttYXRjaGVzOm1hdGNoZXMsIGl0ZW1UZW1wbGF0ZTppdGVtVGVtcGxhdGUsIHF1ZXJ5OnF1ZXJ5fVwiPjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tIGRlZmF1bHQgb3B0aW9ucyBpdGVtIHRlbXBsYXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI2h4SXRlbVRlbXBsYXRlIGxldC1tYXRjaD1cIm1hdGNoXCIgbGV0LXF1ZXJ5PVwicXVlcnlcIj48c3BhbiBbaW5uZXJIdG1sXT1cImhpZ2h0bGlnaHQobWF0Y2gsIHF1ZXJ5KVwiPjwvc3Bhbj48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLSBvcHRpb25zIGxpc3QgdGVtcGxhdGUgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjb3B0aW9uTGlzdFRlbXBsYXRlID5cclxuPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1tYXRjaCBsZXQtaT1cImluZGV4XCIgW25nRm9yT2ZdPVwibWF0Y2hlc1wiPlxyXG4gICA8aDYgKm5nSWY9XCJtYXRjaC5pc0hlYWRlcigpXCIgY2xhc3M9XCJoeC1kcm9wZG93bi1oZWFkZXJcIj57e21hdGNofX08L2g2PlxyXG4gICBcclxuICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiFtYXRjaC5pc0hlYWRlcigpXCI+XHJcbiAgICAgIDxhIGhyZWY9XCIjXCJcclxuICAgICAgICBjbGFzcz1cImh4LWRyb3Bkb3duLWl0ZW1cIlxyXG4gICAgICAgIChjbGljayk9XCJzZWxlY3RNYXRjaChtYXRjaCwgJGV2ZW50KVwiXHJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwic2VsZWN0QWN0aXZlKG1hdGNoKVwiXHJcbiAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc0FjdGl2ZShtYXRjaClcIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtVGVtcGxhdGUgfHwgaHhJdGVtVGVtcGxhdGVcIiBcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntpdGVtOm1hdGNoLml0ZW0sIGluZGV4OmksIG1hdGNoOm1hdGNoLCBxdWVyeTpxdWVyeX1cIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L2E+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuYCxcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZVxyXG4gIGhvc3Q6IHtcclxuICAgICdjbGFzcyc6ICdoeC1kcm9wZG93biBpcy1vcGVuIGh4LWRyb3Bkb3duLW1lbnUnLFxyXG4gICAgc3R5bGU6ICdwb3NpdGlvbjogYWJzb2x1dGU7ZGlzcGxheTogYmxvY2s7J1xyXG4gIH0sXHJcbiAgLy8gdHNsaW50OiBlbmFibGVcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUeXBlYWhlYWRDb250YWluZXJDb21wb25lbnQge1xyXG4gIHB1YmxpYyBwYXJlbnQ6IFR5cGVhaGVhZERpcmVjdGl2ZTtcclxuICBwdWJsaWMgcXVlcnk6IGFueTtcclxuICBwdWJsaWMgZWxlbWVudDogRWxlbWVudFJlZjtcclxuICBwdWJsaWMgaXNGb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHRvcDogc3RyaW5nO1xyXG4gIHB1YmxpYyBsZWZ0OiBzdHJpbmc7XHJcbiAgcHVibGljIGRpc3BsYXk6IHN0cmluZztcclxuICBwdWJsaWMgcGxhY2VtZW50OiBzdHJpbmc7XHJcblxyXG5cclxuICBwcm90ZWN0ZWQgX2FjdGl2ZTogVHlwZWFoZWFkTWF0Y2g7XHJcbiAgcHJvdGVjdGVkIF9tYXRjaGVzOiBUeXBlYWhlYWRNYXRjaFtdID0gW107XHJcblxyXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihlbGVtZW50OiBFbGVtZW50UmVmKSB7XHJcbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhY3RpdmUoKTogVHlwZWFoZWFkTWF0Y2gge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbWF0Y2hlcygpOiBUeXBlYWhlYWRNYXRjaFtdIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXRjaGVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBtYXRjaGVzKHZhbHVlOiBUeXBlYWhlYWRNYXRjaFtdKSB7XHJcbiAgICB0aGlzLl9tYXRjaGVzID0gdmFsdWU7XHJcblxyXG4gICAgaWYgKHRoaXMuX21hdGNoZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLl9hY3RpdmUgPSB0aGlzLl9tYXRjaGVzWzBdO1xyXG4gICAgICBpZiAodGhpcy5fYWN0aXZlLmlzSGVhZGVyKCkpIHtcclxuICAgICAgICB0aGlzLm5leHRBY3RpdmVNYXRjaCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IG9wdGlvbnNMaXN0VGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5vcHRpb25zTGlzdFRlbXBsYXRlIDogdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpdGVtVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC50eXBlYWhlYWRJdGVtVGVtcGxhdGUgOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0QWN0aXZlTWF0Y2goKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdE1hdGNoKHRoaXMuX2FjdGl2ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcHJldkFjdGl2ZU1hdGNoKCk6IHZvaWQge1xyXG4gICAgbGV0IGluZGV4ID0gdGhpcy5tYXRjaGVzLmluZGV4T2YodGhpcy5fYWN0aXZlKTtcclxuICAgIHRoaXMuX2FjdGl2ZSA9IHRoaXMubWF0Y2hlc1tpbmRleCAtIDEgPCAwXHJcbiAgICAgID8gdGhpcy5tYXRjaGVzLmxlbmd0aCAtIDFcclxuICAgICAgOiBpbmRleCAtIDFdO1xyXG4gICAgaWYgKHRoaXMuX2FjdGl2ZS5pc0hlYWRlcigpKSB7XHJcbiAgICAgIHRoaXMucHJldkFjdGl2ZU1hdGNoKCk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5leHRBY3RpdmVNYXRjaCgpOiB2b2lkIHtcclxuICAgIGxldCBpbmRleCA9IHRoaXMubWF0Y2hlcy5pbmRleE9mKHRoaXMuX2FjdGl2ZSk7XHJcbiAgICB0aGlzLl9hY3RpdmUgPSB0aGlzLm1hdGNoZXNbaW5kZXggKyAxID4gdGhpcy5tYXRjaGVzLmxlbmd0aCAtIDFcclxuICAgICAgPyAwXHJcbiAgICAgIDogaW5kZXggKyAxXTtcclxuICAgIGlmICh0aGlzLl9hY3RpdmUuaXNIZWFkZXIoKSkge1xyXG4gICAgICB0aGlzLm5leHRBY3RpdmVNYXRjaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGVjdEFjdGl2ZSh2YWx1ZTogVHlwZWFoZWFkTWF0Y2gpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNGb2N1c2VkID0gdHJ1ZTtcclxuICAgIHRoaXMuX2FjdGl2ZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhpZ2h0bGlnaHQobWF0Y2g6IFR5cGVhaGVhZE1hdGNoLCBxdWVyeTogYW55KTogc3RyaW5nIHtcclxuICAgIGxldCBpdGVtU3RyOiBzdHJpbmcgPSBtYXRjaC52YWx1ZTtcclxuICAgIGxldCBpdGVtU3RySGVscGVyOiBzdHJpbmcgPSAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQudHlwZWFoZWFkTGF0aW5pemVcclxuICAgICAgPyBsYXRpbml6ZShpdGVtU3RyKVxyXG4gICAgICA6IGl0ZW1TdHIpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBsZXQgc3RhcnRJZHg6IG51bWJlcjtcclxuICAgIGxldCB0b2tlbkxlbjogbnVtYmVyO1xyXG4gICAgLy8gUmVwbGFjZXMgdGhlIGNhcHR1cmUgc3RyaW5nIHdpdGggdGhlIHNhbWUgc3RyaW5nIGluc2lkZSBvZiBhIFwic3Ryb25nXCIgdGFnXHJcbiAgICBpZiAodHlwZW9mIHF1ZXJ5ID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBsZXQgcXVlcnlMZW46IG51bWJlciA9IHF1ZXJ5Lmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWVyeUxlbjsgaSArPSAxKSB7XHJcbiAgICAgICAgLy8gcXVlcnlbaV0gaXMgYWxyZWFkeSBsYXRpbml6ZWQgYW5kIGxvd2VyIGNhc2VcclxuICAgICAgICBzdGFydElkeCA9IGl0ZW1TdHJIZWxwZXIuaW5kZXhPZihxdWVyeVtpXSk7XHJcbiAgICAgICAgdG9rZW5MZW4gPSBxdWVyeVtpXS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHN0YXJ0SWR4ID49IDAgJiYgdG9rZW5MZW4gPiAwKSB7XHJcbiAgICAgICAgICBpdGVtU3RyID0gaXRlbVN0ci5zdWJzdHJpbmcoMCwgc3RhcnRJZHgpICsgJzxzdHJvbmc+JyArIGl0ZW1TdHIuc3Vic3RyaW5nKHN0YXJ0SWR4LCBzdGFydElkeCArIHRva2VuTGVuKSArICc8L3N0cm9uZz4nICsgaXRlbVN0ci5zdWJzdHJpbmcoc3RhcnRJZHggKyB0b2tlbkxlbik7XHJcbiAgICAgICAgICBpdGVtU3RySGVscGVyID0gaXRlbVN0ckhlbHBlci5zdWJzdHJpbmcoMCwgc3RhcnRJZHgpICsgJyAgICAgICAgJyArICcgJy5yZXBlYXQodG9rZW5MZW4pICsgJyAgICAgICAgICcgKyBpdGVtU3RySGVscGVyLnN1YnN0cmluZyhzdGFydElkeCArIHRva2VuTGVuKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAocXVlcnkpIHtcclxuICAgICAgLy8gcXVlcnkgaXMgYWxyZWFkeSBsYXRpbml6ZWQgYW5kIGxvd2VyIGNhc2VcclxuICAgICAgc3RhcnRJZHggPSBpdGVtU3RySGVscGVyLmluZGV4T2YocXVlcnkpO1xyXG4gICAgICB0b2tlbkxlbiA9IHF1ZXJ5Lmxlbmd0aDtcclxuICAgICAgaWYgKHN0YXJ0SWR4ID49IDAgJiYgdG9rZW5MZW4gPiAwKSB7XHJcbiAgICAgICAgaXRlbVN0ciA9IGl0ZW1TdHIuc3Vic3RyaW5nKDAsIHN0YXJ0SWR4KSArICc8c3Ryb25nPicgKyBpdGVtU3RyLnN1YnN0cmluZyhzdGFydElkeCwgc3RhcnRJZHggKyB0b2tlbkxlbikgKyAnPC9zdHJvbmc+JyArIGl0ZW1TdHIuc3Vic3RyaW5nKHN0YXJ0SWR4ICsgdG9rZW5MZW4pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXRlbVN0cjtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnKVxyXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxyXG4gIHB1YmxpYyBmb2N1c0xvc3QoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzRm9jdXNlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzQWN0aXZlKHZhbHVlOiBUeXBlYWhlYWRNYXRjaCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZSA9PT0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0TWF0Y2godmFsdWU6IFR5cGVhaGVhZE1hdGNoLCBlOiBFdmVudCA9IHZvaWQgMCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGUpIHtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wYXJlbnQuY2hhbmdlTW9kZWwodmFsdWUpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PlxyXG4gICAgICB0aGlzLnBhcmVudC50eXBlYWhlYWRPblNlbGVjdC5lbWl0KHZhbHVlKSwgMFxyXG4gICAgKTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn1cclxuIl19