UNPKG

air-lib

Version:

This is Air's angular component library

265 lines 29.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { PagingService } from './../../services/paging.service'; import { Component, Input, ViewChild } from '@angular/core'; import { Router, NavigationEnd } from '@angular/router'; import { HttpService } from '../../services/http.service'; import { PagingEvent } from '../../entities/paging-event'; import { HttpMethod } from '../../entities/http-method.enum'; import { BaseMasterComponent } from '../base-master/base-master.component'; import { DetailsPagingComponent } from '../details-paging/details-paging.component'; export class SubPageSelectorComponent { /** * @param {?} httpService * @param {?} router */ constructor(httpService, router) { this.httpService = httpService; this.router = router; /** @type {?} */ const self = this; self.pageable = this.hasMasterList = false; if (self.pageItems && self.pageItems.length > 0) { if (self.isRouteContains(self.router.url, self.pageItems)) { this.pageable = this.hasMasterList = true; } } self.routingEventsSubscription = self.router.events .subscribe((event) => { if (event instanceof NavigationEnd) { /** @type {?} */ let isDetailPage = false; if (self.pageItems && self.pageItems.length > 0) { self.pageItems.forEach(item => { if (item.detailPageUrl && event.url.indexOf(item.detailPageUrl) !== -1) { isDetailPage = true; if (item.context !== self.context) { if (this.detailsPaging) { this.detailsPaging.setOptions(); } } self.context = item.context; } }); } self.pageable = self.hasMasterList = isDetailPage; } }, (err) => { console.error(err); }); } /** * @return {?} */ ngOnInit() { /** @type {?} */ const self = this; // redirect to appropriate url self.pagingEventSubscription = PagingService.currentMessage .subscribe((pagingEvent) => { if (!pagingEvent || pagingEvent == null || pagingEvent.hash === 'empty') { return; } /** @type {?} */ const index = Math.floor(pagingEvent.currentIndex / pagingEvent.itemsOnPage); if (PagingService.isExistsHash(self.context, index)) { // const hash = PagingService.getHash(self.context, index); // pagingEvent.hash = hash; self.callStateApi(pagingEvent); } else { self.recallMasterPageMethod(pagingEvent); } }, (err) => { console.error(err); throw err; }); } /** * @param {?} pagingEvent * @return {?} */ getMasterCurrentIndex(pagingEvent) { if (pagingEvent.currentIndex === 0) { return 0; } /** @type {?} */ const pageNo = this.getCurrentPageNo(pagingEvent); /** @type {?} */ let masterIndex = pagingEvent.currentIndex - (pageNo - 1) * pagingEvent.itemsOnPage; if (masterIndex < 0 || masterIndex === pagingEvent.itemsOnPage) { masterIndex = 0; } return masterIndex; } /** * @param {?} pagingEvent * @return {?} */ callStateApi(pagingEvent) { /** @type {?} */ const masterIndex = this.getMasterCurrentIndex(pagingEvent); console.log('masterIndex = ' + masterIndex); /** @type {?} */ const apiMethod = 'api/state/searchResults/' + pagingEvent.hash + '/index/' + masterIndex; this.httpService.httpGet(apiMethod).subscribe((id) => { this.recallPagingEvent(id, pagingEvent); }, (err) => { console.error(err); throw err; }); } /** * @param {?} url * @param {?} pageNo * @return {?} */ replacePageNo(url, pageNo) { /** @type {?} */ let result = url; /** @type {?} */ const regexp = /page=[0-9]+/gm; result = result.replace(regexp, 'page=' + pageNo); return result; } /** * @param {?} pagingEvent * @return {?} */ getCurrentPageNo(pagingEvent) { /** @type {?} */ const pageNo = Math.ceil(pagingEvent.currentIndex / pagingEvent.itemsOnPage); return pageNo; } /** * @param {?} pagingEvent * @return {?} */ recallMasterPageMethod(pagingEvent) { /** @type {?} */ const pageNo = this.getCurrentPageNo(pagingEvent); pagingEvent.apiCall.url = this.replacePageNo(pagingEvent.apiCall.url, pageNo); if (pagingEvent.apiCall.method === HttpMethod.GET) { this.httpService.get(pagingEvent.apiCall.url).subscribe((response) => { pagingEvent.hash = response.headers.get(BaseMasterComponent.CACHED_HEADER); if (pagingEvent.hash === null) { return; } /** @type {?} */ const hashIndex = Math.floor(pagingEvent.currentIndex / pagingEvent.itemsOnPage); PagingService.addHash(this.context, hashIndex, pagingEvent.hash); this.callStateApi(pagingEvent); }, (err) => { console.error(err); throw err; }); } if (pagingEvent.apiCall.method === HttpMethod.POST) { pagingEvent.apiCall.filterModel.page = pageNo; this.httpService.post(pagingEvent.apiCall.url, pagingEvent.apiCall.filterModel).subscribe((response) => { pagingEvent.hash = response.headers.get(BaseMasterComponent.CACHED_HEADER); if (pagingEvent.hash === null) { return; } /** @type {?} */ const hashIndex = Math.floor(pagingEvent.currentIndex / pagingEvent.itemsOnPage); PagingService.addHash(this.context, hashIndex, pagingEvent.hash); this.callStateApi(pagingEvent); }, (err) => { console.error(err); throw err; }); } } /** * @private * @param {?} id * @param {?} pagingEvent * @return {?} */ recallPagingEvent(id, pagingEvent) { pagingEvent.currentId = id; PagingService.saveToLocalStorage(pagingEvent); /** @type {?} */ const redirectUrl = PagingService.buildRedirectUrl(pagingEvent); this.router.navigateByUrl(redirectUrl); } /** * @private * @param {?} routeUrl * @param {?} items * @return {?} */ isRouteContains(routeUrl, items) { /** @type {?} */ let result = false; items.forEach(url => { if (url.detailPageUrl && routeUrl.indexOf(url.detailPageUrl) !== -1) { result = true; } }); return result; } /** * @return {?} */ ngOnDestroy() { console.log('SubPageSelector is destroying...'); /** @type {?} */ const pagingEvent = new PagingEvent('empty'); PagingService.fireClosingContextEvent(pagingEvent); this.pagingEventSubscription.unsubscribe(); this.routingEventsSubscription.unsubscribe(); console.log('SubPageSelector has been destroyed.'); } } SubPageSelectorComponent.decorators = [ { type: Component, args: [{ selector: 'air-sub-page-selector', template: "<div class=\"header-nav\" [ngClass]=\"{'active-pagination': pageable}\">\r\n <ul class=\"nav-list\">\r\n <li class=\"nav-item\" *ngFor=\"let item of pageItems\">\r\n <button class=\"nav-btn\" [routerLink]=\"[item.routerLink]\" routerLinkActive=\"active\" title=\"{{item.localizationKey | translate}}\">\r\n {{item.localizationKey | translate}}\r\n </button>\r\n </li>\r\n </ul>\r\n <air-details-paging #detailsPaging\r\n class=\"air-details-paging\"\r\n *ngIf=\"pageable\"\r\n [itemsOnPage]=\"5\"\r\n [displayReturnBackUrl]=\"hasMasterList\">\r\n </air-details-paging>\r\n</div>", styles: [".header-nav{position:relative;background:#f5f5f5;z-index:2;display:flex}.header-nav .nav-list{display:flex;list-style:none;justify-content:center;flex-wrap:wrap;width:100%}.header-nav .nav-list .nav-item{padding:0 25px}.header-nav .nav-list .nav-item .nav-btn{outline:0;background:0 0;cursor:pointer;border:none;position:relative;padding:18px 0}.header-nav .nav-list .nav-item .nav-btn.active,.header-nav .nav-list .nav-item .nav-btn:hover{font-weight:700}.header-nav .nav-list .nav-item .nav-btn.active:before,.header-nav .nav-list .nav-item .nav-btn:hover:before{content:'';background:#ff524d}.header-nav .nav-list .nav-item .nav-btn:before{content:'';position:absolute;bottom:-2px;left:0;width:100%;height:3px;transition:.3s;-webkit-transition:.3s}.header-nav .nav-list .nav-item .nav-btn:after{display:block;content:attr(title);font-weight:700;height:1px;color:transparent;overflow:hidden;visibility:hidden}@media (max-width:900px){.header-nav .nav-list .nav-item{padding:0 10px}.header-nav .nav-list .nav-item .nav-btn{font-size:13px;padding:12px 0}}.header-nav.active-pagination .air-details-paging{flex-basis:30%;min-width:440px}@media (max-width:500px){.header-nav.active-pagination air-details-paging{flex-basis:30%;min-width:320px}}"] }] } ]; SubPageSelectorComponent.ctorParameters = () => [ { type: HttpService }, { type: Router } ]; SubPageSelectorComponent.propDecorators = { detailsPaging: [{ type: ViewChild, args: ['detailsPaging',] }], pageItems: [{ type: Input }], pageable: [{ type: Input }], hasMasterList: [{ type: Input }] }; if (false) { /** @type {?} */ SubPageSelectorComponent.prototype.detailsPaging; /** @type {?} */ SubPageSelectorComponent.prototype.pageItems; /** @type {?} */ SubPageSelectorComponent.prototype.pageable; /** @type {?} */ SubPageSelectorComponent.prototype.hasMasterList; /** @type {?} */ SubPageSelectorComponent.prototype.context; /** * @type {?} * @private */ SubPageSelectorComponent.prototype.pagingEventSubscription; /** * @type {?} * @private */ SubPageSelectorComponent.prototype.routingEventsSubscription; /** * @type {?} * @private */ SubPageSelectorComponent.prototype.httpService; /** * @type {?} * @private */ SubPageSelectorComponent.prototype.router; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViLXBhZ2Utc2VsZWN0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWlyLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3N1Yi1wYWdlLXNlbGVjdG9yL3N1Yi1wYWdlLXNlbGVjdG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhFLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBUXBGLE1BQU07Ozs7O0lBa0JKLFlBQW9CLFdBQXdCLEVBQVUsTUFBYztRQUFoRCxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7O2NBQzVELElBQUksR0FBRyxJQUFJO1FBRWpCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0MsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUN6RCxJ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LENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ25FLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFDZjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs7OztJQUNELFdBQVc7UUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7O2NBQzFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDNUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMseUJBQXlCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7OztZQWpNRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtnQkFDakMseXFCQUFpRDs7YUFFbEQ7OztZQVhRLFdBQVc7WUFEWCxNQUFNOzs7NEJBZ0JaLFNBQVMsU0FBQyxlQUFlO3dCQUV6QixLQUFLO3VCQUlMLEtBQUs7NEJBR0wsS0FBSzs7OztJQVROLGlEQUFrRTs7SUFFbEUsNkNBQTRDOztJQUk1Qyw0Q0FBMkI7O0lBRzNCLGlEQUFnQzs7SUFFaEMsMkNBQXVCOzs7OztJQUV2QiwyREFBOEM7Ozs7O0lBQzlDLDZEQUFnRDs7Ozs7SUFFcEMsK0NBQWdDOzs7OztJQUFFLDBDQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhZ2luZ1NlcnZpY2UgfSBmcm9tICcuLy4uLy4uL3NlcnZpY2VzL3BhZ2luZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE9uRGVzdHJveSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBIdHRwU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2h0dHAuc2VydmljZSc7XHJcbmltcG9ydCB7IFBhZ2luZ0V2ZW50IH0gZnJvbSAnLi4vLi4vZW50aXRpZXMvcGFnaW5nLWV2ZW50JztcclxuaW1wb3J0IHsgUGFnZVNlbGVjdG9ySXRlbSB9IGZyb20gJy4uLy4uL2VudGl0aWVzL3BhZ2Utc2VsZWN0b3ItaXRlbSc7XHJcbmltcG9ydCB7IEh0dHBNZXRob2QgfSBmcm9tICcuLi8uLi9lbnRpdGllcy9odHRwLW1ldGhvZC5lbnVtJztcclxuaW1wb3J0IHsgQmFzZU1hc3RlckNvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2UtbWFzdGVyL2Jhc2UtbWFzdGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERldGFpbHNQYWdpbmdDb21wb25lbnQgfSBmcm9tICcuLi9kZXRhaWxzLXBhZ2luZy9kZXRhaWxzLXBhZ2luZy5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhaXItc3ViLXBhZ2Utc2VsZWN0b3InLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zdWItcGFnZS1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc3ViLXBhZ2Utc2VsZWN0b3IuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFN1YlBhZ2VTZWxlY3RvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZGV0YWlsc1BhZ2luZycpIGRldGFpbHNQYWdpbmc6IERldGFpbHNQYWdpbmdDb21wb25lbnQ7XHJcblxyXG4gIEBJbnB1dCgpIHBhZ2VJdGVtczogQXJyYXk8UGFnZVNlbGVjdG9ySXRlbT47XHJcblxyXG4gIC8vINC00LAgXFwg0L3QtdGCICjQvdC10L7QsdGF0L7QtNC40Lwg0LvQuCDQv9C10LnQtNC20LjQvdCzINC00LvRjyDQtNCw0L3QvdGL0YUg0YDQsNC30LTQtdC70LAgXFwg0L/QvtC00YDQsNC30LTQtdC70LApXHJcbiAgLy8gKNGB0YLQsNC90LTQsNGA0YLRiyDQv9C10LnQtNC20LjQvdCz0LAg0L7Qv9C40YHRi9Cy0LDRjtGC0YHRjyDRgdGC0YDQsNC90LjRhtC10Lkg0J/QtdC50LTQttC40L3QsylcclxuICBASW5wdXQoKSBwYWdlYWJsZTogYm9vbGVhbjtcclxuXHJcbiAgLy8g0LTQsCBcXCDQvdC10YIgKNC/0YDQuNCy0Y/Qt9Cw0L0g0LvQuCDRhdC10LTQtdGAINC6INC60LDQutC+0Lkt0LvQuNCx0L4g0YLQsNCx0LvQuNGG0LUg0LjQu9C4INC40YHRgtC+0YfQvdC40LrRgyDQtNCw0L3QvdGL0YUpXHJcbiAgQElucHV0KCkgaGFzTWFzdGVyTGlzdDogYm9vbGVhbjtcclxuXHJcbiAgcHVibGljIGNvbnRleHQ6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSBwYWdpbmdFdmVudFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgcm91dGluZ0V2ZW50c1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHBTZXJ2aWNlOiBIdHRwU2VydmljZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcikge1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgc2VsZi5wYWdlYWJsZSA9IHRoaXMuaGFzTWFzdGVyTGlzdCA9IGZhbHNlO1xyXG4gICAgaWYgKHNlbGYucGFnZUl0ZW1zICYmIHNlbGYucGFnZUl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgaWYgKHNlbGYuaXNSb3V0ZUNvbnRhaW5zKHNlbGYucm91dGVyLnVybCwgc2VsZi5wYWdlSXRlbXMpKSB7XHJcbiAgICAgICAgdGhpcy5wYWdlYWJsZSA9IHRoaXMuaGFzTWFzdGVyTGlzdCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgc2VsZi5yb3V0aW5nRXZlbnRzU3Vic2NyaXB0aW9uID0gc2VsZi5yb3V0ZXIuZXZlbnRzXHJcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xyXG5cclxuICAgICAgICAgIGxldCBpc0RldGFpbFBhZ2UgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAoc2VsZi5wYWdlSXRlbXMgJiYgc2VsZi5wYWdlSXRlbXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgc2VsZi5wYWdlSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGl0ZW0uZGV0YWlsUGFnZVVybCAmJiBldmVudC51cmwuaW5kZXhPZihpdGVtLmRldGFpbFBhZ2VVcmwpICE9PSAtMSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlzRGV0YWlsUGFnZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uY29udGV4dCAhPT0gc2VsZi5jb250ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRldGFpbHNQYWdpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldGFpbHNQYWdpbmcuc2V0T3B0aW9ucygpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBpdGVtLmNvbnRleHQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHNlbGYucGFnZWFibGUgPSBzZWxmLmhhc01hc3Rlckxpc3QgPSBpc0RldGFpbFBhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICAgIChlcnIpID0+IHsgY29uc29sZS5lcnJvcihlcnIpOyB9KTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAvLyByZWRpcmVjdCB0byBhcHByb3ByaWF0ZSB1cmxcclxuICAgIHNlbGYucGFnaW5nRXZlbnRTdWJzY3JpcHRpb24gPSBQYWdpbmdTZXJ2aWNlLmN1cnJlbnRNZXNzYWdlXHJcbiAgICAgIC5zdWJzY3JpYmUoKHBhZ2luZ0V2ZW50OiBQYWdpbmdFdmVudCkgPT4ge1xyXG4gICAgICAgIGlmICghcGFnaW5nRXZlbnQgfHwgcGFnaW5nRXZlbnQgPT0gbnVsbCB8fCBwYWdpbmdFdmVudC5oYXNoID09PSAnZW1wdHknKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpbmRleCA9IE1hdGguZmxvb3IocGFnaW5nRXZlbnQuY3VycmVudEluZGV4IC8gcGFnaW5nRXZlbnQuaXRlbXNPblBhZ2UpO1xyXG5cclxuICAgICAgICBpZiAoUGFnaW5nU2VydmljZS5pc0V4aXN0c0hhc2goc2VsZi5jb250ZXh0LCBpbmRleCkpIHtcclxuICAgICAgICAgIC8vIGNvbnN0IGhhc2ggPSBQYWdpbmdTZXJ2aWNlLmdldEhhc2goc2VsZi5jb250ZXh0LCBpbmRleCk7XHJcbiAgICAgICAgICAvLyBwYWdpbmdFdmVudC5oYXNoID0gaGFzaDtcclxuICAgICAgICAgIHNlbGYuY2FsbFN0YXRlQXBpKHBhZ2luZ0V2ZW50KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2VsZi5yZWNhbGxNYXN0ZXJQYWdlTWV0aG9kKHBhZ2luZ0V2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWFzdGVyQ3VycmVudEluZGV4KHBhZ2luZ0V2ZW50OiBQYWdpbmdFdmVudCkge1xyXG5cclxuICAgIGlmIChwYWdpbmdFdmVudC5jdXJyZW50SW5kZXggPT09IDApIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGFnZU5vID0gdGhpcy5nZXRDdXJyZW50UGFnZU5vKHBhZ2luZ0V2ZW50KTtcclxuICAgIGxldCBtYXN0ZXJJbmRleCA9IHBhZ2luZ0V2ZW50LmN1cnJlbnRJbmRleCAtIChwYWdlTm8gLSAxKSAqIHBhZ2luZ0V2ZW50Lml0ZW1zT25QYWdlO1xyXG4gICAgaWYgKG1hc3RlckluZGV4IDwgMCB8fCBtYXN0ZXJJbmRleCA9PT0gcGFnaW5nRXZlbnQuaXRlbXNPblBhZ2UpIHtcclxuICAgICAgbWFzdGVySW5kZXggPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtYXN0ZXJJbmRleDtcclxuICB9XHJcblxyXG4gIGNhbGxTdGF0ZUFwaShwYWdpbmdFdmVudDogUGFnaW5nRXZlbnQpIHtcclxuICAgIGNvbnN0IG1hc3RlckluZGV4ID0gdGhpcy5nZXRNYXN0ZXJDdXJyZW50SW5kZXgocGFnaW5nRXZlbnQpO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdtYXN0ZXJJbmRleCA9ICcgKyBtYXN0ZXJJbmRleCk7XHJcbiAgICBjb25zdCBhcGlNZXRob2QgPSAnYXBpL3N0YXRlL3NlYXJjaFJlc3VsdHMvJyArIHBhZ2luZ0V2ZW50Lmhhc2ggKyAnL2luZGV4LycgKyBtYXN0ZXJJbmRleDtcclxuXHJcbiAgICB0aGlzLmh0dHBTZXJ2aWNlLmh0dHBHZXQoYXBpTWV0aG9kKS5zdWJzY3JpYmUoKGlkKSA9PiB7XHJcbiAgICAgIHRoaXMucmVjYWxsUGFnaW5nRXZlbnQoaWQsIHBhZ2luZ0V2ZW50KTtcclxuICAgIH0sXHJcbiAgICAgIChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlcGxhY2VQYWdlTm8odXJsOiBzdHJpbmcsIHBhZ2VObzogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCByZXN1bHQgPSB1cmw7XHJcbiAgICBjb25zdCByZWdleHAgPSAvcGFnZT1bMC05XSsvZ207XHJcbiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShyZWdleHAsICdwYWdlPScgKyBwYWdlTm8pO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIGdldEN1cnJlbnRQYWdlTm8ocGFnaW5nRXZlbnQ6IFBhZ2luZ0V2ZW50KSB7XHJcbiAgICBjb25zdCBwYWdlTm8gPSBNYXRoLmNlaWwocGFnaW5nRXZlbnQuY3VycmVudEluZGV4IC8gcGFnaW5nRXZlbnQuaXRlbXNPblBhZ2UpO1xyXG4gICAgcmV0dXJuIHBhZ2VObztcclxuICB9XHJcblxyXG4gIHJlY2FsbE1hc3RlclBhZ2VNZXRob2QocGFnaW5nRXZlbnQ6IFBhZ2luZ0V2ZW50KSB7XHJcbiAgICBjb25zdCBwYWdlTm8gPSB0aGlzLmdldEN1cnJlbnRQYWdlTm8ocGFnaW5nRXZlbnQpO1xyXG4gICAgcGFnaW5nRXZlbnQuYXBpQ2FsbC51cmwgPSB0aGlzLnJlcGxhY2VQYWdlTm8ocGFnaW5nRXZlbnQuYXBpQ2FsbC51cmwsIHBhZ2VObyk7XHJcblxyXG4gICAgaWYgKHBhZ2luZ0V2ZW50LmFwaUNhbGwubWV0aG9kID09PSBIdHRwTWV0aG9kLkdFVCkge1xyXG4gICAgICB0aGlzLmh0dHBTZXJ2aWNlLmdldChwYWdpbmdFdmVudC5hcGlDYWxsLnVybCkuc3Vic2NyaWJlKChyZXNwb25zZTogSHR0cFJlc3BvbnNlPE9iamVjdD4pID0+IHtcclxuICAgICAgICBwYWdpbmdFdmVudC5oYXNoID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoQmFzZU1hc3RlckNvbXBvbmVudC5DQUNIRURfSEVBREVSKTtcclxuICAgICAgICBpZiAocGFnaW5nRXZlbnQuaGFzaCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBoYXNoSW5kZXggPSBNYXRoLmZsb29yKHBhZ2luZ0V2ZW50LmN1cnJlbnRJbmRleCAvIHBhZ2luZ0V2ZW50Lml0ZW1zT25QYWdlKTtcclxuICAgICAgICBQYWdpbmdTZXJ2aWNlLmFkZEhhc2godGhpcy5jb250ZXh0LCBoYXNoSW5kZXgsIHBhZ2luZ0V2ZW50Lmhhc2gpO1xyXG4gICAgICAgIHRoaXMuY2FsbFN0YXRlQXBpKHBhZ2luZ0V2ZW50KTtcclxuICAgICAgfSxcclxuICAgICAgICAoZXJyKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAocGFnaW5nRXZlbnQuYXBpQ2FsbC5tZXRob2QgPT09IEh0dHBNZXRob2QuUE9TVCkge1xyXG4gICAgICBwYWdpbmdFdmVudC5hcGlDYWxsLmZpbHRlck1vZGVsLnBhZ2UgPSBwYWdlTm87XHJcbiAgICAgIHRoaXMuaHR0cFNlcnZpY2UucG9zdChwYWdpbmdFdmVudC5hcGlDYWxsLnVybCwgcGFnaW5nRXZlbnQuYXBpQ2FsbC5maWx0ZXJNb2RlbCkuc3Vic2NyaWJlKChyZXNwb25zZTogSHR0cFJlc3BvbnNlPE9iamVjdD4pID0+IHtcclxuICAgICAgICBwYWdpbmdFdmVudC5oYXNoID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoQmFzZU1hc3RlckNvbXBvbmVudC5DQUNIRURfSEVBREVSKTtcclxuICAgICAgICBpZiAocGFnaW5nRXZlbnQuaGFzaCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaGFzaEluZGV4ID0gTWF0aC5mbG9vcihwYWdpbmdFdmVudC5jdXJyZW50SW5kZXggLyBwYWdpbmdFdmVudC5pdGVtc09uUGFnZSk7XHJcbiAgICAgICAgUGFnaW5nU2VydmljZS5hZGRIYXNoKHRoaXMuY29udGV4dCwgaGFzaEluZGV4LCBwYWdpbmdFdmVudC5oYXNoKTtcclxuICAgICAgICB0aGlzLmNhbGxTdGF0ZUFwaShwYWdpbmdFdmVudCk7XHJcbiAgICAgIH0sXHJcbiAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWNhbGxQYWdpbmdFdmVudChpZDogc3RyaW5nLCBwYWdpbmdFdmVudDogUGFnaW5nRXZlbnQpIHtcclxuICAgIHBhZ2luZ0V2ZW50LmN1cnJlbnRJZCA9IGlkO1xyXG4gICAgUGFnaW5nU2VydmljZS5zYXZlVG9Mb2NhbFN0b3JhZ2UocGFnaW5nRXZlbnQpO1xyXG4gICAgY29uc3QgcmVkaXJlY3RVcmwgPSBQYWdpbmdTZXJ2aWNlLmJ1aWxkUmVkaXJlY3RVcmwocGFnaW5nRXZlbnQpO1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChyZWRpcmVjdFVybCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzUm91dGVDb250YWlucyhyb3V0ZVVybDogc3RyaW5nLCBpdGVtczogQXJyYXk8UGFnZVNlbGVjdG9ySXRlbT4pOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcclxuICAgIGl0ZW1zLmZvckVhY2godXJsID0+IHtcclxuICAgICAgaWYgKHVybC5kZXRhaWxQYWdlVXJsICYmIHJvdXRlVXJsLmluZGV4T2YodXJsLmRldGFpbFBhZ2VVcmwpICE9PSAtMSkge1xyXG4gICAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJ1N1YlBhZ2VTZWxlY3RvciBpcyBkZXN0cm95aW5nLi4uJyk7XHJcbiAgICBjb25zdCBwYWdpbmdFdmVudCA9IG5ldyBQYWdpbmdFdmVudCgnZW1wdHknKTtcclxuICAgIFBhZ2luZ1NlcnZpY2UuZmlyZUNsb3NpbmdDb250ZXh0RXZlbnQocGFnaW5nRXZlbnQpO1xyXG4gICAgdGhpcy5wYWdpbmdFdmVudFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5yb3V0aW5nRXZlbnRzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICBjb25zb2xlLmxvZygnU3ViUGFnZVNlbGVjdG9yIGhhcyBiZWVuIGRlc3Ryb3llZC4nKTtcclxuICB9XHJcbn1cclxuIl19