lamb-web-lib
Version:
LambWebLib. Es un proyecto angular de tipo Librería. que contiene una Suit de componentes reutilizables para el proyecto [Lamb Financial](https://lamb.upeu.edu.pe).
334 lines • 28.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/**
* @license
* Copyright Lamb Team. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { Component, Input, HostBinding } from '@angular/core';
import { convertToBoolProperty } from './helpers';
import { filter, takeWhile } from 'rxjs/operators';
import { Router, NavigationEnd } from '@angular/router';
import { LambMenuInternalService } from './menu-internal.service';
var LambMenuComponent = /** @class */ (function () {
function LambMenuComponent(lambMenuInternalService, router) {
this.lambMenuInternalService = lambMenuInternalService;
this.router = router;
/**
* Lista de elementos de menú.
*/
// @Input() lambItems: LambMenuItem[];
this.lambItems = [];
this.alive = true;
this.autoCollapseValue = false;
}
Object.defineProperty(LambMenuComponent.prototype, "items", {
set: /**
* @param {?} lambItems
* @return {?}
*/
function (lambItems) {
if (lambItems) {
// setTimeout(() => {
this.lambItems = lambItems;
// }, 0);
this.afterLoadItems();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(LambMenuComponent.prototype, "inverse", {
/**
* Hace que los colores sean inversos según el tema actual.
* El valor predeterminado es "false"
*/
set: /**
* Hace que los colores sean inversos según el tema actual.
* El valor predeterminado es "false"
* @param {?} val
* @return {?}
*/
function (val) {
this.inverseValue = convertToBoolProperty(val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(LambMenuComponent.prototype, "autoCollapse", {
/**
* Contraer todos los submenus abiertos en el event de aternar (toggle event)
* El valor predeterminado es "false".
*/
set: /**
* Contraer todos los submenus abiertos en el event de aternar (toggle event)
* El valor predeterminado es "false".
* @param {?} val
* @return {?}
*/
function (val) {
this.autoCollapseValue = convertToBoolProperty(val);
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
LambMenuComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.lambMenuInternalService
.onAddItem()
.pipe(takeWhile(function () { return _this.alive; }), filter(function (data) { return _this.compareTag(data.tag); }))
.subscribe(function (data) { return _this.onAddItem(data); });
this.lambMenuInternalService
.onNavigateHome()
.pipe(takeWhile(function () { return _this.alive; }), filter(function (data) { return _this.compareTag(data.tag); }))
.subscribe(function () { return _this.navigateHome(); });
this.lambMenuInternalService
.onGetSelectedItem()
.pipe(takeWhile(function () { return _this.alive; }), filter(function (data) { return _this.compareTag(data.tag); }))
.subscribe(function (data) {
data.listener.next({ tag: _this.tag, item: _this.getSelectedItem(_this.lambItems) });
});
this.router.events
.pipe(takeWhile(function () { return _this.alive; }), filter(function (event) { return event instanceof NavigationEnd; }))
.subscribe(function () {
_this.lambMenuInternalService.resetItems(_this.lambItems);
_this.lambMenuInternalService.updateSelection(_this.lambItems, _this.tag, _this.autoCollapseValue);
});
(_a = this.lambItems).push.apply(_a, tslib_1.__spread(this.lambMenuInternalService.getItems()));
var _a;
};
/**
* @param {?} items
* @return {?}
*/
LambMenuComponent.prototype.getSelectedItem = /**
* @param {?} items
* @return {?}
*/
function (items) {
var _this = this;
/** @type {?} */
var selected = null;
items.forEach(function (item) {
if (item.selected) {
selected = item;
}
if (item.selected && item.children && item.children.length > 0) {
selected = _this.getSelectedItem(item.children);
}
});
return selected;
};
/**
* @return {?}
*/
LambMenuComponent.prototype.afterLoadItems = /**
* @return {?}
*/
function () {
var _this = this;
// Codigo extra, propio del proyecto
this.lambMenuInternalService.prepareItems(this.lambItems);
setTimeout(function () { return _this.lambMenuInternalService.updateSelection(_this.lambItems, _this.tag); });
};
/**
* @return {?}
*/
LambMenuComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
};
/**
* @param {?} data
* @return {?}
*/
LambMenuComponent.prototype.onAddItem = /**
* @param {?} data
* @return {?}
*/
function (data) {
(_a = this.lambItems).push.apply(_a, tslib_1.__spread(data.items));
this.lambMenuInternalService.prepareItems(this.lambItems);
this.lambMenuInternalService.updateSelection(this.lambItems, this.tag, this.autoCollapseValue);
var _a;
};
/** Attr Menus */
/**
* Attr Menus
* @param {?} item
* @return {?}
*/
LambMenuComponent.prototype.onHoverItem = /**
* Attr Menus
* @param {?} item
* @return {?}
*/
function (item) {
this.lambMenuInternalService.itemHover(item, this.tag);
};
// TODO: No se dispara cuando la pagina se recarga.
// TODO: No se dispara cuando la pagina se recarga.
/**
* @param {?} item
* @return {?}
*/
LambMenuComponent.prototype.onSelectItem =
// TODO: No se dispara cuando la pagina se recarga.
/**
* @param {?} item
* @return {?}
*/
function (item) {
this.lambMenuInternalService.resetItems(this.lambItems);
this.lambMenuInternalService.selectItem(item, this.tag);
};
/**
* @param {?} item
* @return {?}
*/
LambMenuComponent.prototype.onItemClick = /**
* @param {?} item
* @return {?}
*/
function (item) {
this.lambMenuInternalService.itemClick(item, this.tag);
};
/**
* @return {?}
*/
LambMenuComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.alive = false;
};
/**
* @param {?} item
* @return {?}
*/
LambMenuComponent.prototype.onToggleSubMenu = /**
* @param {?} item
* @return {?}
*/
function (item) {
if (this.autoCollapseValue) {
this.lambMenuInternalService.collapseAll(this.lambItems, this.tag, item);
}
item.expanded = !item.expanded;
this.lambMenuInternalService.submenuToggle(item, this.tag);
};
/**
* @param {?} tag
* @return {?}
*/
LambMenuComponent.prototype.compareTag = /**
* @param {?} tag
* @return {?}
*/
function (tag) {
return !tag || tag === this.tag;
};
/**
* @return {?}
*/
LambMenuComponent.prototype.navigateHome = /**
* @return {?}
*/
function () {
/** @type {?} */
var homeItem = this.getHomeItem(this.lambItems);
if (homeItem) {
if (homeItem.link) {
this.router.navigate([homeItem.link]);
}
if (homeItem.url) {
window.location.href = homeItem.url;
}
}
};
/**
* @param {?} items
* @return {?}
*/
LambMenuComponent.prototype.getHomeItem = /**
* @param {?} items
* @return {?}
*/
function (items) {
try {
for (var items_1 = tslib_1.__values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {
var item = items_1_1.value;
if (item.home) {
return item;
}
/** @type {?} */
var homeItem = item.children && this.getHomeItem(item.children);
if (homeItem) {
return homeItem;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);
}
finally { if (e_1) throw e_1.error; }
}
var e_1, _a;
};
LambMenuComponent.decorators = [
{ type: Component, args: [{
selector: 'lamb-menu',
template: "\n <ul class=\"lamb-menu-items\">\n <li lambMenuItem *ngFor=\"let item of lambItems\"\n [lambMenuItemm]=\"item\"\n (hoverItem)=\"onHoverItem($event)\"\n (toggleSubMenu)=\"onToggleSubMenu($event)\"\n (selectItem)=\"onSelectItem($event)\"\n (itemClick)=\"onItemClick($event)\"\n class=\"lamb-menu-item\"></li>\n </ul>\n ",
styles: ["@charset \"UTF-8\";:host ::ng-deep{display:block;margin:0 -1.25rem -1.25rem}:host ::ng-deep .lamb-menu-item>.lamb-menu-items,:host ::ng-deep .lamb-menu-items{list-style-type:none;overflow:hidden;transition:max-height .3s ease-in}:host ::ng-deep .lamb-menu-item a{display:flex;color:inherit;text-decoration:none;align-items:center}:host ::ng-deep .lamb-menu-item a .lamb-menu-title{flex:1}"],
},] },
];
LambMenuComponent.ctorParameters = function () { return [
{ type: LambMenuInternalService },
{ type: Router }
]; };
LambMenuComponent.propDecorators = {
inverseValue: [{ type: HostBinding, args: ['class.inverse',] }],
tag: [{ type: Input }],
items: [{ type: Input }],
inverse: [{ type: Input }],
autoCollapse: [{ type: Input }]
};
return LambMenuComponent;
}());
export { LambMenuComponent };
if (false) {
/** @type {?} */
LambMenuComponent.prototype.inverseValue;
/**
* Las etiquetas de un menú con un Id, se pueden usar posteriormente en el servicio
* de menú para determinar qué menú desencadenó la acción, si existen varios menús en la página.
* @type {?}
*/
LambMenuComponent.prototype.tag;
/**
* Lista de elementos de menú.
* @type {?}
*/
LambMenuComponent.prototype.lambItems;
/** @type {?} */
LambMenuComponent.prototype.alive;
/** @type {?} */
LambMenuComponent.prototype.autoCollapseValue;
/** @type {?} */
LambMenuComponent.prototype.lambMenuInternalService;
/** @type {?} */
LambMenuComponent.prototype.router;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9sYW1iLXdlYi1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9tZW51L21lbnUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFPQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxXQUFXLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBRWhHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFeEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbEU7SUE0REUsMkJBQW9CLHVCQUFnRCxFQUUxRCxNQUFjO1FBRkosNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUUxRCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBdEN4Qjs7V0FFRztRQUNILHNDQUFzQztRQUMvQixjQUFTLEdBQW1CLEVBQUUsQ0FBQztRQTZCOUIsVUFBSyxHQUFHLElBQUksQ0FBQztRQUNiLHNCQUFpQixHQUFHLEtBQUssQ0FBQztJQUs5QixDQUFDO0lBbENMLHNCQUNJLG9DQUFLOzs7OztRQURULFVBQ1UsU0FBeUI7WUFDakMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDZCxxQkFBcUI7Z0JBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO2dCQUMzQixTQUFTO2dCQUNULElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixDQUFDO1FBQ0gsQ0FBQzs7O09BQUE7SUFNRCxzQkFDSSxzQ0FBTztRQUxYOzs7V0FHRzs7Ozs7OztRQUNILFVBQ1ksR0FBWTtZQUN0QixJQUFJLENBQUMsWUFBWSxHQUFH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QWU7c0JBTTNCLEtBQUs7d0JBT0wsS0FBSzswQkFjTCxLQUFLOytCQVNMLEtBQUs7O0lBMklSLHdCQUFDO0NBQUEsQUEvTEQsSUErTEM7U0FoTFksaUJBQWlCOzs7SUFDNUIseUNBQW9EOzs7Ozs7SUFNcEQsZ0NBQXFCOzs7OztJQU1yQixzQ0FBc0M7O0lBNkJ0QyxrQ0FBcUI7O0lBQ3JCLDhDQUFrQzs7SUFFdEIsb0RBQXdEOztJQUVsRSxtQ0FBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBMYW1iIFRlYW0uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBIb3N0QmluZGluZywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IExhbWJNZW51SXRlbSwgTGFtYk1lbnVCYWcgfSBmcm9tICcuL21lbnUtaXRlbSc7XHJcbmltcG9ydCB7IGNvbnZlcnRUb0Jvb2xQcm9wZXJ0eSB9IGZyb20gJy4vaGVscGVycyc7XHJcbmltcG9ydCB7IGZpbHRlciwgdGFrZVdoaWxlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTGFtYk1lbnVJbnRlcm5hbFNlcnZpY2UgfSBmcm9tICcuL21lbnUtaW50ZXJuYWwuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xhbWItbWVudScsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDx1bCBjbGFzcz1cImxhbWItbWVudS1pdGVtc1wiPlxyXG4gICAgICA8bGkgbGFtYk1lbnVJdGVtICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxhbWJJdGVtc1wiXHJcbiAgICAgICAgW2xhbWJNZW51SXRlbW1dPVwiaXRlbVwiXHJcbiAgICAgICAgKGhvdmVySXRlbSk9XCJvbkhvdmVySXRlbSgkZXZlbnQpXCJcclxuICAgICAgICAodG9nZ2xlU3ViTWVudSk9XCJvblRvZ2dsZVN1Yk1lbnUoJGV2ZW50KVwiXHJcbiAgICAgICAgKHNlbGVjdEl0ZW0pPVwib25TZWxlY3RJdGVtKCRldmVudClcIlxyXG4gICAgICAgIChpdGVtQ2xpY2spPVwib25JdGVtQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgY2xhc3M9XCJsYW1iLW1lbnUtaXRlbVwiPjwvbGk+XHJcbiAgICA8L3VsPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYEBjaGFyc2V0IFwiVVRGLThcIjs6aG9zdCA6Om5nLWRlZXB7ZGlzcGxheTpibG9jazttYXJnaW46MCAtMS4yNXJlbSAtMS4yNXJlbX06aG9zdCA6Om5nLWRlZXAgLmxhbWItbWVudS1pdGVtPi5sYW1iLW1lbnUtaXRlbXMsOmhvc3QgOjpuZy1kZWVwIC5sYW1iLW1lbnUtaXRlbXN7bGlzdC1zdHlsZS10eXBlOm5vbmU7b3ZlcmZsb3c6aGlkZGVuO3RyYW5zaXRpb246bWF4LWhlaWdodCAuM3MgZWFzZS1pbn06aG9zdCA6Om5nLWRlZXAgLmxhbWItbWVudS1pdGVtIGF7ZGlzcGxheTpmbGV4O2NvbG9yOmluaGVyaXQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YWxpZ24taXRlbXM6Y2VudGVyfTpob3N0IDo6bmctZGVlcCAubGFtYi1tZW51LWl0ZW0gYSAubGFtYi1tZW51LXRpdGxle2ZsZXg6MX1gXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIExhbWJNZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaW52ZXJzZScpIGludmVyc2VWYWx1ZTogYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogTGFzIGV0aXF1ZXRhcyBkZSB1biBtZW7DuiBjb24gdW4gSWQsIHNlIHB1ZWRlbiB1c2FyIHBvc3Rlcmlvcm1lbnRlIGVuIGVsIHNlcnZpY2lvXHJcbiAgICogZGUgbWVuw7ogcGFyYSBkZXRlcm1pbmFyIHF1w6kgbWVuw7ogZGVzZW5jYWRlbsOzIGxhIGFjY2nDs24sIHNpIGV4aXN0ZW4gdmFyaW9zIG1lbsO6cyBlbiBsYSBww6FnaW5hLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHRhZzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBMaXN0YSBkZSBlbGVtZW50b3MgZGUgbWVuw7ouXHJcbiAgICovXHJcbiAgLy8gQElucHV0KCkgbGFtYkl0ZW1zOiBMYW1iTWVudUl0ZW1bXTtcclxuICBwdWJsaWMgbGFtYkl0ZW1zOiBMYW1iTWVudUl0ZW1bXSA9IFtdO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGl0ZW1zKGxhbWJJdGVtczogTGFtYk1lbnVJdGVtW10pIHtcclxuICAgIGlmIChsYW1iSXRlbXMpIHtcclxuICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMubGFtYkl0ZW1zID0gbGFtYkl0ZW1zO1xyXG4gICAgICAvLyB9LCAwKTtcclxuICAgICAgdGhpcy5hZnRlckxvYWRJdGVtcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFjZSBxdWUgbG9zIGNvbG9yZXMgc2VhbiBpbnZlcnNvcyBzZWfDum4gZWwgdGVtYSBhY3R1YWwuXHJcbiAgICogRWwgdmFsb3IgcHJlZGV0ZXJtaW5hZG8gZXMgXCJmYWxzZVwiXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgaW52ZXJzZSh2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaW52ZXJzZVZhbHVlID0gY29udmVydFRvQm9vbFByb3BlcnR5KHZhbCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb250cmFlciB0b2RvcyBsb3Mgc3VibWVudXMgYWJpZXJ0b3MgZW4gZWwgZXZlbnQgZGUgYXRlcm5hciAodG9nZ2xlIGV2ZW50KVxyXG4gICAqIEVsIHZhbG9yIHByZWRldGVybWluYWRvIGVzIFwiZmFsc2VcIi5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBhdXRvQ29sbGFwc2UodmFsOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmF1dG9Db2xsYXBzZVZhbHVlID0gY29udmVydFRvQm9vbFByb3BlcnR5KHZhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFsaXZlID0gdHJ1ZTtcclxuICBwcml2YXRlIGF1dG9Db2xsYXBzZVZhbHVlID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbGFtYk1lbnVJbnRlcm5hbFNlcnZpY2U6IExhbWJNZW51SW50ZXJuYWxTZXJ2aWNlLFxyXG4gICAgLy8gcHJpdmF0ZSBhY2Nlc3NPYnNlcnZhYmxlU2VydmljZTogQWNjZXNzT2JzZXJ2YWJsZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICkgeyB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMubGFtYk1lbnVJbnRlcm5hbFNlcnZpY2VcclxuICAgICAgLm9uQWRkSXRlbSgpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSxcclxuICAgICAgICBmaWx0ZXIoKGRhdGE6IHsgdGFnOiBzdHJpbmc7IGl0ZW1zOiBMYW1iTWVudUl0ZW1bXSB9KSA9PiB0aGlzLmNvbXBhcmVUYWcoZGF0YS50YWcpKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGRhdGEgPT4gdGhpcy5vbkFkZEl0ZW0oZGF0YSkpO1xyXG5cclxuICAgIHRoaXMubGFtYk1lbnVJbnRlcm5hbFNlcnZpY2VcclxuICAgICAgLm9uTmF2aWdhdGVIb21lKClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVdoaWxlKCgpID0+IHRoaXMuYWxpdmUpLFxyXG4gICAgICAgIGZpbHRlcigoZGF0YTogeyB0YWc6IHN0cmluZzsgaXRlbXM6IExhbWJNZW51SXRlbSB9KSA9PiB0aGlzLmNvbXBhcmVUYWcoZGF0YS50YWcpKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMubmF2aWdhdGVIb21lKCkpO1xyXG5cclxuICAgIHRoaXMubGFtYk1lbnVJbnRlcm5hbFNlcnZpY2VcclxuICAgICAgLm9uR2V0U2VsZWN0ZWRJdGVtKClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVdoaWxlKCgpID0+IHRoaXMuYWxpdmUpLFxyXG4gICAgICAgIGZpbHRlcigoZGF0YTogeyB0YWc6IHN0cmluZzsgbGlzdGVuZXI6IEJlaGF2aW9yU3ViamVjdDxMYW1iTWVudUJhZz4gfSkgPT4gdGhpcy5jb21wYXJlVGFnKGRhdGEudGFnKSksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogeyB0YWc6IHN0cmluZzsgbGlzdGVuZXI6IEJlaGF2aW9yU3ViamVjdDxMYW1iTWVudUJhZz4gfSkgPT4ge1xyXG4gICAgICAgIGRhdGEubGlzdGVuZXIubmV4dCh7IHRhZzogdGhpcy50YWcsIGl0ZW06IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtKHRoaXMubGFtYkl0ZW1zKSB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSxcclxuICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmxhbWJNZW51SW50ZXJuYWxTZXJ2aWNlLnJlc2V0SXRlbXModGhpcy5sYW1iSXRlbXMpO1xyXG4gICAgICAgIHRoaXMubGFtYk1lbnVJbnRlcm5hbFNlcnZpY2UudXBkYXRlU2VsZWN0aW9uKHRoaXMubGFtYkl0ZW1zLCB0aGlzLnRhZywgdGhpcy5hdXRvQ29sbGFwc2VWYWx1ZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMubGFtYkl0ZW1zLnB1c2goLi4udGhpcy5sYW1iTWVudUludGVybmFsU2VydmljZS5nZXRJdGVtcygpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRJdGVtKGl0ZW1zOiBMYW1iTWVudUl0ZW1bXSk6IExhbWJNZW51SXRlbSB7XHJcbiAgICBsZXQgc2VsZWN0ZWQgPSBudWxsO1xyXG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbTogTGFtYk1lbnVJdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgc2VsZWN0ZWQgPSBpdGVtO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpdGVtLnNlbGVjdGVkICYmIGl0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgc2VsZWN0ZWQgPSB0aGlzLmdldFNlbGVjdGVkSXRlbShpdGVtLmNoaWxkcmVuKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyTG9hZEl0ZW1zKCkge1xyXG4gICAgLy8gQ29kaWdvIGV4dHJhLCBwcm9waW8gZGVsIHByb3llY3RvXHJcbiAgICB0aGlzLmxhbWJNZW51SW50ZXJuYWxTZXJ2aWNlLnByZXBhcmVJdGVtcyh0aGlzLmxhbWJJdGVtcyk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubGFtYk1lbnVJbnRlcm5hbFNlcnZpY2UudXBkYXRlU2VsZWN0aW9uKHRoaXMubGFtYkl0ZW1zLCB0aGlzLnRhZykpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkFkZEl0ZW0oZGF0YTogeyB0YWc6IHN0cmluZywgaXRlbXM6IExhbWJNZW51SXRlbVtdIH0pIHtcclxuICAgIHRoaXMubGFtYkl0ZW1zLnB1c2goLi4uZGF0YS5pdGVtcyk7XHJcblxyXG4gICAgdGhpcy5sYW1iTWVudUludGVybmFsU2VydmljZS5wcmVwYXJlSXRlbXModGhpcy5sYW1iSXRlbXMpO1xyXG4gICAgdGhpcy5sYW1iTWVudUludGVybmFsU2VydmljZS51cGRhdGVTZWxlY3Rpb24odGhpcy5sYW1iSXRlbXMsIHRoaXMudGFnLCB0aGlzLmF1dG9Db2xsYXBzZVZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKiBBdHRyIE1lbnVzICovXHJcbiAgcHVibGljIG9uSG92ZXJJdGVtKGl0ZW06IExhbWJNZW51SXRlbSkge1xyXG4gICAgdGhpcy5sYW1iTWVudUludGVybmFsU2VydmljZS5pdGVtSG92ZXIoaXRlbSwgdGhpcy50YWcpO1xyXG4gIH1cclxuXHJcbiAgLy8gVE9ETzogTm8gc2UgZGlzcGFyYSBjdWFuZG8gbGEgcGFnaW5hIHNlIHJlY2FyZ2EuXHJcbiAgcHVibGljIG9uU2VsZWN0SXRlbShpdGVtOiBMYW1iTWVudUl0ZW0pIHtcclxuICAgIHRoaXMubGFtYk1lbnVJbnRlcm5hbFNlcnZpY2UucmVzZXRJdGVtcyh0aGlzLmxhbWJJdGVtcyk7XHJcbiAgICB0aGlzLmxhbWJNZW51SW50ZXJuYWxTZXJ2aWNlLnNlbGVjdEl0ZW0oaXRlbSwgdGhpcy50YWcpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uSXRlbUNsaWNrKGl0ZW06IExhbWJNZW51SXRlbSkge1xyXG4gICAgdGhpcy5sYW1iTWVudUludGVybmFsU2VydmljZS5pdGVtQ2xpY2soaXRlbSwgdGhpcy50YWcpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5hbGl2ZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVG9nZ2xlU3ViTWVudShpdGVtOiBMYW1iTWVudUl0ZW0pIHtcclxuICAgIGlmICh0aGlzLmF1dG9Db2xsYXBzZVZhbHVlKSB7XHJcbiAgICAgIHRoaXMubGFtYk1lbnVJbnRlcm5hbFNlcnZpY2UuY29sbGFwc2VBbGwodGhpcy5sYW1iSXRlbXMsIHRoaXMudGFnLCBpdGVtKTtcclxuICAgIH1cclxuICAgIGl0ZW0uZXhwYW5kZWQgPSAhaXRlbS5leHBhbmRlZDtcclxuICAgIHRoaXMubGFtYk1lbnVJbnRlcm5hbFNlcnZpY2Uuc3VibWVudVRvZ2dsZShpdGVtLCB0aGlzLnRhZyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXBhcmVUYWcodGFnOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiAhdGFnIHx8IHRhZyA9PT0gdGhpcy50YWc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5hdmlnYXRlSG9tZSgpIHtcclxuICAgIGNvbnN0IGhvbWVJdGVtID0gdGhpcy5nZXRIb21lSXRlbSh0aGlzLmxhbWJJdGVtcyk7XHJcblxyXG4gICAgaWYgKGhvbWVJdGVtKSB7XHJcbiAgICAgIGlmIChob21lSXRlbS5saW5rKSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2hvbWVJdGVtLmxpbmtdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGhvbWVJdGVtLnVybCkge1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gaG9tZUl0ZW0udXJsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEhvbWVJdGVtKGl0ZW1zOiBMYW1iTWVudUl0ZW1bXSk6IExhbWJNZW51SXRlbSB7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgaWYgKGl0ZW0uaG9tZSkge1xyXG4gICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBob21lSXRlbSA9IGl0ZW0uY2hpbGRyZW4gJiYgdGhpcy5nZXRIb21lSXRlbShpdGVtLmNoaWxkcmVuKTtcclxuICAgICAgaWYgKGhvbWVJdGVtKSB7XHJcbiAgICAgICAgcmV0dXJuIGhvbWVJdGVtO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==