UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

382 lines 51 kB
var IgxTextHighlightDirective_1; import { __decorate, __metadata } from "tslib"; import { AfterViewInit, Directive, ElementRef, EventEmitter, Input, NgModule, OnChanges, OnDestroy, Renderer2, SimpleChanges, AfterViewChecked, } from '@angular/core'; import { takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; import { DeprecateProperty } from '../../core/deprecateDecorators'; let IgxTextHighlightDirective = IgxTextHighlightDirective_1 = class IgxTextHighlightDirective { constructor(element, renderer) { this.element = element; this.renderer = renderer; this._div = null; this._observer = null; this._nodeWasRemoved = false; this._forceEvaluation = false; this._activeElementIndex = -1; this._defaultCssClass = 'igx-highlight'; this._defaultActiveCssClass = 'igx-highlight--active'; /** * Identifies the highlight within a unique group. * This allows it to have several different highlight groups, * with each of them having their own active highlight. * * ```html * <div * igxTextHighlight * [groupName]="myGroupName"> * </div> * ``` */ this.groupName = ''; this._value = ''; this.destroy$ = new Subject(); IgxTextHighlightDirective_1.onActiveElementChanged.pipe(takeUntil(this.destroy$)).subscribe((groupName) => { if (this.groupName === groupName) { if (this._activeElementIndex !== -1) { this.deactivate(); } this.activateIfNecessary(); } }); } /** * The underlying value of the element that will be highlighted. * * ```typescript * // get * const elementValue = this.textHighlight.value; * ``` * * ```html * <!--set--> * <div * igxTextHighlight * [value]="newValue"> * </div> * ``` */ get value() { return this._value; } set value(value) { if (value === undefined || value === null) { this._value = ''; } else { this._value = value; } } /** * @hidden */ get lastSearchInfo() { return this._lastSearchInfo; } /** * Activates the highlight at a given index. * (if such index exists) */ static setActiveHighlight(groupName, highlight) { IgxTextHighlightDirective_1.highlightGroupsMap.set(groupName, highlight); IgxTextHighlightDirective_1.onActiveElementChanged.emit(groupName); } /** * Clears any existing highlight. */ static clearActiveHighlight(groupName) { IgxTextHighlightDirective_1.highlightGroupsMap.set(groupName, { index: -1 }); IgxTextHighlightDirective_1.onActiveElementChanged.emit(groupName); } /** * @hidden */ ngOnDestroy() { this.clearHighlight(); if (this._observer !== null) { this._observer.disconnect(); } this.destroy$.next(true); this.destroy$.complete(); } /** * @hidden */ ngOnChanges(changes) { if (changes.value && !changes.value.firstChange) { this._valueChanged = true; } else if ((changes.row !== undefined && !changes.row.firstChange) || (changes.column !== undefined && !changes.column.firstChange) || (changes.page !== undefined && !changes.page.firstChange)) { if (this._activeElementIndex !== -1) { this.deactivate(); } this.activateIfNecessary(); } } /** * @hidden */ ngAfterViewInit() { this.parentElement = this.renderer.parentNode(this.element.nativeElement); if (IgxTextHighlightDirective_1.highlightGroupsMap.has(this.groupName) === false) { IgxTextHighlightDirective_1.highlightGroupsMap.set(this.groupName, { index: -1 }); } this._lastSearchInfo = { searchedText: '', content: this.value, matchCount: 0, caseSensitive: false, exactMatch: false }; this._container = this.parentElement.firstElementChild; } /** * @hidden */ ngAfterViewChecked() { if (this._valueChanged) { this.highlight(this._lastSearchInfo.searchedText, this._lastSearchInfo.caseSensitive, this._lastSearchInfo.exactMatch); this.activateIfNecessary(); this._valueChanged = false; } } /** * Clears the existing highlight and highlights the searched text. * Returns how many times the element contains the searched text. */ highlight(text, caseSensitive, exactMatch) { const caseSensitiveResolved = caseSensitive ? true : false; const exactMatchResolved = exactMatch ? true : false; if (this.searchNeedsEvaluation(text, caseSensitiveResolved, exactMatchResolved)) { this._lastSearchInfo.searchedText = text; this._lastSearchInfo.caseSensitive = caseSensitiveResolved; this._lastSearchInfo.exactMatch = exactMatchResolved; this._lastSearchInfo.content = this.value; if (text === '' || text === undefined || text === null) { this.clearHighlight(); } else { this.clearChildElements(true); this._lastSearchInfo.matchCount = this.getHighlightedText(text, caseSensitive, exactMatch); } } else if (this._nodeWasRemoved) { this._lastSearchInfo.searchedText = text; this._lastSearchInfo.caseSensitive = caseSensitiveResolved; this._lastSearchInfo.exactMatch = exactMatchResolved; } return this._lastSearchInfo.matchCount; } /** * Clears any existing highlight. */ clearHighlight() { this.clearChildElements(false); this._lastSearchInfo.searchedText = ''; this._lastSearchInfo.matchCount = 0; } /** * Activates the highlight if it is on the currently active row, column and page. */ activateIfNecessary() { const group = IgxTextHighlightDirective_1.highlightGroupsMap.get(this.groupName); const column = group.columnIndex === undefined ? group.column : group.columnIndex; const row = group.rowIndex === undefined ? group.row : group.rowIndex; if (column === this.column && row === this.row && group.page === this.page) { this.activate(group.index); } } /** * Attaches a MutationObserver to the parentElement and watches for when the container element is removed/readded to the DOM. * Should be used only when necessary as using many observers may lead to performance degradation. */ observe() { if (this._observer === null) { const callback = (mutationList) => { mutationList.forEach((mutation) => { const removedNodes = Array.from(mutation.removedNodes); removedNodes.forEach((n) => { if (n === this._container) { this._nodeWasRemoved = true; this.clearChildElements(false); } }); const addedNodes = Array.from(mutation.addedNodes); addedNodes.forEach((n) => { if (n === this.parentElement.firstElementChild && this._nodeWasRemoved) { this._container = this.parentElement.firstElementChild; this._nodeWasRemoved = false; this._forceEvaluation = true; this.highlight(this._lastSearchInfo.searchedText, this._lastSearchInfo.caseSensitive, this._lastSearchInfo.exactMatch); this._forceEvaluation = false; this.activateIfNecessary(); this._observer.disconnect(); this._observer = null; } }); }); }; this._observer = new MutationObserver(callback); this._observer.observe(this.parentElement, { childList: true }); } } activate(index) { this.deactivate(); if (this._div !== null) { const spans = this._div.querySelectorAll('span'); this._activeElementIndex = index; if (spans.length <= index) { return; } const elementToActivate = spans[index]; this.renderer.addClass(elementToActivate, this._defaultActiveCssClass); this.renderer.addClass(elementToActivate, this.activeCssClass); } } deactivate() { if (this._activeElementIndex === -1) { return; } const spans = this._div.querySelectorAll('span'); if (spans.length <= this._activeElementIndex) { this._activeElementIndex = -1; return; } const elementToDeactivate = spans[this._activeElementIndex]; this.renderer.removeClass(elementToDeactivate, this._defaultActiveCssClass); this.renderer.removeClass(elementToDeactivate, this.activeCssClass); this._activeElementIndex = -1; } clearChildElements(originalContentHidden) { this.renderer.setProperty(this.element.nativeElement, 'hidden', originalContentHidden); if (this._div !== null) { this.renderer.removeChild(this.parentElement, this._div); this._div = null; this._activeElementIndex = -1; } } getHighlightedText(searchText, caseSensitive, exactMatch) { this.appendDiv(); const stringValue = String(this.value); const contentStringResolved = !caseSensitive ? stringValue.toLowerCase() : stringValue; const searchTextResolved = !caseSensitive ? searchText.toLowerCase() : searchText; let matchCount = 0; if (exactMatch) { if (contentStringResolved === searchTextResolved) { // tslint:disable-next-line:max-line-length this.appendSpan(`<span class="${this._defaultCssClass} ${this.cssClass ? this.cssClass : ''}">${stringValue}</span>`); matchCount++; } else { this.appendText(stringValue); } } else { let foundIndex = contentStringResolved.indexOf(searchTextResolved, 0); let previousMatchEnd = 0; while (foundIndex !== -1) { const start = foundIndex; const end = foundIndex + searchTextResolved.length; this.appendText(stringValue.substring(previousMatchEnd, start)); // tslint:disable-next-line:max-line-length this.appendSpan(`<span class="${this._defaultCssClass} ${this.cssClass ? this.cssClass : ''}">${stringValue.substring(start, end)}</span>`); previousMatchEnd = end; matchCount++; foundIndex = contentStringResolved.indexOf(searchTextResolved, end); } this.appendText(stringValue.substring(previousMatchEnd, stringValue.length)); } return matchCount; } appendText(text) { const textElement = this.renderer.createText(text); this.renderer.appendChild(this._div, textElement); } appendSpan(outerHTML) { const span = this.renderer.createElement('span'); this.renderer.appendChild(this._div, span); this.renderer.setProperty(span, 'outerHTML', outerHTML); } appendDiv() { this._div = this.renderer.createElement('div'); if (this.containerClass) { this.renderer.addClass(this._div, this.containerClass); } this.renderer.appendChild(this.parentElement, this._div); } searchNeedsEvaluation(text, caseSensitive, exactMatch) { const searchedText = this._lastSearchInfo.searchedText; return !this._nodeWasRemoved && (searchedText === null || searchedText !== text || this._lastSearchInfo.content !== this.value || this._lastSearchInfo.caseSensitive !== caseSensitive || this._lastSearchInfo.exactMatch !== exactMatch || this._forceEvaluation); } }; IgxTextHighlightDirective.onActiveElementChanged = new EventEmitter(); IgxTextHighlightDirective.highlightGroupsMap = new Map(); IgxTextHighlightDirective.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 } ]; __decorate([ Input('cssClass'), __metadata("design:type", String) ], IgxTextHighlightDirective.prototype, "cssClass", void 0); __decorate([ Input('activeCssClass'), __metadata("design:type", String) ], IgxTextHighlightDirective.prototype, "activeCssClass", void 0); __decorate([ Input('containerClass'), __metadata("design:type", String) ], IgxTextHighlightDirective.prototype, "containerClass", void 0); __decorate([ Input('groupName'), __metadata("design:type", Object) ], IgxTextHighlightDirective.prototype, "groupName", void 0); __decorate([ Input('value'), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], IgxTextHighlightDirective.prototype, "value", null); __decorate([ Input('row'), __metadata("design:type", Object) ], IgxTextHighlightDirective.prototype, "row", void 0); __decorate([ Input('column'), __metadata("design:type", Object) ], IgxTextHighlightDirective.prototype, "column", void 0); __decorate([ Input('page'), DeprecateProperty(`IgxTextHighlightDirective 'page' input property is deprecated.`), __metadata("design:type", Number) ], IgxTextHighlightDirective.prototype, "page", void 0); IgxTextHighlightDirective = IgxTextHighlightDirective_1 = __decorate([ Directive({ selector: '[igxTextHighlight]' }), __metadata("design:paramtypes", [ElementRef, Renderer2]) ], IgxTextHighlightDirective); export { IgxTextHighlightDirective }; /** * @hidden */ let IgxTextHighlightModule = class IgxTextHighlightModule { }; IgxTextHighlightModule = __decorate([ NgModule({ declarations: [IgxTextHighlightDirective], exports: [IgxTextHighlightDirective] }) ], IgxTextHighlightModule); export { IgxTextHighlightModule }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1oaWdobGlnaHQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL3RleHQtaGlnaGxpZ2h0L3RleHQtaGlnaGxpZ2h0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFDSCxhQUFhLEVBQ2IsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLFFBQVEsRUFDUixTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxhQUFhLEVBQ2IsZ0JBQWdCLEdBQ25CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBMkNuRSxJQUFhLHlCQUF5QixpQ0FBdEMsTUFBYSx5QkFBeUI7SUE4SmxDLFlBQW9CLE9BQW1CLEVBQVMsUUFBbUI7UUFBL0MsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUFTLGFBQVEsR0FBUixRQUFRLENBQVc7UUF6SjNELFNBQUksR0FBRyxJQUFJLENBQUM7UUFDWixjQUFTLEdBQXFCLElBQUksQ0FBQztRQUNuQyxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekIsd0JBQW1CLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFekIscUJBQWdCLEdBQUcsZUFBZSxDQUFDO1FBQ25DLDJCQUFzQixHQUFHLHVCQUF1QixDQUFDO1FBb0N6RDs7Ozs7Ozs7Ozs7V0FXRztRQUVJLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFFZCxXQUFNLEdBQUcsRUFBRSxDQUFDO1FBMEVaLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBc0J0QywyQkFBeUIsQ0FB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QUFDO0dBQ1csc0JBQXNCLENBQUk7U0FBMUIsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIFJlbmRlcmVyMixcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIEFmdGVyVmlld0NoZWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGVwcmVjYXRlUHJvcGVydHkgfSBmcm9tICcuLi8uLi9jb3JlL2RlcHJlY2F0ZURlY29yYXRvcnMnO1xuXG5pbnRlcmZhY2UgSVNlYXJjaEluZm8ge1xuICAgIHNlYXJjaGVkVGV4dDogc3RyaW5nO1xuICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICBtYXRjaENvdW50OiBudW1iZXI7XG4gICAgY2FzZVNlbnNpdGl2ZTogYm9vbGVhbjtcbiAgICBleGFjdE1hdGNoOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBkZXNjcmliaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgYWN0aXZlIGhpZ2hsaWdodC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQWN0aXZlSGlnaGxpZ2h0SW5mbyB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdyBpbmRleCBvZiB0aGUgaGlnaGxpZ2h0LiBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQsIHVzZSBgcm93YCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIHJvd0luZGV4PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb2x1bW4gaW5kZXggb2YgdGhlIGhpZ2hsaWdodC4gVGhpcyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLCB1c2UgYGNvbHVtbmAgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBjb2x1bW5JbmRleD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFnZSBpbmRleCBvZiB0aGUgaGlnaGxpZ2h0LiBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuXG4gICAgICovXG4gICAgcGFnZT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcm93IG9mIHRoZSBoaWdobGlnaHQuXG4gICAgICovXG4gICAgcm93PzogYW55O1xuICAgIC8qKlxuICAgICAqIFRoZSBjb2x1bW4gb2YgdGhlIGhpZ2hsaWdodC5cbiAgICAgKi9cbiAgICBjb2x1bW4/OiBhbnk7XG4gICAgLyoqXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBoaWdobGlnaHQuXG4gICAgICovXG4gICAgaW5kZXg6IG51bWJlcjtcbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4VGV4dEhpZ2hsaWdodF0nXG59KVxuZXhwb3J0IGNsYXNzIElneFRleHRIaWdobGlnaHREaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkLCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgb25BY3RpdmVFbGVtZW50Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAgIHB1YmxpYyBzdGF0aWMgaGlnaGxpZ2h0R3JvdXBzTWFwID0gbmV3IE1hcDxzdHJpbmcsIElBY3RpdmVIaWdobGlnaHRJbmZvPigpO1xuXG4gICAgcHJpdmF0ZSBfbGFzdFNlYXJjaEluZm86IElTZWFyY2hJbmZvO1xuICAgIHByaXZhdGUgX2RpdiA9IG51bGw7XG4gICAgcHJpdmF0ZSBfb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXIgPSBudWxsO1xuICAgIHByaXZhdGUgX25vZGVXYXNSZW1vdmVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZm9yY2VFdmFsdWF0aW9uID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfYWN0aXZlRWxlbWVudEluZGV4ID0gLTE7XG4gICAgcHJpdmF0ZSBfdmFsdWVDaGFuZ2VkOiBib29sZWFuO1xuICAgIHByaXZhdGUgX2RlZmF1bHRDc3NDbGFzcyA9ICdpZ3gtaGlnaGxpZ2h0JztcbiAgICBwcml2YXRlIF9kZWZhdWx0QWN0aXZlQ3NzQ2xhc3MgPSAnaWd4LWhpZ2hsaWdodC0tYWN0aXZlJztcblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgdGhlIGBDU1NgIGNsYXNzIG9mIHRoZSBoaWdobGlnaHQgZWxlbWVudHMuXG4gICAgICogVGhpcyBhbGxvd3MgdGhlIGRldmVsb3BlciB0byBwcm92aWRlIGN1c3RvbSBgQ1NTYCB0byBjdXN0b21pemUgdGhlIGhpZ2hsaWdodC5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8ZGl2XG4gICAgICogICBpZ3hUZXh0SGlnaGxpZ2h0XG4gICAgICogICBbY3NzQ2xhc3NdPVwibXlDbGFzc1wiPlxuICAgICAqIDwvZGl2PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgnY3NzQ2xhc3MnKVxuICAgIHB1YmxpYyBjc3NDbGFzczogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgYENTU2AgY2xhc3Mgb2YgdGhlIGFjdGl2ZSBoaWdobGlnaHQgZWxlbWVudC5cbiAgICAgKiBUaGlzIGFsbG93cyB0aGUgZGV2ZWxvcGVyIHRvIHByb3ZpZGUgY3VzdG9tIGBDU1NgIHRvIGN1c3RvbWl6ZSB0aGUgaGlnaGxpZ2h0LlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxkaXZcbiAgICAgKiAgIGlneFRleHRIaWdobGlnaHRcbiAgICAgKiAgIFthY3RpdmVDc3NDbGFzc109XCJhY3RpdmVIaWdobGlnaHRDbGFzc1wiPlxuICAgICAqIDwvZGl2PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgnYWN0aXZlQ3NzQ2xhc3MnKVxuICAgIHB1YmxpYyBhY3RpdmVDc3NDbGFzczogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBJbnB1dCgnY29udGFpbmVyQ2xhc3MnKVxuICAgIHB1YmxpYyBjb250YWluZXJDbGFzczogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllcyB0aGUgaGlnaGxpZ2h0IHdpdGhpbiBhIHVuaXF1ZSBncm91cC5cbiAgICAgKiBUaGlzIGFsbG93cyBpdCB0byBoYXZlIHNldmVyYWwgZGlmZmVyZW50IGhpZ2hsaWdodCBncm91cHMsXG4gICAgICogd2l0aCBlYWNoIG9mIHRoZW0gaGF2aW5nIHRoZWlyIG93biBhY3RpdmUgaGlnaGxpZ2h0LlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxkaXZcbiAgICAgKiAgIGlneFRleHRIaWdobGlnaHRcbiAgICAgKiAgIFtncm91cE5hbWVdPVwibXlHcm91cE5hbWVcIj5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ2dyb3VwTmFtZScpXG4gICAgcHVibGljIGdyb3VwTmFtZSA9ICcnO1xuXG4gICAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICAgIC8qKlxuICAgICAqIFRoZSB1bmRlcmx5aW5nIHZhbHVlIG9mIHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBoaWdobGlnaHRlZC5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBjb25zdCBlbGVtZW50VmFsdWUgPSB0aGlzLnRleHRIaWdobGlnaHQudmFsdWU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxkaXZcbiAgICAgKiAgIGlneFRleHRIaWdobGlnaHRcbiAgICAgKiAgIFt2YWx1ZV09XCJuZXdWYWx1ZVwiPlxuICAgICAqIDwvZGl2PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgndmFsdWUnKVxuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHJvdyBvbiB3aGljaCB0aGUgZGlyZWN0aXZlIGlzIGN1cnJlbnRseSBvbi5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8ZGl2XG4gICAgICogICBpZ3hUZXh0SGlnaGxpZ2h0XG4gICAgICogICBbcm93XT1cIjBcIj5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ3JvdycpXG4gICAgcHVibGljIHJvdzogYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbHVtbiBvbiB3aGljaCB0aGUgZGlyZWN0aXZlIGlzIGN1cnJlbnRseSBvbi5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8ZGl2XG4gICAgICogICBpZ3hUZXh0SGlnaGxpZ2h0XG4gICAgICogICBbY29sdW1uXT1cIjBcIj5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ2NvbHVtbicpXG4gICAgcHVibGljIGNvbHVtbjogYW55O1xuXG4gICAgQElucHV0KCdwYWdlJylcbiAgICBARGVwcmVjYXRlUHJvcGVydHkoYElneFRleHRIaWdobGlnaHREaXJlY3RpdmUgJ3BhZ2UnIGlucHV0IHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuYClcbiAgICBwdWJsaWMgcGFnZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbGFzdFNlYXJjaEluZm8oKTogSVNlYXJjaEluZm8ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFNlYXJjaEluZm87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJlbnRFbGVtZW50OiBhbnk7XG5cbiAgICBwcml2YXRlIF9jb250YWluZXI6IGFueTtcblxuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgLyoqXG4gICAgICogQWN0aXZhdGVzIHRoZSBoaWdobGlnaHQgYXQgYSBnaXZlbiBpbmRleC5cbiAgICAgKiAoaWYgc3VjaCBpbmRleCBleGlzdHMpXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzZXRBY3RpdmVIaWdobGlnaHQoZ3JvdXBOYW1lOiBzdHJpbmcsIGhpZ2hsaWdodDogSUFjdGl2ZUhpZ2hsaWdodEluZm8pIHtcbiAgICAgICAgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5oaWdobGlnaHRHcm91cHNNYXAuc2V0KGdyb3VwTmFtZSwgaGlnaGxpZ2h0KTtcbiAgICAgICAgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5vbkFjdGl2ZUVsZW1lbnRDaGFuZ2VkLmVtaXQoZ3JvdXBOYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYW55IGV4aXN0aW5nIGhpZ2hsaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyQWN0aXZlSGlnaGxpZ2h0KGdyb3VwTmFtZSkge1xuICAgICAgICBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLmhpZ2hsaWdodEdyb3Vwc01hcC5zZXQoZ3JvdXBOYW1lLCB7XG4gICAgICAgICAgICBpbmRleDogLTFcbiAgICAgICAgfSk7XG4gICAgICAgIElneFRleHRIaWdobGlnaHREaXJlY3RpdmUub25BY3RpdmVFbGVtZW50Q2hhbmdlZC5lbWl0KGdyb3VwTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLCBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgICAgICBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLm9uQWN0aXZlRWxlbWVudENoYW5nZWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZ3JvdXBOYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cE5hbWUgPT09IGdyb3VwTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmVFbGVtZW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlSWZOZWNlc3NhcnkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmNsZWFySGlnaGxpZ2h0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX29ic2VydmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXMudmFsdWUgJiYgIWNoYW5nZXMudmFsdWUuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoKGNoYW5nZXMucm93ICE9PSB1bmRlZmluZWQgJiYgIWNoYW5nZXMucm93LmZpcnN0Q2hhbmdlKSB8fFxuICAgICAgICAgICAgKGNoYW5nZXMuY29sdW1uICE9PSB1bmRlZmluZWQgJiYgIWNoYW5nZXMuY29sdW1uLmZpcnN0Q2hhbmdlKSB8fFxuICAgICAgICAgICAgKGNoYW5nZXMucGFnZSAhPT0gdW5kZWZpbmVkICYmICFjaGFuZ2VzLnBhZ2UuZmlyc3RDaGFuZ2UpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlRWxlbWVudEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUlmTmVjZXNzYXJ5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLnBhcmVudE5vZGUodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLmhpZ2hsaWdodEdyb3Vwc01hcC5oYXModGhpcy5ncm91cE5hbWUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5oaWdobGlnaHRHcm91cHNNYXAuc2V0KHRoaXMuZ3JvdXBOYW1lLCB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IC0xXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvID0ge1xuICAgICAgICAgICAgc2VhcmNoZWRUZXh0OiAnJyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudmFsdWUsXG4gICAgICAgICAgICBtYXRjaENvdW50OiAwLFxuICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICBleGFjdE1hdGNoOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IHRoaXMucGFyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgICAgICBpZiAodGhpcy5fdmFsdWVDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodCh0aGlzLl9sYXN0U2VhcmNoSW5mby5zZWFyY2hlZFRleHQsIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmNhc2VTZW5zaXRpdmUsIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2gpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUlmTmVjZXNzYXJ5KCk7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgZXhpc3RpbmcgaGlnaGxpZ2h0IGFuZCBoaWdobGlnaHRzIHRoZSBzZWFyY2hlZCB0ZXh0LlxuICAgICAqIFJldHVybnMgaG93IG1hbnkgdGltZXMgdGhlIGVsZW1lbnQgY29udGFpbnMgdGhlIHNlYXJjaGVkIHRleHQuXG4gICAgICovXG4gICAgcHVibGljIGhpZ2hsaWdodCh0ZXh0OiBzdHJpbmcsIGNhc2VTZW5zaXRpdmU/OiBib29sZWFuLCBleGFjdE1hdGNoPzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGNhc2VTZW5zaXRpdmVSZXNvbHZlZCA9IGNhc2VTZW5zaXRpdmUgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGV4YWN0TWF0Y2hSZXNvbHZlZCA9IGV4YWN0TWF0Y2ggPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoTmVlZHNFdmFsdWF0aW9uKHRleHQsIGNhc2VTZW5zaXRpdmVSZXNvbHZlZCwgZXhhY3RNYXRjaFJlc29sdmVkKSkge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8uc2VhcmNoZWRUZXh0ID0gdGV4dDtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmNhc2VTZW5zaXRpdmUgPSBjYXNlU2Vuc2l0aXZlUmVzb2x2ZWQ7XG4gICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5leGFjdE1hdGNoID0gZXhhY3RNYXRjaFJlc29sdmVkO1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8uY29udGVudCA9IHRoaXMudmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh0ZXh0ID09PSAnJyB8fCB0ZXh0ID09PSB1bmRlZmluZWQgfHwgdGV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJIaWdobGlnaHQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckNoaWxkRWxlbWVudHModHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8ubWF0Y2hDb3VudCA9IHRoaXMuZ2V0SGlnaGxpZ2h0ZWRUZXh0KHRleHQsIGNhc2VTZW5zaXRpdmUsIGV4YWN0TWF0Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX25vZGVXYXNSZW1vdmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5zZWFyY2hlZFRleHQgPSB0ZXh0O1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8uY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmVSZXNvbHZlZDtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2ggPSBleGFjdE1hdGNoUmVzb2x2ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFNlYXJjaEluZm8ubWF0Y2hDb3VudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYW55IGV4aXN0aW5nIGhpZ2hsaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJIaWdobGlnaHQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xlYXJDaGlsZEVsZW1lbnRzKGZhbHNlKTtcblxuICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5zZWFyY2hlZFRleHQgPSAnJztcbiAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8ubWF0Y2hDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWN0aXZhdGVzIHRoZSBoaWdobGlnaHQgaWYgaXQgaXMgb24gdGhlIGN1cnJlbnRseSBhY3RpdmUgcm93LCBjb2x1bW4gYW5kIHBhZ2UuXG4gICAgICovXG4gICAgcHVibGljIGFjdGl2YXRlSWZOZWNlc3NhcnkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5oaWdobGlnaHRHcm91cHNNYXAuZ2V0KHRoaXMuZ3JvdXBOYW1lKTtcbiAgICAgICAgY29uc3QgY29sdW1uID0gZ3JvdXAuY29sdW1uSW5kZXggPT09IHVuZGVmaW5lZCA/IGdyb3VwLmNvbHVtbiA6IGdyb3VwLmNvbHVtbkluZGV4O1xuICAgICAgICBjb25zdCByb3cgPSBncm91cC5yb3dJbmRleCA9PT0gdW5kZWZpbmVkID8gZ3JvdXAucm93IDogZ3JvdXAucm93SW5kZXg7XG5cbiAgICAgICAgaWYgKGNvbHVtbiA9PT0gdGhpcy5jb2x1bW4gJiYgcm93ID09PSB0aGlzLnJvdyAmJiBncm91cC5wYWdlID09PSB0aGlzLnBhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGUoZ3JvdXAuaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYSBNdXRhdGlvbk9ic2VydmVyIHRvIHRoZSBwYXJlbnRFbGVtZW50IGFuZCB3YXRjaGVzIGZvciB3aGVuIHRoZSBjb250YWluZXIgZWxlbWVudCBpcyByZW1vdmVkL3JlYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgKiBTaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5IGFzIHVzaW5nIG1hbnkgb2JzZXJ2ZXJzIG1heSBsZWFkIHRvIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBvYnNlcnZlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fb2JzZXJ2ZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKG11dGF0aW9uTGlzdCkgPT4ge1xuICAgICAgICAgICAgICAgIG11dGF0aW9uTGlzdC5mb3JFYWNoKChtdXRhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZWROb2Rlcy5mb3JFYWNoKChuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA9PT0gdGhpcy5fY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm9kZVdhc1JlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJDaGlsZEVsZW1lbnRzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkZWROb2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgIGFkZGVkTm9kZXMuZm9yRWFjaCgobikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT09IHRoaXMucGFyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCAmJiB0aGlzLl9ub2RlV2FzUmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IHRoaXMucGFyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub2RlV2FzUmVtb3ZlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9yY2VFdmFsdWF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodCh0aGlzLl9sYXN0U2VhcmNoSW5mby5zZWFyY2hlZFRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmNhc2VTZW5zaXRpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvcmNlRXZhbHVhdGlvbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUlmTmVjZXNzYXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29ic2VydmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLl9vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUodGhpcy5wYXJlbnRFbGVtZW50LCB7Y2hpbGRMaXN0OiB0cnVlfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFjdGl2YXRlKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5kZWFjdGl2YXRlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2RpdiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc3BhbnMgPSB0aGlzLl9kaXYucXVlcnlTZWxlY3RvckFsbCgnc3BhbicpO1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlRWxlbWVudEluZGV4ID0gaW5kZXg7XG5cbiAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPD0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRUb0FjdGl2YXRlID0gc3BhbnNbaW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50VG9BY3RpdmF0ZSwgdGhpcy5fZGVmYXVsdEFjdGl2ZUNzc0NsYXNzKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudFRvQWN0aXZhdGUsIHRoaXMuYWN0aXZlQ3NzQ2xhc3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWFjdGl2YXRlKCkge1xuICAgICAgICBpZiAodGhpcy5fYWN0aXZlRWxlbWVudEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3BhbnMgPSB0aGlzLl9kaXYucXVlcnlTZWxlY3RvckFsbCgnc3BhbicpO1xuXG4gICAgICAgIGlmIChzcGFucy5sZW5ndGggPD0gdGhpcy5fYWN0aXZlRWxlbWVudEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVFbGVtZW50SW5kZXggPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsZW1lbnRUb0RlYWN0aXZhdGUgPSBzcGFuc1t0aGlzLl9hY3RpdmVFbGVtZW50SW5kZXhdO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnRUb0RlYWN0aXZhdGUsIHRoaXMuX2RlZmF1bHRBY3RpdmVDc3NDbGFzcyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWxlbWVudFRvRGVhY3RpdmF0ZSwgdGhpcy5hY3RpdmVDc3NDbGFzcyk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZUVsZW1lbnRJbmRleCA9IC0xO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJDaGlsZEVsZW1lbnRzKG9yaWdpbmFsQ29udGVudEhpZGRlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnaGlkZGVuJywgb3JpZ2luYWxDb250ZW50SGlkZGVuKTtcblxuICAgICAgICBpZiAodGhpcy5fZGl2ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMucGFyZW50RWxlbWVudCwgdGhpcy5fZGl2KTtcblxuICAgICAgICAgICAgdGhpcy5fZGl2ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUVsZW1lbnRJbmRleCA9IC0xO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRIaWdobGlnaHRlZFRleHQoc2VhcmNoVGV4dDogc3RyaW5nLCBjYXNlU2Vuc2l0aXZlOiBib29sZWFuLCBleGFjdE1hdGNoOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kRGl2KCk7XG5cbiAgICAgICAgY29uc3Qgc3RyaW5nVmFsdWUgPSBTdHJpbmcodGhpcy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRTdHJpbmdSZXNvbHZlZCA9ICFjYXNlU2Vuc2l0aXZlID8gc3RyaW5nVmFsdWUudG9Mb3dlckNhc2UoKSA6IHN0cmluZ1ZhbHVlO1xuICAgICAgICBjb25zdCBzZWFyY2hUZXh0UmVzb2x2ZWQgPSAhY2FzZVNlbnNpdGl2ZSA/IHNlYXJjaFRleHQudG9Mb3dlckNhc2UoKSA6IHNlYXJjaFRleHQ7XG5cbiAgICAgICAgbGV0IG1hdGNoQ291bnQgPSAwO1xuXG4gICAgICAgIGlmIChleGFjdE1hdGNoKSB7XG4gICAgICAgICAgICBpZiAoY29udGVudFN0cmluZ1Jlc29sdmVkID09PSBzZWFyY2hUZXh0UmVzb2x2ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRTcGFuKGA8c3BhbiBjbGFzcz1cIiR7dGhpcy5fZGVmYXVsdENzc0NsYXNzfSAke3RoaXMuY3NzQ2xhc3MgPyB0aGlzLmNzc0NsYXNzIDogJyd9XCI+JHtzdHJpbmdWYWx1ZX08L3NwYW4+YCk7XG4gICAgICAgICAgICAgICAgbWF0Y2hDb3VudCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZFRleHQoc3RyaW5nVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZvdW5kSW5kZXggPSBjb250ZW50U3RyaW5nUmVzb2x2ZWQuaW5kZXhPZihzZWFyY2hUZXh0UmVzb2x2ZWQsIDApO1xuICAgICAgICAgICAgbGV0IHByZXZpb3VzTWF0Y2hFbmQgPSAwO1xuXG4gICAgICAgICAgICB3aGlsZSAoZm91bmRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGZvdW5kSW5kZXg7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gZm91bmRJbmRleCArIHNlYXJjaFRleHRSZXNvbHZlZC5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZFRleHQoc3RyaW5nVmFsdWUuc3Vic3RyaW5nKHByZXZpb3VzTWF0Y2hFbmQsIHN0YXJ0KSk7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kU3BhbihgPHNwYW4gY2xhc3M9XCIke3RoaXMuX2RlZmF1bHRDc3NDbGFzc30gJHt0aGlzLmNzc0NsYXNzID8gdGhpcy5jc3NDbGFzcyA6ICcnfVwiPiR7c3RyaW5nVmFsdWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpfTwvc3Bhbj5gKTtcblxuICAgICAgICAgICAgICAgIHByZXZpb3VzTWF0Y2hFbmQgPSBlbmQ7XG4gICAgICAgICAgICAgICAgbWF0Y2hDb3VudCsrO1xuXG4gICAgICAgICAgICAgICAgZm91bmRJbmRleCA9IGNvbnRlbnRTdHJpbmdSZXNvbHZlZC5pbmRleE9mKHNlYXJjaFRleHRSZXNvbHZlZCwgZW5kKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hcHBlbmRUZXh0KHN0cmluZ1ZhbHVlLnN1YnN0cmluZyhwcmV2aW91c01hdGNoRW5kLCBzdHJpbmdWYWx1ZS5sZW5ndGgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXRjaENvdW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwZW5kVGV4dCh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGV4dEVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQodGV4dCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5fZGl2LCB0ZXh0RWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBlbmRTcGFuKG91dGVySFRNTDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHNwYW4gPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLl9kaXYsIHNwYW4pO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHNwYW4sICdvdXRlckhUTUwnLCBvdXRlckhUTUwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwZW5kRGl2KCkge1xuICAgICAgICB0aGlzLl9kaXYgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBpZiAoIHRoaXMuY29udGFpbmVyQ2xhc3MpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fZGl2LCB0aGlzLmNvbnRhaW5lckNsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMucGFyZW50RWxlbWVudCwgdGhpcy5