/**-----------------------------------------------------------------------------------------
* Copyright © 2021 Progress Software Corporation. All rights reserved.
* Licensed under commercial license. See LICENSE.md in the project root for more information
*-------------------------------------------------------------------------------------------*/
import * as tslib_1 from "tslib";
import { Component, HostBinding, Input, TemplateRef, ChangeDetectorRef } from '@angular/core';
import { trigger, style, animate, transition } from '@angular/animations';
import { getter } from '@progress/kendo-common';
import { ExpandStateService } from './expand-state.service';
import { IndexBuilderService } from './index-builder.service';
import { TreeViewLookupService } from './treeview-lookup.service';
import { NavigationService } from './navigation/navigation.service';
import { NodeChildrenService } from './node-children.service';
import { isPresent, isArray } from './utils';
import { LoadingNotificationService } from './loading-notification.service';
import { Subscription, EMPTY, of } from 'rxjs';
import { catchError, tap, finalize, filter } from 'rxjs/operators';
import { DataChangeNotificationService } from './data-change-notification.service';
/**
 * @hidden
 */
import * as ɵngcc0 from '@angular/core';
import * as ɵngcc1 from './expand-state.service';
import * as ɵngcc2 from './loading-notification.service';
import * as ɵngcc3 from './index-builder.service';
import * as ɵngcc4 from './treeview-lookup.service';
import * as ɵngcc5 from './navigation/navigation.service';
import * as ɵngcc6 from './node-children.service';
import * as ɵngcc7 from './data-change-notification.service';
import * as ɵngcc8 from '@angular/common';
import * as ɵngcc9 from './treeview-item.directive';
import * as ɵngcc10 from './treeview-item-content.directive';
import * as ɵngcc11 from './loading-indicator.directive';
import * as ɵngcc12 from './checkbox/checkbox.component';

const _c0 = ["kendoTreeViewGroup", ""];
function TreeViewGroupComponent_li_0_span_2_Template(rf, ctx) { if (rf & 1) {
    const _r11 = ɵngcc0.ɵɵgetCurrentView();
    ɵngcc0.ɵɵelementStart(0, "span", 11);
    ɵngcc0.ɵɵlistener("click", function TreeViewGroupComponent_li_0_span_2_Template_span_click_0_listener() { ɵngcc0.ɵɵrestoreView(_r11); const ctx_r10 = ɵngcc0.ɵɵnextContext(); const index_r3 = ctx_r10.index; const node_r2 = ctx_r10.$implicit; const ctx_r9 = ɵngcc0.ɵɵnextContext(); return ctx_r9.expandNode(ctx_r9.nodeIndex(index_r3), node_r2, !ctx_r9.isExpanded(node_r2, ctx_r9.nodeIndex(index_r3))); });
    ɵngcc0.ɵɵelementEnd();
} if (rf & 2) {
    const ctx_r12 = ɵngcc0.ɵɵnextContext();
    const node_r2 = ctx_r12.$implicit;
    const index_r3 = ctx_r12.index;
    const ctx_r4 = ɵngcc0.ɵɵnextContext();
    ɵngcc0.ɵɵclassProp("k-i-collapse", ctx_r4.isExpanded(node_r2, ctx_r4.nodeIndex(index_r3)))("k-i-expand", !ctx_r4.isExpanded(node_r2, ctx_r4.nodeIndex(index_r3)));
    ɵngcc0.ɵɵproperty("kendoTreeViewLoading", ctx_r4.nodeIndex(index_r3));
} }
function TreeViewGroupComponent_li_0_kendo_checkbox_3_Template(rf, ctx) { if (rf & 1) {
    const _r15 = ɵngcc0.ɵɵgetCurrentView();
    ɵngcc0.ɵɵelementStart(0, "kendo-checkbox", 12);
    ɵngcc0.ɵɵlistener("checkStateChange", function TreeViewGroupComponent_li_0_kendo_checkbox_3_Template_kendo_checkbox_checkStateChange_0_listener() { ɵngcc0.ɵɵrestoreView(_r15); const index_r3 = ɵngcc0.ɵɵnextContext().index; const ctx_r13 = ɵngcc0.ɵɵnextContext(); return ctx_r13.checkNode(ctx_r13.nodeIndex(index_r3)); });
    ɵngcc0.ɵɵelementEnd();
} if (rf & 2) {
    const ctx_r16 = ɵngcc0.ɵɵnextContext();
    const node_r2 = ctx_r16.$implicit;
    const index_r3 = ctx_r16.index;
    const ctx_r5 = ɵngcc0.ɵɵnextContext();
    ɵngcc0.ɵɵproperty("node", node_r2)("index", ctx_r5.nodeIndex(index_r3))("isChecked", ctx_r5.isChecked);
} }
function TreeViewGroupComponent_li_0_ng_container_6_ng_template_1_Template(rf, ctx) { }
const _c1 = function (a0, a1) { return { $implicit: a0, index: a1 }; };
function TreeViewGroupComponent_li_0_ng_container_6_Template(rf, ctx) { if (rf & 1) {
    ɵngcc0.ɵɵelementContainerStart(0);
    ɵngcc0.ɵɵtemplate(1, TreeViewGroupComponent_li_0_ng_container_6_ng_template_1_Template, 0, 0, "ng-template", 13);
    ɵngcc0.ɵɵelementContainerEnd();
} if (rf & 2) {
    const ctx_r18 = ɵngcc0.ɵɵnextContext();
    const node_r2 = ctx_r18.$implicit;
    const index_r3 = ctx_r18.index;
    const ctx_r6 = ɵngcc0.ɵɵnextContext();
    ɵngcc0.ɵɵadvance(1);
    ɵngcc0.ɵɵproperty("ngTemplateOutlet", ctx_r6.nodeTemplateRef)("ngTemplateOutletContext", ɵngcc0.ɵɵpureFunction2(2, _c1, node_r2, ctx_r6.nodeIndex(index_r3)));
} }
function TreeViewGroupComponent_li_0_ng_container_7_Template(rf, ctx) { if (rf & 1) {
    ɵngcc0.ɵɵelementContainerStart(0);
    ɵngcc0.ɵɵtext(1);
    ɵngcc0.ɵɵelementContainerEnd();
} if (rf & 2) {
    const node_r2 = ɵngcc0.ɵɵnextContext().$implicit;
    const ctx_r7 = ɵngcc0.ɵɵnextContext();
    ɵngcc0.ɵɵadvance(1);
    ɵngcc0.ɵɵtextInterpolate1(" ", ctx_r7.nodeText(node_r2), " ");
} }
function TreeViewGroupComponent_li_0_ul_8_Template(rf, ctx) { if (rf & 1) {
    ɵngcc0.ɵɵelement(0, "ul", 14);
} if (rf & 2) {
    const ctx_r20 = ɵngcc0.ɵɵnextContext();
    const node_r2 = ctx_r20.$implicit;
    const index_r3 = ctx_r20.index;
    const ctx_r8 = ɵngcc0.ɵɵnextContext();
    ɵngcc0.ɵɵproperty("nodes", ctx_r8.fetchChildren)("loadOnDemand", ctx_r8.loadOnDemand)("checkboxes", ctx_r8.checkboxes)("expandIcons", ctx_r8.expandIcons)("selectable", ctx_r8.selectable)("touchActions", ctx_r8.touchActions)("children", ctx_r8.children)("hasChildren", ctx_r8.hasChildren)("isChecked", ctx_r8.isChecked)("isDisabled", ctx_r8.isDisabled)("disabled", ctx_r8.disabled || ctx_r8.isDisabled(node_r2, ctx_r8.nodeIndex(index_r3)))("isExpanded", ctx_r8.isExpanded)("isSelected", ctx_r8.isSelected)("isVisible", ctx_r8.isVisible)("nodeTemplateRef", ctx_r8.nodeTemplateRef)("loadMoreButtonTemplateRef", ctx_r8.loadMoreButtonTemplateRef)("parentIndex", ctx_r8.nodeIndex(index_r3))("parentDataItem", node_r2)("textField", ctx_r8.nextFields)("loadMoreService", ctx_r8.loadMoreService)("@toggle", true)("trackBy", ctx_r8.trackBy);
} }
function TreeViewGroupComponent_li_0_Template(rf, ctx) { if (rf & 1) {
    ɵngcc0.ɵɵelementStart(0, "li", 2);
    ɵngcc0.ɵɵelementStart(1, "div", 3);
    ɵngcc0.ɵɵtemplate(2, TreeViewGroupComponent_li_0_span_2_Template, 1, 5, "span", 4);
    ɵngcc0.ɵɵtemplate(3, TreeViewGroupComponent_li_0_kendo_checkbox_3_Template, 1, 3, "kendo-checkbox", 5);
    ɵngcc0.ɵɵelementStart(4, "span", 6);
    ɵngcc0.ɵɵelementContainerStart(5, 7);
    ɵngcc0.ɵɵtemplate(6, TreeViewGroupComponent_li_0_ng_container_6_Template, 2, 5, "ng-container", 8);
    ɵngcc0.ɵɵtemplate(7, TreeViewGroupComponent_li_0_ng_container_7_Template, 2, 1, "ng-container", 9);
    ɵngcc0.ɵɵelementContainerEnd();
    ɵngcc0.ɵɵelementEnd();
    ɵngcc0.ɵɵelementEnd();
    ɵngcc0.ɵɵtemplate(8, TreeViewGroupComponent_li_0_ul_8_Template, 1, 22, "ul", 10);
    ɵngcc0.ɵɵelementEnd();
} if (rf & 2) {
    const node_r2 = ctx.$implicit;
    const index_r3 = ctx.index;
    const ctx_r0 = ɵngcc0.ɵɵnextContext();
    ɵngcc0.ɵɵclassProp("k-display-none", !ctx_r0.isVisible(node_r2, ctx_r0.nodeIndex(index_r3)));
    ɵngcc0.ɵɵproperty("dataItem", node_r2)("index", ctx_r0.nodeIndex(index_r3))("parentDataItem", ctx_r0.parentDataItem)("parentIndex", ctx_r0.parentIndex)("loadOnDemand", ctx_r0.loadOnDemand)("checkable", ctx_r0.checkboxes)("isChecked", ctx_r0.isChecked(node_r2, ctx_r0.nodeIndex(index_r3)))("isDisabled", ctx_r0.disabled || ctx_r0.isDisabled(node_r2, ctx_r0.nodeIndex(index_r3)))("isVisible", ctx_r0.isVisible(node_r2, ctx_r0.nodeIndex(index_r3)))("expandable", ctx_r0.expandIcons && ctx_r0.hasChildren(node_r2))("isExpanded", ctx_r0.isExpanded(node_r2, ctx_r0.nodeIndex(index_r3)))("selectable", ctx_r0.selectable)("isSelected", ctx_r0.isSelected(node_r2, ctx_r0.nodeIndex(index_r3)));
    ɵngcc0.ɵɵattribute("aria-setsize", ctx_r0.totalNodesCount)("data-treeindex", ctx_r0.nodeIndex(index_r3));
    ɵngcc0.ɵɵadvance(2);
    ɵngcc0.ɵɵproperty("ngIf", ctx_r0.expandIcons && ctx_r0.hasChildren(node_r2));
    ɵngcc0.ɵɵadvance(1);
    ɵngcc0.ɵɵproperty("ngIf", ctx_r0.checkboxes);
    ɵngcc0.ɵɵadvance(1);
    ɵngcc0.ɵɵstyleProp("touch-action", ctx_r0.touchActions ? "" : "none");
    ɵngcc0.ɵɵproperty("dataItem", node_r2)("index", ctx_r0.nodeIndex(index_r3))("initialSelection", ctx_r0.isSelected(node_r2, ctx_r0.nodeIndex(index_r3)))("isSelected", ctx_r0.isSelected);
    ɵngcc0.ɵɵattribute("data-treeindex", ctx_r0.nodeIndex(index_r3));
    ɵngcc0.ɵɵadvance(1);
    ɵngcc0.ɵɵproperty("ngSwitch", ctx_r0.hasTemplate);
    ɵngcc0.ɵɵadvance(1);
    ɵngcc0.ɵɵproperty("ngSwitchCase", true);
    ɵngcc0.ɵɵadvance(2);
    ɵngcc0.ɵɵproperty("ngIf", ctx_r0.isExpanded(node_r2, ctx_r0.nodeIndex(index_r3)) && ctx_r0.hasChildren(node_r2));
} }
function TreeViewGroupComponent_li_1_span_2_Template(rf, ctx) { if (rf & 1) {
    ɵngcc0.ɵɵelement(0, "span", 19);
} }
function TreeViewGroupComponent_li_1_4_ng_template_0_Template(rf, ctx) { }
const _c2 = function (a0) { return { index: a0 }; };
function TreeViewGroupComponent_li_1_4_Template(rf, ctx) { if (rf & 1) {
    ɵngcc0.ɵɵtemplate(0, TreeViewGroupComponent_li_1_4_ng_template_0_Template, 0, 0, "ng-template", 13);
} if (rf & 2) {
    const ctx_r22 = ɵngcc0.ɵɵnextContext(2);
    ɵngcc0.ɵɵproperty("ngTemplateOutlet", ctx_r22.loadMoreButtonTemplateRef)("ngTemplateOutletContext", ɵngcc0.ɵɵpureFunction1(2, _c2, ctx_r22.loadMoreButtonIndex));
} }
function TreeViewGroupComponent_li_1_ng_container_5_Template(rf, ctx) { if (rf & 1) {
    ɵngcc0.ɵɵelementContainerStart(0);
    ɵngcc0.ɵɵtext(1, " Load more ");
    ɵngcc0.ɵɵelementContainerEnd();
} }
function TreeViewGroupComponent_li_1_Template(rf, ctx) { if (rf & 1) {
    ɵngcc0.ɵɵelementStart(0, "li", 15);
    ɵngcc0.ɵɵelementStart(1, "div", 3);
    ɵngcc0.ɵɵtemplate(2, TreeViewGroupComponent_li_1_span_2_Template, 1, 0, "span", 16);
    ɵngcc0.ɵɵelementStart(3, "span", 17);
    ɵngcc0.ɵɵtemplate(4, TreeViewGroupComponent_li_1_4_Template, 1, 4, undefined, 18);
    ɵngcc0.ɵɵtemplate(5, TreeViewGroupComponent_li_1_ng_container_5_Template, 2, 0, "ng-container", 18);
    ɵngcc0.ɵɵelementEnd();
    ɵngcc0.ɵɵelementEnd();
    ɵngcc0.ɵɵelementEnd();
} if (rf & 2) {
    const ctx_r1 = ɵngcc0.ɵɵnextContext();
    ɵngcc0.ɵɵclassProp("k-treeview-load-more-checkboxes-container", ctx_r1.checkboxes);
    ɵngcc0.ɵɵproperty("selectable", false)("checkable", false)("expandable", false)("index", ctx_r1.loadMoreButtonIndex)("parentDataItem", ctx_r1.parentDataItem)("parentIndex", ctx_r1.parentIndex);
    ɵngcc0.ɵɵattribute("data-treeindex", ctx_r1.loadMoreButtonIndex);
    ɵngcc0.ɵɵadvance(2);
    ɵngcc0.ɵɵproperty("ngIf", ctx_r1.loadingMoreNodes);
    ɵngcc0.ɵɵadvance(1);
    ɵngcc0.ɵɵproperty("index", ctx_r1.loadMoreButtonIndex);
    ɵngcc0.ɵɵattribute("data-treeindex", ctx_r1.loadMoreButtonIndex);
    ɵngcc0.ɵɵadvance(1);
    ɵngcc0.ɵɵproperty("ngIf", ctx_r1.loadMoreButtonTemplateRef);
    ɵngcc0.ɵɵadvance(1);
    ɵngcc0.ɵɵproperty("ngIf", !ctx_r1.loadMoreButtonTemplateRef);
} }
let TreeViewGroupComponent = class TreeViewGroupComponent {
    constructor(expandService, loadingService, indexBuilder, treeViewLookupService, navigationService, nodeChildrenService, dataChangeNotification, changeDetectorRef) {
        this.expandService = expandService;
        this.loadingService = loadingService;
        this.indexBuilder = indexBuilder;
        this.treeViewLookupService = treeViewLookupService;
        this.navigationService = navigationService;
        this.nodeChildrenService = nodeChildrenService;
        this.dataChangeNotification = dataChangeNotification;
        this.changeDetectorRef = changeDetectorRef;
        this.kGroupClass = true;
        this.role = 'group';
        this.loadOnDemand = true;
        this.textField = "";
        this.initialNodesLoaded = false;
        this.loadingMoreNodes = false;
        this._data = [];
        this.singleRecordSubscriptions = new Subscription();
        this.isChecked = () => 'none';
        this.isDisabled = () => false;
        this.isExpanded = () => false;
        this.isVisible = () => true;
        this.isSelected = () => false;
        this.children = () => of([]);
        this.hasChildren = () => false;
    }
    get moreNodesAvailable() {
        if (!isPresent(this.loadMoreService) || this.data.length === 0) {
            return false;
        }
        return this.pageSize < this.totalNodesCount;
    }
    get pageSize() {
        if (!isPresent(this.loadMoreService)) {
            return null;
        }
        return this.loadMoreService.getGroupSize(this.parentDataItem);
    }
    set pageSize(pageSize) {
        this.loadMoreService.setGroupSize(this.parentDataItem, pageSize);
    }
    get data() {
        if (isPresent(this.pageSize)) {
            const normalizedSizeValue = this.pageSize > 0 ? this.pageSize : 0;
            return this._data.slice(0, normalizedSizeValue);
        }
        return this._data;
    }
    set data(data) {
        this._data = data;
        this.registerLoadedNodes(this.data);
    }
    get loadMoreButtonIndex() {
        if (!this.loadMoreService) {
            return null;
        }
        return this.nodeIndex(this.data.length);
    }
    /**
     * Represents the total number of nodes for the current level.
     */
    get totalNodesCount() {
        if (!this.loadMoreService) {
            return this.data.length;
        }
        return this.loadMoreService.getTotalNodesCount(this.parentDataItem, this._data.length);
    }
    get hasTemplate() {
        return isPresent(this.nodeTemplateRef);
    }
    expandNode(index, dataItem, expand) {
        if (expand) {
            this.expandService.expand(index, dataItem);
        }
        else {
            this.expandService.collapse(index, dataItem);
        }
    }
    checkNode(index) {
        this.navigationService.checkIndex(index);
        this.navigationService.activateIndex(index);
    }
    nodeIndex(index) {
        return this.indexBuilder.nodeIndex(index.toString(), this.parentIndex);
    }
    nodeText(dataItem) {
        const textField = isArray(this.textField) ? this.textField[0] : this.textField;
        return getter(textField)(dataItem);
    }
    ngOnDestroy() {
        if (isPresent(this.nodesSubscription)) {
            this.nodesSubscription.unsubscribe();
        }
        if (isPresent(this.loadMoreNodesSubscription)) {
            this.loadMoreNodesSubscription.unsubscribe();
        }
        this.singleRecordSubscriptions.unsubscribe();
    }
    ngOnInit() {
        this.subscribeToNodesChange();
        this.singleRecordSubscriptions.add(this.dataChangeNotification
            .changes
            .subscribe(this.subscribeToNodesChange.bind(this)));
        this.singleRecordSubscriptions.add(this.navigationService.loadMore
            .pipe(filter(index => index === this.loadMoreButtonIndex))
            .subscribe(this.loadMoreNodes.bind(this)));
    }
    ngOnChanges(changes) {
        if (changes.parentIndex && this.loadOnDemand) {
            this.setNodeChildren(this.mapToTreeItem(this.data));
        }
    }
    fetchChildren(node, index) {
        return this.children(node)
            .pipe(catchError(() => {
            this.loadingService.notifyLoaded(index);
            return EMPTY;
        }), tap(() => this.loadingService.notifyLoaded(index)));
    }
    get nextFields() {
        if (isArray(this.textField)) {
            return this.textField.length > 1 ? this.textField.slice(1) : this.textField;
        }
        return [this.textField];
    }
    loadMoreNodes() {
        if (isPresent(this.loadMoreService.loadMoreNodes)) {
            this.fetchMoreNodes();
        }
        else {
            this.loadMoreLocalNodes();
        }
    }
    loadMoreLocalNodes() {
        const initialLoadMoreButtonIndex = this.loadMoreButtonIndex;
        this.pageSize += this.loadMoreService.getInitialPageSize(this.parentDataItem);
        this.registerLoadedNodes(this.data);
        // forces the new items to be registered before the focus is changed
        this.changeDetectorRef.detectChanges();
        this.reselectItemAt(initialLoadMoreButtonIndex);
    }
    fetchMoreNodes() {
        if (this.loadingMoreNodes) {
            return;
        }
        this.loadingMoreNodes = true;
        if (isPresent(this.loadMoreNodesSubscription)) {
            this.loadMoreNodesSubscription.unsubscribe();
        }
        this.loadMoreNodesSubscription = this.loadMoreService
            .loadMoreNodes({
            dataItem: this.parentDataItem,
            skip: this.data.length,
            take: this.loadMoreService.getInitialPageSize(this.parentDataItem)
        })
            .pipe(finalize(() => this.loadingMoreNodes = false))
            .subscribe(items => {
            if (!(Array.isArray(items) && items.length > 0)) {
                return;
            }
            const initialLoadMoreButtonIndex = this.loadMoreButtonIndex;
            this.pageSize += items.length;
            this.data = this.data.concat(items);
            if (this.navigationService.isActive(initialLoadMoreButtonIndex)) {
                // forces the new items to be registered before the focus is changed
                this.changeDetectorRef.detectChanges();
                this.reselectItemAt(initialLoadMoreButtonIndex);
            }
        });
    }
    setNodeChildren(children) {
        this.treeViewLookupService.registerChildren(this.parentIndex, children);
    }
    mapToTreeItem(data) {
        if (!this.parentIndex) {
            return [];
        }
        return data.map((dataItem, idx) => ({ dataItem, index: this.nodeIndex(idx) }));
    }
    emitChildrenLoaded(children) {
        if (!this.parentIndex) {
            return;
        }
        // ignores the registered load-more button
        const contentChildren = children.filter(item => item.dataItem);
        this.nodeChildrenService.childrenLoaded({ dataItem: this.parentDataItem, index: this.parentIndex }, contentChildren);
    }
    subscribeToNodesChange() {
        if (this.nodesSubscription) {
            this.nodesSubscription.unsubscribe();
        }
        this.nodesSubscription = this.nodes(this.parentDataItem, this.parentIndex)
            .subscribe(data => {
            this.data = data;
            this.initialNodesLoaded = true;
        });
    }
    reselectItemAt(index) {
        if (!isPresent(index)) {
            return;
        }
        // make sure the old index is cleared first
        this.navigationService.deactivate();
        this.navigationService.activateIndex(index);
    }
    registerLoadedNodes(nodes = []) {
        const mappedChildren = this.mapToTreeItem(nodes);
        if (this.loadOnDemand) {
            this.setNodeChildren(mappedChildren);
        }
        this.emitChildrenLoaded(mappedChildren);
    }
};
TreeViewGroupComponent.ɵfac = function TreeViewGroupComponent_Factory(t) { return new (t || TreeViewGroupComponent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc1.ExpandStateService), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.LoadingNotificationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc3.IndexBuilderService), ɵngcc0.ɵɵdirectiveInject(ɵngcc4.TreeViewLookupService), ɵngcc0.ɵɵdirectiveInject(ɵngcc5.NavigationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc6.NodeChildrenService), ɵngcc0.ɵɵdirectiveInject(ɵngcc7.DataChangeNotificationService), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };
TreeViewGroupComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: TreeViewGroupComponent, selectors: [["", "kendoTreeViewGroup", ""]], hostVars: 3, hostBindings: function TreeViewGroupComponent_HostBindings(rf, ctx) { if (rf & 2) {
        ɵngcc0.ɵɵattribute("role", ctx.role);
        ɵngcc0.ɵɵclassProp("k-group", ctx.kGroupClass);
    } }, inputs: { loadOnDemand: "loadOnDemand", textField: "textField", isChecked: "isChecked", isDisabled: "isDisabled", isExpanded: "isExpanded", isVisible: "isVisible", isSelected: "isSelected", children: "children", hasChildren: "hasChildren", checkboxes: "checkboxes", expandIcons: "expandIcons", disabled: "disabled", selectable: "selectable", touchActions: "touchActions", trackBy: "trackBy", nodes: "nodes", parentDataItem: "parentDataItem", parentIndex: "parentIndex", nodeTemplateRef: "nodeTemplateRef", loadMoreButtonTemplateRef: "loadMoreButtonTemplateRef", loadMoreService: "loadMoreService" }, features: [ɵngcc0.ɵɵNgOnChangesFeature], attrs: _c0, decls: 2, vars: 3, consts: [["class", "k-item k-treeview-item", "kendoTreeViewItem", "", 3, "k-display-none", "dataItem", "index", "parentDataItem", "parentIndex", "loadOnDemand", "checkable", "isChecked", "isDisabled", "isVisible", "expandable", "isExpanded", "selectable", "isSelected", 4, "ngFor", "ngForOf", "ngForTrackBy"], ["class", "k-item k-treeview-item", "kendoTreeViewItem", "", "role", "button", 3, "k-treeview-load-more-checkboxes-container", "selectable", "checkable", "expandable", "index", "parentDataItem", "parentIndex", 4, "ngIf"], ["kendoTreeViewItem", "", 1, "k-item", "k-treeview-item", 3, "dataItem", "index", "parentDataItem", "parentIndex", "loadOnDemand", "checkable", "isChecked", "isDisabled", "isVisible", "expandable", "isExpanded", "selectable", "isSelected"], [1, "k-mid"], ["class", "k-icon", 3, "k-i-collapse", "k-i-expand", "kendoTreeViewLoading", "click", 4, "ngIf"], ["tabindex", "-1", 3, "node", "index", "isChecked", "checkStateChange", 4, "ngIf"], ["kendoTreeViewItemContent", "", 1, "k-in", 3, "dataItem", "index", "initialSelection", "isSelected"], [3, "ngSwitch"], [4, "ngSwitchCase"], [4, "ngSwitchDefault"], ["kendoTreeViewGroup", "", "role", "group", 3, "nodes", "loadOnDemand", "checkboxes", "expandIcons", "selectable", "touchActions", "children", "hasChildren", "isChecked", "isDisabled", "disabled", "isExpanded", "isSelected", "isVisible", "nodeTemplateRef", "loadMoreButtonTemplateRef", "parentIndex", "parentDataItem", "textField", "loadMoreService", "trackBy", 4, "ngIf"], [1, "k-icon", 3, "kendoTreeViewLoading", "click"], ["tabindex", "-1", 3, "node", "index", "isChecked", "checkStateChange"], [3, "ngTemplateOutlet", "ngTemplateOutletContext"], ["kendoTreeViewGroup", "", "role", "group", 3, "nodes", "loadOnDemand", "checkboxes", "expandIcons", "selectable", "touchActions", "children", "hasChildren", "isChecked", "isDisabled", "disabled", "isExpanded", "isSelected", "isVisible", "nodeTemplateRef", "loadMoreButtonTemplateRef", "parentIndex", "parentDataItem", "textField", "loadMoreService", "trackBy"], ["kendoTreeViewItem", "", "role", "button", 1, "k-item", "k-treeview-item", 3, "selectable", "checkable", "expandable", "index", "parentDataItem", "parentIndex"], ["class", "k-icon k-i-loading k-i-expand", 4, "ngIf"], ["kendoTreeViewItemContent", "", 1, "k-in", "k-treeview-load-more-button", 3, "index"], [4, "ngIf"], [1, "k-icon", "k-i-loading", "k-i-expand"]], template: function TreeViewGroupComponent_Template(rf, ctx) { if (rf & 1) {
        ɵngcc0.ɵɵtemplate(0, TreeViewGroupComponent_li_0_Template, 9, 29, "li", 0);
        ɵngcc0.ɵɵtemplate(1, TreeViewGroupComponent_li_1_Template, 6, 14, "li", 1);
    } if (rf & 2) {
        ɵngcc0.ɵɵproperty("ngForOf", ctx.data)("ngForTrackBy", ctx.trackBy);
        ɵngcc0.ɵɵadvance(1);
        ɵngcc0.ɵɵproperty("ngIf", ctx.initialNodesLoaded && ctx.moreNodesAvailable);
    } }, directives: [ɵngcc8.NgForOf, ɵngcc8.NgIf, ɵngcc9.TreeViewItemDirective, ɵngcc10.TreeViewItemContentDirective, ɵngcc8.NgSwitch, ɵngcc8.NgSwitchCase, ɵngcc8.NgSwitchDefault, ɵngcc11.LoadingIndicatorDirective, ɵngcc12.CheckBoxComponent, ɵngcc8.NgTemplateOutlet, TreeViewGroupComponent], encapsulation: 2, data: { animation: [
            trigger('toggle', [
                transition('void => *', [
                    style({ height: 0 }),
                    animate('0.1s ease-in', style({ height: "*" }))
                ]),
                transition('* => void', [
                    style({ height: "*" }),
                    animate('0.1s ease-in', style({ height: 0 }))
                ])
            ])
        ] } });
tslib_1.__decorate([
    HostBinding("class.k-group"),
    tslib_1.__metadata("design:type", Boolean)
], TreeViewGroupComponent.prototype, "kGroupClass", void 0);
tslib_1.__decorate([
    HostBinding("attr.role"),
    tslib_1.__metadata("design:type", String)
], TreeViewGroupComponent.prototype, "role", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Boolean)
], TreeViewGroupComponent.prototype, "checkboxes", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Boolean)
], TreeViewGroupComponent.prototype, "expandIcons", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Boolean)
], TreeViewGroupComponent.prototype, "disabled", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Boolean)
], TreeViewGroupComponent.prototype, "selectable", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Boolean)
], TreeViewGroupComponent.prototype, "touchActions", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Boolean)
], TreeViewGroupComponent.prototype, "loadOnDemand", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Function)
], TreeViewGroupComponent.prototype, "trackBy", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Function)
], TreeViewGroupComponent.prototype, "nodes", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Object)
], TreeViewGroupComponent.prototype, "textField", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Object)
], TreeViewGroupComponent.prototype, "parentDataItem", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", String)
], TreeViewGroupComponent.prototype, "parentIndex", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", TemplateRef)
], TreeViewGroupComponent.prototype, "nodeTemplateRef", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", TemplateRef)
], TreeViewGroupComponent.prototype, "loadMoreButtonTemplateRef", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Object)
], TreeViewGroupComponent.prototype, "loadMoreService", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Function)
], TreeViewGroupComponent.prototype, "isChecked", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Function)
], TreeViewGroupComponent.prototype, "isDisabled", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Function)
], TreeViewGroupComponent.prototype, "isExpanded", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Function)
], TreeViewGroupComponent.prototype, "isVisible", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Function)
], TreeViewGroupComponent.prototype, "isSelected", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Function)
], TreeViewGroupComponent.prototype, "children", void 0);
tslib_1.__decorate([
    Input(),
    tslib_1.__metadata("design:type", Function)
], TreeViewGroupComponent.prototype, "hasChildren", void 0);
TreeViewGroupComponent = tslib_1.__decorate([ tslib_1.__metadata("design:paramtypes", [ExpandStateService,
        LoadingNotificationService,
        IndexBuilderService,
        TreeViewLookupService,
        NavigationService,
        NodeChildrenService,
        DataChangeNotificationService,
        ChangeDetectorRef])
], TreeViewGroupComponent);
/*@__PURE__*/ (function () { ɵngcc0.ɵsetClassMetadata(TreeViewGroupComponent, [{
        type: Component,
        args: [{
                animations: [
                    trigger('toggle', [
                        transition('void => *', [
                            style({ height: 0 }),
                            animate('0.1s ease-in', style({ height: "*" }))
                        ]),
                        transition('* => void', [
                            style({ height: "*" }),
                            animate('0.1s ease-in', style({ height: 0 }))
                        ])
                    ])
                ],
                selector: '[kendoTreeViewGroup]',
                template: `
        <li
            *ngFor="let node of data; let index = index; trackBy: trackBy"
            class="k-item k-treeview-item"
            [class.k-display-none]="!isVisible(node, nodeIndex(index))"
            kendoTreeViewItem
            [attr.aria-setsize]="totalNodesCount"
            [dataItem]="node"
            [index]="nodeIndex(index)"
            [parentDataItem]="parentDataItem"
            [parentIndex]="parentIndex"
            [loadOnDemand]="loadOnDemand"
            [checkable]="checkboxes"
            [isChecked]="isChecked(node, nodeIndex(index))"
            [isDisabled]="disabled || isDisabled(node, nodeIndex(index))"
            [isVisible]="isVisible(node, nodeIndex(index))"
            [expandable]="expandIcons && hasChildren(node)"
            [isExpanded]="isExpanded(node, nodeIndex(index))"
            [selectable]="selectable"
            [isSelected]="isSelected(node, nodeIndex(index))"
            [attr.data-treeindex]="nodeIndex(index)"
        >
            <div class="k-mid">
                <span
                    class="k-icon"
                    [class.k-i-collapse]="isExpanded(node, nodeIndex(index))"
                    [class.k-i-expand]="!isExpanded(node, nodeIndex(index))"
                    [kendoTreeViewLoading]="nodeIndex(index)"
                    (click)="expandNode(nodeIndex(index), node, !isExpanded(node, nodeIndex(index)))"
                    *ngIf="expandIcons && hasChildren(node)"
                >
                </span>
                <kendo-checkbox
                    *ngIf="checkboxes"
                    [node]="node"
                    [index]="nodeIndex(index)"
                    [isChecked]="isChecked"
                    (checkStateChange)="checkNode(nodeIndex(index))"
                    tabindex="-1"
                ></kendo-checkbox>
                <span kendoTreeViewItemContent
                    [attr.data-treeindex]="nodeIndex(index)"
                    [dataItem]="node"
                    [index]="nodeIndex(index)"
                    [initialSelection]="isSelected(node, nodeIndex(index))"
                    [isSelected]="isSelected"
                    class="k-in"
                    [style.touch-action]="touchActions ? '' : 'none'"
                >
                    <ng-container [ngSwitch]="hasTemplate">
                        <ng-container *ngSwitchCase="true">
                            <ng-template
                                [ngTemplateOutlet]="nodeTemplateRef"
                                [ngTemplateOutletContext]="{
                                    $implicit: node,
                                    index: nodeIndex(index)
                                }"
                            >
                            </ng-template>
                        </ng-container>
                        <ng-container *ngSwitchDefault>
                            {{nodeText(node)}}
                        </ng-container>
                    </ng-container>
                </span>
            </div>
            <ul
                *ngIf="isExpanded(node, nodeIndex(index)) && hasChildren(node)"
                kendoTreeViewGroup
                role="group"
                [nodes]="fetchChildren"
                [loadOnDemand]="loadOnDemand"
                [checkboxes]="checkboxes"
                [expandIcons]="expandIcons"
                [selectable]="selectable"
                [touchActions]="touchActions"
                [children]="children"
                [hasChildren]="hasChildren"
                [isChecked]="isChecked"
                [isDisabled]="isDisabled"
                [disabled]="disabled || isDisabled(node, nodeIndex(index))"
                [isExpanded]="isExpanded"
                [isSelected]="isSelected"
                [isVisible]="isVisible"
                [nodeTemplateRef]="nodeTemplateRef"
                [loadMoreButtonTemplateRef]="loadMoreButtonTemplateRef"
                [parentIndex]="nodeIndex(index)"
                [parentDataItem]="node"
                [textField]="nextFields"
                [loadMoreService]="loadMoreService"
                [@toggle]="true"
                [trackBy]="trackBy"
            >
            </ul>
        </li>
        <li
            *ngIf="initialNodesLoaded && moreNodesAvailable"
            class="k-item k-treeview-item"
            [class.k-treeview-load-more-checkboxes-container]="checkboxes"
            kendoTreeViewItem
            role="button"
            [selectable]="false"
            [checkable]="false"
            [expandable]="false"
            [index]="loadMoreButtonIndex"
            [parentDataItem]="parentDataItem"
            [parentIndex]="parentIndex"
            [attr.data-treeindex]="loadMoreButtonIndex"
        >
            <div class="k-mid">
                <span
                    *ngIf="loadingMoreNodes"
                    class="k-icon k-i-loading k-i-expand"
                >
                </span>
                <span
                    class="k-in k-treeview-load-more-button"
                    [attr.data-treeindex]="loadMoreButtonIndex"
                    kendoTreeViewItemContent
                    [index]="loadMoreButtonIndex"
                >
                    <ng-template
                        *ngIf="loadMoreButtonTemplateRef"
                        [ngTemplateOutlet]="loadMoreButtonTemplateRef"
                        [ngTemplateOutletContext]="{
                            index: loadMoreButtonIndex
                        }"
                    >
                    </ng-template>
                    <ng-container *ngIf="!loadMoreButtonTemplateRef">
                        Load more
                    </ng-container>
                </span>
            </div>
        </li>
    `
            }]
    }], function () { return [{ type: ɵngcc1.ExpandStateService }, { type: ɵngcc2.LoadingNotificationService }, { type: ɵngcc3.IndexBuilderService }, { type: ɵngcc4.TreeViewLookupService }, { type: ɵngcc5.NavigationService }, { type: ɵngcc6.NodeChildrenService }, { type: ɵngcc7.DataChangeNotificationService }, { type: ɵngcc0.ChangeDetectorRef }]; }, { kGroupClass: [{
            type: HostBinding,
            args: ["class.k-group"]
        }], role: [{
            type: HostBinding,
            args: ["attr.role"]
        }], loadOnDemand: [{
            type: Input
        }], textField: [{
            type: Input
        }], isChecked: [{
            type: Input
        }], isDisabled: [{
            type: Input
        }], isExpanded: [{
            type: Input
        }], isVisible: [{
            type: Input
        }], isSelected: [{
            type: Input
        }], children: [{
            type: Input
        }], hasChildren: [{
            type: Input
        }], checkboxes: [{
            type: Input
        }], expandIcons: [{
            type: Input
        }], disabled: [{
            type: Input
        }], selectable: [{
            type: Input
        }], touchActions: [{
            type: Input
        }], trackBy: [{
            type: Input
        }], nodes: [{
            type: Input
        }], parentDataItem: [{
            type: Input
        }], parentIndex: [{
            type: Input
        }], nodeTemplateRef: [{
            type: Input
        }], loadMoreButtonTemplateRef: [{
            type: Input
        }], loadMoreService: [{
            type: Input
        }] }); })();
export { TreeViewGroupComponent };

//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZXZpZXctZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlcyI6WyJ0cmVldmlldy1ncm91cC5jb21wb25lbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztlQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQXdKRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBQTJCO0FBQzNCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiogQ29weXJpZ2h0IMKpIDIwMjEgUHJvZ3Jlc3MgU29mdHdhcmUgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4qIExpY2Vuc2VkIHVuZGVyIGNvbW1lcmNpYWwgbGljZW5zZS4gU2VlIExJQ0VOU0UubWQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbW9yZSBpbmZvcm1hdGlvblxuKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IENvbXBvbmVudCwgSG9zdEJpbmRpbmcsIElucHV0LCBUZW1wbGF0ZVJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRyaWdnZXIsIHN0eWxlLCBhbmltYXRlLCB0cmFuc2l0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBnZXR0ZXIgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tY29tbW9uJztcbmltcG9ydCB7IEV4cGFuZFN0YXRlU2VydmljZSB9IGZyb20gJy4vZXhwYW5kLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSW5kZXhCdWlsZGVyU2VydmljZSB9IGZyb20gJy4vaW5kZXgtYnVpbGRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFRyZWVWaWV3TG9va3VwU2VydmljZSB9IGZyb20gJy4vdHJlZXZpZXctbG9va3VwLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL25hdmlnYXRpb24vbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVDaGlsZHJlblNlcnZpY2UgfSBmcm9tICcuL25vZGUtY2hpbGRyZW4uc2VydmljZSc7XG5pbXBvcnQgeyBpc1ByZXNlbnQsIGlzQXJyYXkgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IExvYWRpbmdOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9sb2FkaW5nLW5vdGlmaWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgRU1QVFksIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCB0YXAsIGZpbmFsaXplLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEYXRhQ2hhbmdlTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4vZGF0YS1jaGFuZ2Utbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmxldCBUcmVlVmlld0dyb3VwQ29tcG9uZW50ID0gY2xhc3MgVHJlZVZpZXdHcm91cENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoZXhwYW5kU2VydmljZSwgbG9hZGluZ1NlcnZpY2UsIGluZGV4QnVpbGRlciwgdHJlZVZpZXdMb29rdXBTZXJ2aWNlLCBuYXZpZ2F0aW9uU2VydmljZSwgbm9kZUNoaWxkcmVuU2VydmljZSwgZGF0YUNoYW5nZU5vdGlmaWNhdGlvbiwgY2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICAgICAgdGhpcy5leHBhbmRTZXJ2aWNlID0gZXhwYW5kU2VydmljZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nU2VydmljZSA9IGxvYWRpbmdTZXJ2aWNlO1xuICAgICAgICB0aGlzLmluZGV4QnVpbGRlciA9IGluZGV4QnVpbGRlcjtcbiAgICAgICAgdGhpcy50cmVlVmlld0xvb2t1cFNlcnZpY2UgPSB0cmVlVmlld0xvb2t1cFNlcnZpY2U7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UgPSBuYXZpZ2F0aW9uU2VydmljZTtcbiAgICAgICAgdGhpcy5ub2RlQ2hpbGRyZW5TZXJ2aWNlID0gbm9kZUNoaWxkcmVuU2VydmljZTtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdlTm90aWZpY2F0aW9uID0gZGF0YUNoYW5nZU5vdGlmaWNhdGlvbjtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZiA9IGNoYW5nZURldGVjdG9yUmVmO1xuICAgICAgICB0aGlzLmtHcm91cENsYXNzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yb2xlID0gJ2dyb3VwJztcbiAgICAgICAgdGhpcy5sb2FkT25EZW1hbmQgPSB0cnVlO1xuICAgICAgICB0aGlzLnRleHRGaWVsZCA9IFwiXCI7XG4gICAgICAgIHRoaXMuaW5pdGlhbE5vZGVzTG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9hZGluZ01vcmVOb2RlcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9kYXRhID0gW107XG4gICAgICAgIHRoaXMuc2luZ2xlUmVjb3JkU3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgdGhpcy5pc0NoZWNrZWQgPSAoKSA9PiAnbm9uZSc7XG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9ICgpID0+IGZhbHNlO1xuICAgICAgICB0aGlzLmlzRXhwYW5kZWQgPSAoKSA9PiBmYWxzZTtcbiAgICAgICAgdGhpcy5pc1Zpc2libGUgPSAoKSA9PiB0cnVlO1xuICAgICAgICB0aGlzLmlzU2VsZWN0ZWQgPSAoKSA9PiBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9ICgpID0+IG9mKFtdKTtcbiAgICAgICAgdGhpcy5oYXNDaGlsZHJlbiA9ICgpID0+IGZhbHNlO1xuICAgIH1cbiAgICBnZXQgbW9yZU5vZGVzQXZhaWxhYmxlKCkge1xuICAgICAgICBpZiAoIWlzUHJlc2VudCh0aGlzLmxvYWRNb3JlU2VydmljZSkgfHwgdGhpcy5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2VTaXplIDwgdGhpcy50b3RhbE5vZGVzQ291bnQ7XG4gICAgfVxuICAgIGdldCBwYWdlU2l6ZSgpIHtcbiAgICAgICAgaWYgKCFpc1ByZXNlbnQodGhpcy5sb2FkTW9yZVNlcnZpY2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkTW9yZVNlcnZpY2UuZ2V0R3JvdXBTaXplKHRoaXMucGFyZW50RGF0YUl0ZW0pO1xuICAgIH1cbiAgICBzZXQgcGFnZVNpemUocGFnZVNpemUpIHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZVNlcnZpY2Uuc2V0R3JvdXBTaXplKHRoaXMucGFyZW50RGF0YUl0ZW0sIHBhZ2VTaXplKTtcbiAgICB9XG4gICAgZ2V0IGRhdGEoKSB7XG4gICAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5wYWdlU2l6ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTaXplVmFsdWUgPSB0aGlzLnBhZ2VTaXplID4gMCA/IHRoaXMucGFnZVNpemUgOiAwO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuc2xpY2UoMCwgbm9ybWFsaXplZFNpemVWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuICAgIHNldCBkYXRhKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJMb2FkZWROb2Rlcyh0aGlzLmRhdGEpO1xuICAgIH1cbiAgICBnZXQgbG9hZE1vcmVCdXR0b25JbmRleCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvYWRNb3JlU2VydmljZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZUluZGV4KHRoaXMuZGF0YS5sZW5ndGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIHRoZSB0b3RhbCBudW1iZXIgb2Ygbm9kZXMgZm9yIHRoZSBjdXJyZW50IGxldmVsLlxuICAgICAqL1xuICAgIGdldCB0b3RhbE5vZGVzQ291bnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5sb2FkTW9yZVNlcnZpY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRNb3JlU2VydmljZS5nZXRUb3RhbE5vZGVzQ291bnQodGhpcy5wYXJlbnREYXRhSXRlbSwgdGhpcy5fZGF0YS5sZW5ndGgpO1xuICAgIH1cbiAgICBnZXQgaGFzVGVtcGxhdGUoKSB7XG4gICAgICAgIHJldHVybiBpc1ByZXNlbnQodGhpcy5ub2RlVGVtcGxhdGVSZWYpO1xuICAgIH1cbiAgICBleHBhbmROb2RlKGluZGV4LCBkYXRhSXRlbSwgZXhwYW5kKSB7XG4gICAgICAgIGlmIChleHBhbmQpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kU2VydmljZS5leHBhbmQoaW5kZXgsIGRhdGFJdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kU2VydmljZS5jb2xsYXBzZShpbmRleCwgZGF0YUl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNoZWNrTm9kZShpbmRleCkge1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmNoZWNrSW5kZXgoaW5kZXgpO1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmFjdGl2YXRlSW5kZXgoaW5kZXgpO1xuICAgIH1cbiAgICBub2RlSW5kZXgoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhCdWlsZGVyLm5vZGVJbmRleChpbmRleC50b1N0cmluZygpLCB0aGlzLnBhcmVudEluZGV4KTtcbiAgICB9XG4gICAgbm9kZVRleHQoZGF0YUl0ZW0pIHtcbiAgICAgICAgY29uc3QgdGV4dEZpZWxkID0gaXNBcnJheSh0aGlzLnRleHRGaWVsZCkgPyB0aGlzLnRleHRGaWVsZFswXSA6IHRoaXMudGV4dEZpZWxkO1xuICAgICAgICByZXR1cm4gZ2V0dGVyKHRleHRGaWVsZCkoZGF0YUl0ZW0pO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLm5vZGVzU3Vic2NyaXB0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5ub2Rlc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5sb2FkTW9yZU5vZGVzU3Vic2NyaXB0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkTW9yZU5vZGVzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaW5nbGVSZWNvcmRTdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmliZVRvTm9kZXNDaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5zaW5nbGVSZWNvcmRTdWJzY3JpcHRpb25zLmFkZCh0aGlzLmRhdGFDaGFuZ2VOb3RpZmljYXRpb25cbiAgICAgICAgICAgIC5jaGFuZ2VzXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMuc3Vic2NyaWJlVG9Ob2Rlc0NoYW5nZS5iaW5kKHRoaXMpKSk7XG4gICAgICAgIHRoaXMuc2luZ2xlUmVjb3JkU3Vic2NyaXB0aW9ucy5hZGQodGhpcy5uYXZpZ2F0aW9uU2VydmljZS5sb2FkTW9yZVxuICAgICAgICAgICAgLnBpcGUoZmlsdGVyKGluZGV4ID0+IGluZGV4ID09PSB0aGlzLmxvYWRNb3JlQnV0dG9uSW5kZXgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLmxvYWRNb3JlTm9kZXMuYmluZCh0aGlzKSkpO1xuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLnBhcmVudEluZGV4ICYmIHRoaXMubG9hZE9uRGVtYW5kKSB7XG4gICAgICAgICAgICB0aGlzLnNldE5vZGVDaGlsZHJlbih0aGlzLm1hcFRvVHJlZUl0ZW0odGhpcy5kYXRhKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmV0Y2hDaGlsZHJlbihub2RlLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbihub2RlKVxuICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTZXJ2aWNlLm5vdGlmeUxvYWRlZChpbmRleCk7XG4gICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgIH0pLCB0YXAoKCkgPT4gdGhpcy5sb2FkaW5nU2VydmljZS5ub3RpZnlMb2FkZWQoaW5kZXgpKSk7XG4gICAgfVxuICAgIGdldCBuZXh0RmllbGRzKCkge1xuICAgICAgICBpZiAoaXNBcnJheSh0aGlzLnRleHRGaWVsZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHRGaWVsZC5sZW5ndGggPiAxID8gdGhpcy50ZXh0RmllbGQuc2xpY2UoMSkgOiB0aGlzLnRleHRGaWVsZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3RoaXMudGV4dEZpZWxkXTtcbiAgICB9XG4gICAgbG9hZE1vcmVOb2RlcygpIHtcbiAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLmxvYWRNb3JlU2VydmljZS5sb2FkTW9yZU5vZGVzKSkge1xuICAgICAgICAgICAgdGhpcy5mZXRjaE1vcmVOb2RlcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2FkTW9yZUxvY2FsTm9kZXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsb2FkTW9yZUxvY2FsTm9kZXMoKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxMb2FkTW9yZUJ1dHRvbkluZGV4ID0gdGhpcy5sb2FkTW9yZUJ1dHRvbkluZGV4O1xuICAgICAgICB0aGlzLnBhZ2VTaXplICs9IHRoaXMubG9hZE1vcmVTZXJ2aWNlLmdldEluaXRpYWxQYWdlU2l6ZSh0aGlzLnBhcmVudERhdGFJdGVtKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckxvYWRlZE5vZGVzKHRoaXMuZGF0YSk7XG4gICAgICAgIC8vIGZvcmNlcyB0aGUgbmV3IGl0ZW1zIHRvIGJlIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBmb2N1cyBpcyBjaGFuZ2VkXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLnJlc2VsZWN0SXRlbUF0KGluaXRpYWxMb2FkTW9yZUJ1dHRvbkluZGV4KTtcbiAgICB9XG4gICAgZmV0Y2hNb3JlTm9kZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdNb3JlTm9kZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRpbmdNb3JlTm9kZXMgPSB0cnVlO1xuICAgICAgICBpZiAoaXNQcmVzZW50KHRoaXMubG9hZE1vcmVOb2Rlc1N1YnNjcmlwdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZE1vcmVOb2Rlc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZE1vcmVOb2Rlc1N1YnNjcmlwdGlvbiA9IHRoaXMubG9hZE1vcmVTZXJ2aWNlXG4gICAgICAgICAgICAubG9hZE1vcmVOb2Rlcyh7XG4gICAgICAgICAgICBkYXRhSXRlbTogdGhpcy5wYXJlbnREYXRhSXRlbSxcbiAgICAgICAgICAgIHNraXA6IHRoaXMuZGF0YS5sZW5ndGgsXG4gICAgICAgICAgICB0YWtlOiB0aGlzLmxvYWRNb3JlU2VydmljZS5nZXRJbml0aWFsUGFnZVNpemUodGhpcy5wYXJlbnREYXRhSXRlbSlcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+IHRoaXMubG9hZGluZ01vcmVOb2RlcyA9IGZhbHNlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoaXRlbXMgPT4ge1xuICAgICAgICAgICAgaWYgKCEoQXJyYXkuaXNBcnJheShpdGVtcykgJiYgaXRlbXMubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpbml0aWFsTG9hZE1vcmVCdXR0b25JbmRleCA9IHRoaXMubG9hZE1vcmVCdXR0b25JbmRleDtcbiAgICAgICAgICAgIHRoaXMucGFnZVNpemUgKz0gaXRlbXMubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLmNvbmNhdChpdGVtcyk7XG4gICAgICAgICAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pc0FjdGl2ZShpbml0aWFsTG9hZE1vcmVCdXR0b25JbmRleCkpIHtcbiAgICAgICAgICAgICAgICAvLyBmb3JjZXMgdGhlIG5ldyBpdGVtcyB0byBiZSByZWdpc3RlcmVkIGJlZm9yZSB0aGUgZm9jdXMgaXMgY2hhbmdlZFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZWxlY3RJdGVtQXQoaW5pdGlhbExvYWRNb3JlQnV0dG9uSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0Tm9kZUNoaWxkcmVuKGNoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMudHJlZVZpZXdMb29rdXBTZXJ2aWNlLnJlZ2lzdGVyQ2hpbGRyZW4odGhpcy5wYXJlbnRJbmRleCwgY2hpbGRyZW4pO1xuICAgIH1cbiAgICBtYXBUb1RyZWVJdGVtKGRhdGEpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudEluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGEubWFwKChkYXRhSXRlbSwgaWR4KSA9PiAoeyBkYXRhSXRlbSwgaW5kZXg6IHRoaXMubm9kZUluZGV4KGlkeCkgfSkpO1xuICAgIH1cbiAgICBlbWl0Q2hpbGRyZW5Mb2FkZWQoY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudEluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWdub3JlcyB0aGUgcmVnaXN0ZXJlZCBsb2FkLW1vcmUgYnV0dG9uXG4gICAgICAgIGNvbnN0IGNvbnRlbnRDaGlsZHJlbiA9IGNoaWxkcmVuLmZpbHRlcihpdGVtID0+IGl0ZW0uZGF0YUl0ZW0pO1xuICAgICAgICB0aGlzLm5vZGVDaGlsZHJlblNlcnZpY2UuY2hpbGRyZW5Mb2FkZWQoeyBkYXRhSXRlbTogdGhpcy5wYXJlbnREYXRhSXRlbSwgaW5kZXg6IHRoaXMucGFyZW50SW5kZXggfSwgY29udGVudENoaWxkcmVuKTtcbiAgICB9XG4gICAgc3Vic2NyaWJlVG9Ob2Rlc0NoYW5nZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubm9kZXNTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMubm9kZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGVzU3Vic2NyaXB0aW9uID0gdGhpcy5ub2Rlcyh0aGlzLnBhcmVudERhdGFJdGVtLCB0aGlzLnBhcmVudEluZGV4KVxuICAgICAgICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxOb2Rlc0xvYWRlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXNlbGVjdEl0ZW1BdChpbmRleCkge1xuICAgICAgICBpZiAoIWlzUHJlc2VudChpbmRleCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG9sZCBpbmRleCBpcyBjbGVhcmVkIGZpcnN0XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZGVhY3RpdmF0ZSgpO1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmFjdGl2YXRlSW5kZXgoaW5kZXgpO1xuICAgIH1cbiAgICByZWdpc3RlckxvYWRlZE5vZGVzKG5vZGVzID0gW10pIHtcbiAgICAgICAgY29uc3QgbWFwcGVkQ2hpbGRyZW4gPSB0aGlzLm1hcFRvVHJlZUl0ZW0obm9kZXMpO1xuICAgICAgICBpZiAodGhpcy5sb2FkT25EZW1hbmQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Tm9kZUNoaWxkcmVuKG1hcHBlZENoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXRDaGlsZHJlbkxvYWRlZChtYXBwZWRDaGlsZHJlbik7XG4gICAgfVxufTtcbnRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgSG9zdEJpbmRpbmcoXCJjbGFzcy5rLWdyb3VwXCIpLFxuICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEJvb2xlYW4pXG5dLCBUcmVlVmlld0dyb3VwQ29tcG9uZW50LnByb3RvdHlwZSwgXCJrR3JvdXBDbGFzc1wiLCB2b2lkIDApO1xudHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICBIb3N0QmluZGluZyhcImF0dHIucm9sZVwiKSxcbiAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBTdHJpbmcpXG5dLCBUcmVlVmlld0dyb3VwQ29tcG9uZW50LnByb3RvdHlwZSwgXCJyb2xlXCIsIHZvaWQgMCk7XG50c2xpYl8xLl9fZGVjb3JhdGUoW1xuICAgIElucHV0KCksXG4gICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgQm9vbGVhbilcbl0sIFRyZWVWaWV3R3JvdXBDb21wb25lbnQucHJvdG90eXBlLCBcImNoZWNrYm94ZXNcIiwgdm9pZCAwKTtcbnRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgSW5wdXQoKSxcbiAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBCb29sZWFuKVxuXSwgVHJlZVZpZXdHcm91cENvbXBvbmVudC5wcm90b3R5cGUsIFwiZXhwYW5kSWNvbnNcIiwgdm9pZCAwKTtcbnRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgSW5wdXQoKSxcbiAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBCb29sZWFuKVxuXSwgVHJlZVZpZXdHcm91cENvbXBvbmVudC5wcm90b3R5cGUsIFwiZGlzYWJsZWRcIiwgdm9pZCAwKTtcbnRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgSW5wdXQoKSxcbiAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBCb29sZWFuKVxuXSwgVHJlZVZpZXdHcm91cENvbXBvbmVudC5wcm90b3R5cGUsIFwic2VsZWN0YWJsZVwiLCB2b2lkIDApO1xudHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICBJbnB1dCgpLFxuICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEJvb2xlYW4pXG5dLCBUcmVlVmlld0dyb3VwQ29tcG9uZW50LnByb3RvdHlwZSwgXCJ0b3VjaEFjdGlvbnNcIiwgdm9pZCAwKTtcbnRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgSW5wdXQoKSxcbiAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBCb29sZWFuKVxuXSwgVHJlZVZpZXdHcm91cENvbXBvbmVudC5wcm90b3R5cGUsIFwibG9hZE9uRGVtYW5kXCIsIHZvaWQgMCk7XG50c2xpYl8xLl9fZGVjb3JhdGUoW1xuICAgIElucHV0KCksXG4gICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pXG5dLCBUcmVlVmlld0dyb3VwQ29tcG9uZW50LnByb3RvdHlwZSwgXCJ0cmFja0J5XCIsIHZvaWQgMCk7XG50c2xpYl8xLl9fZGVjb3JhdGUoW1xuICAgIElucHV0KCksXG4gICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pXG5dLCBUcmVlVmlld0dyb3VwQ29tcG9uZW50LnByb3RvdHlwZSwgXCJub2Rlc1wiLCB2b2lkIDApO1xudHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICBJbnB1dCgpLFxuICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdClcbl0sIFRyZWVWaWV3R3JvdXBDb21wb25lbnQucHJvdG90eXBlLCBcInRleHRGaWVsZFwiLCB2b2lkIDApO1xudHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICBJbnB1dCgpLFxuICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdClcbl0sIFRyZWVWaWV3R3JvdXBDb21wb25lbnQucHJvdG90eXBlLCBcInBhcmVudERhdGFJdGVtXCIsIHZvaWQgMCk7XG50c2xpYl8xLl9fZGVjb3JhdGUoW1xuICAgIElucHV0KCksXG4gICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgU3RyaW5nKVxuXSwgVHJlZVZpZXdHcm91cENvbXBvbmVudC5wcm90b3R5cGUsIFwicGFyZW50SW5kZXhcIiwgdm9pZCAwKTtcbnRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgSW5wdXQoKSxcbiAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBUZW1wbGF0ZVJlZilcbl0sIFRyZWVWaWV3R3JvdXBDb21wb25lbnQucHJvdG90eXBlLCBcIm5vZGVUZW1wbGF0ZVJlZlwiLCB2b2lkIDApO1xudHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICBJbnB1dCgpLFxuICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIFRlbXBsYXRlUmVmKVxuXSwgVHJlZVZpZXdHcm91cENvbXBvbmVudC5wcm90b3R5cGUsIFwibG9hZE1vcmVCdXR0b25UZW1wbGF0ZVJlZlwiLCB2b2lkIDApO1xudHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICBJbnB1dCgpLFxuICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdClcbl0sIFRyZWVWaWV3R3JvdXBDb21wb25lbnQucHJvdG90eXBlLCBcImxvYWRNb3JlU2VydmljZVwiLCB2b2lkIDApO1xudHNsaWJfMS5fX2RlY29yYXRlKFtcbiAgICBJbnB1dCgpLFxuICAgIHRzbGliXzEuX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKVxuXSwgVHJlZVZpZXdHcm91cENvbXBvbmVudC5wcm90b3R5cGUsIFwiaXNDaGVja2VkXCIsIHZvaWQgMCk7XG50c2xpYl8xLl9fZGVjb3JhdGUoW1xuICAgIElucHV0KCksXG4gICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pXG5dLCBUcmVlVmlld0dyb3VwQ29tcG9uZW50LnByb3RvdHlwZSwgXCJpc0Rpc2FibGVkXCIsIHZvaWQgMCk7XG50c2xpYl8xLl9fZGVjb3JhdGUoW1xuICAgIElucHV0KCksXG4gICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pXG5dLCBUcmVlVmlld0dyb3VwQ29tcG9uZW50LnByb3RvdHlwZSwgXCJpc0V4cGFuZGVkXCIsIHZvaWQgMCk7XG50c2xpYl8xLl9fZGVjb3JhdGUoW1xuICAgIElucHV0KCksXG4gICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pXG5dLCBUcmVlVmlld0dyb3VwQ29tcG9uZW50LnByb3RvdHlwZSwgXCJpc1Zpc2libGVcIiwgdm9pZCAwKTtcbnRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgSW5wdXQoKSxcbiAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbilcbl0sIFRyZWVWaWV3R3JvdXBDb21wb25lbnQucHJvdG90eXBlLCBcImlzU2VsZWN0ZWRcIiwgdm9pZCAwKTtcbnRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgSW5wdXQoKSxcbiAgICB0c2xpYl8xLl9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbilcbl0sIFRyZWVWaWV3R3JvdXBDb21wb25lbnQucHJvdG90eXBlLCBcImNoaWxkcmVuXCIsIHZvaWQgMCk7XG50c2xpYl8xLl9fZGVjb3JhdGUoW1xuICAgIElucHV0KCksXG4gICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pXG5dLCBUcmVlVmlld0dyb3VwQ29tcG9uZW50LnByb3RvdHlwZSwgXCJoYXNDaGlsZHJlblwiLCB2b2lkIDApO1xuVHJlZVZpZXdHcm91cENvbXBvbmVudCA9IHRzbGliXzEuX19kZWNvcmF0ZShbXG4gICAgQ29tcG9uZW50KHtcbiAgICAgICAgYW5pbWF0aW9uczogW1xuICAgICAgICAgICAgdHJpZ2dlcigndG9nZ2xlJywgW1xuICAgICAgICAgICAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gKicsIFtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUoeyBoZWlnaHQ6IDAgfSksXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGUoJzAuMXMgZWFzZS1pbicsIHN0eWxlKHsgaGVpZ2h0OiBcIipcIiB9KSlcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uKCcqID0+IHZvaWQnLCBbXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlKHsgaGVpZ2h0OiBcIipcIiB9KSxcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZSgnMC4xcyBlYXNlLWluJywgc3R5bGUoeyBoZWlnaHQ6IDAgfSkpXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIF0pXG4gICAgICAgIF0sXG4gICAgICAgIHNlbGVjdG9yOiAnW2tlbmRvVHJlZVZpZXdHcm91cF0nLFxuICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bGlcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBub2RlIG9mIGRhdGE7IGxldCBpbmRleCA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5XCJcbiAgICAgICAgICAgIGNsYXNzPVwiay1pdGVtIGstdHJlZXZpZXctaXRlbVwiXG4gICAgICAgICAgICBbY2xhc3Muay1kaXNwbGF5LW5vbmVdPVwiIWlzVmlzaWJsZShub2RlLCBub2RlSW5kZXgoaW5kZXgpKVwiXG4gICAgICAgICAgICBrZW5kb1RyZWVWaWV3SXRlbVxuICAgICAgICAgICAgW2F0dHIuYXJpYS1zZXRzaXplXT1cInRvdGFsTm9kZXNDb3VudFwiXG4gICAgICAgICAgICBbZGF0YUl0ZW1dPVwibm9kZVwiXG4gICAgICAgICAgICBbaW5kZXhdPVwibm9kZUluZGV4KGluZGV4KVwiXG4gICAgICAgICAgICBbcGFyZW50RGF0YUl0ZW1dPVwicGFyZW50RGF0YUl0ZW1cIlxuICAgICAgICAgICAgW3BhcmVudEluZGV4XT1cInBhcmVudEluZGV4XCJcbiAgICAgICAgICAgIFtsb2FkT25EZW1hbmRdPVwibG9hZE9uRGVtYW5kXCJcbiAgICAgICAgICAgIFtjaGVja2FibGVdPVwiY2hlY2tib3hlc1wiXG4gICAgICAgICAgICBbaXNDaGVja2VkXT1cImlzQ2hlY2tlZChub2RlLCBub2RlSW5kZXgoaW5kZXgpKVwiXG4gICAgICAgICAgICBbaXNEaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBpc0Rpc2FibGVkKG5vZGUsIG5vZGVJbmRleChpbmRleCkpXCJcbiAgICAgICAgICAgIFtpc1Zpc2libGVdPVwiaXNWaXNpYmxlKG5vZGUsIG5vZGVJbmRleChpbmRleCkpXCJcbiAgICAgICAgICAgIFtleHBhbmRhYmxlXT1cImV4cGFuZEljb25zICYmIGhhc0NoaWxkcmVuKG5vZGUpXCJcbiAgICAgICAgICAgIFtpc0V4cGFuZGVkXT1cImlzRXhwYW5kZWQobm9kZSwgbm9kZUluZGV4KGluZGV4KSlcIlxuICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXG4gICAgICAgICAgICBbaXNTZWxlY3RlZF09XCJpc1NlbGVjdGVkKG5vZGUsIG5vZGVJbmRleChpbmRleCkpXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdHJlZWluZGV4XT1cIm5vZGVJbmRleChpbmRleClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiay1taWRcIj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImstaWNvblwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5rLWktY29sbGFwc2VdPVwiaXNFeHBhbmRlZChub2RlLCBub2RlSW5kZXgoaW5kZXgpKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5rLWktZXhwYW5kXT1cIiFpc0V4cGFuZGVkKG5vZGUsIG5vZGVJbmRleChpbmRleCkpXCJcbiAgICAgICAgICAgICAgICAgICAgW2tlbmRvVHJlZVZpZXdMb2FkaW5nXT1cIm5vZGVJbmRleChpbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwYW5kTm9kZShub2RlSW5kZXgoaW5kZXgpLCBub2RlLCAhaXNFeHBhbmRlZChub2RlLCBub2RlSW5kZXgoaW5kZXgpKSlcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImV4cGFuZEljb25zICYmIGhhc0NoaWxkcmVuKG5vZGUpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxrZW5kby1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNoZWNrYm94ZXNcIlxuICAgICAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgICAgICAgW2luZGV4XT1cIm5vZGVJbmRleChpbmRleClcIlxuICAgICAgICAgICAgICAgICAgICBbaXNDaGVja2VkXT1cImlzQ2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjaGVja1N0YXRlQ2hhbmdlKT1cImNoZWNrTm9kZShub2RlSW5kZXgoaW5kZXgpKVwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgID48L2tlbmRvLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDxzcGFuIGtlbmRvVHJlZVZpZXdJdGVtQ29udGVudFxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRyZWVpbmRleF09XCJub2RlSW5kZXgoaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFJdGVtXT1cIm5vZGVcIlxuICAgICAgICAgICAgICAgICAgICBbaW5kZXhdPVwibm9kZUluZGV4KGluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgIFtpbml0aWFsU2VsZWN0aW9uXT1cImlzU2VsZWN0ZWQobm9kZSwgbm9kZUluZGV4KGluZGV4KSlcIlxuICAgICAgICAgICAgICAgICAgICBbaXNTZWxlY3RlZF09XCJpc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJrLWluXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnRvdWNoLWFjdGlvbl09XCJ0b3VjaEFjdGlvbnMgPyAnJyA6ICdub25lJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJoYXNUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJub2RlVGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBub2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IG5vZGVJbmRleChpbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e25vZGVUZXh0KG5vZGUpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNFeHBhbmRlZChub2RlLCBub2RlSW5kZXgoaW5kZXgpKSAmJiBoYXNDaGlsZHJlbihub2RlKVwiXG4gICAgICAgICAgICAgICAga2VuZG9UcmVlVmlld0dyb3VwXG4gICAgICAgICAgICAgICAgcm9sZT1cImdyb3VwXCJcbiAgICAgICAgICAgICAgICBbbm9kZXNdPVwiZmV0Y2hDaGlsZHJlblwiXG4gICAgICAgICAgICAgICAgW2xvYWRPbkRlbWFuZF09XCJsb2FkT25EZW1hbmRcIlxuICAgICAgICAgICAgICAgIFtjaGVja2JveGVzXT1cImNoZWNrYm94ZXNcIlxuICAgICAgICAgICAgICAgIFtleHBhbmRJY29uc109XCJleHBhbmRJY29uc1wiXG4gICAgICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXG4gICAgICAgICAgICAgICAgW3RvdWNoQWN0aW9uc109XCJ0b3VjaEFjdGlvbnNcIlxuICAgICAgICAgICAgICAgIFtjaGlsZHJlbl09XCJjaGlsZHJlblwiXG4gICAgICAgICAgICAgICAgW2hhc0NoaWxkcmVuXT1cImhhc0NoaWxkcmVuXCJcbiAgICAgICAgICAgICAgICBbaXNDaGVja2VkXT1cImlzQ2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgW2lzRGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IGlzRGlzYWJsZWQobm9kZSwgbm9kZUluZGV4KGluZGV4KSlcIlxuICAgICAgICAgICAgICAgIFtpc0V4cGFuZGVkXT1cImlzRXhwYW5kZWRcIlxuICAgICAgICAgICAgICAgIFtpc1NlbGVjdGVkXT1cImlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtpc1Zpc2libGVdPVwiaXNWaXNpYmxlXCJcbiAgICAgICAgICAgICAgICBbbm9kZVRlbXBsYXRlUmVmXT1cIm5vZGVUZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAgW2xvYWRNb3JlQnV0dG9uVGVtcGxhdGVSZWZdPVwibG9hZE1vcmVCdXR0b25UZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAgW3BhcmVudEluZGV4XT1cIm5vZGVJbmRleChpbmRleClcIlxuICAgICAgICAgICAgICAgIFtwYXJlbnREYXRhSXRlbV09XCJub2RlXCJcbiAgICAgICAgICAgICAgICBbdGV4dEZpZWxkXT1cIm5leHRGaWVsZHNcIlxuICAgICAgICAgICAgICAgIFtsb2FkTW9yZVNlcnZpY2VdPVwibG9hZE1vcmVTZXJ2aWNlXCJcbiAgICAgICAgICAgICAgICBbQHRvZ2dsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbdHJhY2tCeV09XCJ0cmFja0J5XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaVxuICAgICAgICAgICAgKm5nSWY9XCJpbml0aWFsTm9kZXNMb2FkZWQgJiYgbW9yZU5vZGVzQXZhaWxhYmxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiay1pdGVtIGstdHJlZXZpZXctaXRlbVwiXG4gICAgICAgICAgICBbY2xhc3Muay10cmVldmlldy1sb2FkLW1vcmUtY2hlY2tib3hlcy1jb250YWluZXJdPVwiY2hlY2tib3hlc1wiXG4gICAgICAgICAgICBrZW5kb1RyZWVWaWV3SXRlbVxuICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbc2VsZWN0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICBbY2hlY2thYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtleHBhbmRhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtpbmRleF09XCJsb2FkTW9yZUJ1dHRvbkluZGV4XCJcbiAgICAgICAgICAgIFtwYXJlbnREYXRhSXRlbV09XCJwYXJlbnREYXRhSXRlbVwiXG4gICAgICAgICAgICBbcGFyZW50SW5kZXhdPVwicGFyZW50SW5kZXhcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10cmVlaW5kZXhdPVwibG9hZE1vcmVCdXR0b25JbmRleFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrLW1pZFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibG9hZGluZ01vcmVOb2Rlc1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiay1pY29uIGstaS1sb2FkaW5nIGstaS1leHBhbmRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJrLWluIGstdHJlZXZpZXctbG9hZC1tb3JlLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdHJlZWluZGV4XT1cImxvYWRNb3JlQnV0dG9uSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBrZW5kb1RyZWVWaWV3SXRlbUNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgW2luZGV4XT1cImxvYWRNb3JlQnV0dG9uSW5kZXhcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImxvYWRNb3JlQnV0dG9uVGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibG9hZE1vcmVCdXR0b25UZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBsb2FkTW9yZUJ1dHRvbkluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRNb3JlQnV0dG9uVGVtcGxhdGVSZWZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIExvYWQgbW9yZVxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9saT5cbiAgICBgXG4gICAgfSksXG4gICAgdHNsaWJfMS5fX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW0V4cGFuZFN0YXRlU2VydmljZSxcbiAgICAgICAgTG9hZGluZ05vdGlmaWNhdGlvblNlcnZpY2UsXG4gICAgICAgIEluZGV4QnVpbGRlclNlcnZpY2UsXG4gICAgICAgIFRyZWVWaWV3TG9va3VwU2VydmljZSxcbiAgICAgICAgTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgICAgIE5vZGVDaGlsZHJlblNlcnZpY2UsXG4gICAgICAgIERhdGFDaGFuZ2VOb3RpZmljYXRpb25TZXJ2aWNlLFxuICAgICAgICBDaGFuZ2VEZXRlY3RvclJlZl0pXG5dLCBUcmVlVmlld0dyb3VwQ29tcG9uZW50KTtcbmV4cG9ydCB7IFRyZWVWaWV3R3JvdXBDb21wb25lbnQgfTtcbiJdfQ==