@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
397 lines • 52.9 kB
JavaScript
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';
var IgxTextHighlightDirective = /** @class */ (function () {
function IgxTextHighlightDirective(element, renderer) {
var _this = this;
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(function (groupName) {
if (_this.groupName === groupName) {
if (_this._activeElementIndex !== -1) {
_this.deactivate();
}
_this.activateIfNecessary();
}
});
}
IgxTextHighlightDirective_1 = IgxTextHighlightDirective;
Object.defineProperty(IgxTextHighlightDirective.prototype, "value", {
/**
* 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: function () {
return this._value;
},
set: function (value) {
if (value === undefined || value === null) {
this._value = '';
}
else {
this._value = value;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTextHighlightDirective.prototype, "lastSearchInfo", {
/**
* @hidden
*/
get: function () {
return this._lastSearchInfo;
},
enumerable: true,
configurable: true
});
/**
* Activates the highlight at a given index.
* (if such index exists)
*/
IgxTextHighlightDirective.setActiveHighlight = function (groupName, highlight) {
IgxTextHighlightDirective_1.highlightGroupsMap.set(groupName, highlight);
IgxTextHighlightDirective_1.onActiveElementChanged.emit(groupName);
};
/**
* Clears any existing highlight.
*/
IgxTextHighlightDirective.clearActiveHighlight = function (groupName) {
IgxTextHighlightDirective_1.highlightGroupsMap.set(groupName, {
index: -1
});
IgxTextHighlightDirective_1.onActiveElementChanged.emit(groupName);
};
/**
* @hidden
*/
IgxTextHighlightDirective.prototype.ngOnDestroy = function () {
this.clearHighlight();
if (this._observer !== null) {
this._observer.disconnect();
}
this.destroy$.next(true);
this.destroy$.complete();
};
/**
* @hidden
*/
IgxTextHighlightDirective.prototype.ngOnChanges = function (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
*/
IgxTextHighlightDirective.prototype.ngAfterViewInit = function () {
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
*/
IgxTextHighlightDirective.prototype.ngAfterViewChecked = function () {
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.
*/
IgxTextHighlightDirective.prototype.highlight = function (text, caseSensitive, exactMatch) {
var caseSensitiveResolved = caseSensitive ? true : false;
var 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.
*/
IgxTextHighlightDirective.prototype.clearHighlight = function () {
this.clearChildElements(false);
this._lastSearchInfo.searchedText = '';
this._lastSearchInfo.matchCount = 0;
};
/**
* Activates the highlight if it is on the currently active row, column and page.
*/
IgxTextHighlightDirective.prototype.activateIfNecessary = function () {
var group = IgxTextHighlightDirective_1.highlightGroupsMap.get(this.groupName);
var column = group.columnIndex === undefined ? group.column : group.columnIndex;
var 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.
*/
IgxTextHighlightDirective.prototype.observe = function () {
var _this = this;
if (this._observer === null) {
var callback = function (mutationList) {
mutationList.forEach(function (mutation) {
var removedNodes = Array.from(mutation.removedNodes);
removedNodes.forEach(function (n) {
if (n === _this._container) {
_this._nodeWasRemoved = true;
_this.clearChildElements(false);
}
});
var addedNodes = Array.from(mutation.addedNodes);
addedNodes.forEach(function (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 });
}
};
IgxTextHighlightDirective.prototype.activate = function (index) {
this.deactivate();
if (this._div !== null) {
var spans = this._div.querySelectorAll('span');
this._activeElementIndex = index;
if (spans.length <= index) {
return;
}
var elementToActivate = spans[index];
this.renderer.addClass(elementToActivate, this._defaultActiveCssClass);
this.renderer.addClass(elementToActivate, this.activeCssClass);
}
};
IgxTextHighlightDirective.prototype.deactivate = function () {
if (this._activeElementIndex === -1) {
return;
}
var spans = this._div.querySelectorAll('span');
if (spans.length <= this._activeElementIndex) {
this._activeElementIndex = -1;
return;
}
var elementToDeactivate = spans[this._activeElementIndex];
this.renderer.removeClass(elementToDeactivate, this._defaultActiveCssClass);
this.renderer.removeClass(elementToDeactivate, this.activeCssClass);
this._activeElementIndex = -1;
};
IgxTextHighlightDirective.prototype.clearChildElements = function (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;
}
};
IgxTextHighlightDirective.prototype.getHighlightedText = function (searchText, caseSensitive, exactMatch) {
this.appendDiv();
var stringValue = String(this.value);
var contentStringResolved = !caseSensitive ? stringValue.toLowerCase() : stringValue;
var searchTextResolved = !caseSensitive ? searchText.toLowerCase() : searchText;
var 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 {
var foundIndex = contentStringResolved.indexOf(searchTextResolved, 0);
var previousMatchEnd = 0;
while (foundIndex !== -1) {
var start = foundIndex;
var 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;
};
IgxTextHighlightDirective.prototype.appendText = function (text) {
var textElement = this.renderer.createText(text);
this.renderer.appendChild(this._div, textElement);
};
IgxTextHighlightDirective.prototype.appendSpan = function (outerHTML) {
var span = this.renderer.createElement('span');
this.renderer.appendChild(this._div, span);
this.renderer.setProperty(span, 'outerHTML', outerHTML);
};
IgxTextHighlightDirective.prototype.appendDiv = function () {
this._div = this.renderer.createElement('div');
if (this.containerClass) {
this.renderer.addClass(this._div, this.containerClass);
}
this.renderer.appendChild(this.parentElement, this._div);
};
IgxTextHighlightDirective.prototype.searchNeedsEvaluation = function (text, caseSensitive, exactMatch) {
var 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);
};
var IgxTextHighlightDirective_1;
IgxTextHighlightDirective.onActiveElementChanged = new EventEmitter();
IgxTextHighlightDirective.highlightGroupsMap = new Map();
IgxTextHighlightDirective.ctorParameters = function () { return [
{ 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);
return IgxTextHighlightDirective;
}());
export { IgxTextHighlightDirective };
/**
* @hidden
*/
var IgxTextHighlightModule = /** @class */ (function () {
function IgxTextHighlightModule() {
}
IgxTextHighlightModule = __decorate([
NgModule({
declarations: [IgxTextHighlightDirective],
exports: [IgxTextHighlightDirective]
})
], IgxTextHighlightModule);
return IgxTextHighlightModule;
}());
export { IgxTextHighlightModule };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1oaWdobGlnaHQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL3RleHQtaGlnaGxpZ2h0L3RleHQtaGlnaGxpZ2h0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILGFBQWEsRUFDYixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBQ0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULGFBQWEsRUFDYixnQkFBZ0IsR0FDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUEyQ25FO0lBOEpJLG1DQUFvQixPQUFtQixFQUFTLFFBQW1CO1FBQW5FLGlCQVNDO1FBVG1CLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFBUyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBekozRCxTQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ1osY0FBUyxHQUFxQixJQUFJLENBQUM7UUFDbkMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLHdCQUFtQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXpCLHFCQUFnQixHQUFHLGVBQWUsQ0FBQztRQUNuQywyQkFBc0IsR0FBRyx1QkFBdUIsQ0FBQztRQW9DekQ7Ozs7Ozs7Ozs7O1dBV0c7UUFFSSxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBRWQsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQTBFWixhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQXNCdEMsMkJBQXlCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxD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QVEsQ0FBQztZQUNOLFlBQVksRUFBRSxDQUFDLHlCQUF5QixDQUFDO1lBQ3pDLE9BQU8sRUFBRSxDQUFDLHlCQUF5QixDQUFDO1NBQ3ZDLENBQUM7T0FDVyxzQkFBc0IsQ0FBSTtJQUFELDZCQUFDO0NBQUEsQUFBdkMsSUFBdUM7U0FBMUIsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIFJlbmRlcmVyMixcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIEFmdGVyVmlld0NoZWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGVwcmVjYXRlUHJvcGVydHkgfSBmcm9tICcuLi8uLi9jb3JlL2RlcHJlY2F0ZURlY29yYXRvcnMnO1xuXG5pbnRlcmZhY2UgSVNlYXJjaEluZm8ge1xuICAgIHNlYXJjaGVkVGV4dDogc3RyaW5nO1xuICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICBtYXRjaENvdW50OiBudW1iZXI7XG4gICAgY2FzZVNlbnNpdGl2ZTogYm9vbGVhbjtcbiAgICBleGFjdE1hdGNoOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBkZXNjcmliaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgYWN0aXZlIGhpZ2hsaWdodC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQWN0aXZlSGlnaGxpZ2h0SW5mbyB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdyBpbmRleCBvZiB0aGUgaGlnaGxpZ2h0LiBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQsIHVzZSBgcm93YCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIHJvd0luZGV4PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb2x1bW4gaW5kZXggb2YgdGhlIGhpZ2hsaWdodC4gVGhpcyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLCB1c2UgYGNvbHVtbmAgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBjb2x1bW5JbmRleD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFnZSBpbmRleCBvZiB0aGUgaGlnaGxpZ2h0LiBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuXG4gICAgICovXG4gICAgcGFnZT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcm93IG9mIHRoZSBoaWdobGlnaHQuXG4gICAgICovXG4gICAgcm93PzogYW55O1xuICAgIC8qKlxuICAgICAqIFRoZSBjb2x1bW4gb2YgdGhlIGhpZ2hsaWdodC5cbiAgICAgKi9cbiAgICBjb2x1bW4/OiBhbnk7XG4gICAgLyoqXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBoaWdobGlnaHQuXG4gICAgICovXG4gICAgaW5kZXg6IG51bWJlcjtcbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4VGV4dEhpZ2hsaWdodF0nXG59KVxuZXhwb3J0IGNsYXNzIElneFRleHRIaWdobGlnaHREaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkLCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgb25BY3RpdmVFbGVtZW50Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAgIHB1YmxpYyBzdGF0aWMgaGlnaGxpZ2h0R3JvdXBzTWFwID0gbmV3IE1hcDxzdHJpbmcsIElBY3RpdmVIaWdobGlnaHRJbmZvPigpO1xuXG4gICAgcHJpdmF0ZSBfbGFzdFNlYXJjaEluZm86IElTZWFyY2hJbmZvO1xuICAgIHByaXZhdGUgX2RpdiA9IG51bGw7XG4gICAgcHJpdmF0ZSBfb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXIgPSBudWxsO1xuICAgIHByaXZhdGUgX25vZGVXYXNSZW1vdmVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZm9yY2VFdmFsdWF0aW9uID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfYWN0aXZlRWxlbWVudEluZGV4ID0gLTE7XG4gICAgcHJpdmF0ZSBfdmFsdWVDaGFuZ2VkOiBib29sZWFuO1xuICAgIHByaXZhdGUgX2RlZmF1bHRDc3NDbGFzcyA9ICdpZ3gtaGlnaGxpZ2h0JztcbiAgICBwcml2YXRlIF9kZWZhdWx0QWN0aXZlQ3NzQ2xhc3MgPSAnaWd4LWhpZ2hsaWdodC0tYWN0aXZlJztcblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgdGhlIGBDU1NgIGNsYXNzIG9mIHRoZSBoaWdobGlnaHQgZWxlbWVudHMuXG4gICAgICogVGhpcyBhbGxvd3MgdGhlIGRldmVsb3BlciB0byBwcm92aWRlIGN1c3RvbSBgQ1NTYCB0byBjdXN0b21pemUgdGhlIGhpZ2hsaWdodC5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8ZGl2XG4gICAgICogICBpZ3hUZXh0SGlnaGxpZ2h0XG4gICAgICogICBbY3NzQ2xhc3NdPVwibXlDbGFzc1wiPlxuICAgICAqIDwvZGl2PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgnY3NzQ2xhc3MnKVxuICAgIHB1YmxpYyBjc3NDbGFzczogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgYENTU2AgY2xhc3Mgb2YgdGhlIGFjdGl2ZSBoaWdobGlnaHQgZWxlbWVudC5cbiAgICAgKiBUaGlzIGFsbG93cyB0aGUgZGV2ZWxvcGVyIHRvIHByb3ZpZGUgY3VzdG9tIGBDU1NgIHRvIGN1c3RvbWl6ZSB0aGUgaGlnaGxpZ2h0LlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxkaXZcbiAgICAgKiAgIGlneFRleHRIaWdobGlnaHRcbiAgICAgKiAgIFthY3RpdmVDc3NDbGFzc109XCJhY3RpdmVIaWdobGlnaHRDbGFzc1wiPlxuICAgICAqIDwvZGl2PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgnYWN0aXZlQ3NzQ2xhc3MnKVxuICAgIHB1YmxpYyBhY3RpdmVDc3NDbGFzczogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBJbnB1dCgnY29udGFpbmVyQ2xhc3MnKVxuICAgIHB1YmxpYyBjb250YWluZXJDbGFzczogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllcyB0aGUgaGlnaGxpZ2h0IHdpdGhpbiBhIHVuaXF1ZSBncm91cC5cbiAgICAgKiBUaGlzIGFsbG93cyBpdCB0byBoYXZlIHNldmVyYWwgZGlmZmVyZW50IGhpZ2hsaWdodCBncm91cHMsXG4gICAgICogd2l0aCBlYWNoIG9mIHRoZW0gaGF2aW5nIHRoZWlyIG93biBhY3RpdmUgaGlnaGxpZ2h0LlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxkaXZcbiAgICAgKiAgIGlneFRleHRIaWdobGlnaHRcbiAgICAgKiAgIFtncm91cE5hbWVdPVwibXlHcm91cE5hbWVcIj5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ2dyb3VwTmFtZScpXG4gICAgcHVibGljIGdyb3VwTmFtZSA9ICcnO1xuXG4gICAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICAgIC8qKlxuICAgICAqIFRoZSB1bmRlcmx5aW5nIHZhbHVlIG9mIHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBoaWdobGlnaHRlZC5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBjb25zdCBlbGVtZW50VmFsdWUgPSB0aGlzLnRleHRIaWdobGlnaHQudmFsdWU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxkaXZcbiAgICAgKiAgIGlneFRleHRIaWdobGlnaHRcbiAgICAgKiAgIFt2YWx1ZV09XCJuZXdWYWx1ZVwiPlxuICAgICAqIDwvZGl2PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgndmFsdWUnKVxuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHJvdyBvbiB3aGljaCB0aGUgZGlyZWN0aXZlIGlzIGN1cnJlbnRseSBvbi5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8ZGl2XG4gICAgICogICBpZ3hUZXh0SGlnaGxpZ2h0XG4gICAgICogICBbcm93XT1cIjBcIj5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ3JvdycpXG4gICAgcHVibGljIHJvdzogYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbHVtbiBvbiB3aGljaCB0aGUgZGlyZWN0aXZlIGlzIGN1cnJlbnRseSBvbi5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8ZGl2XG4gICAgICogICBpZ3hUZXh0SGlnaGxpZ2h0XG4gICAgICogICBbY29sdW1uXT1cIjBcIj5cbiAgICAgKiA8L2Rpdj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ2NvbHVtbicpXG4gICAgcHVibGljIGNvbHVtbjogYW55O1xuXG4gICAgQElucHV0KCdwYWdlJylcbiAgICBARGVwcmVjYXRlUHJvcGVydHkoYElneFRleHRIaWdobGlnaHREaXJlY3RpdmUgJ3BhZ2UnIGlucHV0IHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuYClcbiAgICBwdWJsaWMgcGFnZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbGFzdFNlYXJjaEluZm8oKTogSVNlYXJjaEluZm8ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFNlYXJjaEluZm87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJlbnRFbGVtZW50OiBhbnk7XG5cbiAgICBwcml2YXRlIF9jb250YWluZXI6IGFueTtcblxuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgLyoqXG4gICAgICogQWN0aXZhdGVzIHRoZSBoaWdobGlnaHQgYXQgYSBnaXZlbiBpbmRleC5cbiAgICAgKiAoaWYgc3VjaCBpbmRleCBleGlzdHMpXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzZXRBY3RpdmVIaWdobGlnaHQoZ3JvdXBOYW1lOiBzdHJpbmcsIGhpZ2hsaWdodDogSUFjdGl2ZUhpZ2hsaWdodEluZm8pIHtcbiAgICAgICAgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5oaWdobGlnaHRHcm91cHNNYXAuc2V0KGdyb3VwTmFtZSwgaGlnaGxpZ2h0KTtcbiAgICAgICAgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5vbkFjdGl2ZUVsZW1lbnRDaGFuZ2VkLmVtaXQoZ3JvdXBOYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYW55IGV4aXN0aW5nIGhpZ2hsaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyQWN0aXZlSGlnaGxpZ2h0KGdyb3VwTmFtZSkge1xuICAgICAgICBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLmhpZ2hsaWdodEdyb3Vwc01hcC5zZXQoZ3JvdXBOYW1lLCB7XG4gICAgICAgICAgICBpbmRleDogLTFcbiAgICAgICAgfSk7XG4gICAgICAgIElneFRleHRIaWdobGlnaHREaXJlY3RpdmUub25BY3RpdmVFbGVtZW50Q2hhbmdlZC5lbWl0KGdyb3VwTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLCBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgICAgICBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLm9uQWN0aXZlRWxlbWVudENoYW5nZWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZ3JvdXBOYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cE5hbWUgPT09IGdyb3VwTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmVFbGVtZW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlSWZOZWNlc3NhcnkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmNsZWFySGlnaGxpZ2h0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX29ic2VydmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXMudmFsdWUgJiYgIWNoYW5nZXMudmFsdWUuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoKGNoYW5nZXMucm93ICE9PSB1bmRlZmluZWQgJiYgIWNoYW5nZXMucm93LmZpcnN0Q2hhbmdlKSB8fFxuICAgICAgICAgICAgKGNoYW5nZXMuY29sdW1uICE9PSB1bmRlZmluZWQgJiYgIWNoYW5nZXMuY29sdW1uLmZpcnN0Q2hhbmdlKSB8fFxuICAgICAgICAgICAgKGNoYW5nZXMucGFnZSAhPT0gdW5kZWZpbmVkICYmICFjaGFuZ2VzLnBhZ2UuZmlyc3RDaGFuZ2UpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlRWxlbWVudEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUlmTmVjZXNzYXJ5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLnBhcmVudE5vZGUodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLmhpZ2hsaWdodEdyb3Vwc01hcC5oYXModGhpcy5ncm91cE5hbWUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5oaWdobGlnaHRHcm91cHNNYXAuc2V0KHRoaXMuZ3JvdXBOYW1lLCB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IC0xXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvID0ge1xuICAgICAgICAgICAgc2VhcmNoZWRUZXh0OiAnJyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudmFsdWUsXG4gICAgICAgICAgICBtYXRjaENvdW50OiAwLFxuICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICBleGFjdE1hdGNoOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IHRoaXMucGFyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgICAgICBpZiAodGhpcy5fdmFsdWVDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodCh0aGlzLl9sYXN0U2VhcmNoSW5mby5zZWFyY2hlZFRleHQsIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmNhc2VTZW5zaXRpdmUsIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2gpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUlmTmVjZXNzYXJ5KCk7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgZXhpc3RpbmcgaGlnaGxpZ2h0IGFuZCBoaWdobGlnaHRzIHRoZSBzZWFyY2hlZCB0ZXh0LlxuICAgICAqIFJldHVybnMgaG93IG1hbnkgdGltZXMgdGhlIGVsZW1lbnQgY29udGFpbnMgdGhlIHNlYXJjaGVkIHRleHQuXG4gICAgICovXG4gICAgcHVibGljIGhpZ2hsaWdodCh0ZXh0OiBzdHJpbmcsIGNhc2VTZW5zaXRpdmU/OiBib29sZWFuLCBleGFjdE1hdGNoPzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGNhc2VTZW5zaXRpdmVSZXNvbHZlZCA9IGNhc2VTZW5zaXRpdmUgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGV4YWN0TWF0Y2hSZXNvbHZlZCA9IGV4YWN0TWF0Y2ggPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoTmVlZHNFdmFsdWF0aW9uKHRleHQsIGNhc2VTZW5zaXRpdmVSZXNvbHZlZCwgZXhhY3RNYXRjaFJlc29sdmVkKSkge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8uc2VhcmNoZWRUZXh0ID0gdGV4dDtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmNhc2VTZW5zaXRpdmUgPSBjYXNlU2Vuc2l0aXZlUmVzb2x2ZWQ7XG4gICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5leGFjdE1hdGNoID0gZXhhY3RNYXRjaFJlc29sdmVkO1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8uY29udGVudCA9IHRoaXMudmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh0ZXh0ID09PSAnJyB8fCB0ZXh0ID09PSB1bmRlZmluZWQgfHwgdGV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJIaWdobGlnaHQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckNoaWxkRWxlbWVudHModHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8ubWF0Y2hDb3VudCA9IHRoaXMuZ2V0SGlnaGxpZ2h0ZWRUZXh0KHRleHQsIGNhc2VTZW5zaXRpdmUsIGV4YWN0TWF0Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX25vZGVXYXNSZW1vdmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5zZWFyY2hlZFRleHQgPSB0ZXh0O1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8uY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmVSZXNvbHZlZDtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2ggPSBleGFjdE1hdGNoUmVzb2x2ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFNlYXJjaEluZm8ubWF0Y2hDb3VudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYW55IGV4aXN0aW5nIGhpZ2hsaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJIaWdobGlnaHQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xlYXJDaGlsZEVsZW1lbnRzKGZhbHNlKTtcblxuICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5zZWFyY2hlZFRleHQgPSAnJztcbiAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8ubWF0Y2hDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWN0aXZhdGVzIHRoZSBoaWdobGlnaHQgaWYgaXQgaXMgb24gdGhlIGN1cnJlbnRseSBhY3RpdmUgcm93LCBjb2x1bW4gYW5kIHBhZ2UuXG4gICAgICovXG4gICAgcHVibGljIGFjdGl2YXRlSWZOZWNlc3NhcnkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5oaWdobGlnaHRHcm91cHNNYXAuZ2V0KHRoaXMuZ3JvdXBOYW1lKTtcbiAgICAgICAgY29uc3QgY29sdW1uID0gZ3JvdXAuY29sdW1uSW5kZXggPT09IHVuZGVmaW5lZCA/IGdyb3VwLmNvbHVtbiA6IGdyb3VwLmNvbHVtbkluZGV4O1xuICAgICAgICBjb25zdCByb3cgPSBncm91cC5yb3dJbmRleCA9PT0gdW5kZWZpbmVkID8gZ3JvdXAucm93IDogZ3JvdXAucm93SW5kZXg7XG5cbiAgICAgICAgaWYgKGNvbHVtbiA9PT0gdGhpcy5jb2x1bW4gJiYgcm93ID09PSB0aGlzLnJvdyAmJiBncm91cC5wYWdlID09PSB0aGlzLnBhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGUoZ3JvdXAuaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYSBNdXRhdGlvbk9ic2VydmVyIHRvIHRoZSBwYXJlbnRFbGVtZW50IGFuZCB3YXRjaGVzIGZvciB3aGVuIHRoZSBjb250YWluZXIgZWxlbWVudCBpcyByZW1vdmVkL3JlYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgKiBTaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5IGFzIHVzaW5nIG1hbnkgb2JzZXJ2ZXJzIG1heSBsZWFkIHRvIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBvYnNlcnZlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fb2JzZXJ2ZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKG11dGF0aW9uTGlzdCkgPT4ge1xuICAgICAgICAgICAgICAgIG11dGF0aW9uTGlzdC5mb3JFYWNoKChtdXRhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZWROb2Rlcy5mb3JFYWNoKChuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA9PT0gdGhpcy5fY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm9kZVdhc1JlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJDaGlsZEVsZW1lbnRzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkZWROb2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgIGFkZGVkTm9kZXMuZm9yRWFjaCgobikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT09IHRoaXMucGFyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCAmJiB0aGlzLl9ub2RlV2FzUmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IHRoaXMucGFyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub2RlV2FzUmVtb3ZlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9yY2VFdmFsdWF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodCh0aGlzLl9sYXN0U2VhcmNoSW5mby5zZWFyY2hlZFRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmNhc2VTZW5zaXRpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvcmNlRXZhbHVhdGlvbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUlmTmVjZXNzYXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29ic2VydmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLl9vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUodGhpcy5wYXJlbnRFbGVtZW50LCB7Y2hpbGRMaXN0OiB0cnVlfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFjdGl2YXRlKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5kZWFjdGl2YXRlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2RpdiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc3BhbnMgPSB0aGlzLl9kaXYucXVlcnlTZWxlY3RvckFsbCgnc3BhbicpO1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlRWxlbWVudEluZGV4ID0gaW5kZXg7XG5cbiAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPD0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRUb0FjdGl2YXRlID0gc3BhbnNbaW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50VG9BY3RpdmF0ZSwgdGhpcy5fZGVmYXVsdEFjdGl2ZUNzc0NsYXNzKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudFRvQWN0aXZhdGUsIHRoaXMuYWN0aXZlQ3NzQ2xhc3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWFjdGl2YXRlKCkge1xuICAgICAgICBpZiAodGhpcy5fYWN0aXZlRWxlbWVudEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3BhbnMgPSB0aGlzLl9kaXYucXVlcnlTZWxlY3RvckFsbCgnc3BhbicpO1xuXG4gICAgICAgIGlmIChzcGFucy5sZW5ndGggPD0gdGhpcy5fYWN0aXZlRWxlbWVudEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVFbGVtZW50SW5kZXggPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsZW1lbnRUb0RlYWN0aXZhdGUgPSBzcGFuc1t0aGlzLl9hY3RpdmVFbGVtZW50SW5kZXhdO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnRUb0RlYWN0aXZhdGUsIHRoaXMuX2RlZmF1bHRBY3RpdmVDc3NDbGFzcyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWxlbWVudFRvRGVhY3RpdmF0ZSwgdGhpcy5hY3RpdmVDc3NDbGFzcyk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZUVsZW1lbnRJbmRleCA9IC0xO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJDaGlsZEVsZW1lbnRzKG9yaWdpbmFsQ29udGVudEhpZGRlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnaGlkZGVuJywgb3JpZ2luYWxDb250ZW50SGlkZGVuKTtcblxuICAgICAgICBpZiAodGhpcy5fZGl2ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMucGFyZW50RWxlbWVudCwgdGhpcy5fZGl2KTtcblxuICAgICAgICAgICAgdGhpcy5fZGl2ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUVsZW1lbnRJbmRleCA9IC0xO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRIaWdobGlnaHRlZFRleHQoc2VhcmNoVGV4dDogc3RyaW5nLCBjYXNlU2Vuc2l0aXZlOiBib29sZWFuLCBleGFjdE1hdGNoOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kRGl2KCk7XG5cbiAgICAgICAgY29uc3Qgc3RyaW5nVmFsdWUgPSBTdHJpbmcodGhpcy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRTdHJpbmdSZXNvbHZlZCA9ICFjYXNlU2Vuc2l0aXZlID8gc3RyaW5nVmFsdWUudG9Mb3dlckNhc2UoKSA6IHN0cmluZ1ZhbHVlO1xuICAgICAgICBjb25zdCBzZWFyY2hUZXh0UmVzb2x2ZWQgPSAhY2FzZVNlbnNpdGl2ZSA/IHNlYXJjaFRleHQudG9Mb3dlckNhc2UoKSA6IHNlYXJjaFRleHQ7XG5cbiAgICAgICAgbGV0IG1hdGNoQ291bnQgPSAwO1xuXG4gICAgICAgIGlmIChleGFjdE1hdGNoKSB7XG4gICAgICAgICAgICBpZiAoY29udGVudFN0cmluZ1Jlc29sdmVkID09PSBzZWFyY2hUZXh0UmVzb2x2ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRTcGFuKGA8c3BhbiBjbGFzcz1cIiR7dGhpcy5fZGVmYXVsdENzc0NsYXNzfSAke3RoaXMuY3NzQ2xhc3MgPyB0aGlzLmNzc0NsYXNzIDogJyd9XCI+JHtzdHJpbmdWYWx1ZX08L3NwYW4+YCk7XG4gICAgICAgICAgICAgICAgbWF0Y2hDb3VudCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZFRleHQoc3RyaW5nVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZvdW5kSW5kZXggPSBjb250ZW50U3RyaW5nUmVzb2x2ZWQuaW5kZXhPZihzZWFyY2hUZXh0UmVzb2x2ZWQsIDApO1xuICAgICAgICAgICAgbGV0IHByZXZpb3VzTWF0Y2hFbmQgPSAwO1xuXG4gICAgICAgICAgICB3aGlsZSAoZm91bmRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGZvdW5kSW5kZXg7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gZm91bmRJbmRleCArIHNlYXJjaFRleHRSZXNvbHZlZC5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZFRleHQoc3RyaW5nVmFsdWUuc3Vic3RyaW5nKHByZXZpb3VzTWF0Y2hFbmQsIHN0YXJ0KSk7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kU3BhbihgPHNwYW4gY2xhc3M9XCIke3RoaXMuX2RlZmF1bHRDc3NDbGFzc30gJHt0aGlzLmNzc0NsYXNzID8gdGhpcy5jc3NDbGFzcyA6ICcnfVwiPiR7c3RyaW5nVmFsdWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpfTwvc3Bhbj5gKTtcblxuICAgICAgICAgICAgICAgIHByZXZpb3VzTWF0Y2hFbmQgPSBlbmQ7XG4gICAgICAgICAgICAgICAgbWF0Y2hDb3VudCsrO1xuXG4gICAgICAgICAgICAgICAgZm91bmRJbmRleCA9IGNvbnRlbnRTdHJpbmdSZXNvbHZlZC5pbmRleE9mKHNlYXJjaFRleHRSZXNvbHZlZCwgZW5kKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hcHBlbmRUZXh0KHN0cmluZ1ZhbHVlLnN1YnN0cmluZyhwcmV2aW91c01hdGNoRW5kLCBzdHJpbmdWYWx1ZS5sZW5ndGgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXRjaENvdW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwZW5kVGV4dCh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGV4dEVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQodGV4dCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5fZGl2LCB0ZXh0RWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBlbmRTcGFuKG91dGVySFRNTDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHNwYW4gPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLl9kaXYsIHNwYW4pO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHNwYW4sICdvdXRlckhUTUwnLCBvdXRlckhUTUwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwZW5kRGl2KCkge1xuICAgICAgICB0aGlzLl9kaXYgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBpZiAoIHRoaXMuY29udGFpbmVyQ2xhc3MpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fZGl2LCB0aGlzLmNvbnRhaW5lckNsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMucGFyZW50RWxlbWVudCwgdGhpcy5fZGl2KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlYXJjaE5lZWRzRXZhbHVhdGlvbih0ZXh0OiBzdHJpbmcsIGNhc2VTZW5zaXRpdmU6IGJvb2xlYW4sIGV4YWN0TWF0Y2g6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoZWRUZXh0ID0gdGhpcy5fbGFzdFNlYXJjaEluZm8uc2VhcmNoZWRUZXh0O1xuXG4gICAgICAgIHJldHVybiAhdGhpcy5fbm9kZVdhc1JlbW92ZWQgJiZcbiAgICAgICAgICAgIChzZWFyY2hlZFRleHQgPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICBzZWFyY2hlZFRleHQgIT09IHRleHQgfHxcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5jb250ZW50ICE9PSB0aGlzLnZhbHVlIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8uY2FzZVNlbnNpdGl2ZSAhPT0gY2FzZVNlbnNpdGl2ZSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2ggIT09IGV4YWN0TWF0Y2ggfHxcbiAgICAgICAgICAgICAgICB0aGlzLl9mb3JjZUV2YWx1YXRpb24pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZV0sXG4gICAgZXhwb3J0czogW0lneFRleHRIaWdobGlnaHREaXJlY3RpdmVdXG59KVxuZXhwb3J0IGNsYXNzIElneFRleHRIaWdobGlnaHRNb2R1bGUgeyB9XG4iXX0=