UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

693 lines 57.8 kB
/** * @fileoverview added by tsickle * Generated from: tree-node.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { __decorate, __metadata } from "tslib"; /** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Host, Input, NgZone, Optional, Output, Renderer2, TemplateRef } from '@angular/core'; import { NzNoAnimationDirective } from 'ng-zorro-antd/core/no-animation'; import { NzTreeBaseService, NzTreeNode } from 'ng-zorro-antd/core/tree'; import { InputBoolean } from 'ng-zorro-antd/core/util'; import { fromEvent, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; export class NzTreeNodeComponent { /** * @param {?} nzTreeService * @param {?} ngZone * @param {?} renderer * @param {?} elementRef * @param {?} cdr * @param {?=} noAnimation */ constructor(nzTreeService, ngZone, renderer, elementRef, cdr, noAnimation) { this.nzTreeService = nzTreeService; this.ngZone = ngZone; this.renderer = renderer; this.elementRef = elementRef; this.cdr = cdr; this.noAnimation = noAnimation; /** * for global property */ this.icon = ''; this.title = ''; this.isLoading = false; this.isSelected = false; this.isDisabled = false; this.isMatched = false; this.nzHideUnMatched = false; this.nzNoAnimation = false; this.nzSelectMode = false; this.nzShowIcon = false; this.nzTreeTemplate = null; this.nzSearchValue = ''; this.nzDraggable = false; this.nzClick = new EventEmitter(); this.nzDblClick = new EventEmitter(); this.nzContextMenu = new EventEmitter(); this.nzCheckBoxChange = new EventEmitter(); this.nzExpandChange = new EventEmitter(); this.nzOnDragStart = new EventEmitter(); this.nzOnDragEnter = new EventEmitter(); this.nzOnDragOver = new EventEmitter(); this.nzOnDragLeave = new EventEmitter(); this.nzOnDrop = new EventEmitter(); this.nzOnDragEnd = new EventEmitter(); /** * drag var */ this.destroy$ = new Subject(); this.dragPos = 2; this.dragPosClass = { '0': 'drag-over', '1': 'drag-over-gap-bottom', '-1': 'drag-over-gap-top' }; } /** * default set * @return {?} */ get displayStyle() { // to hide unmatched nodes return this.nzSearchValue && this.nzHideUnMatched && !this.isMatched && !this.isExpanded && this.canHide ? 'none' : ''; } /** * @return {?} */ get isSwitcherOpen() { return this.isExpanded && !this.isLeaf; } /** * @return {?} */ get isSwitcherClose() { return !this.isExpanded && !this.isLeaf; } /** * @param {?} event * @return {?} */ onMousedown(event) { if (this.nzSelectMode) { event.preventDefault(); } } /** * collapse node * @param {?} event * @return {?} */ clickExpand(event) { event.preventDefault(); if (!this.isLoading && !this.isLeaf) { // set async state if (this.nzAsyncData && this.nzTreeNode.children.length === 0 && !this.isExpanded) { this.nzTreeNode.isLoading = true; } this.nzTreeNode.setExpanded(!this.isExpanded); } this.nzTreeService.setExpandedNodeList(this.nzTreeNode); /** @type {?} */ const eventNext = this.nzTreeService.formatEvent('expand', this.nzTreeNode, event); this.nzExpandChange.emit(eventNext); } /** * @param {?} event * @return {?} */ clickSelect(event) { event.preventDefault(); if (this.isSelectable && !this.isDisabled) { this.nzTreeNode.isSelected = !this.nzTreeNode.isSelected; } this.nzTreeService.setSelectedNodeList(this.nzTreeNode); /** @type {?} */ const eventNext = this.nzTreeService.formatEvent('click', this.nzTreeNode, event); this.nzClick.emit(eventNext); } /** * @param {?} event * @return {?} */ dblClick(event) { event.preventDefault(); /** @type {?} */ const eventNext = this.nzTreeService.formatEvent('dblclick', this.nzTreeNode, event); this.nzDblClick.emit(eventNext); } /** * @param {?} event * @return {?} */ contextMenu(event) { event.preventDefault(); /** @type {?} */ const eventNext = this.nzTreeService.formatEvent('contextmenu', this.nzTreeNode, event); this.nzContextMenu.emit(eventNext); } /** * check node * @param {?} event * @return {?} */ clickCheckBox(event) { event.preventDefault(); // return if node is disabled if (this.isDisabled || this.isDisableCheckbox) { return; } this.nzTreeNode.isChecked = !this.nzTreeNode.isChecked; this.nzTreeNode.isHalfChecked = false; this.nzTreeService.setCheckedNodeList(this.nzTreeNode); /** @type {?} */ const eventNext = this.nzTreeService.formatEvent('check', this.nzTreeNode, event); this.nzCheckBoxChange.emit(eventNext); } /** * @return {?} */ clearDragClass() { /** @type {?} */ const dragClass = ['drag-over-gap-top', 'drag-over-gap-bottom', 'drag-over']; dragClass.forEach((/** * @param {?} e * @return {?} */ e => { this.renderer.removeClass(this.elementRef.nativeElement, e); })); } /** * drag event * @param {?} e * @return {?} */ handleDragStart(e) { try { // ie throw error // firefox-need-it (/** @type {?} */ (e.dataTransfer)).setData('text/plain', (/** @type {?} */ (this.nzTreeNode.key))); } catch (error) { // empty } this.nzTreeService.setSelectedNode(this.nzTreeNode); /** @type {?} */ const eventNext = this.nzTreeService.formatEvent('dragstart', this.nzTreeNode, e); this.nzOnDragStart.emit(eventNext); } /** * @param {?} e * @return {?} */ handleDragEnter(e) { e.preventDefault(); // reset position this.dragPos = 2; this.ngZone.run((/** * @return {?} */ () => { /** @type {?} */ const eventNext = this.nzTreeService.formatEvent('dragenter', this.nzTreeNode, e); this.nzOnDragEnter.emit(eventNext); })); } /** * @param {?} e * @return {?} */ handleDragOver(e) { e.preventDefault(); /** @type {?} */ const dropPosition = this.nzTreeService.calcDropPosition(e); if (this.dragPos !== dropPosition) { this.clearDragClass(); this.dragPos = dropPosition; // leaf node will pass if (!(this.dragPos === 0 && this.isLeaf)) { this.renderer.addClass(this.elementRef.nativeElement, this.dragPosClass[this.dragPos]); } } /** @type {?} */ const eventNext = this.nzTreeService.formatEvent('dragover', this.nzTreeNode, e); this.nzOnDragOver.emit(eventNext); } /** * @param {?} e * @return {?} */ handleDragLeave(e) { e.preventDefault(); this.clearDragClass(); /** @type {?} */ const eventNext = this.nzTreeService.formatEvent('dragleave', this.nzTreeNode, e); this.nzOnDragLeave.emit(eventNext); } /** * @param {?} e * @return {?} */ handleDragDrop(e) { this.ngZone.run((/** * @return {?} */ () => { this.clearDragClass(); /** @type {?} */ const node = this.nzTreeService.getSelectedNode(); if (!node || (node && node.key === this.nzTreeNode.key) || (this.dragPos === 0 && this.isLeaf)) { return; } // pass if node is leafNo /** @type {?} */ const dropEvent = this.nzTreeService.formatEvent('drop', this.nzTreeNode, e); /** @type {?} */ const dragEndEvent = this.nzTreeService.formatEvent('dragend', this.nzTreeNode, e); if (this.nzBeforeDrop) { this.nzBeforeDrop({ dragNode: (/** @type {?} */ (this.nzTreeService.getSelectedNode())), node: this.nzTreeNode, pos: this.dragPos }).subscribe((/** * @param {?} canDrop * @return {?} */ (canDrop) => { if (canDrop) { this.nzTreeService.dropAndApply(this.nzTreeNode, this.dragPos); } this.nzOnDrop.emit(dropEvent); this.nzOnDragEnd.emit(dragEndEvent); })); } else if (this.nzTreeNode) { this.nzTreeService.dropAndApply(this.nzTreeNode, this.dragPos); this.nzOnDrop.emit(dropEvent); } })); } /** * @param {?} e * @return {?} */ handleDragEnd(e) { e.preventDefault(); this.ngZone.run((/** * @return {?} */ () => { // if user do not custom beforeDrop if (!this.nzBeforeDrop) { /** @type {?} */ const eventNext = this.nzTreeService.formatEvent('dragend', this.nzTreeNode, e); this.nzOnDragEnd.emit(eventNext); } })); } /** * Listening to dragging events. * @return {?} */ handDragEvent() { this.ngZone.runOutsideAngular((/** * @return {?} */ () => { if (this.nzDraggable) { /** @type {?} */ const nativeElement = this.elementRef.nativeElement; this.destroy$ = new Subject(); fromEvent(nativeElement, 'dragstart') .pipe(takeUntil(this.destroy$)) .subscribe((/** * @param {?} e * @return {?} */ (e) => this.handleDragStart(e))); fromEvent(nativeElement, 'dragenter') .pipe(takeUntil(this.destroy$)) .subscribe((/** * @param {?} e * @return {?} */ (e) => this.handleDragEnter(e))); fromEvent(nativeElement, 'dragover') .pipe(takeUntil(this.destroy$)) .subscribe((/** * @param {?} e * @return {?} */ (e) => this.handleDragOver(e))); fromEvent(nativeElement, 'dragleave') .pipe(takeUntil(this.destroy$)) .subscribe((/** * @param {?} e * @return {?} */ (e) => this.handleDragLeave(e))); fromEvent(nativeElement, 'drop') .pipe(takeUntil(this.destroy$)) .subscribe((/** * @param {?} e * @return {?} */ (e) => this.handleDragDrop(e))); fromEvent(nativeElement, 'dragend') .pipe(takeUntil(this.destroy$)) .subscribe((/** * @param {?} e * @return {?} */ (e) => this.handleDragEnd(e))); } else { this.destroy$.next(); this.destroy$.complete(); } })); } /** * @return {?} */ markForCheck() { this.cdr.markForCheck(); } /** * @return {?} */ ngOnInit() { this.nzTreeNode.component = this; } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { const { nzDraggable } = changes; if (nzDraggable) { this.handDragEvent(); } } /** * @return {?} */ ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } } NzTreeNodeComponent.decorators = [ { type: Component, args: [{ selector: 'nz-tree-node', exportAs: 'nzTreeNode', template: ` <nz-tree-indent [nzTreeLevel]="nzTreeNode.level" [nzSelectMode]="nzSelectMode" [nzIsStart]="isStart" [nzIsEnd]="isEnd"></nz-tree-indent> <nz-tree-node-switcher *ngIf="nzShowExpand" [nzShowExpand]="nzShowExpand" [nzShowLine]="nzShowLine" [nzExpandedIcon]="nzExpandedIcon" [nzSelectMode]="nzSelectMode" [context]="nzTreeNode" [isLeaf]="isLeaf" [isExpanded]="isExpanded" [isLoading]="isLoading" (click)="clickExpand($event)" ></nz-tree-node-switcher> <nz-tree-node-checkbox *ngIf="nzCheckable" (click)="clickCheckBox($event)" [nzSelectMode]="nzSelectMode" [isChecked]="isChecked" [isHalfChecked]="isHalfChecked" [isDisabled]="isDisabled" [isDisableCheckbox]="isDisableCheckbox" ></nz-tree-node-checkbox> <nz-tree-node-title [icon]="icon" [title]="title" [isLoading]="isLoading" [isSelected]="isSelected" [isDisabled]="isDisabled" [isMatched]="isMatched" [isExpanded]="isExpanded" [isLeaf]="isLeaf" [searchValue]="nzSearchValue" [treeTemplate]="nzTreeTemplate" [draggable]="nzDraggable" [showIcon]="nzShowIcon" [selectMode]="nzSelectMode" [context]="nzTreeNode" (dblclick)="dblClick($event)" (click)="clickSelect($event)" (contextmenu)="contextMenu($event)" ></nz-tree-node-title> `, changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, host: { '[class.ant-select-tree-treenode]': `nzSelectMode`, '[class.ant-select-tree-treenode-disabled]': `nzSelectMode && isDisabled`, '[class.ant-select-tree-treenode-switcher-open]': `nzSelectMode && isSwitcherOpen`, '[class.ant-select-tree-treenode-switcher-close]': `nzSelectMode && isSwitcherClose`, '[class.ant-select-tree-treenode-checkbox-checked]': `nzSelectMode && isChecked`, '[class.ant-select-tree-treenode-checkbox-indeterminate]': `nzSelectMode && isHalfChecked`, '[class.ant-select-tree-treenode-selected]': `nzSelectMode && isSelected`, '[class.ant-select-tree-treenode-loading]': `nzSelectMode && isLoading`, '[class.ant-tree-treenode]': `!nzSelectMode`, '[class.ant-tree-treenode-disabled]': `!nzSelectMode && isDisabled`, '[class.ant-tree-treenode-switcher-open]': `!nzSelectMode && isSwitcherOpen`, '[class.ant-tree-treenode-switcher-close]': `!nzSelectMode && isSwitcherClose`, '[class.ant-tree-treenode-checkbox-checked]': `!nzSelectMode && isChecked`, '[class.ant-tree-treenode-checkbox-indeterminate]': `!nzSelectMode && isHalfChecked`, '[class.ant-tree-treenode-selected]': `!nzSelectMode && isSelected`, '[class.ant-tree-treenode-loading]': `!nzSelectMode && isLoading`, '[style.display]': 'displayStyle', '(mousedown)': 'onMousedown($event)' } }] } ]; /** @nocollapse */ NzTreeNodeComponent.ctorParameters = () => [ { type: NzTreeBaseService }, { type: NgZone }, { type: Renderer2 }, { type: ElementRef }, { type: ChangeDetectorRef }, { type: NzNoAnimationDirective, decorators: [{ type: Host }, { type: Optional }] } ]; NzTreeNodeComponent.propDecorators = { icon: [{ type: Input }], title: [{ type: Input }], isLoading: [{ type: Input }], isSelected: [{ type: Input }], isDisabled: [{ type: Input }], isMatched: [{ type: Input }], isExpanded: [{ type: Input }], isLeaf: [{ type: Input }], isChecked: [{ type: Input }], isHalfChecked: [{ type: Input }], isDisableCheckbox: [{ type: Input }], isSelectable: [{ type: Input }], canHide: [{ type: Input }], isStart: [{ type: Input }], isEnd: [{ type: Input }], nzTreeNode: [{ type: Input }], nzShowLine: [{ type: Input }], nzShowExpand: [{ type: Input }], nzCheckable: [{ type: Input }], nzAsyncData: [{ type: Input }], nzHideUnMatched: [{ type: Input }], nzNoAnimation: [{ type: Input }], nzSelectMode: [{ type: Input }], nzShowIcon: [{ type: Input }], nzExpandedIcon: [{ type: Input }], nzTreeTemplate: [{ type: Input }], nzBeforeDrop: [{ type: Input }], nzSearchValue: [{ type: Input }], nzDraggable: [{ type: Input }], nzClick: [{ type: Output }], nzDblClick: [{ type: Output }], nzContextMenu: [{ type: Output }], nzCheckBoxChange: [{ type: Output }], nzExpandChange: [{ type: Output }], nzOnDragStart: [{ type: Output }], nzOnDragEnter: [{ type: Output }], nzOnDragOver: [{ type: Output }], nzOnDragLeave: [{ type: Output }], nzOnDrop: [{ type: Output }], nzOnDragEnd: [{ type: Output }] }; __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzTreeNodeComponent.prototype, "nzShowLine", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzTreeNodeComponent.prototype, "nzShowExpand", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzTreeNodeComponent.prototype, "nzCheckable", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzTreeNodeComponent.prototype, "nzAsyncData", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTreeNodeComponent.prototype, "nzHideUnMatched", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTreeNodeComponent.prototype, "nzNoAnimation", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTreeNodeComponent.prototype, "nzSelectMode", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTreeNodeComponent.prototype, "nzShowIcon", void 0); if (false) { /** @type {?} */ NzTreeNodeComponent.ngAcceptInputType_nzShowLine; /** @type {?} */ NzTreeNodeComponent.ngAcceptInputType_nzShowExpand; /** @type {?} */ NzTreeNodeComponent.ngAcceptInputType_nzCheckable; /** @type {?} */ NzTreeNodeComponent.ngAcceptInputType_nzAsyncData; /** @type {?} */ NzTreeNodeComponent.ngAcceptInputType_nzHideUnMatched; /** @type {?} */ NzTreeNodeComponent.ngAcceptInputType_nzNoAnimation; /** @type {?} */ NzTreeNodeComponent.ngAcceptInputType_nzSelectMode; /** @type {?} */ NzTreeNodeComponent.ngAcceptInputType_nzShowIcon; /** * for global property * @type {?} */ NzTreeNodeComponent.prototype.icon; /** @type {?} */ NzTreeNodeComponent.prototype.title; /** @type {?} */ NzTreeNodeComponent.prototype.isLoading; /** @type {?} */ NzTreeNodeComponent.prototype.isSelected; /** @type {?} */ NzTreeNodeComponent.prototype.isDisabled; /** @type {?} */ NzTreeNodeComponent.prototype.isMatched; /** @type {?} */ NzTreeNodeComponent.prototype.isExpanded; /** @type {?} */ NzTreeNodeComponent.prototype.isLeaf; /** @type {?} */ NzTreeNodeComponent.prototype.isChecked; /** @type {?} */ NzTreeNodeComponent.prototype.isHalfChecked; /** @type {?} */ NzTreeNodeComponent.prototype.isDisableCheckbox; /** @type {?} */ NzTreeNodeComponent.prototype.isSelectable; /** @type {?} */ NzTreeNodeComponent.prototype.canHide; /** @type {?} */ NzTreeNodeComponent.prototype.isStart; /** @type {?} */ NzTreeNodeComponent.prototype.isEnd; /** @type {?} */ NzTreeNodeComponent.prototype.nzTreeNode; /** @type {?} */ NzTreeNodeComponent.prototype.nzShowLine; /** @type {?} */ NzTreeNodeComponent.prototype.nzShowExpand; /** @type {?} */ NzTreeNodeComponent.prototype.nzCheckable; /** @type {?} */ NzTreeNodeComponent.prototype.nzAsyncData; /** @type {?} */ NzTreeNodeComponent.prototype.nzHideUnMatched; /** @type {?} */ NzTreeNodeComponent.prototype.nzNoAnimation; /** @type {?} */ NzTreeNodeComponent.prototype.nzSelectMode; /** @type {?} */ NzTreeNodeComponent.prototype.nzShowIcon; /** @type {?} */ NzTreeNodeComponent.prototype.nzExpandedIcon; /** @type {?} */ NzTreeNodeComponent.prototype.nzTreeTemplate; /** @type {?} */ NzTreeNodeComponent.prototype.nzBeforeDrop; /** @type {?} */ NzTreeNodeComponent.prototype.nzSearchValue; /** @type {?} */ NzTreeNodeComponent.prototype.nzDraggable; /** @type {?} */ NzTreeNodeComponent.prototype.nzClick; /** @type {?} */ NzTreeNodeComponent.prototype.nzDblClick; /** @type {?} */ NzTreeNodeComponent.prototype.nzContextMenu; /** @type {?} */ NzTreeNodeComponent.prototype.nzCheckBoxChange; /** @type {?} */ NzTreeNodeComponent.prototype.nzExpandChange; /** @type {?} */ NzTreeNodeComponent.prototype.nzOnDragStart; /** @type {?} */ NzTreeNodeComponent.prototype.nzOnDragEnter; /** @type {?} */ NzTreeNodeComponent.prototype.nzOnDragOver; /** @type {?} */ NzTreeNodeComponent.prototype.nzOnDragLeave; /** @type {?} */ NzTreeNodeComponent.prototype.nzOnDrop; /** @type {?} */ NzTreeNodeComponent.prototype.nzOnDragEnd; /** * drag var * @type {?} */ NzTreeNodeComponent.prototype.destroy$; /** @type {?} */ NzTreeNodeComponent.prototype.dragPos; /** @type {?} */ NzTreeNodeComponent.prototype.dragPosClass; /** @type {?} */ NzTreeNodeComponent.prototype.nzTreeService; /** * @type {?} * @private */ NzTreeNodeComponent.prototype.ngZone; /** * @type {?} * @private */ NzTreeNodeComponent.prototype.renderer; /** * @type {?} * @private */ NzTreeNodeComponent.prototype.elementRef; /** * @type {?} * @private */ NzTreeNodeComponent.prototype.cdr; /** @type {?} */ NzTreeNodeComponent.prototype.noAnimation; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1ub2RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQvdHJlZS8iLCJzb3VyY2VzIjpbInRyZWUtbm9kZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUtBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLElBQUksRUFDSixLQUFLLEVBQ0wsTUFBTSxFQUlOLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUVULFdBQVcsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6RSxPQUFPLEVBQThDLGlCQUFpQixFQUFFLFVBQVUsRUFBcUIsTUFBTSx5QkFBeUIsQ0FBQztBQUV2SSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBdUUzQyxNQUFNLE9BQU8sbUJBQW1COzs7Ozs7Ozs7SUFxUjlCLFlBQ1MsYUFBZ0MsRUFDL0IsTUFBYyxFQUNkLFFBQW1CLEVBQ25CLFVBQXNCLEVBQ3RCLEdBQXNCLEVBQ0gsV0FBb0M7UUFMeEQsa0JBQWEsR0FBYixhQUFhLENBQW1CO1FBQy9CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDSCxnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7Ozs7UUE5UXhELFNBQUksR0FBVyxFQUFFLENBQUM7UUFDbEIsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUNuQixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBZVgsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQyxtQkFBYyxHQUE2RSxJQUFJLENBQUM7UUFFaEcsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDbkIsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDbkIsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBQ2hELGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztRQUNuRCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBQ3RELHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBQ3pELG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFDdkQsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztRQUN0RCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBQ3RELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFDckQsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztRQUN0RCxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFDakQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQzs7OztRQUt2RSxhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN6QixZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ1osaUJBQVksR0FBOEI7WUFDeEMsR0FBRyxFQUFFLFdBQVc7WUFDaEIsR0FBRyxFQUFFLHNCQUFzQjtZQUMzQixJQUFJLEVBQUUsbUJBQW1CO1NBQzFCLENBQUM7SUE2TkMsQ0FBQzs7Ozs7SUF4TkosSUFBSSxZQUFZO1FBQ2QsMEJBQTBCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDekgsQ0FBQzs7OztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3pDLENBQUM7Ozs7SUFFRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzFDLENBQUM7Ozs7O0lBRUQsV0FBVyxDQUFDLEtBQWlCO1FBQzNCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDOzs7Ozs7SUFNRCxXQUFXLENBQUMsS0FBaUI7UUFDM0IsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNuQyxrQkFBa0I7WUFDbEIsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNqRixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7YUFDbEM7WUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMvQztRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDOztjQUNsRCxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Ozs7O0lBRUQsV0FBVyxDQUFDLEtBQWlCO1FBQzNCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7U0FDMUQ7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzs7Y0FDbEQsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQztRQUNqRixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQixDQUFDOzs7OztJQUVELFFBQVEsQ0FBQyxLQUFpQjtRQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7O2NBQ2pCLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUM7UUFDcEYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEMsQ0FBQzs7Ozs7SUFFRCxXQUFXLENBQUMsS0FBaUI7UUFDM0IsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDOztjQUNqQixTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Ozs7OztJQU1ELGFBQWEsQ0FBQyxLQUFpQjtRQUM3QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsNkJBQTZCO1FBQzdCLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDN0MsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7O2NBQ2pELFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUM7UUFDakYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN4QyxDQUFDOzs7O0lBRUQsY0FBYzs7Y0FDTixTQUFTLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBRSxXQUFXLENBQUM7UUFDNUUsU0FBUyxDQUFDLE9BQU87Ozs7UUFBQyxDQUFDLENBQUMsRUFBRTtZQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5RCxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7OztJQU1ELGVBQWUsQ0FBQyxDQUFZO1FBQzFCLElBQUk7WUFDRixpQkFBaUI7WUFDakIsa0JBQWtCO1lBQ2xCLG1CQUFBLENBQUMsQ0FBQyxZQUFZLEVBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLG1CQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztTQUM3RDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsUUFBUTtTQUNUO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDOztjQUM5QyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Ozs7O0lBRUQsZUFBZSxDQUFDLENBQVk7UUFDMUIsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ25CLGlCQUFpQjtRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUc7OztRQUFDLEdBQUcsRUFBRTs7a0JBQ2IsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNqRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQyxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7O0lBRUQsY0FBYyxDQUFDLENBQVk7UUFDekIsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDOztjQUNiLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssWUFBWSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQztZQUM1QixzQkFBc0I7WUFDdEIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQ3hGO1NBQ0Y7O2NBQ0ssU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDOzs7OztJQUVELGVBQWUsQ0FBQyxDQUFZO1FBQzFCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7O2NBQ2hCLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckMsQ0FBQzs7Ozs7SUFFRCxjQUFjLENBQUMsQ0FBWTtRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUc7OztRQUFDLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7O2tCQUNoQixJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUU7WUFDakQsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzlGLE9BQU87YUFDUjs7O2tCQUVLLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7O2tCQUN0RSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ2xGLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQztvQkFDaEIsUUFBUSxFQUFFLG1CQUFBLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLEVBQUM7b0JBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVTtvQkFDckIsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPO2lCQUNsQixDQUFDLENBQUMsU0FBUzs7OztnQkFBQyxDQUFDLE9BQWdCLEVBQUUsRUFBRTtvQkFDaEMsSUFBSSxPQUFPLEVBQUU7d0JBQ1gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ2hFO29CQUNELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDdEMsQ0FBQyxFQUFDLENBQUM7YUFDSjtpQkFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUMvQjtRQUNILENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFFRCxhQUFhLENBQUMsQ0FBWTtRQUN4QixDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHOzs7UUFBQyxHQUFHLEVBQUU7WUFDbkIsbUNBQW1DO1lBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFOztzQkFDaEIsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDL0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDbEM7UUFDSCxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7O0lBS0QsYUFBYTtRQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCOzs7UUFBQyxHQUFHLEVBQUU7WUFDakMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFOztzQkFDZCxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhO2dCQUNuRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQzlCLFNBQVMsQ0FBWSxhQUFhLEVBQUUsV0FBVyxDQUFDO3FCQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFDOUIsU0FBUzs7OztnQkFBQyxDQUFDLENBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO2dCQUN4RCxTQUFTLENBQVksYUFBYSxFQUFFLFdBQVcsQ0FBQztxQkFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQzlCLFNBQVM7Ozs7Z0JBQUMsQ0FBQyxDQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztnQkFDeEQsU0FBUyxDQUFZLGFBQWEsRUFBRSxVQUFVLENBQUM7cUJBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUM5QixTQUFTOzs7O2dCQUFDLENBQUMsQ0FBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7Z0JBQ3ZELFNBQVMsQ0FBWSxhQUFhLEVBQUUsV0FBVyxDQUFDO3FCQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFDOUIsU0FBUzs7OztnQkFBQyxDQUFDLENBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO2dCQUN4RCxTQUFTLENBQVksYUFBYSxFQUFFLE1BQU0sQ0FBQztxQkFDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQzlCLFNBQVM7Ozs7Z0JBQUMsQ0FBQyxDQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztnQkFDdkQsU0FBUyxDQUFZLGFBQWEsRUFBRSxTQUFTLENBQUM7cUJBQzNDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUM5QixTQUFTOzs7O2dCQUFDLENBQUMsQ0FBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7YUFDdkQ7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUMxQjtRQUNILENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7OztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7Ozs7SUFXRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ25DLENBQUM7Ozs7O0lBRUQsV0FBVyxDQUFDLE9BQWlEO2NBQ3JELEVBQUUsV0FBVyxFQUFFLEdBQUcsT0FBTztRQUMvQixJQUFJLFdBQVcsRUFBRTtZQUNmLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUN0QjtJQUNILENBQUM7Ozs7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7OztZQWpYRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLFFBQVEsRUFBRSxZQUFZO2dCQUN0QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDVDtnQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtnQkFDL0MsbUJBQW1CLEVBQUUsS0FBSztnQkFDMUIsSUFBSSxFQUFFO29CQUNKLGtDQUFrQyxFQUFFLGNBQWM7b0JBQ2xELDJDQUEyQyxFQUFFLDRCQUE0QjtvQkFDekUsZ0RBQWdELEVBQUUsZ0NBQWdDO29CQUNsRixpREFBaUQsRUFBRSxpQ0FBaUM7b0JBQ3BGLG1EQUFtRCxFQUFFLDJCQUEyQjtvQkFDaEYseURBQXlELEVBQUUsK0JBQStCO29CQUMxRiwyQ0FBMkMsRUFBRSw0QkFBNEI7b0JBQ3pFLDBDQUEwQyxFQUFFLDJCQUEyQjtvQkFDdkUsMkJBQTJCLEVBQUUsZUFBZTtvQkFDNUMsb0NBQW9DLEVBQUUsNkJBQTZCO29CQUNuRSx5Q0FBeUMsRUFBRSxpQ0FBaUM7b0JBQzVFLDBDQUEwQyxFQUFFLGtDQUFrQztvQkFDOUUsNENBQTRDLEVBQUUsNEJBQTRCO29CQUMxRSxrREFBa0QsRUFBRSxnQ0FBZ0M7b0JBQ3BGLG9DQUFvQyxFQUFFLDZCQUE2QjtvQkFDbkUsbUNBQW1DLEVBQUUsNEJBQTRCO29CQUNqRSxpQkFBaUIsRUFBRSxjQUFjO29CQUNqQyxhQUFhLEVBQUUscUJBQXFCO2lCQUNyQzthQUNGOzs7O1lBMUVvRCxpQkFBaUI7WUFacEUsTUFBTTtZQU1OLFNBQVM7WUFWVCxVQUFVO1lBRlYsaUJBQWlCO1lBZ0JWLHNCQUFzQix1QkF3VzFCLElBQUksWUFBSSxRQUFROzs7bUJBOVFsQixLQUFLO29CQUNMLEtBQUs7d0JBQ0wsS0FBSzt5QkFDTCxLQUFLO3lCQUNMLEtBQUs7d0JBQ0wsS0FBSzt5QkFDTCxLQUFLO3FCQUNMLEtBQUs7d0JBQ0wsS0FBSzs0QkFDTCxLQUFLO2dDQUNMLEtBQUs7MkJBQ0wsS0FBSztzQkFDTCxLQUFLO3NCQUNMLEtBQUs7b0JBQ0wsS0FBSzt5QkFDTCxLQUFLO3lCQUNMLEtBQUs7MkJBQ0wsS0FBSzswQkFDTCxLQUFLOzBCQUNMLEtBQUs7OEJBQ0wsS0FBSzs0QkFDTCxLQUFLOzJCQUNMLEtBQUs7eUJBQ0wsS0FBSzs2QkFDTCxLQUFLOzZCQUNMLEtBQUs7MkJBQ0wsS0FBSzs0QkFDTCxLQUFLOzBCQUNMLEtBQUs7c0JBQ0wsTUFBTTt5QkFDTixNQUFNOzRCQUNOLE1BQU07K0JBQ04sTUFBTTs2QkFDTixNQUFNOzRCQUNOLE1BQU07NEJBQ04sTUFBTTsyQkFDTixNQUFNOzRCQUNOLE1BQU07dUJBQ04sTUFBTTswQkFDTixNQUFNOztBQXZCa0I7SUFBZixZQUFZLEVBQUU7O3VEQUFzQjtBQUNyQjtJQUFmLFlBQVksRUFBRTs7eURBQXdCO0FBQ3ZCO0lBQWYsWUFBWSxFQUFFOzt3REFBdUI7QUFDdEI7SUFBZixZQUFZLEVBQUU7O3dEQUF1QjtBQUN0QjtJQUFmLFlBQVksRUFBRTs7NERBQXlCO0FBQ3hCO0lBQWYsWUFBWSxFQUFFOzswREFBdUI7QUFDdEI7SUFBZixZQUFZLEVBQUU7O3lEQUFzQjtBQUNyQjtJQUFmLFlBQVksRUFBRTs7dURBQW9COzs7SUFuQzVDLGlEQUFrRDs7SUFDbEQsbURBQW9EOztJQUNwRCxrREFBbUQ7O0lBQ25ELGtEQUFtRDs7SUFDbkQsc0RBQXVEOztJQUN2RCxvREFBcUQ7O0lBQ3JELG1EQUFvRDs7SUFDcEQsaURBQWtEOzs7OztJQUtsRCxtQ0FBMkI7O0lBQzNCLG9DQUE0Qjs7SUFDNUIsd0NBQW9DOztJQUNwQyx5Q0FBcUM7O0lBQ3JDLHlDQUFxQzs7SUFDckMsd0NBQW9DOztJQUNwQyx5Q0FBOEI7O0lBQzlCLHFDQUEwQjs7SUFDMUIsd0NBQTZCOztJQUM3Qiw0Q0FBaUM7O0lBQ2pDLGdEQUFxQzs7SUFDckMsMkNBQWdDOztJQUNoQyxzQ0FBMkI7O0lBQzNCLHNDQUE2Qjs7SUFDN0Isb0NBQTJCOztJQUMzQix5Q0FBaUM7O0lBQ2pDLHlDQUE4Qzs7SUFDOUMsMkNBQWdEOztJQUNoRCwwQ0FBK0M7O0lBQy9DLDBDQUErQzs7SUFDL0MsOENBQWlEOztJQUNqRCw0Q0FBK0M7O0lBQy9DLDJDQUE4Qzs7SUFDOUMseUNBQTRDOztJQUM1Qyw2Q0FBNEY7O0lBQzVGLDZDQUF5Rzs7SUFDekcsMkNBQWtGOztJQUNsRiw0Q0FBNEI7O0lBQzVCLDBDQUFzQzs7SUFDdEMsc0NBQW1FOztJQUNuRSx5Q0FBc0U7O0lBQ3RFLDRDQUF5RTs7SUFDekUsK0NBQTRFOztJQUM1RSw2Q0FBMEU7O0lBQzFFLDRDQUF5RTs7SUFDekUsNENBQXlFOztJQUN6RSwyQ0FBd0U7O0lBQ3hFLDRDQUF5RTs7SUFDekUsdUNBQW9FOztJQUNwRSwwQ0FBdUU7Ozs7O0lBS3ZFLHVDQUF5Qjs7SUFDekIsc0NBQVk7O0lBQ1osMkNBSUU7O0lBdU5BLDRDQUF1Qzs7Ozs7SUFDdkMscUNBQXNCOzs7OztJQUN0Qix1Q0FBMkI7Ozs7O0lBQzNCLHlDQUE4Qjs7Ozs7SUFDOUIsa0NBQThCOztJQUM5QiwwQ0FBK0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZSxcbiAgVGVtcGxhdGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOek5vQW5pbWF0aW9uRGlyZWN0aXZlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL25vLWFuaW1hdGlvbic7XG5cbmltcG9ydCB7IE56Rm9ybWF0QmVmb3JlRHJvcEV2ZW50LCBOekZvcm1hdEVtaXRFdmVudCwgTnpUcmVlQmFzZVNlcnZpY2UsIE56VHJlZU5vZGUsIE56VHJlZU5vZGVPcHRpb25zIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3RyZWUnO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IElucHV0Qm9vbGVhbiB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS91dGlsJztcbmltcG9ydCB7IGZyb21FdmVudCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduei10cmVlLW5vZGUnLFxuICBleHBvcnRBczogJ256VHJlZU5vZGUnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuei10cmVlLWluZGVudCBbbnpUcmVlTGV2ZWxdPVwibnpUcmVlTm9kZS5sZXZlbFwiIFtuelNlbGVjdE1vZGVdPVwibnpTZWxlY3RNb2RlXCIgW256SXNTdGFydF09XCJpc1N0YXJ0XCIgW256SXNFbmRdPVwiaXNFbmRcIj48L256LXRyZWUtaW5kZW50PlxuICAgIDxuei10cmVlLW5vZGUtc3dpdGNoZXJcbiAgICAgICpuZ0lmPVwibnpTaG93RXhwYW5kXCJcbiAgICAgIFtuelNob3dFeHBhbmRdPVwibnpTaG93RXhwYW5kXCJcbiAgICAgIFtuelNob3dMaW5lXT1cIm56U2hvd0xpbmVcIlxuICAgICAgW256RXhwYW5kZWRJY29uXT1cIm56RXhwYW5kZWRJY29uXCJcbiAgICAgIFtuelNlbGVjdE1vZGVdPVwibnpTZWxlY3RNb2RlXCJcbiAgICAgIFtjb250ZXh0XT1cIm56VHJlZU5vZGVcIlxuICAgICAgW2lzTGVhZl09XCJpc0xlYWZcIlxuICAgICAgW2lzRXhwYW5kZWRdPVwiaXNFeHBhbmRlZFwiXG4gICAgICBbaXNMb2FkaW5nXT1cImlzTG9hZGluZ1wiXG4gICAgICAoY2xpY2spPVwiY2xpY2tFeHBhbmQoJGV2ZW50KVwiXG4gICAgPjwvbnotdHJlZS1ub2RlLXN3aXRjaGVyPlxuICAgIDxuei10cmVlLW5vZGUtY2hlY2tib3hcbiAgICAgICpuZ0lmPVwibnpDaGVja2FibGVcIlxuICAgICAgKGNsaWNrKT1cImNsaWNrQ2hlY2tCb3goJGV2ZW50KVwiXG4gICAgICBbbnpTZWxlY3RNb2RlXT1cIm56U2VsZWN0TW9kZVwiXG4gICAgICBbaXNDaGVja2VkXT1cImlzQ2hlY2tlZFwiXG4gICAgICBbaXNIYWxmQ2hlY2tlZF09XCJpc0hhbGZDaGVja2VkXCJcbiAgICAgIFtpc0Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxuICAgICAgW2lzRGlzYWJsZUNoZWNrYm94XT1cImlzRGlzYWJsZUNoZWNrYm94XCJcbiAgICA+PC9uei10cmVlLW5vZGUtY2hlY2tib3g+XG4gICAgPG56LXRyZWUtbm9kZS10aXRsZVxuICAgICAgW2ljb25dPVwiaWNvblwiXG4gICAgICBbdGl0bGVdPVwidGl0bGVcIlxuICAgICAgW2lzTG9hZGluZ109XCJpc0xvYWRpbmdcIlxuICAgICAgW2lzU2VsZWN0ZWRdPVwiaXNTZWxlY3RlZFwiXG4gICAgICBbaXNEaXNhYmxlZF09XCJpc0Rpc2FibGVkXCJcbiAgICAgIFtpc01hdGNoZWRdPVwiaXNNYXRjaGVkXCJcbiAgICAgIFtpc0V4cGFuZGVkXT1cImlzRXhwYW5kZWRcIlxuICAgICAgW2lzTGVhZl09XCJpc0xlYWZcIlxuICAgICAgW3NlYXJjaFZhbHVlXT1cIm56U2VhcmNoVmFsdWVcIlxuICAgICAgW3RyZWVUZW1wbGF0ZV09XCJuelRyZWVUZW1wbGF0ZVwiXG4gICAgICBbZHJhZ2dhYmxlXT1cIm56RHJhZ2dhYmxlXCJcbiAgICAgIFtzaG93SWNvbl09XCJuelNob3dJY29uXCJcbiAgICAgIFtzZWxlY3RNb2RlXT1cIm56U2VsZWN0TW9kZVwiXG4gICAgICBbY29udGV4dF09XCJuelRyZWVOb2RlXCJcbiAgICAgIChkYmxjbGljayk9XCJkYmxDbGljaygkZXZlbnQpXCJcbiAgICAgIChjbGljayk9XCJjbGlja1NlbGVjdCgkZXZlbnQpXCJcbiAgICAgIChjb250ZXh0bWVudSk9XCJjb250ZXh0TWVudSgkZXZlbnQpXCJcbiAgICA+PC9uei10cmVlLW5vZGUtdGl0bGU+XG4gIGAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuYW50LXNlbGVjdC10cmVlLXRyZWVub2RlXSc6IGBuelNlbGVjdE1vZGVgLFxuICAgICdbY2xhc3MuYW50LXNlbGVjdC10cmVlLXRyZWVub2RlLWRpc2FibGVkXSc6IGBuelNlbGVjdE1vZGUgJiYgaXNEaXNhYmxlZGAsXG4gICAgJ1tjbGFzcy5hbnQtc2VsZWN0LXRyZWUtdHJlZW5vZGUtc3dpdGNoZXItb3Blbl0nOiBgbnpTZWxlY3RNb2RlICYmIGlzU3dpdGNoZXJPcGVuYCxcbiAgICAnW2NsYXNzLmFudC1zZWxlY3QtdHJlZS10cmVlbm9kZS1zd2l0Y2hlci1jbG9zZV0nOiBgbnpTZWxlY3RNb2RlICYmIGlzU3dpdGNoZXJDbG9zZWAsXG4gICAgJ1tjbGFzcy5hbnQtc2VsZWN0LXRyZWUtdHJlZW5vZGUtY2hlY2tib3gtY2hlY2tlZF0nOiBgbnpTZWxlY3RNb2RlICYmIGlzQ2hlY2tlZGAsXG4gICAgJ1tjbGFzcy5hbnQtc2VsZWN0LXRyZWUtdHJlZW5vZGUtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZV0nOiBgbnpTZWxlY3RNb2RlICYmIGlzSGFsZkNoZWNrZWRgLFxuICAgICdbY2xhc3MuYW50LXNlbGVjdC10cmVlLXRyZWVub2RlLXNlbGVjdGVkXSc6IGBuelNlbGVjdE1vZGUgJiYgaXNTZWxlY3RlZGAsXG4gICAgJ1tjbGFzcy5hbnQtc2VsZWN0LXRyZWUtdHJlZW5vZGUtbG9hZGluZ10nOiBgbnpTZWxlY3RNb2RlICYmIGlzTG9hZGluZ2AsXG4gICAgJ1tjbGFzcy5hbnQtdHJlZS10cmVlbm9kZV0nOiBgIW56U2VsZWN0TW9kZWAsXG4gICAgJ1tjbGFzcy5hbnQtdHJlZS10cmVlbm9kZS1kaXNhYmxlZF0nOiBgIW56U2VsZWN0TW9kZSAmJiBpc0Rpc2FibGVkYCxcbiAgICAnW2NsYXNzLmFudC10cmVlLXRyZWVub2RlLXN3aXRjaGVyLW9wZW5dJzogYCFuelNlbGVjdE1vZGUgJiYgaXNTd2l0Y2hlck9wZW5gLFxuICAgICdbY2xhc3MuYW50LXRyZWUtdHJlZW5vZGUtc3dpdGNoZXItY2xvc2VdJzogYCFuelNlbGVjdE1vZGUgJiYgaXNTd2l0Y2hlckNsb3NlYCxcbiAgICAnW2NsYXNzLmFudC10cmVlLXRyZWVub2RlLWNoZWNrYm94LWNoZWNrZWRdJzogYCFuelNlbGVjdE1vZGUgJiYgaXNDaGVja2VkYCxcbiAgICAnW2NsYXNzLmFudC10cmVlLXRyZWVub2RlLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVdJzogYCFuelNlbGVjdE1vZGUgJiYgaXNIYWxmQ2hlY2tlZGAsXG4gICAgJ1tjbGFzcy5hbnQtdHJlZS10cmVlbm9kZS1zZWxlY3RlZF0nOiBgIW56U2VsZWN0TW9kZSAmJiBpc1NlbGVjdGVkYCxcbiAgICAnW2NsYXNzLmFudC10cmVlLXRyZWVub2RlLWxvYWRpbmddJzogYCFuelNlbGVjdE1vZGUgJiYgaXNMb2FkaW5nYCxcbiAgICAnW3N0eWxlLmRpc3BsYXldJzogJ2Rpc3BsYXlTdHlsZScsXG4gICAgJyhtb3VzZWRvd24pJzogJ29uTW91c2Vkb3duKCRldmVudCknXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgTnpUcmVlTm9kZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpTaG93TGluZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpTaG93RXhwYW5kOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekNoZWNrYWJsZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpBc3luY0RhdGE6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256SGlkZVVuTWF0Y2hlZDogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpOb0FuaW1hdGlvbjogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpTZWxlY3RNb2RlOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uelNob3dJY29uOiBCb29sZWFuSW5wdXQ7XG5cbiAgLyoqXG4gICAqIGZvciBnbG9iYWwgcHJvcGVydHlcbiAgICovXG4gIEBJbnB1dCgpIGljb246IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc1NlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNNYXRjaGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzRXhwYW5kZWQhOiBib29sZWFuO1xuICBASW5wdXQoKSBpc0xlYWYhOiBib29sZWFuO1xuICBASW5wdXQoKSBpc0NoZWNrZWQ/OiBib29sZWFuO1xuICBASW5wdXQoKSBpc0hhbGZDaGVja2VkPzogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNEaXNhYmxlQ2hlY2tib3g/OiBib29sZWFuO1xuICBASW5wdXQoKSBpc1NlbGVjdGFibGU/OiBib29sZWFuO1xuICBASW5wdXQoKSBjYW5IaWRlPzogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNTdGFydD86IGJvb2xlYW5bXTtcbiAgQElucHV0KCkgaXNFbmQ/OiBib29sZWFuW107XG4gIEBJbnB1dCgpIG56VHJlZU5vZGUhOiBOelRyZWVOb2RlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpTaG93TGluZT86IGJvb2xlYW47XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuelNob3dFeHBhbmQ/OiBib29sZWFuO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpDaGVja2FibGU/OiBib29sZWFuO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpBc3luY0RhdGE/OiBib29sZWFuO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpIaWRlVW5NYXRjaGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuek5vQW5pbWF0aW9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuelNlbGVjdE1vZGUgPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56U2hvd0ljb24gPSBmYWxzZTtcbiAgQElucHV0KCkgbnpFeHBhbmRlZEljb24/OiBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogTnpUcmVlTm9kZTsgb3JpZ2luOiBOelRyZWVOb2RlT3B0aW9ucyB9PjtcbiAgQElucHV0KCkgbnpUcmVlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPHsgJGltcGxpY2l0OiBOelRyZWVOb2RlOyBvcmlnaW46IE56VHJlZU5vZGVPcHRpb25zIH0+IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG56QmVmb3JlRHJvcD86IChjb25maXJtOiBOekZvcm1hdEJlZm9yZURyb3BFdmVudCkgPT4gT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgQElucHV0KCkgbnpTZWFyY2hWYWx1ZSA9ICcnO1xuICBASW5wdXQoKSBuekRyYWdnYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8TnpGb3JtYXRFbWl0RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuekRibENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56Q29udGV4dE1lbnUgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpDaGVja0JveENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TnpGb3JtYXRFbWl0RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuekV4cGFuZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TnpGb3JtYXRFbWl0RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uRHJhZ1N0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25EcmFnRW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkRyYWdPdmVyID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25EcmFnTGVhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkRyb3AgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkRyYWdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBkcmFnIHZhclxuICAgKi9cbiAgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuICBkcmFnUG9zID0gMjtcbiAgZHJhZ1Bvc0NsYXNzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICcwJzogJ2RyYWctb3ZlcicsXG4gICAgJzEnOiAnZHJhZy1vdmVyLWdhcC1ib3R0b20nLFxuICAgICctMSc6ICdkcmFnLW92ZXItZ2FwLXRvcCdcbiAgfTtcblxuICAvKipcbiAgICogZGVmYXVsdCBzZXRcbiAgICovXG4gIGdldCBkaXNwbGF5U3R5bGUoKTogc3RyaW5nIHtcbiAgICAvLyB0byBoaWRlIHVubWF0Y2hlZCBub2Rlc1xuICAgIHJldHVybiB0aGlzLm56U2VhcmNoVmFsdWUgJiYgdGhpcy5uekhpZGVVbk1hdGNoZWQgJiYgIXRoaXMuaXNNYXRjaGVkICYmICF0aGlzLmlzRXhwYW5kZWQgJiYgdGhpcy5jYW5IaWRlID8gJ25vbmUnIDogJyc7XG4gIH1cblxuICBnZXQgaXNTd2l0Y2hlck9wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNFeHBhbmRlZCAmJiAhdGhpcy5pc0xlYWY7XG4gIH1cblxuICBnZXQgaXNTd2l0Y2hlckNsb3NlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc0V4cGFuZGVkICYmICF0aGlzLmlzTGVhZjtcbiAgfVxuXG4gIG9uTW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubnpTZWxlY3RNb2RlKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjb2xsYXBzZSBub2RlXG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgY2xpY2tFeHBhbmQoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmcgJiYgIXRoaXMuaXNMZWFmKSB7XG4gICAgICAvLyBzZXQgYXN5bmMgc3RhdGVcbiAgICAgIGlmICh0aGlzLm56QXN5bmNEYXRhICYmIHRoaXMubnpUcmVlTm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIXRoaXMuaXNFeHBhbmRlZCkge1xuICAgICAgICB0aGlzLm56VHJlZU5vZGUuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMubnpUcmVlTm9kZS5zZXRFeHBhbmRlZCghdGhpcy5pc0V4cGFuZGVkKTtcbiAgICB9XG4gICAgdGhpcy5uelRyZWVTZXJ2aWNlLnNldEV4cGFuZGVkTm9kZUxpc3QodGhpcy5uelRyZWVOb2RlKTtcbiAgICBjb25zdCBldmVudE5leHQgPSB0aGlzLm56VHJlZVNlcnZpY2UuZm9ybWF0RXZlbnQoJ2V4cGFuZCcsIHRoaXMubnpUcmVlTm9kZSwgZXZlbnQpO1xuICAgIHRoaXMubnpFeHBhbmRDaGFuZ2UuZW1pdChldmVudE5leHQpO1xuICB9XG5cbiAgY2xpY2tTZWxlY3QoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh0aGlzLmlzU2VsZWN0YWJsZSAmJiAhdGhpcy5pc0Rpc2FibGVkKSB7XG4gICAgICB0aGlzLm56VHJlZU5vZGUuaXNTZWxlY3RlZCA9ICF0aGlzLm56VHJlZU5vZGUuaXNTZWxlY3RlZDtcbiAgICB9XG4gICAgdGhpcy5uelRyZWVTZXJ2aWNlLnNldFNlbGVjdGVkTm9kZUxpc3QodGhpcy5uelRyZWVOb2RlKTtcbiAgICBjb25zdCBldmVudE5leHQgPSB0aGlzLm56VHJlZVNlcnZpY2UuZm9ybWF0RXZlbnQoJ2NsaWNrJywgdGhpcy5uelRyZWVOb2RlLCBldmVudCk7XG4gICAgdGhpcy5uekNsaWNrLmVtaXQoZXZlbnROZXh0KTtcbiAgfVxuXG4gIGRibENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBldmVudE5leHQgPSB0aGlzLm56VHJlZVNlcnZpY2UuZm9ybWF0RXZlbnQoJ2RibGNsaWNrJywgdGhpcy5uelRyZWVOb2RlLCBldmVudCk7XG4gICAgdGhpcy5uekRibENsaWNrLmVtaXQoZXZlbnROZXh0KTtcbiAgfVxuXG4gIGNvbnRleHRNZW51KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBldmVudE5leHQgPSB0aGlzLm56VHJlZVNlcnZpY2UuZm9ybWF0RXZlbnQo