@indice/ng-components
Version:
Indice common components for Angular v12
211 lines • 54.2 kB
JavaScript
import { Component, ContentChild, ContentChildren, EventEmitter, Input, Output } from '@angular/core';
import { ListViewType, PagerPosition } from '../../types';
import { ListColumnComponent } from './list-column.component';
import { ListTileComponent } from './list-tile.component';
import { ListDetailsSectionComponent } from './list-details-section.component';
import { Icons } from '../../icons';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../advanced-search/advanced-search.component";
import * as i3 from "./list-view-empty-state.component";
import * as i4 from "../pager/pager.component";
import * as i5 from "../skeleton-loader/skeleton-loader.component";
;
export class ListViewComponent {
// COLUMNS
set cols(refs) {
this.columns = refs?.toArray();
if (this.columns && this.columns.length > 0) {
this.tableViewSupported = true;
}
this.multipleFullWidth = this.columns.filter(c => c.fullWidth).length > 1;
this.fullWidthTHClass = this.multipleFullWidth ? 'list-view-th-half' : 'list-view-th-full';
this.fullWidthTDClass = this.multipleFullWidth ? 'list-view-td-half' : 'list-view-td-full';
}
// tslint:disable-next-line:no-input-rename
set tiles(ref) {
this.tileTemplate = ref;
if (this.tileTemplate) {
this.tilesViewSupported = true;
}
}
set details(ref) {
this.detailsTemplate = ref;
if (this.detailsTemplate) {
this.detailsSectionSupported = true;
}
}
constructor() {
this.searchOptions = [];
this.filters = [];
// BUSY STATE
this.busy = false;
// PAGING - pass through for pager component
this.count = null;
this.page = 1;
this.view = ListViewType.Table;
this.sort = null;
// tslint:disable-next-line:no-input-rename
this.pageSize = 20;
// tslint:disable-next-line:no-input-rename
this.pageSizeOptions = [];
// SORTING - pass through for pager component
// tslint:disable-next-line:no-input-rename
this.sortOptions = [];
this.operatorsDisabled = false;
// tslint:disable-next-line:no-input-rename
this.sortdir = '-';
// tslint:disable-next-line:no-input-rename
this.tilesCount = 4;
// tslint:disable-next-line:no-input-rename
this.showPager = true;
// tslint:disable-next-line:no-input-rename
this.pagerPosition = PagerPosition.Top;
// DETAILS SECTION
// Check if details section and button should be displayed according to the count of the value given
// tslint:disable-next-line:no-input-rename
this.detailsSectionPropertyCount = null;
this.pageChanged = new EventEmitter();
this.pageSizeChanged = new EventEmitter();
this.detailsOpened = new EventEmitter();
this.sortChanged = new EventEmitter();
this.sortdirChanged = new EventEmitter();
this.advancedSearchChanged = new EventEmitter();
this.multipleFullWidth = false;
this.expandIcon = Icons.Expand;
this.collapseIcon = Icons.Collapse;
this.tableViewSupported = false;
this.fullWidthTHClass = 'list-view-th-full';
this.fullWidthTDClass = 'list-view-td-full';
this.tilesViewSupported = false;
this.detailsSectionSupported = false;
this.loaderItems = [];
this.columns = [];
this.tilesDeckClass = 'cards-deck-4';
this.tileTemplate = null;
this.detailsTemplate = null;
for (let i = 0; i < 9; i++) {
this.loaderItems.push({});
}
if (this.pagerPosition) {
this.pagerPosition = this.pagerPosition;
}
}
ngOnChanges(changes) {
const tilesCountChange = changes['tiles-count'] || changes.tilesCount;
if (tilesCountChange) {
this.setTilesDeckClass(tilesCountChange.currentValue);
}
}
// events
emitPageChanged($event) {
this.pageChanged.emit($event);
}
emitPageSizeChanged($event) {
this.pageSizeChanged.emit($event);
}
emitSortChanged($event) {
this.sortChanged.emit($event);
}
emitSortdirChanged($event) {
this.sortdirChanged.emit($event);
}
emitAdvancedSearchChanged($event) {
this.advancedSearchChanged.emit($event);
}
toggleDetails(item) {
item.detailsExpanded = !item.detailsExpanded;
this.detailsOpened.emit({ item, open: item.detailsExpanded });
}
// helpers
setTilesDeckClass(tiles) {
if (tiles >= 1 && tiles <= 4) {
this.tilesDeckClass =
this.view !== ListViewType.Gallery
? `cards-deck-${tiles}`
: this.items && this.items.length > 0
? `gallery-deck-${tiles}`
: 'gallery-deck';
}
else {
this.tilesDeckClass =
this.view !== ListViewType.Gallery
? 'cards-deck-3'
: this.items && this.items.length > 0
? 'gallery-deck-3'
: 'gallery-deck';
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: ListViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.6", type: ListViewComponent, selector: "lib-list-view", inputs: { searchOptions: ["search-options", "searchOptions"], filters: "filters", busy: "busy", items: "items", count: "count", page: "page", view: "view", sort: "sort", pageSize: ["page-size", "pageSize"], pageSizeOptions: ["page-size-options", "pageSizeOptions"], sortOptions: ["sort-options", "sortOptions"], operatorsDisabled: ["operators-disabled", "operatorsDisabled"], sortdir: ["sort-dir", "sortdir"], tilesCount: ["tiles-count", "tilesCount"], showPager: ["show-pager", "showPager"], pagerPosition: ["pager-position", "pagerPosition"], detailsSectionPropertyCount: ["details-section-property-count", "detailsSectionPropertyCount"] }, outputs: { pageChanged: "pageChanged", pageSizeChanged: "pageSizeChanged", detailsOpened: "detailsOpened", sortChanged: "sortChanged", sortdirChanged: "sortdirChanged", advancedSearchChanged: "advancedSearchChanged" }, queries: [{ propertyName: "tiles", first: true, predicate: ListTileComponent, descendants: true, read: ListTileComponent }, { propertyName: "details", first: true, predicate: ListDetailsSectionComponent, descendants: true, read: ListDetailsSectionComponent }, { propertyName: "cols", predicate: ListColumnComponent, read: ListColumnComponent }], usesOnChanges: true, ngImport: i0, template: "<div>\r\n <lib-advanced-search *ngIf=\"searchOptions && searchOptions.length > 0\"\r\n [search-options]=\"searchOptions\"\r\n [filters]=\"filters\"\r\n [operators-disabled]=\"operatorsDisabled\"\r\n (advancedSearchChanged)=\"emitAdvancedSearchChanged($event)\">\r\n </lib-advanced-search>\r\n\r\n <lib-pager *ngIf=\"showPager && (pagerPosition == 'top' || pagerPosition == 'both')\"\r\n [page]=\"page\"\r\n [page-size]=\"pageSize\"\r\n [count]=\"count\"\r\n [sort-options]=\"sortOptions\"\r\n [sort]=\"sort\"\r\n [sort-dir]=\"sortdir\"\r\n [busy]=\"busy\"\r\n (pageChanged)=\"emitPageChanged($event)\"\r\n (pageSizeChanged)=\"emitPageSizeChanged($event)\"\r\n (sortChanged)=\"emitSortChanged($event)\"\r\n (sortdirChanged)=\"emitSortdirChanged($event)\">\r\n <ng-content select=\"[pager-near-content]\" ngProjectAs=\"[pager-near-content]\"></ng-content>\r\n </lib-pager>\r\n</div>\r\n\r\n<ng-container [ngSwitch]=\"view\">\r\n\r\n <ng-container *ngSwitchCase=\"'tiles'\">\r\n <div [class]=\"busy ? 'cards-deck-1' : tilesDeckClass\">\r\n\r\n <lib-skeleton-loader *ngIf=\"busy\" [deck-class]=\"tilesDeckClass\" [count]=\"7\" [type]=\"'tiles'\"></lib-skeleton-loader>\r\n\r\n <ng-container *ngIf=\"!busy && items && items.length > 0\">\r\n <ng-container *ngFor=\"let item of items\">\r\n <span *ngIf=\"!tileTemplate || !tileTemplate.template\">template missing..</span>\r\n <ng-template [ngTemplateOutlet]=\"tileTemplate.template\" [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-template>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <!-- *ngSwitchCase=\"'gallery'\" -->\r\n <ng-container *ngSwitchCase=\"'gallery'\">\r\n <ul role=\"list\" role=\"list\" [class]=\"tilesDeckClass\">\r\n\r\n <lib-skeleton-loader *ngIf=\"busy\" [count]=\"5\" [type]=\"'tiles'\"></lib-skeleton-loader>\r\n\r\n <ng-container *ngIf=\"!busy && items && items.length > 0\">\r\n <ng-container *ngFor=\"let item of items\" role=\"listitem\">\r\n <span *ngIf=\"!tileTemplate || !tileTemplate.template\">template missing..</span>\r\n <ng-template [ngTemplateOutlet]=\"tileTemplate.template\" [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </ul>\r\n </ng-container>\r\n\r\n <!-- *ngSwitchCase=\"'table'\" -->\r\n <ng-container *ngSwitchDefault>\r\n\r\n <div class=\"list-view-container\">\r\n <div class=\"list-view-container-inner\">\r\n <table class=\"list-view-table\">\r\n <thead class=\"list-view-thead\">\r\n <tr>\r\n <ng-container *ngIf=\"detailsSectionSupported\">\r\n <th aria-label=\"details button\" class=\"list-view-th-details\"></th>\r\n </ng-container>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th scope=\"col\" [class]=\"col.fullWidth ? fullWidthTHClass : 'list-view-th'\">\r\n {{col.title}}\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody class=\"list-view-tbody\" *ngIf=\"busy\">\r\n <ng-container *ngFor=\"let item of loaderItems;let i=index\">\r\n <tr class=\"list-view-tr\">\r\n <ng-container *ngIf=\"detailsSectionSupported\">\r\n <td class=\"list-view-td-details\"\r\n *ngIf=\"detailsSectionPropertyCount !== null ? item[detailsSectionPropertyCount] !== 0 : true; else hiddenDetailsButton\">\r\n <button disabled\r\n title=\"expand-collapse\"\r\n type=\"button\"\r\n class=\"expand-collapse-button\">\r\n <!-- Heroicon name: solid/plus -->\r\n <i [class]=\"item.detailsExpanded ? collapseIcon : expandIcon\"></i>\r\n </button>\r\n </td>\r\n <ng-template #hiddenDetailsButton>\r\n <td class=\"list-view-td-details\"></td>\r\n </ng-template>\r\n </ng-container>\r\n <td *ngFor=\"let col of columns\"\r\n [class]=\"col.fullWidth ? fullWidthTDClass : 'list-view-td'\">\r\n <div class=\"w-full animate-pulse h-8 bg-gray-200 rounded\"></div>\r\n </td>\r\n </tr>\r\n <ng-container *ngIf=\"detailsSectionSupported\">\r\n <tr *ngIf=\"item.detailsExpanded\">\r\n <td [colSpan]=\"columns.length + 1\"\r\n class=\"list-view-td bg-gray-100\">\r\n <ng-template [ngTemplateOutlet]=\"detailsTemplate.template\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-template>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-container>\r\n </tbody>\r\n <tbody class=\"list-view-tbody\"\r\n *ngIf=\"!busy\">\r\n <ng-container *ngFor=\"let item of items;let i=index\">\r\n <tr class=\"list-view-tr\">\r\n <ng-container *ngIf=\"detailsSectionSupported\">\r\n <td class=\"list-view-td-details\"\r\n *ngIf=\"detailsSectionPropertyCount !== null ? item[detailsSectionPropertyCount] !== 0 : true; else hiddenDetailsButton\">\r\n <button (click)=\"toggleDetails(item)\"\r\n title=\"toggleDetails\"\r\n type=\"button\"\r\n class=\"expand-collapse-button\">\r\n <!-- Heroicon name: solid/plus -->\r\n <i [class]=\"item.detailsExpanded ? collapseIcon : expandIcon\"></i>\r\n </button>\r\n </td>\r\n <ng-template #hiddenDetailsButton>\r\n <td class=\"list-view-td-details\"></td>\r\n </ng-template>\r\n </ng-container>\r\n <td *ngFor=\"let col of columns\"\r\n [class]=\"col.fullWidth ? fullWidthTDClass : 'list-view-td'\">\r\n <ng-template [ngTemplateOutlet]=\"col.template\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-template>\r\n </td>\r\n </tr>\r\n <ng-container *ngIf=\"detailsSectionSupported\">\r\n <tr *ngIf=\"item.detailsExpanded\">\r\n <td [colSpan]=\"columns.length + 1\"\r\n class=\"list-view-td bg-gray-100\">\r\n <ng-template [ngTemplateOutlet]=\"detailsTemplate.template\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-template>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!busy && items && items.length === 0\">\r\n <div class=\"cards-deck-1\">\r\n <lib-list-view-empty-state></lib-list-view-empty-state>\r\n </div>\r\n </ng-container>\r\n</ng-container>\r\n\r\n<ng-content></ng-content>\r\n\r\n<div class=\"px-2 mt-2\"\r\n *ngIf=\"items && items.length !== 0 && showPager && (pagerPosition == 'bottom' || pagerPosition == 'both')\">\r\n <lib-pager [page]=\"page\"\r\n [page-size]=\"pageSize\"\r\n [count]=\"count\"\r\n [sort-options]=\"sortOptions\"\r\n [sort]=\"sort\"\r\n [sort-dir]=\"sortdir\"\r\n [busy]=\"busy\"\r\n (pageChanged)=\"emitPageChanged($event)\"\r\n (pageSizeChanged)=\"emitPageSizeChanged($event)\"\r\n (sortChanged)=\"emitSortChanged($event)\"\r\n (sortdirChanged)=\"emitSortdirChanged($event)\">\r\n </lib-pager>\r\n</div>\r\n", dependencies: [{ 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: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i2.AdvancedSearchComponent, selector: "lib-advanced-search", inputs: ["operators-disabled", "search-options", "filters"], outputs: ["advancedSearchChanged"] }, { kind: "component", type: i3.ListViewEmptyStateComponent, selector: "lib-list-view-empty-state", inputs: ["title", "sub-title", "new-item-label"] }, { kind: "component", type: i4.PagerComponent, selector: "lib-pager", inputs: ["busy", "count", "page", "page-size", "page-size-options", "sort-options", "sort", "sort-dir"], outputs: ["pageChanged", "pageSizeChanged", "sortChanged", "sortdirChanged"] }, { kind: "component", type: i5.SkeletonLoaderComponent, selector: "lib-skeleton-loader", inputs: ["count", "type", "deck-class"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: ListViewComponent, decorators: [{
type: Component,
args: [{ selector: 'lib-list-view', template: "<div>\r\n <lib-advanced-search *ngIf=\"searchOptions && searchOptions.length > 0\"\r\n [search-options]=\"searchOptions\"\r\n [filters]=\"filters\"\r\n [operators-disabled]=\"operatorsDisabled\"\r\n (advancedSearchChanged)=\"emitAdvancedSearchChanged($event)\">\r\n </lib-advanced-search>\r\n\r\n <lib-pager *ngIf=\"showPager && (pagerPosition == 'top' || pagerPosition == 'both')\"\r\n [page]=\"page\"\r\n [page-size]=\"pageSize\"\r\n [count]=\"count\"\r\n [sort-options]=\"sortOptions\"\r\n [sort]=\"sort\"\r\n [sort-dir]=\"sortdir\"\r\n [busy]=\"busy\"\r\n (pageChanged)=\"emitPageChanged($event)\"\r\n (pageSizeChanged)=\"emitPageSizeChanged($event)\"\r\n (sortChanged)=\"emitSortChanged($event)\"\r\n (sortdirChanged)=\"emitSortdirChanged($event)\">\r\n <ng-content select=\"[pager-near-content]\" ngProjectAs=\"[pager-near-content]\"></ng-content>\r\n </lib-pager>\r\n</div>\r\n\r\n<ng-container [ngSwitch]=\"view\">\r\n\r\n <ng-container *ngSwitchCase=\"'tiles'\">\r\n <div [class]=\"busy ? 'cards-deck-1' : tilesDeckClass\">\r\n\r\n <lib-skeleton-loader *ngIf=\"busy\" [deck-class]=\"tilesDeckClass\" [count]=\"7\" [type]=\"'tiles'\"></lib-skeleton-loader>\r\n\r\n <ng-container *ngIf=\"!busy && items && items.length > 0\">\r\n <ng-container *ngFor=\"let item of items\">\r\n <span *ngIf=\"!tileTemplate || !tileTemplate.template\">template missing..</span>\r\n <ng-template [ngTemplateOutlet]=\"tileTemplate.template\" [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-template>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <!-- *ngSwitchCase=\"'gallery'\" -->\r\n <ng-container *ngSwitchCase=\"'gallery'\">\r\n <ul role=\"list\" role=\"list\" [class]=\"tilesDeckClass\">\r\n\r\n <lib-skeleton-loader *ngIf=\"busy\" [count]=\"5\" [type]=\"'tiles'\"></lib-skeleton-loader>\r\n\r\n <ng-container *ngIf=\"!busy && items && items.length > 0\">\r\n <ng-container *ngFor=\"let item of items\" role=\"listitem\">\r\n <span *ngIf=\"!tileTemplate || !tileTemplate.template\">template missing..</span>\r\n <ng-template [ngTemplateOutlet]=\"tileTemplate.template\" [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </ul>\r\n </ng-container>\r\n\r\n <!-- *ngSwitchCase=\"'table'\" -->\r\n <ng-container *ngSwitchDefault>\r\n\r\n <div class=\"list-view-container\">\r\n <div class=\"list-view-container-inner\">\r\n <table class=\"list-view-table\">\r\n <thead class=\"list-view-thead\">\r\n <tr>\r\n <ng-container *ngIf=\"detailsSectionSupported\">\r\n <th aria-label=\"details button\" class=\"list-view-th-details\"></th>\r\n </ng-container>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th scope=\"col\" [class]=\"col.fullWidth ? fullWidthTHClass : 'list-view-th'\">\r\n {{col.title}}\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody class=\"list-view-tbody\" *ngIf=\"busy\">\r\n <ng-container *ngFor=\"let item of loaderItems;let i=index\">\r\n <tr class=\"list-view-tr\">\r\n <ng-container *ngIf=\"detailsSectionSupported\">\r\n <td class=\"list-view-td-details\"\r\n *ngIf=\"detailsSectionPropertyCount !== null ? item[detailsSectionPropertyCount] !== 0 : true; else hiddenDetailsButton\">\r\n <button disabled\r\n title=\"expand-collapse\"\r\n type=\"button\"\r\n class=\"expand-collapse-button\">\r\n <!-- Heroicon name: solid/plus -->\r\n <i [class]=\"item.detailsExpanded ? collapseIcon : expandIcon\"></i>\r\n </button>\r\n </td>\r\n <ng-template #hiddenDetailsButton>\r\n <td class=\"list-view-td-details\"></td>\r\n </ng-template>\r\n </ng-container>\r\n <td *ngFor=\"let col of columns\"\r\n [class]=\"col.fullWidth ? fullWidthTDClass : 'list-view-td'\">\r\n <div class=\"w-full animate-pulse h-8 bg-gray-200 rounded\"></div>\r\n </td>\r\n </tr>\r\n <ng-container *ngIf=\"detailsSectionSupported\">\r\n <tr *ngIf=\"item.detailsExpanded\">\r\n <td [colSpan]=\"columns.length + 1\"\r\n class=\"list-view-td bg-gray-100\">\r\n <ng-template [ngTemplateOutlet]=\"detailsTemplate.template\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-template>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-container>\r\n </tbody>\r\n <tbody class=\"list-view-tbody\"\r\n *ngIf=\"!busy\">\r\n <ng-container *ngFor=\"let item of items;let i=index\">\r\n <tr class=\"list-view-tr\">\r\n <ng-container *ngIf=\"detailsSectionSupported\">\r\n <td class=\"list-view-td-details\"\r\n *ngIf=\"detailsSectionPropertyCount !== null ? item[detailsSectionPropertyCount] !== 0 : true; else hiddenDetailsButton\">\r\n <button (click)=\"toggleDetails(item)\"\r\n title=\"toggleDetails\"\r\n type=\"button\"\r\n class=\"expand-collapse-button\">\r\n <!-- Heroicon name: solid/plus -->\r\n <i [class]=\"item.detailsExpanded ? collapseIcon : expandIcon\"></i>\r\n </button>\r\n </td>\r\n <ng-template #hiddenDetailsButton>\r\n <td class=\"list-view-td-details\"></td>\r\n </ng-template>\r\n </ng-container>\r\n <td *ngFor=\"let col of columns\"\r\n [class]=\"col.fullWidth ? fullWidthTDClass : 'list-view-td'\">\r\n <ng-template [ngTemplateOutlet]=\"col.template\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-template>\r\n </td>\r\n </tr>\r\n <ng-container *ngIf=\"detailsSectionSupported\">\r\n <tr *ngIf=\"item.detailsExpanded\">\r\n <td [colSpan]=\"columns.length + 1\"\r\n class=\"list-view-td bg-gray-100\">\r\n <ng-template [ngTemplateOutlet]=\"detailsTemplate.template\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-template>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!busy && items && items.length === 0\">\r\n <div class=\"cards-deck-1\">\r\n <lib-list-view-empty-state></lib-list-view-empty-state>\r\n </div>\r\n </ng-container>\r\n</ng-container>\r\n\r\n<ng-content></ng-content>\r\n\r\n<div class=\"px-2 mt-2\"\r\n *ngIf=\"items && items.length !== 0 && showPager && (pagerPosition == 'bottom' || pagerPosition == 'both')\">\r\n <lib-pager [page]=\"page\"\r\n [page-size]=\"pageSize\"\r\n [count]=\"count\"\r\n [sort-options]=\"sortOptions\"\r\n [sort]=\"sort\"\r\n [sort-dir]=\"sortdir\"\r\n [busy]=\"busy\"\r\n (pageChanged)=\"emitPageChanged($event)\"\r\n (pageSizeChanged)=\"emitPageSizeChanged($event)\"\r\n (sortChanged)=\"emitSortChanged($event)\"\r\n (sortdirChanged)=\"emitSortdirChanged($event)\">\r\n </lib-pager>\r\n</div>\r\n" }]
}], ctorParameters: () => [], propDecorators: { searchOptions: [{
type: Input,
args: ['search-options']
}], filters: [{
type: Input
}], busy: [{
type: Input
}], items: [{
type: Input
}], count: [{
type: Input
}], page: [{
type: Input
}], view: [{
type: Input
}], sort: [{
type: Input
}], pageSize: [{
type: Input,
args: ['page-size']
}], pageSizeOptions: [{
type: Input,
args: ['page-size-options']
}], sortOptions: [{
type: Input,
args: ['sort-options']
}], operatorsDisabled: [{
type: Input,
args: ['operators-disabled']
}], sortdir: [{
type: Input,
args: ['sort-dir']
}], tilesCount: [{
type: Input,
args: ['tiles-count']
}], showPager: [{
type: Input,
args: ['show-pager']
}], pagerPosition: [{
type: Input,
args: ['pager-position']
}], detailsSectionPropertyCount: [{
type: Input,
args: ['details-section-property-count']
}], cols: [{
type: ContentChildren,
args: [ListColumnComponent, { read: ListColumnComponent }]
}], tiles: [{
type: ContentChild,
args: [ListTileComponent, { read: ListTileComponent }]
}], details: [{
type: ContentChild,
args: [ListDetailsSectionComponent, { read: ListDetailsSectionComponent }]
}], pageChanged: [{
type: Output
}], pageSizeChanged: [{
type: Output
}], detailsOpened: [{
type: Output
}], sortChanged: [{
type: Output
}], sortdirChanged: [{
type: Output
}], advancedSearchChanged: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9saXN0LXZpZXcvbGlzdC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9saXN0LXZpZXcvbGlzdC12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBdUMsTUFBTSxlQUFlLENBQUM7QUFFM0ksT0FBTyxFQUFFLFlBQVksRUFBYyxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7OztBQUNwQyxDQUFDO0FBTUQsTUFBTSxPQUFPLGlCQUFpQjtJQWdDNUIsVUFBVTtJQUNWLElBQ0ksSUFBSSxDQUFDLElBQW9DO1FBQzNDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQy9CLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FB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bnRlbnRDaGlsZCwgQ29udGVudENoaWxkcmVuLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZpbHRlckNsYXVzZSwgU2VhcmNoT3B0aW9uIH0gZnJvbSAnLi4vYWR2YW5jZWQtc2VhcmNoL21vZGVscyc7XHJcbmltcG9ydCB7IExpc3RWaWV3VHlwZSwgTWVudU9wdGlvbiwgUGFnZXJQb3NpdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzJztcclxuaW1wb3J0IHsgTGlzdENvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vbGlzdC1jb2x1bW4uY29tcG9uZW50JztcclxuaW1wb3J0IHsgTGlzdFRpbGVDb21wb25lbnQgfSBmcm9tICcuL2xpc3QtdGlsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMaXN0RGV0YWlsc1NlY3Rpb25Db21wb25lbnQgfSBmcm9tICcuL2xpc3QtZGV0YWlscy1zZWN0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSAnLi4vLi4vaWNvbnMnO1xyXG47XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1saXN0LXZpZXcnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9saXN0LXZpZXcuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMaXN0Vmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCdzZWFyY2gtb3B0aW9ucycpIHNlYXJjaE9wdGlvbnM6IFNlYXJjaE9wdGlvbltdID0gW107XHJcbiAgQElucHV0KCkgZmlsdGVyczogRmlsdGVyQ2xhdXNlW10gPSBbXTtcclxuICAvLyBCVVNZIFNUQVRFXHJcbiAgQElucHV0KCkgYnVzeSA9IGZhbHNlO1xyXG4gIC8vIERBVEEgU09VUkNFIVxyXG4gIEBJbnB1dCgpIGl0ZW1zOiBhbnlbXSB8IG51bGwgfCB1bmRlZmluZWQ7XHJcbiAgLy8gUEFHSU5HIC0gcGFzcyB0aHJvdWdoIGZvciBwYWdlciBjb21wb25lbnRcclxuICBASW5wdXQoKSBjb3VudDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KCkgcGFnZSA9IDE7XHJcbiAgQElucHV0KCkgdmlldyA9IExpc3RWaWV3VHlwZS5UYWJsZTtcclxuICBASW5wdXQoKSBzb3J0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8taW5wdXQtcmVuYW1lXHJcbiAgQElucHV0KCdwYWdlLXNpemUnKSBwYWdlU2l6ZSA9IDIwO1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnB1dC1yZW5hbWVcclxuICBASW5wdXQoJ3BhZ2Utc2l6ZS1vcHRpb25zJykgcGFnZVNpemVPcHRpb25zOiBNZW51T3B0aW9uW10gPSBbXTtcclxuICAvLyBTT1JUSU5HIC0gcGFzcyB0aHJvdWdoIGZvciBwYWdlciBjb21wb25lbnRcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8taW5wdXQtcmVuYW1lXHJcbiAgQElucHV0KCdzb3J0LW9wdGlvbnMnKSBzb3J0T3B0aW9uczogTWVudU9wdGlvbltdID0gW107XHJcbiAgQElucHV0KCdvcGVyYXRvcnMtZGlzYWJsZWQnKSBvcGVyYXRvcnNEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnB1dC1yZW5hbWVcclxuICBASW5wdXQoJ3NvcnQtZGlyJykgc29ydGRpcjogc3RyaW5nIHwgbnVsbCA9ICctJztcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8taW5wdXQtcmVuYW1lXHJcbiAgQElucHV0KCd0aWxlcy1jb3VudCcpIHRpbGVzQ291bnQgPSA0O1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnB1dC1yZW5hbWVcclxuICBASW5wdXQoJ3Nob3ctcGFnZXInKSBzaG93UGFnZXIgPSB0cnVlO1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnB1dC1yZW5hbWVcclxuICBASW5wdXQoJ3BhZ2VyLXBvc2l0aW9uJykgcGFnZXJQb3NpdGlvbjogYW55IHwgdW5kZWZpbmVkID0gUGFnZXJQb3NpdGlvbi5Ub3A7XHJcbiAgLy8gREVUQUlMUyBTRUNUSU9OXHJcbiAgLy8gQ2hlY2sgaWYgZGV0YWlscyBzZWN0aW9uIGFuZCBidXR0b24gc2hvdWxkIGJlIGRpc3BsYXllZCBhY2NvcmRpbmcgdG8gdGhlIGNvdW50IG9mIHRoZSB2YWx1ZSBnaXZlblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnB1dC1yZW5hbWVcclxuICBASW5wdXQoJ2RldGFpbHMtc2VjdGlvbi1wcm9wZXJ0eS1jb3VudCcpIGRldGFpbHNTZWN0aW9uUHJvcGVydHlDb3VudDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgLy8gQ09MVU1OU1xyXG4gIEBDb250ZW50Q2hpbGRyZW4oTGlzdENvbHVtbkNvbXBvbmVudCwgeyByZWFkOiBMaXN0Q29sdW1uQ29tcG9uZW50IH0pXHJcbiAgc2V0IGNvbHMocmVmczogUXVlcnlMaXN0PExpc3RDb2x1bW5Db21wb25lbnQ+KSB7XHJcbiAgICB0aGlzLmNvbHVtbnMgPSByZWZzPy50b0FycmF5KCk7XHJcbiAgICBpZiAodGhpcy5jb2x1bW5zICYmIHRoaXMuY29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMudGFibGVWaWV3U3VwcG9ydGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMubXVsdGlwbGVGdWxsV2lkdGggPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5mdWxsV2lkdGgpLmxlbmd0aCA+IDE7XHJcbiAgICB0aGlzLmZ1bGxXaWR0aFRIQ2xhc3MgPSB0aGlzLm11bHRpcGxlRnVsbFdpZHRoID8gJ2xpc3Qtdmlldy10aC1oYWxmJyA6ICdsaXN0LXZpZXctdGgtZnVsbCc7XHJcbiAgICB0aGlzLmZ1bGxXaWR0aFREQ2xhc3MgPSB0aGlzLm11bHRpcGxlRnVsbFdpZHRoID8gJ2xpc3Qtdmlldy10ZC1oYWxmJyA6ICdsaXN0LXZpZXctdGQtZnVsbCc7XHJcbiAgfVxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnB1dC1yZW5hbWVcclxuICBAQ29udGVudENoaWxkKExpc3RUaWxlQ29tcG9uZW50LCB7IHJlYWQ6IExpc3RUaWxlQ29tcG9uZW50IH0pXHJcbiAgc2V0IHRpbGVzKHJlZjogTGlzdFRpbGVDb21wb25lbnQpIHtcclxuICAgIHRoaXMudGlsZVRlbXBsYXRlID0gcmVmO1xyXG4gICAgaWYgKHRoaXMudGlsZVRlbXBsYXRlKSB7XHJcbiAgICAgIHRoaXMudGlsZXNWaWV3U3VwcG9ydGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoTGlzdERldGFpbHNTZWN0aW9uQ29tcG9uZW50LCB7IHJlYWQ6IExpc3REZXRhaWxzU2VjdGlvbkNvbXBvbmVudCB9KVxyXG4gIHNldCBkZXRhaWxzKHJlZjogTGlzdERldGFpbHNTZWN0aW9uQ29tcG9uZW50KSB7XHJcbiAgICB0aGlzLmRldGFpbHNUZW1wbGF0ZSA9IHJlZjtcclxuICAgIGlmICh0aGlzLmRldGFpbHNUZW1wbGF0ZSkge1xyXG4gICAgICB0aGlzLmRldGFpbHNTZWN0aW9uU3VwcG9ydGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuICBAT3V0cHV0KCkgcGFnZVNpemVDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIEBPdXRwdXQoKSBkZXRhaWxzT3BlbmVkOiBFdmVudEVtaXR0ZXI8eyBpdGVtOiBhbnksIG9wZW46IGJvb2xlYW4gfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgaXRlbTogYW55LCBvcGVuOiBib29sZWFuIH0+KCk7XHJcbiAgQE91dHB1dCgpIHNvcnRDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIEBPdXRwdXQoKSBzb3J0ZGlyQ2hhbmdlZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgYWR2YW5jZWRTZWFyY2hDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8RmlsdGVyQ2xhdXNlW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXJDbGF1c2VbXT4oKTtcclxuXHJcbiAgcHJpdmF0ZSBtdWx0aXBsZUZ1bGxXaWR0aCA9IGZhbHNlO1xyXG4gIHB1YmxpYyBleHBhbmRJY29uID0gSWNvbnMuRXhwYW5kO1xyXG4gIHB1YmxpYyBjb2xsYXBzZUljb24gPSBJY29ucy5Db2xsYXBzZTtcclxuICBwdWJsaWMgdGFibGVWaWV3U3VwcG9ydGVkID0gZmFsc2U7XHJcbiAgcHVibGljIGZ1bGxXaWR0aFRIQ2xhc3MgPSAnbGlzdC12aWV3LXRoLWZ1bGwnO1xyXG4gIHB1YmxpYyBmdWxsV2lkdGhURENsYXNzID0gJ2xpc3Qtdmlldy10ZC1mdWxsJztcclxuICBwdWJsaWMgdGlsZXNWaWV3U3VwcG9ydGVkID0gZmFsc2U7XHJcbiAgcHVibGljIGRldGFpbHNTZWN0aW9uU3VwcG9ydGVkID0gZmFsc2U7XHJcbiAgcHVibGljIGxvYWRlckl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gIHB1YmxpYyBjb2x1bW5zOiBhbnlbXSA9IFtdO1xyXG4gIHB1YmxpYyB0aWxlc0RlY2tDbGFzcyA9ICdjYXJkcy1kZWNrLTQnO1xyXG4gIHB1YmxpYyB0aWxlVGVtcGxhdGU6IGFueSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xyXG4gIHB1YmxpYyBkZXRhaWxzVGVtcGxhdGU6IGFueSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgOTsgaSsrKSB7XHJcbiAgICAgIHRoaXMubG9hZGVySXRlbXMucHVzaCh7fSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wYWdlclBvc2l0aW9uKSB7XHJcbiAgICAgIHRoaXMucGFnZXJQb3NpdGlvbiA9IHRoaXMucGFnZXJQb3NpdGlvbiBhcyBQYWdlclBvc2l0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgY29uc3QgdGlsZXNDb3VudENoYW5nZSA9IGNoYW5nZXNbJ3RpbGVzLWNvdW50J10gfHwgY2hhbmdlcy50aWxlc0NvdW50O1xyXG4gICAgaWYgKHRpbGVzQ291bnRDaGFuZ2UpIHtcclxuICAgICAgdGhpcy5zZXRUaWxlc0RlY2tDbGFzcyh0aWxlc0NvdW50Q2hhbmdlLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBldmVudHNcclxuICBwdWJsaWMgZW1pdFBhZ2VDaGFuZ2VkKCRldmVudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQoJGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlbWl0UGFnZVNpemVDaGFuZ2VkKCRldmVudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2VTaXplQ2hhbmdlZC5lbWl0KCRldmVudCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZW1pdFNvcnRDaGFuZ2VkKCRldmVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnNvcnRDaGFuZ2VkLmVtaXQoJGV2ZW50KTtcclxuICB9XHJcbiAgcHVibGljIGVtaXRTb3J0ZGlyQ2hhbmdlZCgkZXZlbnQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zb3J0ZGlyQ2hhbmdlZC5lbWl0KCRldmVudCk7XHJcbiAgfVxyXG4gIHB1YmxpYyBlbWl0QWR2YW5jZWRTZWFyY2hDaGFuZ2VkKCRldmVudDogRmlsdGVyQ2xhdXNlW10pOiB2b2lkIHtcclxuICAgIHRoaXMuYWR2YW5jZWRTZWFyY2hDaGFuZ2VkLmVtaXQoJGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVEZXRhaWxzKGl0ZW06IGFueSk6IHZvaWQge1xyXG4gICAgaXRlbS5kZXRhaWxzRXhwYW5kZWQgPSAhaXRlbS5kZXRhaWxzRXhwYW5kZWQ7XHJcbiAgICB0aGlzLmRldGFpbHNPcGVuZWQuZW1pdCh7IGl0ZW0sIG9wZW46IGl0ZW0uZGV0YWlsc0V4cGFuZGVkIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gaGVscGVyc1xyXG4gIHByaXZhdGUgc2V0VGlsZXNEZWNrQ2xhc3ModGlsZXM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRpbGVzID49IDEgJiYgdGlsZXMgPD0gNCkge1xyXG4gICAgICB0aGlzLnRpbGVzRGVja0NsYXNzID1cclxuICAgICAgICB0aGlzLnZpZXcgIT09IExpc3RWaWV3VHlwZS5HYWxsZXJ5XHJcbiAgICAgICAgICA/IGBjYXJkcy1kZWNrLSR7dGlsZXN9YFxyXG4gICAgICAgICAgOiB0aGlzLml0ZW1zICYmIHRoaXMuaXRlbXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICA/IGBnYWxsZXJ5LWRlY2stJHt0aWxlc31gXHJcbiAgICAgICAgICAgIDogJ2dhbGxlcnktZGVjayc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRpbGVzRGVja0NsYXNzID1cclxuICAgICAgICB0aGlzLnZpZXcgIT09IExpc3RWaWV3VHlwZS5HYWxsZXJ5XHJcbiAgICAgICAgICA/ICdjYXJkcy1kZWNrLTMnXHJcbiAgICAgICAgICA6IHRoaXMuaXRlbXMgJiYgdGhpcy5pdGVtcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgID8gJ2dhbGxlcnktZGVjay0zJ1xyXG4gICAgICAgICAgICA6ICdnYWxsZXJ5LWRlY2snO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2PlxyXG4gIDxsaWItYWR2YW5jZWQtc2VhcmNoICpuZ0lmPVwic2VhcmNoT3B0aW9ucyAmJiBzZWFyY2hPcHRpb25zLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2gtb3B0aW9uc109XCJzZWFyY2hPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyc109XCJmaWx0ZXJzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBbb3BlcmF0b3JzLWRpc2FibGVkXT1cIm9wZXJhdG9yc0Rpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAoYWR2YW5jZWRTZWFyY2hDaGFuZ2VkKT1cImVtaXRBZHZhbmNlZFNlYXJjaENoYW5nZWQoJGV2ZW50KVwiPlxyXG4gIDwvbGliLWFkdmFuY2VkLXNlYXJjaD5cclxuXHJcbiAgPGxpYi1wYWdlciAqbmdJZj1cInNob3dQYWdlciAmJiAocGFnZXJQb3NpdGlvbiA9PSAndG9wJyB8fCBwYWdlclBvc2l0aW9uID09ICdib3RoJylcIlxyXG4gICAgICAgICAgICAgW3BhZ2VdPVwicGFnZVwiXHJcbiAgICAgICAgICAgICBbcGFnZS1zaXplXT1cInBhZ2VTaXplXCJcclxuICAgICAgICAgICAgIFtjb3VudF09XCJjb3VudFwiXHJcbiAgICAgICAgICAgICBbc29ydC1vcHRpb25zXT1cInNvcnRPcHRpb25zXCJcclxuICAgICAgICAgICAgIFtzb3J0XT1cInNvcnRcIlxyXG4gICAgICAgICAgICAgW3NvcnQtZGlyXT1cInNvcnRkaXJcIlxyXG4gICAgICAgICAgICAgW2J1c3ldPVwiYnVzeVwiXHJcbiAgICAgICAgICAgICAocGFnZUNoYW5nZWQpPVwiZW1pdFBhZ2VDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlZCk9XCJlbWl0UGFnZVNpemVDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgKHNvcnRDaGFuZ2VkKT1cImVtaXRTb3J0Q2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIChzb3J0ZGlyQ2hhbmdlZCk9XCJlbWl0U29ydGRpckNoYW5nZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3BhZ2VyLW5lYXItY29udGVudF1cIiBuZ1Byb2plY3RBcz1cIltwYWdlci1uZWFyLWNvbnRlbnRdXCI+PC9uZy1jb250ZW50PlxyXG4gIDwvbGliLXBhZ2VyPlxyXG48L2Rpdj5cclxuXHJcbjxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInZpZXdcIj5cclxuXHJcbiAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RpbGVzJ1wiPlxyXG4gICAgPGRpdiBbY2xhc3NdPVwiYnVzeSA/ICdjYXJkcy1kZWNrLTEnIDogdGlsZXNEZWNrQ2xhc3NcIj5cclxuXHJcbiAgICAgIDxsaWItc2tlbGV0b24tbG9hZGVyICpuZ0lmPVwiYnVzeVwiIFtkZWNrLWNsYXNzXT1cInRpbGVzRGVja0NsYXNzXCIgW2NvdW50XT1cIjdcIiBbdHlwZV09XCIndGlsZXMnXCI+PC9saWItc2tlbGV0b24tbG9hZGVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFidXN5ICYmIGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zXCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiF0aWxlVGVtcGxhdGUgfHwgIXRpbGVUZW1wbGF0ZS50ZW1wbGF0ZVwiPnRlbXBsYXRlIG1pc3NpbmcuLjwvc3Bhbj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJ0aWxlVGVtcGxhdGUudGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0gfVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgPCEtLSAqbmdTd2l0Y2hDYXNlPVwiJ2dhbGxlcnknXCIgLS0+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2dhbGxlcnknXCI+XHJcbiAgICA8dWwgcm9sZT1cImxpc3RcIiByb2xlPVwibGlzdFwiIFtjbGFzc109XCJ0aWxlc0RlY2tDbGFzc1wiPlxyXG5cclxuICAgICAgPGxpYi1za2VsZXRvbi1sb2FkZXIgKm5nSWY9XCJidXN5XCIgW2NvdW50XT1cIjVcIiBbdHlwZV09XCIndGlsZXMnXCI+PC9saWItc2tlbGV0b24tbG9hZGVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFidXN5ICYmIGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zXCIgcm9sZT1cImxpc3RpdGVtXCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiF0aWxlVGVtcGxhdGUgfHwgIXRpbGVUZW1wbGF0ZS50ZW1wbGF0ZVwiPnRlbXBsYXRlIG1pc3NpbmcuLjwvc3Bhbj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJ0aWxlVGVtcGxhdGUudGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0gfVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC91bD5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPCEtLSAqbmdTd2l0Y2hDYXNlPVwiJ3RhYmxlJ1wiIC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibGlzdC12aWV3LWNvbnRhaW5lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGlzdC12aWV3LWNvbnRhaW5lci1pbm5lclwiPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cImxpc3Qtdmlldy10YWJsZVwiPlxyXG4gICAgICAgICAgPHRoZWFkIGNsYXNzPVwibGlzdC12aWV3LXRoZWFkXCI+XHJcbiAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGV0YWlsc1NlY3Rpb25TdXBwb3J0ZWRcIj5cclxuICAgICAgICAgICAgICAgIDx0aCBhcmlhLWxhYmVsPVwiZGV0YWlscyBidXR0b25cIiBjbGFzcz1cImxpc3Qtdmlldy10aC1kZXRhaWxzXCI+PC90aD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgW2NsYXNzXT1cImNvbC5mdWxsV2lkdGggPyBmdWxsV2lkdGhUSENsYXNzIDogJ2xpc3Qtdmlldy10aCdcIj5cclxuICAgICAgICAgICAgICAgICAge3tjb2wudGl0bGV9fVxyXG4gICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJsaXN0LXZpZXctdGJvZHlcIiAqbmdJZj1cImJ1c3lcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsb2FkZXJJdGVtcztsZXQgaT1pbmRleFwiPlxyXG4gICAgICAgICAgICAgIDx0ciBjbGFzcz1cImxpc3Qtdmlldy10clwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRldGFpbHNTZWN0aW9uU3VwcG9ydGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImxpc3Qtdmlldy10ZC1kZXRhaWxzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGV0YWlsc1NlY3Rpb25Qcm9wZXJ0eUNvdW50ICE9PSBudWxsID8gaXRlbVtkZXRhaWxzU2VjdGlvblByb3BlcnR5Q291bnRdICE9PSAwIDogdHJ1ZTsgZWxzZSBoaWRkZW5EZXRhaWxzQnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBkaXNhYmxlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJleHBhbmQtY29sbGFwc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImV4cGFuZC1jb2xsYXBzZS1idXR0b25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSGVyb2ljb24gbmFtZTogc29saWQvcGx1cyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJpdGVtLmRldGFpbHNFeHBhbmRlZCA/IGNvbGxhcHNlSWNvbiA6IGV4cGFuZEljb25cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaGlkZGVuRGV0YWlsc0J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJsaXN0LXZpZXctdGQtZGV0YWlsc1wiPjwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb2wuZnVsbFdpZHRoID8gZnVsbFdpZHRoVERDbGFzcyA6ICdsaXN0LXZpZXctdGQnXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgYW5pbWF0ZS1wdWxzZSBoLTggYmctZ3JheS0yMDAgcm91bmRlZFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZXRhaWxzU2VjdGlvblN1cHBvcnRlZFwiPlxyXG4gICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiaXRlbS5kZXRhaWxzRXhwYW5kZWRcIj5cclxuICAgICAgICAgICAgICAgICAgPHRkIFtjb2xTcGFuXT1cImNvbHVtbnMubGVuZ3RoICsgMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpc3Qtdmlldy10ZCBiZy1ncmF5LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJkZXRhaWxzVGVtcGxhdGUudGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0gfVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJsaXN0LXZpZXctdGJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICpuZ0lmPVwiIWJ1c3lcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtcztsZXQgaT1pbmRleFwiPlxyXG4gICAgICAgICAgICAgIDx0ciBjbGFzcz1cImxpc3Qtdmlldy10clwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRldGFpbHNTZWN0aW9uU3VwcG9ydGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImxpc3Qtdmlldy10ZC1kZXRhaWxzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGV0YWlsc1NlY3Rpb25Qcm9wZXJ0eUNvdW50ICE9PSBudWxsID8gaXRlbVtkZXRhaWxzU2VjdGlvblByb3BlcnR5Q291bnRdICE9PSAwIDogdHJ1ZTsgZWxzZSBoaWRkZW5EZXRhaWxzQnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlRGV0YWlscyhpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInRvZ2dsZURldGFpbHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImV4cGFuZC1jb2xsYXBzZS1idXR0b25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSGVyb2ljb24gbmFtZTogc29saWQvcGx1cyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJpdGVtLmRldGFpbHNFeHBhbmRlZCA/IGNvbGxhcHNlSWNvbiA6IGV4cGFuZEljb25cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaGlkZGVuRGV0YWlsc0J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJsaXN0LXZpZXctdGQtZGV0YWlsc1wiPjwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb2wuZnVsbFdpZHRoID8gZnVsbFdpZHRoVERDbGFzcyA6ICdsaXN0LXZpZXctdGQnXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2wudGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBpdGVtIH1cIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZXRhaWxzU2VjdGlvblN1cHBvcnRlZFwiPlxyXG4gICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiaXRlbS5kZXRhaWxzRXhwYW5kZWRcIj5cclxuICAgICAgICAgICAgICAgICAgPHRkIFtjb2xTcGFuXT1cImNvbHVtbnMubGVuZ3RoICsgMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpc3Qtdmlldy10ZCBiZy1ncmF5LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJkZXRhaWxzVGVtcGxhdGUudGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0gfVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFidXN5ICYmIGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmRzLWRlY2stMVwiPlxyXG4gICAgICA8bGliLWxpc3Qtdmlldy1lbXB0eS1zdGF0ZT48L2xpYi1saXN0LXZpZXctZW1wdHktc3RhdGU+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy1jb250YWluZXI+XHJcblxyXG48bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcblxyXG48ZGl2IGNsYXNzPVwicHgtMiBtdC0yXCJcclxuICAgICAqbmdJZj1cIml0ZW1zICYmIGl0ZW1zLmxlbmd0aCAhPT0gMCAmJiBzaG93UGFnZXIgJiYgKHBhZ2VyUG9zaXRpb24gPT0gJ2JvdHRvbScgfHwgcGFnZXJQb3NpdGlvbiA9PSAnYm90aCcpXCI+XHJcbiAgPGxpYi1wYWdlciBbcGFnZV09XCJwYWdlXCJcclxuICAgICAgICAgICAgIFtwYWdlLXNpemVdPVwicGFnZVNpemVcIlxyXG4gICAgICAgICAgICAgW2NvdW50XT1cImNvdW50XCJcclxuICAgICAgICAgICAgIFtzb3J0LW9wdGlvbnNdPVwic29ydE9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgW3NvcnRdPVwic29ydFwiXHJcbiAgICAgICAgICAgICBbc29ydC1kaXJdPVwic29ydGRpclwiXHJcbiAgICAgICAgICAgICBbYnVzeV09XCJidXN5XCJcclxuICAgICAgICAgICAgIChwYWdlQ2hhbmdlZCk9XCJlbWl0UGFnZUNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAocGFnZVNpemVDaGFuZ2VkKT1cImVtaXRQYWdlU2l6ZUNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAoc29ydENoYW5nZWQpPVwiZW1pdFNvcnRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgKHNvcnRkaXJDaGFuZ2VkKT1cImVtaXRTb3J0ZGlyQ2hhbmdlZCgkZXZlbnQpXCI+XHJcbiAgPC9saWItcGFnZXI+XHJcbjwvZGl2PlxyXG4iXX0=