@nova-ui/bits
Version:
SolarWinds Nova Framework
207 lines • 41.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 { Component, ContentChild, ElementRef, EventEmitter, HostListener, Input, NgZone, Output, QueryList, ViewChild, ViewChildren, ViewEncapsulation, } from "@angular/core";
import _isEmpty from "lodash/isEmpty";
import _size from "lodash/size";
import { Subject } from "rxjs";
import { takeUntil } from "rxjs/operators";
import { ChipsOverflowService } from "./chips-overflow.service";
import * as i0 from "@angular/core";
import * as i1 from "./chips-overflow.service";
import * as i2 from "@angular/common";
import * as i3 from "./chip/chip.component";
// <example-url>./../examples/index.html#/chips</example-url>
/**
* Control used to list groups of selected options (former ng1 nui-chiclets component).
*
* __Usage:__
*
* ```html
* <nui-chips [autoHide]="false"
* [itemsSource]="itemsSource"
* [title]="title"
* [orientation]="'vertical'"
* [allowRemoveAll]="false"
* [removeAllLinkText]="clearAllText"
* (chipRemoved)="onRemove($event)"
* (removeAll)="onRemoveAll()">
* </nui-chips>
* ```
*
*/
export class ChipsComponent {
set clearAll(elem) {
this.chipsOverflowService.clearAll = elem;
}
set overflowCounter(el) {
this.chipsOverflowService.overflowCounter = el;
}
get role() {
return this.getItemsCount() ? "list" : null;
}
constructor(zone, chipsOverflowService) {
this.zone = zone;
this.chipsOverflowService = chipsOverflowService;
/**
* Whether overflow mode turned on
*/
this.overflow = false;
/**
* Limits chips lines if overflow mode
*/
this.overflowLinesNumber = 1;
/**
* Flag for 'Clear all' link visibility.
*/
this.allowRemoveAll = true;
/**
* Expression to determine if the component is hidden when 'itemsSource' is empty.
*/
this.autoHide = true;
/**
* Event that is fired when single item is cleared (by clicking on item or its remove icon).
* Event data passed contains object with item clicked and its parent group.
*/
this.chipRemoved = new EventEmitter();
/**
* Event that is fired when 'Clear All' is clicked.
*/
this.removeAll = new EventEmitter();
/**
* Emits overflowed chips if chips overflow
*/
this.chipsOverflowed = new EventEmitter();
this.destroy$ = new Subject();
}
ngOnChanges(changes) {
if (changes.itemsSource) {
this.chipsOverflowService.itemsSource =
changes.itemsSource.currentValue;
}
if (changes.overflowLinesNumber) {
this.chipsOverflowService.overflowLinesNumber =
changes.overflowLinesNumber.currentValue;
}
if (changes.overflow && !changes.overflow.currentValue) {
this.chipsOverflowService.onDestroy();
}
}
ngOnInit() {
this.removeAllLinkText = this.removeAllLinkText || $localize `Clear all`;
}
ngAfterViewInit() {
if (this.overflow) {
this.initChipsOverflow();
}
}
/** Handles Popup on window resize */
onWinResize() {
if (this.overflow && this.getItemsCount()) {
this.chipsOverflowService.handleOverflow();
}
}
getItemsCount() {
let count = _size(this.itemsSource.flatItems);
if (!_isEmpty(this.itemsSource.groupedItems)) {
count += (this.itemsSource.groupedItems || [])
.map((group) => group.items.length)
.reduce((sum, val) => sum + val);
}
return count;
}
onRemove(data) {
this.chipRemoved.emit(data);
}
onRemoveAll(event) {
this.removeAll.emit(event);
event.preventDefault();
}
ngOnDestroy() {
if (this.overflow) {
this.chipsOverflowService.onDestroy();
}
this.destroy$.next();
this.destroy$.complete();
}
initChipsOverflow() {
this.chipsOverflowService.mainCell = this.mainCell;
this.chipsOverflowService.nuiChips = this.nuiChips;
this.chipsOverflowService.allChips = this.allChips;
this.chipsOverflowService.itemsSource = this.itemsSource;
this.chipsOverflowService.overflowLinesNumber =
this.overflowLinesNumber;
this.chipsOverflowService.init();
this.chipsOverflowService.chipsOverflowed
.pipe(takeUntil(this.destroy$))
.subscribe((e) => {
this.chipsOverflowed.emit(e);
this.isOverflowed = Boolean(e.groupedItems?.length || e.flatItems?.length);
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChipsComponent, deps: [{ token: i0.NgZone }, { token: i1.ChipsOverflowService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ChipsComponent, selector: "nui-chips", inputs: { overflow: "overflow", overflowLinesNumber: "overflowLinesNumber", allowRemoveAll: "allowRemoveAll", autoHide: "autoHide", removeAllLinkText: "removeAllLinkText", itemsSource: "itemsSource", orientation: "orientation", title: "title", customClass: "customClass" }, outputs: { chipRemoved: "chipRemoved", removeAll: "removeAll", chipsOverflowed: "chipsOverflowed" }, host: { listeners: { "window:resize": "onWinResize()" }, properties: { "attr.role": "role" } }, providers: [ChipsOverflowService], queries: [{ propertyName: "overflowCounter", first: true, predicate: ["overflowCounterLabel"], descendants: true }], viewQueries: [{ propertyName: "mainCell", first: true, predicate: ["chipsMainCell"], descendants: true }, { propertyName: "clearAll", first: true, predicate: ["clearAll"], descendants: true }, { propertyName: "nuiChips", first: true, predicate: ["nuiChips"], descendants: true }, { propertyName: "allChips", predicate: ["chipItem"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n [style.display]=\"getItemsCount() !== 0 || !autoHide ? 'flex' : 'none'\"\n #nuiChips\n class=\"nui-chips media\"\n [ngClass]=\"customClass\"\n [class.nui-chips__vertical]=\"orientation === 'vertical'\"\n>\n <h4\n *ngIf=\"!!title && orientation === 'vertical'\"\n class=\"nui-chips__title-cell\"\n >\n <span class=\"nui-chips__title\">{{ title }}:</span>\n <span class=\"nui-chips__count\">({{ getItemsCount() }})</span>\n </h4>\n <div\n class=\"nui-chips__main-cell\"\n #chipsMainCell\n [style.flex-grow]=\"isOverflowed ? 1 : 0\"\n >\n <ng-container *ngIf=\"itemsSource.flatItems?.length\">\n <nui-chip\n class=\"chip-flat\"\n #chipItem\n *ngFor=\"let flatItem of itemsSource.flatItems; let last = last\"\n [customClass]=\"flatItem.customClass\"\n [class.group-last]=\"last\"\n [item]=\"flatItem\"\n (remove)=\"onRemove({ item: flatItem, group: undefined })\"\n ></nui-chip>\n </ng-container>\n\n <ng-container\n *ngFor=\"let group of itemsSource.groupedItems; let lastGroup = last\"\n >\n <ng-container *ngIf=\"group.items?.length > 0\">\n <div\n class=\"nui-chips__group-name\"\n [ngClass]=\"group.customClass\"\n #chipItem\n >\n <div class=\"nui-chips__group-label\">\n {{ group.label }}\n </div>\n </div>\n <nui-chip\n #chipItem\n *ngFor=\"let groupItem of group.items; let last = last\"\n [customClass]=\"groupItem.customClass\"\n [class.group-last]=\"last && !lastGroup\"\n [item]=\"groupItem\"\n (remove)=\"onRemove({ item: groupItem, group: group })\"\n ></nui-chip>\n </ng-container>\n </ng-container>\n <ng-content select=\".nui-chips-overflowed\"></ng-content>\n </div>\n\n <div\n class=\"nui-chips__clear-cell\"\n #clearAll\n *ngIf=\"allowRemoveAll && getItemsCount() > 0\"\n >\n <a href class=\"nui-chips__clear\" (click)=\"onRemoveAll($event)\">{{\n removeAllLinkText\n }}</a>\n </div>\n</div>\n", styles: [".nui .nui-chips{display:flex;margin-top:15px;background-color:var(--nui-color-bg-light,#fff);padding:15px 15px 10px}.nui .nui-chips nui-chip,.nui .nui-chips .nui-chips__group-name{margin-bottom:5px}.nui .nui-chips:first-child{margin-top:0}.nui .nui-chips-overflowed__counter{font-size:11px;cursor:pointer}.nui .nui-chips .group-last .nui-chip__value{margin-right:5px}.nui .nui-chips__title-cell{white-space:nowrap;vertical-align:top;line-height:20px;padding:0 5px 5px 0;margin:0}.nui .nui-chips__main-cell{display:flex;flex-wrap:wrap;font-size:0}.nui .nui-chips__clear-cell{text-align:right;white-space:nowrap}.nui .nui-chips__group-name,.nui .nui-chips__group-values,.nui .nui-chips__clear{display:inline-block;font-size:11px;line-height:18px}.nui .nui-chips__group nui-chip:last-of-type .nui-chip__value{border-radius:0 3px 3px 0}.nui .nui-chips__group-label{line-height:14px;font-size:11px;font-weight:400;color:#1119;color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6));white-space:nowrap;margin-right:1px;padding:0 10px;line-height:18px}.nui .nui-chips__group-values{cursor:pointer;margin-right:5px}.nui .nui-chips__group-values.nui .nui-chips__group-noname{margin-right:0}.nui .nui-chips__flat-values nui-chip:first-of-type .nui-chip__value{border-radius:3px 0 0 3px}.nui .nui-chips__flat-values nui-chip:last-of-type .nui-chip__value{border-radius:0 3px 3px 0}.nui .nui-chips__flat-values nui-chip:only-of-type .nui-chip__value{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nui .nui-chips__clear{vertical-align:top;cursor:pointer;margin-left:10px}.nui .nui-chips__clear:focus{outline:none;z-index:500;box-shadow:0 0 0 2px #00c4d280;border-radius:3px}.nui .nui-chips__vertical{padding:0;flex-wrap:wrap}.nui .nui-chips__vertical nui-chip,.nui .nui-chips__vertical .nui-chips__group-name{margin-bottom:0}.nui .nui-chips__vertical .group-last .nui-chip__value{margin-right:0;margin-bottom:5px}.nui .nui-chips__vertical .nui-chips__title-cell{order:1;flex-grow:1}.nui .nui-chips__vertical .nui-chips__flat-values nui-chip:first-of-type .nui-chip__value{border-radius:3px 3px 0 0}.nui .nui-chips__vertical .nui-chips__flat-values nui-chip:last-of-type .nui-chip__value{border-radius:0 0 3px 3px}.nui .nui-chips__vertical .nui-chips__flat-values nui-chip:only-of-type .nui-chip__value{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nui .nui-chips__vertical .nui-chips__main-cell{order:3;width:100%;display:flex;flex-direction:column}.nui .nui-chips__vertical .nui-chips__main-cell .nui-chips__flat-values{padding-bottom:5px}.nui .nui-chips__vertical .nui-chips__main-cell .nui-chips__group-name{width:100%;border-radius:3px 3px 0 0}.nui .nui-chips__vertical .nui-chips__main-cell .nui-chips__group-values{display:flex;width:100%;flex-direction:column}.nui .nui-chips__vertical .nui-chips__main-cell .nui-chips__group-values .nui-chips__value-remove{float:right}.nui .nui-chips__vertical .nui-chips__main-cell .nui-chips__group{display:block}.nui .nui-chips__vertical .nui-chips__main-cell .nui-chips__group nui-chip:last-of-type .nui-chip__value{border-radius:0 0 3px 3px}.nui .nui-chips__vertical .nui-chips__main-cell .nui-chips__group-name{display:block}.nui .nui-chips__vertical .nui-chips__main-cell nui-chip{width:100%}.nui .nui-chips__vertical .nui-chips__main-cell nui-chip .nui-chip__value-name{max-width:100%}.nui .nui-chips__vertical .nui-chips__clear{vertical-align:baseline}.nui .nui-chips__vertical .nui-chips__clear-cell{order:2}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.ChipComponent, selector: "nui-chip", inputs: ["item", "closeButtonTooltip", "customClass"], outputs: ["remove"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChipsComponent, decorators: [{
type: Component,
args: [{ selector: "nui-chips", encapsulation: ViewEncapsulation.None, providers: [ChipsOverflowService], host: { "[attr.role]": "role" }, template: "<div\n [style.display]=\"getItemsCount() !== 0 || !autoHide ? 'flex' : 'none'\"\n #nuiChips\n class=\"nui-chips media\"\n [ngClass]=\"customClass\"\n [class.nui-chips__vertical]=\"orientation === 'vertical'\"\n>\n <h4\n *ngIf=\"!!title && orientation === 'vertical'\"\n class=\"nui-chips__title-cell\"\n >\n <span class=\"nui-chips__title\">{{ title }}:</span>\n <span class=\"nui-chips__count\">({{ getItemsCount() }})</span>\n </h4>\n <div\n class=\"nui-chips__main-cell\"\n #chipsMainCell\n [style.flex-grow]=\"isOverflowed ? 1 : 0\"\n >\n <ng-container *ngIf=\"itemsSource.flatItems?.length\">\n <nui-chip\n class=\"chip-flat\"\n #chipItem\n *ngFor=\"let flatItem of itemsSource.flatItems; let last = last\"\n [customClass]=\"flatItem.customClass\"\n [class.group-last]=\"last\"\n [item]=\"flatItem\"\n (remove)=\"onRemove({ item: flatItem, group: undefined })\"\n ></nui-chip>\n </ng-container>\n\n <ng-container\n *ngFor=\"let group of itemsSource.groupedItems; let lastGroup = last\"\n >\n <ng-container *ngIf=\"group.items?.length > 0\">\n <div\n class=\"nui-chips__group-name\"\n [ngClass]=\"group.customClass\"\n #chipItem\n >\n <div class=\"nui-chips__group-label\">\n {{ group.label }}\n </div>\n </div>\n <nui-chip\n #chipItem\n *ngFor=\"let groupItem of group.items; let last = last\"\n [customClass]=\"groupItem.customClass\"\n [class.group-last]=\"last && !lastGroup\"\n [item]=\"groupItem\"\n (remove)=\"onRemove({ item: groupItem, group: group })\"\n ></nui-chip>\n </ng-container>\n </ng-container>\n <ng-content select=\".nui-chips-overflowed\"></ng-content>\n </div>\n\n <div\n class=\"nui-chips__clear-cell\"\n #clearAll\n *ngIf=\"allowRemoveAll && getItemsCount() > 0\"\n >\n <a href class=\"nui-chips__clear\" (click)=\"onRemoveAll($event)\">{{\n removeAllLinkText\n }}</a>\n </div>\n</div>\n", styles: [".nui .nui-chips{display:flex;margin-top:15px;background-color:var(--nui-color-bg-light,#fff);padding:15px 15px 10px}.nui .nui-chips nui-chip,.nui .nui-chips .nui-chips__group-name{margin-bottom:5px}.nui .nui-chips:first-child{margin-top:0}.nui .nui-chips-overflowed__counter{font-size:11px;cursor:pointer}.nui .nui-chips .group-last .nui-chip__value{margin-right:5px}.nui .nui-chips__title-cell{white-space:nowrap;vertical-align:top;line-height:20px;padding:0 5px 5px 0;margin:0}.nui .nui-chips__main-cell{display:flex;flex-wrap:wrap;font-size:0}.nui .nui-chips__clear-cell{text-align:right;white-space:nowrap}.nui .nui-chips__group-name,.nui .nui-chips__group-values,.nui .nui-chips__clear{display:inline-block;font-size:11px;line-height:18px}.nui .nui-chips__group nui-chip:last-of-type .nui-chip__value{border-radius:0 3px 3px 0}.nui .nui-chips__group-label{line-height:14px;font-size:11px;font-weight:400;color:#1119;color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6));white-space:nowrap;margin-right:1px;padding:0 10px;line-height:18px}.nui .nui-chips__group-values{cursor:pointer;margin-right:5px}.nui .nui-chips__group-values.nui .nui-chips__group-noname{margin-right:0}.nui .nui-chips__flat-values nui-chip:first-of-type .nui-chip__value{border-radius:3px 0 0 3px}.nui .nui-chips__flat-values nui-chip:last-of-type .nui-chip__value{border-radius:0 3px 3px 0}.nui .nui-chips__flat-values nui-chip:only-of-type .nui-chip__value{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nui .nui-chips__clear{vertical-align:top;cursor:pointer;margin-left:10px}.nui .nui-chips__clear:focus{outline:none;z-index:500;box-shadow:0 0 0 2px #00c4d280;border-radius:3px}.nui .nui-chips__vertical{padding:0;flex-wrap:wrap}.nui .nui-chips__vertical nui-chip,.nui .nui-chips__vertical .nui-chips__group-name{margin-bottom:0}.nui .nui-chips__vertical .group-last .nui-chip__value{margin-right:0;margin-bottom:5px}.nui .nui-chips__vertical .nui-chips__title-cell{order:1;flex-grow:1}.nui .nui-chips__vertical .nui-chips__flat-values nui-chip:first-of-type .nui-chip__value{border-radius:3px 3px 0 0}.nui .nui-chips__vertical .nui-chips__flat-values nui-chip:last-of-type .nui-chip__value{border-radius:0 0 3px 3px}.nui .nui-chips__vertical .nui-chips__flat-values nui-chip:only-of-type .nui-chip__value{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nui .nui-chips__vertical .nui-chips__main-cell{order:3;width:100%;display:flex;flex-direction:column}.nui .nui-chips__vertical .nui-chips__main-cell .nui-chips__flat-values{padding-bottom:5px}.nui .nui-chips__vertical .nui-chips__main-cell .nui-chips__group-name{width:100%;border-radius:3px 3px 0 0}.nui .nui-chips__vertical .nui-chips__main-cell .nui-chips__group-values{display:flex;width:100%;flex-direction:column}.nui .nui-chips__vertical .nui-chips__main-cell .nui-chips__group-values .nui-chips__value-remove{float:right}.nui .nui-chips__vertical .nui-chips__main-cell .nui-chips__group{display:block}.nui .nui-chips__vertical .nui-chips__main-cell .nui-chips__group nui-chip:last-of-type .nui-chip__value{border-radius:0 0 3px 3px}.nui .nui-chips__vertical .nui-chips__main-cell .nui-chips__group-name{display:block}.nui .nui-chips__vertical .nui-chips__main-cell nui-chip{width:100%}.nui .nui-chips__vertical .nui-chips__main-cell nui-chip .nui-chip__value-name{max-width:100%}.nui .nui-chips__vertical .nui-chips__clear{vertical-align:baseline}.nui .nui-chips__vertical .nui-chips__clear-cell{order:2}\n"] }]
}], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.ChipsOverflowService }], propDecorators: { overflow: [{
type: Input
}], overflowLinesNumber: [{
type: Input
}], allowRemoveAll: [{
type: Input
}], autoHide: [{
type: Input
}], removeAllLinkText: [{
type: Input
}], itemsSource: [{
type: Input
}], orientation: [{
type: Input
}], title: [{
type: Input
}], customClass: [{
type: Input
}], chipRemoved: [{
type: Output
}], removeAll: [{
type: Output
}], chipsOverflowed: [{
type: Output
}], mainCell: [{
type: ViewChild,
args: ["chipsMainCell"]
}], clearAll: [{
type: ViewChild,
args: ["clearAll"]
}], nuiChips: [{
type: ViewChild,
args: ["nuiChips"]
}], allChips: [{
type: ViewChildren,
args: ["chipItem"]
}], overflowCounter: [{
type: ContentChild,
args: ["overflowCounterLabel"]
}], onWinResize: [{
type: HostListener,
args: ["window:resize"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jaGlwcy9jaGlwcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2NoaXBzL2NoaXBzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBRUgsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUlOLE1BQU0sRUFDTixTQUFTLEVBRVQsU0FBUyxFQUNULFlBQVksRUFDWixpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxRQUFRLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7OztBQVFoRSw2REFBNkQ7QUFFN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBU0gsTUFBTSxPQUFPLGNBQWM7SUEwRHZCLElBQW1DLFFBQVEsQ0FBQyxJQUFnQjtRQUN4RCxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxH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Q0FDaEQsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQzsrR0EvSlEsY0FBYzttR0FBZCxjQUFjLDJmQUhaLENBQUMsb0JBQW9CLENBQUMsdWdCQzlFckMsZzZFQW1FQTs7NEZEY2EsY0FBYztrQkFSMUIsU0FBUzsrQkFDSSxXQUFXLGlCQUdOLGlCQUFpQixDQUFDLElBQUksYUFDMUIsQ0FBQyxvQkFBb0IsQ0FBQyxRQUMzQixFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUU7OEdBUXRCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUlVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBSVUsUUFBUTtzQkFBdkIsS0FBSztnQkFJVSxpQkFBaUI7c0JBQWhDLEtBQUs7Z0JBS1UsV0FBVztzQkFBMUIsS0FBSztnQkFJVSxXQUFXO3NCQUExQixLQUFLO2dCQUlVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBR1UsV0FBVztzQkFBMUIsS0FBSztnQkFLVyxXQUFXO3NCQUEzQixNQUFNO2dCQUlVLFNBQVM7c0JBQXpCLE1BQU07Z0JBS1UsZUFBZTtzQkFBL0IsTUFBTTtnQkFLNkIsUUFBUTtzQkFBM0MsU0FBUzt1QkFBQyxlQUFlO2dCQUNTLFFBQVE7c0JBQTFDLFNBQVM7dUJBQUMsVUFBVTtnQkFHVSxRQUFRO3NCQUF0QyxTQUFTO3VCQUFDLFVBQVU7Z0JBQ2EsUUFBUTtzQkFBekMsWUFBWTt1QkFBQyxVQUFVO2dCQUcwQixlQUFlO3NCQUFoRSxZQUFZO3VCQUFDLHNCQUFzQjtnQkEyQzdCLFdBQVc7c0JBRGpCLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgTmdab25lLFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IF9pc0VtcHR5IGZyb20gXCJsb2Rhc2gvaXNFbXB0eVwiO1xuaW1wb3J0IF9zaXplIGZyb20gXCJsb2Rhc2gvc2l6ZVwiO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuaW1wb3J0IHsgQ2hpcENvbXBvbmVudCB9IGZyb20gXCIuL2NoaXAvY2hpcC5jb21wb25lbnRcIjtcbmltcG9ydCB7IENoaXBzT3ZlcmZsb3dTZXJ2aWNlIH0gZnJvbSBcIi4vY2hpcHMtb3ZlcmZsb3cuc2VydmljZVwiO1xuaW1wb3J0IHtcbiAgICBJQ2hpcFJlbW92ZWQsXG4gICAgSUNoaXBzR3JvdXAsXG4gICAgSUNoaXBzSXRlbSxcbiAgICBJQ2hpcHNJdGVtc1NvdXJjZSxcbn0gZnJvbSBcIi4vcHVibGljLWFwaVwiO1xuXG4vLyA8ZXhhbXBsZS11cmw+Li8uLi9leGFtcGxlcy9pbmRleC5odG1sIy9jaGlwczwvZXhhbXBsZS11cmw+XG5cbi8qKlxuICogQ29udHJvbCB1c2VkIHRvIGxpc3QgZ3JvdXBzIG9mIHNlbGVjdGVkIG9wdGlvbnMgKGZvcm1lciBuZzEgbnVpLWNoaWNsZXRzIGNvbXBvbmVudCkuXG4gKlxuICogIF9fVXNhZ2U6X19cbiAqXG4gKiBgYGBodG1sXG4gKiA8bnVpLWNoaXBzIFthdXRvSGlkZV09XCJmYWxzZVwiXG4gKiAgICAgICAgICAgIFtpdGVtc1NvdXJjZV09XCJpdGVtc1NvdXJjZVwiXG4gKiAgICAgICAgICAgIFt0aXRsZV09XCJ0aXRsZVwiXG4gKiAgICAgICAgICAgIFtvcmllbnRhdGlvbl09XCIndmVydGljYWwnXCJcbiAqICAgICAgICAgICAgW2FsbG93UmVtb3ZlQWxsXT1cImZhbHNlXCJcbiAqICAgICAgICAgICAgW3JlbW92ZUFsbExpbmtUZXh0XT1cImNsZWFyQWxsVGV4dFwiXG4gKiAgICAgICAgICAgIChjaGlwUmVtb3ZlZCk9XCJvblJlbW92ZSgkZXZlbnQpXCJcbiAqICAgICAgICAgICAgKHJlbW92ZUFsbCk9XCJvblJlbW92ZUFsbCgpXCI+XG4gKiA8L251aS1jaGlwcz5cbiAqIGBgYFxuICpcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibnVpLWNoaXBzXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9jaGlwcy5jb21wb25lbnQuaHRtbFwiLFxuICAgIHN0eWxlVXJsczogW1wiLi9jaGlwcy5jb21wb25lbnQubGVzc1wiXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIHByb3ZpZGVyczogW0NoaXBzT3ZlcmZsb3dTZXJ2aWNlXSxcbiAgICBob3N0OiB7IFwiW2F0dHIucm9sZV1cIjogXCJyb2xlXCIgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ2hpcHNDb21wb25lbnRcbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXRcbntcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG92ZXJmbG93IG1vZGUgdHVybmVkIG9uXG4gICAgICovXG4gICAgQElucHV0KCkgb3ZlcmZsb3c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBMaW1pdHMgY2hpcHMgbGluZXMgaWYgb3ZlcmZsb3cgbW9kZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIG92ZXJmbG93TGluZXNOdW1iZXI6IG51bWJlciA9IDE7XG4gICAgLyoqXG4gICAgICogRmxhZyBmb3IgJ0NsZWFyIGFsbCcgbGluayB2aXNpYmlsaXR5LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhbGxvd1JlbW92ZUFsbCA9IHRydWU7XG4gICAgLyoqXG4gICAgICogRXhwcmVzc2lvbiB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbXBvbmVudCBpcyBoaWRkZW4gd2hlbiAnaXRlbXNTb3VyY2UnIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhdXRvSGlkZSA9IHRydWU7XG4gICAgLyoqXG4gICAgICogVmFsdWUgdG8gYmUgc2hvd24gYXMgcmVtb3ZlIGFsbCBsaW5rIHRleHQuXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHJlbW92ZUFsbExpbmtUZXh0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0YSBzb3VyY2UuIEJvdGggJ2ZsYXRJdGVtcycgYW5kICdncm91cGVkSXRlbXMnIGNvbGxlY3Rpb25zIGNvdWxkIGJlIHBhc3NlZCBzaW11bHRhbmVvdXNseVxuICAgICAqIChwcmV2aW91cyBuZzEgaW1wbGVtZW50YXRpb24gZGlkIG5vdCBhbGxvdyB0aGF0LCBpdCBoYW5kbGVkIG9ubHkgb25lIHR5cGUgb2YgaXRlbXMpLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtc1NvdXJjZTogSUNoaXBzSXRlbXNTb3VyY2U7XG4gICAgLyoqXG4gICAgICogQ2FuIGJlIHNldCB0byAndmVydGljYWwnIHRvIHN3aXRjaCBjaGlwcyB0byB2ZXJ0aWNhbCBsaXN0IG1vZGUuIE90aGVyd2lzZSBob3Jpem9udGFsIG1vZGUgaXMgdXNlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgb3JpZW50YXRpb246IFwiaG9yaXpvbnRhbFwiIHwgXCJ2ZXJ0aWNhbFwiO1xuICAgIC8qKlxuICAgICAqIFZhbHVlIHRvIGJlIHNob3duIGFzIHZlcnRpY2FsIG9yaWVudGF0aW9uIGNoaXBzIHRpdGxlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuXG4gICAgLyoqICovXG4gICAgQElucHV0KCkgcHVibGljIGN1c3RvbUNsYXNzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXZlbnQgdGhhdCBpcyBmaXJlZCB3aGVuIHNpbmdsZSBpdGVtIGlzIGNsZWFyZWQgKGJ5IGNsaWNraW5nIG9uIGl0ZW0gb3IgaXRzIHJlbW92ZSBpY29uKS5cbiAgICAgKiBFdmVudCBkYXRhIHBhc3NlZCBjb250YWlucyBvYmplY3Qgd2l0aCBpdGVtIGNsaWNrZWQgYW5kIGl0cyBwYXJlbnQgZ3JvdXAuXG4gICAgICovXG4gICAgQE91dHB1dCgpIHB1YmxpYyBjaGlwUmVtb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoaXBSZW1vdmVkPigpO1xuICAgIC8qKlxuICAgICAqIEV2ZW50IHRoYXQgaXMgZmlyZWQgd2hlbiAnQ2xlYXIgQWxsJyBpcyBjbGlja2VkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgcmVtb3ZlQWxsID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgb3ZlcmZsb3dlZCBjaGlwcyBpZiBjaGlwcyBvdmVyZmxvd1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgY2hpcHNPdmVyZmxvd2VkOiBFdmVudEVtaXR0ZXI8SUNoaXBzSXRlbXNTb3VyY2U+ID1cbiAgICAgICAgbmV3IEV2ZW50RW1pdHRlcjxJQ2hpcHNJdGVtc1NvdXJjZT4oKTtcblxuICAgIHB1YmxpYyBpc092ZXJmbG93ZWQ6IGJvb2xlYW47XG5cbiAgICBAVmlld0NoaWxkKFwiY2hpcHNNYWluQ2VsbFwiKSBwcml2YXRlIG1haW5DZWxsOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoXCJjbGVhckFsbFwiKSBwcml2YXRlIHNldCBjbGVhckFsbChlbGVtOiBFbGVtZW50UmVmKSB7XG4gICAgICAgIHRoaXMuY2hpcHNPdmVyZmxvd1NlcnZpY2UuY2xlYXJBbGwgPSBlbGVtO1xuICAgIH1cbiAgICBAVmlld0NoaWxkKFwibnVpQ2hpcHNcIikgcHJpdmF0ZSBudWlDaGlwczogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkcmVuKFwiY2hpcEl0ZW1cIikgcHJpdmF0ZSBhbGxDaGlwczogUXVlcnlMaXN0PFxuICAgICAgICBDaGlwQ29tcG9uZW50IHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgICA+O1xuICAgIEBDb250ZW50Q2hpbGQoXCJvdmVyZmxvd0NvdW50ZXJMYWJlbFwiKSBwcml2YXRlIHNldCBvdmVyZmxvd0NvdW50ZXIoXG4gICAgICAgIGVsOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxuICAgICkge1xuICAgICAgICB0aGlzLmNoaXBzT3ZlcmZsb3dTZXJ2aWNlLm92ZXJmbG93Q291bnRlciA9IGVsO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgZ2V0IHJvbGUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEl0ZW1zQ291bnQoKSA/IFwibGlzdFwiIDogbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgY2hpcHNPdmVyZmxvd1NlcnZpY2U6IENoaXBzT3ZlcmZsb3dTZXJ2aWNlXG4gICAgKSB7fVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuaXRlbXNTb3VyY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY2hpcHNPdmVyZmxvd1NlcnZpY2UuaXRlbXNTb3VyY2UgPVxuICAgICAgICAgICAgICAgIGNoYW5nZXMuaXRlbXNTb3VyY2UuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzLm92ZXJmbG93TGluZXNOdW1iZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY2hpcHNPdmVyZmxvd1NlcnZpY2Uub3ZlcmZsb3dMaW5lc051bWJlciA9XG4gICAgICAgICAgICAgICAgY2hhbmdlcy5vdmVyZmxvd0xpbmVzTnVtYmVyLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlcy5vdmVyZmxvdyAmJiAhY2hhbmdlcy5vdmVyZmxvdy5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuY2hpcHNPdmVyZmxvd1NlcnZpY2Uub25EZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlua1RleHQgPSB0aGlzLnJlbW92ZUFsbExpbmtUZXh0IHx8ICRsb2NhbGl6ZWBDbGVhciBhbGxgO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJmbG93KSB7XG4gICAgICAgICAgICB0aGlzLmluaXRDaGlwc092ZXJmbG93KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogSGFuZGxlcyBQb3B1cCBvbiB3aW5kb3cgcmVzaXplICovXG4gICAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpyZXNpemVcIilcbiAgICBwdWJsaWMgb25XaW5SZXNpemUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJmbG93ICYmIHRoaXMuZ2V0SXRlbXNDb3VudCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNoaXBzT3ZlcmZsb3dTZXJ2aWNlLmhhbmRsZU92ZXJmbG93KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SXRlbXNDb3VudCgpOiBudW1iZXIge1xuICAgICAgICBsZXQgY291bnQgPSBfc2l6ZSh0aGlzLml0ZW1zU291cmNlLmZsYXRJdGVtcyk7XG4gICAgICAgIGlmICghX2lzRW1wdHkodGhpcy5pdGVtc1NvdXJjZS5ncm91cGVkSXRlbXMpKSB7XG4gICAgICAgICAgICBjb3VudCArPSAodGhpcy5pdGVtc1NvdXJjZS5ncm91cGVkSXRlbXMgfHwgW10pXG4gICAgICAgICAgICAgICAgLm1hcDxudW1iZXI+KChncm91cCkgPT4gZ3JvdXAuaXRlbXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHN1bSwgdmFsKSA9PiBzdW0gKyB2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25SZW1vdmUoZGF0YTogeyBpdGVtOiBJQ2hpcHNJdGVtOyBncm91cD86IElDaGlwc0dyb3VwIH0pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jaGlwUmVtb3ZlZC5lbWl0KGRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblJlbW92ZUFsbChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbW92ZUFsbC5lbWl0KGV2ZW50KTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJmbG93KSB7XG4gICAgICAgICAgICB0aGlzLmNoaXBzT3ZlcmZsb3dTZXJ2aWNlLm9uRGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0Q2hpcHNPdmVyZmxvdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jaGlwc092ZXJmbG93U2VydmljZS5tYWluQ2VsbCA9IHRoaXMubWFpbkNlbGw7XG4gICAgICAgIHRoaXMuY2hpcHNPdmVyZmxvd1NlcnZpY2UubnVpQ2hpcHMgPSB0aGlzLm51aUNoaXBzO1xuICAgICAgICB0aGlzLmNoaXBzT3ZlcmZsb3dTZXJ2aWNlLmFsbENoaXBzID0gdGhpcy5hbGxDaGlwcztcbiAgICAgICAgdGhpcy5jaGlwc092ZXJmbG93U2VydmljZS5pdGVtc1NvdXJjZSA9IHRoaXMuaXRlbXNTb3VyY2U7XG4gICAgICAgIHRoaXMuY2hpcHNPdmVyZmxvd1NlcnZpY2Uub3ZlcmZsb3dMaW5lc051bWJlciA9XG4gICAgICAgICAgICB0aGlzLm92ZXJmbG93TGluZXNOdW1iZXI7XG5cbiAgICAgICAgdGhpcy5jaGlwc092ZXJmbG93U2VydmljZS5pbml0KCk7XG5cbiAgICAgICAgdGhpcy5jaGlwc092ZXJmbG93U2VydmljZS5jaGlwc092ZXJmbG93ZWRcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGU6IElDaGlwc0l0ZW1zU291cmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlwc092ZXJmbG93ZWQuZW1pdChlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3ZlcmZsb3dlZCA9IEJvb2xlYW4oXG4gICAgICAgICAgICAgICAgICAgIGUuZ3JvdXBlZEl0ZW1zPy5sZW5ndGggfHwgZS5mbGF0SXRlbXM/Lmxlbmd0aFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgW3N0eWxlLmRpc3BsYXldPVwiZ2V0SXRlbXNDb3VudCgpICE9PSAwIHx8ICFhdXRvSGlkZSA/ICdmbGV4JyA6ICdub25lJ1wiXG4gICAgI251aUNoaXBzXG4gICAgY2xhc3M9XCJudWktY2hpcHMgbWVkaWFcIlxuICAgIFtuZ0NsYXNzXT1cImN1c3RvbUNsYXNzXCJcbiAgICBbY2xhc3MubnVpLWNoaXBzX192ZXJ0aWNhbF09XCJvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJ1wiXG4+XG4gICAgPGg0XG4gICAgICAgICpuZ0lmPVwiISF0aXRsZSAmJiBvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJ1wiXG4gICAgICAgIGNsYXNzPVwibnVpLWNoaXBzX190aXRsZS1jZWxsXCJcbiAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibnVpLWNoaXBzX190aXRsZVwiPnt7IHRpdGxlIH19Ojwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJudWktY2hpcHNfX2NvdW50XCI+KHt7IGdldEl0ZW1zQ291bnQoKSB9fSk8L3NwYW4+XG4gICAgPC9oND5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibnVpLWNoaXBzX19tYWluLWNlbGxcIlxuICAgICAgICAjY2hpcHNNYWluQ2VsbFxuICAgICAgICBbc3R5bGUuZmxleC1ncm93XT1cImlzT3ZlcmZsb3dlZCA/IDEgOiAwXCJcbiAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtc1NvdXJjZS5mbGF0SXRlbXM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgPG51aS1jaGlwXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjaGlwLWZsYXRcIlxuICAgICAgICAgICAgICAgICNjaGlwSXRlbVxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmbGF0SXRlbSBvZiBpdGVtc1NvdXJjZS5mbGF0SXRlbXM7IGxldCBsYXN0ID0gbGFzdFwiXG4gICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cImZsYXRJdGVtLmN1c3RvbUNsYXNzXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZ3JvdXAtbGFzdF09XCJsYXN0XCJcbiAgICAgICAgICAgICAgICBbaXRlbV09XCJmbGF0SXRlbVwiXG4gICAgICAgICAgICAgICAgKHJlbW92ZSk9XCJvblJlbW92ZSh7IGl0ZW06IGZsYXRJdGVtLCBncm91cDogdW5kZWZpbmVkIH0pXCJcbiAgICAgICAgICAgID48L251aS1jaGlwPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgaXRlbXNTb3VyY2UuZ3JvdXBlZEl0ZW1zOyBsZXQgbGFzdEdyb3VwID0gbGFzdFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncm91cC5pdGVtcz8ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJudWktY2hpcHNfX2dyb3VwLW5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJncm91cC5jdXN0b21DbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICNjaGlwSXRlbVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm51aS1jaGlwc19fZ3JvdXAtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdyb3VwLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxudWktY2hpcFxuICAgICAgICAgICAgICAgICAgICAjY2hpcEl0ZW1cbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGdyb3VwSXRlbSBvZiBncm91cC5pdGVtczsgbGV0IGxhc3QgPSBsYXN0XCJcbiAgICAgICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cImdyb3VwSXRlbS5jdXN0b21DbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5ncm91cC1sYXN0XT1cImxhc3QgJiYgIWxhc3RHcm91cFwiXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cImdyb3VwSXRlbVwiXG4gICAgICAgICAgICAgICAgICAgIChyZW1vdmUpPVwib25SZW1vdmUoeyBpdGVtOiBncm91cEl0ZW0sIGdyb3VwOiBncm91cCB9KVwiXG4gICAgICAgICAgICAgICAgPjwvbnVpLWNoaXA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIi5udWktY2hpcHMtb3ZlcmZsb3dlZFwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJudWktY2hpcHNfX2NsZWFyLWNlbGxcIlxuICAgICAgICAjY2xlYXJBbGxcbiAgICAgICAgKm5nSWY9XCJhbGxvd1JlbW92ZUFsbCAmJiBnZXRJdGVtc0NvdW50KCkgPiAwXCJcbiAgICA+XG4gICAgICAgIDxhIGhyZWYgY2xhc3M9XCJudWktY2hpcHNfX2NsZWFyXCIgKGNsaWNrKT1cIm9uUmVtb3ZlQWxsKCRldmVudClcIj57e1xuICAgICAgICAgICAgcmVtb3ZlQWxsTGlua1RleHRcbiAgICAgICAgfX08L2E+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==