mdc-autocomplete-list
Version:
MdcAutocomplete in conjunction with MdcAutocompleteList and MdcAutocompleteListItem are a pack of angular components to provide an autocomplete functionality to Angular MDC web.
209 lines (208 loc) • 19.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, ContentChildren, QueryList, Input, Output } from '@angular/core';
import { MdcAutocompleteListItem } from 'mdc-autocomplete-list-item';
import { Subject } from 'rxjs';
// tslint:disable-next-line:component-class-suffix
export class MdcAutocompleteList {
constructor() {
this.itemSelected = new Subject();
this.maxVisibleItems = Number.POSITIVE_INFINITY;
this._visible = false;
this._filter = '';
}
/**
* @return {?}
*/
get visible() {
return this._visible;
}
/**
* @param {?} v
* @return {?}
*/
set visible(v) {
this._visible = v;
if (v) {
this.filterItems();
this.focusFirstItem();
}
else {
this.unfocusAllItems();
}
}
/**
* @return {?}
*/
get filter() {
return this._filter;
}
/**
* @param {?} f
* @return {?}
*/
set filter(f) {
this._filter = f;
this.filterItems();
this.focusFirstItem();
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @return {?}
*/
ngAfterContentChecked() {
this.autocompleteListItems.toArray().forEach((item) => {
if (item.itemClicked.observers.length === 0) {
// Only allow one subscription
item.itemClicked.subscribe((itemValue) => {
this.itemSelected.next(itemValue);
});
}
if (item.itemHovered.observers.length === 0) {
// Only allow one subscription
item.itemHovered.subscribe((itemValue) => {
this.unfocusAllItems();
item.focused = true;
});
}
});
}
/**
* @return {?}
*/
unfocusAllItems() {
this.autocompleteListItems.toArray().forEach((item) => {
item.focused = false;
});
}
/**
* @return {?}
*/
focusNextItem() {
/** @type {?} */
const focusedItems = this.autocompleteListItems.filter((item, index, list) => item.focused);
/** @type {?} */
const focusedItem = focusedItems.length > 0 ? focusedItems[0] : null;
/** @type {?} */
const visibleItems = this.autocompleteListItems.filter((item, index, list) => item.visible);
if (focusedItem) {
/** @type {?} */
const focusedItemIndex = visibleItems.indexOf(focusedItem);
/** @type {?} */
const nextFocusedItem = (visibleItems.length >= focusedItemIndex + 1) ? visibleItems[focusedItemIndex + 1] : null;
if (nextFocusedItem) {
focusedItem.focused = false;
nextFocusedItem.focused = true;
nextFocusedItem.scrollIntoView();
}
}
else {
if (visibleItems.length > 0) {
visibleItems[0].focused = true;
}
}
}
/**
* @return {?}
*/
focusPreviousItem() {
/** @type {?} */
const focusedItems = this.autocompleteListItems.filter((item, index, list) => item.focused);
/** @type {?} */
const focusedItem = focusedItems.length > 0 ? focusedItems[0] : null;
/** @type {?} */
const visibleItems = this.autocompleteListItems.filter((item, index, list) => item.visible);
if (focusedItem) {
/** @type {?} */
const focusedItemIndex = visibleItems.indexOf(focusedItem);
/** @type {?} */
const previousFocusedItem = (focusedItemIndex > 0) ? visibleItems[focusedItemIndex - 1] : null;
if (previousFocusedItem) {
focusedItem.focused = false;
previousFocusedItem.focused = true;
previousFocusedItem.scrollIntoView();
}
}
else {
if (visibleItems.length > 0) {
visibleItems[0].focused = true;
}
}
}
/**
* @return {?}
*/
focusFirstItem() {
this.unfocusAllItems();
/** @type {?} */
const visibleItems = this.autocompleteListItems.filter((item, index, list) => item.visible);
if (visibleItems.length > 0) {
visibleItems[0].focused = true;
}
}
/**
* @return {?}
*/
selectFocusedItem() {
/** @type {?} */
const focusedItems = this.autocompleteListItems.filter((item, index, list) => item.focused);
/** @type {?} */
const focusedItem = focusedItems.length > 0 ? focusedItems[0] : null;
if (focusedItem) {
this.itemSelected.next(focusedItem.value);
}
}
/**
* @return {?}
*/
filterItems() {
/** @type {?} */
let showing = 0;
this.autocompleteListItems.forEach((item, index, list) => {
if (showing < this.maxVisibleItems && item.filterString.toUpperCase().includes(this._filter.toUpperCase())) {
item.visible = true;
showing++;
}
else {
item.visible = false;
item.focused = false;
}
});
}
}
MdcAutocompleteList.decorators = [
{ type: Component, args: [{
selector: 'mdc-autocomplete-list',
template: `<ul *ngIf="visible" class="mdc-elevation--z2">
<ng-content></ng-content>
</ul>
`,
styles: [`ul{position:absolute;min-width:200px;max-height:400px;padding:0;margin:0;background-color:#fff;overflow-y:scroll;list-style:none}`]
},] },
];
/** @nocollapse */
MdcAutocompleteList.ctorParameters = () => [];
MdcAutocompleteList.propDecorators = {
maxVisibleItems: [{ type: Input }],
itemSelected: [{ type: Output }],
autocompleteListItems: [{ type: ContentChildren, args: [MdcAutocompleteListItem,] }]
};
if (false) {
/** @type {?} */
MdcAutocompleteList.prototype.maxVisibleItems;
/** @type {?} */
MdcAutocompleteList.prototype.itemSelected;
/** @type {?} */
MdcAutocompleteList.prototype.autocompleteListItems;
/** @type {?} */
MdcAutocompleteList.prototype._visible;
/** @type {?} */
MdcAutocompleteList.prototype._filter;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbWRjLWF1dG9jb21wbGV0ZS1saXN0LyIsInNvdXJjZXMiOlsibGliL2F1dG9jb21wbGV0ZS1saXN0L2F1dG9jb21wbGV0ZS1saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxlQUFlLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQXVCLE1BQU0sZUFBZSxDQUFDO0FBQ2xILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0I7QUFTQSxNQUFNO0lBaUNKOzRCQTlCOEMsSUFBSSxPQUFPLEVBQUU7UUErQnpELElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDO1FBQ2hELElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0tBQ25COzs7O1FBNUJVLE9BQU87UUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7OztRQUdaLE9BQU8sQ0FBQyxDQUFVO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDTixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZCO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7Ozs7O1FBR1EsTUFBTTtRQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDOzs7Ozs7UUFHWCxNQUFNLENBQUMsQ0FBUztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDOzs7OztJQVN4QixRQUFRO0tBQ1A7Ozs7SUFFRCxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3BELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDOztnQkFDNUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtvQkFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ25DLENBQUMsQ0FBQzthQUNKO1lBRUQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUM1QyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO29CQUN2QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2lCQUNyQixDQUFDLENBQUM7YUFDSjtTQUNGLENBQUMsQ0FBQztLQUNKOzs7O0lBRU0sZUFBZTtRQUNwQixJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDcEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7U0FDdEIsQ0FBQyxDQUFDOzs7OztJQUdFLGFBQWE7O1FBQ2xCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDOztRQUM1RixNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7O1FBQ3JFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTVGLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7O1lBQ2hCLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQzs7WUFDM0QsTUFBTSxlQUFlLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNsSCxFQUFFLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixXQUFXLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDNUIsZUFBZSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQy9CLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUNsQztTQUNGO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2FBQ2hDO1NBQ0Y7Ozs7O0lBR0ksaUJBQWlCOztRQUN0QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzs7UUFDNUYsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOztRQUNyRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU1RixFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDOztZQUNoQixNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7O1lBQzNELE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDL0YsRUFBRSxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixXQUFXLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDNUIsbUJBQW1CLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDbkMsbUJBQW1CLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDdEM7U0FDRjtRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQzthQUNoQztTQUNGOzs7OztJQUdJLGNBQWM7UUFDbkIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDOztRQUN2QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1RixFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7U0FDaEM7Ozs7O0lBR0ksaUJBQWlCOztRQUN0QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzs7UUFDNUYsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRXJFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNDOzs7OztJQUdLLFdBQVc7O1FBQ2pCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUN2RCxFQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDcEIsT0FBTyxFQUFFLENBQUM7YUFDWDtZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNOLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUN0QjtTQUNGLENBQUMsQ0FBQzs7OztZQTdJTixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtnQkFDakMsUUFBUSxFQUFFOzs7Q0FHWDtnQkFDQyxNQUFNLEVBQUUsQ0FBQyxtSUFBbUksQ0FBQzthQUM5STs7Ozs7OEJBSUUsS0FBSzsyQkFDTCxNQUFNO29DQUVOLGVBQWUsU0FBQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgQ29udGVudENoaWxkcmVuLCBRdWVyeUxpc3QsIElucHV0LCBPdXRwdXQsIEFmdGVyQ29udGVudENoZWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWRjQXV0b2NvbXBsZXRlTGlzdEl0ZW0gfSBmcm9tICdtZGMtYXV0b2NvbXBsZXRlLWxpc3QtaXRlbSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbWRjLWF1dG9jb21wbGV0ZS1saXN0JyxcclxuICB0ZW1wbGF0ZTogYDx1bCAqbmdJZj1cInZpc2libGVcIiBjbGFzcz1cIm1kYy1lbGV2YXRpb24tLXoyXCI+XHJcbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG48L3VsPlxyXG5gLFxyXG4gIHN0eWxlczogW2B1bHtwb3NpdGlvbjphYnNvbHV0ZTttaW4td2lkdGg6MjAwcHg7bWF4LWhlaWdodDo0MDBweDtwYWRkaW5nOjA7bWFyZ2luOjA7YmFja2dyb3VuZC1jb2xvcjojZmZmO292ZXJmbG93LXk6c2Nyb2xsO2xpc3Qtc3R5bGU6bm9uZX1gXVxyXG59KVxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LWNsYXNzLXN1ZmZpeFxyXG5leHBvcnQgY2xhc3MgTWRjQXV0b2NvbXBsZXRlTGlzdCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50Q2hlY2tlZCB7XHJcblxyXG4gIEBJbnB1dCgpIG1heFZpc2libGVJdGVtczogbnVtYmVyO1xyXG4gIEBPdXRwdXQoKSBwdWJsaWMgaXRlbVNlbGVjdGVkOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKE1kY0F1dG9jb21wbGV0ZUxpc3RJdGVtKSBhdXRvY29tcGxldGVMaXN0SXRlbXM6ICBRdWVyeUxpc3Q8TWRjQXV0b2NvbXBsZXRlTGlzdEl0ZW0+O1xyXG4gIF92aXNpYmxlOiBib29sZWFuO1xyXG4gIF9maWx0ZXI6IHN0cmluZztcclxuXHJcbiAgcHVibGljIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHZpc2libGUodjogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fdmlzaWJsZSA9IHY7XHJcbiAgICBpZiAodikge1xyXG4gICAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XHJcbiAgICAgIHRoaXMuZm9jdXNGaXJzdEl0ZW0oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudW5mb2N1c0FsbEl0ZW1zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGZpbHRlcigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgZmlsdGVyKGY6IHN0cmluZykge1xyXG4gICAgdGhpcy5fZmlsdGVyID0gZjtcclxuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcclxuICAgIHRoaXMuZm9jdXNGaXJzdEl0ZW0oKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5tYXhWaXNpYmxlSXRlbXMgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XHJcbiAgICB0aGlzLl92aXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLl9maWx0ZXIgPSAnJztcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xyXG4gICAgdGhpcy5hdXRvY29tcGxldGVMaXN0SXRlbXMudG9BcnJheSgpLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKGl0ZW0uaXRlbUNsaWNrZWQub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkgeyAvLyBPbmx5IGFsbG93IG9uZSBzdWJzY3JpcHRpb25cclxuICAgICAgICBpdGVtLml0ZW1DbGlja2VkLnN1YnNjcmliZSgoaXRlbVZhbHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLml0ZW1TZWxlY3RlZC5uZXh0KGl0ZW1WYWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpdGVtLml0ZW1Ib3ZlcmVkLm9ic2VydmVycy5sZW5ndGggPT09IDApIHsgLy8gT25seSBhbGxvdyBvbmUgc3Vic2NyaXB0aW9uXHJcbiAgICAgICAgaXRlbS5pdGVtSG92ZXJlZC5zdWJzY3JpYmUoKGl0ZW1WYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy51bmZvY3VzQWxsSXRlbXMoKTtcclxuICAgICAgICAgIGl0ZW0uZm9jdXNlZCA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVuZm9jdXNBbGxJdGVtcygpIHtcclxuICAgIHRoaXMuYXV0b2NvbXBsZXRlTGlzdEl0ZW1zLnRvQXJyYXkoKS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0uZm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9jdXNOZXh0SXRlbSgpIHtcclxuICAgIGNvbnN0IGZvY3VzZWRJdGVtcyA9IHRoaXMuYXV0b2NvbXBsZXRlTGlzdEl0ZW1zLmZpbHRlcigoaXRlbSwgaW5kZXgsIGxpc3QpID0+IGl0ZW0uZm9jdXNlZCk7XHJcbiAgICBjb25zdCBmb2N1c2VkSXRlbSA9IGZvY3VzZWRJdGVtcy5sZW5ndGggPiAwID8gZm9jdXNlZEl0ZW1zWzBdIDogbnVsbDtcclxuICAgIGNvbnN0IHZpc2libGVJdGVtcyA9IHRoaXMuYXV0b2NvbXBsZXRlTGlzdEl0ZW1zLmZpbHRlcigoaXRlbSwgaW5kZXgsIGxpc3QpID0+IGl0ZW0udmlzaWJsZSk7XHJcblxyXG4gICAgaWYgKGZvY3VzZWRJdGVtKSB7XHJcbiAgICAgIGNvbnN0IGZvY3VzZWRJdGVtSW5kZXggPSB2aXNpYmxlSXRlbXMuaW5kZXhPZihmb2N1c2VkSXRlbSk7XHJcbiAgICAgIGNvbnN0IG5leHRGb2N1c2VkSXRlbSA9ICh2aXNpYmxlSXRlbXMubGVuZ3RoID49IGZvY3VzZWRJdGVtSW5kZXggKyAxKSA/IHZpc2libGVJdGVtc1tmb2N1c2VkSXRlbUluZGV4ICsgMV0gOiBudWxsO1xyXG4gICAgICBpZiAobmV4dEZvY3VzZWRJdGVtKSB7XHJcbiAgICAgICAgZm9jdXNlZEl0ZW0uZm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIG5leHRGb2N1c2VkSXRlbS5mb2N1c2VkID0gdHJ1ZTtcclxuICAgICAgICBuZXh0Rm9jdXNlZEl0ZW0uc2Nyb2xsSW50b1ZpZXcoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHZpc2libGVJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdmlzaWJsZUl0ZW1zWzBdLmZvY3VzZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9jdXNQcmV2aW91c0l0ZW0oKSB7XHJcbiAgICBjb25zdCBmb2N1c2VkSXRlbXMgPSB0aGlzLmF1dG9jb21wbGV0ZUxpc3RJdGVtcy5maWx0ZXIoKGl0ZW0sIGluZGV4LCBsaXN0KSA9PiBpdGVtLmZvY3VzZWQpO1xyXG4gICAgY29uc3QgZm9jdXNlZEl0ZW0gPSBmb2N1c2VkSXRlbXMubGVuZ3RoID4gMCA/IGZvY3VzZWRJdGVtc1swXSA6IG51bGw7XHJcbiAgICBjb25zdCB2aXNpYmxlSXRlbXMgPSB0aGlzLmF1dG9jb21wbGV0ZUxpc3RJdGVtcy5maWx0ZXIoKGl0ZW0sIGluZGV4LCBsaXN0KSA9PiBpdGVtLnZpc2libGUpO1xyXG5cclxuICAgIGlmIChmb2N1c2VkSXRlbSkge1xyXG4gICAgICBjb25zdCBmb2N1c2VkSXRlbUluZGV4ID0gdmlzaWJsZUl0ZW1zLmluZGV4T2YoZm9jdXNlZEl0ZW0pO1xyXG4gICAgICBjb25zdCBwcmV2aW91c0ZvY3VzZWRJdGVtID0gKGZvY3VzZWRJdGVtSW5kZXggPiAwKSA/IHZpc2libGVJdGVtc1tmb2N1c2VkSXRlbUluZGV4IC0gMV0gOiBudWxsO1xyXG4gICAgICBpZiAocHJldmlvdXNGb2N1c2VkSXRlbSkge1xyXG4gICAgICAgIGZvY3VzZWRJdGVtLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgICAgICBwcmV2aW91c0ZvY3VzZWRJdGVtLmZvY3VzZWQgPSB0cnVlO1xyXG4gICAgICAgIHByZXZpb3VzRm9jdXNlZEl0ZW0uc2Nyb2xsSW50b1ZpZXcoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHZpc2libGVJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdmlzaWJsZUl0ZW1zWzBdLmZvY3VzZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9jdXNGaXJzdEl0ZW0oKSB7XHJcbiAgICB0aGlzLnVuZm9jdXNBbGxJdGVtcygpO1xyXG4gICAgY29uc3QgdmlzaWJsZUl0ZW1zID0gdGhpcy5hdXRvY29tcGxldGVMaXN0SXRlbXMuZmlsdGVyKChpdGVtLCBpbmRleCwgbGlzdCkgPT4gaXRlbS52aXNpYmxlKTtcclxuICAgIGlmICh2aXNpYmxlSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB2aXNpYmxlSXRlbXNbMF0uZm9jdXNlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0Rm9jdXNlZEl0ZW0oKSB7XHJcbiAgICBjb25zdCBmb2N1c2VkSXRlbXMgPSB0aGlzLmF1dG9jb21wbGV0ZUxpc3RJdGVtcy5maWx0ZXIoKGl0ZW0sIGluZGV4LCBsaXN0KSA9PiBpdGVtLmZvY3VzZWQpO1xyXG4gICAgY29uc3QgZm9jdXNlZEl0ZW0gPSBmb2N1c2VkSXRlbXMubGVuZ3RoID4gMCA/IGZvY3VzZWRJdGVtc1swXSA6IG51bGw7XHJcblxyXG4gICAgaWYgKGZvY3VzZWRJdGVtKSB7XHJcbiAgICAgIHRoaXMuaXRlbVNlbGVjdGVkLm5leHQoZm9jdXNlZEl0ZW0udmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJJdGVtcygpIHtcclxuICAgIGxldCBzaG93aW5nID0gMDtcclxuICAgIHRoaXMuYXV0b2NvbXBsZXRlTGlzdEl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4LCBsaXN0KSA9PiB7XHJcbiAgICAgIGlmIChzaG93aW5nIDwgdGhpcy5tYXhWaXNpYmxlSXRlbXMgJiYgaXRlbS5maWx0ZXJTdHJpbmcudG9VcHBlckNhc2UoKS5pbmNsdWRlcyh0aGlzLl9maWx0ZXIudG9VcHBlckNhc2UoKSkpIHtcclxuICAgICAgICBpdGVtLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgIHNob3dpbmcrKztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpdGVtLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICBpdGVtLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==