@nova-ui/bits
Version:
SolarWinds Nova Framework
188 lines • 35.6 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 { Component, ComponentFactoryResolver, ContentChildren, ElementRef, HostBinding, Input, QueryList, Renderer2, ViewChild, ViewContainerRef, } from "@angular/core";
import { ResizeDirection, ResizeUnit, } from "../../../common/directives/resizer/public-api";
import { LayoutResizerComponent } from "../layout-resizer/layout-resizer.component";
import { SheetComponent } from "../sheet/sheet.component";
import * as i0 from "@angular/core";
// <example-url>./../examples/index.html#/layout</example-url>
export class SheetGroupComponent {
// workaround for issue when @ContentChildren can select host component - https://github.com/angular/angular/issues/10098;
// TODO: remove when it'll be fixed in Ivy
filterGroups(sheetGroupList) {
return sheetGroupList.filter((group) => group !== this);
}
addResizers(resizableList) {
resizableList.forEach((resizableItem, index) => {
if (index === resizableList.length - 1) {
return;
}
this.appendResizer(LayoutResizerComponent, resizableItem);
});
// make it such that it's valid even when resizer isn't added
this.calculateFlexBasis(resizableList, resizableList.length);
}
appendResizer(factory, resizeEl) {
const componentRef = this.componentFactoryResolver.resolveComponentFactory(factory);
const ref = this.resizerPlaceholder.createComponent(componentRef);
ref.instance.resizeElement = resizeEl;
ref.instance.resizeDirection =
this.resizeDirection;
ref.instance.resizeUnit = this.resizeUnit;
ref.instance.enableSeparateOffsetSize =
this.sheetsType === "separate";
ref.changeDetectorRef.detectChanges();
this.resizersList.push(ref);
}
calculateFlexBasis(resizableList, numOfItems) {
let availableSpace = "100%";
const hasInitSize = resizableList.some((element) => !!element.initialSizeValue);
const fitContent = resizableList.some((element) => !!element.fitContent);
const itemsToRender = [];
let itemsWithSize;
let itemsWithoutSize;
if (hasInitSize) {
// calculation for init size
// filter element so that those with size are dealt with first
itemsWithSize = resizableList.filter((element) => !!element.initialSizeValue && !element.fitContent);
itemsWithoutSize = resizableList.filter((element) => !element.initialSizeValue && !element.fitContent);
itemsWithSize.forEach((element) => {
availableSpace = `(${availableSpace} - ${element.initialSizeValue})`;
itemsToRender.push({
item: element,
value: `${element.initialSizeValue}`,
});
numOfItems--;
});
itemsWithoutSize.forEach((element) => {
availableSpace = `${availableSpace} / ${numOfItems}`;
itemsToRender.push({ item: element, value: availableSpace });
numOfItems--;
});
}
else if (!fitContent) {
// normal flow of calculation
resizableList.forEach((resizableItem) => {
itemsToRender.push({
item: resizableItem,
value: `${availableSpace} / ${numOfItems}`,
});
});
}
// rendering of calculation
itemsToRender.forEach(({ item, value }) => {
this.renderer.setStyle(item.elRef.nativeElement, "flexBasis", `calc(${value})`);
});
}
constructor(elRef, renderer, componentFactoryResolver) {
this.elRef = elRef;
this.renderer = renderer;
this.componentFactoryResolver = componentFactoryResolver;
/**
* Set resize unit of child elements(pixel, percent). By default pixels are used.
*/
this.resizeUnit = ResizeUnit.pixel;
/**
* Determines the way sheets links each other. Can be 'joined' or 'separate'.
*/
this.sheetsType = "joined";
/**
* Direction of layout elements. Can be 'row' or 'column'.
*/
this.direction = "row";
this.applyDirectionColumnClass = false;
this.applyDirectionRowClass = true;
this.resizersList = [];
}
ngOnInit() {
this.applyJoinedSheetsClass =
(this.applyJoinedSheetsClass && !this.applySeparateSheetsClass) ||
this.sheetsType === "joined";
this.applySeparateSheetsClass =
(!this.applyJoinedSheetsClass && this.applySeparateSheetsClass) ||
this.sheetsType === "separate";
this.applyDirectionColumnClass = this.direction === "column";
this.applyDirectionRowClass = this.direction === "row";
this.resizeDirection =
this.direction === "row"
? ResizeDirection.right
: ResizeDirection.bottom;
}
ngAfterViewInit() {
// 2 addResizers needed for correct handling sheetGroups and sheets elements,
// f.e. flex basis calculation or detection last element of correspondent type
if (this.isResizable) {
this.addResizers(this.sheetList);
this.addResizers(this.filterGroups(this.sheetGroupList));
}
else {
this.calculateFlexBasis(this.sheetList, this.sheetList.length);
this.calculateFlexBasis(this.filterGroups(this.sheetGroupList), this.filterGroups(this.sheetGroupList).length);
}
}
ngOnDestroy() {
if (this.resizersList.length > 0) {
this.resizersList.forEach((resizer) => {
resizer.destroy();
});
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SheetGroupComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ComponentFactoryResolver }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SheetGroupComponent, selector: "nui-sheet-group", inputs: { isResizable: "isResizable", resizeUnit: "resizeUnit", sheetsType: "sheetsType", direction: "direction", initialSizeValue: "initialSizeValue" }, host: { properties: { "class.nui-sheet-group--resizable": "this.isResizable", "class.nui-sheet-group--joined-sheets": "this.applyJoinedSheetsClass", "class.nui-sheet-group--separate-sheets": "this.applySeparateSheetsClass", "class.sheet-group-direction-column": "this.applyDirectionColumnClass", "class.sheet-group-direction-row": "this.applyDirectionRowClass" }, classAttribute: "nui-sheet-group" }, queries: [{ propertyName: "sheetList", predicate: SheetComponent }, { propertyName: "sheetGroupList", predicate: SheetGroupComponent }], viewQueries: [{ propertyName: "resizerPlaceholder", first: true, predicate: ["resizerPlaceholder"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<ng-content></ng-content>\n<ng-template #resizerPlaceholder></ng-template>\n", styles: [":host{position:relative;display:flex;width:100%;height:100%;min-height:50px;background-color:transparent;flex-grow:1}:host.nui-sheet-group--joined-sheets{box-shadow:0 0 5px 0 var(--nui-shadow-color, rgba(17, 17, 17, .3))}:host.nui-sheet-group--joined-sheets.sheet-group-direction-row{flex-direction:row}:host.nui-sheet-group--joined-sheets.sheet-group-direction-column{flex-direction:column}:host.nui-sheet-group--separate-sheets.sheet-group-direction-row{flex-direction:row}:host.nui-sheet-group--separate-sheets.sheet-group-direction-column{flex-direction:column}:host-context(.nui-sheet-group--joined-sheets) :host.nui-sheet-group--joined-sheets{box-shadow:none}:host-context(.nui-sheet-group--resizable) nui-sheet-group{width:auto;height:auto}:host-context(.nui-sheet-group--separate-sheets.sheet-group-direction-column >):not(:last-of-type){margin-bottom:15px}:host-context(.nui-sheet-group--separate-sheets.sheet-group-direction-row >):not(:last-of-type){margin-right:15px}:host-context(.nui-sheet-group--joined-sheets.sheet-group-direction-column >):not(:last-of-type):not(:first-of-type){border-bottom-color:var(--nui-color-line-dark,#999999);border-bottom-width:var(--nui-line-default,1px);border-bottom-style:solid;border-top-color:var(--nui-color-line-default,#d9d9d9);border-top-width:var(--nui-line-default,1px);border-top-style:solid}:host-context(.nui-sheet-group--joined-sheets.sheet-group-direction-column >):last-of-type{border-top-color:var(--nui-color-line-default,#d9d9d9);border-top-width:var(--nui-line-default,1px);border-top-style:solid}:host-context(.nui-sheet-group--joined-sheets.sheet-group-direction-column >):first-of-type{border-bottom-color:var(--nui-color-line-dark,#999999);border-bottom-width:var(--nui-line-default,1px);border-bottom-style:solid}:host-context(.nui-sheet-group--joined-sheets.sheet-group-direction-column >):only-child{border:none}:host-context(.nui-sheet-group--joined-sheets.sheet-group-direction-row >):not(:last-of-type):not(:first-of-type){border-right-color:var(--nui-color-line-dark,#999999);border-right-width:var(--nui-line-default,1px);border-right-style:solid;border-left-color:var(--nui-color-line-default,#d9d9d9);border-left-width:var(--nui-line-default,1px);border-left-style:solid}:host-context(.nui-sheet-group--joined-sheets.sheet-group-direction-row >):last-of-type{border-left-color:var(--nui-color-line-default,#d9d9d9);border-left-width:var(--nui-line-default,1px);border-left-style:solid}:host-context(.nui-sheet-group--joined-sheets.sheet-group-direction-row >):first-of-type{border-right-color:var(--nui-color-line-dark,#999999);border-right-width:var(--nui-line-default,1px);border-right-style:solid}:host-context(.nui-sheet-group--joined-sheets.sheet-group-direction-row >):only-child{border:none}\n"] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SheetGroupComponent, decorators: [{
type: Component,
args: [{ selector: "nui-sheet-group", host: { class: "nui-sheet-group" }, template: "<ng-content></ng-content>\n<ng-template #resizerPlaceholder></ng-template>\n", styles: [":host{position:relative;display:flex;width:100%;height:100%;min-height:50px;background-color:transparent;flex-grow:1}:host.nui-sheet-group--joined-sheets{box-shadow:0 0 5px 0 var(--nui-shadow-color, rgba(17, 17, 17, .3))}:host.nui-sheet-group--joined-sheets.sheet-group-direction-row{flex-direction:row}:host.nui-sheet-group--joined-sheets.sheet-group-direction-column{flex-direction:column}:host.nui-sheet-group--separate-sheets.sheet-group-direction-row{flex-direction:row}:host.nui-sheet-group--separate-sheets.sheet-group-direction-column{flex-direction:column}:host-context(.nui-sheet-group--joined-sheets) :host.nui-sheet-group--joined-sheets{box-shadow:none}:host-context(.nui-sheet-group--resizable) nui-sheet-group{width:auto;height:auto}:host-context(.nui-sheet-group--separate-sheets.sheet-group-direction-column >):not(:last-of-type){margin-bottom:15px}:host-context(.nui-sheet-group--separate-sheets.sheet-group-direction-row >):not(:last-of-type){margin-right:15px}:host-context(.nui-sheet-group--joined-sheets.sheet-group-direction-column >):not(:last-of-type):not(:first-of-type){border-bottom-color:var(--nui-color-line-dark,#999999);border-bottom-width:var(--nui-line-default,1px);border-bottom-style:solid;border-top-color:var(--nui-color-line-default,#d9d9d9);border-top-width:var(--nui-line-default,1px);border-top-style:solid}:host-context(.nui-sheet-group--joined-sheets.sheet-group-direction-column >):last-of-type{border-top-color:var(--nui-color-line-default,#d9d9d9);border-top-width:var(--nui-line-default,1px);border-top-style:solid}:host-context(.nui-sheet-group--joined-sheets.sheet-group-direction-column >):first-of-type{border-bottom-color:var(--nui-color-line-dark,#999999);border-bottom-width:var(--nui-line-default,1px);border-bottom-style:solid}:host-context(.nui-sheet-group--joined-sheets.sheet-group-direction-column >):only-child{border:none}:host-context(.nui-sheet-group--joined-sheets.sheet-group-direction-row >):not(:last-of-type):not(:first-of-type){border-right-color:var(--nui-color-line-dark,#999999);border-right-width:var(--nui-line-default,1px);border-right-style:solid;border-left-color:var(--nui-color-line-default,#d9d9d9);border-left-width:var(--nui-line-default,1px);border-left-style:solid}:host-context(.nui-sheet-group--joined-sheets.sheet-group-direction-row >):last-of-type{border-left-color:var(--nui-color-line-default,#d9d9d9);border-left-width:var(--nui-line-default,1px);border-left-style:solid}:host-context(.nui-sheet-group--joined-sheets.sheet-group-direction-row >):first-of-type{border-right-color:var(--nui-color-line-dark,#999999);border-right-width:var(--nui-line-default,1px);border-right-style:solid}:host-context(.nui-sheet-group--joined-sheets.sheet-group-direction-row >):only-child{border:none}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ComponentFactoryResolver }], propDecorators: { isResizable: [{
type: HostBinding,
args: ["class.nui-sheet-group--resizable"]
}, {
type: Input
}], resizeUnit: [{
type: Input
}], sheetsType: [{
type: Input
}], direction: [{
type: Input
}], initialSizeValue: [{
type: Input
}], applyJoinedSheetsClass: [{
type: HostBinding,
args: ["class.nui-sheet-group--joined-sheets"]
}], applySeparateSheetsClass: [{
type: HostBinding,
args: ["class.nui-sheet-group--separate-sheets"]
}], applyDirectionColumnClass: [{
type: HostBinding,
args: ["class.sheet-group-direction-column"]
}], applyDirectionRowClass: [{
type: HostBinding,
args: ["class.sheet-group-direction-row"]
}], resizerPlaceholder: [{
type: ViewChild,
args: ["resizerPlaceholder", { read: ViewContainerRef }]
}], sheetList: [{
type: ContentChildren,
args: [SheetComponent]
}], sheetGroupList: [{
type: ContentChildren,
args: [SheetGroupComponent, { descendants: false }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlZXQtZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9sYXlvdXQvc2hlZXQtZ3JvdXAvc2hlZXQtZ3JvdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9sYXlvdXQvc2hlZXQtZ3JvdXAvc2hlZXQtZ3JvdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFFSCxTQUFTLEVBQ1Qsd0JBQXdCLEVBRXhCLGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFHTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxnQkFBZ0IsR0FDbkIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNILGVBQWUsRUFDZixVQUFVLEdBQ2IsTUFBTSwrQ0FBK0MsQ0FBQztBQUN2RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVwRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBUTFELDhEQUE4RDtBQU85RCxNQUFNLE9BQU8sbUJBQW1CO0lBK0M1QiwwSEFBMEg7SUFDMUgsMENBQTBDO0lBQ2xDLFlBQVksQ0FBQyxjQUFtQjtRQUNwQyxPQUFPLGNBQWMsQ0FBQyxNQUFNLENBQ3hCLENBQUMsS0FBMEIsRUFBRSxFQUFFLENBQUMsS0FB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LyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFJlbmRlcmVyMixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuaW1wb3J0IHtcbiAgICBSZXNpemVEaXJlY3Rpb24sXG4gICAgUmVzaXplVW5pdCxcbn0gZnJvbSBcIi4uLy4uLy4uL2NvbW1vbi9kaXJlY3RpdmVzL3Jlc2l6ZXIvcHVibGljLWFwaVwiO1xuaW1wb3J0IHsgTGF5b3V0UmVzaXplckNvbXBvbmVudCB9IGZyb20gXCIuLi9sYXlvdXQtcmVzaXplci9sYXlvdXQtcmVzaXplci5jb21wb25lbnRcIjtcbmltcG9ydCB7IElMYXlvdXRFbGVtZW50RGlyZWN0aW9uLCBJU2hlZXRUeXBlIH0gZnJvbSBcIi4uL3B1YmxpYy1hcGlcIjtcbmltcG9ydCB7IFNoZWV0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3NoZWV0L3NoZWV0LmNvbXBvbmVudFwiO1xuXG50eXBlIEVsZW1lbnQgPSBTaGVldENvbXBvbmVudCB8IFNoZWV0R3JvdXBDb21wb25lbnQ7XG5pbnRlcmZhY2UgSUVsZW1lbnRJbmZvIHtcbiAgICBpdGVtOiBFbGVtZW50O1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8vIDxleGFtcGxlLXVybD4uLy4uL2V4YW1wbGVzL2luZGV4Lmh0bWwjL2xheW91dDwvZXhhbXBsZS11cmw+XG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJudWktc2hlZXQtZ3JvdXBcIixcbiAgICB0ZW1wbGF0ZVVybDogXCIuL3NoZWV0LWdyb3VwLmNvbXBvbmVudC5odG1sXCIsXG4gICAgaG9zdDogeyBjbGFzczogXCJudWktc2hlZXQtZ3JvdXBcIiB9LFxuICAgIHN0eWxlVXJsczogW1wiLi9zaGVldC1ncm91cC5jb21wb25lbnQubGVzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgU2hlZXRHcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICAvKipcbiAgICAgKiBTZXQgd2hldGhlciB0aGUgY2hpbGQgZWxlbWVudHMgY2FuIGJlIHJlc2l6YWJsZS5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoXCJjbGFzcy5udWktc2hlZXQtZ3JvdXAtLXJlc2l6YWJsZVwiKVxuICAgIEBJbnB1dCgpXG4gICAgaXNSZXNpemFibGU6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcmVzaXplIHVuaXQgb2YgY2hpbGQgZWxlbWVudHMocGl4ZWwsIHBlcmNlbnQpLiBCeSBkZWZhdWx0IHBpeGVscyBhcmUgdXNlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSByZXNpemVVbml0ID0gUmVzaXplVW5pdC5waXhlbDtcblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgdGhlIHdheSBzaGVldHMgbGlua3MgZWFjaCBvdGhlci4gQ2FuIGJlICdqb2luZWQnIG9yICdzZXBhcmF0ZScuXG4gICAgICovXG4gICAgQElucHV0KCkgc2hlZXRzVHlwZTogSVNoZWV0VHlwZSA9IFwiam9pbmVkXCI7XG5cbiAgICAvKipcbiAgICAgKiBEaXJlY3Rpb24gb2YgbGF5b3V0IGVsZW1lbnRzLiBDYW4gYmUgJ3Jvdycgb3IgJ2NvbHVtbicuXG4gICAgICovXG4gICAgQElucHV0KCkgZGlyZWN0aW9uOiBJTGF5b3V0RWxlbWVudERpcmVjdGlvbiA9IFwicm93XCI7XG4gICAgLyoqXG4gICAgICogVmFsdWUgZm9yIGZsZXhCYXNpcyBvZiBTaGVldENvbXBvbmVudCBvciBTaGVldEdyb3VwQ29tcG9uZW50LlxuICAgICAqIENhbiBiZSBpbiAncHgnIG9yICclJ1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGluaXRpYWxTaXplVmFsdWU6IHN0cmluZztcblxuICAgIEBIb3N0QmluZGluZyhcImNsYXNzLm51aS1zaGVldC1ncm91cC0tam9pbmVkLXNoZWV0c1wiKVxuICAgIGFwcGx5Sm9pbmVkU2hlZXRzQ2xhc3M6IGJvb2xlYW47XG4gICAgQEhvc3RCaW5kaW5nKFwiY2xhc3MubnVpLXNoZWV0LWdyb3VwLS1zZXBhcmF0ZS1zaGVldHNcIilcbiAgICBhcHBseVNlcGFyYXRlU2hlZXRzQ2xhc3M6IGJvb2xlYW47XG5cbiAgICBASG9zdEJpbmRpbmcoXCJjbGFzcy5zaGVldC1ncm91cC1kaXJlY3Rpb24tY29sdW1uXCIpXG4gICAgYXBwbHlEaXJlY3Rpb25Db2x1bW5DbGFzcyA9IGZhbHNlO1xuICAgIEBIb3N0QmluZGluZyhcImNsYXNzLnNoZWV0LWdyb3VwLWRpcmVjdGlvbi1yb3dcIikgYXBwbHlEaXJlY3Rpb25Sb3dDbGFzcyA9XG4gICAgICAgIHRydWU7XG5cbiAgICBAVmlld0NoaWxkKFwicmVzaXplclBsYWNlaG9sZGVyXCIsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICAgIHB1YmxpYyByZXNpemVyUGxhY2Vob2xkZXI6IFZpZXdDb250YWluZXJSZWY7XG4gICAgQENvbnRlbnRDaGlsZHJlbihTaGVldENvbXBvbmVudCkgc2hlZXRMaXN0OiBRdWVyeUxpc3Q8U2hlZXRDb21wb25lbnQ+O1xuICAgIEBDb250ZW50Q2hpbGRyZW4oU2hlZXRHcm91cENvbXBvbmVudCwgeyBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBzaGVldEdyb3VwTGlzdDogUXVlcnlMaXN0PFNoZWV0R3JvdXBDb21wb25lbnQ+O1xuXG4gICAgcHVibGljIHJlc2l6ZXJzTGlzdDogQ29tcG9uZW50UmVmPGFueT5bXSA9IFtdO1xuICAgIHB1YmxpYyByZXNpemVEaXJlY3Rpb246IFJlc2l6ZURpcmVjdGlvbjtcblxuICAgIC8vIHdvcmthcm91bmQgZm9yIGlzc3VlIHdoZW4gQENvbnRlbnRDaGlsZHJlbiBjYW4gc2VsZWN0IGhvc3QgY29tcG9uZW50IC0gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTAwOTg7XG4gICAgLy8gVE9ETzogcmVtb3ZlIHdoZW4gaXQnbGwgYmUgZml4ZWQgaW4gSXZ5XG4gICAgcHJpdmF0ZSBmaWx0ZXJHcm91cHMoc2hlZXRHcm91cExpc3Q6IGFueSkge1xuICAgICAgICByZXR1cm4gc2hlZXRHcm91cExpc3QuZmlsdGVyKFxuICAgICAgICAgICAgKGdyb3VwOiBTaGVldEdyb3VwQ29tcG9uZW50KSA9PiBncm91cCAhPT0gdGhpc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRSZXNpemVycyhyZXNpemFibGVMaXN0OiBRdWVyeUxpc3Q8YW55Pik6IHZvaWQge1xuICAgICAgICByZXNpemFibGVMaXN0LmZvckVhY2goKHJlc2l6YWJsZUl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHJlc2l6YWJsZUxpc3QubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXBwZW5kUmVzaXplcihMYXlvdXRSZXNpemVyQ29tcG9uZW50LCByZXNpemFibGVJdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIG1ha2UgaXQgc3VjaCB0aGF0IGl0J3MgdmFsaWQgZXZlbiB3aGVuIHJlc2l6ZXIgaXNuJ3QgYWRkZWRcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVGbGV4QmFzaXMocmVzaXphYmxlTGlzdCwgcmVzaXphYmxlTGlzdC5sZW5ndGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhcHBlbmRSZXNpemVyKGZhY3Rvcnk6IGFueSwgcmVzaXplRWw6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoZmFjdG9yeSk7XG5cbiAgICAgICAgY29uc3QgcmVmID0gdGhpcy5yZXNpemVyUGxhY2Vob2xkZXIuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFJlZik7XG4gICAgICAgICg8TGF5b3V0UmVzaXplckNvbXBvbmVudD5yZWYuaW5zdGFuY2UpLnJlc2l6ZUVsZW1lbnQgPSByZXNpemVFbDtcbiAgICAgICAgKDxMYXlvdXRSZXNpemVyQ29tcG9uZW50PnJlZi5pbnN0YW5jZSkucmVzaXplRGlyZWN0aW9uID1cbiAgICAgICAgICAgIHRoaXMucmVzaXplRGlyZWN0aW9uO1xuICAgICAgICAoPExheW91dFJlc2l6ZXJDb21wb25lbnQ+cmVmLmluc3RhbmNlKS5yZXNpemVVbml0ID0gdGhpcy5yZXNpemVVbml0O1xuICAgICAgICAoPExheW91dFJlc2l6ZXJDb21wb25lbnQ+cmVmLmluc3RhbmNlKS5lbmFibGVTZXBhcmF0ZU9mZnNldFNpemUgPVxuICAgICAgICAgICAgdGhpcy5zaGVldHNUeXBlID09PSBcInNlcGFyYXRlXCI7XG4gICAgICAgIHJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMucmVzaXplcnNMaXN0LnB1c2gocmVmKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FsY3VsYXRlRmxleEJhc2lzKFxuICAgICAgICByZXNpemFibGVMaXN0OiBRdWVyeUxpc3Q8RWxlbWVudD4sXG4gICAgICAgIG51bU9mSXRlbXM6IG51bWJlclxuICAgICk6IHZvaWQge1xuICAgICAgICBsZXQgYXZhaWxhYmxlU3BhY2U6IHN0cmluZyA9IFwiMTAwJVwiO1xuICAgICAgICBjb25zdCBoYXNJbml0U2l6ZSA9IHJlc2l6YWJsZUxpc3Quc29tZShcbiAgICAgICAgICAgIChlbGVtZW50OiBFbGVtZW50KSA9PiAhIWVsZW1lbnQuaW5pdGlhbFNpemVWYWx1ZVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBmaXRDb250ZW50ID0gcmVzaXphYmxlTGlzdC5zb21lKFxuICAgICAgICAgICAgKGVsZW1lbnQ6IEVsZW1lbnQpID0+ICEhKGVsZW1lbnQgYXMgYW55KS5maXRDb250ZW50XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGl0ZW1zVG9SZW5kZXI6IElFbGVtZW50SW5mb1tdID0gW107XG4gICAgICAgIGxldCBpdGVtc1dpdGhTaXplOiBFbGVtZW50W107XG4gICAgICAgIGxldCBpdGVtc1dpdGhvdXRTaXplOiBFbGVtZW50W107XG5cbiAgICAgICAgaWYgKGhhc0luaXRTaXplKSB7XG4gICAgICAgICAgICAvLyBjYWxjdWxhdGlvbiBmb3IgaW5pdCBzaXplXG4gICAgICAgICAgICAvLyBmaWx0ZXIgZWxlbWVudCBzbyB0aGF0IHRob3NlIHdpdGggc2l6ZSBhcmUgZGVhbHQgd2l0aCBmaXJzdFxuICAgICAgICAgICAgaXRlbXNXaXRoU2l6ZSA9IHJlc2l6YWJsZUxpc3QuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChlbGVtZW50OiBFbGVtZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAhIWVsZW1lbnQuaW5pdGlhbFNpemVWYWx1ZSAmJiAhKGVsZW1lbnQgYXMgYW55KS5maXRDb250ZW50XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaXRlbXNXaXRob3V0U2l6ZSA9IHJlc2l6YWJsZUxpc3QuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChlbGVtZW50OiBFbGVtZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAhZWxlbWVudC5pbml0aWFsU2l6ZVZhbHVlICYmICEoZWxlbWVudCBhcyBhbnkpLmZpdENvbnRlbnRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGl0ZW1zV2l0aFNpemUuZm9yRWFjaCgoZWxlbWVudDogRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVNwYWNlID0gYCgke2F2YWlsYWJsZVNwYWNlfSAtICR7ZWxlbWVudC5pbml0aWFsU2l6ZVZhbHVlfSlgO1xuICAgICAgICAgICAgICAgIGl0ZW1zVG9SZW5kZXIucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW06IGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBgJHtlbGVtZW50LmluaXRpYWxTaXplVmFsdWV9YCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBudW1PZkl0ZW1zLS07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGl0ZW1zV2l0aG91dFNpemUuZm9yRWFjaCgoZWxlbWVudDogRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVNwYWNlID0gYCR7YXZhaWxhYmxlU3BhY2V9IC8gJHtudW1PZkl0ZW1zfWA7XG4gICAgICAgICAgICAgICAgaXRlbXNUb1JlbmRlci5wdXNoKHsgaXRlbTogZWxlbWVudCwgdmFsdWU6IGF2YWlsYWJsZVNwYWNlIH0pO1xuICAgICAgICAgICAgICAgIG51bU9mSXRlbXMtLTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFmaXRDb250ZW50KSB7XG4gICAgICAgICAgICAvLyBub3JtYWwgZmxvdyBvZiBjYWxjdWxhdGlvblxuICAgICAgICAgICAgcmVzaXphYmxlTGlzdC5mb3JFYWNoKChyZXNpemFibGVJdGVtOiBFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbXNUb1JlbmRlci5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbTogcmVzaXphYmxlSXRlbSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGAke2F2YWlsYWJsZVNwYWNlfSAvICR7bnVtT2ZJdGVtc31gLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZW5kZXJpbmcgb2YgY2FsY3VsYXRpb25cbiAgICAgICAgaXRlbXNUb1JlbmRlci5mb3JFYWNoKCh7IGl0ZW0sIHZhbHVlIH0pID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgICAgICAgaXRlbS5lbFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgIFwiZmxleEJhc2lzXCIsXG4gICAgICAgICAgICAgICAgYGNhbGMoJHt2YWx1ZX0pYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlbFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyXG4gICAgKSB7fVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFwcGx5Sm9pbmVkU2hlZXRzQ2xhc3MgPVxuICAgICAgICAgICAgKHRoaXMuYXBwbHlKb2luZWRTaGVldHNDbGFzcyAmJiAhdGhpcy5hcHBseVNlcGFyYXRlU2hlZXRzQ2xhc3MpIHx8XG4gICAgICAgICAgICB0aGlzLnNoZWV0c1R5cGUgPT09IFwiam9pbmVkXCI7XG4gICAgICAgIHRoaXMuYXBwbHlTZXBhcmF0ZVNoZWV0c0NsYXNzID1cbiAgICAgICAgICAgICghdGhpcy5hcHBseUpvaW5lZFNoZWV0c0NsYXNzICYmIHRoaXMuYXBwbHlTZXBhcmF0ZVNoZWV0c0NsYXNzKSB8fFxuICAgICAgICAgICAgdGhpcy5zaGVldHNUeXBlID09PSBcInNlcGFyYXRlXCI7XG4gICAgICAgIHRoaXMuYXBwbHlEaXJlY3Rpb25Db2x1bW5DbGFzcyA9IHRoaXMuZGlyZWN0aW9uID09PSBcImNvbHVtblwiO1xuICAgICAgICB0aGlzLmFwcGx5RGlyZWN0aW9uUm93Q2xhc3MgPSB0aGlzLmRpcmVjdGlvbiA9PT0gXCJyb3dcIjtcbiAgICAgICAgdGhpcy5yZXNpemVEaXJlY3Rpb24gPVxuICAgICAgICAgICAgdGhpcy5kaXJlY3Rpb24gPT09IFwicm93XCJcbiAgICAgICAgICAgICAgICA/IFJlc2l6ZURpcmVjdGlvbi5yaWdodFxuICAgICAgICAgICAgICAgIDogUmVzaXplRGlyZWN0aW9uLmJvdHRvbTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICAvLyAyIGFkZFJlc2l6ZXJzIG5lZWRlZCBmb3IgY29ycmVjdCBoYW5kbGluZyBzaGVldEdyb3VwcyBhbmQgc2hlZXRzIGVsZW1lbnRzLFxuICAgICAgICAvLyBmLmUuIGZsZXggYmFzaXMgY2FsY3VsYXRpb24gb3IgZGV0ZWN0aW9uIGxhc3QgZWxlbWVudCBvZiBjb3JyZXNwb25kZW50IHR5cGVcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNpemFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkUmVzaXplcnModGhpcy5zaGVldExpc3QpO1xuICAgICAgICAgICAgdGhpcy5hZGRSZXNpemVycyh0aGlzLmZpbHRlckdyb3Vwcyh0aGlzLnNoZWV0R3JvdXBMaXN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUZsZXhCYXNpcyh0aGlzLnNoZWV0TGlzdCwgdGhpcy5zaGVldExpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlRmxleEJhc2lzKFxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyR3JvdXBzKHRoaXMuc2hlZXRHcm91cExpc3QpLFxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyR3JvdXBzKHRoaXMuc2hlZXRHcm91cExpc3QpLmxlbmd0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucmVzaXplcnNMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplcnNMaXN0LmZvckVhY2goKHJlc2l6ZXIpID0+IHtcbiAgICAgICAgICAgICAgICByZXNpemVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPG5nLXRlbXBsYXRlICNyZXNpemVyUGxhY2Vob2xkZXI+PC9uZy10ZW1wbGF0ZT5cbiJdfQ==