ng-zenduit 1.0.43 → 1.0.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -54,7 +54,7 @@ export class ZenduPaginationBarComponent {
54
54
  }
55
55
  }
56
56
  ZenduPaginationBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduPaginationBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
57
- ZenduPaginationBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduPaginationBarComponent, selector: "zen-pagination-bar", inputs: { page: "page", perPage: "perPage", count: "count" }, outputs: { pageChange: "pageChange", perPageChange: "perPageChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"pagination-component\">\n <div class=\"select-dropdown\">\n <label>{{\"Rows per page\" | translate}}:</label>\n <zen-select [(selectModel)]=\"perPage\"\n [options]=\"availablePagesSize\"\n (selectModelChange)=\"updatePageSize()\"></zen-select>\n </div>\n <div class=\"pages\">\n <button class=\"pagination-button\"\n [disabled]=\"page - 1 <= 0\"\n (click)=\"prevPage()\">\n <i class=\"material-icons\">keyboard_arrow_left</i>\n </button>\n <label>{{((page - 1) * perPage) + 1 }} - {{endRowSize()}} of {{count}}</label>\n <button class=\"pagination-button\"\n [disabled]=\"page + 1 > totalPages\"\n (click)=\"nextPage()\">\n <i class=\"material-icons\">keyboard_arrow_right</i>\n </button>\n </div>\n</div>\n", styles: [".pagination-component{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.pagination-component .select-dropdown{display:flex;flex-direction:row;align-items:center;gap:8px}.pagination-component .select-dropdown label{margin:0;font-style:normal;font-weight:400;font-size:12px;line-height:120%;color:#4f4f4f}.pagination-component .pages{display:flex;flex-direction:row;align-items:center;gap:8px}.pagination-component .pages label{margin:0;font-style:normal;font-weight:400;font-size:12px;line-height:16px;color:#828282}.pagination-component .pages .pagination-button{display:flex;flex-direction:row;align-items:center;height:16px;padding:0;box-sizing:border-box;white-space:nowrap;border:none;border-radius:50%;transition:.1s;cursor:pointer;color:#828282;background:#FFFFFF}.pagination-component .pages .pagination-button:hover{color:#4f4f4f;background:#F2F2F2}.pagination-component .pages .pagination-button:focus{outline:none;color:#2188d9;background:#F4F9FD}.pagination-component .pages .pagination-button:disabled{color:#e0e0e0;background:#FFFFFF;cursor:not-allowed}.pagination-component .pages .pagination-button .material-icons{font-size:16px;height:16px;width:16px}\n"], dependencies: [{ kind: "component", type: i1.ZenduSelectComponent, selector: "zen-select", inputs: ["selectModel", "options", "placeholder", "displayProp", "idProp", "hasSearch", "returnOption", "isMultiselect", "disabled", "customIcon", "customIconColor", "isTruncate", "enableAddNewOption", "newOptionText", "enableRemoveOption", "removeOptionText", "isLazyLoading", "lazyLoader"], outputs: ["selectModelChange", "addNewOption", "removeOption"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
57
+ ZenduPaginationBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduPaginationBarComponent, selector: "zen-pagination-bar", inputs: { page: "page", perPage: "perPage", count: "count" }, outputs: { pageChange: "pageChange", perPageChange: "perPageChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"pagination-component\">\n <div class=\"select-dropdown\">\n <label>{{\"Rows per page\" | translate}}:</label>\n <zen-select [(selectModel)]=\"perPage\"\n [options]=\"availablePagesSize\"\n (selectModelChange)=\"updatePageSize()\"></zen-select>\n </div>\n <div class=\"pages\">\n <button class=\"pagination-button\"\n [disabled]=\"page - 1 <= 0\"\n (click)=\"prevPage()\">\n <i class=\"material-icons\">keyboard_arrow_left</i>\n </button>\n <label>{{((page - 1) * perPage) + 1 }} - {{endRowSize()}} of {{count}}</label>\n <button class=\"pagination-button\"\n [disabled]=\"page + 1 > totalPages\"\n (click)=\"nextPage()\">\n <i class=\"material-icons\">keyboard_arrow_right</i>\n </button>\n </div>\n</div>\n", styles: [".pagination-component{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.pagination-component .select-dropdown{display:flex;flex-direction:row;align-items:center;gap:8px}.pagination-component .select-dropdown label{margin:0;font-style:normal;font-weight:400;font-size:12px;line-height:120%;color:#4f4f4f}.pagination-component .pages{display:flex;flex-direction:row;align-items:center;gap:8px}.pagination-component .pages label{margin:0;font-style:normal;font-weight:400;font-size:12px;line-height:16px;color:#828282}.pagination-component .pages .pagination-button{display:flex;flex-direction:row;align-items:center;height:16px;padding:0;box-sizing:border-box;white-space:nowrap;border:none;border-radius:50%;transition:.1s;cursor:pointer;color:#828282;background:#FFFFFF}.pagination-component .pages .pagination-button:hover{color:#4f4f4f;background:#F2F2F2}.pagination-component .pages .pagination-button:focus{outline:none;color:#2188d9;background:#F4F9FD}.pagination-component .pages .pagination-button:disabled{color:#e0e0e0;background:#FFFFFF;cursor:not-allowed}.pagination-component .pages .pagination-button .material-icons{font-size:16px;height:16px;width:16px}\n"], dependencies: [{ kind: "component", type: i1.ZenduSelectComponent, selector: "zen-select", inputs: ["selectModel", "options", "placeholder", "displayProp", "idProp", "hasSearch", "returnOption", "isMultiselect", "disabled", "customIcon", "customIconColor", "isTruncate", "enableAddNewOption", "newOptionText", "enableRemoveOption", "removeOptionText", "isLazyLoading", "lazyLoader"], outputs: ["selectModelChange", "addNewOption", "removeOption", "closed"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
58
58
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduPaginationBarComponent, decorators: [{
59
59
  type: Component,
60
60
  args: [{ selector: 'zen-pagination-bar', template: "<div class=\"pagination-component\">\n <div class=\"select-dropdown\">\n <label>{{\"Rows per page\" | translate}}:</label>\n <zen-select [(selectModel)]=\"perPage\"\n [options]=\"availablePagesSize\"\n (selectModelChange)=\"updatePageSize()\"></zen-select>\n </div>\n <div class=\"pages\">\n <button class=\"pagination-button\"\n [disabled]=\"page - 1 <= 0\"\n (click)=\"prevPage()\">\n <i class=\"material-icons\">keyboard_arrow_left</i>\n </button>\n <label>{{((page - 1) * perPage) + 1 }} - {{endRowSize()}} of {{count}}</label>\n <button class=\"pagination-button\"\n [disabled]=\"page + 1 > totalPages\"\n (click)=\"nextPage()\">\n <i class=\"material-icons\">keyboard_arrow_right</i>\n </button>\n </div>\n</div>\n", styles: [".pagination-component{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.pagination-component .select-dropdown{display:flex;flex-direction:row;align-items:center;gap:8px}.pagination-component .select-dropdown label{margin:0;font-style:normal;font-weight:400;font-size:12px;line-height:120%;color:#4f4f4f}.pagination-component .pages{display:flex;flex-direction:row;align-items:center;gap:8px}.pagination-component .pages label{margin:0;font-style:normal;font-weight:400;font-size:12px;line-height:16px;color:#828282}.pagination-component .pages .pagination-button{display:flex;flex-direction:row;align-items:center;height:16px;padding:0;box-sizing:border-box;white-space:nowrap;border:none;border-radius:50%;transition:.1s;cursor:pointer;color:#828282;background:#FFFFFF}.pagination-component .pages .pagination-button:hover{color:#4f4f4f;background:#F2F2F2}.pagination-component .pages .pagination-button:focus{outline:none;color:#2188d9;background:#F4F9FD}.pagination-component .pages .pagination-button:disabled{color:#e0e0e0;background:#FFFFFF;cursor:not-allowed}.pagination-component .pages .pagination-button .material-icons{font-size:16px;height:16px;width:16px}\n"] }]
@@ -59,6 +59,10 @@ export class ZenduSelectComponent {
59
59
  * Emit event when remove Option is clicked
60
60
  */
61
61
  this.removeOption = new EventEmitter();
62
+ /**
63
+ * Emit event when select is closed, sending the selected data
64
+ */
65
+ this.closed = new EventEmitter();
62
66
  /**
63
67
  * Is dropdown expanded
64
68
  */
@@ -284,6 +288,7 @@ export class ZenduSelectComponent {
284
288
  }
285
289
  async hideDropDown() {
286
290
  this.isExpanded = false;
291
+ this.closed.emit(this.selectModel);
287
292
  }
288
293
  emitChange() {
289
294
  // notify with timeout
@@ -367,10 +372,10 @@ export class ZenduSelectComponent {
367
372
  }
368
373
  }
369
374
  ZenduSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduSelectComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
370
- ZenduSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduSelectComponent, selector: "zen-select", inputs: { selectModel: "selectModel", options: "options", placeholder: "placeholder", displayProp: "displayProp", idProp: "idProp", hasSearch: "hasSearch", returnOption: "returnOption", isMultiselect: "isMultiselect", disabled: "disabled", customIcon: "customIcon", customIconColor: "customIconColor", isTruncate: "isTruncate", enableAddNewOption: "enableAddNewOption", newOptionText: "newOptionText", enableRemoveOption: "enableRemoveOption", removeOptionText: "removeOptionText", isLazyLoading: "isLazyLoading", lazyLoader: "lazyLoader" }, outputs: { selectModelChange: "selectModelChange", addNewOption: "addNewOption", removeOption: "removeOption" }, host: { listeners: { "window:mousedown": "outsideHandling($event)", "window:scroll": "scroll()" } }, queries: [{ propertyName: "optionTemplate", first: true, predicate: ZenduSelectOptionDirective, descendants: true }, { propertyName: "valueTemplate", first: true, predicate: ZenduSelectValueDirective, descendants: true }, { propertyName: "buttonTemplate", first: true, predicate: ZenduSelectButtonDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"app-select\">\n <button class=\"app-select-toggle\"\n [disabled]=\"disabled\"\n (click)=\"toggleExpand()\"\n [ngClass]=\"{'active': isExpanded}\">\n <div class=\"app-select-label\">\n <div class=\"placeholder\"\n *ngIf=\"isModelEmpty()\">\n <span>{{placeholder | translate}}</span>\n </div>\n <div class=\"selected-item\"\n *ngIf=\"!isMultiselect && !isModelEmpty()\">\n <ng-template *ngIf=\"valueTemplate && selectModel[0]; else tplValueText\"\n [ngTemplateOutlet]=\"valueTemplate.template\"\n [ngTemplateOutletContext]=\"{ selectModel: selectModel, labelText: labelText }\"></ng-template>\n <ng-template #tplValueText>\n <span>{{ labelText | translate }}</span>\n </ng-template>\n </div>\n <div class=\"selected-item\"\n *ngIf=\"isMultiselect && !isModelEmpty()\">\n <span>{{ labelText | translate }}</span>\n </div>\n </div>\n <i *ngIf=\"!customIcon\"\n class=\"material-icons app-select-icon\">expand_more</i>\n <i *ngIf=\"customIcon\"\n class=\"material-icons-outlined custom-icon\"\n [style.color]=\"customIconColor\">{{customIcon}}</i>\n </button>\n\n <div class=\"action-menu-container\">\n <div class=\"action-menu app-select-dropdown-wrapper\"\n [ngClass]=\"{ 'show-top': isTopMenuDirection }\">\n <div class=\"app-select-dropdown\"\n *ngIf=\"isExpanded\">\n <div class=\"action-menu-header\"\n *ngIf=\"hasSearch\">\n <!--Search options-->\n <div class=\"search-wrapper\">\n <zen-search-box [(text)]=\"searchText\"\n (textChange)=\"onSearchChange()\"></zen-search-box>\n </div>\n </div>\n <ng-template *ngIf=\"buttonTemplate\"\n [ngTemplateOutlet]=\"buttonTemplate.template\">\n </ng-template>\n <div class=\"action-menu-body\">\n <!--No options found-->\n <div class=\"no-options-found\"\n *ngIf=\"!filteredOptions.length && !isLoadingNow\">\n {{ 'No matching options found' | translate }}\n </div>\n\n <!--Select All Option-->\n <div class=\"action-item-checkbox select-all\"\n *ngIf=\"isMultiselect && !searchText && !isLazyLoading\"\n (click)=\"toggleAll()\">\n <zen-checkbox [checked]=\"selectModel.length === options.length\"\n [indeterminate]=\"selectModel.length !== options.length && selectModel.length\"\n [disableValueChange]=\"true\"\n [label]=\"'Select All' | translate\"></zen-checkbox>\n </div>\n\n <!--Single select Options-->\n <ng-container *ngIf=\"!isMultiselect\">\n <a class=\"action-item\"\n *ngIf=\"enableAddNewOption\"\n (click)=\"handleAddNewOption()\">\n <span *ngIf=\"newOptionText\">\n {{ newOptionText | translate }}\n </span>\n <span *ngIf=\"!newOptionText\">\n {{'Add New' | translate}}\n </span>\n </a>\n\n <a class=\"action-item remove-item\"\n *ngIf=\"enableRemoveOption\"\n (click)=\"handleRemoveOption()\">\n <span *ngIf=\"removeOptionText\">\n {{ removeOptionText | translate }}\n </span>\n <span *ngIf=\"!removeOptionText\">\n {{'Remove Selected' | translate}}\n </span>\n </a>\n\n <a class=\"action-item\"\n *ngFor=\"let option of filteredOptions\"\n (click)=\"handleOptionClick(option)\"\n [ngClass]=\"{ 'active': isSelected(option) }\">\n <span *ngIf=\"!isMultiselect\"\n [class.action-item-truncate]=\"isTruncate\">\n <ng-template *ngIf=\"optionTemplate; else tplOptionText\"\n [ngTemplateOutlet]=\"optionTemplate.template\"\n [ngTemplateOutletContext]=\"{ option: option }\">\n </ng-template>\n <ng-template #tplOptionText>\n {{ getName(option) | translate }}\n </ng-template>\n </span>\n </a>\n </ng-container>\n\n <!--Multiselect Options-->\n <ng-container *ngIf=\"isMultiselect\">\n <div class=\"action-item-checkbox\"\n *ngFor=\"let option of filteredOptions\"\n (click)=\"handleOptionClick(option)\">\n <zen-checkbox *ngIf=\"isMultiselect\"\n [checked]=\"isSelected(option)\"\n [label]=\"getName(option)\"\n [disableValueChange]=\"true\"></zen-checkbox>\n </div>\n\n <ng-container *ngIf=\"isLazyLoading\">\n <div *ngIf=\"canLoadMore && !isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".app-select{width:100%;position:relative}.app-select ::-webkit-scrollbar-thumb{background-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle{display:flex;align-items:center;justify-content:space-between;position:relative;transition:.3s;width:100%;background:#ffffff;-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid #d6d6d8;padding:0 0 8px;font-style:normal;font-weight:400;font-size:16px;line-height:24px;color:#333}.app-select .app-select-toggle .app-select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-style:normal;font-weight:400;font-size:14px;line-height:24px}.app-select .app-select-toggle .app-select-label .placeholder{color:#bebebe}.app-select .app-select-toggle .app-select-label .selected-item{color:#333}.app-select .app-select-toggle .custom-icon{color:#bebebe}.app-select .app-select-toggle .app-select-icon{color:#bebebe;transition:.3s}.app-select .app-select-toggle:focus{border-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle:focus .app-select-icon,.app-select .app-select-toggle:focus .custom-icon{color:var(--color-primary, #2188d9)!important}.app-select .app-select-toggle[readonly],.app-select .app-select-toggle[disabled]{cursor:not-allowed;color:#b8b9bc;border-color:#d0d0d2}.app-select .app-select-toggle.active{border-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle.active .custom-icon{color:var(--color-primary, #2188d9)!important}.app-select .app-select-toggle.active .app-select-icon{transform:rotate(180deg);color:var(--color-primary, #2188d9)}.app-select .action-menu-container{position:sticky;width:inherit;z-index:10}.app-select .app-select-dropdown-wrapper{top:115%;width:inherit}.app-select .app-select-dropdown-wrapper.show-top{top:unset;bottom:115%}.app-select .app-select-dropdown-wrapper .action-menu-body{max-height:200px;overflow:auto}.app-select .app-select-dropdown-wrapper .action-menu-body .remove-item{color:#dc3e33}.app-select .app-select-dropdown-wrapper .no-options-found{background:#ffffff;color:#b8b9bc;padding:8px 16px;text-decoration:none;font-style:normal;font-weight:400;font-size:16px;line-height:24px}.app-select .app-select-dropdown-wrapper .select-all{font-weight:500}.app-select .app-select-dropdown-wrapper .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ZenduCheckboxComponent, selector: "zen-checkbox", inputs: ["checked", "label", "disabled", "disableValueChange", "indeterminate", "imageUrl"], outputs: ["checkedChange"] }, { kind: "component", type: i3.ZenduSearchBoxComponent, selector: "zen-search-box", inputs: ["text", "delay", "autoFocus", "placeholder"], outputs: ["textChange"] }, { kind: "component", type: i4.ZenduSpinner, selector: "zen-spinner", inputs: ["size"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }] });
375
+ ZenduSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduSelectComponent, selector: "zen-select", inputs: { selectModel: "selectModel", options: "options", placeholder: "placeholder", displayProp: "displayProp", idProp: "idProp", hasSearch: "hasSearch", returnOption: "returnOption", isMultiselect: "isMultiselect", disabled: "disabled", customIcon: "customIcon", customIconColor: "customIconColor", isTruncate: "isTruncate", enableAddNewOption: "enableAddNewOption", newOptionText: "newOptionText", enableRemoveOption: "enableRemoveOption", removeOptionText: "removeOptionText", isLazyLoading: "isLazyLoading", lazyLoader: "lazyLoader" }, outputs: { selectModelChange: "selectModelChange", addNewOption: "addNewOption", removeOption: "removeOption", closed: "closed" }, host: { listeners: { "window:mousedown": "outsideHandling($event)", "window:scroll": "scroll()" } }, queries: [{ propertyName: "optionTemplate", first: true, predicate: ZenduSelectOptionDirective, descendants: true }, { propertyName: "valueTemplate", first: true, predicate: ZenduSelectValueDirective, descendants: true }, { propertyName: "buttonTemplate", first: true, predicate: ZenduSelectButtonDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"app-select\">\n <button class=\"app-select-toggle\"\n [disabled]=\"disabled\"\n (click)=\"toggleExpand()\"\n [ngClass]=\"{'active': isExpanded}\">\n <div class=\"app-select-label\">\n <div class=\"placeholder\"\n *ngIf=\"isModelEmpty()\">\n <span>{{placeholder | translate}}</span>\n </div>\n <div class=\"selected-item\"\n *ngIf=\"!isMultiselect && !isModelEmpty()\">\n <ng-template *ngIf=\"valueTemplate && selectModel[0]; else tplValueText\"\n [ngTemplateOutlet]=\"valueTemplate.template\"\n [ngTemplateOutletContext]=\"{ selectModel: selectModel, labelText: labelText }\"></ng-template>\n <ng-template #tplValueText>\n <span>{{ labelText | translate }}</span>\n </ng-template>\n </div>\n <div class=\"selected-item\"\n *ngIf=\"isMultiselect && !isModelEmpty()\">\n <span>{{ labelText | translate }}</span>\n </div>\n </div>\n <i *ngIf=\"!customIcon\"\n class=\"material-icons app-select-icon\">expand_more</i>\n <i *ngIf=\"customIcon\"\n class=\"material-icons-outlined custom-icon\"\n [style.color]=\"customIconColor\">{{customIcon}}</i>\n </button>\n\n <div class=\"action-menu-container\">\n <div class=\"action-menu app-select-dropdown-wrapper\"\n [ngClass]=\"{ 'show-top': isTopMenuDirection }\">\n <div class=\"app-select-dropdown\"\n *ngIf=\"isExpanded\">\n <div class=\"action-menu-header\"\n *ngIf=\"hasSearch\">\n <!--Search options-->\n <div class=\"search-wrapper\">\n <zen-search-box [(text)]=\"searchText\"\n (textChange)=\"onSearchChange()\"></zen-search-box>\n </div>\n </div>\n <ng-template *ngIf=\"buttonTemplate\"\n [ngTemplateOutlet]=\"buttonTemplate.template\">\n </ng-template>\n <div class=\"action-menu-body\">\n <!--No options found-->\n <div class=\"no-options-found\"\n *ngIf=\"!filteredOptions.length && !isLoadingNow\">\n {{ 'No matching options found' | translate }}\n </div>\n\n <!--Select All Option-->\n <div class=\"action-item-checkbox select-all\"\n *ngIf=\"isMultiselect && !searchText && !isLazyLoading\"\n (click)=\"toggleAll()\">\n <zen-checkbox [checked]=\"selectModel.length === options.length\"\n [indeterminate]=\"selectModel.length !== options.length && selectModel.length\"\n [disableValueChange]=\"true\"\n [label]=\"'Select All' | translate\"></zen-checkbox>\n </div>\n\n <!--Single select Options-->\n <ng-container *ngIf=\"!isMultiselect\">\n <a class=\"action-item\"\n *ngIf=\"enableAddNewOption\"\n (click)=\"handleAddNewOption()\">\n <span *ngIf=\"newOptionText\">\n {{ newOptionText | translate }}\n </span>\n <span *ngIf=\"!newOptionText\">\n {{'Add New' | translate}}\n </span>\n </a>\n\n <a class=\"action-item remove-item\"\n *ngIf=\"enableRemoveOption\"\n (click)=\"handleRemoveOption()\">\n <span *ngIf=\"removeOptionText\">\n {{ removeOptionText | translate }}\n </span>\n <span *ngIf=\"!removeOptionText\">\n {{'Remove Selected' | translate}}\n </span>\n </a>\n\n <a class=\"action-item\"\n *ngFor=\"let option of filteredOptions\"\n (click)=\"handleOptionClick(option)\"\n [ngClass]=\"{ 'active': isSelected(option) }\">\n <span *ngIf=\"!isMultiselect\"\n [class.action-item-truncate]=\"isTruncate\">\n <ng-template *ngIf=\"optionTemplate; else tplOptionText\"\n [ngTemplateOutlet]=\"optionTemplate.template\"\n [ngTemplateOutletContext]=\"{ option: option }\">\n </ng-template>\n <ng-template #tplOptionText>\n {{ getName(option) | translate }}\n </ng-template>\n </span>\n </a>\n </ng-container>\n\n <!--Multiselect Options-->\n <ng-container *ngIf=\"isMultiselect\">\n <div class=\"action-item-checkbox\"\n *ngFor=\"let option of filteredOptions\"\n (click)=\"handleOptionClick(option)\">\n <zen-checkbox *ngIf=\"isMultiselect\"\n [checked]=\"isSelected(option)\"\n [label]=\"getName(option)\"\n [disableValueChange]=\"true\"></zen-checkbox>\n </div>\n\n <ng-container *ngIf=\"isLazyLoading\">\n <div *ngIf=\"canLoadMore && !isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{--toggle-border-bottom: var(--zen-select-toggle-border-bottom, 1px solid #d6d6d8)}.app-select{width:100%;position:relative}.app-select ::-webkit-scrollbar-thumb{background-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle{display:flex;align-items:center;justify-content:space-between;position:relative;transition:.3s;width:100%;background:#ffffff;-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:var(--toggle-border-bottom);padding:0 0 8px;font-style:normal;font-weight:400;font-size:16px;line-height:24px;color:#333}.app-select .app-select-toggle .app-select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-style:normal;font-weight:400;font-size:14px;line-height:24px}.app-select .app-select-toggle .app-select-label .placeholder{color:#bebebe}.app-select .app-select-toggle .app-select-label .selected-item{color:#333}.app-select .app-select-toggle .custom-icon{color:#bebebe}.app-select .app-select-toggle .app-select-icon{color:#bebebe;transition:.3s}.app-select .app-select-toggle:focus{border-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle:focus .app-select-icon,.app-select .app-select-toggle:focus .custom-icon{color:var(--color-primary, #2188d9)!important}.app-select .app-select-toggle[readonly],.app-select .app-select-toggle[disabled]{cursor:not-allowed;color:#b8b9bc;border-color:#d0d0d2}.app-select .app-select-toggle.active{border-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle.active .custom-icon{color:var(--color-primary, #2188d9)!important}.app-select .app-select-toggle.active .app-select-icon{transform:rotate(180deg);color:var(--color-primary, #2188d9)}.app-select .action-menu-container{position:sticky;width:inherit;z-index:10}.app-select .app-select-dropdown-wrapper{top:115%;width:inherit}.app-select .app-select-dropdown-wrapper.show-top{top:unset;bottom:115%}.app-select .app-select-dropdown-wrapper .action-menu-body{max-height:200px;overflow:auto}.app-select .app-select-dropdown-wrapper .action-menu-body .remove-item{color:#dc3e33}.app-select .app-select-dropdown-wrapper .no-options-found{background:#ffffff;color:#b8b9bc;padding:8px 16px;text-decoration:none;font-style:normal;font-weight:400;font-size:16px;line-height:24px}.app-select .app-select-dropdown-wrapper .select-all{font-weight:500}.app-select .app-select-dropdown-wrapper .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ZenduCheckboxComponent, selector: "zen-checkbox", inputs: ["checked", "label", "disabled", "disableValueChange", "indeterminate", "imageUrl"], outputs: ["checkedChange"] }, { kind: "component", type: i3.ZenduSearchBoxComponent, selector: "zen-search-box", inputs: ["text", "delay", "autoFocus", "placeholder"], outputs: ["textChange"] }, { kind: "component", type: i4.ZenduSpinner, selector: "zen-spinner", inputs: ["size"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }] });
371
376
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduSelectComponent, decorators: [{
372
377
  type: Component,
373
- args: [{ selector: 'zen-select', template: "<div class=\"app-select\">\n <button class=\"app-select-toggle\"\n [disabled]=\"disabled\"\n (click)=\"toggleExpand()\"\n [ngClass]=\"{'active': isExpanded}\">\n <div class=\"app-select-label\">\n <div class=\"placeholder\"\n *ngIf=\"isModelEmpty()\">\n <span>{{placeholder | translate}}</span>\n </div>\n <div class=\"selected-item\"\n *ngIf=\"!isMultiselect && !isModelEmpty()\">\n <ng-template *ngIf=\"valueTemplate && selectModel[0]; else tplValueText\"\n [ngTemplateOutlet]=\"valueTemplate.template\"\n [ngTemplateOutletContext]=\"{ selectModel: selectModel, labelText: labelText }\"></ng-template>\n <ng-template #tplValueText>\n <span>{{ labelText | translate }}</span>\n </ng-template>\n </div>\n <div class=\"selected-item\"\n *ngIf=\"isMultiselect && !isModelEmpty()\">\n <span>{{ labelText | translate }}</span>\n </div>\n </div>\n <i *ngIf=\"!customIcon\"\n class=\"material-icons app-select-icon\">expand_more</i>\n <i *ngIf=\"customIcon\"\n class=\"material-icons-outlined custom-icon\"\n [style.color]=\"customIconColor\">{{customIcon}}</i>\n </button>\n\n <div class=\"action-menu-container\">\n <div class=\"action-menu app-select-dropdown-wrapper\"\n [ngClass]=\"{ 'show-top': isTopMenuDirection }\">\n <div class=\"app-select-dropdown\"\n *ngIf=\"isExpanded\">\n <div class=\"action-menu-header\"\n *ngIf=\"hasSearch\">\n <!--Search options-->\n <div class=\"search-wrapper\">\n <zen-search-box [(text)]=\"searchText\"\n (textChange)=\"onSearchChange()\"></zen-search-box>\n </div>\n </div>\n <ng-template *ngIf=\"buttonTemplate\"\n [ngTemplateOutlet]=\"buttonTemplate.template\">\n </ng-template>\n <div class=\"action-menu-body\">\n <!--No options found-->\n <div class=\"no-options-found\"\n *ngIf=\"!filteredOptions.length && !isLoadingNow\">\n {{ 'No matching options found' | translate }}\n </div>\n\n <!--Select All Option-->\n <div class=\"action-item-checkbox select-all\"\n *ngIf=\"isMultiselect && !searchText && !isLazyLoading\"\n (click)=\"toggleAll()\">\n <zen-checkbox [checked]=\"selectModel.length === options.length\"\n [indeterminate]=\"selectModel.length !== options.length && selectModel.length\"\n [disableValueChange]=\"true\"\n [label]=\"'Select All' | translate\"></zen-checkbox>\n </div>\n\n <!--Single select Options-->\n <ng-container *ngIf=\"!isMultiselect\">\n <a class=\"action-item\"\n *ngIf=\"enableAddNewOption\"\n (click)=\"handleAddNewOption()\">\n <span *ngIf=\"newOptionText\">\n {{ newOptionText | translate }}\n </span>\n <span *ngIf=\"!newOptionText\">\n {{'Add New' | translate}}\n </span>\n </a>\n\n <a class=\"action-item remove-item\"\n *ngIf=\"enableRemoveOption\"\n (click)=\"handleRemoveOption()\">\n <span *ngIf=\"removeOptionText\">\n {{ removeOptionText | translate }}\n </span>\n <span *ngIf=\"!removeOptionText\">\n {{'Remove Selected' | translate}}\n </span>\n </a>\n\n <a class=\"action-item\"\n *ngFor=\"let option of filteredOptions\"\n (click)=\"handleOptionClick(option)\"\n [ngClass]=\"{ 'active': isSelected(option) }\">\n <span *ngIf=\"!isMultiselect\"\n [class.action-item-truncate]=\"isTruncate\">\n <ng-template *ngIf=\"optionTemplate; else tplOptionText\"\n [ngTemplateOutlet]=\"optionTemplate.template\"\n [ngTemplateOutletContext]=\"{ option: option }\">\n </ng-template>\n <ng-template #tplOptionText>\n {{ getName(option) | translate }}\n </ng-template>\n </span>\n </a>\n </ng-container>\n\n <!--Multiselect Options-->\n <ng-container *ngIf=\"isMultiselect\">\n <div class=\"action-item-checkbox\"\n *ngFor=\"let option of filteredOptions\"\n (click)=\"handleOptionClick(option)\">\n <zen-checkbox *ngIf=\"isMultiselect\"\n [checked]=\"isSelected(option)\"\n [label]=\"getName(option)\"\n [disableValueChange]=\"true\"></zen-checkbox>\n </div>\n\n <ng-container *ngIf=\"isLazyLoading\">\n <div *ngIf=\"canLoadMore && !isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".app-select{width:100%;position:relative}.app-select ::-webkit-scrollbar-thumb{background-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle{display:flex;align-items:center;justify-content:space-between;position:relative;transition:.3s;width:100%;background:#ffffff;-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid #d6d6d8;padding:0 0 8px;font-style:normal;font-weight:400;font-size:16px;line-height:24px;color:#333}.app-select .app-select-toggle .app-select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-style:normal;font-weight:400;font-size:14px;line-height:24px}.app-select .app-select-toggle .app-select-label .placeholder{color:#bebebe}.app-select .app-select-toggle .app-select-label .selected-item{color:#333}.app-select .app-select-toggle .custom-icon{color:#bebebe}.app-select .app-select-toggle .app-select-icon{color:#bebebe;transition:.3s}.app-select .app-select-toggle:focus{border-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle:focus .app-select-icon,.app-select .app-select-toggle:focus .custom-icon{color:var(--color-primary, #2188d9)!important}.app-select .app-select-toggle[readonly],.app-select .app-select-toggle[disabled]{cursor:not-allowed;color:#b8b9bc;border-color:#d0d0d2}.app-select .app-select-toggle.active{border-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle.active .custom-icon{color:var(--color-primary, #2188d9)!important}.app-select .app-select-toggle.active .app-select-icon{transform:rotate(180deg);color:var(--color-primary, #2188d9)}.app-select .action-menu-container{position:sticky;width:inherit;z-index:10}.app-select .app-select-dropdown-wrapper{top:115%;width:inherit}.app-select .app-select-dropdown-wrapper.show-top{top:unset;bottom:115%}.app-select .app-select-dropdown-wrapper .action-menu-body{max-height:200px;overflow:auto}.app-select .app-select-dropdown-wrapper .action-menu-body .remove-item{color:#dc3e33}.app-select .app-select-dropdown-wrapper .no-options-found{background:#ffffff;color:#b8b9bc;padding:8px 16px;text-decoration:none;font-style:normal;font-weight:400;font-size:16px;line-height:24px}.app-select .app-select-dropdown-wrapper .select-all{font-weight:500}.app-select .app-select-dropdown-wrapper .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}\n"] }]
378
+ args: [{ selector: 'zen-select', template: "<div class=\"app-select\">\n <button class=\"app-select-toggle\"\n [disabled]=\"disabled\"\n (click)=\"toggleExpand()\"\n [ngClass]=\"{'active': isExpanded}\">\n <div class=\"app-select-label\">\n <div class=\"placeholder\"\n *ngIf=\"isModelEmpty()\">\n <span>{{placeholder | translate}}</span>\n </div>\n <div class=\"selected-item\"\n *ngIf=\"!isMultiselect && !isModelEmpty()\">\n <ng-template *ngIf=\"valueTemplate && selectModel[0]; else tplValueText\"\n [ngTemplateOutlet]=\"valueTemplate.template\"\n [ngTemplateOutletContext]=\"{ selectModel: selectModel, labelText: labelText }\"></ng-template>\n <ng-template #tplValueText>\n <span>{{ labelText | translate }}</span>\n </ng-template>\n </div>\n <div class=\"selected-item\"\n *ngIf=\"isMultiselect && !isModelEmpty()\">\n <span>{{ labelText | translate }}</span>\n </div>\n </div>\n <i *ngIf=\"!customIcon\"\n class=\"material-icons app-select-icon\">expand_more</i>\n <i *ngIf=\"customIcon\"\n class=\"material-icons-outlined custom-icon\"\n [style.color]=\"customIconColor\">{{customIcon}}</i>\n </button>\n\n <div class=\"action-menu-container\">\n <div class=\"action-menu app-select-dropdown-wrapper\"\n [ngClass]=\"{ 'show-top': isTopMenuDirection }\">\n <div class=\"app-select-dropdown\"\n *ngIf=\"isExpanded\">\n <div class=\"action-menu-header\"\n *ngIf=\"hasSearch\">\n <!--Search options-->\n <div class=\"search-wrapper\">\n <zen-search-box [(text)]=\"searchText\"\n (textChange)=\"onSearchChange()\"></zen-search-box>\n </div>\n </div>\n <ng-template *ngIf=\"buttonTemplate\"\n [ngTemplateOutlet]=\"buttonTemplate.template\">\n </ng-template>\n <div class=\"action-menu-body\">\n <!--No options found-->\n <div class=\"no-options-found\"\n *ngIf=\"!filteredOptions.length && !isLoadingNow\">\n {{ 'No matching options found' | translate }}\n </div>\n\n <!--Select All Option-->\n <div class=\"action-item-checkbox select-all\"\n *ngIf=\"isMultiselect && !searchText && !isLazyLoading\"\n (click)=\"toggleAll()\">\n <zen-checkbox [checked]=\"selectModel.length === options.length\"\n [indeterminate]=\"selectModel.length !== options.length && selectModel.length\"\n [disableValueChange]=\"true\"\n [label]=\"'Select All' | translate\"></zen-checkbox>\n </div>\n\n <!--Single select Options-->\n <ng-container *ngIf=\"!isMultiselect\">\n <a class=\"action-item\"\n *ngIf=\"enableAddNewOption\"\n (click)=\"handleAddNewOption()\">\n <span *ngIf=\"newOptionText\">\n {{ newOptionText | translate }}\n </span>\n <span *ngIf=\"!newOptionText\">\n {{'Add New' | translate}}\n </span>\n </a>\n\n <a class=\"action-item remove-item\"\n *ngIf=\"enableRemoveOption\"\n (click)=\"handleRemoveOption()\">\n <span *ngIf=\"removeOptionText\">\n {{ removeOptionText | translate }}\n </span>\n <span *ngIf=\"!removeOptionText\">\n {{'Remove Selected' | translate}}\n </span>\n </a>\n\n <a class=\"action-item\"\n *ngFor=\"let option of filteredOptions\"\n (click)=\"handleOptionClick(option)\"\n [ngClass]=\"{ 'active': isSelected(option) }\">\n <span *ngIf=\"!isMultiselect\"\n [class.action-item-truncate]=\"isTruncate\">\n <ng-template *ngIf=\"optionTemplate; else tplOptionText\"\n [ngTemplateOutlet]=\"optionTemplate.template\"\n [ngTemplateOutletContext]=\"{ option: option }\">\n </ng-template>\n <ng-template #tplOptionText>\n {{ getName(option) | translate }}\n </ng-template>\n </span>\n </a>\n </ng-container>\n\n <!--Multiselect Options-->\n <ng-container *ngIf=\"isMultiselect\">\n <div class=\"action-item-checkbox\"\n *ngFor=\"let option of filteredOptions\"\n (click)=\"handleOptionClick(option)\">\n <zen-checkbox *ngIf=\"isMultiselect\"\n [checked]=\"isSelected(option)\"\n [label]=\"getName(option)\"\n [disableValueChange]=\"true\"></zen-checkbox>\n </div>\n\n <ng-container *ngIf=\"isLazyLoading\">\n <div *ngIf=\"canLoadMore && !isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{--toggle-border-bottom: var(--zen-select-toggle-border-bottom, 1px solid #d6d6d8)}.app-select{width:100%;position:relative}.app-select ::-webkit-scrollbar-thumb{background-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle{display:flex;align-items:center;justify-content:space-between;position:relative;transition:.3s;width:100%;background:#ffffff;-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:var(--toggle-border-bottom);padding:0 0 8px;font-style:normal;font-weight:400;font-size:16px;line-height:24px;color:#333}.app-select .app-select-toggle .app-select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-style:normal;font-weight:400;font-size:14px;line-height:24px}.app-select .app-select-toggle .app-select-label .placeholder{color:#bebebe}.app-select .app-select-toggle .app-select-label .selected-item{color:#333}.app-select .app-select-toggle .custom-icon{color:#bebebe}.app-select .app-select-toggle .app-select-icon{color:#bebebe;transition:.3s}.app-select .app-select-toggle:focus{border-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle:focus .app-select-icon,.app-select .app-select-toggle:focus .custom-icon{color:var(--color-primary, #2188d9)!important}.app-select .app-select-toggle[readonly],.app-select .app-select-toggle[disabled]{cursor:not-allowed;color:#b8b9bc;border-color:#d0d0d2}.app-select .app-select-toggle.active{border-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle.active .custom-icon{color:var(--color-primary, #2188d9)!important}.app-select .app-select-toggle.active .app-select-icon{transform:rotate(180deg);color:var(--color-primary, #2188d9)}.app-select .action-menu-container{position:sticky;width:inherit;z-index:10}.app-select .app-select-dropdown-wrapper{top:115%;width:inherit}.app-select .app-select-dropdown-wrapper.show-top{top:unset;bottom:115%}.app-select .app-select-dropdown-wrapper .action-menu-body{max-height:200px;overflow:auto}.app-select .app-select-dropdown-wrapper .action-menu-body .remove-item{color:#dc3e33}.app-select .app-select-dropdown-wrapper .no-options-found{background:#ffffff;color:#b8b9bc;padding:8px 16px;text-decoration:none;font-style:normal;font-weight:400;font-size:16px;line-height:24px}.app-select .app-select-dropdown-wrapper .select-all{font-weight:500}.app-select .app-select-dropdown-wrapper .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}\n"] }]
374
379
  }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { selectModel: [{
375
380
  type: Input
376
381
  }], selectModelChange: [{
@@ -413,6 +418,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
413
418
  type: Input
414
419
  }], removeOption: [{
415
420
  type: Output
421
+ }], closed: [{
422
+ type: Output
416
423
  }], optionTemplate: [{
417
424
  type: ContentChild,
418
425
  args: [ZenduSelectOptionDirective]
@@ -429,4 +436,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
429
436
  type: HostListener,
430
437
  args: ['window:scroll', []]
431
438
  }] } });
432
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9zZWxlY3QvemVuZHUtc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9zZWxlY3QvemVuZHUtc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN2RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQzs7Ozs7OztBQVF2RixNQUFNLE9BQU8sb0JBQW9CO0lBa0k3QixZQUNZLFFBQW9CO1FBQXBCLGFBQVEsR0FBUixRQUFRLENBQVk7UUE1SGhDOztXQUVHO1FBQ08sc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV0RDs7V0FFRztRQUNNLFlBQU8sR0FBVSxFQUFFLENBQUM7UUFFN0I7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLGNBQWMsQ0FBQztRQTRCdEM7O1dBRUc7UUFDTSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCOztXQUVHO1FBQ00sZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUV6Qjs7V0FFRztRQUNNLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBRTlCOztXQUVHO1FBQ00sZUFBVSxHQUFZLEtBQUssQ0FBQztRQUVyQzs7V0FFRztRQUNNLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQU83Qzs7V0FFRztRQUNPLGlCQUFZLEdBQXNCLElB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LEtBQUs7Z0JBS0ksWUFBWTtzQkFBckIsTUFBTTtnQkFLRSxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBS0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUtHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBS0csVUFBVTtzQkFBbEIsS0FBSztnQkFLSSxZQUFZO3NCQUFyQixNQUFNO2dCQStCbUMsY0FBYztzQkFBdkQsWUFBWTt1QkFBQywwQkFBMEI7Z0JBS0MsYUFBYTtzQkFBckQsWUFBWTt1QkFBQyx5QkFBeUI7Z0JBS0csY0FBYztzQkFBdkQsWUFBWTt1QkFBQywwQkFBMEI7Z0JBSXhDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFjNUMsTUFBTTtzQkFETCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBDb250ZW50Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgWmVuZHVTZWxlY3RPcHRpb25EaXJlY3RpdmUgfSBmcm9tICcuL3RlbXBsYXRlcy96ZW5kdS1zZWxlY3Qtb3B0aW9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBaZW5kdVNlbGVjdFZhbHVlRGlyZWN0aXZlIH0gZnJvbSAnLi90ZW1wbGF0ZXMvemVuZHUtc2VsZWN0LXZhbHVlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBaZW5kdVNlbGVjdEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4vdGVtcGxhdGVzL3plbmR1LXNlbGVjdC1idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuLi9maWx0ZXIvZmlsdGVyc0NvbmZpZyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnemVuLXNlbGVjdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3plbmR1LXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vemVuZHUtc2VsZWN0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgWmVuZHVTZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIC8qKlxuICAgICAqIDItV2F5IGNvbXBvbmVudCBwcm9wZXJ0eSBmb3Igc2VsZWN0ZWQgaXRlbXMuXG4gICAgICogRG9uJ3QgaW5pdGlhbGl6ZSBwcm9wZXJ0eSBvbiBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGNoYW5nZSBzb3VyY2UgcGFyYW1ldGVyXG4gICAgICovXG4gICAgQElucHV0KCkgc2VsZWN0TW9kZWw6IGFueSB8IGFueVtdO1xuXG4gICAgLyoqXG4gICAgICogY2FsbGJhY2sgdG8gZW1pdCBjaGFuZ2VzIGZvciBwYXJlbnQgY29tcG9uZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIHNlbGVjdE1vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIG9wdGlvbnMgZm9yIHNlbGVjdFxuICAgICAqL1xuICAgIEBJbnB1dCgpIG9wdGlvbnM6IGFueVtdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBQcm9wZXJ0eSB0byBzZXQgY3VzdG9tIHBsYWNlaG9sZGVyIHZhbHVlXG4gICAgICovXG4gICAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnU2VsZWN0IEl0ZW1zJztcblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBrZXkgdmFsdWUgdG8gZ2V0IGRpc3BsYXkgbmFtZSBmcm9tIG9wdGlvbiBvYmplY3RcbiAgICAgKi9cbiAgICBASW5wdXQoKSBkaXNwbGF5UHJvcDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIGtleSB2YWx1ZSB0byBnZXQgaWQgZnJvbSBvcHRpb24gb2JqZWN0XG4gICAgICovXG4gICAgQElucHV0KCkgaWRQcm9wOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBDb21wb25lbnQgcHJvcGVydHkgdG8gZW5hYmxlIHNlYXJjaFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGhhc1NlYXJjaDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIENvbXBvbmVudCBwcm9wZXJ0eSB0byByZXR1cm4gd2hvbGUgb3B0aW9uIG9iamVjdFxuICAgICAqIEJ5IGRlZmF1bHQgb25seSBpZCB2YWx1ZSBpcyByZXR1cm5lZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHJldHVybk9wdGlvbjogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIENvbXBvbmVudCBwcm9wZXJ0eSB0byBlbmFibGUgbXVsdGlzZWxlY3RcbiAgICAgKi9cbiAgICBASW5wdXQoKSBpc011bHRpc2VsZWN0OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50IHByb3BlcnR5IHRvIGRpc2FibGUgY29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNob3cgdGhlIGN1c3RvbSBpY29uIGZvciB0b2dnbGVcbiAgICAgKi9cbiAgICBASW5wdXQoKSBjdXN0b21JY29uID0gXCJcIjtcblxuICAgIC8qKlxuICAgICAqIENvbG9yIGZvciBjdXN0b20gaWNvblxuICAgICAqL1xuICAgIEBJbnB1dCgpIGN1c3RvbUljb25Db2xvciA9IFwiXCI7XG5cbiAgICAvKipcbiAgICAgKiBUcnVuY2F0ZSB0ZXh0IHdpdGggXCIuLi5cIiBhdCB0aGUgZW5kXG4gICAgICovXG4gICAgQElucHV0KCkgaXNUcnVuY2F0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogc2hvdyBBZGQgTmV3IE9wdGlvbiBhdCBmaXJzdCBwbGFjZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZUFkZE5ld09wdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogZGlzcGxheSBjdXN0b20gdGV4dCBmb3IgQWRkIE5ldyBPcHRpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKSBuZXdPcHRpb25UZXh0OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0IGV2ZW50IHdoZW4gQWRkIE5ldyBPcHRpb24gaXMgY2xpY2tlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBhZGROZXdPcHRpb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICAvKipcbiAgICAgICAqIHNob3cgcmVtb3ZlIE9wdGlvbiBhdCBmaXJzdCBwbGFjZVxuICAgICAgICovXG4gICAgQElucHV0KCkgZW5hYmxlUmVtb3ZlT3B0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBkaXNwbGF5IGN1c3RvbSB0ZXh0IGZvciByZW1vdmUgT3B0aW9uXG4gICAgICovXG4gICAgQElucHV0KCkgcmVtb3ZlT3B0aW9uVGV4dDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGxhenkgbG9hZGluZyBmb3Igb3B0aW9uc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGlzTGF6eUxvYWRpbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIExhenkgbG9hZGVyIGZ1bmN0aW9uIHRvIGZldGNoIG9wdGlvbnNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBsYXp5TG9hZGVyPzogKHNlYXJjaDogeyB0ZXh0Pzogc3RyaW5nLCBpZHM/OiBzdHJpbmdbXSB9LCBvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcikgPT4gUHJvbWlzZTxEYXRhU291cmNlW10+O1xuXG4gICAgLyoqXG4gICAgICogRW1pdCBldmVudCB3aGVuIHJlbW92ZSBPcHRpb24gaXMgY2xpY2tlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByZW1vdmVPcHRpb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJlZCBpdGVtcyB2aXNpYmxlIG9uIGRyb3Bkb3duXG4gICAgICovXG4gICAgcHVibGljIGZpbHRlcmVkT3B0aW9uczogYW55W107XG5cbiAgICAvKipcbiAgICAgKiBJcyBkcm9wZG93biBleHBhbmRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0V4cGFuZGVkID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgc2VhcmNoVGV4dCA9ICcnO1xuXG4gICAgcHVibGljIGxhYmVsVGV4dCA9ICcnO1xuXG4gICAgcHVibGljIGlzVG9wTWVudURpcmVjdGlvbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIG9wdGlvbjogYW55XG5cbiAgICBwdWJsaWMgY2FuTG9hZE1vcmUgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBpc0xvYWRpbmdOb3cgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfZWxlbWVudDogRWxlbWVudFJlZikge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdCBPcHRpb24gVGVtcGxhdGUgZm9yIGN1c3RvbSBIVE1MXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChaZW5kdVNlbGVjdE9wdGlvbkRpcmVjdGl2ZSkgb3B0aW9uVGVtcGxhdGU6IFplbmR1U2VsZWN0T3B0aW9uRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IFZhbHVlIFRlbXBsYXRlIGZvciBjdXN0b20gSFRNTFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoWmVuZHVTZWxlY3RWYWx1ZURpcmVjdGl2ZSkgdmFsdWVUZW1wbGF0ZTogWmVuZHVTZWxlY3RWYWx1ZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIFNlbGVjdCBPcHRpb24gVGVtcGxhdGUgZm9yIGN1c3RvbSBIVE1MXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChaZW5kdVNlbGVjdEJ1dHRvbkRpcmVjdGl2ZSkgYnV0dG9uVGVtcGxhdGU6IFplbmR1U2VsZWN0QnV0dG9uRGlyZWN0aXZlO1xuXG5cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6bW91c2Vkb3duJywgWyckZXZlbnQnXSlcbiAgICBvdXRzaWRlSGFuZGxpbmcoZXZlbnQpIHtcbiAgICAgICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgbm90IGluIHRoZSBET01cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBoaWRlIHRoZSBtZW51IGZvciBvdXRzaWRlIGNsaWNrXG4gICAgICAgIHRoaXMuaGlkZURyb3BEb3duKCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcsIFtdKVxuICAgIHNjcm9sbCgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVQbGFjZW1lbnQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlT2JqOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJPcHRpb25zKCk7XG4gICAgICAgIHRoaXMudXBkYXRlTGFiZWwoKTtcblxuICAgICAgICBpZiAoY2hhbmdlT2JqW1wic2VsZWN0TW9kZWxcIl0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGF6eUxvYWRpbmcgJiYgdGhpcy5zZWxlY3RNb2RlbD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmZpbHRlcmVkT3B0aW9ucz8ubGVuZ3RoICYmICF0aGlzLmlzRXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJlbG9hZCBkYXRhIHRvIHNob3cgdGhlIGxhYmVsc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRNb3JlKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpc01vZGVsRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5zZWxlY3RNb2RlbCB8fCAhdGhpcy5zZWxlY3RNb2RlbC5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuc2VsZWN0TW9kZWwgPT09ICd1bmRlZmluZWQnIHx8IHRoaXMuc2VsZWN0TW9kZWwgPT09IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlT3B0aW9uQ2xpY2sob3B0aW9uOiBzdHJpbmcgfCBvYmplY3QpIHtcbiAgICAgICAgdGhpcy5vcHRpb24gPSBvcHRpb247XG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gdGhpcy5yZXR1cm5PcHRpb24gPyBvcHRpb24gOiB0aGlzLmdldElkKG9wdGlvbik7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXNlbGVjdCkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVPcHRpb24ob3B0aW9uVmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaW5nbGVTZWxlY3Qob3B0aW9uVmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgLy8gTG9naWMgZm9yIHNpbmdsZSBzZWxlY3RcbiAgICBwcml2YXRlIHNpbmdsZVNlbGVjdCh2YWx1ZTogc3RyaW5nIHwgb2JqZWN0KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0TW9kZWwgPSB2YWx1ZTtcblxuICAgICAgICAvLyAgSGlkZSBkcm9wZG93biBpZiBzaW5nbGUgc2VsZWN0XG4gICAgICAgIHRoaXMuaGlkZURyb3BEb3duKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZUV4cGFuZCgpIHtcbiAgICAgICAgdGhpcy5pc0V4cGFuZGVkID0gIXRoaXMuaXNFeHBhbmRlZDtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy5maWx0ZXJPcHRpb25zKCk7XG4gICAgICAgIHRoaXMudXBkYXRlUGxhY2VtZW50KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNFeHBhbmRlZCAmJiB0aGlzLmlzTGF6eUxvYWRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZE1vcmUodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2dpYyBmb3IgbXVsdGlzZWxlY3RcbiAgICBwcml2YXRlIHRvZ2dsZU9wdGlvbih2YWx1ZTogc3RyaW5nIHwgb2JqZWN0KTogdm9pZCB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdE1vZGVsKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RNb2RlbCA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdldEVsZW1lbnRJbmRleCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RNb2RlbC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ2hpbGRyZW4odHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdE1vZGVsLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUNoaWxkcmVuKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlTGFiZWwoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUNoaWxkcmVuKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbiB8fCAhdGhpcy5vcHRpb24uQ2hpbGRyZW5zPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wdGlvbi5DaGlsZHJlbnMuZm9yRWFjaCgoY2hpbGQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5vcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChlbCA9PiB0aGlzLmdldElkKGVsKSA9PT0gY2hpbGQpO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRJbmRleCA9IHRoaXMuc2VsZWN0TW9kZWwuZmluZEluZGV4KGVsID0+IHRoaXMuZ2V0SWQoZWwpID09PSBjaGlsZCk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb24gJiYgY2hlY2tlZCAmJiBjaGlsZEluZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0TW9kZWwucHVzaChjaGlsZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFjaGVja2VkICYmIGNoaWxkSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0TW9kZWwuc3BsaWNlKGNoaWxkSW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVjdXJzaXZlIGNhbGwgdG8gaGFuZGxlIG5lc3RlZCBjaGlsZHJlblxuICAgICAgICAgICAgdGhpcy50b2dnbGVDaGlsZHJlbihjaGVja2VkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFbGVtZW50SW5kZXgodmFsdWU6IHN0cmluZyB8IG9iamVjdCk6IG51bWJlciB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZUlkID0gdGhpcy5nZXRJZCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RNb2RlbC5maW5kSW5kZXgoZWwgPT4gdGhpcy5nZXRJZChlbCkgPT09IHZhbHVlSWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0TW9kZWwuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9nZ2xlQWxsKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RNb2RlbC5sZW5ndGggIT09IHRoaXMub3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0TW9kZWwgPSB0aGlzLm9wdGlvbnMubWFwKGVsID0+IHRoaXMucmV0dXJuT3B0aW9uID8gZWwgOiB0aGlzLmdldElkKGVsKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdE1vZGVsID0gW107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25TZWFyY2hDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsdGVyT3B0aW9ucygpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzTGF6eUxvYWRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gW107XG4gICAgICAgICAgICB0aGlzLmNhbkxvYWRNb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubG9hZE1vcmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaWx0ZXJPcHRpb25zKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zLnNsaWNlKDApO1xuXG4gICAgICAgIGlmICghdGhpcy5zZWFyY2hUZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAodGhpcy5zZWFyY2hUZXh0LCAnaScpO1xuICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IG9wdGlvbnMuZmlsdGVyKG9wdGlvbiA9PiByZWdleC50ZXN0KHRoaXMuZ2V0TmFtZShvcHRpb24pKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzU2VsZWN0ZWQob3B0aW9uOiBzdHJpbmcgfCBvYmplY3QpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaXNNb2RlbEVtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9wdGlvbklkID0gdGhpcy5nZXRJZChvcHRpb24pO1xuXG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdE1vZGVsLmZpbmRJbmRleChlbCA9PiB0aGlzLmdldElkKGVsKSA9PT0gb3B0aW9uSWQpID49IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRJZCh0aGlzLnNlbGVjdE1vZGVsKSA9PT0gb3B0aW9uSWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlTGFiZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTW9kZWxFbXB0eSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc011bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvdW50ID0gdGhpcy5zZWxlY3RNb2RlbC5sZW5ndGg7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZENvdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbFRleHQgPSB0aGlzLmdldE5hbWVGcm9tVmFsdWUodGhpcy5zZWxlY3RNb2RlbFswXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxUZXh0ID0gYCR7c2VsZWN0ZWRDb3VudH0gU2VsZWN0ZWRgO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sYWJlbFRleHQgPSB0aGlzLmdldE5hbWVGcm9tVmFsdWUodGhpcy5zZWxlY3RNb2RlbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TmFtZUZyb21WYWx1ZSh2YWw6IHN0cmluZyB8IG9iamVjdCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnJldHVybk9wdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSh2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNMYXp5TG9hZGluZykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdCA9IHRoaXMuZmlsdGVyZWRPcHRpb25zPy5maW5kKGkgPT4gaS5pZCA9PSB2YWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE5hbWUob3B0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zIHx8ICF0aGlzLm9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG9wdGlvbiA9IHRoaXMub3B0aW9ucy5maW5kKGVsID0+IHRoaXMuZ2V0SWQoZWwpID09PSB2YWwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZShvcHRpb24gPz8gdmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXROYW1lKG9wdGlvbjogc3RyaW5nIHwgb2JqZWN0KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXNwbGF5UHJvcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkdldFJlY3Vyc2l2ZVByb3BlcnR5KG9wdGlvbiwgdGhpcy5kaXNwbGF5UHJvcCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FwcC1TZWxlY3Q6IHdoZW4gdXNpbmcgb2JqZWN0cyBhcyBtb2RlbCwgYSBkaXNwbGF5UHJvcCB2YWx1ZSBpcyBtYW5kYXRvcnkuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRJZChvcHRpb246IHN0cmluZyB8IG9iamVjdCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaWRQcm9wKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuR2V0UmVjdXJzaXZlUHJvcGVydHkob3B0aW9uLCB0aGlzLmlkUHJvcCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FwcC1TZWxlY3Q6IHdoZW4gdXNpbmcgb2JqZWN0cyBhcyBtb2RlbCwgYSBpZFByb3AgdmFsdWUgaXMgbWFuZGF0b3J5LicpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgR2V0UmVjdXJzaXZlUHJvcGVydHkob2JqZWN0OiBhbnksIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChvYmosIHgpID0+IHtcbiAgICAgICAgICAgIGlmIChvYmopIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqW3hdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGlkZURyb3BEb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmlzRXhwYW5kZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVtaXRDaGFuZ2UoKSB7XG4gICAgICAgIC8vIG5vdGlmeSB3aXRoIHRpbWVvdXRcbiAgICAgICAgLy8gYWxsb3cgb3V0cHV0IHByb3BlcnR5IFwiZW5hYmxlZFwiIGFwcGxpZWQgYnkgcGFyZW50IGZpcnN0IGFuZCB0aGVuIGVtaXQgdGhlIG9uQ2hhbmdlXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RNb2RlbENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0TW9kZWwpO1xuICAgICAgICB9LCAxKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVBsYWNlbWVudCgpIHtcbiAgICAgICAgLy8gdXBkYXRlIG1lbnUgcG9zaXRpb24gYmFzZSBvbiBzY3JvbGxcbiAgICAgICAgdGhpcy5pc1RvcE1lbnVEaXJlY3Rpb24gPSB0aGlzLmdldE1lbnVEaXJlY3Rpb24oKSA9PT0gXCJ0b3BcIjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1lbnVEaXJlY3Rpb24oKTogXCJib3R0b21cIiB8IFwidG9wXCIge1xuXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHRvcCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcblxuICAgICAgICBpZiAodG9wID4gKGhlaWdodCAvIDIpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ0b3BcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBcImJvdHRvbVwiXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1heE1lbnVIZWlnaHQoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmdldENvbnRhaW5lckVsZW1lbnQoKTtcbiAgICAgICAgaWYgKCFjb250YWluZXJFbGVtZW50IHx8ICFjb250YWluZXJFbGVtZW50LmNsaWVudEhlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiMTkwcHhcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudEhlaWdodCA9IGNvbnRhaW5lckVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICBsZXQgaGVpZ2h0ID0gTWF0aC5yb3VuZCgocGFyZW50SGVpZ2h0IC8gMikgLSAyNSk7XG4gICAgICAgIGhlaWdodCA9IE1hdGgubWluKDIxNiwgaGVpZ2h0KTtcbiAgICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoOTYsIGhlaWdodCk7XG4gICAgICAgIHJldHVybiBgJHtoZWlnaHR9cHhgO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q29udGFpbmVyRWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBjb21wb25lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImFwcC1zZWxlY3RcIikuaXRlbSgwKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5vZmZzZXRQYXJlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZUFkZE5ld09wdGlvbigpIHtcbiAgICAgICAgdGhpcy5hZGROZXdPcHRpb24uZW1pdCh7IHZhbHVlOiB0aGlzLnNlYXJjaFRleHQgfSlcbiAgICAgICAgdGhpcy5oaWRlRHJvcERvd24oKVxuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGVSZW1vdmVPcHRpb24oKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlT3B0aW9uLmVtaXQoeyByZW1vdmVkOiB0cnVlIH0pXG4gICAgICAgIHRoaXMuaGlkZURyb3BEb3duKClcbiAgICB9XG5cblxuXG4gICAgcHVibGljIGFzeW5jIGxvYWRNb3JlKHNob3dTZWxlY3RlZE9uVG9wOiBib29sZWFuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZ05vdyA9IHRydWU7XG4gICAgICAgICAgICBpZiAoIXRoaXMubGF6eUxvYWRlcikge1xuICAgICAgICAgICAgICAgIHRocm93IGBsb2FkZXIgaXMgbm90IGF2YWlsYWJsZWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5maWx0ZXJlZE9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBsb2FkIGZpcnN0IDEwIHJlY29yZHMgZm9yIHRoZSB0aGUgZmlyc3QgdGltZVxuICAgICAgICAgICAgY29uc3QgbGltaXQgPSAodGhpcy5maWx0ZXJlZE9wdGlvbnMubGVuZ3RoID09IDApID8gMTAgOiAxMDA7XG4gICAgICAgICAgICBsZXQgbmV3SXRlbXMgPSBhd2FpdCB0aGlzLmxhenlMb2FkZXIoeyB0ZXh0OiB0aGlzLnNlYXJjaFRleHQgfHwgXCJcIiB9LCB0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGgsIGxpbWl0KTtcblxuICAgICAgICAgICAgdGhpcy5jYW5Mb2FkTW9yZSA9IChuZXdJdGVtcy5sZW5ndGggPT0gbGltaXQpO1xuXG4gICAgICAgICAgICAvLyB0aGUgc2VsZWN0TW9kZWwgY29udGFpbnMgdGhlIHNlbGVjdGVkIGl0ZW1zIGlkc1xuICAgICAgICAgICAgY29uc3QgY2hlY2tlZElkcyA9IHRoaXMuc2VsZWN0TW9kZWwgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgIGlmIChzaG93U2VsZWN0ZWRPblRvcCAmJiBjaGVja2VkSWRzPy5sZW5ndGgpIHtcblxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY2hlY2tlZCBpdGVtcyBmaXJzdFxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMuZmlsdGVyKGkgPT4gIWNoZWNrZWRJZHMuaW5jbHVkZXMoaS5pZCkpO1xuICAgICAgICAgICAgICAgIG5ld0l0ZW1zID0gbmV3SXRlbXMuZmlsdGVyKGkgPT4gIWNoZWNrZWRJZHMuaW5jbHVkZXMoaS5pZCBhcyBzdHJpbmcpKTtcblxuICAgICAgICAgICAgICAgIC8vIGFkZCBhbGwgY2hlY2tlZCBpdGVtcyB0byB0aGUgdG9wICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrZWRJdGVtcyA9IGF3YWl0IHRoaXMubGF6eUxvYWRlcih7IGlkczogY2hlY2tlZElkcyB9LCAwLCAxMDApO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gY2hlY2tlZEl0ZW1zLmNvbmNhdCh0aGlzLmZpbHRlcmVkT3B0aW9ucyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUxhYmVsKCk7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLy8gdGhlIGZpbHRlcmVkRGF0YVNvdXJjZSBjb250YWlucyB0aGUgaXRlbXMgdGhhdCBpcyB2aXNpbGlibGUgdG8gdXNlciBhdCB0aGUgY3VycmVudCBtb21lbnRcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMuY29uY2F0KG5ld0l0ZW1zKTtcblxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nTm93ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXBwLXNlbGVjdFwiPlxuICAgIDxidXR0b24gY2xhc3M9XCJhcHAtc2VsZWN0LXRvZ2dsZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUV4cGFuZCgpXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXNFeHBhbmRlZH1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1zZWxlY3QtbGFiZWxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNNb2RlbEVtcHR5KClcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57e3BsYWNlaG9sZGVyIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZC1pdGVtXCJcbiAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNNdWx0aXNlbGVjdCAmJiAhaXNNb2RlbEVtcHR5KClcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJ2YWx1ZVRlbXBsYXRlICYmIHNlbGVjdE1vZGVsWzBdOyBlbHNlIHRwbFZhbHVlVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInZhbHVlVGVtcGxhdGUudGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBzZWxlY3RNb2RlbDogc2VsZWN0TW9kZWwsIGxhYmVsVGV4dDogbGFiZWxUZXh0IH1cIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdHBsVmFsdWVUZXh0PlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBsYWJlbFRleHQgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAqbmdJZj1cImlzTXVsdGlzZWxlY3QgJiYgIWlzTW9kZWxFbXB0eSgpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgbGFiZWxUZXh0IHwgdHJhbnNsYXRlICB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGkgKm5nSWY9XCIhY3VzdG9tSWNvblwiXG4gICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgYXBwLXNlbGVjdC1pY29uXCI+ZXhwYW5kX21vcmU8L2k+XG4gICAgICAgIDxpICpuZ0lmPVwiY3VzdG9tSWNvblwiXG4gICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWQgY3VzdG9tLWljb25cIlxuICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiY3VzdG9tSWNvbkNvbG9yXCI+e3tjdXN0b21JY29ufX08L2k+XG4gICAgPC9idXR0b24+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLW1lbnUtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tbWVudSBhcHAtc2VsZWN0LWRyb3Bkb3duLXdyYXBwZXJcIlxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3Nob3ctdG9wJzogaXNUb3BNZW51RGlyZWN0aW9uIH1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtc2VsZWN0LWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0V4cGFuZGVkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1tZW51LWhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImhhc1NlYXJjaFwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tU2VhcmNoIG9wdGlvbnMtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8emVuLXNlYXJjaC1ib3ggWyh0ZXh0KV09XCJzZWFyY2hUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGV4dENoYW5nZSk9XCJvblNlYXJjaENoYW5nZSgpXCI+PC96ZW4tc2VhcmNoLWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiYnV0dG9uVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJidXR0b25UZW1wbGF0ZS50ZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1tZW51LWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLU5vIG9wdGlvbnMgZm91bmQtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLW9wdGlvbnMtZm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWZpbHRlcmVkT3B0aW9ucy5sZW5ndGggJiYgIWlzTG9hZGluZ05vd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ05vIG1hdGNoaW5nIG9wdGlvbnMgZm91bmQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS1TZWxlY3QgQWxsIE9wdGlvbi0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWl0ZW0tY2hlY2tib3ggc2VsZWN0LWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc011bHRpc2VsZWN0ICYmICFzZWFyY2hUZXh0ICYmICFpc0xhenlMb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQWxsKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tY2hlY2tib3ggW2NoZWNrZWRdPVwic2VsZWN0TW9kZWwubGVuZ3RoID09PSBvcHRpb25zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNlbGVjdE1vZGVsLmxlbmd0aCAhPT0gb3B0aW9ucy5sZW5ndGggJiYgc2VsZWN0TW9kZWwubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVWYWx1ZUNoYW5nZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidTZWxlY3QgQWxsJyB8IHRyYW5zbGF0ZVwiPjwvemVuLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tU2luZ2xlIHNlbGVjdCBPcHRpb25zLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNNdWx0aXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJhY3Rpb24taXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImVuYWJsZUFkZE5ld09wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQWRkTmV3T3B0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm5ld09wdGlvblRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbmV3T3B0aW9uVGV4dCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFuZXdPcHRpb25UZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0FkZCBOZXcnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYWN0aW9uLWl0ZW0gcmVtb3ZlLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJlbmFibGVSZW1vdmVPcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZVJlbW92ZU9wdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyZW1vdmVPcHRpb25UZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJlbW92ZU9wdGlvblRleHQgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhcmVtb3ZlT3B0aW9uVGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydSZW1vdmUgU2VsZWN0ZWQnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYWN0aW9uLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZU9wdGlvbkNsaWNrKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnYWN0aXZlJzogaXNTZWxlY3RlZChvcHRpb24pIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc011bHRpc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aW9uLWl0ZW0tdHJ1bmNhdGVdPVwiaXNUcnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJvcHRpb25UZW1wbGF0ZTsgZWxzZSB0cGxPcHRpb25UZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvblRlbXBsYXRlLnRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IG9wdGlvbjogb3B0aW9uIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0cGxPcHRpb25UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0TmFtZShvcHRpb24pIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tTXVsdGlzZWxlY3QgT3B0aW9ucy0tPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNNdWx0aXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1pdGVtLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlT3B0aW9uQ2xpY2sob3B0aW9uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tY2hlY2tib3ggKm5nSWY9XCJpc011bHRpc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0TmFtZShvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlVmFsdWVDaGFuZ2VdPVwidHJ1ZVwiPjwvemVuLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0xhenlMb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNhbkxvYWRNb3JlICYmICFpc0xvYWRpbmdOb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb24taXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJsb2FkTW9yZShmYWxzZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uLXN0cm9rZWQgZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snTG9hZCBNb3JlJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0xvYWRpbmdOb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsb2FkZXItbW9yZS1zcGlubmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tc3Bpbm5lciBzaXplPVwic21hbGxcIj48L3plbi1zcGlubmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
439
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9zZWxlY3QvemVuZHUtc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9zZWxlY3QvemVuZHUtc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN2RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQzs7Ozs7OztBQVF2RixNQUFNLE9BQU8sb0JBQW9CO0lBdUk3QixZQUNZLFFBQW9CO1FBQXBCLGFBQVEsR0FBUixRQUFRLENBQVk7UUFqSWhDOztXQUVHO1FBQ08sc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV0RDs7V0FFRztRQUNNLFlBQU8sR0FBVSxFQUFFLENBQUM7UUFFN0I7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLGNBQWMsQ0FBQztRQTRCdEM7O1dBRUc7UUFDTSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCOztXQUVHO1FBQ00sZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUV6Qjs7V0FFRztRQUNNLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBRTlCOztXQUVHO1FBQ00sZUFBVSxHQUFZLEtBQUssQ0FBQztRQUVyQzs7V0FFRztRQUNNLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQU83Qzs7V0FFRztRQUNPLGlCQUFZLEdBQXNCLElB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QUtHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBS0csZUFBZTtzQkFBdkIsS0FBSztnQkFLRyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFLRyxhQUFhO3NCQUFyQixLQUFLO2dCQUtJLFlBQVk7c0JBQXJCLE1BQU07Z0JBS0Usa0JBQWtCO3NCQUExQixLQUFLO2dCQUtHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFLRyxhQUFhO3NCQUFyQixLQUFLO2dCQUtHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBS0ksWUFBWTtzQkFBckIsTUFBTTtnQkFLRyxNQUFNO3NCQUFmLE1BQU07Z0JBK0JtQyxjQUFjO3NCQUF2RCxZQUFZO3VCQUFDLDBCQUEwQjtnQkFLQyxhQUFhO3NCQUFyRCxZQUFZO3VCQUFDLHlCQUF5QjtnQkFLRyxjQUFjO3NCQUF2RCxZQUFZO3VCQUFDLDBCQUEwQjtnQkFJeEMsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWM1QyxNQUFNO3NCQURMLFlBQVk7dUJBQUMsZUFBZSxFQUFFLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIENvbnRlbnRDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBaZW5kdVNlbGVjdE9wdGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4vdGVtcGxhdGVzL3plbmR1LXNlbGVjdC1vcHRpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IFplbmR1U2VsZWN0VmFsdWVEaXJlY3RpdmUgfSBmcm9tICcuL3RlbXBsYXRlcy96ZW5kdS1zZWxlY3QtdmFsdWUuZGlyZWN0aXZlJztcbmltcG9ydCB7IFplbmR1U2VsZWN0QnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi90ZW1wbGF0ZXMvemVuZHUtc2VsZWN0LWJ1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4uL2ZpbHRlci9maWx0ZXJzQ29uZmlnJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd6ZW4tc2VsZWN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vemVuZHUtc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi96ZW5kdS1zZWxlY3QuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBaZW5kdVNlbGVjdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gICAgLyoqXG4gICAgICogMi1XYXkgY29tcG9uZW50IHByb3BlcnR5IGZvciBzZWxlY3RlZCBpdGVtcy5cbiAgICAgKiBEb24ndCBpbml0aWFsaXplIHByb3BlcnR5IG9uIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgY2hhbmdlIHNvdXJjZSBwYXJhbWV0ZXJcbiAgICAgKi9cbiAgICBASW5wdXQoKSBzZWxlY3RNb2RlbDogYW55IHwgYW55W107XG5cbiAgICAvKipcbiAgICAgKiBjYWxsYmFjayB0byBlbWl0IGNoYW5nZXMgZm9yIHBhcmVudCBjb21wb25lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgc2VsZWN0TW9kZWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2Ygb3B0aW9ucyBmb3Igc2VsZWN0XG4gICAgICovXG4gICAgQElucHV0KCkgb3B0aW9uczogYW55W10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIFByb3BlcnR5IHRvIHNldCBjdXN0b20gcGxhY2Vob2xkZXIgdmFsdWVcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICdTZWxlY3QgSXRlbXMnO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIGtleSB2YWx1ZSB0byBnZXQgZGlzcGxheSBuYW1lIGZyb20gb3B0aW9uIG9iamVjdFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGRpc3BsYXlQcm9wOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEga2V5IHZhbHVlIHRvIGdldCBpZCBmcm9tIG9wdGlvbiBvYmplY3RcbiAgICAgKi9cbiAgICBASW5wdXQoKSBpZFByb3A6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbXBvbmVudCBwcm9wZXJ0eSB0byBlbmFibGUgc2VhcmNoXG4gICAgICovXG4gICAgQElucHV0KCkgaGFzU2VhcmNoOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50IHByb3BlcnR5IHRvIHJldHVybiB3aG9sZSBvcHRpb24gb2JqZWN0XG4gICAgICogQnkgZGVmYXVsdCBvbmx5IGlkIHZhbHVlIGlzIHJldHVybmVkXG4gICAgICovXG4gICAgQElucHV0KCkgcmV0dXJuT3B0aW9uOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50IHByb3BlcnR5IHRvIGVuYWJsZSBtdWx0aXNlbGVjdFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGlzTXVsdGlzZWxlY3Q6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBDb21wb25lbnQgcHJvcGVydHkgdG8gZGlzYWJsZSBjb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogU2hvdyB0aGUgY3VzdG9tIGljb24gZm9yIHRvZ2dsZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGN1c3RvbUljb24gPSBcIlwiO1xuXG4gICAgLyoqXG4gICAgICogQ29sb3IgZm9yIGN1c3RvbSBpY29uXG4gICAgICovXG4gICAgQElucHV0KCkgY3VzdG9tSWNvbkNvbG9yID0gXCJcIjtcblxuICAgIC8qKlxuICAgICAqIFRydW5jYXRlIHRleHQgd2l0aCBcIi4uLlwiIGF0IHRoZSBlbmRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBpc1RydW5jYXRlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBzaG93IEFkZCBOZXcgT3B0aW9uIGF0IGZpcnN0IHBsYWNlXG4gICAgICovXG4gICAgQElucHV0KCkgZW5hYmxlQWRkTmV3T3B0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBkaXNwbGF5IGN1c3RvbSB0ZXh0IGZvciBBZGQgTmV3IE9wdGlvblxuICAgICAqL1xuICAgIEBJbnB1dCgpIG5ld09wdGlvblRleHQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEVtaXQgZXZlbnQgd2hlbiBBZGQgTmV3IE9wdGlvbiBpcyBjbGlja2VkXG4gICAgICovXG4gICAgQE91dHB1dCgpIGFkZE5ld09wdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIC8qKlxuICAgICAgICogc2hvdyByZW1vdmUgT3B0aW9uIGF0IGZpcnN0IHBsYWNlXG4gICAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVSZW1vdmVPcHRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIGRpc3BsYXkgY3VzdG9tIHRleHQgZm9yIHJlbW92ZSBPcHRpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKSByZW1vdmVPcHRpb25UZXh0OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgbGF6eSBsb2FkaW5nIGZvciBvcHRpb25zXG4gICAgICovXG4gICAgQElucHV0KCkgaXNMYXp5TG9hZGluZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogTGF6eSBsb2FkZXIgZnVuY3Rpb24gdG8gZmV0Y2ggb3B0aW9uc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGxhenlMb2FkZXI/OiAoc2VhcmNoOiB7IHRleHQ/OiBzdHJpbmcsIGlkcz86IHN0cmluZ1tdIH0sIG9mZnNldDogbnVtYmVyLCBsaW1pdDogbnVtYmVyKSA9PiBQcm9taXNlPERhdGFTb3VyY2VbXT47XG5cbiAgICAvKipcbiAgICAgKiBFbWl0IGV2ZW50IHdoZW4gcmVtb3ZlIE9wdGlvbiBpcyBjbGlja2VkXG4gICAgICovXG4gICAgQE91dHB1dCgpIHJlbW92ZU9wdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXQgZXZlbnQgd2hlbiBzZWxlY3QgaXMgY2xvc2VkLCBzZW5kaW5nIHRoZSBzZWxlY3RlZCBkYXRhXG4gICAgICovXG4gICAgQE91dHB1dCgpIGNsb3NlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIC8qKlxuICAgICAqIEZpbHRlcmVkIGl0ZW1zIHZpc2libGUgb24gZHJvcGRvd25cbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyZWRPcHRpb25zOiBhbnlbXTtcblxuICAgIC8qKlxuICAgICAqIElzIGRyb3Bkb3duIGV4cGFuZGVkXG4gICAgICovXG4gICAgcHVibGljIGlzRXhwYW5kZWQgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBzZWFyY2hUZXh0ID0gJyc7XG5cbiAgICBwdWJsaWMgbGFiZWxUZXh0ID0gJyc7XG5cbiAgICBwdWJsaWMgaXNUb3BNZW51RGlyZWN0aW9uID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgb3B0aW9uOiBhbnlcblxuICAgIHB1YmxpYyBjYW5Mb2FkTW9yZSA9IGZhbHNlO1xuXG4gICAgcHVibGljIGlzTG9hZGluZ05vdyA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF9lbGVtZW50OiBFbGVtZW50UmVmKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IE9wdGlvbiBUZW1wbGF0ZSBmb3IgY3VzdG9tIEhUTUxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKFplbmR1U2VsZWN0T3B0aW9uRGlyZWN0aXZlKSBvcHRpb25UZW1wbGF0ZTogWmVuZHVTZWxlY3RPcHRpb25EaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3QgVmFsdWUgVGVtcGxhdGUgZm9yIGN1c3RvbSBIVE1MXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChaZW5kdVNlbGVjdFZhbHVlRGlyZWN0aXZlKSB2YWx1ZVRlbXBsYXRlOiBaZW5kdVNlbGVjdFZhbHVlRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IE9wdGlvbiBUZW1wbGF0ZSBmb3IgY3VzdG9tIEhUTUxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKFplbmR1U2VsZWN0QnV0dG9uRGlyZWN0aXZlKSBidXR0b25UZW1wbGF0ZTogWmVuZHVTZWxlY3RCdXR0b25EaXJlY3RpdmU7XG5cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzptb3VzZWRvd24nLCBbJyRldmVudCddKVxuICAgIG91dHNpZGVIYW5kbGluZyhldmVudCkge1xuICAgICAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgLy8gZWxlbWVudCBub3QgaW4gdGhlIERPTVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGhpZGUgdGhlIG1lbnUgZm9yIG91dHNpZGUgY2xpY2tcbiAgICAgICAgdGhpcy5oaWRlRHJvcERvd24oKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJywgW10pXG4gICAgc2Nyb2xsKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VPYmo6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlck9wdGlvbnMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVMYWJlbCgpO1xuXG4gICAgICAgIGlmIChjaGFuZ2VPYmpbXCJzZWxlY3RNb2RlbFwiXSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNMYXp5TG9hZGluZyAmJiB0aGlzLnNlbGVjdE1vZGVsPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZmlsdGVyZWRPcHRpb25zPy5sZW5ndGggJiYgIXRoaXMuaXNFeHBhbmRlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBwcmVsb2FkIGRhdGEgdG8gc2hvdyB0aGUgbGFiZWxzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZE1vcmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGlzTW9kZWxFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXNlbGVjdCkge1xuICAgICAgICAgICAgcmV0dXJuICF0aGlzLnNlbGVjdE1vZGVsIHx8ICF0aGlzLnNlbGVjdE1vZGVsLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5zZWxlY3RNb2RlbCA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5zZWxlY3RNb2RlbCA9PT0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGVPcHRpb25DbGljayhvcHRpb246IHN0cmluZyB8IG9iamVjdCkge1xuICAgICAgICB0aGlzLm9wdGlvbiA9IG9wdGlvbjtcbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLnJldHVybk9wdGlvbiA/IG9wdGlvbiA6IHRoaXMuZ2V0SWQob3B0aW9uKTtcblxuICAgICAgICBpZiAodGhpcy5pc011bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZU9wdGlvbihvcHRpb25WYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNpbmdsZVNlbGVjdChvcHRpb25WYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvLyBMb2dpYyBmb3Igc2luZ2xlIHNlbGVjdFxuICAgIHByaXZhdGUgc2luZ2xlU2VsZWN0KHZhbHVlOiBzdHJpbmcgfCBvYmplY3QpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RNb2RlbCA9IHZhbHVlO1xuXG4gICAgICAgIC8vICBIaWRlIGRyb3Bkb3duIGlmIHNpbmdsZSBzZWxlY3RcbiAgICAgICAgdGhpcy5oaWRlRHJvcERvd24oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9nZ2xlRXhwYW5kKCkge1xuICAgICAgICB0aGlzLmlzRXhwYW5kZWQgPSAhdGhpcy5pc0V4cGFuZGVkO1xuICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSBcIlwiO1xuICAgICAgICB0aGlzLmZpbHRlck9wdGlvbnMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVQbGFjZW1lbnQoKTtcblxuICAgICAgICBpZiAodGhpcy5pc0V4cGFuZGVkICYmIHRoaXMuaXNMYXp5TG9hZGluZykge1xuICAgICAgICAgICAgdGhpcy5sb2FkTW9yZSh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvZ2ljIGZvciBtdWx0aXNlbGVjdFxuICAgIHByaXZhdGUgdG9nZ2xlT3B0aW9uKHZhbHVlOiBzdHJpbmcgfCBvYmplY3QpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0TW9kZWwpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdE1vZGVsID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0RWxlbWVudEluZGV4KHZhbHVlKTtcblxuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdE1vZGVsLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgdGhpcy50b2dnbGVDaGlsZHJlbih0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0TW9kZWwuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ2hpbGRyZW4oZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVMYWJlbCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlQ2hpbGRyZW4oY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9uIHx8ICF0aGlzLm9wdGlvbi5DaGlsZHJlbnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9uLkNoaWxkcmVucy5mb3JFYWNoKChjaGlsZDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbiA9IHRoaXMub3B0aW9ucy5maW5kKGVsID0+IHRoaXMuZ2V0SWQoZWwpID09PSBjaGlsZCk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZEluZGV4ID0gdGhpcy5zZWxlY3RNb2RlbC5maW5kSW5kZXgoZWwgPT4gdGhpcy5nZXRJZChlbCkgPT09IGNoaWxkKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbiAmJiBjaGVja2VkICYmIGNoaWxkSW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RNb2RlbC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNoZWNrZWQgJiYgY2hpbGRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RNb2RlbC5zcGxpY2UoY2hpbGRJbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmUgY2FsbCB0byBoYW5kbGUgbmVzdGVkIGNoaWxkcmVuXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUNoaWxkcmVuKGNoZWNrZWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEVsZW1lbnRJbmRleCh2YWx1ZTogc3RyaW5nIHwgb2JqZWN0KTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlSWQgPSB0aGlzLmdldElkKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdE1vZGVsLmZpbmRJbmRleChlbCA9PiB0aGlzLmdldElkKGVsKSA9PT0gdmFsdWVJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RNb2RlbC5pbmRleE9mKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b2dnbGVBbGwoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdE1vZGVsLmxlbmd0aCAhPT0gdGhpcy5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RNb2RlbCA9IHRoaXMub3B0aW9ucy5tYXAoZWwgPT4gdGhpcy5yZXR1cm5PcHRpb24gPyBlbCA6IHRoaXMuZ2V0SWQoZWwpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0TW9kZWwgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblNlYXJjaENoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJPcHRpb25zKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNMYXp5TG9hZGluZykge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuY2FuTG9hZE1vcmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5sb2FkTW9yZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbHRlck9wdGlvbnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuc2xpY2UoMCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNlYXJjaFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCh0aGlzLnNlYXJjaFRleHQsICdpJyk7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gb3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IHJlZ2V4LnRlc3QodGhpcy5nZXROYW1lKG9wdGlvbikpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNTZWxlY3RlZChvcHRpb246IHN0cmluZyB8IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5pc01vZGVsRW1wdHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uSWQgPSB0aGlzLmdldElkKG9wdGlvbik7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXNlbGVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0TW9kZWwuZmluZEluZGV4KGVsID0+IHRoaXMuZ2V0SWQoZWwpID09PSBvcHRpb25JZCkgPj0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldElkKHRoaXMuc2VsZWN0TW9kZWwpID09PSBvcHRpb25JZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVMYWJlbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNNb2RlbEVtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ291bnQgPSB0aGlzLnNlbGVjdE1vZGVsLmxlbmd0aDtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ291bnQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsVGV4dCA9IHRoaXMuZ2V0TmFtZUZyb21WYWx1ZSh0aGlzLnNlbGVjdE1vZGVsWzBdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbFRleHQgPSBgJHtzZWxlY3RlZENvdW50fSBTZWxlY3RlZGA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhYmVsVGV4dCA9IHRoaXMuZ2V0TmFtZUZyb21WYWx1ZSh0aGlzLnNlbGVjdE1vZGVsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXROYW1lRnJvbVZhbHVlKHZhbDogc3RyaW5nIHwgb2JqZWN0KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMucmV0dXJuT3B0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXROYW1lKHZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0xhenlMb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0ID0gdGhpcy5maWx0ZXJlZE9wdGlvbnM/LmZpbmQoaSA9PiBpLmlkID09IHZhbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZShvcHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMgfHwgIXRoaXMub3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgb3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoZWwgPT4gdGhpcy5nZXRJZChlbCkgPT09IHZhbClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXROYW1lKG9wdGlvbiA/PyB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldE5hbWUob3B0aW9uOiBzdHJpbmcgfCBvYmplY3QpOiBzdHJpbmcge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXlQcm9wKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuR2V0UmVjdXJzaXZlUHJvcGVydHkob3B0aW9uLCB0aGlzLmRpc3BsYXlQcm9wKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQXBwLVNlbGVjdDogd2hlbiB1c2luZyBvYmplY3RzIGFzIG1vZGVsLCBhIGRpc3BsYXlQcm9wIHZhbHVlIGlzIG1hbmRhdG9yeS4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb247XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldElkKG9wdGlvbjogc3RyaW5nIHwgb2JqZWN0KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pZFByb3ApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5HZXRSZWN1cnNpdmVQcm9wZXJ0eShvcHRpb24sIHRoaXMuaWRQcm9wKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQXBwLVNlbGVjdDogd2hlbiB1c2luZyBvYmplY3RzIGFzIG1vZGVsLCBhIGlkUHJvcCB2YWx1ZSBpcyBtYW5kYXRvcnkuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBHZXRSZWN1cnNpdmVQcm9wZXJ0eShvYmplY3Q6IGFueSwgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKG9iaiwgeCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmpbeF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBvYmplY3QpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBoaWRlRHJvcERvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KHRoaXMuc2VsZWN0TW9kZWwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW1pdENoYW5nZSgpIHtcbiAgICAgICAgLy8gbm90aWZ5IHdpdGggdGltZW91dFxuICAgICAgICAvLyBhbGxvdyBvdXRwdXQgcHJvcGVydHkgXCJlbmFibGVkXCIgYXBwbGllZCBieSBwYXJlbnQgZmlyc3QgYW5kIHRoZW4gZW1pdCB0aGUgb25DaGFuZ2VcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdE1vZGVsQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RNb2RlbCk7XG4gICAgICAgIH0sIDEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUGxhY2VtZW50KCkge1xuICAgICAgICAvLyB1cGRhdGUgbWVudSBwb3NpdGlvbiBiYXNlIG9uIHNjcm9sbFxuICAgICAgICB0aGlzLmlzVG9wTWVudURpcmVjdGlvbiA9IHRoaXMuZ2V0TWVudURpcmVjdGlvbigpID09PSBcInRvcFwiO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TWVudURpcmVjdGlvbigpOiBcImJvdHRvbVwiIHwgXCJ0b3BcIiB7XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgdG9wID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG5cbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuXG4gICAgICAgIGlmICh0b3AgPiAoaGVpZ2h0IC8gMikpIHtcbiAgICAgICAgICAgIHJldHVybiBcInRvcFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiYm90dG9tXCJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TWF4TWVudUhlaWdodCgpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuZ2V0Q29udGFpbmVyRWxlbWVudCgpO1xuICAgICAgICBpZiAoIWNvbnRhaW5lckVsZW1lbnQgfHwgIWNvbnRhaW5lckVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gXCIxOTBweFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50SGVpZ2h0ID0gY29udGFpbmVyRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgIGxldCBoZWlnaHQgPSBNYXRoLnJvdW5kKChwYXJlbnRIZWlnaHQgLyAyKSAtIDI1KTtcbiAgICAgICAgaGVpZ2h0ID0gTWF0aC5taW4oMjE2LCBoZWlnaHQpO1xuICAgICAgICBoZWlnaHQgPSBNYXRoLm1heCg5NiwgaGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIGAke2hlaWdodH1weGA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDb250YWluZXJFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbXBvbmVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiYXBwLXNlbGVjdFwiKS5pdGVtKDApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICByZXR1cm4gY29udGFpbmVyLm9mZnNldFBhcmVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlQWRkTmV3T3B0aW9uKCkge1xuICAgICAgICB0aGlzLmFkZE5ld09wdGlvbi5lbWl0KHsgdmFsdWU6IHRoaXMuc2VhcmNoVGV4dCB9KVxuICAgICAgICB0aGlzLmhpZGVEcm9wRG93bigpXG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZVJlbW92ZU9wdGlvbigpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVPcHRpb24uZW1pdCh7IHJlbW92ZWQ6IHRydWUgfSlcbiAgICAgICAgdGhpcy5oaWRlRHJvcERvd24oKVxuICAgIH1cblxuXG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZE1vcmUoc2hvd1NlbGVjdGVkT25Ub3A6IGJvb2xlYW4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nTm93ID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghdGhpcy5sYXp5TG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgYGxvYWRlciBpcyBub3QgYXZhaWxhYmxlYFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbHRlcmVkT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGxvYWQgZmlyc3QgMTAgcmVjb3JkcyBmb3IgdGhlIHRoZSBmaXJzdCB0aW1lXG4gICAgICAgICAgICBjb25zdCBsaW1pdCA9ICh0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPT0gMCkgPyAxMCA6IDEwMDtcbiAgICAgICAgICAgIGxldCBuZXdJdGVtcyA9IGF3YWl0IHRoaXMubGF6eUxvYWRlcih7IHRleHQ6IHRoaXMuc2VhcmNoVGV4dCB8fCBcIlwiIH0sIHRoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCwgbGltaXQpO1xuXG4gICAgICAgICAgICB0aGlzLmNhbkxvYWRNb3JlID0gKG5ld0l0ZW1zLmxlbmd0aCA9PSBsaW1pdCk7XG5cbiAgICAgICAgICAgIC8vIHRoZSBzZWxlY3RNb2RlbCBjb250YWlucyB0aGUgc2VsZWN0ZWQgaXRlbXMgaWRzXG4gICAgICAgICAgICBjb25zdCBjaGVja2VkSWRzID0gdGhpcy5zZWxlY3RNb2RlbCBhcyBzdHJpbmdbXTtcblxuICAgICAgICAgICAgaWYgKHNob3dTZWxlY3RlZE9uVG9wICYmIGNoZWNrZWRJZHM/Lmxlbmd0aCkge1xuXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBjaGVja2VkIGl0ZW1zIGZpcnN0XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucy5maWx0ZXIoaSA9PiAhY2hlY2tlZElkcy5pbmNsdWRlcyhpLmlkKSk7XG4gICAgICAgICAgICAgICAgbmV3SXRlbXMgPSBuZXdJdGVtcy5maWx0ZXIoaSA9PiAhY2hlY2tlZElkcy5pbmNsdWRlcyhpLmlkIGFzIHN0cmluZykpO1xuXG4gICAgICAgICAgICAgICAgLy8gYWRkIGFsbCBjaGVja2VkIGl0ZW1zIHRvIHRoZSB0b3AgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZEl0ZW1zID0gYXdhaXQgdGhpcy5sYXp5TG9hZGVyKHsgaWRzOiBjaGVja2VkSWRzIH0sIDAsIDEwMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSBjaGVja2VkSXRlbXMuY29uY2F0KHRoaXMuZmlsdGVyZWRPcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTGFiZWwoKTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAvLyB0aGUgZmlsdGVyZWREYXRhU291cmNlIGNvbnRhaW5zIHRoZSBpdGVtcyB0aGF0IGlzIHZpc2lsaWJsZSB0byB1c2VyIGF0IHRoZSBjdXJyZW50IG1vbWVudFxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucy5jb25jYXQobmV3SXRlbXMpO1xuXG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmdOb3cgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJhcHAtc2VsZWN0XCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImFwcC1zZWxlY3QtdG9nZ2xlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRXhwYW5kKClcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBpc0V4cGFuZGVkfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLXNlbGVjdC1sYWJlbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc01vZGVsRW1wdHkoKVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7cGxhY2Vob2xkZXIgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc011bHRpc2VsZWN0ICYmICFpc01vZGVsRW1wdHkoKVwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cInZhbHVlVGVtcGxhdGUgJiYgc2VsZWN0TW9kZWxbMF07IGVsc2UgdHBsVmFsdWVUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidmFsdWVUZW1wbGF0ZS50ZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHNlbGVjdE1vZGVsOiBzZWxlY3RNb2RlbCwgbGFiZWxUZXh0OiBsYWJlbFRleHQgfVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0cGxWYWx1ZVRleHQ+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGxhYmVsVGV4dCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWQtaXRlbVwiXG4gICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNNdWx0aXNlbGVjdCAmJiAhaXNNb2RlbEVtcHR5KClcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBsYWJlbFRleHQgfCB0cmFuc2xhdGUgIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aSAqbmdJZj1cIiFjdXN0b21JY29uXCJcbiAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBhcHAtc2VsZWN0LWljb25cIj5leHBhbmRfbW9yZTwvaT5cbiAgICAgICAgPGkgKm5nSWY9XCJjdXN0b21JY29uXCJcbiAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZCBjdXN0b20taWNvblwiXG4gICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJjdXN0b21JY29uQ29sb3JcIj57e2N1c3RvbUljb259fTwvaT5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tbWVudS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1tZW51IGFwcC1zZWxlY3QtZHJvcGRvd24td3JhcHBlclwiXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2hvdy10b3AnOiBpc1RvcE1lbnVEaXJlY3Rpb24gfVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1zZWxlY3QtZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAqbmdJZj1cImlzRXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLW1lbnUtaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaGFzU2VhcmNoXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS1TZWFyY2ggb3B0aW9ucy0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4tc2VhcmNoLWJveCBbKHRleHQpXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXh0Q2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKClcIj48L3plbi1zZWFyY2gtYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJidXR0b25UZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJ1dHRvblRlbXBsYXRlLnRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLW1lbnUtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tTm8gb3B0aW9ucyBmb3VuZC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm8tb3B0aW9ucy1mb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAmJiAhaXNMb2FkaW5nTm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnTm8gbWF0Y2hpbmcgb3B0aW9ucyBmb3VuZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLVNlbGVjdCBBbGwgT3B0aW9uLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24taXRlbS1jaGVja2JveCBzZWxlY3QtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzTXVsdGlzZWxlY3QgJiYgIXNlYXJjaFRleHQgJiYgIWlzTGF6eUxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVBbGwoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1jaGVja2JveCBbY2hlY2tlZF09XCJzZWxlY3RNb2RlbC5sZW5ndGggPT09IG9wdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0TW9kZWwubGVuZ3RoICE9PSBvcHRpb25zLmxlbmd0aCAmJiBzZWxlY3RNb2RlbC5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZVZhbHVlQ2hhbmdlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ1NlbGVjdCBBbGwnIHwgdHJhbnNsYXRlXCI+PC96ZW4tY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS1TaW5nbGUgc2VsZWN0IE9wdGlvbnMtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc011bHRpc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImFjdGlvbi1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZW5hYmxlQWRkTmV3T3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVBZGROZXdPcHRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibmV3T3B0aW9uVGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBuZXdPcHRpb25UZXh0IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIW5ld09wdGlvblRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snQWRkIE5ldycgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJhY3Rpb24taXRlbSByZW1vdmUtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImVuYWJsZVJlbW92ZU9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlUmVtb3ZlT3B0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJlbW92ZU9wdGlvblRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcmVtb3ZlT3B0aW9uVGV4dCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFyZW1vdmVPcHRpb25UZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J1JlbW92ZSBTZWxlY3RlZCcgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJhY3Rpb24taXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlT3B0aW9uQ2xpY2sob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBpc1NlbGVjdGVkKG9wdGlvbikgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzTXVsdGlzZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3Rpb24taXRlbS10cnVuY2F0ZV09XCJpc1RydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cIm9wdGlvblRlbXBsYXRlOyBlbHNlIHRwbE9wdGlvblRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uVGVtcGxhdGUudGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgb3B0aW9uOiBvcHRpb24gfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RwbE9wdGlvblRleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXROYW1lKG9wdGlvbikgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS1NdWx0aXNlbGVjdCBPcHRpb25zLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc011bHRpc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWl0ZW0tY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVPcHRpb25DbGljayhvcHRpb24pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1jaGVja2JveCAqbmdJZj1cImlzTXVsdGlzZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNTZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJnZXROYW1lKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVWYWx1ZUNoYW5nZV09XCJ0cnVlXCI+PC96ZW4tY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTGF6eUxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2FuTG9hZE1vcmUgJiYgIWlzTG9hZGluZ05vd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbi1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImxvYWRNb3JlKGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24tc3Ryb2tlZCBmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydMb2FkIE1vcmUnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzTG9hZGluZ05vd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxvYWRlci1tb3JlLXNwaW5uZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1zcGlubmVyIHNpemU9XCJzbWFsbFwiPjwvemVuLXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -2017,6 +2017,10 @@ class ZenduSelectComponent {
2017
2017
  * Emit event when remove Option is clicked
2018
2018
  */
2019
2019
  this.removeOption = new EventEmitter();
2020
+ /**
2021
+ * Emit event when select is closed, sending the selected data
2022
+ */
2023
+ this.closed = new EventEmitter();
2020
2024
  /**
2021
2025
  * Is dropdown expanded
2022
2026
  */
@@ -2246,6 +2250,7 @@ class ZenduSelectComponent {
2246
2250
  hideDropDown() {
2247
2251
  return __awaiter(this, void 0, void 0, function* () {
2248
2252
  this.isExpanded = false;
2253
+ this.closed.emit(this.selectModel);
2249
2254
  });
2250
2255
  }
2251
2256
  emitChange() {
@@ -2332,10 +2337,10 @@ class ZenduSelectComponent {
2332
2337
  }
2333
2338
  }
2334
2339
  ZenduSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduSelectComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
2335
- ZenduSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduSelectComponent, selector: "zen-select", inputs: { selectModel: "selectModel", options: "options", placeholder: "placeholder", displayProp: "displayProp", idProp: "idProp", hasSearch: "hasSearch", returnOption: "returnOption", isMultiselect: "isMultiselect", disabled: "disabled", customIcon: "customIcon", customIconColor: "customIconColor", isTruncate: "isTruncate", enableAddNewOption: "enableAddNewOption", newOptionText: "newOptionText", enableRemoveOption: "enableRemoveOption", removeOptionText: "removeOptionText", isLazyLoading: "isLazyLoading", lazyLoader: "lazyLoader" }, outputs: { selectModelChange: "selectModelChange", addNewOption: "addNewOption", removeOption: "removeOption" }, host: { listeners: { "window:mousedown": "outsideHandling($event)", "window:scroll": "scroll()" } }, queries: [{ propertyName: "optionTemplate", first: true, predicate: ZenduSelectOptionDirective, descendants: true }, { propertyName: "valueTemplate", first: true, predicate: ZenduSelectValueDirective, descendants: true }, { propertyName: "buttonTemplate", first: true, predicate: ZenduSelectButtonDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"app-select\">\n <button class=\"app-select-toggle\"\n [disabled]=\"disabled\"\n (click)=\"toggleExpand()\"\n [ngClass]=\"{'active': isExpanded}\">\n <div class=\"app-select-label\">\n <div class=\"placeholder\"\n *ngIf=\"isModelEmpty()\">\n <span>{{placeholder | translate}}</span>\n </div>\n <div class=\"selected-item\"\n *ngIf=\"!isMultiselect && !isModelEmpty()\">\n <ng-template *ngIf=\"valueTemplate && selectModel[0]; else tplValueText\"\n [ngTemplateOutlet]=\"valueTemplate.template\"\n [ngTemplateOutletContext]=\"{ selectModel: selectModel, labelText: labelText }\"></ng-template>\n <ng-template #tplValueText>\n <span>{{ labelText | translate }}</span>\n </ng-template>\n </div>\n <div class=\"selected-item\"\n *ngIf=\"isMultiselect && !isModelEmpty()\">\n <span>{{ labelText | translate }}</span>\n </div>\n </div>\n <i *ngIf=\"!customIcon\"\n class=\"material-icons app-select-icon\">expand_more</i>\n <i *ngIf=\"customIcon\"\n class=\"material-icons-outlined custom-icon\"\n [style.color]=\"customIconColor\">{{customIcon}}</i>\n </button>\n\n <div class=\"action-menu-container\">\n <div class=\"action-menu app-select-dropdown-wrapper\"\n [ngClass]=\"{ 'show-top': isTopMenuDirection }\">\n <div class=\"app-select-dropdown\"\n *ngIf=\"isExpanded\">\n <div class=\"action-menu-header\"\n *ngIf=\"hasSearch\">\n <!--Search options-->\n <div class=\"search-wrapper\">\n <zen-search-box [(text)]=\"searchText\"\n (textChange)=\"onSearchChange()\"></zen-search-box>\n </div>\n </div>\n <ng-template *ngIf=\"buttonTemplate\"\n [ngTemplateOutlet]=\"buttonTemplate.template\">\n </ng-template>\n <div class=\"action-menu-body\">\n <!--No options found-->\n <div class=\"no-options-found\"\n *ngIf=\"!filteredOptions.length && !isLoadingNow\">\n {{ 'No matching options found' | translate }}\n </div>\n\n <!--Select All Option-->\n <div class=\"action-item-checkbox select-all\"\n *ngIf=\"isMultiselect && !searchText && !isLazyLoading\"\n (click)=\"toggleAll()\">\n <zen-checkbox [checked]=\"selectModel.length === options.length\"\n [indeterminate]=\"selectModel.length !== options.length && selectModel.length\"\n [disableValueChange]=\"true\"\n [label]=\"'Select All' | translate\"></zen-checkbox>\n </div>\n\n <!--Single select Options-->\n <ng-container *ngIf=\"!isMultiselect\">\n <a class=\"action-item\"\n *ngIf=\"enableAddNewOption\"\n (click)=\"handleAddNewOption()\">\n <span *ngIf=\"newOptionText\">\n {{ newOptionText | translate }}\n </span>\n <span *ngIf=\"!newOptionText\">\n {{'Add New' | translate}}\n </span>\n </a>\n\n <a class=\"action-item remove-item\"\n *ngIf=\"enableRemoveOption\"\n (click)=\"handleRemoveOption()\">\n <span *ngIf=\"removeOptionText\">\n {{ removeOptionText | translate }}\n </span>\n <span *ngIf=\"!removeOptionText\">\n {{'Remove Selected' | translate}}\n </span>\n </a>\n\n <a class=\"action-item\"\n *ngFor=\"let option of filteredOptions\"\n (click)=\"handleOptionClick(option)\"\n [ngClass]=\"{ 'active': isSelected(option) }\">\n <span *ngIf=\"!isMultiselect\"\n [class.action-item-truncate]=\"isTruncate\">\n <ng-template *ngIf=\"optionTemplate; else tplOptionText\"\n [ngTemplateOutlet]=\"optionTemplate.template\"\n [ngTemplateOutletContext]=\"{ option: option }\">\n </ng-template>\n <ng-template #tplOptionText>\n {{ getName(option) | translate }}\n </ng-template>\n </span>\n </a>\n </ng-container>\n\n <!--Multiselect Options-->\n <ng-container *ngIf=\"isMultiselect\">\n <div class=\"action-item-checkbox\"\n *ngFor=\"let option of filteredOptions\"\n (click)=\"handleOptionClick(option)\">\n <zen-checkbox *ngIf=\"isMultiselect\"\n [checked]=\"isSelected(option)\"\n [label]=\"getName(option)\"\n [disableValueChange]=\"true\"></zen-checkbox>\n </div>\n\n <ng-container *ngIf=\"isLazyLoading\">\n <div *ngIf=\"canLoadMore && !isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".app-select{width:100%;position:relative}.app-select ::-webkit-scrollbar-thumb{background-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle{display:flex;align-items:center;justify-content:space-between;position:relative;transition:.3s;width:100%;background:#ffffff;-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid #d6d6d8;padding:0 0 8px;font-style:normal;font-weight:400;font-size:16px;line-height:24px;color:#333}.app-select .app-select-toggle .app-select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-style:normal;font-weight:400;font-size:14px;line-height:24px}.app-select .app-select-toggle .app-select-label .placeholder{color:#bebebe}.app-select .app-select-toggle .app-select-label .selected-item{color:#333}.app-select .app-select-toggle .custom-icon{color:#bebebe}.app-select .app-select-toggle .app-select-icon{color:#bebebe;transition:.3s}.app-select .app-select-toggle:focus{border-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle:focus .app-select-icon,.app-select .app-select-toggle:focus .custom-icon{color:var(--color-primary, #2188d9)!important}.app-select .app-select-toggle[readonly],.app-select .app-select-toggle[disabled]{cursor:not-allowed;color:#b8b9bc;border-color:#d0d0d2}.app-select .app-select-toggle.active{border-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle.active .custom-icon{color:var(--color-primary, #2188d9)!important}.app-select .app-select-toggle.active .app-select-icon{transform:rotate(180deg);color:var(--color-primary, #2188d9)}.app-select .action-menu-container{position:sticky;width:inherit;z-index:10}.app-select .app-select-dropdown-wrapper{top:115%;width:inherit}.app-select .app-select-dropdown-wrapper.show-top{top:unset;bottom:115%}.app-select .app-select-dropdown-wrapper .action-menu-body{max-height:200px;overflow:auto}.app-select .app-select-dropdown-wrapper .action-menu-body .remove-item{color:#dc3e33}.app-select .app-select-dropdown-wrapper .no-options-found{background:#ffffff;color:#b8b9bc;padding:8px 16px;text-decoration:none;font-style:normal;font-weight:400;font-size:16px;line-height:24px}.app-select .app-select-dropdown-wrapper .select-all{font-weight:500}.app-select .app-select-dropdown-wrapper .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ZenduCheckboxComponent, selector: "zen-checkbox", inputs: ["checked", "label", "disabled", "disableValueChange", "indeterminate", "imageUrl"], outputs: ["checkedChange"] }, { kind: "component", type: ZenduSearchBoxComponent, selector: "zen-search-box", inputs: ["text", "delay", "autoFocus", "placeholder"], outputs: ["textChange"] }, { kind: "component", type: ZenduSpinner, selector: "zen-spinner", inputs: ["size"] }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }] });
2340
+ ZenduSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduSelectComponent, selector: "zen-select", inputs: { selectModel: "selectModel", options: "options", placeholder: "placeholder", displayProp: "displayProp", idProp: "idProp", hasSearch: "hasSearch", returnOption: "returnOption", isMultiselect: "isMultiselect", disabled: "disabled", customIcon: "customIcon", customIconColor: "customIconColor", isTruncate: "isTruncate", enableAddNewOption: "enableAddNewOption", newOptionText: "newOptionText", enableRemoveOption: "enableRemoveOption", removeOptionText: "removeOptionText", isLazyLoading: "isLazyLoading", lazyLoader: "lazyLoader" }, outputs: { selectModelChange: "selectModelChange", addNewOption: "addNewOption", removeOption: "removeOption", closed: "closed" }, host: { listeners: { "window:mousedown": "outsideHandling($event)", "window:scroll": "scroll()" } }, queries: [{ propertyName: "optionTemplate", first: true, predicate: ZenduSelectOptionDirective, descendants: true }, { propertyName: "valueTemplate", first: true, predicate: ZenduSelectValueDirective, descendants: true }, { propertyName: "buttonTemplate", first: true, predicate: ZenduSelectButtonDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"app-select\">\n <button class=\"app-select-toggle\"\n [disabled]=\"disabled\"\n (click)=\"toggleExpand()\"\n [ngClass]=\"{'active': isExpanded}\">\n <div class=\"app-select-label\">\n <div class=\"placeholder\"\n *ngIf=\"isModelEmpty()\">\n <span>{{placeholder | translate}}</span>\n </div>\n <div class=\"selected-item\"\n *ngIf=\"!isMultiselect && !isModelEmpty()\">\n <ng-template *ngIf=\"valueTemplate && selectModel[0]; else tplValueText\"\n [ngTemplateOutlet]=\"valueTemplate.template\"\n [ngTemplateOutletContext]=\"{ selectModel: selectModel, labelText: labelText }\"></ng-template>\n <ng-template #tplValueText>\n <span>{{ labelText | translate }}</span>\n </ng-template>\n </div>\n <div class=\"selected-item\"\n *ngIf=\"isMultiselect && !isModelEmpty()\">\n <span>{{ labelText | translate }}</span>\n </div>\n </div>\n <i *ngIf=\"!customIcon\"\n class=\"material-icons app-select-icon\">expand_more</i>\n <i *ngIf=\"customIcon\"\n class=\"material-icons-outlined custom-icon\"\n [style.color]=\"customIconColor\">{{customIcon}}</i>\n </button>\n\n <div class=\"action-menu-container\">\n <div class=\"action-menu app-select-dropdown-wrapper\"\n [ngClass]=\"{ 'show-top': isTopMenuDirection }\">\n <div class=\"app-select-dropdown\"\n *ngIf=\"isExpanded\">\n <div class=\"action-menu-header\"\n *ngIf=\"hasSearch\">\n <!--Search options-->\n <div class=\"search-wrapper\">\n <zen-search-box [(text)]=\"searchText\"\n (textChange)=\"onSearchChange()\"></zen-search-box>\n </div>\n </div>\n <ng-template *ngIf=\"buttonTemplate\"\n [ngTemplateOutlet]=\"buttonTemplate.template\">\n </ng-template>\n <div class=\"action-menu-body\">\n <!--No options found-->\n <div class=\"no-options-found\"\n *ngIf=\"!filteredOptions.length && !isLoadingNow\">\n {{ 'No matching options found' | translate }}\n </div>\n\n <!--Select All Option-->\n <div class=\"action-item-checkbox select-all\"\n *ngIf=\"isMultiselect && !searchText && !isLazyLoading\"\n (click)=\"toggleAll()\">\n <zen-checkbox [checked]=\"selectModel.length === options.length\"\n [indeterminate]=\"selectModel.length !== options.length && selectModel.length\"\n [disableValueChange]=\"true\"\n [label]=\"'Select All' | translate\"></zen-checkbox>\n </div>\n\n <!--Single select Options-->\n <ng-container *ngIf=\"!isMultiselect\">\n <a class=\"action-item\"\n *ngIf=\"enableAddNewOption\"\n (click)=\"handleAddNewOption()\">\n <span *ngIf=\"newOptionText\">\n {{ newOptionText | translate }}\n </span>\n <span *ngIf=\"!newOptionText\">\n {{'Add New' | translate}}\n </span>\n </a>\n\n <a class=\"action-item remove-item\"\n *ngIf=\"enableRemoveOption\"\n (click)=\"handleRemoveOption()\">\n <span *ngIf=\"removeOptionText\">\n {{ removeOptionText | translate }}\n </span>\n <span *ngIf=\"!removeOptionText\">\n {{'Remove Selected' | translate}}\n </span>\n </a>\n\n <a class=\"action-item\"\n *ngFor=\"let option of filteredOptions\"\n (click)=\"handleOptionClick(option)\"\n [ngClass]=\"{ 'active': isSelected(option) }\">\n <span *ngIf=\"!isMultiselect\"\n [class.action-item-truncate]=\"isTruncate\">\n <ng-template *ngIf=\"optionTemplate; else tplOptionText\"\n [ngTemplateOutlet]=\"optionTemplate.template\"\n [ngTemplateOutletContext]=\"{ option: option }\">\n </ng-template>\n <ng-template #tplOptionText>\n {{ getName(option) | translate }}\n </ng-template>\n </span>\n </a>\n </ng-container>\n\n <!--Multiselect Options-->\n <ng-container *ngIf=\"isMultiselect\">\n <div class=\"action-item-checkbox\"\n *ngFor=\"let option of filteredOptions\"\n (click)=\"handleOptionClick(option)\">\n <zen-checkbox *ngIf=\"isMultiselect\"\n [checked]=\"isSelected(option)\"\n [label]=\"getName(option)\"\n [disableValueChange]=\"true\"></zen-checkbox>\n </div>\n\n <ng-container *ngIf=\"isLazyLoading\">\n <div *ngIf=\"canLoadMore && !isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{--toggle-border-bottom: var(--zen-select-toggle-border-bottom, 1px solid #d6d6d8)}.app-select{width:100%;position:relative}.app-select ::-webkit-scrollbar-thumb{background-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle{display:flex;align-items:center;justify-content:space-between;position:relative;transition:.3s;width:100%;background:#ffffff;-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:var(--toggle-border-bottom);padding:0 0 8px;font-style:normal;font-weight:400;font-size:16px;line-height:24px;color:#333}.app-select .app-select-toggle .app-select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-style:normal;font-weight:400;font-size:14px;line-height:24px}.app-select .app-select-toggle .app-select-label .placeholder{color:#bebebe}.app-select .app-select-toggle .app-select-label .selected-item{color:#333}.app-select .app-select-toggle .custom-icon{color:#bebebe}.app-select .app-select-toggle .app-select-icon{color:#bebebe;transition:.3s}.app-select .app-select-toggle:focus{border-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle:focus .app-select-icon,.app-select .app-select-toggle:focus .custom-icon{color:var(--color-primary, #2188d9)!important}.app-select .app-select-toggle[readonly],.app-select .app-select-toggle[disabled]{cursor:not-allowed;color:#b8b9bc;border-color:#d0d0d2}.app-select .app-select-toggle.active{border-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle.active .custom-icon{color:var(--color-primary, #2188d9)!important}.app-select .app-select-toggle.active .app-select-icon{transform:rotate(180deg);color:var(--color-primary, #2188d9)}.app-select .action-menu-container{position:sticky;width:inherit;z-index:10}.app-select .app-select-dropdown-wrapper{top:115%;width:inherit}.app-select .app-select-dropdown-wrapper.show-top{top:unset;bottom:115%}.app-select .app-select-dropdown-wrapper .action-menu-body{max-height:200px;overflow:auto}.app-select .app-select-dropdown-wrapper .action-menu-body .remove-item{color:#dc3e33}.app-select .app-select-dropdown-wrapper .no-options-found{background:#ffffff;color:#b8b9bc;padding:8px 16px;text-decoration:none;font-style:normal;font-weight:400;font-size:16px;line-height:24px}.app-select .app-select-dropdown-wrapper .select-all{font-weight:500}.app-select .app-select-dropdown-wrapper .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ZenduCheckboxComponent, selector: "zen-checkbox", inputs: ["checked", "label", "disabled", "disableValueChange", "indeterminate", "imageUrl"], outputs: ["checkedChange"] }, { kind: "component", type: ZenduSearchBoxComponent, selector: "zen-search-box", inputs: ["text", "delay", "autoFocus", "placeholder"], outputs: ["textChange"] }, { kind: "component", type: ZenduSpinner, selector: "zen-spinner", inputs: ["size"] }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }] });
2336
2341
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduSelectComponent, decorators: [{
2337
2342
  type: Component,
2338
- args: [{ selector: 'zen-select', template: "<div class=\"app-select\">\n <button class=\"app-select-toggle\"\n [disabled]=\"disabled\"\n (click)=\"toggleExpand()\"\n [ngClass]=\"{'active': isExpanded}\">\n <div class=\"app-select-label\">\n <div class=\"placeholder\"\n *ngIf=\"isModelEmpty()\">\n <span>{{placeholder | translate}}</span>\n </div>\n <div class=\"selected-item\"\n *ngIf=\"!isMultiselect && !isModelEmpty()\">\n <ng-template *ngIf=\"valueTemplate && selectModel[0]; else tplValueText\"\n [ngTemplateOutlet]=\"valueTemplate.template\"\n [ngTemplateOutletContext]=\"{ selectModel: selectModel, labelText: labelText }\"></ng-template>\n <ng-template #tplValueText>\n <span>{{ labelText | translate }}</span>\n </ng-template>\n </div>\n <div class=\"selected-item\"\n *ngIf=\"isMultiselect && !isModelEmpty()\">\n <span>{{ labelText | translate }}</span>\n </div>\n </div>\n <i *ngIf=\"!customIcon\"\n class=\"material-icons app-select-icon\">expand_more</i>\n <i *ngIf=\"customIcon\"\n class=\"material-icons-outlined custom-icon\"\n [style.color]=\"customIconColor\">{{customIcon}}</i>\n </button>\n\n <div class=\"action-menu-container\">\n <div class=\"action-menu app-select-dropdown-wrapper\"\n [ngClass]=\"{ 'show-top': isTopMenuDirection }\">\n <div class=\"app-select-dropdown\"\n *ngIf=\"isExpanded\">\n <div class=\"action-menu-header\"\n *ngIf=\"hasSearch\">\n <!--Search options-->\n <div class=\"search-wrapper\">\n <zen-search-box [(text)]=\"searchText\"\n (textChange)=\"onSearchChange()\"></zen-search-box>\n </div>\n </div>\n <ng-template *ngIf=\"buttonTemplate\"\n [ngTemplateOutlet]=\"buttonTemplate.template\">\n </ng-template>\n <div class=\"action-menu-body\">\n <!--No options found-->\n <div class=\"no-options-found\"\n *ngIf=\"!filteredOptions.length && !isLoadingNow\">\n {{ 'No matching options found' | translate }}\n </div>\n\n <!--Select All Option-->\n <div class=\"action-item-checkbox select-all\"\n *ngIf=\"isMultiselect && !searchText && !isLazyLoading\"\n (click)=\"toggleAll()\">\n <zen-checkbox [checked]=\"selectModel.length === options.length\"\n [indeterminate]=\"selectModel.length !== options.length && selectModel.length\"\n [disableValueChange]=\"true\"\n [label]=\"'Select All' | translate\"></zen-checkbox>\n </div>\n\n <!--Single select Options-->\n <ng-container *ngIf=\"!isMultiselect\">\n <a class=\"action-item\"\n *ngIf=\"enableAddNewOption\"\n (click)=\"handleAddNewOption()\">\n <span *ngIf=\"newOptionText\">\n {{ newOptionText | translate }}\n </span>\n <span *ngIf=\"!newOptionText\">\n {{'Add New' | translate}}\n </span>\n </a>\n\n <a class=\"action-item remove-item\"\n *ngIf=\"enableRemoveOption\"\n (click)=\"handleRemoveOption()\">\n <span *ngIf=\"removeOptionText\">\n {{ removeOptionText | translate }}\n </span>\n <span *ngIf=\"!removeOptionText\">\n {{'Remove Selected' | translate}}\n </span>\n </a>\n\n <a class=\"action-item\"\n *ngFor=\"let option of filteredOptions\"\n (click)=\"handleOptionClick(option)\"\n [ngClass]=\"{ 'active': isSelected(option) }\">\n <span *ngIf=\"!isMultiselect\"\n [class.action-item-truncate]=\"isTruncate\">\n <ng-template *ngIf=\"optionTemplate; else tplOptionText\"\n [ngTemplateOutlet]=\"optionTemplate.template\"\n [ngTemplateOutletContext]=\"{ option: option }\">\n </ng-template>\n <ng-template #tplOptionText>\n {{ getName(option) | translate }}\n </ng-template>\n </span>\n </a>\n </ng-container>\n\n <!--Multiselect Options-->\n <ng-container *ngIf=\"isMultiselect\">\n <div class=\"action-item-checkbox\"\n *ngFor=\"let option of filteredOptions\"\n (click)=\"handleOptionClick(option)\">\n <zen-checkbox *ngIf=\"isMultiselect\"\n [checked]=\"isSelected(option)\"\n [label]=\"getName(option)\"\n [disableValueChange]=\"true\"></zen-checkbox>\n </div>\n\n <ng-container *ngIf=\"isLazyLoading\">\n <div *ngIf=\"canLoadMore && !isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".app-select{width:100%;position:relative}.app-select ::-webkit-scrollbar-thumb{background-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle{display:flex;align-items:center;justify-content:space-between;position:relative;transition:.3s;width:100%;background:#ffffff;-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid #d6d6d8;padding:0 0 8px;font-style:normal;font-weight:400;font-size:16px;line-height:24px;color:#333}.app-select .app-select-toggle .app-select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-style:normal;font-weight:400;font-size:14px;line-height:24px}.app-select .app-select-toggle .app-select-label .placeholder{color:#bebebe}.app-select .app-select-toggle .app-select-label .selected-item{color:#333}.app-select .app-select-toggle .custom-icon{color:#bebebe}.app-select .app-select-toggle .app-select-icon{color:#bebebe;transition:.3s}.app-select .app-select-toggle:focus{border-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle:focus .app-select-icon,.app-select .app-select-toggle:focus .custom-icon{color:var(--color-primary, #2188d9)!important}.app-select .app-select-toggle[readonly],.app-select .app-select-toggle[disabled]{cursor:not-allowed;color:#b8b9bc;border-color:#d0d0d2}.app-select .app-select-toggle.active{border-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle.active .custom-icon{color:var(--color-primary, #2188d9)!important}.app-select .app-select-toggle.active .app-select-icon{transform:rotate(180deg);color:var(--color-primary, #2188d9)}.app-select .action-menu-container{position:sticky;width:inherit;z-index:10}.app-select .app-select-dropdown-wrapper{top:115%;width:inherit}.app-select .app-select-dropdown-wrapper.show-top{top:unset;bottom:115%}.app-select .app-select-dropdown-wrapper .action-menu-body{max-height:200px;overflow:auto}.app-select .app-select-dropdown-wrapper .action-menu-body .remove-item{color:#dc3e33}.app-select .app-select-dropdown-wrapper .no-options-found{background:#ffffff;color:#b8b9bc;padding:8px 16px;text-decoration:none;font-style:normal;font-weight:400;font-size:16px;line-height:24px}.app-select .app-select-dropdown-wrapper .select-all{font-weight:500}.app-select .app-select-dropdown-wrapper .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}\n"] }]
2343
+ args: [{ selector: 'zen-select', template: "<div class=\"app-select\">\n <button class=\"app-select-toggle\"\n [disabled]=\"disabled\"\n (click)=\"toggleExpand()\"\n [ngClass]=\"{'active': isExpanded}\">\n <div class=\"app-select-label\">\n <div class=\"placeholder\"\n *ngIf=\"isModelEmpty()\">\n <span>{{placeholder | translate}}</span>\n </div>\n <div class=\"selected-item\"\n *ngIf=\"!isMultiselect && !isModelEmpty()\">\n <ng-template *ngIf=\"valueTemplate && selectModel[0]; else tplValueText\"\n [ngTemplateOutlet]=\"valueTemplate.template\"\n [ngTemplateOutletContext]=\"{ selectModel: selectModel, labelText: labelText }\"></ng-template>\n <ng-template #tplValueText>\n <span>{{ labelText | translate }}</span>\n </ng-template>\n </div>\n <div class=\"selected-item\"\n *ngIf=\"isMultiselect && !isModelEmpty()\">\n <span>{{ labelText | translate }}</span>\n </div>\n </div>\n <i *ngIf=\"!customIcon\"\n class=\"material-icons app-select-icon\">expand_more</i>\n <i *ngIf=\"customIcon\"\n class=\"material-icons-outlined custom-icon\"\n [style.color]=\"customIconColor\">{{customIcon}}</i>\n </button>\n\n <div class=\"action-menu-container\">\n <div class=\"action-menu app-select-dropdown-wrapper\"\n [ngClass]=\"{ 'show-top': isTopMenuDirection }\">\n <div class=\"app-select-dropdown\"\n *ngIf=\"isExpanded\">\n <div class=\"action-menu-header\"\n *ngIf=\"hasSearch\">\n <!--Search options-->\n <div class=\"search-wrapper\">\n <zen-search-box [(text)]=\"searchText\"\n (textChange)=\"onSearchChange()\"></zen-search-box>\n </div>\n </div>\n <ng-template *ngIf=\"buttonTemplate\"\n [ngTemplateOutlet]=\"buttonTemplate.template\">\n </ng-template>\n <div class=\"action-menu-body\">\n <!--No options found-->\n <div class=\"no-options-found\"\n *ngIf=\"!filteredOptions.length && !isLoadingNow\">\n {{ 'No matching options found' | translate }}\n </div>\n\n <!--Select All Option-->\n <div class=\"action-item-checkbox select-all\"\n *ngIf=\"isMultiselect && !searchText && !isLazyLoading\"\n (click)=\"toggleAll()\">\n <zen-checkbox [checked]=\"selectModel.length === options.length\"\n [indeterminate]=\"selectModel.length !== options.length && selectModel.length\"\n [disableValueChange]=\"true\"\n [label]=\"'Select All' | translate\"></zen-checkbox>\n </div>\n\n <!--Single select Options-->\n <ng-container *ngIf=\"!isMultiselect\">\n <a class=\"action-item\"\n *ngIf=\"enableAddNewOption\"\n (click)=\"handleAddNewOption()\">\n <span *ngIf=\"newOptionText\">\n {{ newOptionText | translate }}\n </span>\n <span *ngIf=\"!newOptionText\">\n {{'Add New' | translate}}\n </span>\n </a>\n\n <a class=\"action-item remove-item\"\n *ngIf=\"enableRemoveOption\"\n (click)=\"handleRemoveOption()\">\n <span *ngIf=\"removeOptionText\">\n {{ removeOptionText | translate }}\n </span>\n <span *ngIf=\"!removeOptionText\">\n {{'Remove Selected' | translate}}\n </span>\n </a>\n\n <a class=\"action-item\"\n *ngFor=\"let option of filteredOptions\"\n (click)=\"handleOptionClick(option)\"\n [ngClass]=\"{ 'active': isSelected(option) }\">\n <span *ngIf=\"!isMultiselect\"\n [class.action-item-truncate]=\"isTruncate\">\n <ng-template *ngIf=\"optionTemplate; else tplOptionText\"\n [ngTemplateOutlet]=\"optionTemplate.template\"\n [ngTemplateOutletContext]=\"{ option: option }\">\n </ng-template>\n <ng-template #tplOptionText>\n {{ getName(option) | translate }}\n </ng-template>\n </span>\n </a>\n </ng-container>\n\n <!--Multiselect Options-->\n <ng-container *ngIf=\"isMultiselect\">\n <div class=\"action-item-checkbox\"\n *ngFor=\"let option of filteredOptions\"\n (click)=\"handleOptionClick(option)\">\n <zen-checkbox *ngIf=\"isMultiselect\"\n [checked]=\"isSelected(option)\"\n [label]=\"getName(option)\"\n [disableValueChange]=\"true\"></zen-checkbox>\n </div>\n\n <ng-container *ngIf=\"isLazyLoading\">\n <div *ngIf=\"canLoadMore && !isLoadingNow\"\n class=\"action-item\">\n <button (click)=\"loadMore(false)\"\n class=\"button-stroked full-width\">\n {{'Load More' | translate}}\n </button>\n </div>\n <div *ngIf=\"isLoadingNow\"\n class=\"loader-more-spinner\">\n <zen-spinner size=\"small\"></zen-spinner>\n </div>\n </ng-container>\n\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{--toggle-border-bottom: var(--zen-select-toggle-border-bottom, 1px solid #d6d6d8)}.app-select{width:100%;position:relative}.app-select ::-webkit-scrollbar-thumb{background-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle{display:flex;align-items:center;justify-content:space-between;position:relative;transition:.3s;width:100%;background:#ffffff;-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:var(--toggle-border-bottom);padding:0 0 8px;font-style:normal;font-weight:400;font-size:16px;line-height:24px;color:#333}.app-select .app-select-toggle .app-select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-style:normal;font-weight:400;font-size:14px;line-height:24px}.app-select .app-select-toggle .app-select-label .placeholder{color:#bebebe}.app-select .app-select-toggle .app-select-label .selected-item{color:#333}.app-select .app-select-toggle .custom-icon{color:#bebebe}.app-select .app-select-toggle .app-select-icon{color:#bebebe;transition:.3s}.app-select .app-select-toggle:focus{border-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle:focus .app-select-icon,.app-select .app-select-toggle:focus .custom-icon{color:var(--color-primary, #2188d9)!important}.app-select .app-select-toggle[readonly],.app-select .app-select-toggle[disabled]{cursor:not-allowed;color:#b8b9bc;border-color:#d0d0d2}.app-select .app-select-toggle.active{border-color:var(--color-primary, #2188d9)}.app-select .app-select-toggle.active .custom-icon{color:var(--color-primary, #2188d9)!important}.app-select .app-select-toggle.active .app-select-icon{transform:rotate(180deg);color:var(--color-primary, #2188d9)}.app-select .action-menu-container{position:sticky;width:inherit;z-index:10}.app-select .app-select-dropdown-wrapper{top:115%;width:inherit}.app-select .app-select-dropdown-wrapper.show-top{top:unset;bottom:115%}.app-select .app-select-dropdown-wrapper .action-menu-body{max-height:200px;overflow:auto}.app-select .app-select-dropdown-wrapper .action-menu-body .remove-item{color:#dc3e33}.app-select .app-select-dropdown-wrapper .no-options-found{background:#ffffff;color:#b8b9bc;padding:8px 16px;text-decoration:none;font-style:normal;font-weight:400;font-size:16px;line-height:24px}.app-select .app-select-dropdown-wrapper .select-all{font-weight:500}.app-select .app-select-dropdown-wrapper .loader-more-spinner{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box}\n"] }]
2339
2344
  }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { selectModel: [{
2340
2345
  type: Input
2341
2346
  }], selectModelChange: [{
@@ -2378,6 +2383,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
2378
2383
  type: Input
2379
2384
  }], removeOption: [{
2380
2385
  type: Output
2386
+ }], closed: [{
2387
+ type: Output
2381
2388
  }], optionTemplate: [{
2382
2389
  type: ContentChild,
2383
2390
  args: [ZenduSelectOptionDirective]
@@ -2447,7 +2454,7 @@ class ZenduPaginationBarComponent {
2447
2454
  }
2448
2455
  }
2449
2456
  ZenduPaginationBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduPaginationBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2450
- ZenduPaginationBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduPaginationBarComponent, selector: "zen-pagination-bar", inputs: { page: "page", perPage: "perPage", count: "count" }, outputs: { pageChange: "pageChange", perPageChange: "perPageChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"pagination-component\">\n <div class=\"select-dropdown\">\n <label>{{\"Rows per page\" | translate}}:</label>\n <zen-select [(selectModel)]=\"perPage\"\n [options]=\"availablePagesSize\"\n (selectModelChange)=\"updatePageSize()\"></zen-select>\n </div>\n <div class=\"pages\">\n <button class=\"pagination-button\"\n [disabled]=\"page - 1 <= 0\"\n (click)=\"prevPage()\">\n <i class=\"material-icons\">keyboard_arrow_left</i>\n </button>\n <label>{{((page - 1) * perPage) + 1 }} - {{endRowSize()}} of {{count}}</label>\n <button class=\"pagination-button\"\n [disabled]=\"page + 1 > totalPages\"\n (click)=\"nextPage()\">\n <i class=\"material-icons\">keyboard_arrow_right</i>\n </button>\n </div>\n</div>\n", styles: [".pagination-component{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.pagination-component .select-dropdown{display:flex;flex-direction:row;align-items:center;gap:8px}.pagination-component .select-dropdown label{margin:0;font-style:normal;font-weight:400;font-size:12px;line-height:120%;color:#4f4f4f}.pagination-component .pages{display:flex;flex-direction:row;align-items:center;gap:8px}.pagination-component .pages label{margin:0;font-style:normal;font-weight:400;font-size:12px;line-height:16px;color:#828282}.pagination-component .pages .pagination-button{display:flex;flex-direction:row;align-items:center;height:16px;padding:0;box-sizing:border-box;white-space:nowrap;border:none;border-radius:50%;transition:.1s;cursor:pointer;color:#828282;background:#FFFFFF}.pagination-component .pages .pagination-button:hover{color:#4f4f4f;background:#F2F2F2}.pagination-component .pages .pagination-button:focus{outline:none;color:#2188d9;background:#F4F9FD}.pagination-component .pages .pagination-button:disabled{color:#e0e0e0;background:#FFFFFF;cursor:not-allowed}.pagination-component .pages .pagination-button .material-icons{font-size:16px;height:16px;width:16px}\n"], dependencies: [{ kind: "component", type: ZenduSelectComponent, selector: "zen-select", inputs: ["selectModel", "options", "placeholder", "displayProp", "idProp", "hasSearch", "returnOption", "isMultiselect", "disabled", "customIcon", "customIconColor", "isTruncate", "enableAddNewOption", "newOptionText", "enableRemoveOption", "removeOptionText", "isLazyLoading", "lazyLoader"], outputs: ["selectModelChange", "addNewOption", "removeOption"] }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }] });
2457
+ ZenduPaginationBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduPaginationBarComponent, selector: "zen-pagination-bar", inputs: { page: "page", perPage: "perPage", count: "count" }, outputs: { pageChange: "pageChange", perPageChange: "perPageChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"pagination-component\">\n <div class=\"select-dropdown\">\n <label>{{\"Rows per page\" | translate}}:</label>\n <zen-select [(selectModel)]=\"perPage\"\n [options]=\"availablePagesSize\"\n (selectModelChange)=\"updatePageSize()\"></zen-select>\n </div>\n <div class=\"pages\">\n <button class=\"pagination-button\"\n [disabled]=\"page - 1 <= 0\"\n (click)=\"prevPage()\">\n <i class=\"material-icons\">keyboard_arrow_left</i>\n </button>\n <label>{{((page - 1) * perPage) + 1 }} - {{endRowSize()}} of {{count}}</label>\n <button class=\"pagination-button\"\n [disabled]=\"page + 1 > totalPages\"\n (click)=\"nextPage()\">\n <i class=\"material-icons\">keyboard_arrow_right</i>\n </button>\n </div>\n</div>\n", styles: [".pagination-component{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.pagination-component .select-dropdown{display:flex;flex-direction:row;align-items:center;gap:8px}.pagination-component .select-dropdown label{margin:0;font-style:normal;font-weight:400;font-size:12px;line-height:120%;color:#4f4f4f}.pagination-component .pages{display:flex;flex-direction:row;align-items:center;gap:8px}.pagination-component .pages label{margin:0;font-style:normal;font-weight:400;font-size:12px;line-height:16px;color:#828282}.pagination-component .pages .pagination-button{display:flex;flex-direction:row;align-items:center;height:16px;padding:0;box-sizing:border-box;white-space:nowrap;border:none;border-radius:50%;transition:.1s;cursor:pointer;color:#828282;background:#FFFFFF}.pagination-component .pages .pagination-button:hover{color:#4f4f4f;background:#F2F2F2}.pagination-component .pages .pagination-button:focus{outline:none;color:#2188d9;background:#F4F9FD}.pagination-component .pages .pagination-button:disabled{color:#e0e0e0;background:#FFFFFF;cursor:not-allowed}.pagination-component .pages .pagination-button .material-icons{font-size:16px;height:16px;width:16px}\n"], dependencies: [{ kind: "component", type: ZenduSelectComponent, selector: "zen-select", inputs: ["selectModel", "options", "placeholder", "displayProp", "idProp", "hasSearch", "returnOption", "isMultiselect", "disabled", "customIcon", "customIconColor", "isTruncate", "enableAddNewOption", "newOptionText", "enableRemoveOption", "removeOptionText", "isLazyLoading", "lazyLoader"], outputs: ["selectModelChange", "addNewOption", "removeOption", "closed"] }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }] });
2451
2458
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduPaginationBarComponent, decorators: [{
2452
2459
  type: Component,
2453
2460
  args: [{ selector: 'zen-pagination-bar', template: "<div class=\"pagination-component\">\n <div class=\"select-dropdown\">\n <label>{{\"Rows per page\" | translate}}:</label>\n <zen-select [(selectModel)]=\"perPage\"\n [options]=\"availablePagesSize\"\n (selectModelChange)=\"updatePageSize()\"></zen-select>\n </div>\n <div class=\"pages\">\n <button class=\"pagination-button\"\n [disabled]=\"page - 1 <= 0\"\n (click)=\"prevPage()\">\n <i class=\"material-icons\">keyboard_arrow_left</i>\n </button>\n <label>{{((page - 1) * perPage) + 1 }} - {{endRowSize()}} of {{count}}</label>\n <button class=\"pagination-button\"\n [disabled]=\"page + 1 > totalPages\"\n (click)=\"nextPage()\">\n <i class=\"material-icons\">keyboard_arrow_right</i>\n </button>\n </div>\n</div>\n", styles: [".pagination-component{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.pagination-component .select-dropdown{display:flex;flex-direction:row;align-items:center;gap:8px}.pagination-component .select-dropdown label{margin:0;font-style:normal;font-weight:400;font-size:12px;line-height:120%;color:#4f4f4f}.pagination-component .pages{display:flex;flex-direction:row;align-items:center;gap:8px}.pagination-component .pages label{margin:0;font-style:normal;font-weight:400;font-size:12px;line-height:16px;color:#828282}.pagination-component .pages .pagination-button{display:flex;flex-direction:row;align-items:center;height:16px;padding:0;box-sizing:border-box;white-space:nowrap;border:none;border-radius:50%;transition:.1s;cursor:pointer;color:#828282;background:#FFFFFF}.pagination-component .pages .pagination-button:hover{color:#4f4f4f;background:#F2F2F2}.pagination-component .pages .pagination-button:focus{outline:none;color:#2188d9;background:#F4F9FD}.pagination-component .pages .pagination-button:disabled{color:#e0e0e0;background:#FFFFFF;cursor:not-allowed}.pagination-component .pages .pagination-button .material-icons{font-size:16px;height:16px;width:16px}\n"] }]