UNPKG

e5core-angular-ui

Version:

e5 Anywhere Angular UI

329 lines 34.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, EventEmitter, Output } from '@angular/core'; import { ListSearchService, TaxonomyFieldDefinitionService } from 'e5core-angular-services'; import { TaxonomyCategory2Service } from 'e5core-angular-services'; import { UiStyleService } from '../../services/ui-style.service'; import { CategorizationPopulationMode } from "../../enums/categorization-population-mode"; export class E5coreUiCategorizationComponent { /** * @param {?} style * @param {?} listService * @param {?} fieldDefinitonServices * @param {?} category2Service */ constructor(style, listService, fieldDefinitonServices, category2Service) { this.style = style; this.listService = listService; this.fieldDefinitonServices = fieldDefinitonServices; this.category2Service = category2Service; this.CATEGORY1_ID = 'Category1_Id'; this.CATEGORY2_ID = 'Category2_Id'; this.CATEGORY3_ID = 'Category3_Id'; this.populationMode = CategorizationPopulationMode.Default; this.categorizationChange = new EventEmitter(); this.defaultComplete = new EventEmitter(); // Child inputs this.cat1List = []; this.cat2List = []; this.cat3List = []; this.cat123 = [0, 0, 0]; this.catLabels = ['Business Area.', 'Product.', 'Category.']; // Locals this.lastCat123 = [0, 0, 0]; } /** * @param {?} cat123 * @return {?} */ set categorization(cat123) { this.SetCategorisationLists(cat123); } /** * @return {?} */ ngOnInit() { this.InitialiseCategorisationLists(this.cat123); this.applyLabels(); } /** * @return {?} */ applyLabels() { if (this.labels && this.labels[0]) { this.catLabels[0] = this.labels[0]; } else { this.fieldDefinitonServices.get('Category1_Id').subscribe(fd => this.catLabels[0] = fd.label); } if (this.labels && this.labels[1]) { this.catLabels[1] = this.labels[1]; } else { this.fieldDefinitonServices.get('Category2_Id').subscribe(fd => this.catLabels[1] = fd.label); } if (this.labels && this.labels[2]) { this.catLabels[2] = this.labels[2]; } else { this.fieldDefinitonServices.get('Category3_Id').subscribe(fd => this.catLabels[2] = fd.label); } } /** * @param {?} $event * @return {?} */ onCategoryChange($event) { if (this.cat123[0] !== this.lastCat123[0]) { // Load new Cat 2, reset cat 3 this.listService.search(this.CATEGORY2_ID, { parentListItemId: this.cat123[0] }).subscribe(cat2List => { this.cat2List = cat2List; }); this.lastCat123 = [this.cat123[0], undefined, undefined]; this.cat123[1] = this.cat123[2] = undefined; this.cat2List = this.cat3List = []; $event.category2Id = $event.category3Id = 0; } if (this.cat123[1] !== this.lastCat123[1]) { // Load new Cat 3 this.listService.search(this.CATEGORY3_ID, { parentListItemId: this.cat123[1] }).subscribe(cat3List => { this.cat3List = cat3List; }); this.lastCat123 = [this.cat123[0], this.cat123[1], undefined]; this.cat123[2] = undefined; this.cat3List = []; } this.EmitCategorizationChangeEvent($event); } /** * @private * @param {?} cat123 * @return {?} */ loadCategorization1(cat123) { this.lastCat123 = [...cat123]; if (cat123 && cat123.length >= 1 && +(cat123[0]) !== 0) { // Load the Category 1 and select it this.listService.search(this.CATEGORY1_ID, {}).subscribe(catList => { /** @type {?} */ const cat = catList.find(c => +c.id === cat123[0]); if (cat) { this.cat1List = catList; this.cat123 = [cat123[0], 0, 0]; this.loadCategorization2(cat123, cat123[0]); } else { this.cat1List = this.cat2List = this.cat3List = []; this.cat123 = [0, 0, 0]; } }); } } /** * @private * @param {?} cat123 * @param {?} parentId * @return {?} */ loadCategorization2(cat123, parentId) { if (cat123 && cat123.length >= 2 && +(cat123[1]) !== 0) { // Load the Category 2 and select it this.listService.search(this.CATEGORY2_ID, { parentListItemId: parentId }).subscribe(catList => { /** @type {?} */ const cat = catList.find(c => +c.id === cat123[1]); this.cat2List = catList; if (cat) { this.cat123 = [cat123[0], cat123[1], 0]; this.loadCategorization3(cat123, cat123[1]); } else { this.cat3List = []; this.cat123 = [cat123[0], 0, 0]; } }); } } /** * @private * @param {?} cat123 * @param {?} parentId * @return {?} */ loadCategorization3(cat123, parentId) { if (cat123 && cat123.length >= 3 && +(cat123[2]) !== 0) { // Load the Category 3 and select it this.listService.search(this.CATEGORY3_ID, { parentListItemId: parentId }).subscribe(catList => { /** @type {?} */ const cat = catList.find(c => +c.id === cat123[2]); this.cat3List = catList; if (cat) { this.cat123 = [cat123[0], cat123[1], cat123[2]]; } else { this.cat123 = [cat123[0], cat123[1], 0]; } }); } } /** * @private * @param {?} cat123 * @param {?} event * @return {?} */ getCategory1(cat123, event) { // Get the Category1 Id using the Category2 this.category2Service.get(cat123[1], 0).subscribe(cat => { if (cat) { this.cat123 = [cat.category1Id, cat123[1], cat123[2]]; } else { this.cat123 = [cat123[0], cat123[1], cat123[2]]; } this.lastCat123 = [...this.cat123]; event.category1Id = cat.category1Id; this.categorizationChange.emit(event); }); } /** * @private * @param {?} cat123 * @return {?} */ InitialiseCategorisationLists(cat123) { switch (this.populationMode) { case CategorizationPopulationMode.PopulateAllLevel2: this.hideToLevel = 1; this.cat123[0] = 0; this.lastCat123 = [...cat123]; this.listService.search(this.CATEGORY2_ID).subscribe(list => { this.cat2List = list; }); break; case CategorizationPopulationMode.Default: this.listService.search(this.CATEGORY1_ID).subscribe(list => { this.cat1List = list; }); break; } } /** * @private * @param {?} cat123 * @return {?} */ SetCategorisationLists(cat123) { switch (this.populationMode) { case CategorizationPopulationMode.PopulateAllLevel2: this.loadCategorization2(cat123, 0); break; case CategorizationPopulationMode.Default: this.loadCategorization1(cat123); break; } } /** * @private * @param {?} event * @return {?} */ EmitCategorizationChangeEvent(event) { switch (this.populationMode) { case CategorizationPopulationMode.PopulateAllLevel2: if (this.cat123[2] !== this.lastCat123[2]) { this.getCategory1(this.cat123, event); } break; case CategorizationPopulationMode.Default: if (this.cat123[2] !== this.lastCat123[2] && this.cat123[2] !== 0) { this.categorizationChange.emit(event); } break; } } } E5coreUiCategorizationComponent.decorators = [ { type: Component, args: [{ selector: 'e5core-ui-categorization', template: ` <span [ngSwitch]="style.current()"> <e5core-ui-categorization-box *ngSwitchCase='0' ></e5core-ui-categorization-box> <e5core-ui-categorization-bootstrap *ngSwitchCase='1' ></e5core-ui-categorization-bootstrap> <e5core-ui-categorization-material *ngSwitchCase='2' [hideToLevel]='hideToLevel' [categorization]='cat123' [labels]='catLabels' [readonly]='readonly' [cat1List]='cat1List' [cat2List]='cat2List' [cat3List]='cat3List' (catChange)='onCategoryChange($event)'></e5core-ui-categorization-material> </span>` }] } ]; /** @nocollapse */ E5coreUiCategorizationComponent.ctorParameters = () => [ { type: UiStyleService }, { type: ListSearchService }, { type: TaxonomyFieldDefinitionService }, { type: TaxonomyCategory2Service } ]; E5coreUiCategorizationComponent.propDecorators = { hideToLevel: [{ type: Input }], labels: [{ type: Input }], readonly: [{ type: Input }], populationMode: [{ type: Input }], categorizationChange: [{ type: Output }], defaultComplete: [{ type: Output }], categorization: [{ type: Input }] }; if (false) { /** @type {?} */ E5coreUiCategorizationComponent.prototype.CATEGORY1_ID; /** @type {?} */ E5coreUiCategorizationComponent.prototype.CATEGORY2_ID; /** @type {?} */ E5coreUiCategorizationComponent.prototype.CATEGORY3_ID; /** @type {?} */ E5coreUiCategorizationComponent.prototype.hideToLevel; /** @type {?} */ E5coreUiCategorizationComponent.prototype.labels; /** @type {?} */ E5coreUiCategorizationComponent.prototype.readonly; /** @type {?} */ E5coreUiCategorizationComponent.prototype.populationMode; /** @type {?} */ E5coreUiCategorizationComponent.prototype.categorizationChange; /** @type {?} */ E5coreUiCategorizationComponent.prototype.defaultComplete; /** @type {?} */ E5coreUiCategorizationComponent.prototype.cat1List; /** @type {?} */ E5coreUiCategorizationComponent.prototype.cat2List; /** @type {?} */ E5coreUiCategorizationComponent.prototype.cat3List; /** @type {?} */ E5coreUiCategorizationComponent.prototype.cat123; /** @type {?} */ E5coreUiCategorizationComponent.prototype.catLabels; /** @type {?} */ E5coreUiCategorizationComponent.prototype.lastCat123; /** @type {?} */ E5coreUiCategorizationComponent.prototype.style; /** * @type {?} * @private */ E5coreUiCategorizationComponent.prototype.listService; /** * @type {?} * @private */ E5coreUiCategorizationComponent.prototype.fieldDefinitonServices; /** * @type {?} * @private */ E5coreUiCategorizationComponent.prototype.category2Service; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZTVjb3JlLXVpLWNhdGVnb3JpemF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2U1Y29yZS1hbmd1bGFyLXVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvZTVjb3JlLXVpLWNhdGVnb3JpemF0aW9uL2U1Y29yZS11aS1jYXRlZ29yaXphdGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUFFLGlCQUFpQixFQUFpQiw4QkFBOEIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNHLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQWlCMUYsTUFBTSxPQUFPLCtCQUErQjs7Ozs7OztJQXlCeEMsWUFBbUIsS0FBcUIsRUFBVSxXQUE4QixFQUNwRSxzQkFBc0QsRUFDdEQsZ0JBQTBDO1FBRm5DLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQW1CO1FBQ3BFLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBZ0M7UUFDdEQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUEwQjtRQXpCN0MsaUJBQVksR0FBRyxjQUFjLENBQUM7UUFDOUIsaUJBQVksR0FBRyxjQUFjLENBQUM7UUFDOUIsaUJBQVksR0FBRyxjQUFjLENBQUM7UUFLOUIsbUJBQWMsR0FBRyw0QkFBNEIsQ0FBQyxPQUFPLENBQUM7UUFDckQseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQTZCLENBQUM7UUFDckUsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBNkIsQ0FBQzs7UUFLMUUsYUFBUSxHQUFvQixF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SUFDNUUsaUVBQThEOzs7OztJQUM5RCwyREFBa0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIEV2ZW50RW1pdHRlciwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDYXRlZ29yaXphdGlvbkNoYW5nZUV2ZW50IH0gZnJvbSAnLi4vLi4vZXZlbnRzL2NhdGVnb3JpemF0aW9uLWNoYW5nZS1ldmVudCc7XG5pbXBvcnQgeyBMaXN0U2VhcmNoU2VydmljZSwgTGlzdEl0ZW1Nb2RlbCwgVGF4b25vbXlGaWVsZERlZmluaXRpb25TZXJ2aWNlIH0gZnJvbSAnZTVjb3JlLWFuZ3VsYXItc2VydmljZXMnO1xuaW1wb3J0IHsgVGF4b25vbXlDYXRlZ29yeTJTZXJ2aWNlIH0gZnJvbSAnZTVjb3JlLWFuZ3VsYXItc2VydmljZXMnO1xuaW1wb3J0IHsgVWlTdHlsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy91aS1zdHlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IENhdGVnb3JpemF0aW9uUG9wdWxhdGlvbk1vZGUgfSBmcm9tIFwiLi4vLi4vZW51bXMvY2F0ZWdvcml6YXRpb24tcG9wdWxhdGlvbi1tb2RlXCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZTVjb3JlLXVpLWNhdGVnb3JpemF0aW9uJyxcbiAgICB0ZW1wbGF0ZTogYFxuICA8c3BhbiBbbmdTd2l0Y2hdPVwic3R5bGUuY3VycmVudCgpXCI+XG4gICAgPGU1Y29yZS11aS1jYXRlZ29yaXphdGlvbi1ib3ggKm5nU3dpdGNoQ2FzZT0nMCcgPjwvZTVjb3JlLXVpLWNhdGVnb3JpemF0aW9uLWJveD5cbiAgICA8ZTVjb3JlLXVpLWNhdGVnb3JpemF0aW9uLWJvb3RzdHJhcCAqbmdTd2l0Y2hDYXNlPScxJyA+PC9lNWNvcmUtdWktY2F0ZWdvcml6YXRpb24tYm9vdHN0cmFwPlxuXHQ8ZTVjb3JlLXVpLWNhdGVnb3JpemF0aW9uLW1hdGVyaWFsICpuZ1N3aXRjaENhc2U9JzInXG5cdFx0W2hpZGVUb0xldmVsXT0naGlkZVRvTGV2ZWwnXG5cdFx0W2NhdGVnb3JpemF0aW9uXT0nY2F0MTIzJ1xuXHRcdFtsYWJlbHNdPSdjYXRMYWJlbHMnXG5cdFx0W3JlYWRvbmx5XT0ncmVhZG9ubHknXG5cdFx0W2NhdDFMaXN0XT0nY2F0MUxpc3QnIFtjYXQyTGlzdF09J2NhdDJMaXN0JyBbY2F0M0xpc3RdPSdjYXQzTGlzdCdcblx0XHQoY2F0Q2hhbmdlKT0nb25DYXRlZ29yeUNoYW5nZSgkZXZlbnQpJz48L2U1Y29yZS11aS1jYXRlZ29yaXphdGlvbi1tYXRlcmlhbD5cbiAgPC9zcGFuPmBcbn0pXG5leHBvcnQgY2xhc3MgRTVjb3JlVWlDYXRlZ29yaXphdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICByZWFkb25seSBDQVRFR09SWTFfSUQgPSAnQ2F0ZWdvcnkxX0lkJztcbiAgICByZWFkb25seSBDQVRFR09SWTJfSUQgPSAnQ2F0ZWdvcnkyX0lkJztcbiAgICByZWFkb25seSBDQVRFR09SWTNfSUQgPSAnQ2F0ZWdvcnkzX0lkJztcblxuICAgIEBJbnB1dCgpIGhpZGVUb0xldmVsOiBudW1iZXI7XG4gICAgQElucHV0KCkgbGFiZWxzOiBzdHJpbmdbXTtcbiAgICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwb3B1bGF0aW9uTW9kZSA9IENhdGVnb3JpemF0aW9uUG9wdWxhdGlvbk1vZGUuRGVmYXVsdDtcbiAgICBAT3V0cHV0KCkgY2F0ZWdvcml6YXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENhdGVnb3JpemF0aW9uQ2hhbmdlRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgpIGRlZmF1bHRDb21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2F0ZWdvcml6YXRpb25DaGFuZ2VFdmVudD4oKTtcbiAgICBASW5wdXQoKSBzZXQgY2F0ZWdvcml6YXRpb24oY2F0MTIzOiBudW1iZXJbXSkge1xuICAgICAgICB0aGlzLlNldENhdGVnb3Jpc2F0aW9uTGlzdHMoY2F0MTIzKTtcbiAgICB9XG4gICAgLy8gQ2hpbGQgaW5wdXRzXG4gICAgY2F0MUxpc3Q6IExpc3RJdGVtTW9kZWxbXSA9IFtdO1xuICAgIGNhdDJMaXN0OiBMaXN0SXRlbU1vZGVsW10gPSBbXTtcbiAgICBjYXQzTGlzdDogTGlzdEl0ZW1Nb2RlbFtdID0gW107XG4gICAgY2F0MTIzOiBudW1iZXJbXSA9IFswLCAwLCAwXTtcbiAgICBjYXRMYWJlbHM6IHN0cmluZ1tdID0gWydCdXNpbmVzcyBBcmVhLicsICdQcm9kdWN0LicsICdDYXRlZ29yeS4nXTtcblxuICAgIC8vIExvY2Fsc1xuICAgIGxhc3RDYXQxMjM6IG51bWJlcltdID0gWzAsIDAsIDBdO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHN0eWxlOiBVaVN0eWxlU2VydmljZSwgcHJpdmF0ZSBsaXN0U2VydmljZTogTGlzdFNlYXJjaFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZmllbGREZWZpbml0b25TZXJ2aWNlczogVGF4b25vbXlGaWVsZERlZmluaXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNhdGVnb3J5MlNlcnZpY2U6IFRheG9ub215Q2F0ZWdvcnkyU2VydmljZSkgeyB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5Jbml0aWFsaXNlQ2F0ZWdvcmlzYXRpb25MaXN0cyh0aGlzLmNhdDEyMyk7XG4gICAgICAgIHRoaXMuYXBwbHlMYWJlbHMoKTtcbiAgICB9XG5cbiAgICBhcHBseUxhYmVscygpIHtcbiAgICAgICAgaWYgKHRoaXMubGFiZWxzICYmIHRoaXMubGFiZWxzWzBdKSB7XG4gICAgICAgICAgICB0aGlzLmNhdExhYmVsc1swXSA9IHRoaXMubGFiZWxzWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5maWVsZERlZmluaXRvblNlcnZpY2VzLmdldCgnQ2F0ZWdvcnkxX0lkJykuc3Vic2NyaWJlKGZkID0+IHRoaXMuY2F0TGFiZWxzWzBdID0gZmQubGFiZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGFiZWxzICYmIHRoaXMubGFiZWxzWzFdKSB7XG4gICAgICAgICAgICB0aGlzLmNhdExhYmVsc1sxXSA9IHRoaXMubGFiZWxzWzFdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5maWVsZERlZmluaXRvblNlcnZpY2VzLmdldCgnQ2F0ZWdvcnkyX0lkJykuc3Vic2NyaWJlKGZkID0+IHRoaXMuY2F0TGFiZWxzWzFdID0gZmQubGFiZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGFiZWxzICYmIHRoaXMubGFiZWxzWzJdKSB7XG4gICAgICAgICAgICB0aGlzLmNhdExhYmVsc1syXSA9IHRoaXMubGFiZWxzWzJdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5maWVsZERlZmluaXRvblNlcnZpY2VzLmdldCgnQ2F0ZWdvcnkzX0lkJykuc3Vic2NyaWJlKGZkID0+IHRoaXMuY2F0TGFiZWxzWzJdID0gZmQubGFiZWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DYXRlZ29yeUNoYW5nZSgkZXZlbnQ6IENhdGVnb3JpemF0aW9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuY2F0MTIzWzBdICE9PSB0aGlzLmxhc3RDYXQxMjNbMF0pIHtcbiAgICAgICAgICAgIC8vIExvYWQgbmV3IENhdCAyLCByZXNldCBjYXQgM1xuICAgICAgICAgICAgdGhpcy5saXN0U2VydmljZS5zZWFyY2godGhpcy5DQVRFR09SWTJfSUQsIHsgcGFyZW50TGlzdEl0ZW1JZDogdGhpcy5jYXQxMjNbMF0gfSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIGNhdDJMaXN0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXQyTGlzdCA9IGNhdDJMaXN0O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5sYXN0Q2F0MTIzID0gW3RoaXMuY2F0MTIzWzBdLCB1bmRlZmluZWQsIHVuZGVmaW5lZF07XG4gICAgICAgICAgICB0aGlzLmNhdDEyM1sxXSA9IHRoaXMuY2F0MTIzWzJdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5jYXQyTGlzdCA9IHRoaXMuY2F0M0xpc3QgPSBbXTtcbiAgICAgICAgICAgICRldmVudC5jYXRlZ29yeTJJZCA9ICRldmVudC5jYXRlZ29yeTNJZCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2F0MTIzWzFdICE9PSB0aGlzLmxhc3RDYXQxMjNbMV0pIHtcbiAgICAgICAgICAgIC8vIExvYWQgbmV3IENhdCAzXG4gICAgICAgICAgICB0aGlzLmxpc3RTZXJ2aWNlLnNlYXJjaCh0aGlzLkNBVEVHT1JZM19JRCwgeyBwYXJlbnRMaXN0SXRlbUlkOiB0aGlzLmNhdDEyM1sxXSB9KS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgY2F0M0xpc3QgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdDNMaXN0ID0gY2F0M0xpc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMubGFzdENhdDEyMyA9IFt0aGlzLmNhdDEyM1swXSwgdGhpcy5jYXQxMjNbMV0sIHVuZGVmaW5lZF07XG4gICAgICAgICAgICB0aGlzLmNhdDEyM1syXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuY2F0M0xpc3QgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuRW1pdENhdGVnb3JpemF0aW9uQ2hhbmdlRXZlbnQoJGV2ZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRDYXRlZ29yaXphdGlvbjEoY2F0MTIzOiBudW1iZXJbXSkge1xuICAgICAgICB0aGlzLmxhc3RDYXQxMjMgPSBbLi4uY2F0MTIzXTtcbiAgICAgICAgaWYgKGNhdDEyMyAmJiBjYXQxMjMubGVuZ3RoID49IDEgJiYgKyhjYXQxMjNbMF0pICE9PSAwKSB7XG4gICAgICAgICAgICAvLyBMb2FkIHRoZSBDYXRlZ29yeSAxIGFuZCBzZWxlY3QgaXRcbiAgICAgICAgICAgIHRoaXMubGlzdFNlcnZpY2Uuc2VhcmNoKHRoaXMuQ0FURUdPUlkxX0lELCB7fSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIGNhdExpc3QgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXQgPSBjYXRMaXN0LmZpbmQoYyA9PiArYy5pZCA9PT0gY2F0MTIzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXQxTGlzdCA9IGNhdExpc3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdDEyMyA9IFtjYXQxMjNbMF0sIDAsIDBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkQ2F0ZWdvcml6YXRpb24yKGNhdDEyMywgY2F0MTIzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0MUxpc3QgPSB0aGlzLmNhdDJMaXN0ID0gdGhpcy5jYXQzTGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXQxMjMgPSBbMCwgMCwgMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkQ2F0ZWdvcml6YXRpb24yKGNhdDEyMzogbnVtYmVyW10sIHBhcmVudElkOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKGNhdDEyMyAmJiBjYXQxMjMubGVuZ3RoID49IDIgJiYgKyhjYXQxMjNbMV0pICE9PSAwKSB7XG4gICAgICAgICAgICAvLyBMb2FkIHRoZSBDYXRlZ29yeSAyIGFuZCBzZWxlY3QgaXRcbiAgICAgICAgICAgIHRoaXMubGlzdFNlcnZpY2Uuc2VhcmNoKHRoaXMuQ0FURUdPUlkyX0lELCB7IHBhcmVudExpc3RJdGVtSWQ6IHBhcmVudElkIH0pLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICBjYXRMaXN0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2F0ID0gY2F0TGlzdC5maW5kKGMgPT4gK2MuaWQgPT09IGNhdDEyM1sxXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0Mkxpc3QgPSBjYXRMaXN0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2F0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdDEyMyA9IFtjYXQxMjNbMF0sIGNhdDEyM1sxXSwgMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRDYXRlZ29yaXphdGlvbjMoY2F0MTIzLCBjYXQxMjNbMV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXQzTGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXQxMjMgPSBbY2F0MTIzWzBdLCAwLCAwXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRDYXRlZ29yaXphdGlvbjMoY2F0MTIzOiBudW1iZXJbXSwgcGFyZW50SWQ6IG51bWJlcikge1xuICAgICAgICBpZiAoY2F0MTIzICYmIGNhdDEyMy5sZW5ndGggPj0gMyAmJiArKGNhdDEyM1syXSkgIT09IDApIHtcbiAgICAgICAgICAgIC8vIExvYWQgdGhlIENhdGVnb3J5IDMgYW5kIHNlbGVjdCBpdFxuICAgICAgICAgICAgdGhpcy5saXN0U2VydmljZS5zZWFyY2godGhpcy5DQVRFR09SWTNfSUQsIHsgcGFyZW50TGlzdEl0ZW1JZDogcGFyZW50SWQgfSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIGNhdExpc3QgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXQgPSBjYXRMaXN0LmZpbmQoYyA9PiArYy5pZCA9PT0gY2F0MTIzWzJdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXQzTGlzdCA9IGNhdExpc3Q7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0MTIzID0gW2NhdDEyM1swXSwgY2F0MTIzWzFdLCBjYXQxMjNbMl1dO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXQxMjMgPSBbY2F0MTIzWzBdLCBjYXQxMjNbMV0sIDBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q2F0ZWdvcnkxKGNhdDEyMzogbnVtYmVyW10sIGV2ZW50OiBDYXRlZ29yaXphdGlvbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIC8vIEdldCB0aGUgQ2F0ZWdvcnkxIElkIHVzaW5nIHRoZSBDYXRlZ29yeTJcbiAgICAgICAgdGhpcy5jYXRlZ29yeTJTZXJ2aWNlLmdldChjYXQxMjNbMV0sIDApLnN1YnNjcmliZShcbiAgICAgICAgICAgIGNhdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNhdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdDEyMyA9IFtjYXQuY2F0ZWdvcnkxSWQsIGNhdDEyM1sxXSwgY2F0MTIzWzJdXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdDEyMyA9IFtjYXQxMjNbMF0sIGNhdDEyM1sxXSwgY2F0MTIzWzJdXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0Q2F0MTIzID0gWy4uLnRoaXMuY2F0MTIzXTtcbiAgICAgICAgICAgICAgICBldmVudC5jYXRlZ29yeTFJZCA9IGNhdC5jYXRlZ29yeTFJZDtcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3JpemF0aW9uQ2hhbmdlLmVtaXQoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgSW5pdGlhbGlzZUNhdGVnb3Jpc2F0aW9uTGlzdHMoY2F0MTIzOiBudW1iZXJbXSkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucG9wdWxhdGlvbk1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgQ2F0ZWdvcml6YXRpb25Qb3B1bGF0aW9uTW9kZS5Qb3B1bGF0ZUFsbExldmVsMjpcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVUb0xldmVsID0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhdDEyM1swXSA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0Q2F0MTIzID0gWy4uLmNhdDEyM107XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0U2VydmljZS5zZWFyY2godGhpcy5DQVRFR09SWTJfSUQpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgbGlzdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdDJMaXN0ID0gbGlzdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENhdGVnb3JpemF0aW9uUG9wdWxhdGlvbk1vZGUuRGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RTZXJ2aWNlLnNlYXJjaCh0aGlzLkNBVEVHT1JZMV9JRCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICBsaXN0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0MUxpc3QgPSBsaXN0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgU2V0Q2F0ZWdvcmlzYXRpb25MaXN0cyhjYXQxMjM6IG51bWJlcltdKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wb3B1bGF0aW9uTW9kZSkge1xuICAgICAgICAgICAgY2FzZSBDYXRlZ29yaXphdGlvblBvcHVsYXRpb25Nb2RlLlBvcHVsYXRlQWxsTGV2ZWwyOlxuICAgICAgICAgICAgICAgIHRoaXMubG9hZENhdGVnb3JpemF0aW9uMihjYXQxMjMsIDApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYXRlZ29yaXphdGlvblBvcHVsYXRpb25Nb2RlLkRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkQ2F0ZWdvcml6YXRpb24xKGNhdDEyMyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIEVtaXRDYXRlZ29yaXphdGlvbkNoYW5nZUV2ZW50KGV2ZW50OiBDYXRlZ29yaXphdGlvbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wb3B1bGF0aW9uTW9kZSkge1xuICAgICAgICAgICAgY2FzZSBDYXRlZ29yaXphdGlvblBvcHVsYXRpb25Nb2RlLlBvcHVsYXRlQWxsTGV2ZWwyOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhdDEyM1syXSAhPT0gdGhpcy5sYXN0Q2F0MTIzWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2F0ZWdvcnkxKHRoaXMuY2F0MTIzLCBldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYXRlZ29yaXphdGlvblBvcHVsYXRpb25Nb2RlLkRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2F0MTIzWzJdICE9PSB0aGlzLmxhc3RDYXQxMjNbMl0gJiYgdGhpcy5jYXQxMjNbMl0gIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yaXphdGlvbkNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgIH1cblxufVxuIl19