@nova-ui/bits
Version:
SolarWinds Nova Framework
432 lines • 81.5 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { CdkDrag, DragDrop, moveItemInArray, transferArrayItem, } from "@angular/cdk/drag-drop";
import { CdkVirtualScrollViewport } from "@angular/cdk/scrolling";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, Input, IterableDiffers, Output, QueryList, TemplateRef, ViewChild, ViewChildren, ViewEncapsulation, } from "@angular/core";
import _isEqual from "lodash/isEqual";
import { Subject } from "rxjs";
import { takeUntil, tap } from "rxjs/operators";
import { PaddingOptions, RepeatSelectionMode, } from "./types";
import { nameof } from "../../functions/nameof";
import { LoggerService } from "../../services/log-service";
import * as i0 from "@angular/core";
import * as i1 from "../../services/log-service";
import * as i2 from "@angular/cdk/drag-drop";
import * as i3 from "@angular/common";
import * as i4 from "../checkbox/checkbox.component";
import * as i5 from "../radio/radio-group.component";
import * as i6 from "@angular/cdk/scrolling";
import * as i7 from "./repeat-item/repeat-item.component";
/**
* repeat is used for displaying of continuous rows.
* It can be used in "single"/"radio" or "multi" selection mode
* <example-url>./../examples/index.html#/repeat</example-url>
*/
export class RepeatComponent {
/**
* Turns on/off dragging functionality
*/
set draggable(value) {
this._draggable = value;
// make sure we initialize the list
this.initializeCDKDropList();
if (this.dropListRef) {
this.dropListRef.disabled = !this._draggable;
}
if (!this._draggable && this._reorderable) {
this._reorderable = false;
this.reorderableChange.emit(this._reorderable);
}
}
get draggable() {
return this._draggable;
}
/**
* Turns on/off item reorder functionality
*/
set reorderable(value) {
if (this._draggable === false) {
this.logger.warn("'reorderable' property must be used only when draggable is true");
}
// make item also draggable ONLY if we ever change it to sortable
if (value && !this._draggable) {
this._draggable = true;
this.draggableChange.emit(value);
}
// update propriety ONLY if it actually changes
if (this.dropListRef && this._reorderable !== value) {
this.dropListRef.sortingDisabled = !value;
}
this._reorderable = value;
}
get reorderable() {
return this._reorderable;
}
get viewportRef() {
if (!this.virtualScroll) {
throw new Error("VirtualScroll is not enabled");
}
return this._viewportRef;
}
get role() {
return this.selectionMode !== RepeatSelectionMode.none
? "listbox"
: "list";
}
get ariaMultiselectable() {
return this.isModeMulti() || null;
}
constructor(changeDetector, logger, iterableDiffers, dragDropService, elRef) {
this.changeDetector = changeDetector;
this.logger = logger;
this.iterableDiffers = iterableDiffers;
this.dragDropService = dragDropService;
this.elRef = elRef;
// made event async to avoid ExpressionChangedAfterItHasBeenCheckedError
this.draggableChange = new EventEmitter(true);
this.reorderableChange = new EventEmitter(true);
/**
* This will stretch repeat items full width
*/
this.width = "100%";
/**
* Prevent item bodies from capturing clicks
*/
this.preventRowClick = false;
/**
* Drag preview class that is applied on the previewed item
*
* This input is required since CDK adds the preview DOM element as the last child on the body;
* without it all drag previews within a project would have the same style
*/
this.dragPreviewClass = "nui-dnd-preview";
/**
* Possible values are 'single', 'radio', 'multi' and 'none'
*/
this.selectionMode = RepeatSelectionMode.none;
/**
* Enables virtual scroll feature. Requires @itemSize input to have a correct item size set.
*/
this.virtualScroll = false;
/**
* Selected repeat objects
*/
this.selection = [];
/**
* Is emitted when on items order has changed
*/
this.itemsReordered = new EventEmitter();
/**
* Is selected item should be highlighted
*/
this.highlightSelectedItem = true;
/**
* Is emitted when another item in the repeat is selected
*/
this.selectionChange = new EventEmitter();
this.mousedOver = [];
this.selectionHasChanged = false;
/** Emits when the drop list has been destroyed. */
this.dropListDestroyed = new Subject();
this.intersectionObserverCallback = (entries, observer) => {
if (entries[0].isIntersecting && this.virtualScroll) {
// recheck the cdk viewport size in case the repeat is instantiated before becoming visible in the viewport (NUI-5820)
this.viewportRef.checkViewportSize();
}
};
}
ngOnInit() {
this.intersectionObserver = new IntersectionObserver(this.intersectionObserverCallback);
if (this.elRef.nativeElement instanceof Element) {
this.intersectionObserver.observe(this.elRef.nativeElement);
}
if (this.dragPreviewTemplateRef ||
this.dragHandleTemplateRef ||
this._reorderable === true) {
this._draggable = true;
this.draggableChange.emit(this._draggable);
}
this.paddingSize =
this.paddingSize in PaddingOptions
? this.paddingSize
: PaddingOptions.compact;
if (!this.itemSize && this.virtualScroll) {
this.logger.error("ERROR: To use virtual scroll feature please set correct value to the 'itemSize' input!");
}
// Note: Using empty array as a fallback value to obtain a proper differ factory
// when the itemsSource is not provided by parent at init.
this.itemsSourceDiff = this.iterableDiffers
.find(this.itemsSource || [])
.create();
}
ngDoCheck() {
// Note: In case the input value have changed the CD will not be triggered because
// of onPush strategy we have to check if array values changed manually and trigger CD.
if (this.itemsSourceDiff.diff(this.itemsSource)) {
this.changeDetector.markForCheck();
}
}
ngAfterViewInit() {
this.initializeCDKDropList();
}
/**
* Cleanup CDK
* PS: No need to unsubscribe from the EventEmitters, they are handled
* automatically by Angular & RxJs
*/
ngOnDestroy() {
this.intersectionObserver?.unobserve(this.elRef.nativeElement);
this.disposeCDKDropList();
}
update() {
this.changeDetector.detectChanges();
}
getFilters() {
const response = {
type: nameof("selection"),
value: {
selection: this.selection,
itemsSource: this.itemsSource,
selectionMode: this.selectionMode,
selectionHasChanged: this.selectionHasChanged,
},
};
this.selectionHasChanged = false;
return response;
}
/**
* Checks if repeat item is selected
* @param item selected repeat item in repeat
*/
isItemSelected(item) {
if (!this.highlightSelectedItem) {
return false;
}
switch (this.selectionMode) {
case RepeatSelectionMode.single:
case RepeatSelectionMode.radio:
case RepeatSelectionMode.singleWithRequiredSelection:
case RepeatSelectionMode.radioWithNonRequiredSelection:
return this.selection && _isEqual(item, this.selection[0]);
case RepeatSelectionMode.multi:
return Boolean(this.selection &&
this.selection.length &&
this.selection.indexOf(item) !== -1);
default:
return false;
}
}
/**
* repeat item is clicked
* @param event
* @param item value object that is used in nui-repeat-item
*/
itemClicked(event, item) {
if (this.selectionMode === RepeatSelectionMode.none ||
this.isItemDisabled(item)) {
return;
}
// prevent handling both from row and input
event.stopImmediatePropagation();
event.stopPropagation();
event.preventDefault();
if (this.isModeMulti()) {
this.selectionHasChanged = true;
this.multiSelectionChanged(item);
return;
}
if (this.selectionMode ===
RepeatSelectionMode.singleWithRequiredSelection ||
this.selectionMode === RepeatSelectionMode.radio) {
this.selection = [item];
}
if (this.selectionMode === RepeatSelectionMode.single ||
this.selectionMode ===
RepeatSelectionMode.radioWithNonRequiredSelection) {
if (this.selection.indexOf(item) !== -1) {
this.selection = [];
}
else {
this.selection = [item];
}
}
this.changeDetector.markForCheck();
this.selectionHasChanged = true;
this.selectionChange.emit(this.selection);
}
/**
* nui-repeat-item selection change handler
* @param item selected nui-repeat-item
*/
multiSelectionChanged(item) {
if (this.selection.indexOf(item) === -1) {
this.selection = [...this.selection, item];
}
else {
this.selection = this.selection.filter((selectionItem) => selectionItem !== item);
}
this.selectionChange.emit(this.selection);
}
isModeMulti() {
return this.selectionMode === RepeatSelectionMode.multi;
}
isModeRadio() {
return [
RepeatSelectionMode.radio,
RepeatSelectionMode.radioWithNonRequiredSelection,
].includes(this.selectionMode);
}
/* START - ITEM BEHAVIOUR DECIDERS */
isItemClickable(item) {
return !this.preventRowClick && !this.isItemDisabled(item);
}
isItemSelectable(item) {
return !this.isItemDisabled(item);
}
isItemDisabled(item) {
return (item.disabled ??
!!this.itemConfig?.isDisabled?.(item));
}
isItemDraggable(item) {
if (this.virtualScroll || this.isItemDisabled(item)) {
return false;
}
// Note: Item cannot be draggable if the main draggable is off.
if (this.itemConfig && this.draggable === false) {
this.logger.warn(`Draggable config per item is available only when ${nameof("draggable")} is set to true`);
return false;
}
return this.itemConfig?.isDraggable?.(item) ?? this.draggable;
}
/* END - ITEM BEHAVIOUR DECIDERS */
initializeCDKDropList() {
if (!this.virtualScroll &&
this.dropListArea &&
this._draggable &&
!this.dropListRef) {
this.dropListRef = this.dragDropService.createDropList(this.dropListArea);
this.dropListRef.disabled = !this._draggable;
this.dropListRef.data = this.itemsSource;
// self-destroyed subscription
this.dropListRef.dropped
.pipe(tap((event) => this.itemDropped(event)), takeUntil(this.dropListDestroyed))
.subscribe();
this.dropListRef.withItems(this.draggableElements.map((item) => item._dragRef));
}
}
disposeCDKDropList() {
if (this.dropListRef) {
this.dropListRef.dispose();
this.dropListDestroyed.next();
this.dropListDestroyed.complete();
}
}
itemDropped(event) {
// CDK retrieves incorrectly event.previousIndex so we need to compute it ourselves
const item = event.item.data;
const computedPreviousIndex = this.itemsSource.indexOf(item.data, 0);
const oldSorting = [...this.itemsSource];
const newSorting = [...this.itemsSource];
let sortingOrderChanged = true;
this.mousedOver = [];
if (event.previousContainer === event.container) {
moveItemInArray(newSorting, computedPreviousIndex, event.currentIndex);
sortingOrderChanged = computedPreviousIndex !== event.currentIndex;
}
else {
// moves the item from the source: event.container[computedPreviousIndex] to target: event.container.data[event.currentIndex]
transferArrayItem(event.previousContainer.data, event.container.data, computedPreviousIndex, event.currentIndex);
}
if (sortingOrderChanged) {
// trigger event only if position index or the container actually changed
this.itemsReordered.emit({
item: item,
previousIndex: computedPreviousIndex,
currentIndex: event.currentIndex,
currentState: newSorting,
previousState: oldSorting,
dropListRef: this.dropListRef,
});
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RepeatComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.LoggerService }, { token: i0.IterableDiffers }, { token: i2.DragDrop }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: RepeatComponent, selector: "nui-repeat", inputs: { draggable: "draggable", reorderable: "reorderable", preventRowClick: "preventRowClick", repeatItemTemplateRef: "repeatItemTemplateRef", dragHandleTemplateRef: "dragHandleTemplateRef", dragPreviewClass: "dragPreviewClass", dragPreviewTemplateRef: "dragPreviewTemplateRef", actionsTemplateRef: "actionsTemplateRef", selectionMode: "selectionMode", paddingSize: "paddingSize", virtualScroll: "virtualScroll", itemSize: "itemSize", selection: "selection", itemConfig: "itemConfig", itemsSource: "itemsSource", highlightSelectedItem: "highlightSelectedItem" }, outputs: { draggableChange: "draggableChange", reorderableChange: "reorderableChange", itemsReordered: "itemsReordered", selectionChange: "selectionChange" }, host: { properties: { "class.virtual-scroll-viewport": "virtualScroll", "attr.role": "role", "attr.aria-multiselectable": "ariaMultiselectable", "style.width": "this.width" } }, viewQueries: [{ propertyName: "dropListArea", first: true, predicate: ["dropListArea"], descendants: true }, { propertyName: "_viewportRef", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "draggableElements", predicate: CdkDrag, descendants: true }], ngImport: i0, template: "<ng-template #repeatItems let-item=\"item\" let-itemIndex=\"itemIndex\">\n <nui-repeat-item\n class=\"repeat-group-item\"\n #drag=\"cdkDrag\"\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragPreviewClass]=\"dragPreviewClass\"\n [cdkDragDisabled]=\"!isItemDraggable(item)\"\n (rowClicked)=\"itemClicked($event, item)\"\n [clickable]=\"isItemClickable(item)\"\n [selectable]=\"isItemSelectable(item)\"\n [selected]=\"isItemSelected(item) && !isItemDisabled(item)\"\n [class.repeat-group-item--disabled]=\"isItemDisabled(item)\"\n [class.nui-dnd-without-drag-handle]=\"\n isItemDraggable(item) && !dragHandleTemplateRef\n \"\n [class.nui-dnd-raised-state]=\"\n isItemDraggable(item) && mousedOver[itemIndex]\n \"\n >\n <div\n *ngIf=\"dragHandleTemplateRef && !virtualScroll\"\n [class.hide]=\"!draggable\"\n [class.invisible]=\"!isItemDraggable(item)\"\n class=\"nui-repeat-item__controls-drag-handle align-self-center\"\n >\n <div\n cdkDragHandle\n (mouseover)=\"mousedOver[itemIndex] = true\"\n (mouseout)=\"mousedOver[itemIndex] = false\"\n [class.nui-dnd-handle]=\"!drag.disabled\"\n >\n <ng-container\n [ngTemplateOutlet]=\"dragHandleTemplateRef\"\n [ngTemplateOutletContext]=\"{ item: item }\"\n ></ng-container>\n </div>\n </div>\n <div\n *ngIf=\"dragPreviewTemplateRef && !virtualScroll\"\n class=\"nui-repeat-item__controls-drag-handle\"\n >\n <div\n *cdkDragPreview\n [class.nui-dnd-preview]=\"!isItemDisabled(item)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"dragPreviewTemplateRef\"\n [ngTemplateOutletContext]=\"{ item: item }\"\n ></ng-container>\n </div>\n </div>\n <div class=\"nui-repeat-item__controls-container\">\n <nui-checkbox\n *ngIf=\"isModeMulti()\"\n class=\"nui-repeat-item__checkbox\"\n [value]=\"item\"\n [checked]=\"isItemSelected(item)\"\n [disabled]=\"isItemDisabled(item)\"\n (valueChange)=\"itemClicked($event, item)\"\n >\n </nui-checkbox>\n <nui-radio\n *ngIf=\"isModeRadio()\"\n class=\"nui-repeat-item__radio\"\n [value]=\"item\"\n [checked]=\"isItemSelected(item)\"\n [disabled]=\"isItemDisabled(item)\"\n (click)=\"itemClicked($event, item)\"\n >\n </nui-radio>\n </div>\n <div class=\"nui-repeat-item__content-container\">\n <ng-container\n [ngTemplateOutlet]=\"repeatItemTemplateRef\"\n [ngTemplateOutletContext]=\"{ item: item }\"\n ></ng-container>\n </div>\n <div\n class=\"nui-repeat-item__actions-container\"\n *ngIf=\"actionsTemplateRef\"\n >\n <ng-container\n [ngTemplateOutlet]=\"actionsTemplateRef\"\n [ngTemplateOutletContext]=\"{ item: item }\"\n >\n </ng-container>\n </div>\n </nui-repeat-item>\n</ng-template>\n\n<div class=\"nui-repeat nui-repeat__{{ paddingSize }}\">\n <div class=\"nui-repeat-header\">\n <ng-content select=\"[repeatHeaderTemplate]\"></ng-content>\n </div>\n <ul #dropListArea class=\"repeat-group\" aria-dropeffect=\"move\">\n <div *ngIf=\"!virtualScroll\">\n <ng-container\n *ngFor=\"\n let sourceItem of itemsSource;\n trackBy: itemConfig?.trackBy;\n let itemIndex = index\n \"\n [ngTemplateOutlet]=\"repeatItems\"\n [ngTemplateOutletContext]=\"{\n item: sourceItem,\n itemIndex: itemIndex\n }\"\n ></ng-container>\n </div>\n <cdk-virtual-scroll-viewport\n [itemSize]=\"itemSize\"\n *ngIf=\"virtualScroll && itemSize\"\n >\n <ng-container\n *cdkVirtualFor=\"\n let sourceItem of itemsSource;\n templateCacheSize: 0\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"repeatItems\"\n [ngTemplateOutletContext]=\"{ item: sourceItem }\"\n ></ng-container>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n </ul>\n</div>\n", styles: [".nui .nui-repeat{height:inherit}.nui .nui-repeat__normal .nui-repeat-item{padding-top:5px;padding-bottom:5px}.nui .nui-repeat>ul>cdk-virtual-scroll-viewport{height:100%}.nui .nui-repeat__compact .nui-repeat-item{padding-top:0;padding-bottom:0}.nui .nui-repeat-header{color:var(--nui-color-text-default,#111);background-color:var(--nui-color-bg-light,#fff)}.nui .nui-repeat .repeat-group .nui-repeat-item{cursor:auto}.nui .nui-repeat .repeat-group .nui-repeat-item.nui-repeat-item--clickable{cursor:pointer}.nui .nui-repeat .repeat-group .nui-repeat-item.nui-repeat-item--clickable:hover:not(.nui-repeat-item--selected){border-color:var(--nui-color-line-default,#d9d9d9)}.nui .nui-repeat .repeat-group-item:first-child .nui-repeat-item{border-top:solid 1px;border-top-color:var(--nui-color-line-default,#d9d9d9)}.nui .nui-repeat .repeat-group{margin-bottom:0;padding-left:0;margin-left:0;height:inherit}.nui .nui-repeat .repeat-group-item{position:relative;display:block;color:var(--nui-color-text-default,#111);background-color:var(--nui-color-bg-light,#fff);-webkit-transition:box-shadow .4s;-o-transition:box-shadow .4s;transition:box-shadow .4s}.nui .nui-repeat .repeat-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.nui .nui-repeat .repeat-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.nui .nui-repeat .repeat-group-item:hover{cursor:pointer}.nui .nui-repeat .repeat-group-item:hover.nui-dnd-without-drag-handle:not(.cdk-drag-disabled){cursor:move;z-index:1;box-sizing:border-box;box-shadow:0 2px 10px 0 var(--nui-shadow-color, rgba(17, 17, 17, .3))}.nui .nui-repeat .repeat-group-item--disabled{color:var(--nui-color-text-disabled,rgba(17, 17, 17, .3))}.nui .nui-repeat .repeat-group-item--disabled:hover{cursor:not-allowed}.nui .nui-repeat .nui-repeat-item{border-bottom:solid 1px;border-bottom-color:var(--nui-color-line-default,#d9d9d9)}@supports (-ms-ime-align: auto){.nui .nui-repeat .nui-repeat-item{margin-bottom:.5px}}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.CheckboxComponent, selector: "nui-checkbox", inputs: ["ariaLabel", "ariaLabelledby", "ariaDescribedby", "name", "title", "value", "hovered", "checked", "required", "hint", "disabled", "indeterminate"], outputs: ["valueChange"] }, { kind: "component", type: i5.RadioComponent, selector: "nui-radio", inputs: ["value", "hovered", "checked", "hint", "disabled", "ariaLabel"], outputs: ["valueChange"] }, { kind: "directive", type: i6.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i6.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i6.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i2.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "component", type: i7.RepeatItemComponent, selector: "nui-repeat-item", inputs: ["clickable", "nowrap", "selected", "selectable"], outputs: ["rowClicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RepeatComponent, decorators: [{
type: Component,
args: [{ selector: "nui-repeat", changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
"[class.virtual-scroll-viewport]": "virtualScroll",
"[attr.role]": "role",
"[attr.aria-multiselectable]": "ariaMultiselectable",
}, template: "<ng-template #repeatItems let-item=\"item\" let-itemIndex=\"itemIndex\">\n <nui-repeat-item\n class=\"repeat-group-item\"\n #drag=\"cdkDrag\"\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragPreviewClass]=\"dragPreviewClass\"\n [cdkDragDisabled]=\"!isItemDraggable(item)\"\n (rowClicked)=\"itemClicked($event, item)\"\n [clickable]=\"isItemClickable(item)\"\n [selectable]=\"isItemSelectable(item)\"\n [selected]=\"isItemSelected(item) && !isItemDisabled(item)\"\n [class.repeat-group-item--disabled]=\"isItemDisabled(item)\"\n [class.nui-dnd-without-drag-handle]=\"\n isItemDraggable(item) && !dragHandleTemplateRef\n \"\n [class.nui-dnd-raised-state]=\"\n isItemDraggable(item) && mousedOver[itemIndex]\n \"\n >\n <div\n *ngIf=\"dragHandleTemplateRef && !virtualScroll\"\n [class.hide]=\"!draggable\"\n [class.invisible]=\"!isItemDraggable(item)\"\n class=\"nui-repeat-item__controls-drag-handle align-self-center\"\n >\n <div\n cdkDragHandle\n (mouseover)=\"mousedOver[itemIndex] = true\"\n (mouseout)=\"mousedOver[itemIndex] = false\"\n [class.nui-dnd-handle]=\"!drag.disabled\"\n >\n <ng-container\n [ngTemplateOutlet]=\"dragHandleTemplateRef\"\n [ngTemplateOutletContext]=\"{ item: item }\"\n ></ng-container>\n </div>\n </div>\n <div\n *ngIf=\"dragPreviewTemplateRef && !virtualScroll\"\n class=\"nui-repeat-item__controls-drag-handle\"\n >\n <div\n *cdkDragPreview\n [class.nui-dnd-preview]=\"!isItemDisabled(item)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"dragPreviewTemplateRef\"\n [ngTemplateOutletContext]=\"{ item: item }\"\n ></ng-container>\n </div>\n </div>\n <div class=\"nui-repeat-item__controls-container\">\n <nui-checkbox\n *ngIf=\"isModeMulti()\"\n class=\"nui-repeat-item__checkbox\"\n [value]=\"item\"\n [checked]=\"isItemSelected(item)\"\n [disabled]=\"isItemDisabled(item)\"\n (valueChange)=\"itemClicked($event, item)\"\n >\n </nui-checkbox>\n <nui-radio\n *ngIf=\"isModeRadio()\"\n class=\"nui-repeat-item__radio\"\n [value]=\"item\"\n [checked]=\"isItemSelected(item)\"\n [disabled]=\"isItemDisabled(item)\"\n (click)=\"itemClicked($event, item)\"\n >\n </nui-radio>\n </div>\n <div class=\"nui-repeat-item__content-container\">\n <ng-container\n [ngTemplateOutlet]=\"repeatItemTemplateRef\"\n [ngTemplateOutletContext]=\"{ item: item }\"\n ></ng-container>\n </div>\n <div\n class=\"nui-repeat-item__actions-container\"\n *ngIf=\"actionsTemplateRef\"\n >\n <ng-container\n [ngTemplateOutlet]=\"actionsTemplateRef\"\n [ngTemplateOutletContext]=\"{ item: item }\"\n >\n </ng-container>\n </div>\n </nui-repeat-item>\n</ng-template>\n\n<div class=\"nui-repeat nui-repeat__{{ paddingSize }}\">\n <div class=\"nui-repeat-header\">\n <ng-content select=\"[repeatHeaderTemplate]\"></ng-content>\n </div>\n <ul #dropListArea class=\"repeat-group\" aria-dropeffect=\"move\">\n <div *ngIf=\"!virtualScroll\">\n <ng-container\n *ngFor=\"\n let sourceItem of itemsSource;\n trackBy: itemConfig?.trackBy;\n let itemIndex = index\n \"\n [ngTemplateOutlet]=\"repeatItems\"\n [ngTemplateOutletContext]=\"{\n item: sourceItem,\n itemIndex: itemIndex\n }\"\n ></ng-container>\n </div>\n <cdk-virtual-scroll-viewport\n [itemSize]=\"itemSize\"\n *ngIf=\"virtualScroll && itemSize\"\n >\n <ng-container\n *cdkVirtualFor=\"\n let sourceItem of itemsSource;\n templateCacheSize: 0\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"repeatItems\"\n [ngTemplateOutletContext]=\"{ item: sourceItem }\"\n ></ng-container>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n </ul>\n</div>\n", styles: [".nui .nui-repeat{height:inherit}.nui .nui-repeat__normal .nui-repeat-item{padding-top:5px;padding-bottom:5px}.nui .nui-repeat>ul>cdk-virtual-scroll-viewport{height:100%}.nui .nui-repeat__compact .nui-repeat-item{padding-top:0;padding-bottom:0}.nui .nui-repeat-header{color:var(--nui-color-text-default,#111);background-color:var(--nui-color-bg-light,#fff)}.nui .nui-repeat .repeat-group .nui-repeat-item{cursor:auto}.nui .nui-repeat .repeat-group .nui-repeat-item.nui-repeat-item--clickable{cursor:pointer}.nui .nui-repeat .repeat-group .nui-repeat-item.nui-repeat-item--clickable:hover:not(.nui-repeat-item--selected){border-color:var(--nui-color-line-default,#d9d9d9)}.nui .nui-repeat .repeat-group-item:first-child .nui-repeat-item{border-top:solid 1px;border-top-color:var(--nui-color-line-default,#d9d9d9)}.nui .nui-repeat .repeat-group{margin-bottom:0;padding-left:0;margin-left:0;height:inherit}.nui .nui-repeat .repeat-group-item{position:relative;display:block;color:var(--nui-color-text-default,#111);background-color:var(--nui-color-bg-light,#fff);-webkit-transition:box-shadow .4s;-o-transition:box-shadow .4s;transition:box-shadow .4s}.nui .nui-repeat .repeat-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.nui .nui-repeat .repeat-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.nui .nui-repeat .repeat-group-item:hover{cursor:pointer}.nui .nui-repeat .repeat-group-item:hover.nui-dnd-without-drag-handle:not(.cdk-drag-disabled){cursor:move;z-index:1;box-sizing:border-box;box-shadow:0 2px 10px 0 var(--nui-shadow-color, rgba(17, 17, 17, .3))}.nui .nui-repeat .repeat-group-item--disabled{color:var(--nui-color-text-disabled,rgba(17, 17, 17, .3))}.nui .nui-repeat .repeat-group-item--disabled:hover{cursor:not-allowed}.nui .nui-repeat .nui-repeat-item{border-bottom:solid 1px;border-bottom-color:var(--nui-color-line-default,#d9d9d9)}@supports (-ms-ime-align: auto){.nui .nui-repeat .nui-repeat-item{margin-bottom:.5px}}\n"] }]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.LoggerService }, { type: i0.IterableDiffers }, { type: i2.DragDrop }, { type: i0.ElementRef }], propDecorators: { draggable: [{
type: Input
}], reorderable: [{
type: Input
}], draggableChange: [{
type: Output
}], reorderableChange: [{
type: Output
}], width: [{
type: HostBinding,
args: ["style.width"]
}], preventRowClick: [{
type: Input
}], repeatItemTemplateRef: [{
type: Input
}], dragHandleTemplateRef: [{
type: Input
}], dragPreviewClass: [{
type: Input
}], dragPreviewTemplateRef: [{
type: Input
}], actionsTemplateRef: [{
type: Input
}], selectionMode: [{
type: Input
}], paddingSize: [{
type: Input
}], virtualScroll: [{
type: Input
}], itemSize: [{
type: Input
}], selection: [{
type: Input
}], itemsReordered: [{
type: Output
}], itemConfig: [{
type: Input
}], itemsSource: [{
type: Input
}], highlightSelectedItem: [{
type: Input
}], selectionChange: [{
type: Output
}], dropListArea: [{
type: ViewChild,
args: ["dropListArea"]
}], _viewportRef: [{
type: ViewChild,
args: [CdkVirtualScrollViewport]
}], draggableElements: [{
type: ViewChildren,
args: [CdkDrag]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVwZWF0L3JlcGVhdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3JlcGVhdC9yZXBlYXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFDSCxPQUFPLEVBQ1AsUUFBUSxFQUdSLGVBQWUsRUFFZixpQkFBaUIsR0FDcEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUVMLGVBQWUsRUFHZixNQUFNLEVBQ04sU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLFFBQVEsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEQsT0FBTyxFQUlILGNBQWMsRUFDZCxtQkFBbUIsR0FDdEIsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBT2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7O0FBWTNEOzs7O0dBSUc7QUFhSCxNQUFNLE9BQU8sZUFBZTtJQUd4Qjs7T0FFRztJQUNILElBQ1csU0FBUyxDQUFDLEtBQWM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFFeEIsbUNBQW1DO1FBQ25DLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRTdCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDaEQ7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ2xEO0lBQ0wsQ0FBQztJQUVELElBQVcsU0FBUztRQUNoQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFDVyxXQUFXLENBQUMsS0FBYztRQUNqQyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssS0FBSyxFQUFFO1lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNaLGlFQUFpRSxDQUNwRSxDQUFDO1NBQ0w7UUFFRCxpRUFBaUU7UUFDakUsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BDO1FBRUQsK0NBQStDO1FBQy9DLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLEtBQUssRUFBRTtZQUNqRCxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsR0FBRyxDQUFDLEtBQUssQ0FBQztTQUM3QztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDbEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7SUFrSEQsSUFBVyxXQUFXO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztTQUNuRDtRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUM3QixDQUFDO0lBZ0NELElBQUksSUFBSTtRQUNKLE9BQU8sSUFBSSxDQUFDLGFBQWEsS0FBSyxtQkFBbUIsQ0FBQyxJQUFJO1lBQ2xELENBQUMsQ0FBQyxTQUFTO1lBQ1gsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNqQixDQUFDO0lBRUQsSUFBSSxtQkFBbUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxZQUNXLGNBQWlDLEVBQ2pDLE1BQXFCLEVBQ3BCLGVBQWdDLEVBQ2pDLGVBQXlCLEVBQ3hCLEtBQWlCO1FBSmxCLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3BCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNqQyxvQkFBZSxHQUFmLGVBQWUsQ0FBVTtRQUN4QixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBcEs3Qix3RUFBd0U7UUFDOUQsb0JBQWUsR0FDckIsSUFBSSxZQUFZLENBQVUsSUFBSSxDQUFDLENBQUM7UUFFMUIsc0JBQWlCLEdBQ3ZCLElBQUksWUFBWSxDQUFVLElBQUksQ0FBQyxDQUFDO1FBRXBDOztXQUVHO1FBQ3lCLFVBQUssR0FBRyxNQUFNLENBQUM7UUFFM0M7O1dBRUc7UUFDTSxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQVkxQzs7Ozs7V0FLRztRQUNNLHFCQUFnQixHQUFXLGlCQUFpQixDQUFDO1FBWXREOztXQUVHO1FBQ2Esa0JBQWEsR0FDekIsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1FBUzdCOztXQUVHO1FBQ2Esa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFTL0M7O1dBRUc7UUFDYSxjQUFTLEdBQVEsRUFBRSxDQUFDO1FBRXBDOztXQUVHO1FBQ2MsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFFL0MsQ0FBQztRQVlKOztXQUVHO1FBQ2EsMEJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBRTdDOztXQUVHO1FBQ2Msb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBcUJ0RCxlQUFVLEdBQWMsRUFBRSxDQUFDO1FBcUIxQix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFJcEMsbURBQW1EO1FBQ2xDLHNCQUFpQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFpVGpELGlDQUE0QixHQUFHLENBQ25DLE9BQW9DLEVBQ3BDLFFBQThCLEVBQzFCLEVBQUU7WUFDTixJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDakQsc0hBQXNIO2dCQUN0SCxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUM7YUFDeEM7UUFDTCxDQUFDLENBQUM7SUF2U0MsQ0FBQztJQUVHLFFBQVE7UUFDWCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxvQkFBb0IsQ0FDaEQsSUFBSSxDQUFDLDRCQUE0QixDQUNwQyxDQUFDO1FBQ0YsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsWUFBWSxPQUFPLEVBQUU7WUFDN0MsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQy9EO1FBRUQsSUFDSSxJQUFJLENBQUMsc0JBQXNCO1lBQzNCLElBQUksQ0FBQyxxQkFBcUI7WUFDMUIsSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLEVBQzVCO1lBQ0UsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzlDO1FBRUQsSUFBSSxDQUFDLFdBQVc7WUFDWixJQUFJLENBQUMsV0FBVyxJQUFJLGNBQWM7Z0JBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVztnQkFDbEIsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDYix3RkFBd0YsQ0FDM0YsQ0FBQztTQUNMO1FBRUQsZ0ZBQWdGO1FBQ2hGLDBEQUEwRDtRQUMxRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlO2FBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQzthQUM1QixNQUFNLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRU0sU0FBUztRQUNaLGtGQUFrRjtRQUNsRix1RkFBdUY7UUFDdkYsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUN0QztJQUNMLENBQUM7SUFFTSxlQUFlO1FBQ2xCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksV0FBVztRQUNkLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxTQUFTLENBQVUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU0sTUFBTTtRQUNULElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVNLFVBQVU7UUFDYixNQUFNLFFBQVEsR0FBRztZQUNiLElBQUksRUFBRSxNQUFNLENBQWUsV0FBVyxDQUFDO1lBQ3ZDLEtBQUssRUFBRTtnQkFDSCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO2dCQUNqQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CO2FBQ2hEO1NBQ0osQ0FBQztRQUNGLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGNBQWMsQ0FBQyxJQUFPO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDN0IsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxRQUFRLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDeEIsS0FBSyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7WUFDaEMsS0FBSyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7WUFDL0IsS0FBSyxtQkFBbUIsQ0FBQywyQkFBMkIsQ0FBQztZQUNyRCxLQUFLLG1CQUFtQixDQUFDLDZCQUE2QjtnQkFDbEQsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9ELEtBQUssbUJBQW1CLENBQUMsS0FBSztnQkFDMUIsT0FBTyxPQUFPLENBQ1YsSUFBSSxDQUFDLFNBQVM7b0JBQ1YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNO29CQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDMUMsQ0FBQztZQUNOO2dCQUNJLE9BQU8sS0FBSyxDQUFDO1NBQ3BCO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXLENBQUMsS0FBaUIsRUFBRSxJQUFPO1FBQ3pDLElBQ0ksSUFBSSxDQUFDLGFBQWEsS0FBSyxtQkFBbUIsQ0FBQyxJQUFJO1lBQy9DLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQzNCO1lBQ0UsT0FBTztTQUNWO1FBRUQsMkNBQTJDO1FBQzNDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2pDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdkIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDcEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztZQUNoQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsT0FBTztTQUNWO1FBRUQsSUFDSSxJQUFJLENBQUMsYUFBYTtZQUNkLG1CQUFtQixDQUFDLDJCQUEyQjtZQUNuRCxJQUFJLENBQUMsYUFBYSxLQUFLLG1CQUFtQixDQUFDLEtBQUssRUFDbEQ7WUFDRSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDM0I7UUFFRCxJQUNJLElBQUksQ0FBQyxhQUFhLEtBQUssbUJBQW1CLENBQUMsTUFBTTtZQUNqRCxJQUFJLENBQUMsYUFBYTtnQkFDZCxtQkFBbUIsQ0FBQyw2QkFBNkIsRUFDdkQ7WUFDRSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNyQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQzthQUN2QjtpQkFBTTtnQkFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDM0I7U0FDSjtRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHFCQUFxQixDQUFDLElBQU87UUFDaEMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzlDO2FBQU07WUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUNsQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsYUFBYSxLQUFLLElBQUksQ0FDNUMsQ0FBQztTQUNMO1FBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTSxXQUFXO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxLQUFLLG1CQUFtQixDQUFDLEtBQUssQ0FBQztJQUM1RCxDQUFDO0lBRU0sV0FBVztRQUNkLE9BQU87WUFDSCxtQkFBbUIsQ0FBQyxLQUFLO1lBQ3pCLG1CQUFtQixDQUFDLDZCQUE2QjtTQUNwRCxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELHFDQUFxQztJQUM5QixlQUFlLENBQUMsSUFBTztRQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVNLGdCQUFnQixDQUFDLElBQU87UUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVNLGNBQWMsQ0FBQyxJQUFPO1FBQ3pCLE9BQU8sQ0FDRixJQUFvQixDQUFDLFFBQVE7WUFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQ3hDLENBQUM7SUFDTixDQUFDO0lBRU0sZUFBZSxDQUFDLElBQU87UUFDMUIsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDakQsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCwrREFBK0Q7UUFDL0QsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO1lBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNaLG9EQUFvRCxNQUFNLENBRXhELFdBQVcsQ0FBQyxpQkFBaUIsQ0FDbEMsQ0FBQztZQUNGLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDbEUsQ0FBQztJQUNELG1DQUFtQztJQUUzQixxQkFBcUI7UUFDekIsSUFDSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQ25CLElBQUksQ0FBQyxZQUFZO1lBQ2pCLElBQUksQ0FBQyxVQUFVO1lBQ2YsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUNuQjtZQUNFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQ2xELElBQUksQ0FBQyxZQUFZLENBQ3BCLENBQUM7WUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUV6Qyw4QkFBOEI7WUFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPO2lCQUNuQixJQUFJLENBQ0QsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQ3ZDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FDcEM7aUJBQ0EsU0FBUyxFQUFFLENBQUM7WUFFakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQ3RCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDdEQsQ0FBQztTQUNMO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQjtRQUN0QixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3JDO0lBQ0wsQ0FBQztJQUVPLFdBQVcsQ0FBQyxLQUF5QjtRQUN6QyxtRkFBbUY7UUFDbkYsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDN0IsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV6QyxJQUFJLG1CQUFtQixHQUFZLElBQUksQ0FBQztRQUV4QyxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUVyQixJQUFJLEtBQUssQ0FBQyxpQkFBaUIsS0FBSyxLQUFLLENBQUMsU0FBUyxFQUFFO1lBQzdDLGVBQWUsQ0FDWCxVQUFVLEVBQ1YscUJBQXFCLEVBQ3JCLEtBQUssQ0FBQyxZQUFZLENBQ3JCLENBQUM7WUFDRixtQkFBbUIsR0FBRyxxQkFBcUIsS0FBSyxLQUFLLENBQUMsWUFBWSxDQUFDO1NBQ3RFO2FBQU07WUFDSCw2SEFBNkg7WUFDN0gsaUJBQWlCLENBQ2IsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFDNUIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQ3BCLHFCQUFxQixFQUNyQixLQUFLLENBQUMsWUFBWSxDQUNyQixDQUFDO1NBQ0w7UUFFRCxJQUFJLG1CQUFtQixFQUFFO1lBQ3JCLHlFQUF5RTtZQUN6RSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztnQkFDckIsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsYUFBYSxFQUFFLHFCQUFxQjtnQkFDcEMsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO2dCQUNoQyxZQUFZLEVBQUUsVUFBVTtnQkFDeEIsYUFBYSxFQUFFLFVBQVU7Z0JBQ3pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVzthQUNoQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7K0dBMWZRLGVBQWU7bUdBQWYsZUFBZSxza0NBc0tiLHdCQUF3Qix1RUFTckIsT0FBTyxnRENqUnpCLGl5SkFnSUE7OzRGRDlCYSxlQUFlO2tCQVozQixTQUFTOytCQUNJLFlBQVksbUJBRUwsdUJBQXVCLENBQUMsTUFBTSxpQkFFaEMsaUJBQWlCLENBQUMsSUFBSSxRQUMvQjt3QkFDRixpQ0FBaUMsRUFBRSxlQUFlO3dCQUNsRCxhQUFhLEVBQUUsTUFBTTt3QkFDckIsNkJBQTZCLEVBQUUscUJBQXFCO3FCQUN2RDtnTUFTVSxTQUFTO3NCQURuQixLQUFLO2dCQXlCSyxXQUFXO3NCQURyQixLQUFLO2dCQTJCSSxlQUFlO3NCQUF4QixNQUFNO2dCQUdHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFNcUIsS0FBSztzQkFBaEMsV0FBVzt1QkFBQyxhQUFhO2dCQUtqQixlQUFlO3NCQUF2QixLQUFLO2dCQUtHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFLRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBUUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUtHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFLRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBS1UsYUFBYTtzQkFBNUIsS0FBSztnQkFRVSxXQUFXO3NCQUExQixLQUFLO2dCQUtVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBT1UsUUFBUTtzQkFBdkIsS0FBSztnQkFLVSxTQUFTO3NCQUF4QixLQUFLO2dCQUtXLGNBQWM7c0JBQTlCLE1BQU07Z0JBT1MsVUFBVTtzQkFBekIsS0FBSztnQkFLVSxXQUFXO3NCQUExQixLQUFLO2dCQUtVLHFCQUFxQjtzQkFBcEMsS0FBSztnQkFLVyxlQUFlO3NCQUEvQixNQUFNO2dCQUVvQixZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBU2pCLFlBQVk7c0JBRG5CLFNBQVM7dUJBQUMsd0JBQXdCO2dCQVNaLGlCQUFpQjtzQkFBdkMsWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxF