@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
475 lines • 44.6 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ChangeDetectionStrategy, Component, ElementRef, HostBinding, HostListener, Input, Renderer2, ViewChild } from '@angular/core';
import { IgxListPanState, IListChild, IgxListBaseDirective } from './list.common';
import { HammerGesturesManager } from '../core/touch';
/**
* The Ignite UI List Item component is a container intended for row items in the Ignite UI for Angular List component.
*
* Example:
* ```html
* <igx-list>
* <igx-list-item isHeader="true">Contacts</igx-list-item>
* <igx-list-item *ngFor="let contact of contacts">
* <span class="name">{{ contact.name }}</span>
* <span class="phone">{{ contact.phone }}</span>
* </igx-list-item>
* </igx-list>
* ```
*/
var IgxListItemComponent = /** @class */ (function () {
function IgxListItemComponent(list, elementRef, _renderer) {
this.list = list;
this.elementRef = elementRef;
this._renderer = _renderer;
/**
*@hidden
*/
this._panState = IgxListPanState.NONE;
/**
*@hidden
*/
this.panOffset = 0;
/**
* @hidden
*/
this._index = null;
/**
*@hidden
*/
this.lastPanDir = IgxListPanState.NONE;
/**
* Sets/gets whether the `list item` is hidden.
* By default the `hidden` value is `false`.
* ```html
* <igx-list-item [hidden] = "true">Hidden Item</igx-list-item>
* ```
* ```typescript
* let isHidden = this.listItem.hidden;
* ```
* @memberof IgxListItemComponent
*/
this.hidden = false;
/**
* Gets the `touch-action` style of the `list item`.
* ```typescript
* let touchAction = this.listItem.touchAction;
* ```
*/
this.touchAction = 'pan-y';
}
Object.defineProperty(IgxListItemComponent.prototype, "role", {
/**
* Gets the `role` attribute of the `list item`.
* ```typescript
* let itemRole = this.listItem.role;
* ```
* @memberof IgxListItemComponent
*/
get: function () {
return this.isHeader ? 'separator' : 'listitem';
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxListItemComponent.prototype, "headerStyle", {
/**
* Indicates whether `list item` should have header style.
* ```typescript
* let headerStyle = this.listItem.headerStyle;
* ```
* @memberof IgxListItemComponent
*/
get: function () {
return this.isHeader;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxListItemComponent.prototype, "innerStyle", {
/**
* Applies the inner style of the `list item` if the item is not counted as header.
* ```typescript
* let innerStyle = this.listItem.innerStyle;
* ```
* @memberof IgxListItemComponent
*/
get: function () {
return !this.isHeader;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxListItemComponent.prototype, "display", {
/**
* Returns string value which describes the display mode of the `list item`.
* ```typescript
* let isHidden = this.listItem.display;
* ```
* @memberof IgxListItemComponent
*/
get: function () {
return this.hidden ? 'none' : '';
},
enumerable: true,
configurable: true
});
/**
*@hidden
*/
IgxListItemComponent.prototype.clicked = function (evt) {
this.list.onItemClicked.emit({ item: this, event: evt, direction: this.lastPanDir });
this.lastPanDir = IgxListPanState.NONE;
};
/**
*@hidden
*/
IgxListItemComponent.prototype.panStart = function (ev) {
if (this.isTrue(this.isHeader)) {
return;
}
if (!this.isTrue(this.list.allowLeftPanning) && !this.isTrue(this.list.allowRightPanning)) {
return;
}
};
/**
*@hidden
*/
IgxListItemComponent.prototype.panMove = function (ev) {
if (this.isTrue(this.isHeader)) {
return;
}
if (!this.isTrue(this.list.allowLeftPanning) && !this.isTrue(this.list.allowRightPanning)) {
return;
}
var isPanningToLeft = ev.deltaX < 0;
if (isPanningToLeft && this.isTrue(this.list.allowLeftPanning)) {
this.showLeftPanTemplate();
this.setContentElementLeft(Math.max(this.maxLeft, ev.deltaX));
}
else if (!isPanningToLeft && this.isTrue(this.list.allowRightPanning)) {
this.showRightPanTemplate();
this.setContentElementLeft(Math.min(this.maxRight, ev.deltaX));
}
};
/**
*@hidden
*/
IgxListItemComponent.prototype.panEnd = function (ev) {
if (this.isTrue(this.isHeader)) {
return;
}
if (!this.isTrue(this.list.allowLeftPanning) && !this.isTrue(this.list.allowRightPanning)) {
return;
}
// the translation offset of the current list item content
var relativeOffset = this.panOffset;
var widthTriggeringGrip = this.width * this.list.panEndTriggeringThreshold;
if (relativeOffset === 0) {
return; // no panning has occured
}
var dir = relativeOffset > 0 ? IgxListPanState.RIGHT : IgxListPanState.LEFT;
this.lastPanDir = dir;
var oldPanState = this._panState;
if (Math.abs(relativeOffset) < widthTriggeringGrip) {
this.setContentElementLeft(0);
this._panState = IgxListPanState.NONE;
this.hideLeftAndRightPanTemplates();
return;
}
var args = { item: this, direction: dir, keepItem: false };
if (dir === IgxListPanState.LEFT) {
this.list.onLeftPan.emit(args);
}
else {
this.list.onRightPan.emit(args);
}
if (args.keepItem === true) {
this.setContentElementLeft(0);
this._panState = IgxListPanState.NONE;
}
else {
if (dir === IgxListPanState.LEFT) {
this.setContentElementLeft(this.maxLeft);
this._panState = IgxListPanState.LEFT;
}
else {
this.setContentElementLeft(this.maxRight);
this._panState = IgxListPanState.RIGHT;
}
}
if (oldPanState !== this._panState) {
var args2 = { oldState: oldPanState, newState: this._panState, item: this };
this.list.onPanStateChange.emit(args2);
}
this.hideLeftAndRightPanTemplates();
};
/**
*@hidden
*/
IgxListItemComponent.prototype.showLeftPanTemplate = function () {
this.setLeftAndRightTemplatesVisibility('visible', 'hidden');
};
/**
*@hidden
*/
IgxListItemComponent.prototype.showRightPanTemplate = function () {
this.setLeftAndRightTemplatesVisibility('hidden', 'visible');
};
/**
*@hidden
*/
IgxListItemComponent.prototype.hideLeftAndRightPanTemplates = function () {
var _this = this;
setTimeout(function () {
_this.setLeftAndRightTemplatesVisibility('hidden', 'hidden');
}, 500);
};
/**
*@hidden
*/
IgxListItemComponent.prototype.setLeftAndRightTemplatesVisibility = function (leftVisibility, rightVisibility) {
if (this.leftPanningTemplateElement && this.leftPanningTemplateElement.nativeElement) {
this.leftPanningTemplateElement.nativeElement.style.visibility = leftVisibility;
}
if (this.rightPanningTemplateElement && this.rightPanningTemplateElement.nativeElement) {
this.rightPanningTemplateElement.nativeElement.style.visibility = rightVisibility;
}
};
Object.defineProperty(IgxListItemComponent.prototype, "panState", {
/**
* Gets the `panState` of a `list item`.
* ```typescript
* let itemPanState = this.listItem.panState;
* ```
* @memberof IgxListItemComponent
*/
get: function () {
return this._panState;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxListItemComponent.prototype, "index", {
/**
* Gets the `index` of a `list item`.
* ```typescript
* let itemIndex = this.listItem.index;
* ```
* @memberof IgxListItemComponent
*/
get: function () {
return this._index !== null ? this._index : this.list.children.toArray().indexOf(this);
},
/**
* Sets the `index` of the `list item`.
* ```typescript
* this.listItem.index = index;
* ```
* @memberof IgxListItemComponent
*/
set: function (value) {
this._index = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxListItemComponent.prototype, "element", {
/**
* Returns an element reference to the list item.
* ```typescript
* let listItemElement = this.listItem.element.
* ```
* @memberof IgxListItemComponent
*/
get: function () {
return this.elementRef.nativeElement;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxListItemComponent.prototype, "contentElement", {
/**
* Returns a reference container which contains the list item's content.
* ```typescript
* let listItemContainer = this.listItem.contentElement.
* ```
* @memberof IgxListItemComponent
*/
get: function () {
var candidates = this.element.getElementsByClassName('igx-list__item-content');
return (candidates && candidates.length > 0) ? candidates[0] : null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxListItemComponent.prototype, "context", {
/**
* Returns the `context` object which represents the `template context` binding into the `list item container`
* by providing the `$implicit` declaration which is the `IgxListItemComponent` itself.
* ```typescript
* let listItemComponent = this.listItem.context;
* ```
*/
get: function () {
return {
$implicit: this
};
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxListItemComponent.prototype, "width", {
/**
* Gets the width of a `list item`.
* ```typescript
* let itemWidth = this.listItem.width;
* ```
* @memberof IgxListItemComponent
*/
get: function () {
if (this.element) {
return this.element.offsetWidth;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxListItemComponent.prototype, "maxLeft", {
/**
* Gets the maximum left position of the `list item`.
* ```typescript
* let maxLeft = this.listItem.maxLeft;
* ```
* @memberof IgxListItemComponent
*/
get: function () {
return -this.width;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxListItemComponent.prototype, "maxRight", {
/**
* Gets the maximum right position of the `list item`.
* ```typescript
* let maxRight = this.listItem.maxRight;
* ```
* @memberof IgxListItemComponent
*/
get: function () {
return this.width;
},
enumerable: true,
configurable: true
});
/**
*@hidden
*/
IgxListItemComponent.prototype.setContentElementLeft = function (value) {
this.panOffset = value;
this.contentElement.style.transform = 'translateX(' + value + 'px)';
};
/**
*@hidden
*/
IgxListItemComponent.prototype.isTrue = function (value) {
if (typeof (value) === 'boolean') {
return value;
}
else {
return value === 'true';
}
};
IgxListItemComponent.ctorParameters = function () { return [
{ type: IgxListBaseDirective },
{ type: ElementRef },
{ type: Renderer2 }
]; };
__decorate([
ViewChild('leftPanningTmpl'),
__metadata("design:type", Object)
], IgxListItemComponent.prototype, "leftPanningTemplateElement", void 0);
__decorate([
ViewChild('rightPanningTmpl'),
__metadata("design:type", Object)
], IgxListItemComponent.prototype, "rightPanningTemplateElement", void 0);
__decorate([
Input(),
__metadata("design:type", Boolean)
], IgxListItemComponent.prototype, "isHeader", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxListItemComponent.prototype, "hidden", void 0);
__decorate([
HostBinding('attr.role'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxListItemComponent.prototype, "role", null);
__decorate([
HostBinding('attr.aria-label'),
__metadata("design:type", String)
], IgxListItemComponent.prototype, "ariaLabel", void 0);
__decorate([
HostBinding('style.touch-action'),
__metadata("design:type", Object)
], IgxListItemComponent.prototype, "touchAction", void 0);
__decorate([
HostBinding('class.igx-list__header'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxListItemComponent.prototype, "headerStyle", null);
__decorate([
HostBinding('class.igx-list__item-base'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxListItemComponent.prototype, "innerStyle", null);
__decorate([
HostBinding('style.display'),
__metadata("design:type", String),
__metadata("design:paramtypes", [])
], IgxListItemComponent.prototype, "display", null);
__decorate([
HostListener('click', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxListItemComponent.prototype, "clicked", null);
__decorate([
HostListener('panstart', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxListItemComponent.prototype, "panStart", null);
__decorate([
HostListener('panmove', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxListItemComponent.prototype, "panMove", null);
__decorate([
HostListener('panend', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxListItemComponent.prototype, "panEnd", null);
__decorate([
Input(),
__metadata("design:type", Number),
__metadata("design:paramtypes", [Number])
], IgxListItemComponent.prototype, "index", null);
IgxListItemComponent = __decorate([
Component({
providers: [HammerGesturesManager],
selector: 'igx-list-item',
template: " \n<div *ngIf=\"!isHeader && list.listItemLeftPanningTemplate != null\" #leftPanningTmpl class=\"igx-list__item-right\"\n [style.width.px]=\"this.element.offsetWidth\" [style.height.px]=\"this.element.offsetHeight\">\n <ng-container *ngTemplateOutlet=\"list.listItemLeftPanningTemplate.template; context: context\">\n </ng-container>\n</div>\n\n<div *ngIf=\"!isHeader && list.listItemRightPanningTemplate != null\" #rightPanningTmpl class=\"igx-list__item-left\"\n [style.width.px]=\"this.element.offsetWidth\" [style.height.px]=\"this.element.offsetHeight\">\n <ng-container *ngTemplateOutlet=\"list.listItemRightPanningTemplate.template; context: context\">\n </ng-container>\n</div>\n\n<ng-template #itemsContent>\n <ng-content></ng-content>\n</ng-template>\n\n<ng-template #itemThumbnails>\n <div class=\"igx-list__item-thumbnail\">\n <ng-content select=\"[igxListThumbnail], igx-list__item-thumbnail, igx-avatar\"></ng-content>\n </div>\n</ng-template>\n\n<ng-template #itemLines>\n <div class=\"igx-list__item-lines\">\n <ng-content select=\"[igxListLine], .igx-list__item-lines, [igxListLineTitle], [igxListLineSubTitle], .igx-list__item-line-title, .igx-list__item-line-subtitle\"></ng-content>\n </div>\n</ng-template>\n\n<ng-template #itemActions>\n <div class=\"igx-list__item-actions\">\n <ng-content select=\"[igxListAction], .igx-list__item-actions\"></ng-content>\n </div>\n</ng-template>\n\n \n<ng-container *ngIf=\"isHeader\">\n <ng-container *ngTemplateOutlet=\"itemsContent\"></ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"!isHeader\">\n <div class=\"igx-list__item-content\">\n <ng-container *ngTemplateOutlet=\"itemThumbnails\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemLines\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemActions\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemsContent\"></ng-container>\n </div>\n</ng-container>\n",
changeDetection: ChangeDetectionStrategy.OnPush
}),
__metadata("design:paramtypes", [IgxListBaseDirective,
ElementRef,
Renderer2])
], IgxListItemComponent);
return IgxListItemComponent;
}());
export { IgxListItemComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvbGlzdC9saXN0LWl0ZW0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0gsZUFBZSxFQUNmLFVBQVUsRUFDVixvQkFBb0IsRUFDdkIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXREOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFPSDtJQXdDSSw4QkFDVyxJQUEwQixFQUN6QixVQUFzQixFQUN0QixTQUFvQjtRQUZyQixTQUFJLEdBQUosSUFBSSxDQUFzQjtRQUN6QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUF6Q2hDOztXQUVHO1FBQ0ssY0FBUyxHQUFvQixlQUFlLENBQUMsSUFBSSxDQUFDO1FBRTFEOztXQUVHO1FBQ0ssY0FBUyxHQUFHLENBQUMsQ0FBQztRQUV0Qjs7V0FFRztRQUNLLFdBQU0sR0FBVyxJQUFJLENBQUM7UUFFOUI7O1dBRUc7UUFDSyxlQUFVLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQztRQXVDMUM7Ozs7Ozs7Ozs7V0FVRztRQUVJLFdBQU0sR0FBRyxLQUFLLENBQUM7UUEyQnRCOzs7OztXQUtHO1FBRUksZ0JBQVcsR0FBRyxPQUFPLENBQUM7SUE3RDdCLENBQUM7SUFxQ0Qsc0JBQVcsc0NBQUk7UUFSZjs7Ozs7O1dBTUc7YUFFSDtZQUNJLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7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SUFBRCwyQkFBQztDQUFBLEFBblpELElBbVpDO1NBblpZLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgICBJZ3hMaXN0UGFuU3RhdGUsXG4gICAgSUxpc3RDaGlsZCxcbiAgICBJZ3hMaXN0QmFzZURpcmVjdGl2ZVxufSBmcm9tICcuL2xpc3QuY29tbW9uJztcblxuaW1wb3J0IHsgSGFtbWVyR2VzdHVyZXNNYW5hZ2VyIH0gZnJvbSAnLi4vY29yZS90b3VjaCc7XG5cbi8qKlxuICogVGhlIElnbml0ZSBVSSBMaXN0IEl0ZW0gY29tcG9uZW50IGlzIGEgY29udGFpbmVyIGludGVuZGVkIGZvciByb3cgaXRlbXMgaW4gdGhlIElnbml0ZSBVSSBmb3IgQW5ndWxhciBMaXN0IGNvbXBvbmVudC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgaHRtbFxuICogPGlneC1saXN0PlxuICogICA8aWd4LWxpc3QtaXRlbSBpc0hlYWRlcj1cInRydWVcIj5Db250YWN0czwvaWd4LWxpc3QtaXRlbT5cbiAqICAgPGlneC1saXN0LWl0ZW0gKm5nRm9yPVwibGV0IGNvbnRhY3Qgb2YgY29udGFjdHNcIj5cbiAqICAgICA8c3BhbiBjbGFzcz1cIm5hbWVcIj57eyBjb250YWN0Lm5hbWUgfX08L3NwYW4+XG4gKiAgICAgPHNwYW4gY2xhc3M9XCJwaG9uZVwiPnt7IGNvbnRhY3QucGhvbmUgfX08L3NwYW4+XG4gKiAgIDwvaWd4LWxpc3QtaXRlbT5cbiAqIDwvaWd4LWxpc3Q+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgcHJvdmlkZXJzOiBbSGFtbWVyR2VzdHVyZXNNYW5hZ2VyXSxcbiAgICBzZWxlY3RvcjogJ2lneC1saXN0LWl0ZW0nLFxuICAgIHRlbXBsYXRlVXJsOiAnbGlzdC1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBJZ3hMaXN0SXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIElMaXN0Q2hpbGQge1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfcGFuU3RhdGU6IElneExpc3RQYW5TdGF0ZSA9IElneExpc3RQYW5TdGF0ZS5OT05FO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYW5PZmZzZXQgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX2luZGV4OiBudW1iZXIgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsYXN0UGFuRGlyID0gSWd4TGlzdFBhblN0YXRlLk5PTkU7XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIHJlZmVyZW5jZSB0byB0aGUgdGVtcGxhdGUncyBiYXNlIGVsZW1lbnQgc2hvd24gd2hlbiBsZWZ0IHBhbm5pbmcgYSBsaXN0IGl0ZW0uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGxlZnRQYW5UbXBsID0gdGhpcy5saXN0SXRlbS5sZWZ0UGFubmluZ1RlbXBsYXRlRWxlbWVudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdsZWZ0UGFubmluZ1RtcGwnKVxuICAgIHB1YmxpYyBsZWZ0UGFubmluZ1RlbXBsYXRlRWxlbWVudDtcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIHRoZSB0ZW1wbGF0ZSdzIGJhc2UgZWxlbWVudCBzaG93biB3aGVuIHJpZ2h0IHBhbm5pbmcgYSBsaXN0IGl0ZW0uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHJpZ2h0UGFuVG1wbCA9IHRoaXMubGlzdEl0ZW0ucmlnaHRQYW5uaW5nVGVtcGxhdGVFbGVtZW50O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3JpZ2h0UGFubmluZ1RtcGwnKVxuICAgIHB1YmxpYyByaWdodFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGxpc3Q6IElneExpc3RCYXNlRGlyZWN0aXZlLFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgYGxpc3QgaXRlbWAgaXMgYSBoZWFkZXIuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdC1pdGVtIFtpc0hlYWRlcl0gPSBcInRydWVcIj5IZWFkZXI8L2lneC1saXN0LWl0ZW0+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0hlYWRlciA9ICB0aGlzLmxpc3RJdGVtLmlzSGVhZGVyO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGlzSGVhZGVyOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGBsaXN0IGl0ZW1gIGlzIGhpZGRlbi5cbiAgICAgKiBCeSBkZWZhdWx0IHRoZSBgaGlkZGVuYCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWxpc3QtaXRlbSBbaGlkZGVuXSA9IFwidHJ1ZVwiPkhpZGRlbiBJdGVtPC9pZ3gtbGlzdC1pdGVtPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNIaWRkZW4gPSAgdGhpcy5saXN0SXRlbS5oaWRkZW47XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaGlkZGVuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgcm9sZWAgYXR0cmlidXRlIG9mIHRoZSBgbGlzdCBpdGVtYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGl0ZW1Sb2xlID0gIHRoaXMubGlzdEl0ZW0ucm9sZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIGdldCByb2xlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0hlYWRlciA/ICdzZXBhcmF0b3InIDogJ2xpc3RpdGVtJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGBhcmlhLWxhYmVsYCBhdHRyaWJ1dGUgb2YgdGhlIGBsaXN0IGl0ZW1gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmxpc3RJdGVtLmFyaWFMYWJlbCA9IFwiSXRlbTFcIjtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGl0ZW1BcmlhTGFiZWwgPSB0aGlzLmxpc3RJdGVtLmFyaWFMYWJlbDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sYWJlbCcpXG4gICAgcHVibGljIGFyaWFMYWJlbDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHRvdWNoLWFjdGlvbmAgc3R5bGUgb2YgdGhlIGBsaXN0IGl0ZW1gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdG91Y2hBY3Rpb24gPSB0aGlzLmxpc3RJdGVtLnRvdWNoQWN0aW9uO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUudG91Y2gtYWN0aW9uJylcbiAgICBwdWJsaWMgdG91Y2hBY3Rpb24gPSAncGFuLXknO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYGxpc3QgaXRlbWAgc2hvdWxkIGhhdmUgaGVhZGVyIHN0eWxlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaGVhZGVyU3R5bGUgPSAgdGhpcy5saXN0SXRlbS5oZWFkZXJTdHlsZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1saXN0X19oZWFkZXInKVxuICAgIGdldCBoZWFkZXJTdHlsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNIZWFkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgaW5uZXIgc3R5bGUgb2YgdGhlIGBsaXN0IGl0ZW1gIGlmIHRoZSBpdGVtIGlzIG5vdCBjb3VudGVkIGFzIGhlYWRlci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlubmVyU3R5bGUgPSAgdGhpcy5saXN0SXRlbS5pbm5lclN0eWxlO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWxpc3RfX2l0ZW0tYmFzZScpXG4gICAgZ2V0IGlubmVyU3R5bGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0hlYWRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHN0cmluZyB2YWx1ZSB3aGljaCBkZXNjcmliZXMgdGhlIGRpc3BsYXkgbW9kZSBvZiB0aGUgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0hpZGRlbiA9IHRoaXMubGlzdEl0ZW0uZGlzcGxheTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKVxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmhpZGRlbiA/ICdub25lJyA6ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBjbGlja2VkKGV2dCkge1xuICAgICAgICB0aGlzLmxpc3Qub25JdGVtQ2xpY2tlZC5lbWl0KHsgaXRlbTogdGhpcywgZXZlbnQ6IGV2dCwgZGlyZWN0aW9uOiB0aGlzLmxhc3RQYW5EaXIgfSk7XG4gICAgICAgIHRoaXMubGFzdFBhbkRpciA9IElneExpc3RQYW5TdGF0ZS5OT05FO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3BhbnN0YXJ0JywgWyckZXZlbnQnXSlcbiAgICBwYW5TdGFydChldikge1xuICAgICAgICBpZiAodGhpcy5pc1RydWUodGhpcy5pc0hlYWRlcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNUcnVlKHRoaXMubGlzdC5hbGxvd0xlZnRQYW5uaW5nKSAmJiAhdGhpcy5pc1RydWUodGhpcy5saXN0LmFsbG93UmlnaHRQYW5uaW5nKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigncGFubW92ZScsIFsnJGV2ZW50J10pXG4gICAgcGFuTW92ZShldikge1xuICAgICAgICBpZiAodGhpcy5pc1RydWUodGhpcy5pc0hlYWRlcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNUcnVlKHRoaXMubGlzdC5hbGxvd0xlZnRQYW5uaW5nKSAmJiAhdGhpcy5pc1RydWUodGhpcy5saXN0LmFsbG93UmlnaHRQYW5uaW5nKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzUGFubmluZ1RvTGVmdCA9IGV2LmRlbHRhWCA8IDA7XG4gICAgICAgIGlmIChpc1Bhbm5pbmdUb0xlZnQgJiYgdGhpcy5pc1RydWUodGhpcy5saXN0LmFsbG93TGVmdFBhbm5pbmcpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dMZWZ0UGFuVGVtcGxhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29udGVudEVsZW1lbnRMZWZ0KE1hdGgubWF4KHRoaXMubWF4TGVmdCwgZXYuZGVsdGFYKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzUGFubmluZ1RvTGVmdCAmJiB0aGlzLmlzVHJ1ZSh0aGlzLmxpc3QuYWxsb3dSaWdodFBhbm5pbmcpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dSaWdodFBhblRlbXBsYXRlKCk7XG4gICAgICAgICAgICB0aGlzLnNldENvbnRlbnRFbGVtZW50TGVmdChNYXRoLm1pbih0aGlzLm1heFJpZ2h0LCBldi5kZWx0YVgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3BhbmVuZCcsIFsnJGV2ZW50J10pXG4gICAgcGFuRW5kKGV2KSB7XG4gICAgICAgIGlmICh0aGlzLmlzVHJ1ZSh0aGlzLmlzSGVhZGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5pc1RydWUodGhpcy5saXN0LmFsbG93TGVmdFBhbm5pbmcpICYmICF0aGlzLmlzVHJ1ZSh0aGlzLmxpc3QuYWxsb3dSaWdodFBhbm5pbmcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgdHJhbnNsYXRpb24gb2Zmc2V0IG9mIHRoZSBjdXJyZW50IGxpc3QgaXRlbSBjb250ZW50XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlT2Zmc2V0ID0gdGhpcy5wYW5PZmZzZXQ7XG4gICAgICAgIGNvbnN0IHdpZHRoVHJpZ2dlcmluZ0dyaXAgPSB0aGlzLndpZHRoICogdGhpcy5saXN0LnBhbkVuZFRyaWdnZXJpbmdUaHJlc2hvbGQ7XG5cbiAgICAgICAgaWYgKHJlbGF0aXZlT2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIG5vIHBhbm5pbmcgaGFzIG9jY3VyZWRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpciA9IHJlbGF0aXZlT2Zmc2V0ID4gMCA/IElneExpc3RQYW5TdGF0ZS5SSUdIVCA6IElneExpc3RQYW5TdGF0ZS5MRUZUO1xuICAgICAgICB0aGlzLmxhc3RQYW5EaXIgPSBkaXI7XG5cbiAgICAgICAgY29uc3Qgb2xkUGFuU3RhdGUgPSB0aGlzLl9wYW5TdGF0ZTtcbiAgICAgICAgaWYgKE1hdGguYWJzKHJlbGF0aXZlT2Zmc2V0KSA8IHdpZHRoVHJpZ2dlcmluZ0dyaXApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29udGVudEVsZW1lbnRMZWZ0KDApO1xuICAgICAgICAgICAgdGhpcy5fcGFuU3RhdGUgPSBJZ3hMaXN0UGFuU3RhdGUuTk9ORTtcbiAgICAgICAgICAgIHRoaXMuaGlkZUxlZnRBbmRSaWdodFBhblRlbXBsYXRlcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJncyA9IHsgaXRlbTogdGhpcywgZGlyZWN0aW9uOiBkaXIsIGtlZXBJdGVtOiBmYWxzZX07XG5cbiAgICAgICAgaWYgKGRpciA9PT0gSWd4TGlzdFBhblN0YXRlLkxFRlQpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdC5vbkxlZnRQYW4uZW1pdChhcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGlzdC5vblJpZ2h0UGFuLmVtaXQoYXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJncy5rZWVwSXRlbSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRDb250ZW50RWxlbWVudExlZnQoMCk7XG4gICAgICAgICAgICB0aGlzLl9wYW5TdGF0ZSA9IElneExpc3RQYW5TdGF0ZS5OT05FO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRpciA9PT0gSWd4TGlzdFBhblN0YXRlLkxFRlQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvbnRlbnRFbGVtZW50TGVmdCh0aGlzLm1heExlZnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhblN0YXRlID0gSWd4TGlzdFBhblN0YXRlLkxFRlQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q29udGVudEVsZW1lbnRMZWZ0KHRoaXMubWF4UmlnaHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhblN0YXRlID0gSWd4TGlzdFBhblN0YXRlLlJJR0hUO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9sZFBhblN0YXRlICE9PSB0aGlzLl9wYW5TdGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgYXJnczIgPSB7IG9sZFN0YXRlOiBvbGRQYW5TdGF0ZSwgbmV3U3RhdGU6IHRoaXMuX3BhblN0YXRlLCBpdGVtOiB0aGlzIH07XG4gICAgICAgICAgICB0aGlzLmxpc3Qub25QYW5TdGF0ZUNoYW5nZS5lbWl0KGFyZ3MyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhpZGVMZWZ0QW5kUmlnaHRQYW5UZW1wbGF0ZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNob3dMZWZ0UGFuVGVtcGxhdGUoKSB7XG4gICAgICAgIHRoaXMuc2V0TGVmdEFuZFJpZ2h0VGVtcGxhdGVzVmlzaWJpbGl0eSgndmlzaWJsZScsICdoaWRkZW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNob3dSaWdodFBhblRlbXBsYXRlKCkge1xuICAgICAgICB0aGlzLnNldExlZnRBbmRSaWdodFRlbXBsYXRlc1Zpc2liaWxpdHkoJ2hpZGRlbicsICd2aXNpYmxlJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBoaWRlTGVmdEFuZFJpZ2h0UGFuVGVtcGxhdGVzKCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0TGVmdEFuZFJpZ2h0VGVtcGxhdGVzVmlzaWJpbGl0eSgnaGlkZGVuJywgJ2hpZGRlbicpO1xuICAgICAgICB9LCA1MDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0TGVmdEFuZFJpZ2h0VGVtcGxhdGVzVmlzaWJpbGl0eShsZWZ0VmlzaWJpbGl0eSwgcmlnaHRWaXNpYmlsaXR5KSB7XG4gICAgICAgIGlmICh0aGlzLmxlZnRQYW5uaW5nVGVtcGxhdGVFbGVtZW50ICYmIHRoaXMubGVmdFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5sZWZ0UGFubmluZ1RlbXBsYXRlRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBsZWZ0VmlzaWJpbGl0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yaWdodFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQgJiYgdGhpcy5yaWdodFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5yaWdodFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gcmlnaHRWaXNpYmlsaXR5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHBhblN0YXRlYCBvZiBhIGBsaXN0IGl0ZW1gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXRlbVBhblN0YXRlID0gIHRoaXMubGlzdEl0ZW0ucGFuU3RhdGU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBwYW5TdGF0ZSgpOiBJZ3hMaXN0UGFuU3RhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFuU3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYGluZGV4YCBvZiBhIGBsaXN0IGl0ZW1gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXRlbUluZGV4ID0gIHRoaXMubGlzdEl0ZW0uaW5kZXg7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbmRleCAhPT0gbnVsbCA/IHRoaXMuX2luZGV4IDogdGhpcy5saXN0LmNoaWxkcmVuLnRvQXJyYXkoKS5pbmRleE9mKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBpbmRleGAgb2YgdGhlIGBsaXN0IGl0ZW1gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmxpc3RJdGVtLmluZGV4ID0gaW5kZXg7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBpbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2luZGV4ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBlbGVtZW50IHJlZmVyZW5jZSB0byB0aGUgbGlzdCBpdGVtLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGlzdEl0ZW1FbGVtZW50ID0gIHRoaXMubGlzdEl0ZW0uZWxlbWVudC5cbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIGNvbnRhaW5lciB3aGljaCBjb250YWlucyB0aGUgbGlzdCBpdGVtJ3MgY29udGVudC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxpc3RJdGVtQ29udGFpbmVyID0gIHRoaXMubGlzdEl0ZW0uY29udGVudEVsZW1lbnQuXG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBjb250ZW50RWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IHRoaXMuZWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpZ3gtbGlzdF9faXRlbS1jb250ZW50Jyk7XG4gICAgICAgIHJldHVybiAoY2FuZGlkYXRlcyAmJiBjYW5kaWRhdGVzLmxlbmd0aCA+IDApID8gY2FuZGlkYXRlc1swXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYGNvbnRleHRgIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBgdGVtcGxhdGUgY29udGV4dGAgYmluZGluZyBpbnRvIHRoZSBgbGlzdCBpdGVtIGNvbnRhaW5lcmBcbiAgICAgKiBieSBwcm92aWRpbmcgdGhlIGAkaW1wbGljaXRgIGRlY2xhcmF0aW9uIHdoaWNoIGlzIHRoZSBgSWd4TGlzdEl0ZW1Db21wb25lbnRgIGl0c2VsZi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxpc3RJdGVtQ29tcG9uZW50ID0gdGhpcy5saXN0SXRlbS5jb250ZXh0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29udGV4dCgpOiBhbnkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiB0aGlzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgd2lkdGggb2YgYSBgbGlzdCBpdGVtYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGl0ZW1XaWR0aCA9IHRoaXMubGlzdEl0ZW0ud2lkdGg7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCB3aWR0aCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1heGltdW0gbGVmdCBwb3NpdGlvbiBvZiB0aGUgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBtYXhMZWZ0ID0gdGhpcy5saXN0SXRlbS5tYXhMZWZ0O1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4TGVmdCgpIHtcbiAgICAgICAgcmV0dXJuIC10aGlzLndpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1heGltdW0gcmlnaHQgcG9zaXRpb24gb2YgdGhlIGBsaXN0IGl0ZW1gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbWF4UmlnaHQgPSB0aGlzLmxpc3RJdGVtLm1heFJpZ2h0O1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4UmlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0Q29udGVudEVsZW1lbnRMZWZ0KHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5wYW5PZmZzZXQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5jb250ZW50RWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgnICsgdmFsdWUgKyAncHgpJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlzVHJ1ZSh2YWx1ZTogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSAndHJ1ZSc7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=