@esfaenza/es-table 11.2.115 → 11.2.117

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -344,8 +344,11 @@ export class EsTableComponent {
344
344
  this.firstCoordinates = null;
345
345
  //* Piango
346
346
  this.EsTdsList = [];
347
- this.copySubscription = this.copyPasteDetector.OnCopy.subscribe(() => { this.handleCopy(); });
348
- this.pasteSubscription = this.copyPasteDetector.OnPaste.subscribe(() => { this.handlePaste(); });
347
+ // Copia e incolla si effettuano solo se la tabella attuale è univocamente selezionata
348
+ this.copySubscription = this.copyPasteDetector.OnCopy.subscribe(() => { if (this.copyPasteDetector.ActiveEstReference == this)
349
+ this.handleCopy(); });
350
+ this.pasteSubscription = this.copyPasteDetector.OnPaste.subscribe(() => { if (this.copyPasteDetector.ActiveEstReference == this)
351
+ this.handlePaste(); });
349
352
  this.export_H = new ExportHandler(this, this.expExts, this.msgExts, this.utiExts, this.dateExts);
350
353
  this.rowGrouping_H = new RowGroupingHandler(this, this.utilities_H, this.dateExts);
351
354
  this.columnMetadata_H = new ColumnMetadataHandler(this, this.utilities_H, this.utiExts, this.prefService, this.rowGrouping_H);
@@ -898,7 +901,7 @@ export class EsTableComponent {
898
901
  if (!!th)
899
902
  th._referenced = true;
900
903
  // Skippare senza th (casistica tabella dinamica)
901
- if (th && (td.tdIf || th.thGroup)) {
904
+ if (th && th.thIf && (td.tdIf || th.thGroup)) {
902
905
  let thCasted = th;
903
906
  let isFixed = th.thFixed || th.thGroup || th.thPinned;
904
907
  let itemToAdd = item._item ?
@@ -1454,6 +1457,8 @@ export class EsTableComponent {
1454
1457
  // Tasto diverso dal click sinistro -> ciao è stato bello e intenso
1455
1458
  if (event.buttons != 1 || !this.RangeSelection)
1456
1459
  return;
1460
+ // Sto lavorando su QUESTA es-table
1461
+ this.copyPasteDetector.ActiveEstReference = this;
1457
1462
  // Tutti i click su una cella già in edit non devono effettuare la selezione della riga
1458
1463
  if ((((_a = this.DynamicRowColumnsDefinition) === null || _a === void 0 ? void 0 : _a.length) > 0 && rowItem.edits && ((_b = rowItem.edits[item._hash]) === null || _b === void 0 ? void 0 : _b._editing)) ||
1459
1464
  rowItem._editing)
@@ -1498,7 +1503,7 @@ EsTableComponent.decorators = [
1498
1503
  viewProviders: [{ provide: LocalizationService, useClass: EsTableLoc }],
1499
1504
  changeDetection: ChangeDetectionStrategy.OnPush,
1500
1505
  encapsulation: ViewEncapsulation.None,
1501
- template: "<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate\">\r\n <div class=\"pull-right\">\r\n {{'Update every' | localize : lc}}&nbsp;<input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" />&nbsp;{{'second/s' | localize : lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2\">\r\n <label class=\"est-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" (ngModelChange)=\"autoUpdateChanged();\" />\r\n <div class=\"est-slider round\"></div>\r\n </label>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<div *ngIf=\"View\" class=\"est-relative\">\r\n <div *ngIf=\"FirstBind && ShowLoadingOnBootstrap\" class=\"est-loading-box\">\r\n <div class=\"est-loading-content\">\r\n <span class=\"fa fa-spinner fa-spin\"></span>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"est-top-pager\" *ngIf=\"PagingStyle == 'both' || PagingStyle == 'top'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n\r\n <div class=\"est-top-allselect\" *ngIf=\"canSelectAll || (View?.selection || arraymodeSelection)?.all\">\r\n <span>{{ (selectedObjects == -1 ? ('All the' | localize : lc) : ((selectedObjects || 0) | number : '0.0-0' : locale)) + ' ' + ((selectedObjects == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span>&nbsp;\r\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n </div>\r\n\r\n <div class=\"table-responsive datatable {{ContainerClass}}\" [style.max-height.px]=\"MaxHeight\">\r\n <table class=\"{{ TableClass }} est-margin-bottom-10 est\" [class.est-high-density]=\"HighCellDensity\">\r\n <thead [hidden]=\"HeaderHidden || FirstBind\">\r\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\r\n <tr *ngIf=\"(SelectAll && !SingleSelection) || PagingStyle != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns.Global\" [class.est-hidden-view]=\"!canSelectAll && !(View?.selection || arraymodeSelection)?.all && PagingStyle == 'bottom'\">\r\n <p class=\"est-hidden-view app-margin-bottom-0\">\u00A7</p>\r\n </th>\r\n </tr>\r\n\r\n <!-- Blocco header group -->\r\n <ng-container *ngIf=\"RowThGroups\">\r\n <tr *ngFor=\"let level of RowThGroups\">\r\n <th *ngFor=\"let cell of level\" [attr.colspan]=\"cell.Span\" \r\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\r\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\r\n class=\"est-text-center\">\r\n <ng-container *ngIf=\"cell.Pinned;\">\r\n <div class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!cell.Pinned && cell.Content; Else: cell.Template\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!RowThGroups\">\r\n <tr *ngIf=\"HasHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n \r\n <!-- Blocco header group secondario -->\r\n <tr *ngIf=\"HasSecondaryHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n </ng-container>\r\n\r\n <!-- Blocco effettivo degli header -->\r\n <tr>\r\n <!-- Aggiungo una checkbox se la selezione \u00E8 attiva -->\r\n <th class=\"est-col-min\" *ngIf=\"Selection && !HasPinnedColumns\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n\r\n <!-- Header che valgono per view mode e array mode -->\r\n <ng-container *ngIf=\"arrayMode || viewMode\">\r\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle propriet\u00E0 -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition\">\r\n <th *ngFor=\"let operation of DynamicOperations\" class=\"est-col-min est-no-side-padding\"></th>\r\n \r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition\">\r\n <ng-container *ngIf=\"rowHeader.Visible\">\r\n <th *ngIf=\"OrderByColumn\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onOrderChange)=\"thOrderChanged(rowHeader.PropertyName, $event)\">{{rowHeader.Description}}</th>\r\n <th *ngIf=\"!OrderByColumn\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\">{{rowHeader.Description}}</th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\r\n <ng-container *ngIf=\"UseCustomCells && RowTHs && RowTHs.length > 0\">\r\n <th *ngIf=\"HasPinnedColumns\" class=\"est-pinned-header est-col-min\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-simple-border-bottom\">\r\n <th class=\"est-col-min est-no-border\" *ngIf=\"Selection\" [style.width.px]=\"20\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\" [style.width.px]=\"rowHeader.PinnedWidth\" es-th=\"{{rowHeader.ID}}\" \r\n class=\"{{rowHeader.Class || ''}}\" \r\n [class.est-pinned-internal-header]=\"true\" \r\n [class.est-no-border]=\"true\" \r\n [class.est-nowrap]=\"!rowHeader.Wrap\" \r\n [Pinned]=\"true\" [Fixed]=\"rowHeader.Fixed\" [Order]=\"rowHeader.Order\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\" (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs\">\r\n\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\" es-th=\"{{rowHeader.ID}}\" class=\"{{rowHeader.Class || ''}}\" [class.est-ltab-border]=\"rowHeader.LeftBorder\" [class.est-rtab-border]=\"rowHeader.RightBorder\" [class.est-nowrap]=\"!rowHeader.Wrap\" [Order]=\"rowHeader.Order\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!--Per l'eliminazione mi serve un header aggiuntivo-->\r\n <th *ngIf=\"Removal\" [class.est-right-9]=\"Export || HiddenColumns\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\r\n\r\n <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\r\n <th *ngIf=\"Export || HiddenColumns || ColumnsOrdering || CornerMenuOptions\" class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\r\n \r\n <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\r\n <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\r\n <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\r\n\r\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\r\n <div class=\"est-pointer\">\r\n <a class=\"dropdown-item\" *ngIf=\"HiddenColumns || ColumnsOrdering\" (click)=\"columnMetadata_H.resetColumnVisSelection(); changeColumnVisibilityModal.show();\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && CSVExport\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && XLSXExport\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\r\n <a class=\"dropdown-item\" *ngFor=\"let option of CornerMenuOptions\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\r\n </div>\r\n </div>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody [hidden]=\"BodyHidden || FirstBind\" [class.est-no-selection]=\"RangeSelection\">\r\n <!--Con selection attiva richiamo il template che gestisce il context menu-->\r\n <ng-container *ngIf=\"Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode ? false : SelectionDisabled, sel: Selection }}\"></ng-container>\r\n </ng-container>\r\n\r\n <!--Senza selection richiamo il template che NON gestisce il context menu-->\r\n <ng-container *ngIf=\"!Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"PagingStyle == 'both' || PagingStyle == 'bottom'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\r\n<ng-template #pagingElement>\r\n <ng-container *ngIf=\"!FirstBind\">\r\n <!-- Pulsanti avanti-indietro di paginazione -->\r\n <div *ngIf=\"PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)\" class=\"pull-right btn-toolbar\">\r\n <ng-container *ngIf=\"PagerOptions.View?.pagingavailable || viewMode\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"arrayMode && UseArrayModePaging && !SearchView\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <!-- Paginatore dove appare la count e le opzioni di paginazione -->\r\n <div class=\"pull-right\" *ngIf=\"PagerOptions.ShowCount || PagerOptions.ShowPagingOptions\">\r\n <div class=\"est-mt-min-5\" *ngIf=\"PagerOptions.ShowPaging\">\r\n <app-paging *ngIf=\"!PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage\" (pagingSelected)=\"items_H.refreshPaging($event)\"></app-paging>\r\n <app-paging *ngIf=\"PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [GroupMode]=\"PagerOptions.Searches == 'groups'\" [AllSearch]=\"AllSearch\" [View]=\"PagerOptions.View\" (pagingSelected)=\"onItemsPerPageChanged($event);\"></app-paging>\r\n </div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template che contiene i pulsanti per cambiare pagina -->\r\n<ng-template #pagingButtons let-options>\r\n <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\r\n <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\r\n <div *ngIf=\"options.Array\" class=\"est-inline\"><a *ngFor=\"let p of options.Array\" class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a></div>\r\n <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto \u00E8 templatizzato -->\r\n<ng-template #TBodySelection let-templateOptions>\r\n <ng-container *ngFor=\"let item of boundSource; let even = even; let i=index; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || (!Hierarchy && !ArrayGrouping)\" \r\n [class]=\"item._rowClass ? item._rowClass : ''\" \r\n [class.est-line-through]=\"item.removed || item.deleted\" \r\n [class.est-pointer]=\"!item.locked\" \r\n [class.est-white-selected]=\"item._selected && !item.locked\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n [contextMenu]=\"!item.locked ? (ContextMenu || emptyMenu) : emptyMenu\" [contextMenuSubject]=\"item\"\r\n (click)=\"!RangeSelection && handleRowClick($event, item, true)\"\r\n (contextmenu)=\"onRightClick();\">\r\n\r\n <td *ngIf=\"!item.locked && !item._sep && !HasPinnedColumns\">\r\n <input type=\"checkbox\" \r\n [disabled]=\"templateOptions.selDisabled\" \r\n [class.est-pointer]=\"!item.locked\"\r\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\" \r\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td *ngIf=\"(item.locked || item._sep) && !HasPinnedColumns\"></td>\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container> </ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"dynamicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #TBody>\r\n <ng-container *ngFor=\"let item of boundSource; let even = even;\">\r\n <tr *ngIf=\"item._visible || !Hierarchy\" \r\n [class]=\"item._rowClass ? item._rowClass : ''\" \r\n [class.est-line-through]=\"item.removed || item.deleted\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n (click)=\"handleRowClick($event, item, false)\">\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"dynamicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #groupPager let-item>\r\n <td class=\"est-pinned-body \" *ngIf=\"HasPinnedColumns\"><div class=\"est-pinned-border est-cell-group-padding\"></div></td>\r\n <td *ngIf=\"item._grouplevel > 1\" [attr.colspan]=\"item._grouplevel-1\"></td>\r\n <td [attr.colspan]=\"Columns.VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\r\n <div class=\"est-rg-sep-flex-right\" *ngIf=\"RowGroupingPagingStyle == 'right'\">\r\n <div class=\"est-rg-page\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n <div class=\"est-rg-ipp\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><app-paging [CountLabel]=\"CountLabel\" [AllSearch]=\"AllSearch\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></app-paging></div>\r\n </div>\r\n\r\n <div class=\"est-rg-sep-flex-left\" *ngIf=\"RowGroupingPagingStyle == 'left'\">\r\n <div class=\"est-rg-ipp\"><app-paging [AllSearch]=\"AllSearch\" [CountLabel]=\"CountLabel\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></app-paging></div>\r\n <div class=\"est-rg-page\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\r\n<ng-template #basicColumns let-item>\r\n <ng-container *ngIf=\"(!UseCustomCells || EmptyRowTds) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle definite in maniera dinamica dal modello -->\r\n<ng-template #dynamicColumns let-item>\r\n <ng-container *ngIf=\"(!UseCustomCells || EmptyRowTds) && DynamicRowColumnsDefinition\">\r\n <ng-container *ngFor=\"let operation of DynamicOperations; let first = first; let last = last;\">\r\n <ng-container *ngIf=\"!operation.conditionField || (item.properties[operation.conditionField] == operation.conditionValue)\">\r\n <td [class.est-no-right-padding]=\"last\" [class.est-no-left-padding]=\"!first\" class=\"est-col-min\"><span title=\"{{operation.title}}\" class=\"{{operation.iconClass}} est-pointer\" (click)=\"dynamicOperation(item, operation.id)\">{{operation.text}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"operation.conditionField && (item.properties[operation.conditionField] != operation.conditionValue)\">\r\n <td class=\"est-col-min est-no-side-padding\"></td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let rowItem of DynamicRowColumnsDefinition; let i = index\">\r\n\r\n <ng-container *ngIf=\"rowItem.RoutePath && rowItem.Visible\">\r\n <td es-td=\"{{rowItem.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? rowItem.Clss : 'est-nowrap'}}\" [Internal]=\"false\" [Context]=\"item._hash\">\r\n <a [routerLink]=\"dynamicMode_H.generateRouterLink(rowItem.RoutePath, rowItem.RouteParameterProperties, item)\" class=\"est-link\" [innerHTML]=\"item.properties[rowItem.PropertyName]\"></a>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!rowItem.RoutePath && rowItem.Visible\">\r\n <td es-td=\"{{rowItem.PropertyName}}\" \r\n [class.est-selected-cell]=\"selectionStatus[item._ordinal][i]?.selected\" \r\n [class.est-cell-lborder]=\"selectionStatus[item._ordinal][i]?.lborder\"\r\n [class.est-cell-tborder]=\"selectionStatus[item._ordinal][i]?.tborder\"\r\n [class.est-cell-rborder]=\"selectionStatus[item._ordinal][i]?.rborder\"\r\n [class.est-cell-bborder]=\"selectionStatus[item._ordinal][i]?.bborder\"\r\n [class.est-cell-lborder-tmp]=\"!selectionStatus[item._ordinal][i]?.lborder && !selectionStatus[item._ordinal][i]?.loverlaps\"\r\n [class.est-cell-rborder-tmp]=\"!selectionStatus[item._ordinal][i]?.rborder && !selectionStatus[item._ordinal][i]?.roverlaps\"\r\n (click)=\"dbClickEditOrSingleClickRowSelection($event, rowItem, item, i)\" \r\n class=\"{{UserDefinedDynamicCols ? rowItem.Clss : 'est-nowrap'}} est-default-row-height\" \r\n [Internal]=\"false\" [class.est-no-selection]=\"!!Editable\" [Context]=\"item._hash\"\r\n id=\"{{item._ordinal}}_{{i}}\" (mousedown)=\"mousedown($event, rowItem, item)\" (mouseenter)=\"mouseenter($event)\" (mouseup)=\"mouseup($event)\">\r\n\r\n <div [class.est-edit-hidden]=\"rowItem.edits[item._hash]?._editing\" >\r\n <ng-container *ngTemplateOutlet=\"findEsTd(rowItem.PropertyName, rowItem.RendererName) || defaultEsTd; context: { $implicit: { definition: rowItem, value: item.properties[rowItem.PropertyName], type: rowItem.PropertyType} }\"></ng-container>\r\n </div>\r\n <div *ngIf=\"rowItem.edits[item._hash]?._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"findEditor(rowItem.PropertyName, rowItem.EditorName) || defaultEditor; context: { $implicit: { definition: rowItem, columnIndex: i, item: item, finalizer: finalizeUserEdit.bind(this, rowItem, item, i) } }\"></ng-container>\r\n </div>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditor let-ctx>\r\n <ng-container *ngIf=\"ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [FocusSubject]=\"FocusSubject\" [(ngModel)]=\"ctx.item.properties[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n <ng-container *ngIf=\"!ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [FocusSubject]=\"FocusSubject\" [(ngModel)]=\"ctx.item[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-ctx>\r\n <!-- Formattare il valore in base a valType.type -->\r\n <ng-container *ngIf=\"ctx.type == 'enum'\">\r\n {{ getSelected(ctx.definition.PropertySource, ctx.value).description }}\r\n </ng-container>\r\n <ng-container *ngIf=\"ctx.type != 'enum'\">\r\n {{ctx.value}}\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale delle celle custom se configurate -->\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells && !EmptyRowTds\">\r\n <td *ngIf=\"HasPinnedColumns\" \r\n class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border\">\r\n <td *ngIf=\"!item.locked && !item._sep && Selection\" class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\r\n <input type=\"checkbox\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td class=\"est-no-border est-col-min\" *ngIf=\"(item.locked || item._sep) && Selection\" [style.width.px]=\"20\"></td>\r\n\r\n <ng-container *ngFor=\"let rowItem of RowTDs[item._hash]; let i = index\">\r\n <td *ngIf=\"rowItem && rowItem.Pinned\" [style.width.px]=\"rowItem.PinnedWidth\" es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-no-selection]=\"Editable &&!!rowItem.PropertyName\" [class.est-no-border]=\"true\" [class.est-rg-hdr]=\"rowItem.GroupHeader\" [class.est-rg-agg]=\"rowItem.GroupAggregation\" \r\n [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\" (click)=\"dbClickEditOrSingleClickRowSelection($event, rowItem, item, i)\">\r\n\r\n <div [class.est-edit-hidden]=\"rowItem._editing\" [class.est-pre]=\"!(Hierarchy && i == 0)\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: rowItem.Multi ? (item[rowItem.MultiProp] ? item[rowItem.MultiProp][rowItem.MultiIndex] : {}) : item }\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"!rowItem.Multi && rowItem.Template\"><ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: rowItem.Multi ? (item[rowItem.MultiProp] ? item[rowItem.MultiProp][rowItem.MultiIndex] : {}) : item }\"></ng-container></ng-container>\r\n <span *ngIf=\"rowItem.Multi && rowItem.Template\"><ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: (item[rowItem.MultiProp] ? item[rowItem.MultiProp][rowItem.MultiIndex] : {}) }\"></ng-container></span>\r\n <ng-container *ngIf=\"!rowItem.Template && !rowItem.Multi\">\r\n <span *ngIf=\"rowItem.Content && !rowItem.PropAccessor\">{{rowItem.Content}}</span>\r\n <span *ngIf=\"!rowItem.Content && rowItem.PropAccessor\">{{item.values? item.values[rowItem.PropAccessor] : item[rowItem.PropAccessor]}}</span>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"rowItem._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"findEditor(rowItem.PropertyName) || defaultEditor; context: { $implicit: { definition: rowItem, columnIndex: i, item: item, finalizer: finalizeUserEdit.bind(this, rowItem, item, i) } }\"></ng-container>\r\n </div>\r\n </td>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <ng-container *ngFor=\"let rowItem of RowTDs[item._hash]; let i = index\">\r\n <ng-container *ngIf=\"rowItem && !rowItem.Pinned\">\r\n\r\n <!-- Casistica senza bodyRef, quindi con direttive per i td -->\r\n <ng-container *ngIf=\"!bodyRef && rowItem.Visible\">\r\n <td es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" \r\n [class.est-selected-cell]=\"selectionStatus[item._ordinal][i]?.selected\" \r\n [class.est-cell-lborder]=\"selectionStatus[item._ordinal][i]?.lborder\"\r\n [class.est-cell-tborder]=\"selectionStatus[item._ordinal][i]?.tborder\"\r\n [class.est-cell-rborder]=\"selectionStatus[item._ordinal][i]?.rborder\"\r\n [class.est-cell-bborder]=\"selectionStatus[item._ordinal][i]?.bborder\"\r\n [class.est-ltab-border]=\"rowItem.LeftBorder && !selectionStatus[item._ordinal][i]?.lborder\" \r\n [class.est-rtab-border]=\"rowItem.RightBorder && !selectionStatus[item._ordinal][i]?.rborder\" \r\n [class.est-cell-lborder-tmp]=\"!selectionStatus[item._ordinal][i]?.lborder && !selectionStatus[item._ordinal][i]?.loverlaps && !rowItem.LeftBorder\"\r\n [class.est-cell-rborder-tmp]=\"!selectionStatus[item._ordinal][i]?.rborder && !selectionStatus[item._ordinal][i]?.roverlaps && !rowItem.RightBorder\"\r\n [class.est-no-selection]=\"Editable && !!rowItem.PropertyName\" [class.est-rg-hdr]=\"rowItem.GroupHeader\" [class.est-rg-agg]=\"rowItem.GroupAggregation\" \r\n [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\" (click)=\"dbClickEditOrSingleClickRowSelection($event, rowItem, item, i)\"\r\n (onCellGeneration)=\"registerCell($event)\" [Context]=\"item._hash\"\r\n id=\"{{item._ordinal}}_{{i}}\" (mousedown)=\"mousedown($event, rowItem, item)\" (mouseenter)=\"mouseenter($event)\" (mouseup)=\"mouseup($event)\">\r\n <div [class.est-edit-hidden]=\"rowItem._editing\" [class.est-pre]=\"!(Hierarchy && i == 0)\" >\r\n <ng-container *ngIf=\"Hierarchy && i == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"!rowItem.Multi && rowItem.Template\"><ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"rowItem.Multi && rowItem.Template\"><ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: (item[rowItem.MultiProp] ? item[rowItem.MultiProp][rowItem.MultiIndex] : {}) }\"></ng-container></span>\r\n <ng-container *ngIf=\"!rowItem.Template && !rowItem.Multi\">\r\n <span *ngIf=\"rowItem.Content && !rowItem.PropAccessor\">{{rowItem.Content}}</span>\r\n <span *ngIf=\"!rowItem.Content && rowItem.PropAccessor\">{{item.values? item.values[rowItem.PropAccessor] : item[rowItem.PropAccessor]}}</span>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"rowItem._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"findEditor(rowItem.PropertyName) || defaultEditor; context: { $implicit: { definition: rowItem, columnIndex: i, item: item, finalizer: finalizeUserEdit.bind(this, rowItem, item, i) } }\"></ng-container>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #HierarchyNavigator let-item>\r\n <span *ngIf=\"!item.parent\" class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\r\n <span *ngIf=\"item.parent && item._expanded\" class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey])\"></span>\r\n <span *ngIf=\"item.parent && !item._expanded\" class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey])\"></span>\r\n &nbsp;\r\n</ng-template>\r\n\r\n<!-- Questo template contiene i pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\r\n<ng-template #bodyDeleteAndExport let-options>\r\n <ng-container *ngIf=\"Removal && !RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted)\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted)\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"Removal && RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!options.item[RemovalCondition]\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\r\n </ng-container>\r\n <td *ngIf=\"Export || HiddenColumns || CornerMenuOptions\" class=\"est-sticky-last-column{{options.even && !Hierarchy ? '-alt' : ''}}\"></td>\r\n</ng-template>\r\n\r\n<!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\r\n<context-menu #emptyMenu>\r\n <ng-template contextMenuItem>\r\n <span>\r\n <em>{{'No operations available' | localize : lc}}...</em>\r\n </span>\r\n </ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" cdkDrag>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header est-pointer\" cdkDragHandle>\r\n <h5 class=\"modal-title pull-left\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </h5>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"changeColumnVisibilityModal.hide();\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n </div>\r\n <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\r\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n <thead>\r\n <tr>\r\n <th class=\"est-col-min\" *ngIf=\"HiddenColumns\">\r\n <input class=\"est-pointer\" type=\"checkbox\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\r\n </th>\r\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\r\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\r\n <!--Filler-->\r\n <th></th>\r\n <!-- Pinner -->\r\n <th *ngIf=\"DirectivesBased\" class=\"est-col-min\"></th>\r\n </tr>\r\n </thead>\r\n <tbody \r\n cdkDropList \r\n [cdkDropListData]=\"TMPColumnsList\" \r\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\" \r\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\r\n class=\"est-dropbox\">\r\n\r\n <tr *ngFor=\"let item of TMPColumnsList; let i = index; let last = last\" \r\n class=\"est-pointer est-droplist\" \r\n [class.est-white-selected]=\"lastSelectedItemID == item.id\" \r\n [class.est-no-selection]=\"!item.visible\"\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\r\n\r\n <td *ngIf=\"HiddenColumns\">\r\n <input type=\"checkbox\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\r\n </td>\r\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\r\n <ng-container *ngIf=\"item.template\">\r\n <!-- Padri -->\r\n <span *ngIf=\"item.parentTemplates && item.parentTemplates.length > 0\" class=\"est-fw-bold est-fs-13\">\r\n (&nbsp;\r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last\">\r\n <ng-container *ngIf=\"parent.tmpl\"><ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"parent.content\">{{parent.content}}</ng-container>\r\n <span *ngIf=\"!last\">&nbsp;-&nbsp;</span>\r\n </ng-container>\r\n &nbsp;)\r\n </span>\r\n <!-- Template header originale -->\r\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.template\">{{item.description}}</ng-container>\r\n </td>\r\n <!--Filler-->\r\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\r\n <!-- Pinner -->\r\n <td *ngIf=\"DirectivesBased && ColumnsPinnable\"><span *ngIf=\"!item.fixed && item.pinnable\" class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; changeColumnVisibilityModal.hide();\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && changeColumnVisibilityModal.hide()\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>",
1506
+ template: "<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate\">\r\n <div class=\"pull-right\">\r\n {{'Update every' | localize : lc}}&nbsp;<input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" />&nbsp;{{'second/s' | localize : lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2\">\r\n <label class=\"est-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" (ngModelChange)=\"autoUpdateChanged();\" />\r\n <div class=\"est-slider round\"></div>\r\n </label>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<div *ngIf=\"View\" class=\"est-relative\">\r\n <div *ngIf=\"FirstBind && ShowLoadingOnBootstrap\" class=\"est-loading-box\">\r\n <div class=\"est-loading-content\">\r\n <span class=\"fa fa-spinner fa-spin\"></span>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"est-top-pager\" *ngIf=\"PagingStyle == 'both' || PagingStyle == 'top'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n\r\n <div class=\"est-top-allselect\" *ngIf=\"canSelectAll || (View?.selection || arraymodeSelection)?.all\">\r\n <span>{{ (selectedObjects == -1 ? ('All the' | localize : lc) : ((selectedObjects || 0) | number : '0.0-0' : locale)) + ' ' + ((selectedObjects == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span>&nbsp;\r\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n </div>\r\n\r\n <div class=\"table-responsive datatable {{ContainerClass}}\" [style.max-height.px]=\"MaxHeight\">\r\n <table class=\"{{ TableClass }} est-margin-bottom-10 est\" [class.est-high-density]=\"HighCellDensity\">\r\n <thead [hidden]=\"HeaderHidden || FirstBind\">\r\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\r\n <tr *ngIf=\"(SelectAll && !SingleSelection) || PagingStyle != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns.Global\" [class.est-hidden-view]=\"!canSelectAll && !(View?.selection || arraymodeSelection)?.all && PagingStyle == 'bottom'\">\r\n <p class=\"est-hidden-view app-margin-bottom-0\">\u00A7</p>\r\n </th>\r\n </tr>\r\n\r\n <!-- Blocco header group -->\r\n <ng-container *ngIf=\"RowThGroups\">\r\n <tr *ngFor=\"let level of RowThGroups\">\r\n <th *ngFor=\"let cell of level\" [attr.colspan]=\"cell.Span\" \r\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\r\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\r\n class=\"est-text-center\">\r\n <ng-container *ngIf=\"cell.Pinned;\">\r\n <div class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!cell.Pinned && cell.Content; Else: cell.Template\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!RowThGroups\">\r\n <tr *ngIf=\"HasHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n \r\n <!-- Blocco header group secondario -->\r\n <tr *ngIf=\"HasSecondaryHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n </ng-container>\r\n\r\n <!-- Blocco effettivo degli header -->\r\n <tr>\r\n <!-- Aggiungo una checkbox se la selezione \u00E8 attiva -->\r\n <th class=\"est-col-min\" *ngIf=\"Selection && !HasPinnedColumns\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n\r\n <!-- Header che valgono per view mode e array mode -->\r\n <ng-container *ngIf=\"arrayMode || viewMode\">\r\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle propriet\u00E0 -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition\">\r\n <th *ngFor=\"let operation of DynamicOperations\" class=\"est-col-min est-no-side-padding\"></th>\r\n \r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition\">\r\n <ng-container *ngIf=\"rowHeader.Visible\">\r\n <th *ngIf=\"OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onOrderChange)=\"thOrderChanged(rowHeader.PropertyName, $event)\">{{rowHeader.Description}}</th>\r\n <th *ngIf=\"!OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\">{{rowHeader.Description}}</th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\r\n <ng-container *ngIf=\"UseCustomCells && RowTHs && RowTHs.length > 0\">\r\n <th *ngIf=\"HasPinnedColumns\" class=\"est-pinned-header est-col-min\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-simple-border-bottom\">\r\n <th class=\"est-col-min est-no-border\" *ngIf=\"Selection\" [style.width.px]=\"20\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\" [style.width.px]=\"rowHeader.PinnedWidth\" es-th=\"{{rowHeader.ID}}\" \r\n class=\"{{rowHeader.Class || ''}}\" \r\n [class.est-pinned-internal-header]=\"true\" \r\n [class.est-no-border]=\"true\" \r\n [class.est-nowrap]=\"!rowHeader.Wrap\" \r\n [Pinned]=\"true\" [Fixed]=\"rowHeader.Fixed\" [Order]=\"rowHeader.Order\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\" (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs\">\r\n\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\" es-th=\"{{rowHeader.ID}}\" class=\"{{rowHeader.Class || ''}}\" [class.est-ltab-border]=\"rowHeader.LeftBorder\" [class.est-rtab-border]=\"rowHeader.RightBorder\" [class.est-nowrap]=\"!rowHeader.Wrap\" [Order]=\"rowHeader.Order\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!--Per l'eliminazione mi serve un header aggiuntivo-->\r\n <th *ngIf=\"Removal\" [class.est-right-9]=\"Export || HiddenColumns\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\r\n\r\n <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\r\n <th *ngIf=\"Export || HiddenColumns || ColumnsOrdering || CornerMenuOptions\" class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\r\n \r\n <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\r\n <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\r\n <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\r\n\r\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\r\n <div class=\"est-pointer\">\r\n <a class=\"dropdown-item\" *ngIf=\"HiddenColumns || ColumnsOrdering\" (click)=\"columnMetadata_H.resetColumnVisSelection(); changeColumnVisibilityModal.show();\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && CSVExport\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && XLSXExport\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\r\n <a class=\"dropdown-item\" *ngFor=\"let option of CornerMenuOptions\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\r\n </div>\r\n </div>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody [hidden]=\"BodyHidden || FirstBind\" [class.est-no-selection]=\"RangeSelection\">\r\n <!--Con selection attiva richiamo il template che gestisce il context menu-->\r\n <ng-container *ngIf=\"Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode ? false : SelectionDisabled, sel: Selection }}\"></ng-container>\r\n </ng-container>\r\n\r\n <!--Senza selection richiamo il template che NON gestisce il context menu-->\r\n <ng-container *ngIf=\"!Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"PagingStyle == 'both' || PagingStyle == 'bottom'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\r\n<ng-template #pagingElement>\r\n <ng-container *ngIf=\"!FirstBind\">\r\n <!-- Pulsanti avanti-indietro di paginazione -->\r\n <div *ngIf=\"PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)\" class=\"pull-right btn-toolbar\">\r\n <ng-container *ngIf=\"PagerOptions.View?.pagingavailable || viewMode\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"arrayMode && UseArrayModePaging && !SearchView\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <!-- Paginatore dove appare la count e le opzioni di paginazione -->\r\n <div class=\"pull-right\" *ngIf=\"PagerOptions.ShowCount || PagerOptions.ShowPagingOptions\">\r\n <div class=\"est-mt-min-5\" *ngIf=\"PagerOptions.ShowPaging\">\r\n <app-paging *ngIf=\"!PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage\" (pagingSelected)=\"items_H.refreshPaging($event)\"></app-paging>\r\n <app-paging *ngIf=\"PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [GroupMode]=\"PagerOptions.Searches == 'groups'\" [AllSearch]=\"AllSearch\" [View]=\"PagerOptions.View\" (pagingSelected)=\"onItemsPerPageChanged($event);\"></app-paging>\r\n </div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template che contiene i pulsanti per cambiare pagina -->\r\n<ng-template #pagingButtons let-options>\r\n <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\r\n <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\r\n <div *ngIf=\"options.Array\" class=\"est-inline\"><a *ngFor=\"let p of options.Array\" class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a></div>\r\n <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto \u00E8 templatizzato -->\r\n<ng-template #TBodySelection let-templateOptions>\r\n <ng-container *ngFor=\"let item of boundSource; let even = even; let i=index; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || (!Hierarchy && !ArrayGrouping)\" \r\n [class]=\"item._rowClass ? item._rowClass : ''\" \r\n [class.est-line-through]=\"item.removed || item.deleted\" \r\n [class.est-pointer]=\"!item.locked\" \r\n [class.est-white-selected]=\"item._selected && !item.locked\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n [contextMenu]=\"!item.locked ? (ContextMenu || emptyMenu) : emptyMenu\" [contextMenuSubject]=\"item\"\r\n (click)=\"!RangeSelection && handleRowClick($event, item, true)\"\r\n (contextmenu)=\"onRightClick();\">\r\n\r\n <td *ngIf=\"!item.locked && !item._sep && !HasPinnedColumns\">\r\n <input type=\"checkbox\" \r\n [disabled]=\"templateOptions.selDisabled\" \r\n [class.est-pointer]=\"!item.locked\"\r\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\" \r\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td *ngIf=\"(item.locked || item._sep) && !HasPinnedColumns\"></td>\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container> </ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"dynamicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #TBody>\r\n <ng-container *ngFor=\"let item of boundSource; let even = even;\">\r\n <tr *ngIf=\"item._visible || !Hierarchy\" \r\n [class]=\"item._rowClass ? item._rowClass : ''\" \r\n [class.est-line-through]=\"item.removed || item.deleted\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n (click)=\"handleRowClick($event, item, false)\">\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"dynamicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #groupPager let-item>\r\n <td class=\"est-pinned-body \" *ngIf=\"HasPinnedColumns\"><div class=\"est-pinned-border est-cell-group-padding\"></div></td>\r\n <td *ngIf=\"item._grouplevel > 1\" [attr.colspan]=\"item._grouplevel-1\"></td>\r\n <td [attr.colspan]=\"Columns.VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\r\n <div class=\"est-rg-sep-flex-right\" *ngIf=\"RowGroupingPagingStyle == 'right'\">\r\n <div class=\"est-rg-page\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n <div class=\"est-rg-ipp\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><app-paging [CountLabel]=\"CountLabel\" [AllSearch]=\"AllSearch\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></app-paging></div>\r\n </div>\r\n\r\n <div class=\"est-rg-sep-flex-left\" *ngIf=\"RowGroupingPagingStyle == 'left'\">\r\n <div class=\"est-rg-ipp\"><app-paging [AllSearch]=\"AllSearch\" [CountLabel]=\"CountLabel\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></app-paging></div>\r\n <div class=\"est-rg-page\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\r\n<ng-template #basicColumns let-item>\r\n <ng-container *ngIf=\"(!UseCustomCells || EmptyRowTds) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle definite in maniera dinamica dal modello -->\r\n<ng-template #dynamicColumns let-item>\r\n <ng-container *ngIf=\"(!UseCustomCells || EmptyRowTds) && DynamicRowColumnsDefinition\">\r\n <ng-container *ngFor=\"let operation of DynamicOperations; let first = first; let last = last;\">\r\n <ng-container *ngIf=\"!operation.conditionField || (item.properties[operation.conditionField] == operation.conditionValue)\">\r\n <td [class.est-no-right-padding]=\"last\" [class.est-no-left-padding]=\"!first\" class=\"est-col-min\"><span title=\"{{operation.title}}\" class=\"{{operation.iconClass}} est-pointer\" (click)=\"dynamicOperation(item, operation.id)\">{{operation.text}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"operation.conditionField && (item.properties[operation.conditionField] != operation.conditionValue)\">\r\n <td class=\"est-col-min est-no-side-padding\"></td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let rowItem of DynamicRowColumnsDefinition; let i = index\">\r\n\r\n <ng-container *ngIf=\"rowItem.RoutePath && rowItem.Visible\">\r\n <td es-td=\"{{rowItem.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? rowItem.Clss : 'est-nowrap'}}\" [Internal]=\"false\" [Context]=\"item._hash\">\r\n <a [routerLink]=\"dynamicMode_H.generateRouterLink(rowItem.RoutePath, rowItem.RouteParameterProperties, item)\" class=\"est-link\" [innerHTML]=\"item.properties[rowItem.PropertyName]\"></a>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!rowItem.RoutePath && rowItem.Visible\">\r\n <td es-td=\"{{rowItem.PropertyName}}\" \r\n [class.est-selected-cell]=\"selectionStatus[item._ordinal][i]?.selected\" \r\n [class.est-cell-lborder]=\"selectionStatus[item._ordinal][i]?.lborder\"\r\n [class.est-cell-tborder]=\"selectionStatus[item._ordinal][i]?.tborder\"\r\n [class.est-cell-rborder]=\"selectionStatus[item._ordinal][i]?.rborder\"\r\n [class.est-cell-bborder]=\"selectionStatus[item._ordinal][i]?.bborder\"\r\n [class.est-cell-lborder-tmp]=\"!selectionStatus[item._ordinal][i]?.lborder && !selectionStatus[item._ordinal][i]?.loverlaps\"\r\n [class.est-cell-rborder-tmp]=\"!selectionStatus[item._ordinal][i]?.rborder && !selectionStatus[item._ordinal][i]?.roverlaps\"\r\n (click)=\"dbClickEditOrSingleClickRowSelection($event, rowItem, item, i)\" \r\n class=\"{{UserDefinedDynamicCols ? rowItem.Clss : 'est-nowrap'}} est-default-row-height\" \r\n [Internal]=\"false\" [class.est-no-selection]=\"!!Editable\" [Context]=\"item._hash\"\r\n id=\"estd_{{rowItem.PropertyName}}_{{item._ordinal}}_{{i}}\" (mousedown)=\"mousedown($event, rowItem, item)\" (mouseenter)=\"mouseenter($event)\" (mouseup)=\"mouseup($event)\">\r\n\r\n <div [class.est-edit-hidden]=\"rowItem.edits[item._hash]?._editing\" >\r\n <ng-container *ngTemplateOutlet=\"findEsTd(rowItem.PropertyName, rowItem.RendererName) || defaultEsTd; context: { $implicit: { definition: rowItem, value: item.properties[rowItem.PropertyName], type: rowItem.PropertyType} }\"></ng-container>\r\n </div>\r\n <div *ngIf=\"rowItem.edits[item._hash]?._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"findEditor(rowItem.PropertyName, rowItem.EditorName) || defaultEditor; context: { $implicit: { definition: rowItem, columnIndex: i, item: item, finalizer: finalizeUserEdit.bind(this, rowItem, item, i) } }\"></ng-container>\r\n </div>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditor let-ctx>\r\n <ng-container *ngIf=\"ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Options]=\"ctx.definition.Options\" [FocusSubject]=\"FocusSubject\" [(ngModel)]=\"ctx.item.properties[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n <ng-container *ngIf=\"!ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Options]=\"ctx.definition.Options\" [FocusSubject]=\"FocusSubject\" [(ngModel)]=\"ctx.item[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-ctx>\r\n <!-- Formattare il valore in base a valType.type -->\r\n <ng-container *ngIf=\"ctx.type == 'enum'\">\r\n {{ getSelected(ctx.definition.PropertySource, ctx.value).description }}\r\n </ng-container>\r\n <ng-container *ngIf=\"ctx.type != 'enum'\">\r\n {{ctx.value}}\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale delle celle custom se configurate -->\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells && !EmptyRowTds\">\r\n <td *ngIf=\"HasPinnedColumns\" \r\n class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border\">\r\n <td *ngIf=\"!item.locked && !item._sep && Selection\" class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\r\n <input type=\"checkbox\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td class=\"est-no-border est-col-min\" *ngIf=\"(item.locked || item._sep) && Selection\" [style.width.px]=\"20\"></td>\r\n\r\n <ng-container *ngFor=\"let rowItem of RowTDs[item._hash]; let i = index\">\r\n <td *ngIf=\"rowItem && rowItem.Pinned\" [style.width.px]=\"rowItem.PinnedWidth\" es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-no-selection]=\"Editable &&!!rowItem.PropertyName\" [class.est-no-border]=\"true\" [class.est-rg-hdr]=\"rowItem.GroupHeader\" [class.est-rg-agg]=\"rowItem.GroupAggregation\" \r\n [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\" (click)=\"dbClickEditOrSingleClickRowSelection($event, rowItem, item, i)\">\r\n\r\n <div [class.est-edit-hidden]=\"rowItem._editing\" [class.est-pre]=\"!(Hierarchy && i == 0)\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: rowItem.Multi ? (item[rowItem.MultiProp] ? item[rowItem.MultiProp][rowItem.MultiIndex] : {}) : item }\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"!rowItem.Multi && rowItem.Template\"><ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: rowItem.Multi ? (item[rowItem.MultiProp] ? item[rowItem.MultiProp][rowItem.MultiIndex] : {}) : item }\"></ng-container></ng-container>\r\n <span *ngIf=\"rowItem.Multi && rowItem.Template\"><ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: (item[rowItem.MultiProp] ? item[rowItem.MultiProp][rowItem.MultiIndex] : {}) }\"></ng-container></span>\r\n <ng-container *ngIf=\"!rowItem.Template && !rowItem.Multi\">\r\n <span *ngIf=\"rowItem.Content && !rowItem.PropAccessor\">{{rowItem.Content}}</span>\r\n <span *ngIf=\"!rowItem.Content && rowItem.PropAccessor\">{{item.values? item.values[rowItem.PropAccessor] : item[rowItem.PropAccessor]}}</span>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"rowItem._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"findEditor(rowItem.PropertyName) || defaultEditor; context: { $implicit: { definition: rowItem, columnIndex: i, item: item, finalizer: finalizeUserEdit.bind(this, rowItem, item, i) } }\"></ng-container>\r\n </div>\r\n </td>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <ng-container *ngFor=\"let rowItem of RowTDs[item._hash]; let i = index\">\r\n <ng-container *ngIf=\"rowItem && !rowItem.Pinned\">\r\n\r\n <!-- Casistica senza bodyRef, quindi con direttive per i td -->\r\n <ng-container *ngIf=\"!bodyRef && rowItem.Visible\">\r\n <td es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" \r\n [class.est-selected-cell]=\"selectionStatus[item._ordinal][i]?.selected\" \r\n [class.est-cell-lborder]=\"selectionStatus[item._ordinal][i]?.lborder\"\r\n [class.est-cell-tborder]=\"selectionStatus[item._ordinal][i]?.tborder\"\r\n [class.est-cell-rborder]=\"selectionStatus[item._ordinal][i]?.rborder\"\r\n [class.est-cell-bborder]=\"selectionStatus[item._ordinal][i]?.bborder\"\r\n [class.est-ltab-border]=\"rowItem.LeftBorder && !selectionStatus[item._ordinal][i]?.lborder\" \r\n [class.est-rtab-border]=\"rowItem.RightBorder && !selectionStatus[item._ordinal][i]?.rborder\" \r\n [class.est-cell-lborder-tmp]=\"!selectionStatus[item._ordinal][i]?.lborder && !selectionStatus[item._ordinal][i]?.loverlaps && !rowItem.LeftBorder\"\r\n [class.est-cell-rborder-tmp]=\"!selectionStatus[item._ordinal][i]?.rborder && !selectionStatus[item._ordinal][i]?.roverlaps && !rowItem.RightBorder\"\r\n [class.est-no-selection]=\"Editable && !!rowItem.PropertyName\" [class.est-rg-hdr]=\"rowItem.GroupHeader\" [class.est-rg-agg]=\"rowItem.GroupAggregation\" \r\n [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\" (click)=\"dbClickEditOrSingleClickRowSelection($event, rowItem, item, i)\"\r\n (onCellGeneration)=\"registerCell($event)\" [Context]=\"item._hash\"\r\n id=\"{{item._ordinal}}_{{i}}\" (mousedown)=\"mousedown($event, rowItem, item)\" (mouseenter)=\"mouseenter($event)\" (mouseup)=\"mouseup($event)\">\r\n <div [class.est-edit-hidden]=\"rowItem._editing\" [class.est-pre]=\"!(Hierarchy && i == 0)\" >\r\n <ng-container *ngIf=\"Hierarchy && i == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"!rowItem.Multi && rowItem.Template\"><ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"rowItem.Multi && rowItem.Template\"><ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: (item[rowItem.MultiProp] ? item[rowItem.MultiProp][rowItem.MultiIndex] : {}) }\"></ng-container></span>\r\n <ng-container *ngIf=\"!rowItem.Template && !rowItem.Multi\">\r\n <span *ngIf=\"rowItem.Content && !rowItem.PropAccessor\">{{rowItem.Content}}</span>\r\n <span *ngIf=\"!rowItem.Content && rowItem.PropAccessor\">{{item.values? item.values[rowItem.PropAccessor] : item[rowItem.PropAccessor]}}</span>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"rowItem._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"findEditor(rowItem.PropertyName) || defaultEditor; context: { $implicit: { definition: rowItem, columnIndex: i, item: item, finalizer: finalizeUserEdit.bind(this, rowItem, item, i) } }\"></ng-container>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #HierarchyNavigator let-item>\r\n <span *ngIf=\"!item.parent\" class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\r\n <span *ngIf=\"item.parent && item._expanded\" class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey])\"></span>\r\n <span *ngIf=\"item.parent && !item._expanded\" class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey])\"></span>\r\n &nbsp;\r\n</ng-template>\r\n\r\n<!-- Questo template contiene i pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\r\n<ng-template #bodyDeleteAndExport let-options>\r\n <ng-container *ngIf=\"Removal && !RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted)\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted)\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"Removal && RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!options.item[RemovalCondition]\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\r\n </ng-container>\r\n <td *ngIf=\"Export || HiddenColumns || CornerMenuOptions\" class=\"est-sticky-last-column{{options.even && !Hierarchy ? '-alt' : ''}}\"></td>\r\n</ng-template>\r\n\r\n<!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\r\n<context-menu #emptyMenu>\r\n <ng-template contextMenuItem>\r\n <span>\r\n <em>{{'No operations available' | localize : lc}}...</em>\r\n </span>\r\n </ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" cdkDrag>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header est-pointer\" cdkDragHandle>\r\n <h5 class=\"modal-title pull-left\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </h5>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"changeColumnVisibilityModal.hide();\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n </div>\r\n <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\r\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n <thead>\r\n <tr>\r\n <th class=\"est-col-min\" *ngIf=\"HiddenColumns\">\r\n <input class=\"est-pointer\" type=\"checkbox\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\r\n </th>\r\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\r\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\r\n <!--Filler-->\r\n <th></th>\r\n <!-- Pinner -->\r\n <th *ngIf=\"DirectivesBased\" class=\"est-col-min\"></th>\r\n </tr>\r\n </thead>\r\n <tbody \r\n cdkDropList \r\n [cdkDropListData]=\"TMPColumnsList\" \r\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\" \r\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\r\n class=\"est-dropbox\">\r\n\r\n <tr *ngFor=\"let item of TMPColumnsList; let i = index; let last = last\" \r\n class=\"est-pointer est-droplist\" \r\n [class.est-white-selected]=\"lastSelectedItemID == item.id\" \r\n [class.est-no-selection]=\"!item.visible\"\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\r\n\r\n <td *ngIf=\"HiddenColumns\">\r\n <input type=\"checkbox\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\r\n </td>\r\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\r\n <ng-container *ngIf=\"item.template\">\r\n <!-- Padri -->\r\n <span *ngIf=\"item.parentTemplates && item.parentTemplates.length > 0\" class=\"est-fw-bold est-fs-13\">\r\n (&nbsp;\r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last\">\r\n <ng-container *ngIf=\"parent.tmpl\"><ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"parent.content\">{{parent.content}}</ng-container>\r\n <span *ngIf=\"!last\">&nbsp;-&nbsp;</span>\r\n </ng-container>\r\n &nbsp;)\r\n </span>\r\n <!-- Template header originale -->\r\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.template\">{{item.description}}</ng-container>\r\n </td>\r\n <!--Filler-->\r\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\r\n <!-- Pinner -->\r\n <td *ngIf=\"DirectivesBased && ColumnsPinnable\"><span *ngIf=\"!item.fixed && item.pinnable\" class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; changeColumnVisibilityModal.hide();\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && changeColumnVisibilityModal.hide()\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>",
1502
1507
  styles: [".est-loading-box{height:200px;text-align:center;position:relative;background:#ccc}.est-loading-content{margin:0;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:35px}.est-scrollable{max-height:600px;overflow:auto}.est-head-resizer{top:0;right:0;bottom:0;width:7px;position:absolute;cursor:col-resize}.est-head-resizer-internal{top:0;right:0;left:6px;bottom:0;width:1px;position:absolute;background-color:#ccc;height:100%}.est-pointer{cursor:pointer}.est-high-density td,.est-high-density th{padding:0 .2rem}.est-default-row-height{height:31px}.est-no-selection{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.est-edit-hidden{height:1px!important}.est-edit-hidden,.est-hidden-view{visibility:hidden}.est-no-border{border:none!important}.est-nowrap{white-space:nowrap}.est-mt-min-5{margin-top:-5px}.est-white-selected{background-color:#ddd!important}.est-line-through{text-decoration:line-through}.est-no-side-padding{padding-left:0;padding-right:0}.est-no-left-padding,.est-no-right-padding{padding-left:0}.est-col-min{width:1px}.est-margin-bottom-0{margin-bottom:0!important}.est-margin-right-10{margin-right:10px!important}.est-right-9{right:9px!important}.est-table-dotted-menu{padding:0 0 2px!important;color:#999}.est-fs-18{font-size:18px}.est-fs-13,.est-fs-14{font-size:14px}.est-fw-bold{font-weight:700}.est-padding-3{padding:3px!important}.est-page-container{position:relative}.est-bring-to-front-strong{z-index:99999999!important}.est-switch{position:relative;display:inline-block;width:30px;height:17px;margin-bottom:0;margin-right:5px;margin-left:5px}.est-switch input{display:none}.est-slider{cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc}.est-slider,.est-slider:before{position:absolute;transition:.4s}.est-slider:before{content:\"\";height:13px;width:13px;left:3px;bottom:2px;background-color:#fff}input:checked+.est-slider{background-color:#2196f3}input:focus+.est-slider{box-shadow:0 0 1px #2196f3}input:checked+.est-slider:before{transform:translateX(11px)}.est-slider.round{border-radius:10px}.est-slider.round:before{border-radius:50%}.est-custom-input{width:30px;display:inline;padding:1px;height:20px}.est-row-lvl-1 td:first-child{padding-left:5px}.est-row-lvl-2 td:first-child{padding-left:20px}.est-row-lvl-3 td:first-child{padding-left:35px}.est-row-lvl-4 td:first-child{padding-left:50px}.est-row-lvl-5 td:first-child{padding-left:65px}.est-row-lvl-6 td:first-child{padding-left:80px}.est-row-lvl-7 td:first-child{padding-left:95px}.est-row-lvl-8 td:first-child{padding-left:110px}.est-row-lvl-9 td:first-child{padding-left:125px}.est-row-lvl-10 td:first-child{padding-left:140px}.est-row-lvl-11 td:first-child{padding-left:155px}.est-row-lvl-12 td:first-child{padding-left:170px}.est-row-lvl-13 td:first-child{padding-left:185px}.est-row-lvl-14 td:first-child{padding-left:200px}.est-row-lvl-15 td:first-child{padding-left:215px}.est-row-lvl-16 td:first-child{padding-left:230px}.est-row-lvl-17 td:first-child{padding-left:245px}.est-row-lvl-18 td:first-child{padding-left:260px}.est-row-lvl-19 td:first-child{padding-left:275px}.est-row-lvl-20 td:first-child{padding-left:290px}.est-row-lvl-21 td:first-child{padding-left:305px}.est-row-lvl-22 td:first-child{padding-left:320px}.est-row-lvl-23 td:first-child{padding-left:335px}.est-row-lvl-24 td:first-child{padding-left:350px}.est-row-lvl-25 td:first-child{padding-left:365px}.est-row-lvl-26 td:first-child{padding-left:380px}.est-row-lvl-27 td:first-child{padding-left:395px}.est-row-lvl-28 td:first-child{padding-left:410px}.est-row-lvl-29 td:first-child{padding-left:425px}.est-row-lvl-30 td:first-child{padding-left:440px}.est-row-lvl-31 td:first-child{padding-left:455px}.est-row-lvl-32 td:first-child{padding-left:470px}.est-row-lvl-33 td:first-child{padding-left:485px}.est-row-lvl-34 td:first-child{padding-left:500px}.est-row-lvl-35 td:first-child{padding-left:515px}.est-row-lvl-36 td:first-child{padding-left:530px}.est-row-lvl-37 td:first-child{padding-left:545px}.est-row-lvl-38 td:first-child{padding-left:560px}.est-row-lvl-39 td:first-child{padding-left:575px}.est-row-lvl-40 td:first-child{padding-left:590px}.est-row-lvl-41 td:first-child{padding-left:605px}.est-row-lvl-42 td:first-child{padding-left:620px}.est-row-lvl-43 td:first-child{padding-left:635px}.est-row-lvl-44 td:first-child{padding-left:650px}.est-row-lvl-45 td:first-child{padding-left:665px}.est-row-lvl-46 td:first-child{padding-left:680px}.est-row-lvl-47 td:first-child{padding-left:695px}.est-row-lvl-48 td:first-child{padding-left:710px}.est-row-lvl-49 td:first-child{padding-left:725px}.est-row-lvl-50 td:first-child{padding-left:740px}.est-row-lvl-51 td:first-child{padding-left:755px}.est-row-lvl-52 td:first-child{padding-left:770px}.est-row-lvl-53 td:first-child{padding-left:785px}.est-row-lvl-54 td:first-child{padding-left:800px}.est-row-lvl-55 td:first-child{padding-left:815px}.est-row-lvl-56 td:first-child{padding-left:830px}.est-row-lvl-57 td:first-child{padding-left:845px}.est-row-lvl-58 td:first-child{padding-left:860px}.est-row-lvl-59 td:first-child{padding-left:875px}.est-row-lvl-60 td:first-child{padding-left:890px}.est-row-lvl-61 td:first-child{padding-left:905px}.est-row-lvl-62 td:first-child{padding-left:920px}.est-row-lvl-63 td:first-child{padding-left:935px}.est-row-lvl-64 td:first-child{padding-left:950px}.est-row-lvl-65 td:first-child{padding-left:965px}.est-row-lvl-66 td:first-child{padding-left:980px}.est-row-lvl-67 td:first-child{padding-left:995px}.est-row-lvl-68 td:first-child{padding-left:1010px}.est-row-lvl-69 td:first-child{padding-left:1025px}.est-row-lvl-70 td:first-child{padding-left:1040px}.est-row-lvl-71 td:first-child{padding-left:1055px}.est-row-lvl-72 td:first-child{padding-left:1070px}.est-row-lvl-73 td:first-child{padding-left:1085px}.est-row-lvl-74 td:first-child{padding-left:1100px}.est-row-lvl-75 td:first-child{padding-left:1115px}.est-row-lvl-76 td:first-child{padding-left:1130px}.est-row-lvl-77 td:first-child{padding-left:1145px}.est-row-lvl-78 td:first-child{padding-left:1160px}.est-row-lvl-79 td:first-child{padding-left:1175px}.est-row-lvl-80 td:first-child{padding-left:1190px}.est-row-lvl-81 td:first-child{padding-left:1205px}.est-row-lvl-82 td:first-child{padding-left:1220px}.est-row-lvl-83 td:first-child{padding-left:1235px}.est-row-lvl-84 td:first-child{padding-left:1250px}.est-row-lvl-85 td:first-child{padding-left:1265px}.est-row-lvl-86 td:first-child{padding-left:1280px}.est-row-lvl-87 td:first-child{padding-left:1295px}.est-row-lvl-88 td:first-child{padding-left:1310px}.est-row-lvl-89 td:first-child{padding-left:1325px}.est-row-lvl-90 td:first-child{padding-left:1340px}.est-row-lvl-91 td:first-child{padding-left:1355px}.est-row-lvl-92 td:first-child{padding-left:1370px}.est-row-lvl-93 td:first-child{padding-left:1385px}.est-row-lvl-94 td:first-child{padding-left:1400px}.est-row-lvl-95 td:first-child{padding-left:1415px}.est-row-lvl-96 td:first-child{padding-left:1430px}.est-row-lvl-97 td:first-child{padding-left:1445px}.est-row-lvl-98 td:first-child{padding-left:1460px}.est-row-lvl-99 td:first-child{padding-left:1475px}.est-relative{position:relative}.est-top-pager{position:absolute;right:0;top:5px}.est-top-allselect{position:absolute;left:0;top:5px;font-weight:700}.est-padding-10{padding:10px!important}.est-margin-right-50{margin-right:50px}.est-margin-left-50{margin-left:50px}.est-quick-unpin{color:#000;margin-left:8px;font-size:14px;transform:rotate(45deg)}.est-page-sel{color:#000;margin-left:3px;margin-right:3px;padding:0 5px;font-size:inherit;border:none;border-radius:15px}.est-page-next,.est-page-prev{color:#000;font-size:inherit;padding:2px 0 0}.est-pinned-header{background-color:#fff;left:0;top:0;position:-webkit-sticky;position:sticky;z-index:1;border-bottom:1px solid #dee2e6!important;padding:0!important}.est-simple-border-bottom{border-bottom:1px solid #dee2e6}.est-pinned-internal-header{border-top:0;border-bottom:0 solid #dee2e6}.est-pinned-border{border-right:2px solid #dee2e6!important}.est-cell-padding{padding:.3rem}.est-pinned-body{background-color:#fff;left:0;position:-webkit-sticky;position:sticky;z-index:1;border-top:1px solid #dee2e6!important;padding:0!important}.est-inline{display:inline!important}.est-inline-block{display:inline-block!important}.est-link{color:#0275d8!important;cursor:pointer;text-decoration:none;display:block}.est-link:hover{color:#23527c!important;cursor:pointer;text-decoration:underline!important}.est-sticky-last-column{right:-1px;position:-webkit-sticky;position:sticky;z-index:0;background-color:#fff}.est-sticky-last-column-alt{right:-1px;position:-webkit-sticky;position:sticky;z-index:0;background-color:#f2f2f2}.est-ltab-border{border-left:1px solid #bbb!important}.est-rtab-border{border-right:1px solid #bbb!important}.est-cell-group-padding{padding:calc(.3rem + 1px);position:absolute;top:0;left:0;height:100%;width:100%}.est-selected-cell{background-color:rgba(33,150,243,.2)}.est-cell-lborder{border-left:1.02px solid #2196f3!important}.est-cell-lborder-tmp{border-left:1.02px solid transparent!important}.est-cell-tborder{border-top:1.02px solid #2196f3!important}.est-cell-rborder{border-right:1.02px solid #2196f3!important}.est-cell-rborder-tmp{border-right:1.02px solid transparent!important}.est-cell-bborder{border-bottom:1.02px solid #2196f3!important}.est-margin-bottom-10{margin-bottom:10px}.est-text-center{text-align:center}.est-flex{display:flex}.est-rg-sep-flex-right{display:flex;flex-direction:row-reverse;width:100%;margin:-5px}.est-rg-sep-flex-left{display:flex;flex-direction:row;width:100%;margin:-5px}.est-rg-hdr{font-weight:700}.est-rg-agg{font-style:italic}.est-rg{background-color:hsla(0,0%,46.7%,.4666666666666667)!important}.est-rg-sep{font-size:12px;padding-right:20px!important;background-color:hsla(0,0%,73.3%,.7333333333333333)!important}.est-rg-ipp{text-align:left;display:inline-flex;margin-right:25px}.est-rg-page{text-align:right;display:inline-flex;font-size:inherit;padding-top:5px}.est-droplist.cdk-drag-placeholder{opacity:0}.est-droplist.cdk-drag-preview{z-index:999999999!important;opacity:1;box-sizing:border-box;border-radius:4px;background-color:#fff;box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.est-droplist.cdk-drag-preview td:not(.drag-visible){visibility:hidden}.est-droplist.cdk-drag-preview td.drag-visible{padding-top:3px}.est-droplist.cdk-drag-animating,.est-droplist.cdk-drop-list-dragging .est-dropbox:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.est-pre{white-space:pre}.est val-datetime .mat-form-field-appearance-outline .mat-form-field-infix input{margin-bottom:3px!important;min-width:130px!important}.est .mat-form-field-flex{height:29px!important;padding:0!important}.est .mat-form-field-flex .mat-form-field-outline{color:#00f}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-start{border-left:none;border-top:none;border-radius:0}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-end{border-top:none;border-radius:0;border-right:none}.est .mat-form-field-wrapper{height:20px;min-height:20px!important;margin-top:0!important}.est .mat-form-field-infix{width:100%!important;min-width:50px!important}.est .mat-form-field-infix select.mat-input-element{margin-top:-5px!important}.est .mat-datepicker-input{margin-bottom:3px!important}.est input{height:20px;padding-top:0!important}"]
1503
1508
  },] }
1504
1509
  ];
@@ -1598,4 +1603,4 @@ EsTableComponent.propDecorators = {
1598
1603
  };
1599
1604
  export class EsTdReference {
1600
1605
  }
1601
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNfdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL2VzLXRhYmxlL2VzX3RhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsVUFBVTtBQUNWLE9BQU8sRUFDSCxTQUFTLEVBQUUsZUFBZSxFQUFhLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFDeEYsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLFNBQVMsRUFBYyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFlLE1BQU0sRUFDOUksTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRSxpQkFBaUI7QUFDakIsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBYyxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hJLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSzNELGlCQUFpQjtBQUNqQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFVdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRWpGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUUzRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUUvRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUVuRiw4QkFBOEI7QUFDOUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxh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ICBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgUXVlcnlMaXN0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIElucHV0LFxyXG4gICAgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIENvbnRlbnRDaGlsZCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIFZpZXdFbmNhcHN1bGF0aW9uLCBPcHRpb25hbCwgU2VsZiwgVGVtcGxhdGVSZWYsIEluamVjdFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuLy8gQ29uZmlndXJhemlvbmlcclxuaW1wb3J0IHsgVXRpbGl0eVNlcnZpY2UsIEV4cG9ydFNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlLCBEYXRlU2VydmljZSwgQ3N2SGVhZGVycywgQ2xpcGJvYXJkU2VydmljZSB9IGZyb20gJ0Blc2ZhZW56YS9leHRlbnNpb25zJztcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gJ0Blc2ZhZW56YS9sb2NhbGl6YXRpb25zJztcclxuaW1wb3J0IHsgUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnQGVzZmFlbnphL3ByZWZlcmVuY2VzJztcclxuXHJcbi8vIFBsdWdpbnNcclxuaW1wb3J0IHsgQ29udGV4dE1lbnVDb21wb25lbnQgfSBmcm9tICdAZXNmYWVuemEvbmd4LWNvbnRleHRtZW51JztcclxuXHJcbi8vIE1vZGVsbGkgLyBUaXBpXHJcbmltcG9ydCB7IEFwcFNlYXJjaCB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9BcHBTZWFyY2hcIjtcclxuaW1wb3J0IHsgQXBwT3JkZXJpbmcgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvQXBwT3JkZXJpbmdcIjtcclxuaW1wb3J0IHsgRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uXCI7XHJcbmltcG9ydCB7IENvcm5lck1lbnVPcHRpb24gfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9Db3JuZXJNZW51T3B0aW9uXCI7XHJcbmltcG9ydCB7IEVzVGFibGVPcGVyYXRpb25EZWZpbml0aW9uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvRXNUYWJsZU9wZXJhdGlvbkRlZmluaXRpb25cIjtcclxuaW1wb3J0IHsgRXNUYWJsZUNvbHVtbiB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL0VzVGFibGVDb2x1bW5cIjtcclxuaW1wb3J0IHsgR3JvdXBQYWdlciB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL0dyb3VwUGFnZXJcIjtcclxuaW1wb3J0IHsgR3JvdXBSb3V0ZUZyYWdtZW50IH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvR3JvdXBSb3V0ZUZyYWdtZW50XCI7XHJcbmltcG9ydCB7IFRoRWxlbWVudCB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL1RoRWxlbWVudFwiO1xyXG5pbXBvcnQgeyBUZEVsZW1lbnQgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9UZEVsZW1lbnRcIjtcclxuaW1wb3J0IHsgSXRlbXNTZWxlY3Rpb24gfSBmcm9tICcuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9JdGVtc1NlbGVjdGlvbic7XHJcbmltcG9ydCB7IEdyb3VwT3JBZ2dyZWdhdGlvbiB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9Hcm91cE9yQWdncmVnYXRpb25cIjtcclxuaW1wb3J0IHsgR3JvdXBGaWx0ZXIgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvR3JvdXBGaWx0ZXJcIjtcclxuaW1wb3J0IHsgR3JvdXAgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvR3JvdXBcIjtcclxuaW1wb3J0IHsgRXNUYWJsZU1vZGVsQ2hhbmdlIH0gZnJvbSAnLi4vLi4vZG9tYWluL2V4dGVybmFscy9Fc1RhYmxlTW9kZWxDaGFuZ2UnO1xyXG5pbXBvcnQgeyBJdGVtUHJvcEVkaXRhYmxlUmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vZG9tYWluL2V4dGVybmFscy9JdGVtUHJvcEVkaXRhYmxlUmVmZXJlbmNlJztcclxuaW1wb3J0IHsgRXNUYWJsZURlZmF1bHRhYmxlIH0gZnJvbSAnLi4vLi4vZG9tYWluL2NvbmZpZ3VyYXRpb24vRXNUYWJsZURlZmF1bHRhYmxlJztcclxuXHJcbi8vIENvbXBvbmVudGkgZSBMb2NhbGl6emF6aW9uZVxyXG5pbXBvcnQgeyBFc1RkRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9lc190ZC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBFc1RoRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9lc190aC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBFc1RkRWRpdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9lc190ZF9lZGl0b3IuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgSUVzVGFibGVUZW1wbGF0ZVdyYXBwZXIgfSBmcm9tICcuLi9lcy10YWJsZS10ZW1wbGF0ZS9lc190YWJsZV90ZW1wbGF0ZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFc1RhYmxlTG9jIH0gZnJvbSAnLi9lc190YWJsZS5jb21wb25lbnQubG9jJztcclxuXHJcbmltcG9ydCB7IEVTVF9ERUZBVUxUUywgRVNUX0xPQ0FMRSB9IGZyb20gJy4uLy4uL3Rva2Vucyc7XHJcblxyXG4vLyBIYW5kbGVyc1xyXG5pbXBvcnQgeyBFeHBvcnRIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvRXhwb3J0SGFuZGxlclwiO1xyXG5pbXBvcnQgeyBDb2x1bW5NZXRhZGF0YUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9Db2x1bW5NZXRhZGF0YUhhbmRsZXJcIjtcclxuaW1wb3J0IHsgRHluYW1pY01vZGVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvRHluYW1pY01vZGVIYW5kbGVyXCI7XHJcbmltcG9ydCB7IEhpZXJhcmNoeU1vZGVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvSGllcmFyY2h5TW9kZUhhbmRsZXJcIjtcclxuaW1wb3J0IHsgSXRlbXNIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvSXRlbXNIYW5kbGVyXCI7XHJcbmltcG9ydCB7IFJlcG9ydE1vZGVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvUmVwb3J0TW9kZUhhbmRsZXJcIjtcclxuaW1wb3J0IHsgUm93R3JvdXBpbmdIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvUm93R3JvdXBpbmdIYW5kbGVyXCI7XHJcbmltcG9ydCB7IFNlbGVjdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9TZWxlY3Rpb25IYW5kbGVyXCI7XHJcbmltcG9ydCB7IFV0aWxpdGllc0hhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9VdGlsaXRpZXNIYW5kbGVyXCI7XHJcbmltcG9ydCB7IENvcHlQYXN0ZURldGVjdG9yIH0gZnJvbSAnLi4vLi4vY29yZS9Db3B5UGFzdGVEZXRlY3Rvcic7XHJcblxyXG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRXNUZCB9IGZyb20gJy4uL2VzLXRkL2VzX3RkLmNvbXBvbmVudCc7XHJcblxyXG4vKiogQ29tcG9uZW50ZSBjaGUgcGVybWV0dGUgZGkgcmFwcHJlc2VudGFyZSB1bmEgZ3JpZ2xpYSBkaSB2YWxvcmkgKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2VzLXRhYmxlJyxcclxuICAgIHZpZXdQcm92aWRlcnM6IFt7IHByb3ZpZGU6IExvY2FsaXphdGlvblNlcnZpY2UsIHVzZUNsYXNzOiBFc1RhYmxlTG9jIH1dLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZXNfdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9lc190YWJsZS5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEVzVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzIHtcclxuXHJcbiAgICAvLyBDb21wb25lbnRpIHBlciBsYSBnZXN0aW9uZSBkZWxsZSB2YXJpZSBmdW56aW9uYWxpdMOgIGRlbGwnZXMtdGFibGVcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBleHBvcnRfSDogRXhwb3J0SGFuZGxlcjtcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBjb2x1bW5NZXRhZGF0YV9IOiBDb2x1bW5NZXRhZGF0YUhhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgZHluYW1pY01vZGVfSDogRHluYW1pY01vZGVIYW5kbGVyO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIGhpZXJhcmNoeU1vZGVfSDogSGllcmFyY2h5TW9kZUhhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgaXRlbXNfSDogSXRlbXNIYW5kbGVyO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIHJlcG9ydE1vZGVfSDogUmVwb3J0TW9kZUhhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgcm93R3JvdXBpbmdfSDogUm93R3JvdXBpbmdIYW5kbGVyXHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgc2VsZWN0aW9uX0g6IFNlbGVjdGlvbkhhbmRsZXI7XHJcblxyXG4gICAgLy8gU3Vic2NyaWJlcnMgcGVyIGdsaSBldmVudGkgZGkgY29waWEgZSBpbmNvbGxhXHJcbiAgICAvKiogQGlnbm9yZSAqLyBwcml2YXRlIGNvcHlTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICAgIC8qKiBAaWdub3JlICovIHByaXZhdGUgcGFzdGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2wsXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBwcmVmU2VydmljZTogUHJlZmVyZW5jZXNTZXJ2aWNlLFxyXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRVNUX0RFRkFVTFRTKSBwcml2YXRlIGRlYWZ1bHRzOiBFc1RhYmxlRGVmYXVsdGFibGUsXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChFU1RfTE9DQUxFKSBwdWJsaWMgbG9jYWxlOiBzdHJpbmcsXHJcbiAgICAgICAgcHVibGljIGxjOiBMb2NhbGl6YXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIHByaXZhdGUgdXRpbGl0aWVzX0g6IFV0aWxpdGllc0hhbmRsZXIsXHJcbiAgICAgICAgcHVibGljIHV0aUV4dHM6IFV0aWxpdHlTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgZXhwRXh0czogRXhwb3J0U2VydmljZSxcclxuICAgICAgICBwdWJsaWMgZGF0ZUV4dHM6IERhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbXNnRXh0czogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjb3B5UGFzdGVEZXRlY3RvcjogQ29weVBhc3RlRGV0ZWN0b3IsXHJcbiAgICAgICAgcHJpdmF0ZSBjbGlwYm9hcmRTZXJ2aWNlOiBDbGlwYm9hcmRTZXJ2aWNlKSB7XHJcblxyXG4gICAgICAgIHRoaXMuY29weVN1YnNjcmlwdGlvbiA9IHRoaXMuY29weVBhc3RlRGV0ZWN0b3IuT25Db3B5LnN1YnNjcmliZSgoKSA9PiB7IHRoaXMuaGFuZGxlQ29weSgpOyB9KTtcclxuICAgICAgICB0aGlzLnBhc3RlU3Vic2NyaXB0aW9uID0gdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5PblBhc3RlLnN1YnNjcmliZSgoKSA9PiB7IHRoaXMuaGFuZGxlUGFzdGUoKTsgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZXhwb3J0X0ggPSBuZXcgRXhwb3J0SGFuZGxlcih0aGlzLCB0aGlzLmV4cEV4dHMsIHRoaXMubXNnRXh0cywgdGhpcy51dGlFeHRzLCB0aGlzLmRhdGVFeHRzKTtcclxuICAgICAgICB0aGlzLnJvd0dyb3VwaW5nX0ggPSBuZXcgUm93R3JvdXBpbmdIYW5kbGVyKHRoaXMsIHRoaXMudXRpbGl0aWVzX0gsIHRoaXMuZGF0ZUV4dHMpO1xyXG4gICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSCA9IG5ldyBDb2x1bW5NZXRhZGF0YUhhbmRsZXIodGhpcywgdGhpcy51dGlsaXRpZXNfSCwgdGhpcy51dGlFeHRzLCB0aGlzLnByZWZTZXJ2aWNlLCB0aGlzLnJvd0dyb3VwaW5nX0gpO1xyXG4gICAgICAgIHRoaXMuZHluYW1pY01vZGVfSCA9IG5ldyBEeW5hbWljTW9kZUhhbmRsZXIodGhpcyk7XHJcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlNb2RlX0ggPSBuZXcgSGllcmFyY2h5TW9kZUhhbmRsZXIodGhpcyk7XHJcbiAgICAgICAgdGhpcy5pdGVtc19IID0gbmV3IEl0ZW1zSGFuZGxlcih0aGlzLCB0aGlzLnV0aWxpdGllc19IKTtcclxuICAgICAgICB0aGlzLnJlcG9ydE1vZGVfSCA9IG5ldyBSZXBvcnRNb2RlSGFuZGxlcih0aGlzLCB0aGlzLnV0aWxpdGllc19IKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9IID0gbmV3IFNlbGVjdGlvbkhhbmRsZXIodGhpcywgdGhpcy5yb3dHcm91cGluZ19IKTtcclxuXHJcbiAgICAgICAgaWYgKG5nQ29udHJvbClcclxuICAgICAgICAgICAgbmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG5cclxuICAgICAgICAvLyBBc3NlZ25hemlvbmUgcGVyIHR1dHRpIGdsaSBJbnB1dCBkaSBkZWZhdWx0XHJcbiAgICAgICAgdGhpcy5Db2x1bW5zUmVzaXphYmxlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkNvbHVtbnNSZXNpemFibGUsIHRoaXMuZGVhZnVsdHM/LkNvbHVtbnNSZXNpemFibGUpO1xyXG4gICAgICAgIHRoaXMuQXV0b1VwZGF0ZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5BdXRvVXBkYXRlLCB0aGlzLmRlYWZ1bHRzPy5BdXRvVXBkYXRlKTtcclxuICAgICAgICB0aGlzLkFsbFNlYXJjaCA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5BbGxTZWFyY2gsIHRoaXMuZGVhZnVsdHM/LkFsbFNlYXJjaCwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5FeHBvcnQgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuRXhwb3J0LCB0aGlzLmRlYWZ1bHRzPy5FeHBvcnQpO1xyXG4gICAgICAgIHRoaXMuSGlkZVBhZ2luZyA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5IaWRlUGFnaW5nLCB0aGlzLmRlYWZ1bHRzPy5IaWRlUGFnaW5nLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5IaWRlUGFnaW5nQ291bnQgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuSGlkZVBhZ2luZ0NvdW50LCB0aGlzLmRlYWZ1bHRzPy5IaWRlUGFnaW5nQ291bnQpO1xyXG4gICAgICAgIHRoaXMuSGlkZVBhZ2luZ0J1dHRvbnMgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuSGlkZVBhZ2luZ0J1dHRvbnMsIHRoaXMuZGVhZnVsdHM/LkhpZGVQYWdpbmdCdXR0b25zKTtcclxuICAgICAgICB0aGlzLkNvbnRhaW5lckNsYXNzID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkNvbnRhaW5lckNsYXNzLCB0aGlzLmRlYWZ1bHRzPy5Db250YWluZXJDbGFzcywgJycpO1xyXG4gICAgICAgIHRoaXMuVGFibGVDbGFzcyA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5UYWJsZUNsYXNzLCB0aGlzLmRlYWZ1bHRzPy5UYWJsZUNsYXNzLCAndGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ob3ZlciB0YWJsZS1zbScpO1xyXG4gICAgICAgIHRoaXMuU2VsZWN0aW9uID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlNlbGVjdGlvbiwgdGhpcy5kZWFmdWx0cz8uU2VsZWN0aW9uKTtcclxuICAgICAgICB0aGlzLlNhdmVQcmVmZXJlbmNlcyA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5TYXZlUHJlZmVyZW5jZXMsIHRoaXMuZGVhZnVsdHM/LlNhdmVQcmVmZXJlbmNlcyk7XHJcbiAgICAgICAgdGhpcy5QYWdpbmdTdHlsZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5QYWdpbmdTdHlsZSwgdGhpcy5kZWFmdWx0cz8uUGFnaW5nU3R5bGUsICdib3R0b20nKTtcclxuICAgICAgICB0aGlzLlJvd0dyb3VwaW5nUGFnaW5nU3R5bGUgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuUm93R3JvdXBpbmdQYWdpbmdTdHlsZSwgdGhpcy5kZWFmdWx0cz8uUm93R3JvdXBpbmdQYWdpbmdTdHlsZSwgJ2xlZnQnKTtcclxuICAgICAgICB0aGlzLlVzZVNlbGVjdGlvbkNhY2hlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlVzZVNlbGVjdGlvbkNhY2hlLCB0aGlzLmRlYWZ1bHRzPy5Vc2VTZWxlY3Rpb25DYWNoZSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5TaG93SXRlbUdyb3Vwc0NvbHVtbnMgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuU2hvd0l0ZW1Hcm91cHNDb2x1bW5zLCB0aGlzLmRlYWZ1bHRzPy5TaG93SXRlbUdyb3Vwc0NvbHVtbnMsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLkFycmF5bW9kZUl0ZW1zUGVyUGFnZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5BcnJheW1vZGVJdGVtc1BlclBhZ2UsIHRoaXMuZGVhZnVsdHM/LkFycmF5bW9kZUl0ZW1zUGVyUGFnZSwgMTUpO1xyXG4gICAgICAgIHRoaXMuQ29sdW1uc1Bpbm5hYmxlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkNvbHVtbnNQaW5uYWJsZSwgdGhpcy5kZWFmdWx0cz8uQ29sdW1uc1Bpbm5hYmxlLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogU3ViamVjdCB1dGlsaXp6YXRvIGludGVybmFtZW50ZSBsYXRvIEVzVGFibGUgcGVyIGNhdXNhcmUgaWwgRm9jdXMgbGF0byBjb21wb25lbnRlIGRpIElucHV0ICovXHJcbiAgICBwdWJsaWMgRm9jdXNTdWJqZWN0OiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxyXG4gICAgLyoqIFRpbWVyIGNoZSB2ZXJyw6AgaW1wb3N0YXRvIGEgKipkb3VibGVDbGlja0J1ZmZlck1zKiogcGVyIGNhcGlyZSBzZSDDqCBzdGF0byBlZmZldHR1YXRvIHVuIGNsaWNrIHNpbmdvbG8gbyB1biBkb3VibGVjbGljayAqL1xyXG4gICAgcHJpdmF0ZSBjZWxsRGJDbGlja1RpbWVyOiBhbnk7XHJcbiAgICAvKiogU2UgdmVuZ29ubyBlZmZldHR1YXRpIDIgY2xpY2sgYSBkaXN0YW56YSBpbmZlcmlvcmUgYSBxdWVzdGkgTWlsbGlzZWNvbmRpIHZpZW5lIGNvbnNpZGVyYXRvIHVuIGRvcHBpbyBjbGljayAqL1xyXG4gICAgcHJpdmF0ZSBkb3VibGVDbGlja0J1ZmZlck1zOiBudW1iZXIgPSAyMDA7XHJcbiAgICAvKiogVmlldyBmaW5hbGUgc3UgY3VpIGJpbmRhcnNpIGxhdG8gRnJvbnRlbmQsIGlsIHRpcG8gcHXDsiBlc3NlcmUgSUFwcFNlYXJjaDxhbnk+IChwZXIgbGEgKip2aWV3TW9kZSoqKSwgYW55W10gKHBlciBsJyoqYXJyYXlNb2RlKiopICovXHJcbiAgICBwdWJsaWMgVmlldzogYW55ID0gbnVsbDtcclxuICAgIC8qKiBNb2RlbGxvIGRhIGN1aSBsJ2VzLXRhYmxlIG1vc3RyYSBpIHB1bHNhbnRpIGRpIHBhZ2luYXppb25lIGluIGJhc3NvIGEgZGVzdHJhICovXHJcbiAgICBwdWJsaWMgYXJyYXlQdWxzYW50aTogYW55O1xyXG4gICAgLyoqIEluZGljYSBzZSBsJ2VzLXRhYmxlIGRldmUgbW9zdHJhcmUgaWwgY2hlY2sgZ2xvYmFsZSBuZWxsJ2hlYWRlciBwZXIgZmFyZSBpbCBcInNlbGV6aW9uYSB0dXR0b1wiICovXHJcbiAgICBwdWJsaWMgZ2xvYmFsQ2hlY2sgPSBmYWxzZTtcclxuICAgIC8qKiBUaWVuZSBkYSBjb250byBsJ3VsdGltbyBlbGVtZW50byBzZWxlemlvbmF0byBpbiBtb2RvIGRhIHBvdGVyIGVmZmV0dHVhcmUgaWwgU0hJRlQrQ0xJQ0sgKi9cclxuICAgIHByaXZhdGUgbGFzdFNlbGVjdGVkOiBhbnkgPSBudWxsO1xyXG4gICAgLyoqIENvbnRlZ2dpbyBpbnRlcm5vIHBlciBpbCBudW1lcm8gZGkgZWxlbWVudGkgc2VsZXppb25hdGkgKi9cclxuICAgIHB1YmxpYyBzZWxlY3RlZE9iamVjdHMgPSAwO1xyXG4gICAgLyoqIEluZGljYSBzZSDDqCBwb3NzaWJpbGUgZWZmZXR0dWFyZSB1bmEgc2VsZXppb25lIG1hc3NpdmEgKi9cclxuICAgIHB1YmxpYyBjYW5TZWxlY3RBbGwgPSBmYWxzZTtcclxuICAgIC8qKiBJbmRpY2Egc2UgaWwgY29tcG9uZW50ZSBzdGEgZ2VzdGVuZG8gdW4gSUFwcFNlYXJjaDxhbnk+ICovXHJcbiAgICBwdWJsaWMgdmlld01vZGUgPSBmYWxzZTtcclxuICAgIC8qKiBJbmRpY2Egc2UgaWwgY29tcG9uZW50ZSBzdGEgZ2VzdGVuZG8gdW4gYW55W10gKi9cclxuICAgIHB1YmxpYyBhcnJheU1vZGUgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRlbml0b3JlIGRlZ2xpIGVsZW1lbnRpIGRhIGxpc3RhcmUgbGF0byBpbnRlcmZhY2NpYSBkb3BvIHR1dHRlIGxlIGVsYWJvcmF6aW9uaSBkZWwgY2FzbyxcclxuICAgICAqIGdlbmVyYWxtZW50ZSBub24gc29ubyBhbHRybyBjaGUgdHV0dGkgZ2xpIG9nZ2V0dGkgZGEgcHJlc2VudGFyZSBjb24gaW4gcGnDuSBsJ2hhc2ggY2FsY29sYXRvIHBlciBpZGVudGlmaWNhcmUgMSBvZ2dldHRvIGNvbiBsYSBwcm9wcmlhIHJpZ2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGJvdW5kU291cmNlOiBhbnlbXSA9IFtdO1xyXG4gICAgLyoqIFN0ZXNzYSBjb3NhIGRlbGxhICoqYm91bmRTb3VyY2UqKiwgdXRpbGl6emF0YSBjb21lIGFwcG9nZ2lvIHRlbXBvcmFuZW8gaW50ZXJubyAqL1xyXG4gICAgcHVibGljIFRNUEJvdW5kU291cmNlOiBhbnlbXSA9IFtdO1xyXG4gICAgLyoqIFwiRmV0dGFcIiBkaSBvZ2dldHRpIHV0aWxpenphdGEgbmVsbCdlbmRsZXNzIHNjcm9sbCwgb2duaSBlbGVtZW50byBkaSBxdWVzdG8gYXJyYXkgw6ggdW4gYmxvY2NoZXR0byBkaSAxMDAgZWxlbWVudGkgKi9cclxuICAgIHB1YmxpYyBib3VuZFN1YlNvdXJjZXM6IGFueVtdID0gW107XHJcbiAgICAvKiogUXVlc3RhIGZ1bmdlIGRhIGluZGljYXRvcmUgcGVyIGdsaSBzbGljZSBpbnNlcml0aSwgbGEgbHVuZ2hlenphIGRvdnJlYmJlIGVzc2VyZSBjb3JyaXNwb25kZW50ZSBhICoqYm91bmRTdWJTb3VyY2VzKiogKi9cclxuICAgIHB1YmxpYyBhZGRlZFNsaWNlczogbnVtYmVyW10gPSBbXTtcclxuICAgIC8qKiBWYXJpYWJpbGUgY2hlIGlkZW50aWZpY2EgaWwgdmFsb3JlIGRlbCBcInNlbGV6aW9uYSBUdXR0b1wiIG5lbGxhIHBhZ2luYXppb25lICovXHJcbiAgICBwdWJsaWMgZGVmYXVsdEFsbFBhZ2VPdmVycmlkZSA9IDk5OTk5OTtcclxuICAgIC8qKiBTZXJ2ZSBwZXIgdGVuZXJlIGluIG1lbW9yaWEgaWwgY29udGVnZ2lvIHByZWNlZGVudGUgZSByZWN1cGVyYXJsbyBpbiBjYXNvIGRpdmVudGkgLTIgKHZlcmlmaWNhcmUgY29uIEFsZSBwZXJjaMOpIGxhIGxvZ2ljYSBkZWwgLTIpICovXHJcbiAgICBwdWJsaWMgcHJldmlvdXNDb3VudDogbnVtYmVyO1xyXG4gICAgLyoqIEluZGljYSBzZSB1dGlsaXp6YXJlIGlsIHNpc3RlbWEgZGkgYXV0b3VwZGF0ZSwgY2lvw6ggdW4gdHJpZ2dlciB0aW1lLWl6emF0byBpbiBhbHRvIGEgZGVzdHJhIGRlbGxhIHRhYmVsbGEgY2hlIHJpcGV0ZSBsZSByaWNlcmNoZSBvZ25pIFggKipzZWNvbmRzKiogKi9cclxuICAgIHB1YmxpYyBhdXRvVXBkYXRlID0gZmFsc2U7XHJcbiAgICAvKiogTnVtZXJvIGRpIHNlY29uZGkgZGEgZmFyZSB0cmFzY29ycmVyZSBmcmEgdW5hIHJpY2VyY2EgZSBsJ2FsdHJhICovXHJcbiAgICBwdWJsaWMgc2Vjb25kcyA9ICcxMCc7XHJcbiAgICAvKiogUmlmZXJpbWVudG8gYWxsJ0ludGVydmFsIGNoZSB2aWVuZSBnZW5lcmF0byBzZSAqKmF1dG9VcGRhdGUqKiDDqCBpbXBvc3RhdGEgYSB0cnVlIGluIG1vZG8gZGEgcG90ZXJsbyByaXB1bGlyZSAqL1xyXG4gICAgcHVibGljIHVwZGF0ZVRpbWVyOiBhbnk7XHJcbiAgICAvKiogSW1wb3N0YXRhIGEgdHJ1ZSBvZ25pIHZvbHRhIGNoZSB2aWVuZSBhdnZpYXRhIHVuYSByaWNlcmNhLCBlIGEgZmFsc2Ugb2duaSB2b2x0YSBjaGUgdW4gbnVvdm8gdmFsb3JlIHZpZW5lIHJpY2V2dXRvICovXHJcbiAgICBwdWJsaWMgcmVzZWFyY2hJblByb2dyZXNzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogTW9kZWxsbyByYXBwcmVzZW50YW50ZSB1biBkaXppb25hcmlvIGRpIHJpZ2hlIGRlbGxhIHRhYmVsbGEsIGNvbiBjaGlhdmUgbCdoYXNoIGUgdmFsb3JlIGxhIGxpc3RhIGRpIGNlbGxlICovXHJcbiAgICBwdWJsaWMgUm93VERzOiB7IFtjb250ZXh0OiBzdHJpbmddOiBUZEVsZW1lbnRbXSB9ID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgKipSb3dURHMqKiDDqCB1biBvZ2dldHRvIHZ1b3RvIG8gbWVubyAqL1xyXG4gICAgcHVibGljIEVtcHR5Um93VGRzOiBib29sZWFuO1xyXG4gICAgLyoqIE1vZGVsbG8gZGkgYXBwb2dnaW8gdGVtcG9yYW5lbyBwZXIgaSAqKlJvd1REcyoqICovXHJcbiAgICBwdWJsaWMgVE1QUm93VERzOiB7IFtjb250ZXh0OiBzdHJpbmddOiBUZEVsZW1lbnRbXSB9ID0gbnVsbDtcclxuICAgIC8qKiBNb2RlbGxvIHJhcHByZXNlbnRhbnRlIHVuIHNpbmdvbG8gdGggZGVsbGEgdGFiZWxsYSwgZ2VuZXJhdG8gaW4gYmFzZSBhbGxlIGNvbmZpZ3VyYXppb25pIGUgYWdsaSBvZ2dldHRpIHJpY2V2dXRpICovXHJcbiAgICBwdWJsaWMgUm93VEhzOiBUaEVsZW1lbnRbXSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyBkaSBhcHBvZ2dpbyB0ZW1wb3JhbmVvIHBlciBpICoqUm93VEhzKiogKi9cclxuICAgIHB1YmxpYyBUTVBSb3dUSHM6IFRoRWxlbWVudFtdID0gbnVsbDtcclxuICAgIC8qKiBNb2RlbGxvIGRpIGFwcG9nZ2lvIHRlbXBvcmFuZW8gcGVyIGkgKipSb3dUaEdyb3VwcyoqICovXHJcbiAgICBwdWJsaWMgVE1QUm93VGhHcm91cHM6IHsgU3BhbjogbnVtYmVyLCBUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB9W11bXSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyByYXBwcmVzZW50YW50ZSB1biBzaW5nb2xvIGhlYWRlciBncm91cCBkZWxsYSB0YWJlbGxhLiBRdWVzdGEgbGlzdGEgw6ggZ2nDoCBvcmRpbmF0YSBlIHByb250YSBwZXIgZXNzZXJlIHV0aWxpenphdGEgaW4gbmdGb3IgKi9cclxuICAgIHB1YmxpYyBSb3dUaEdyb3VwczogeyBTcGFuOiBudW1iZXIsIFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IH1bXVtdID0gbnVsbDtcclxuICAgIC8qKiBDYWNoZSBwZXIgaSByb3V0ZXJMaW5rIGdlbmVyYXRpIG5lbGxlIHRhYmVsbGUgZGluYW1pY2hlICovXHJcbiAgICBwdWJsaWMgRHluYW1pY1RhYmxlUm91dGVyTGlua0NhY2hlOiB7fSA9IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGlzdGEgZGVpIGNvbnRlc3RpLiBVbiBjb250ZXN0byBub24gw6ggYWx0cm8gY2hlIHVuIGhhc2ggcGFydGljb2xhcmUgY2FsY29sYXRvIHN1IHVuIG9nZ2V0dG8gY2hlIGlkZW50aWZpY2EgdW5pdm9jYW1lbnRlIHRhbGUgb2dnZXR0by5cclxuICAgICAqXHJcbiAgICAgKiBPZ251bm8gZGkgcXVlc3RpIGNvbnRlc3RpIHJhcHByZXNlbnRlcsOgIGEgc3VhIHZvbHRhLCB1bml2b2NhbWVudGUsIHVuYSByaWdhIGFsbCdpbnRlcm5vIGRlbGxhIHRhYmVsbGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIFJvd0NvbnRleHRzOiBhbnlbXSA9IFtdO1xyXG4gICAgLyoqIERpcmV0dGl2ZSBkaSBvcmRpbmFtZW50byBkZWxsZSBjb2xvbm5lIChub24gb3JkaW5hbWVudG8gZGVpIGRhdGkgbWEgZGVsbGUgY29sb25uZSBpbiBzZSkgKi9cclxuICAgIHB1YmxpYyBPcmRlckRpcmVjdGl2ZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICAvKiogQ29kaWNlIGRlbGwndWx0aW1vIG9nZ2V0dG8gc29sZXppb25hdG8gKi9cclxuICAgIHB1YmxpYyBsYXN0U2VsZWN0ZWRJdGVtSUQgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIG9sdHJlIGFsbGUgY29sb25uZSBkaW5hbWljaGUgc3BlY2lmaWNoZSBkaSB1biB0aXBvIGRpIG9nZ2V0dG8gY2kgc29ubyBhbmNoZSBjb2xvbm5lIGRpbmFtaWNoZSBhZ2dpdW50ZSBkYWxsJ3V0ZW50ZVxyXG4gICAgICpcclxuICAgICAqIEVzLiB1bmEgY29sb25uYSBpbiBjdWkgbW9zdHJhcmUgc2VtcHJlIHVuIGljb25jaW5hXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBVc2VyRGVmaW5lZER5bmFtaWNDb2xzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogSW5kaWNhIGNoZSBxdWVzdG8gw6ggaWwgcHJpbW8gQmluZCBkZWxsYSB0YWJlbGxhLCB2aWVuZSBzZXR0YXRvIGEgZmFsc2Ugbm9uIGFwcGVuYSBpbCBwcmltbyBiaW5kIHZpZW5lIHRlcm1pbmF0byBjb24gc3VjY2Vzc28gKi9cclxuICAgIHB1YmxpYyBGaXJzdEJpbmQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLyoqIExpc3RhIGRpIGNvbG9ubmUgY2hlIHNpIHBvc3Nvbm8gdmlzdWFsaXp6YXJlL29yZGluYXJlIGZyYSBkaSBsb3JvICovXHJcbiAgICBwdWJsaWMgQ29sdW1uc0xpc3Q6IEVzVGFibGVDb2x1bW5bXSA9IFtdO1xyXG4gICAgLyoqIFZhcmlhYmlsZSBkJ2FwcG9nZ2lvIHVzYXRhIGRhbGxhIGRpYWxvZyBkaSBzZWxlemlvbmUvbmFzY29uZGltZW50bywgcGVyIGV2aXRhcmUgZGkgZGFubmVnZ2lhcmUgKipDb2x1bW5zTGlzdCoqIGluIGNhc28gZGkgbW9kaWZpY2hlIHBvaSBhbm51bGxhdGUgKi9cclxuICAgIHB1YmxpYyBUTVBDb2x1bW5zTGlzdDogRXNUYWJsZUNvbHVtbltdID0gW107XHJcbiAgICAvKiogVmFsb3JlIGRlbCBjaGVjayBnbG9iYWxlIGRpIHZpc2liaWxpdMOgIHZhbGlkbyBwZXIgdHV0dGUgbGUgY29sb25uZSBpbiAqKkNvbHVtbnNMaXN0KiogKi9cclxuICAgIHB1YmxpYyBnbG9iYWxDb2xWaXNDaGVjayA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSB0dXR0ZSBsZSBkaXJldHRpdmUgcGVyIGdsaSBlZGl0b3IgY3VzdG9tIGRlbGxlIGNlbGxlICovXHJcbiAgICBAQ29udGVudENoaWxkcmVuKEVzVGRFZGl0b3JEaXJlY3RpdmUpIEVzVGRFZGl0b3JEaXJlY3RpdmVzOiBRdWVyeUxpc3Q8RXNUZEVkaXRvckRpcmVjdGl2ZT47XHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgdHV0dGUgbGUgbnVvdmUgZGlyZXR0aXZlICBhc3NlZ25hdGkgYSBkaXJldHRpdmEgKFBlciBsYSBtb2RhbGl0w6AgZGluYW1pY2EgZGVsbCdlcy10YWJsZSkgKi9cclxuICAgIEBDb250ZW50Q2hpbGRyZW4oRXNUZERpcmVjdGl2ZSkgRXNUZHNEaXJlY3RpdmU6IFF1ZXJ5TGlzdDxFc1RkRGlyZWN0aXZlPjtcclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSB0dXR0aSBnbGkgZXMtdGQgYXNzZWduYXRpIGEgZGlyZXR0aXZhIChQZXIgbGEgbW9kYWxpdMOgIGRpbmFtaWNhIGRlbGwnZXMtdGFibGUpICovXHJcbiAgICBAQ29udGVudENoaWxkcmVuKEVzVGhEaXJlY3RpdmUpIEVzVGhzRGlyZWN0aXZlOiBRdWVyeUxpc3Q8RXNUaERpcmVjdGl2ZT47XHJcbiAgICAvKiogSW5wdXQgY29sbGVnYXRvIGEgdW4gdGVtcGxhdGUgY2hlIGNvbnRpZW5lIGxlIGRpcmV0dGl2ZSBwZXIgcmVuZGVyaXp6YXJlIHF1ZXN0YSB0YWJlbGxhLiBzZSBjaSBzb25vICoqRXNUZHNEaXJlY3RpdmUqKiBlICoqRXNUaHNEaXJlY3RpdmUqKiBxdWVzdGkgaGFubm8gbGEgcHJpb3JpdMOgICovXHJcbiAgICBASW5wdXQoKSBFc1RhYmxlVGVtcGxhdGU6IElFc1RhYmxlVGVtcGxhdGVXcmFwcGVyO1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIGxlIGluZm9ybWF6aW9uaSBkZWwgYm9keSAocHVudG8gZGVsbGEgdGFiZWxsYSBkb3ZlIHZlbmdvbm8gbW9zdHJhdGUgbGUgcmlnaGUpICovXHJcbiAgICBAQ29udGVudENoaWxkKCdib2R5JywgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBib2R5UmVmOiBhbnk7XHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgbGUgaW5mb3JtYXppb25pIGRlbGwnaGVhZGVyIChwdW50byBkZWxsYSB0YWJlbGxhIGRvdmUgdmVuZ29ubyBtb3N0cmF0ZSBsZSBpbnRlc3RhemlvbmkgZGVsbGUgcmlnaGUpICovXHJcbiAgICBAQ29udGVudENoaWxkKCdoZWFkZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGhlYWRlclJlZjogYW55O1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIGxlIGluZm9ybWF6aW9uaSBzdWwgcmFnZ3J1cHBhbWVudG8gZGVnbGkgaGVhZGVyICovXHJcbiAgICBAQ29udGVudENoaWxkKCdoZWFkZXJHcm91cCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgaGVhZGVyR3JvdXBSZWY6IGFueTtcclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSBsZSBpbmZvcm1hemlvbmkgc3VsIHJhZ2dydXBwYW1lbnRvIGRpIHNlY29uZG8gbGl2ZWxsbyBkZWdsaSBoZWFkZXIgKi9cclxuICAgIEBDb250ZW50Q2hpbGQoJ3NlY29uZGFyeUhlYWRlckdyb3VwJywgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBzZWNvbmRhcnlIZWFkZXJHcm91cFJlZjogYW55O1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIGlsIGNhbXBvIGRpIElucHV0IGF0dHVhbGUuIERvcG8gdW4gZG9wcGlvIGNsaWNrIGxvIGJlY2NvIGUgbG8gZm9jdXNzbyBhcHBlbmEgdGVybWluYSBsYSBjaGFnbmUgZGV0ZWN0aW9uICovXHJcbiAgICBAVmlld0NoaWxkKCdpbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgaW5wdXRGaWVsZDogRWxlbWVudFJlZjtcclxuICAgIC8qKiBPcHppb25pIGV4dHJhIGNoZSBkZXZvbm8gYXBwYXJpcmUgbmVsIE1lbsO5IGNvbnRlc3R1YWxlIGluIGFsdG8gYSBkZXN0cmEsIHJpY2hpYW1hdG8gZGFpIDMgcGFsbGluaSB2ZXJ0aWNhbGkgKi9cclxuICAgIEBJbnB1dCgpIENvcm5lck1lbnVPcHRpb25zOiBDb3JuZXJNZW51T3B0aW9uW10gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBkZXYnZXNzZXJlIHBvc3NpYmlsZSBlZmZldHR1YXJlIGlsIHJlc2l6ZSBkZWxsZSBjb2xvbm5lICovXHJcbiAgICBASW5wdXQoKSBDb2x1bW5zUmVzaXphYmxlOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgZGV2J2Vzc2VyZSBwb3NzaWJpbGUgZWZmZXR0dWFyZSBpbCBwaW5uaW5nIGRlbGxlIGNvbG9ubmUgKi9cclxuICAgIEBJbnB1dCgpIENvbHVtbnNQaW5uYWJsZTogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIGRldidlc3NlcmUgZGlzcG9uaWJpbGUgaWwgc2lzdGVtYSBkaSBhZ2dpb3JuYW1lbnRvIGF1dG9tYXRpY28gKi9cclxuICAgIEBJbnB1dCgpIEF1dG9VcGRhdGU6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFxyXG4gICAgICogQGV4cGVyaW1lbnRhbCBJbmRpY2Egc2UgZGV2J2Vzc2VyZSBsJ2VzdGFibGUgYSBnZXN0aXJlIGxhIHJpY2VyY2EsIGFuY2hlIGxhIHByaW1hLiBcclxuICAgICAqIFxyXG4gICAgICogKipBVFRFTlpJT05FOiBSSUNISUVERSBNT0RJRklDSEUgTk9OIFRSSVZJQUxJIEFMTEEgUEFHSU5BIERJIFJJQ0VSQ0EgQ0hFIFVUSUxJWlpBIFFVRVNUTyBUSVBPIERJIEVTLVRBQkxFLiBOT04gVVRJTElaWkFSRSBTRSBOT04gU0kgU0EgQ0lPJyBDSEUgU0kgU1RBIEZBQ0VORE8qKlxyXG4gICAgICoqL1xyXG4gICAgQElucHV0KCkgRXNUYWJsZUhhbmRsZWRTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlY2lkZSBzZSB1dGlsaXp6YXJlIG8gbWVubyBsZSBDdXN0b21DZWxscy4gSW1wb3N0YW5kb2xvIGEgKip0cnVlKiogbCdlcy10YWJsZSBkaXZlbnRhIGluIGdyYWRvIGRpIGdlc3RpcmUgbmF0aXZhbWVudGU6XHJcbiAgICAgKlxyXG4gICAgICogMSkgT3JkaW5hbWVudG8gZSB2aXNpYmlsaXTDoCBkZWxsZSBjb2xvbm5lXHJcbiAgICAgKlxyXG4gICAgICogMikgT3JkaW5hbWVudG8gZGVpIGRhdGlcclxuICAgICAqXHJcbiAgICAgKiAzKSBNb2RhbGl0w6AgR2VyYXJjaGljYVxyXG4gICAgICpcclxuICAgICAqIGVjYy4uLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBVc2VDdXN0b21DZWxsczogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogUGVybWV0dGUgZGkgaW1wb3N0YXJlIGwnYWx0ZXp6YSBtYXNzaW1hIGRlbGxhIHRhYmVsbGEuIFNlIG51bGwgbGEgZGltZW5zaW9uZSBzaSBhZGF0dGEgYWwgbnVtZXJvIGRpIGVsZW1lbnRpIGF0dHVhbG1lbnRlIGluIHZpc3VhbGl6emF6aW9uZSAqL1xyXG4gICAgQElucHV0KCkgTWF4SGVpZ2h0OiBudW1iZXIgPSBudWxsO1xyXG4gICAgLyoqIENsYXNzaSBkYSBhcHBsaWNhcmUgYWwgY29udGVuaXRvcmUgZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgQ29udGFpbmVyQ2xhc3MgPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIG8gbWVubyBsJ2V4cG9ydCBpbiBmb3JtYXRvIFhMU1ggKi9cclxuICAgIEBJbnB1dCgpIFhMU1hFeHBvcnQ6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIG8gbWVubyBsJ2V4cG9ydCBpbiBmb3JtYXRvIENTViAqL1xyXG4gICAgQElucHV0KCkgQ1NWRXhwb3J0ID0gdHJ1ZTtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSB2aXN1YWxpenphcmUgbyBtZW5vIGwnb3B6aW9uZSBkaSBwYWdpbmF6aW9uZSBcIlR1dHRpXCIgKi9cclxuICAgIEBJbnB1dCgpIEFsbFNlYXJjaCA9IG51bGw7XHJcbiAgICAvKiogRGltaW51aXNjZSBnbGkgc3BhemkgZnJhIHVuYSBjZWxsYSBlIGwnYWx0cmEsIGUgaW50ZXJuYW1lbnRlIGlsIHBhZGRpbmcgZGVsIGZvbnQgaW4gbW9kbyBkYSBwcmVzZW50YXJlIG1vbHRpIHBpw7kgZGF0aSBpbiB1bid1bmljYSBwYWdpbmEgKi9cclxuICAgIEBJbnB1dCgpIEhpZ2hDZWxsRGVuc2l0eTogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogQWJpbGl0YSBvIG1lbm8gbGEgcG9zc2liaWxpdMOgIGRpIHNlbGV6aW9uYXJlIG9nZ2V0dGkgKi9cclxuICAgIEBJbnB1dCgpIFNlbGVjdGlvbjogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogTW9zdHJhIG8gbWVubyB1biBtZXNzYWdnaW8gZGkgTG9hZGluZyBhbCBwcmltbyBjYXJpY2FtZW50byBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBTaG93TG9hZGluZ09uQm9vdHN0cmFwOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBTZSBpbXBvc3RhdG8gYSAqKnRydWUqKiBhZ2dpdW5nZSB1bmEgY29sb25uYSBjb24gcHVsc2FudGUgZGkgZWxpbWluYXppb25lIHBlciBlZmZldHR1YXJlIGwnZWxpbWluYSBkZWxsJ29nZ2V0dG8gcmVsYXRpdm8gKi9cclxuICAgIEBJbnB1dCgpIFJlbW92YWw6IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29uZGl6aW9uZSBjaGUgbmFzY29uZGUgbCdpY29uYSBkaSBlbGltaW5hemlvbmUgaW5zZXJpdGEgaW1wb3N0YW5kbyAqKlJlbW92YWwqKiBhIHRydWUgcXVhbG9yYSBsYSBjb25kaXppb25lIG5vbiB2ZW5pc3NlIHJpc3BldHRhdGFcclxuICAgICAqXHJcbiAgICAgKiBDb21lIGNvbmRpemlvbmUgc2kgY29uc2lkZXJhIHVuIHNlbXBsaWNlIGNhbXBvIHN1IGN1aSBlZmZldHR1YXJlIHVuIGNvbnRyb2xsbyBib29sZWFubywgY29tZSBhZCBlc2VtcGlvIFwiY2FucmVtb3ZlXCJcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgUmVtb3ZhbENvbmRpdGlvbiA9ICcnO1xyXG4gICAgLyoqIEluZGljYSBzZSBhYmlsaXRhcmUgbGEgcG9zc2liaWxpdMOgIGRpIGVzcG9ydGFyZSBsYSB2aXN0YSBkYXRpIGF0dHVhbGUgKi9cclxuICAgIEBJbnB1dCgpIEV4cG9ydDogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIHBlcm1ldHRlcmUgbGEgc2VsZXppb25lIG11bHRpcGxhIFdpbmRvd3MtbGlrZSBjbGljY2FuZG8gdW4gb2dnZXR0byBlIGZhY2VuZG8gcG9pIFNoaWZ0ICsgY2xpY2sgc3UgdW4gb2dnZXR0byBzdWNjZXNzaXZvICovXHJcbiAgICBASW5wdXQoKSBTaGlmdENsaWNrOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgaWwgdGVzdG8gY2hlIHZhIGEgc29zdGl0dWlyZSBcIk9nZ2V0dGkgVmlzdWFsaXp6YXRpXCIgaW4gY2FzbyBzaSBzdGlhIGZhY2VuZG8gcXVhbGNvc2EgZGkgY3VzdG9tICovXHJcbiAgICBASW5wdXQoKSBDb3VudExhYmVsOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBuYXNjb25kZXJlIG8gbW9zdHJhcmUgaWwgY29tcG9uZW50ZSBkaSBwYWdpbmF6aW9uZSAqL1xyXG4gICAgQElucHV0KCkgSGlkZVBhZ2luZzogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5hc2NvbmRlcmUgbyBtb3N0cmFyZSBpbCBjb250ZWdnaW8gZGVnbGkgZWxlbWVudGkgdHJvdmF0aSAqL1xyXG4gICAgQElucHV0KCkgSGlkZVBhZ2luZ0NvdW50OiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgbmFzY29uZGVyZSBvIG1vc3RyYXJlIGkgcHVsc2FudGkgZGkgcGFnaW5hemlvbmUgKi9cclxuICAgIEBJbnB1dCgpIEhpZGVQYWdpbmdCdXR0b25zOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBSaWZlcmltZW50byBhbCBDb250ZXh0TWVudSAobmd4LWNvbnRleHRtZW51KSBhc3NvY2lhdG8gYWwgY2xpY2sgZGVzdHJvIGRpIHVubyBvIHBpw7kgZWxlbWVudGkgc2VsZXppb25hdGkgbmVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgQ29udGV4dE1lbnU6IENvbnRleHRNZW51Q29tcG9uZW50ID0gbnVsbDtcclxuICAgIC8qKiBOb21lIGRlbGwnZXNwb3J0YXppb25lIGdlbmVyYXRhIGRhIHF1ZXN0YSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBFeHBvcnRGaWxlTmFtZSA9ICdFeHBvcnQuY3N2JztcclxuICAgIC8qKiBDbGFzc2UgKEhUTUwpIGRpIGRlZmF1bHQgZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgVGFibGVDbGFzcyA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW56aW9uZSBkYSB1dGlsaXp6YXJlIGluIGVzcG9ydGF6aW9uZS4gTmVsIGZvcm1hdG8gXCJSZXBvcnRcIiBhdnLDoCB1biB1bmljbyBwYXJhbWV0cm8gXCJGb3JtYXRvXCIgZSBuZXNzdW4gdmFsb3JlIGRpIHJpdG9ybm8uXHJcbiAgICAgKlxyXG4gICAgICogTmVsIGZvcm1hdG8gXCJWaWV3XCIgaGEgY29tZSBwYXJhbWV0cm8gdW5hIGNhbGxiYWNrIGNvbiBpIGRhdGkgY29tcGxldGkgZGEgZXNwb3J0YXJlIChkYXRvIGNoZSBkaSBkZWZhdWx0IGxhIHJpY2VyY2Egw6ggcGFnaW5hdGEpXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEV4cG9ydEZ1bmN0aW9uOiBhbnk7XHJcbiAgICAvKiogSW5kaWNhIGRpIGVzcG9ydGFyZSBzb2xvIGxlIGNvbG9ubmUgYXR0dWFsbWVudGUgdmlzaWJpbGkgZGVsbGEgdmlldyAqL1xyXG4gICAgQElucHV0KCkgRXhwb3J0T25seVZpc2libGVDb2x1bW5zOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogSW5kaWNhIGxhIHByZXNlbnphIGRpIHJhZ2dydXBwYW1lbnRpIGEgbGl2ZWxsbyBkaSBoZWFkZXIgKi9cclxuICAgIEBJbnB1dCgpIEhhc0hlYWRlckdyb3VwOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgbGEgcHJlc2VuemEgZGkgcmFnZ3J1cHBhbWVudGkgYSBsaXZlbGxvIGRlbCByYWdncnVwcGFtZW50byBwcmVjZWRlbnRlbWVudGUgZXNpc3RlbnRlLCBjaGlhcmFtZW50ZSDDqCBpbnNlbnNhdGEgc2VuemEgKipIYXNIZWFkZXJHcm91cCoqICovXHJcbiAgICBASW5wdXQoKSBIYXNTZWNvbmRhcnlIZWFkZXJHcm91cDogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5hc2NvbmRlcmUgZ2xpIEhlYWRlciBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBIZWFkZXJIaWRkZW46IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBuYXNjb25kZXJlIGlsIEJvZHkgZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgQm9keUhpZGRlbjogYm9vbGVhbiA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgbGEgc2VsZXppb25lIMOoIHRlbXBvcmFuZWFtZW50ZSBkaXNhYmlsaXRhdGEuIFJpc3BldHRvIGFsbCdJbnB1dCAqKlNlbGVjdGlvbioqIGNoZSB2aXNpdmFtZW50ZSBnZXN0aXNjZSBzZSBjaSBzb25vIG8gbm8gZ2xpIGlucHV0IGRpIHNlbGV6aW9uZSxcclxuICAgICAqIHF1ZXN0byBJbnB1dCBnZXN0aXNjZSBzZSBxdWVzdGkgaW5wdXQgc29ubyBhYmlsaXRhdGkgbyBtZW5vXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFNlbGVjdGlvbkRpc2FibGVkOiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBmb3J6YXJlIGlsIHNpc3RlbWEgZGkgc2VsZXppb25lIGEgZ2VzdGlyZSB1biBlbGVtZW50byBwZXIgdm9sdGEuXHJcbiAgICAgKiBTZWxlemlvbmFyZSB1bidhbHRyYSByaWdhIGNvbiB1bmEgZ2nDoCBzZWxlemlvbmF0YSBhcHBsaWNoZXLDoCBsYSBzZWxlemlvbmUgYWxsYSBudW92YSByaWdhLCByaW11b3ZlbmRvbGEgZGFsbCdhdHR1YWxlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFNpbmdsZVNlbGVjdGlvbjogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogQ2FsbGJhY2sgY2hlIGRhdG8gdW4gb2dnZXR0byByZXNpdHVpc2NlIGwnZXZlbnR1YWxlIGNsYXNzZSBkYSBhcHBsaWNhcmUgYWxsYSByaWdhIGNvbGxlZ2F0YSBhbGwnb2dnZXR0byAqL1xyXG4gICAgQElucHV0KCkgUm93Q2xhc3NBc3NpZ25lcjogYW55ID0gbnVsbDtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBvcmRpbmFyZSBpIGRhdGkgaW4gbWFuaWVyYSBkaXNjZW5kZW50ZSBvIGFzY2VuZGVudGUgKi9cclxuICAgIEBJbnB1dCgpIE9yZGVyQnlDb2x1bW46IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIGF2ZXJlIHBpw7kgZGlyZXR0aXZlIGRpIG9yZGluYW1lbnRvIGRlaSBkYXRpICovXHJcbiAgICBASW5wdXQoKSBNdWx0aXBsZU9yZGVyaW5nRGlyZWN0aXZlcyA9IHRydWU7XHJcbiAgICAvKiogUGVybWV0dGUgZGkgbmFzY29uZGVyZSBsZSBjb2xvbm5lIGluIGJhc2UgYWxsZSBzZWxlemlvbmkgZWZmZXR0dWF0ZSBkYWwgTWVuw7kgY29udGVzdHVhbGUgaW4gYWx0byBhIGRlc3RyYSAqL1xyXG4gICAgQElucHV0KCkgSGlkZGVuQ29sdW1uczogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogUGVybWV0dGUgZGkgcmlvcmRpbmFyZSBsZSBjb2xvbm5lIGluIGJhc2UgYWxsZSBpbXBvc3RhemlvbmkgZWZmZXR0dWF0ZSBkYWwgTWVuw7kgY29udGVzdHVhbGUgaW4gYWx0byBhIGRlc3RyYSAqL1xyXG4gICAgQElucHV0KCkgQ29sdW1uc09yZGVyaW5nOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBFdmVudHVhbGUgc3VwcG9ydG8gYWxsZSByaWNlcmNoZSBhcHBsaWNhdGUgYWxsYSBtb2RhbGl0w6AgQXJyYXkgKi9cclxuICAgIEBJbnB1dCgpIFNlYXJjaFZpZXcgPSBudWxsIGFzIEFwcFNlYXJjaDxhbnk+O1xyXG4gICAgLyoqIEFiaWxpdGEgbyBkaXNhYmlsaXRhIGlsIHNpc3RlbWEgY2hlIHBlcm1ldHRlIGRpIHNlbGV6aW9uYXJlIHR1dHRpIGdsaSBlbGVtZW50aSBuZWxsYSB2aXN0YSAqL1xyXG4gICAgQElucHV0KCkgU2VsZWN0QWxsOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBTaW11bGEgbGEgcGFnaW5hemlvbmUgYW5jaGUgcGVyIGxlIHRhYmVsbGUgY2hlIGZ1bnppb25hbm8gaW4gbW9kYWxpdMOgIEFycmF5ICovXHJcbiAgICBASW5wdXQoKSBVc2VBcnJheU1vZGVQYWdpbmcgPSB0cnVlO1xyXG4gICAgLyoqIERlZmluaXppb25lIGRpIGNvbG9ubmUgZGluYW1jaGUgcGVyIGxhIG1vZGFsaXTDoCwgYXBwdW50bywgZGluYW1pY2EgKi9cclxuICAgIEBJbnB1dCgpIER5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbjogRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uW10gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBvcGVyYXppb25pIGRpbmFtaWNoZSBnZW5lcmljaGUgY2hlIHBvc3Nvbm8gZXNzZXJlIGVmZmV0dHVhdGUgcGVyIHJpZ2EuIEFwcGFpb25vIGNvbWUgY29sb25uZSBleHRyYSBzdWwgbGF0byBzaW5pc3RybyBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBEeW5hbWljT3BlcmF0aW9uczogRXNUYWJsZU9wZXJhdGlvbkRlZmluaXRpb25bXSA9IFtdO1xyXG4gICAgLyoqIEluZGljYSBzZSB2aXN1YWxpenphcmUgaSBkYXRpIGluIG1hbmllcmEgZ2VyYXJjaGljYSAqL1xyXG4gICAgQElucHV0KCkgSGllcmFyY2h5OiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBOb21lIGRlbGxhIHByb3ByaWV0w6AgY2hlIGNvbnRpZW5lIGwnSUQgZGVsIHBhZHJlLiBEYSB1dGlsaXp6YXJlIHNlICoqSGllcmFyY2h5Kiogw6ggaW1wb3N0YXRvICovXHJcbiAgICBASW5wdXQoKSBQYXJlbnRLZXkgPSAnJztcclxuICAgIC8qKiBOb21lIGRlbGxhIHByb3ByaWV0w6AgY2hlIGNvbnRpZW5lIGwnSUQgZGVsbCdvZ2dldHRvIGF0dHVhbGUuIERhIHV0aWxpenphcmUgc2UgKipIaWVyYXJjaHkqKiDDqCBpbXBvc3RhdG8gKi9cclxuICAgIEBJbnB1dCgpIE93bktleSA9ICcnO1xyXG4gICAgLyoqIEluZGljYSBzZSBwYXJ0aXJlIGNvbiB1biBhbGJlcm8gZXNwYW5zby4gRGEgdXRpbGl6emFyZSBzZSAqKkhpZXJhcmNoeSoqIMOoIGltcG9zdGF0byAqL1xyXG4gICAgQElucHV0KCkgU3RhcnRzRXhwYW5kZWQgPSB0cnVlO1xyXG4gICAgLyoqIEluZGljYSBzZSBlZmZldHR1YXJlIGlsIHNhbHZhdGFnZ2lvIGRlbGxlIHByZWZlcmVuemUgZGkgcmljZXJjYSAqL1xyXG4gICAgQElucHV0KCkgU2F2ZVByZWZlcmVuY2VzOiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgICAvKiogSW5kaWNhIGRvdmUgdmlzdWFsaXp6YXJlIGxlIGluZm9ybWF6aW9uaSBkaSBwYWdpbmF6aW9uZSwgc2Ugc29wcmEsIHNvdHRvIG8gaW4gZW50cmFtYmkgKi9cclxuICAgIEBJbnB1dCgpIFBhZ2luZ1N0eWxlOiAnYm90aCcgfCAndG9wJyB8ICdib3R0b20nID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgZG92ZSB2aXN1YWxpenphcmUgbGUgaW5mb3JtYXppb25pIGRpIHBhZ2luYXppb25lLCBzZSBzb3ByYSwgc290dG8gbyBpbiBlbnRyYW1iaSAqL1xyXG4gICAgQElucHV0KCkgUm93R3JvdXBpbmdQYWdpbmdTdHlsZTogJ2xlZnQnIHwgJ3JpZ2h0JyA9IG51bGw7XHJcbiAgICAvKiogUXVhbG9yYSBwZXIgcXVhbHNpYXNpIG1vdGl2byBub24gdmVuaXNzZSB1c2F0byAqKml0ZW1zKiogZGVsbCdBcHBTZWFyY2ggcXVlc3RvIElucHV0IGluZGljYSBxdWFsIMOoIGlsIG5vbWUgZGVsbGEgcHJvcHJpZXTDoCBkYSB1dGlsaXp6YXJlICovXHJcbiAgICBASW5wdXQoKSBJdGVtU291cmNlUHJvcGVydHk6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAvKiogSW5kaWNhIHNlIHV0aWxpenphcmUgbGEgY2FjaGUgZGkgc2VsZXppb25lIGNoZSBwZXJtZXR0ZSBkaSBtYW50ZW5lcmUgZ2xpIHN0YXRpIGRpIHNlbGV6aW9uZSBkZWkgdmFyaSBvZ2dldHRpIG5hdmlnYW5kbyBkYSB1bmEgcGFnaW5hIGFsbCdhbHRyYSAqL1xyXG4gICAgQElucHV0KCkgVXNlU2VsZWN0aW9uQ2FjaGUgPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIGRlY2lkZXJlIHNlLCBpbiBtb2RhbGl0w6AgcmFnZ3J1cHBhbWVudG8sIG1vc3RyYXJlIG8gbWVubyBpbCB2YWxvcmUgZGVsbGUgY29sb25uZSBkaSBncnVwcG8gbmVnbGkgb2dnZXR0aSBmaW5hbGkuIERpIGRlZmF1bHQgc29ubyBuYXNjb3N0aSAqL1xyXG4gICAgQElucHV0KCkgU2hvd0l0ZW1Hcm91cHNDb2x1bW5zID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgY2hlIHR1dHRpIGkgY2FtcGkgY2hlIGRlZmluaXNjb25vIGxlIG1vZGFsaXTDoCBkaSBtb2RpZmljYSBjYW1wbyBwb3Nzb25vIGVzc2VyZSBtb2RpZmljYXRpIGluIGJhc2UgYWxsZSBpbXBvc3RhemlvbmkgKi9cclxuICAgIEBJbnB1dCgpIEVkaXRhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogSW5kaWNhIHNlIMOoIHBvc3NpYmlsZSBlZmZldHR1YXJlIHNlbGV6aW9uaSBhIHJhbmdlIHBlciBwb2kgZmFyY2kgZXZlbnR1YWxtZW50ZSBjb3BpYSBpbmNvbGxhICovXHJcbiAgICBASW5wdXQoKSBSYW5nZVNlbGVjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBpbCBudW1lcm8gZGkgbWlsbGlzZWNvbmRpIHBlciBjdWkgZGVib3VuY2FyZSBpbCB3cml0ZVZhbHVlIHBlciBsYSBtb2RhbGl0w6AgKipFc1RhYmxlSGFuZGxlZFNlYXJjaCoqICovXHJcbiAgICBASW5wdXQoKSBTZWFyY2hUaHJvdHRsZTogbnVtYmVyID0gNTA7XHJcbiAgICAvKiogRXZlbnRvIGNoZSB2aWVuZSByaWNoaWFtYXRvIGFsIGNhbWJpbyBkaSBvcmlkbmFtZW50byBkaSB1bmEgY29sb25uYSAqL1xyXG4gICAgQE91dHB1dCgpIG9uT3JkZXJDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8QXBwT3JkZXJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxBcHBPcmRlcmluZz4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50byBjaGUgdmllbmUgcmljaGlhbWF0byBxdWFuZG8gbCdlcy10YWJsZSByaXRpZW5lIHNpYSBuZWNlc3NhcmlvIHJpLWVmZmV0dHVhcmUgbGEgcmljZXJjYS5cclxuICAgICAqIElsIGJvb2xlYW5vIGRlbGwnZXZlbnRvIGluZGljYSBzZSB2aWVuZSBzdWdnZXJpdG8gZGkgcmVzZXR0YXJlIGxhIHBhZ2luYSBvIG1lbm8uXHJcbiAgICAgKiBcclxuICAgICAqIFNvbG8gaW4gY2FzbyB2ZW5nYSB1dGlsaXp6YXRhIGxhIG1vZGFsaXTDoCBhIHJhZ2dydXBwYW1lbnRpIGRpIHJpZ2hlIHB1w7Igc3VjY2VkZXJlIGNoZSBsJ2VzLXRhYmxlIHBhc3NpIHVuIGludGVybyBBcHBTZWFyY2ggY29tZSBwYXJhbWV0cm8gZGkgcmljZXJjYSxcclxuICAgICAqIGluIHF1ZWwgY2FzbyBsJ2FwcGxpY2F6aW9uZSByaWNldmVudGUgZG92csOgIG9ub3JhcmUgbGEgcmljaGllc3RhIHNwZWRlbmRvIGFsIGJhY2thbmQgbCdvZ2dldHRvIGRpIHJpY2VyY2EgQVMtSVNcclxuICAgICAqIFxyXG4gICAgICogaWwgdGlwbyBkZWxsJ0VtaXR0ZXIgaW52ZWNlIGRpIGVzc2VyZSBbYm9vbGVhbiB8IEFwcFNlYXJjaDxhbnk+XSDDqCBzdGF0byBpbXBvc3RhdG8gYSBcImFueVwiIHBlciBldml0YXJlIHByb2JsZW1pIGRpIHJldHJvY29tcGF0aWJpbGl0w6BcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIG9uU2VhcmNoUmVxdWVzdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIC8qKiBFdmVudG8gY2hlIHBhcnRlIGFkIG9nbmkgbW9kaWZpY2EgZGkgXCJjaGVja2FnZ2lvXCIgaW4gZm9ybWEgZGkgY29tb2RvIGFycmF5LiBFc3BvbmUgbCdvZ2dldHRvIGNvbiBsbyBzdGF0byBkaSBjaGVjayBhdHR1YWxlICovXHJcbiAgICBAT3V0cHV0KCkgb25TZWxlY3Rpb25DaGFuZ2VkOiBFdmVudEVtaXR0ZXI8SXRlbXNTZWxlY3Rpb248YW55Pj4gPSBuZXcgRXZlbnRFbWl0dGVyPEl0ZW1zU2VsZWN0aW9uPGFueT4+KCk7XHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gYWxsJ2VsaW1pbmF6aW9uZSBkaSB1biBvZ2dldHRvICovXHJcbiAgICBAT3V0cHV0KCkgb25SZW1vdmFsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIGFsbCdhbm51bGxhbWVudG8gZGkgdW4nZWxpbWluYXppb25lICovXHJcbiAgICBAT3V0cHV0KCkgb25BYm9ydFJlbW92YWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gYWxsYSBtb2RpZmljYSBkZWkgbW9kZWxsaSBiaW5kYXRpICovXHJcbiAgICBAT3V0cHV0KCkgb25Nb2RlbENoYW5nZTogRXZlbnRFbWl0dGVyPEVzVGFibGVNb2RlbENoYW5nZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8RXNUYWJsZU1vZGVsQ2hhbmdlW10+KCk7XHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gYWxsJ2FwZXJ0dXJhIGRlbCBtZW7DuSBjb250ZXN0dWFsZSAqL1xyXG4gICAgQE91dHB1dCgpIG9uT3BlbkNvbnRleHRNZW51OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIHF1YW5kbyBzaSBjbGljY2Egc3UgdW4gb3B6aW9uZSBkZWZpbml0YSBuZWxsZSAqKkNvcm5lck1lbnVPcHRpb25zKiogKi9cclxuICAgIEBPdXRwdXQoKSBvbkNvcm5lckFjdGlvbjogRXZlbnRFbWl0dGVyPHsgaWQ6IHN0cmluZywgZXN0YWJsZTogYW55IH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmcsIGVzdGFibGU6IGFueSB9PigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIHF1YW5kbyBzaSBjbGljY2Egc3UgdW4gb3B6aW9uZSBkZWZpbml0YSBuZWxsZSAqKkR5bmFtaWNPcGVyYXRpb25zKiogKi9cclxuICAgIEBPdXRwdXQoKSBvbkR5bmFtaWNPcGVyYXRpb246IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmcsIGl0ZW06IGFueSB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nLCBpdGVtOiBhbnkgfT4oKTtcclxuXHJcbiAgICAvKiogRGF0aSBlc3BvcnRhdGkgZGEgbmd4LWNzdiAqL1xyXG4gICAgcHVibGljIGRhdGE6IGFueVtdO1xyXG4gICAgLyoqIEhlYWRlciBkZWkgZGF0aSBlc3BvcnRhdGkgZGEgbmd4LWNzdiAqL1xyXG4gICAgcHVibGljIGhlYWRlcnM6IENzdkhlYWRlcnNbXTtcclxuICAgIC8qKiBFbGVtZW50byBIVE1MIGRhIGNsaWNjYXJlIHBlciBsJ2VzcG9ydGF6aW9uZSAqL1xyXG4gICAgQFZpZXdDaGlsZCgnZXhwb3J0RG93bmxvYWRlcicsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgZXhwb3J0RG93bmxvYWRlcjogRWxlbWVudFJlZjtcclxuICAgIC8qKiBQbGFjZWhvbGRlciBkaSBtZW7DuSBjb250ZXN0dWFsZSBwZXIgcXVhbmRvIG5vbiBjaSBzb25vIG9wemlvbmkgbmVsIHBsYWNlaG9sZGVyIFwiVmVyb1wiICAqL1xyXG4gICAgQFZpZXdDaGlsZCgnZW1wdHlNZW51JywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHRhYmxlRW1wdHlNZW51OiBDb250ZXh0TWVudUNvbXBvbmVudDtcclxuXHJcbiAgICAvKiogU3Vic2NyaXB0aW9uIHN1bGwnYXBlcnR1cmEgZGVsIGNvbnRleHQgbWVudSBkYSByaXB1bGlyZSBhbCBkZXN0cm95IGRlbGxhIGNsYXNzZSAqL1xyXG4gICAgcHJpdmF0ZSBjdHhNZW51U3Vic2NyaXB0aW9uOiBhbnk7XHJcblxyXG4gICAgLyoqIFBhZ2luYSBpbiB2aXN1YWxpenphemlvbmUgKGR1cmFudGUgbGEgcGFnaW5hemlvbmUgaW4gbW9kYWxpdMOgIEFycmF5KSAqL1xyXG4gICAgcHVibGljIGFycmF5bW9kZVBhZ2UgPSAxO1xyXG4gICAgLyoqIE51bWVybyBkaSBwYWdpbmUgKGR1cmFudGUgbGEgcGFnaW5hemlvbmUgaW4gbW9kYWxpdMOgIEFycmF5KSAqL1xyXG4gICAgcHVibGljIGFycmF5bW9kZVBhZ2VzID0gMTtcclxuICAgIC8qKiBPZ2dldHRpIHBlciBvZ25pIHBhZ2luYSAoZHVyYW50ZSBsYSBwYWdpbmF6aW9uZSBpbiBtb2RhbGl0w6AgQXJyYXkpICovXHJcbiAgICBASW5wdXQoKSBBcnJheW1vZGVJdGVtc1BlclBhZ2UgPSBudWxsO1xyXG4gICAgLyoqIE9nZ2V0dG8gZGkgc2VsZXppb25lIHBlciBsYSBtb2RhbGl0w6AgQXJyYXksIGNoZSBkZXZlIGNvbXBvcnRhcnNpIGNvbWUgbGEgY29udHJvcGFydGUgaW4gbW9kYWxpdMOgIFZpZXcgKi9cclxuICAgIHB1YmxpYyBhcnJheW1vZGVTZWxlY3Rpb246IEl0ZW1zU2VsZWN0aW9uPGFueT47XHJcbiAgICAvKiogQ29sb25uZSBkYSB2aXN1YWxpenphcmUgaW4gbW9kYWxpdMOgIGFycmF5ICovXHJcbiAgICBwdWJsaWMgYXJyYXlDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLyoqIE9yZGluZSBkZWxsZSBjb2xvbm5lIGRhIHZpc3VhbGl6emFyZSBpbiBtb2RhbGl0w6AgYXJyYXkgKi9cclxuICAgIHB1YmxpYyBhcnJheUNvbHVtbk9yZGVyaW5nOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLyoqIE9yZGluYW1lbnRpIEFTQy1ERVNDIHN1bGxlIGNvbG9ubmUgaW4gbW9kYWxpdMOgIGFycmF5ICovXHJcbiAgICBwdWJsaWMgYXJyYXlPcmRlcnM6IEFwcE9yZGVyaW5nW10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhcmlhYmlsZSBjaGUgc2VydmUgYSBnZXN0aXJlIGlsIG1vbWVudG8gaW4gY3VpIGwnZXMtdGFibGUgYWdnaW9ybmEgbGEgcGFnaW5hemlvbmUgKHB1bHNhbnRpIGVjYykuXHJcbiAgICAgKiBFc3NlbmRvIG9wZXJhemlvbmkgY29tdW5xdWUgY29zdG9zZSBsZSBlZmZldHR1byBzb2xvIHN1IGJpbmRpbmcgZXN0ZXJuaSwgbm9uIHN1IHJld3JpdGUgZ2VuZXJhdGkgaW50ZXJuYW1lbnRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW50ZXJuYWxXcml0ZUNhbGwgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhY2hlIGNoZSBjb250ZXJyw6AgdHV0dGUgbGUgcmljZXJjaGUgZWZmZXR0dWF0ZSBzdSBncnVwcGkgZGl2ZXJzaSBkYWwgcHJpbW8gZSBzdSBlbGVtZW50aSBjb250ZW51dGkgbmVpIGdydXBwaS5cclxuICAgICAqIEluIGNhc28gZGkgY2FtYmkgZGkgb3JkaW5hbWVudG8gZGVsbGUgY29sb25uZSBkaXZlcnNlIGRhbGxhIHByaW1hIHR1dHRlIGxlIGNoaWFtYXRlIGZhdHRlIGRhbCBzZWNvbmRvIGxpdmVsbG8gaW4gcG9pIGRldm9ubyBlc3NlcmUgcmllc2VndWl0ZSBzZWNvbmRvIGxhIHNlZ3VlbnRlIGxvZ2ljYTpcclxuICAgICAqIFxyXG4gICAgICogXHJcbiAgICAgKiAqKkNhbWJpbyBvcmRpbmFtZW50byBzdWwgcHJpbW8gZ3J1cHBvKio6IHJlbG9hZCBjb21wbGV0bywgbm9uIG1pIG9jY3VwbyBkaSByaXB1bGlyZSBnbGkgZWxlbWVudGkgYmluZGF0aSBpbiBhbGN1biBtb2RvXHJcbiAgICAgKiBcclxuICAgICAqICoqQ2FtYmlvIG9yZGluYW1lbnRvIHN1bGxhIGNvbG9ubmEgcmVsYXRpdmEgYWxsJ04tZXNpbW8gZ3J1cHBvKio6IHJlbG9hZCBjb21wbGV0byBkZWwgY29udGVudXRvIGRlaSBncnVwcGkgcHJlY2VkZW50aSwgcmlwdWxlbmRvIHByZWNlZGVudGVtZW50ZSBcclxuICAgICAqIHR1dHRpIGdsaSBlbGVtZW50aSBjb24gKipfZ3JvdXBsZXZlbCoqID0gTlxyXG4gICAgICogXHJcbiAgICAgKiAqKkNhbWJpbyBvcmRpbmFtZW50byBzdSB1bmEgY29sb25uYSBub24gcmFnZ3J1cHBhdGEqKjogcmVsb2FkIGNvbXBsZXRvIHBlciB0dXR0aSBpIGdydXBwaSBmaW5hbGkgYXBlcnRpLCBkZXZvIHByZWNlZGVudGVtZW50ZSByaXB1bGlyZSB0dXR0aSBnbGkgZWxlbWVudGkgY29uICoqX2l0ZW0qKiA9IHRydWVcclxuICAgICAqIFxyXG4gICAgICogQWx0cmkgZXZlbnRpIG5vbiBkb3ZyZWJiZXJvIHJhcHByZXNlbnRhcmUgcHJvYmxlbWk6XHJcbiAgICAgKiAtIFNlbGV6aW9uZTogbm9uIGNhbWJpYSBudWxsYVxyXG4gICAgICogLSBQYWdpbmF6aW9uZTogY2FtYmlhIGEgbGl2ZWxsbyByb290IHF1aW5kaSB2aWVuZSByaWNhcmljYXRvIHR1dHRvIGNvbXVucXVlLCBzdGVzc28gdmFsZSBwZXIgbGUgcGFnaW5hemlvbmkgaW50ZXJuZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JvdXBTZWFyY2hSZXF1ZXN0c0NhY2hlOiB7IHBhdGg6IHN0cmluZywgcm91dGU6IEdyb3VwUm91dGVGcmFnbWVudFtdLCB2aWV3OiBBcHBTZWFyY2g8YW55PiwgZ3JvdXBfY29sdW1uOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqIFZhcmlhYmlsZSBkJ2FwcG9nZ2lvIHBlciBjYXBpcmUgc2UgYyfDqCBiaXNvZ25vIGRpIHJpLWVmZmV0dHVhcmUgdW5hIHJpY2VyY2EgbyBtZW5vICovXHJcbiAgICBwcml2YXRlIFJlc2VhcmNoTmVlZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogQ29sb25uZSB2aXNpYmlsaSBkZWxsYSB2aXN0YSBhdHR1YWxlLiBWYWxvcml6emF0byBkaSBkZWZhdWx0IGFsIG51bWVybyBtYXNzaW1vIGRpIGNvbG9ubmUgc3VwcG9ydGF0ZSBkYWxsYSB0YWJlbGxhIHBlciBsZSBjYXNpc3RpY2hlIGluIGFzc2VuemEgZGkgY3VzdG9tIGNlbGxzICovXHJcbiAgICBwdWJsaWMgQ29sdW1uczogeyBWaXNpYmlsZTogbnVtYmVyLCBWaXNpYmxlVW5waW5uZWQ6IG51bWJlciwgR2xvYmFsOiBudW1iZXIgfSA9IHsgVmlzaWJpbGU6IDEwMCwgVmlzaWJsZVVucGlubmVkOiAxMDAsIEdsb2JhbDogMTAwIH07XHJcbiAgICAvKiogSW4gY2FzbyBkaSBSb3cgR3JvdXBpbmcgcXVpIHZpZW5lIHNhbHZhdGEgbGEgdmlzdGEgcHJpbmNpcGFsZSBkZWkgZ3J1cHBpIGJhc2UgKi9cclxuICAgIHB1YmxpYyBNYWluR3JvdXBWaWV3OiBBcHBTZWFyY2g8YW55PiA9IG51bGw7XHJcbiAgICAvKiogQ29udGVnZ2lvIGJhc2UgZGVnbGkgb2dnZXR0aS4gSW4gbW9kYWxpdMOgIG5vcm1hbGUgdmllbmUgcmVzZXR0YXRvIGFkIG9nbmkgbnVvdmEgVmlldyBpbnNlcml0YSwgaW4gbW9kYWxpdMOgIFJvd0dyb3VwaW5nIHZpZW5lIHJlc2V0dGF0byBzb2xvIGFkIHVuYSBudW92YSBWaWV3IGRpIGxpdmVsbG8gXCIwXCIgKi9cclxuICAgIHB1YmxpYyBCYXNlSXRlbXNDb3VudCA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIGNpIHNvbm8gZGVsbGUgY29sb25uZSBwaW5uYXRlIGUgdmlzaWJpbGkuIFNlcnZlIHBlciBwb3RlciBzZXR0YXJlIHR1dHRlIGxlIGNvbG9ubmUgcHJpbWEgY2hlIGFycml2aW5vIGRhdGkgYSBwaW5uZWQqL1xyXG4gICAgcHVibGljIEhhc1Bpbm5lZENvbHVtbnM6IGJvb2xlYW5cclxuICAgIC8qKiBMYXJnaGV6emEgY2FsY29sYXRhIGRlbCBjb250YWluZXIgZGVsbGUgY29sb25uZSBwaW5uYXRlICovXHJcbiAgICBwdWJsaWMgUGlubmVkQ29udGFpbmVyV2lkdGg6IG51bWJlcjtcclxuICAgIC8qKiBJbmRpY2Egc2Ugbm9ub3N0YW50ZSBzaWFtbyBpbiBtb2RhbGl0w6AgYXJyYXkgc29ubyBzdGF0aSBpbmRpdmlkdWF0aSBkZWkgZ3J1cHBpLiBJbiB0YWwgY2FzbyBlcy10YWJsZSBzaSBjb21wb3J0YSBkYSBwc2V1ZG8gYmFja2VuZCBlZCBlZmZldHR1YSBsZSBhZ2dyZWdhemlvbmkgZSByYWdncnVwcGFtZW50aSBjb21wbGV0YW1lbnRlIGxhdG8gY2xpZW50ICovXHJcbiAgICBwdWJsaWMgQXJyYXlHcm91cGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBjaGUgbCdlcy10YWJsZSDDqCBiYXNhdGEgc3VsbGUgZGlyZXR0aXZlIChudW92YSBtb2RhbGl0w6ApICovXHJcbiAgICBwdWJsaWMgRGlyZWN0aXZlc0Jhc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogSW5kaWNhIGxvIHN0YXRvIGRpIHNlbGV6aW9uZSBwZXIgc2luZ29sYSBjZWxsYSAqL1xyXG4gICAgcHVibGljIHNlbGVjdGlvblN0YXR1czogeyBbaW5kZXg6IG51bWJlcl06IHsgW2luZGV4OiBudW1iZXJdOiBJdGVtUHJvcEVkaXRhYmxlUmVmZXJlbmNlIH0gfSA9IHt9O1xyXG4gICAgLyoqIENoaWFtYXRhIHJlYWxlIGFsIHdyaXRlVmFsdWUgZG9wbyBpbCBwYXNzYWdnaW8gZGkgKipTZWFyY2hUaHJvdHRsZSoqIG1pbGxpc2Vjb25kaS4gU29sbyBtb2RhbGl0w6AgRXNUYWJsZUhhbmRsZWRTZWFyY2ggKi9cclxuICAgIHByaXZhdGUgY2FsbFRpbWVvdXQgOiBhbnkgPSBudWxsO1xyXG5cclxuICAgIC8qKiBPcHppb25pIGRpIHBhZ2luYXppb25lICovXHJcbiAgICBwdWJsaWMgUGFnZXJPcHRpb25zOiB7IFBhZ2VyQ291bnQ6IG51bWJlciwgU2hvd0NvdW50OiBib29sZWFuLCBTaG93UGFnaW5nOiBib29sZWFuLCBVc2VzVmlldzogYm9vbGVhbiwgU2hvd0J1dHRvbnM6IGJvb2xlYW4sIFNob3dQYWdpbmdPcHRpb25zOiBib29sZWFuLCBWaWV3OiBhbnksIFJlYWR5OiBib29sZWFuLCBTZWFyY2hlczogJ2l0ZW1zJyB8ICdncm91cHMnIH0gPVxyXG4gICAgICAgIHsgUGFnZXJDb3VudDogbnVsbCwgU2hvd0NvdW50OiB0cnVlLCBTaG93UGFnaW5nOiB0cnVlLCBTaG93QnV0dG9uczogdHJ1ZSwgU2hvd1BhZ2luZ09wdGlvbnM6IHRydWUsIFVzZXNWaWV3OiB0cnVlLCBWaWV3OiBudWxsLCBSZWFkeTogZmFsc2UsIFNlYXJjaGVzOiAnaXRlbXMnIH07XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgICAgICAvLyBjbGljayBkZXN0cm8gc3UgdW5hIHJpZ2EgY29uIHNlbGV6aW9uZSBhdHRpdmE6IFRpcm8gZnVvcmkgaWwgY29udGV4dCBtZW51IGUgc2VsZXppb25lIGwnZWxlbWVudG8gY29ycmVudGVcclxuICAgICAgICB0aGlzLmN0eE1lbnVTdWJzY3JpcHRpb24gPSAodGhpcy5Db250ZXh0TWVudSB8fCB0aGlzLnRhYmxlRW1wdHlNZW51KS5vcGVuLnN1YnNjcmliZSh0ID0+IHtcclxuICAgICAgICAgICAgLy8gR3J1cHBpIHZhIGJlbmUsIG9nZ2V0dGkgcHVyZSwgbWEgc2VwYXJhdG9yaSBmcmEgZ3J1cHBpIHByb3ByaW8gbm8uLi5cclxuICAgICAgICAgICAgaWYgKHQuaXRlbS5fc2VwKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBsZXQgc2hvdWxkRW1pdCA9ICF0Lml0ZW0uX3NlbGVjdGVkO1xyXG5cclxuICAgICAgICAgICAgdC5pdGVtLl9zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJTZWxlY3Rpb25TdGF0dXMoKTtcclxuICAgICAgICAgICAgdmFyIGl0ZW1TZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbl9ILmhhbmRsZUl0ZW1zU2VsZWN0aW9uKFt0Lml0ZW1dKTtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2hvdWxkRW1pdClcclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoaXRlbVNlbGVjdGlvbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgLy8gU2UgdXRpbGl6em8gbGEgbmV3IHNwaWN5IG1vZGUgZGVkdWNvIHR1dHRpIGkgcGFyYW1ldHJpIGRpIGxhdm9ybyBwb3NzaWJpbGkgYWwgY2FyaWNhbWVudG8gZGVsbGEgdGFiZWxsYVxyXG4gICAgICAgIC8vIFZlbmdvbm8gc292cmFzY3JpdHRlIHNvbG8gbGUgcHJvcHJpZXTDoCBub24gaW1wb3N0YXRlIGRhbGwndXRlbnRlXHJcbiAgICAgICAgbGV0IHRkc0QgPSB0aGlzLkVzVGRzRGlyZWN0aXZlLmxlbmd0aCA9PSAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Rkc0RpcmVjdGl2ZT8ubGVuZ3RoID4gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUZHNEaXJlY3RpdmUgOiB0aGlzLkVzVGRzRGlyZWN0aXZlIDogdGhpcy5Fc1Rkc0RpcmVjdGl2ZTtcclxuICAgICAgICBsZXQgdGhzRCA9IHRoaXMuRXNUaHNEaXJlY3RpdmUubGVuZ3RoID09IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGhzRGlyZWN0aXZlPy5sZW5ndGggPiAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Roc0RpcmVjdGl2ZSA6IHRoaXMuRXNUaHNEaXJlY3RpdmUgOiB0aGlzLkVzVGhzRGlyZWN0aXZlO1xyXG4gICAgICAgIGxldCB1c2VzVGhzQW5kVGRzRGlyZWN0aXZlcyA9IHRkc0QgJiYgdGRzRC5sZW5ndGggPiAwICYmIHRoc0QgJiYgdGhzRC5sZW5ndGggPiAwO1xyXG4gICAgICAgIGxldCBoYXNOb0NvbnRlbnRQcm9qZWN0aW9uID0gIXRoaXMuYm9keVJlZiAmJiAhdGhpcy5oZWFkZXJSZWYgJiYgIXRoaXMuaGVhZGVyR3JvdXBSZWYgJiYgIXRoaXMuc2Vjb25kYXJ5SGVhZGVyR3JvdXBSZWY7XHJcblxyXG4gICAgICAgIGlmICh1c2VzVGhzQW5kVGRzRGlyZWN0aXZlcyB8fCBoYXNOb0NvbnRlbnRQcm9qZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLlVzZUN1c3RvbUNlbGxzID09IG51bGwpIHRoaXMuVXNlQ3VzdG9tQ2VsbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5IaWRkZW5Db2x1bW5zID09IG51bGwgJiYgdGhpcy5Vc2VDdXN0b21DZWxscykgdGhpcy5IaWRkZW5Db2x1bW5zID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuQ29sdW1uc09yZGVyaW5nID09IG51bGwgJiYgdGhpcy5Vc2VDdXN0b21DZWxscykgdGhpcy5Db2x1bW5zT3JkZXJpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5PcmRlckJ5Q29sdW1uID09IG51bGwgJiYgdGhpcy5Vc2VDdXN0b21DZWxscykgdGhpcy5PcmRlckJ5Q29sdW1uID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuU2VsZWN0QWxsID09IG51bGwgJiYgdGhpcy5TZWxlY3Rpb24pIHRoaXMuU2VsZWN0QWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuU2hpZnRDbGljayA9PSBudWxsICYmIHRoaXMuU2VsZWN0aW9uKSB0aGlzLlNoaWZ0Q2xpY2sgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLkRpcmVjdGl2ZXNCYXNlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1BlciBwb3RlciBjYW1iaWFyZSBpbCBsYXlvdXQgaW4gYmFzZSBhbCBsaXZlbGxvIGdlcmFyY2hpY28gaWwgY29tcG9uZW50ZSBkZXZhIGF2ZXJlIGlsIHBpZW5vIGNvbnRyb2xsbyBkaSBvZ25pIGNlbGxhLFxyXG4gICAgICAgIC8vY2hlIGNvbiBzb2xvIGxhIHByb2llemlvbmUgKHNlbnphIGNlbGxlIGN1c290bSkgbm9uIMOoIGRpc3BvbmliaWxlXHJcbiAgICAgICAgaWYgKHRoaXMuSGllcmFyY2h5ICYmICF0aGlzLlVzZUN1c3RvbUNlbGxzKVxyXG4gICAgICAgICAgICB0aHJvdyBcIkVzLXRhYmxlIGVycm9yOiBQZXIgcG90ZXIgdXRpbGl6emFyZSBsJ2VzLXRhYmxlIGNvbiBbSGllcmFyY2h5XT1cXFwidHJ1ZVxcXCIgw6ggcmljaGllc3RvIGFuY2hlIFtVc2VDdXN0b21DZWxsc109XFxcInRydWVcXFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICBpZiAodGhpcy5jb3B5U3Vic2NyaXB0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLmNvcHlTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGFzdGVTdWJzY3JpcHRpb24pXHJcbiAgICAgICAgICAgIHRoaXMucGFzdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3R4TWVudVN1YnNjcmlwdGlvbilcclxuICAgICAgICAgICAgdGhpcy5jdHhNZW51U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyBhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgbGV0IG5ld1NlYXJjaFZpZXcgPSBjaGFuZ2VzWydTZWFyY2hWaWV3J107XHJcbiAgICAgICAgaWYgKG5ld1NlYXJjaFZpZXcgJiYgdGhpcy5TZWFyY2hWaWV3KVxyXG4gICAgICAgICAgICB0aGlzLmFycmF5UHVsc2FudGkgPSB0aGlzLnV0aWxpdGllc19ILmdldFBhZ2VzQXJyYXkoNiwgdGhpcy5TZWFyY2hWaWV3LnBhZ2UsIHRoaXMuU2VhcmNoVmlldy5wYWdlcyB8fCAxLCB0aGlzLlNlYXJjaFZpZXcub2JqZWN0Y291bnQsIHRoaXMuU2VhcmNoVmlldy5pdGVtc3BlcnBhZ2VvdmVycmlkZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuKTogdm9pZCB7IHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47IH1cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm4pOiB2b2lkIHsgfVxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBjaGFuZ2VkKGNsZWFySXRlbXM6IGJvb2xlYW4gPSBmYWxzZSkgeyBcclxuICAgICAgICBpZihjbGVhckl0ZW1zICYmIHRoaXMudmlld01vZGUpXHJcbiAgICAgICAgICAgICg8QXBwU2VhcmNoPGFueT4+dGhpcy5WaWV3KS5pdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLlZpZXcpOyBcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIGFzeW5jIHdyaXRlVmFsdWUob2JqOiBhbnksIHRocm90dGxlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuVmlldyA9IG9iaiA/IG9iaiA6IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLkVzVGFibGVIYW5kbGVkU2VhcmNoICYmIHRocm90dGxlKSB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuY2FsbFRpbWVvdXQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jYWxsVGltZW91dCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNhbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7IHRoaXMud3JpdGVWYWx1ZShvYmosIGZhbHNlKTsgfSwgdGhpcy5TZWFyY2hUaHJvdHRsZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICBcclxuICAgICAgICAvLyBNaSDDqCBhcnJpdmF0YSBsJ0FwcFNlYXJjaCBxdWluZGkgZGkgc2ljdXJvIG5vbiBobyB1bmEgcmljZXJjYSBpbiBwcm9ncmVzc1xyXG4gICAgICAgIHRoaXMucmVzZWFyY2hJblByb2dyZXNzID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5WaWV3ICYmICF0aGlzLlNlYXJjaFZpZXcpIHtcclxuICAgICAgICAgICAgLy8gU3UgdmlldyBudWxsYSBldml0byBkaSBmYXJlIHByZXNzb2Now6kgcXVhbHNpYXNpIGNvc2EuIFNlIGFycml2YSB1biBudWxsIGRldm8gYW5jaGUgYXNzaWN1cmFybWkgZGkgbm9uIG1vc3RyYXJlIG51bGxhXHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLlRNUEJvdW5kU291cmNlIHx8IFtdO1xyXG5cclxuICAgICAgICAgICAgLy8gUGVyIGVzc2VyZSBzaWN1cm8gY2hlIGRvcG8gdW4gYmluZCBkaSBvZ2dldHRpIGxhIGVzLXRhYmxlIGFnZ2lvcm5pIGxhIGdyYWZpY2FcclxuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNlIHBlciBzYmFnbGlvIGwnb2dnZXR0byBjaGUgbWkgYXJyaXZhIG5vbiDDqCB0aXBpenphdG8gKGluc3RhbmNlb2YgQXBwU2VhcmNoIHJlc3RpdHVpc2NlIGZhbHNlIGFuY2hlIHNlIMOoIGRlbCB0aXBvIGdpdXN0bylcclxuICAgICAgICAvLyBsbyBjb3JyZWdnby0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAgaWYgKHRoaXMuVmlldyAmJiB0eXBlb2YgKHRoaXMuVmlldyBhcyBhbnkpLml0ZW1zcGVycGFnZW92ZXJyaWRlICE9ICd1bmRlZmluZWQnICYmICEodGhpcy5WaWV3IGluc3RhbmNlb2YgQXBwU2VhcmNoKSlcclxuICAgICAgICAgICAgKHRoaXMuVmlldyBhcyBhbnkpLl9fcHJvdG9fXyA9IG5ldyBBcHBTZWFyY2goKTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLlNlYXJjaFZpZXcgJiYgdHlwZW9mICh0aGlzLlNlYXJjaFZpZXcgYXMgYW55KS5pdGVtc3BlcnBhZ2VvdmVycmlkZSAhPSAndW5kZWZpbmVkJyAmJiAhKHRoaXMuU2VhcmNoVmlldyBpbnN0YW5jZW9mIEFwcFNlYXJjaCkpXHJcbiAgICAgICAgICAgICh0aGlzLlNlYXJjaFZpZXcgYXMgYW55KS5fX3Byb3RvX18gPSBuZXcgQXBwU2VhcmNoKCk7XHJcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgICAgICBpZiAodGhpcy5WaWV3ICYmIHRoaXMuVmlldyBpbnN0YW5jZW9mIEFwcFNlYXJjaCkge1xyXG4gICAgICAgICAgICAvLyBTZSBjYW1iaWEgbCdvZ2dldHRvIGludGVybyBzaWduaWZpY2EgY2hlIGhvIHJpbWFuZGF0byBsYSByaWNlcmNhXHJcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgndmlldycpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGZpcnN0SXRlbUdyb3VwT3JOb0dyb3VwaW5nID0gKHRoaXMuVmlldy5yZXF1ZXN0ZWRncm91cHM/Lmxlbmd0aCB8fCAwKSA9PSAwO1xyXG5cclxuICAgICAgICAgICAgLy8gU2UgdmVuZ28gZGEgdW5hIHJpY2VyY2EgaW50ZXJuYSBtYW50ZW5nbyBsbyBzdGF0byBkaSBzZWxlemlvbmUgcHJlY2VkZW50ZSAocXVpbmRpIHN1IGNhbWJpbyBwYWdpbmEsIGNhbWJpbyBpcHAsIGVjYy4uLilcclxuICAgICAgICAgICAgLy8gc2UgaW52ZWNlIGwndXRlbnRlIGhhIGZhdHRvIHVuYSByaWNlcmNhIGx1aSAocXVpbmRpIGNhbWJpYW5kbyBmaWx0cmkpLCBzZWNjbyBsZSBpbmZvIGRpIHNlbGV6aW9uZVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuVmlldy5zZWxlY3Rpb24gfHwgKCF0aGlzLlZpZXcuaW50ZXJuYWxzZWFyY2hyZXF1ZXN0ICYmIGZpcnN0SXRlbUdyb3VwT3JOb0dyb3VwaW5nKSB8fCAhdGhpcy5Vc2VTZWxlY3Rpb25DYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5jbGVhclNlbGVjdGlvbkNhY2hlcygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGVjdGlvbiA9IG5ldyBJdGVtc1NlbGVjdGlvbihbXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHRoaXMuVmlldy5zZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLlZpZXcuaW50ZXJuYWxzZWFyY2hyZXF1ZXN0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAvLyBSZWN1cGVybyBQcmVmZXJlbmNlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNhdmVQcmVmZXJlbmNlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5nQ29udHJvbC5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJOb24gcG9zc28gdXRpbGl6emFyZSBsZSBwcmVmZXJlbmNlIHNlbnphIGF2ZXJlIHVuICduYW1lJyBwZXIgcXVlc3RhIHRhYmVsbGFcIik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5wcmVmU2VydmljZSlcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm9uIHBvc3NvIHV0aWxpenphcmUgbGUgcHJlZmVyZW5jZSBzZW56YSBjaGUgaWwgcGFjY2hldHRvIEBlc2ZhZW56YS9wcmVmZXJlbmNlcyBzaWEgaW5zdGFsbGF0b1wiKTtcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwcmVmcyA9IGF3YWl0IHRoaXMucHJlZlNlcnZpY2UuZ2V0SXRlbTx7IGNvbHVtbnM6IHN0cmluZ1tdLCBjb2x1bW5fb3JkZXJpbmc6IHN0cmluZ1tdLCBvcmRlcnM6IEFwcE9yZGVyaW5nW10gfT4oPHN0cmluZz50aGlzLm5nQ29udHJvbC5uYW1lKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNpIGxhIGdlbnRlIHNpIG1ldHRhIGEgc3BhbW1hcmUgcmVmcmVzaCBjb24gbmdpZiBzdHJhbmkgc3VsbCdlc3RhYmxlIGNyZWFuZG9sYSBlIGRpc3RydWdnZW5kb2xhIE4gdm9sdGUgYWwgc2Vjb25kbyBuZWwgdGVtcG8gY2hlIGNpIG1ldHRlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0aXJhcmUgc3UgbGUgcHJlZmVyZW5jZSBkYSBxdWkgc29wcmEgbGEgVmlldyBwb3RyZWJiZSBlc3NlcmUgY2FtYmlhdGFcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5WaWV3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2xzID0gcHJlZnM/LmNvbHVtbnMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cGRhdGVkUHJlZnMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwb3NpdG9yeTogc3RyaW5nW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2U6IHN0cmluZ1tdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucy5tYXAodCA9PiB0LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IGNvbHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gY29scztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IHRoaXMuVmlldy5jb2x1bW5zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBtb2RhbGl0w6AgcmVwb3J0IGRldm8gY29udHJvbGxhcmUgY2hlIHR1dHRlIGxlIGNvbG9ubmUgc2FsdmF0ZSBmYWNjaWFubyBwYXJ0ZSBkZWxsYSB2aXN0YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBtb2RhbGl0w6Agbm9ybWFsZSBpbnZlY2Ugc2UgbGUgcHJlZmVyZW56ZSBmYW5ubyByaWZlcmltZW50byBhIGRlbGxlIGNvbG9ubmUgY2hlIGlvIG5vbiBobyBuZWxsYSBWaWV3IGF0dHVhbGUgc2lnbmlmaWNhIGNoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG8gZmFjZW5kbyByaWZlcmltZW50byBhIHVuYSB2ZXJzaW9uZSB2ZWNjaGlhIGRlbGwnZXMtdGFibGUsIHF1aW5kaSBub24gZmFjY2lvIG9wZXJhemlvbmlcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5LmluZGV4T2Yoc291cmNlW2ldKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRQcmVmcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZSBtaSBiYXNvIHN1IGRpcmV0dGl2ZSBtYSBuZWxsZSBwcmVmZXJlbmNlIMOoIHByZXNlbnRlIGFuY2hlIHNvbG8gdW5hIGNvbG9ubmEgbm9uIHByZXNlbnRlIG5lbGxlIGRpcmV0dGl2ZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdnVvbCBkaXJlIGNoZSBsJ2VzLXRhYmxlIMOoIGNhbWJpYXRhIHF1aW5kaSBub24gaW1wb3N0byBwcmVmZXJlbmNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5Fc1Roc0RpcmVjdGl2ZT8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFyciA9IHRoaXMuRXNUaHNEaXJlY3RpdmUudG9BcnJheSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhzQ2FjaGU6IHsgW2luZGV4OiBzdHJpbmddOiBFc1RoRGlyZWN0aXZlIH0gPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRoID0gYXJyW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoc0NhY2hlW3RoLnRoXSA9IHRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXBvc2l0b3J5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aHNDYWNoZVtyZXBvc2l0b3J5W2ldXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUHJlZnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlZFByZWZzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZpZXcuY29sdW1ucyA9IHByZWZzPy5jb2x1bW5zIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WaWV3LmNvbHVtbl9vcmRlcmluZyA9IHByZWZzPy5jb2x1bW5fb3JkZXJpbmcgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZSBsZSBwcmVmIHNvbm8gbnVsbGUgbm9uIHNvdnJhc2NyaXZvIGdsaSBvcmRpbmkgZGF0byBjaGUgcG90cmViYmUgc2VydmlyZSBtZXR0ZXJlIGRlZ2xpIG9yZGluYW1lbnRpIGRpIGRlZmF1bHQgbGF0byB0c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlZnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WaWV3Lm9yZGVycyA9IHByZWZzPy5vcmRlcnMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIExhIHBhZ2luYXppb25lIGRldm8gZmFybGEgc29sYW1lbnRlIHF1YW5kbyByaWNoaWVkbyBvIHVuIGdydXBwbyBwcmluY2lwYWxlIChzZSBzb25vIGluIHJvdyBncm91cGluZykgbyBzZSBub24gcmljaGllZG8gZ3J1cHBpIChpbiB0dXR0aSBsZ2kgYWx0cmkgY2FzaSlcclxuICAgICAgICAgICAgaWYgKGZpcnN0SXRlbUdyb3VwT3JOb0dyb3VwaW5nKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hcnJheVB1bHNhbnRpID0gdGhpcy51dGlsaXRpZXNfSC5nZXRQYWdlc0FycmF5KDYsIHRoaXMuVmlldy5wYWdlLCB0aGlzLlZpZXcucGFnZXMgfHwgMSwgdGhpcy5WaWV3Lml0ZW1zLmxlbmd0aCwgdGhpcy5WaWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5WaWV3ICYmICh0aGlzLlZpZXcubGVuZ3RoICE9IG51bGwgJiYgdGhpcy5WaWV3Lmxlbmd0aCAhPSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgnYXJyYXknKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5Vc2VTZWxlY3Rpb25DYWNoZSB8fCAhdGhpcy5hcnJheW1vZGVTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJTZWxlY3Rpb25DYWNoZXMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXJyYXltb2RlU2VsZWN0aW9uID0gbmV3IEl0ZW1zU2VsZWN0aW9uKFtdKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQodGhpcy5hcnJheW1vZGVTZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBSZWN1cGVybyBQcmVmZXJlbmNlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNhdmVQcmVmZXJlbmNlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5nQ29udHJvbC5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJOb24gcG9zc28gdXRpbGl6emFyZSBsZSBwcmVmZXJlbmNlIHNlbnphIGF2ZXJlIHVuICduYW1lJyBwZXIgcXVlc3RhIHRhYmVsbGFcIik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5wcmVmU2VydmljZSlcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm9uIHBvc3NvIHV0aWxpenphcmUgbGUgcHJlZmVyZW5jZSBzZW56YSBjaGUgaWwgcGFjY2hldHRvIEBlc2ZhZW56YS9wcmVmZXJlbmNlcyBzaWEgaW5zdGFsbGF0b1wiKTtcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwcmVmcyA9IGF3YWl0IHRoaXMucHJlZlNlcnZpY2UuZ2V0SXRlbTx7IGNvbHVtbnM6IHN0cmluZ1tdLCBjb2x1bW5fb3JkZXJpbmc6IHN0cmluZ1tdLCBvcmRlcnM6IEFwcE9yZGVyaW5nW10gfT4oPHN0cmluZz50aGlzLm5nQ29udHJvbC5uYW1lKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY29scyA9IHByZWZzPy5jb2x1bW5zIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB1cGRhdGVkUHJlZnMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXBvc2l0b3J5OiBzdHJpbmdbXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlOiBzdHJpbmdbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gdGhpcy5WaWV3LnJlcG9ydF9jb2x1bW5zLm1hcCh0ID0+IHQuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSBjb2xzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IGNvbHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IHRoaXMuVmlldy5jb2x1bW5zO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gbW9kYWxpdMOgIHJlcG9ydCBkZXZvIGNvbnRyb2xsYXJlIGNoZSB0dXR0ZSBsZSBjb2xvbm5lIHNhbHZhdGUgZmFjY2lhbm8gcGFydGUgZGVsbGEgdmlzdGFcclxuICAgICAgICAgICAgICAgICAgICAvLyBJbiBtb2RhbGl0w6Agbm9ybWFsZSBpbnZlY2Ugc2UgbGUgcHJlZmVyZW56ZSBmYW5ubyByaWZlcmltZW50byBhIGRlbGxlIGNvbG9ubmUgY2hlIGlvIG5vbiBobyBuZWxsYSBWaWV3IGF0dHVhbGUgc2lnbmlmaWNhIGNoZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0byBmYWNlbmRvIHJpZmVyaW1lbnRvIGEgdW5hIHZlcnNpb25lIHZlY2NoaWEgZGVsbCdlcy10YWJsZSwgcXVpbmRpIG5vbiBmb2NjaW8gb3BlcmF6aW9uaVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5LmluZGV4T2Yoc291cmNlW2ldKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByZWZzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRQcmVmcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZpZXcuY29sdW1ucyA9IHByZWZzPy5jb2x1bW5zIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZpZXcuY29sdW1uX29yZGVyaW5nID0gcHJlZnM/LmNvbHVtbl9vcmRlcmluZyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlIGxlIHByZWYgc29ubyBudWxsZSBub24gc292cmFzY3Jpdm8gZ2xpIG9yZGluaSBkYXRvIGNoZSBwb3RyZWJiZSBzZXJ2aXJlIG1ldHRlcmUgZGVnbGkgb3JkaW5hbWVudGkgZGkgZGVmYXVsdCBsYXRvIHRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZWZzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WaWV3Lm9yZGVycyA9IHByZWZzPy5vcmRlcnMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5TZWFyY2hWaWV3KVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hcnJheVB1bHNhbnRpID0gdGhpcy51dGlsaXRpZXNfSC5nZXRQYWdlc0FycmF5KDYsIHRoaXMuU2VhcmNoVmlldy5wYWdlLCB0aGlzLlNlYXJjaFZpZXcucGFnZXMgfHwgMSwgdGhpcy5TZWFyY2hWaWV3Lml0ZW1zLmxlbmd0aCwgdGhpcy5TZWFyY2hWaWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZmluYWxpemVDb250ZXh0KCk7XHJcblxyXG4gICAgICAgIHRoaXMucG9zdEJvdW5kU291cmNlQ2FsY3VsYXRpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuVmlldyAmJiAhdGhpcy5WaWV3LnNlbGZzZWFyY2ggJiYgdGhpcy5Fc1RhYmxlSGFuZGxlZFNlYXJjaCkge1xyXG4gICAgICAgICAgICB0aGlzLlZpZXcuc2VsZnNlYXJjaCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCh0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5vblNlYXJjaFJlcXVlc3QuZW1pdChmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5WaWV3ICYmIHRoaXMuVmlldy5zZWxmc2VhcmNoICYmIHRoaXMuRXNUYWJsZUhhbmRsZWRTZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGZzZWFyY2ggPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBGdW56aW9uZSBkaSB0cmFja2J5IHBlciBpbCBib2R5IGNoZSBkb3ZyZWJiZSBldml0YXJlIGlsIDkwJSBkZWxsZSBjaGFuZ2UgZGV0ZWN0aW9uICovXHJcbiAgICBwdWJsaWMgYm9keVRyYWNrQnkgPSAoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSA9PiBpdGVtLl9oYXNoO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VjY2Vzc2l2YW1lbnRlIGFsIGJpbmQgZGVsIG51b3ZvIGlucHV0IHF1ZXN0YSBmdW56aW9uZSBzaSBvY2N1cGEgZGkgZmluYWxpenphcmUgdHV0dGkgaSBwYXJhbWV0cmkgZGkgZnVuemlvbmFtZW50byBkZWxsJ2VzLXRhYmxlIFxyXG4gICAgICogaW4gYmFzZSBhIElucHV0IC0gTW9kZWxsbywgZSBxdWFsc2lhc2kgYWx0cmEgY29zYSBwb3NzYSBzZXJ2aXJlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmluYWxpemVDb250ZXh0KCkge1xyXG4gICAgICAgIGxldCB2aWV3Q2FzdGVkID0gdGhpcy5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+O1xyXG5cclxuICAgICAgICBsZXQgaGFzUm93R3JvdXBzID0gdmlld0Nhc3RlZCAmJiAodmlld0Nhc3RlZC5ncm91cGluZ3MgJiYgdmlld0Nhc3RlZC5ncm91cGluZ3MuZmlsdGVyKHQgPT4gIXQuYWdncmVnYXRpb24pLmxlbmd0aCA+IDApIHx8ICh0aGlzLmFycmF5TW9kZSAmJiB0aGlzLkVzVGhzRGlyZWN0aXZlLnNvbWUodCA9PiB0LnRoR3JvdXApKTtcclxuXHJcbiAgICAgICAgLy8gU2UgaG8gZGVpIGdydXBwaSBpbiBtb2RhbGl0w6AgYXJyYXkgZGV2byBzaXN0ZW1hcmUgdW4gcG8nIGRpIHZhcmlhYmlsaSBjaGUgZGl2ZW50YW5vIGluc2Vuc2F0ZVxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSAmJiBoYXNSb3dHcm91cHMpXHJcbiAgICAgICAgICAgIHRoaXMuVXNlQXJyYXlNb2RlUGFnaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIFJpZW1waW1lbnRvIGRlbGxhIFRNUEJvdW5kU291cmNlIGNvbiBnbGkgb2dnZXR0aSBjaGUgdmVycmFubm8gcG9pIG1vc3RyYXRpIGFkIGludGVyZmFjY2lhXHJcbiAgICAgICAgdGhpcy5UTVBCb3VuZFNvdXJjZSA9IHRoaXMuaXRlbXNfSC5nZXRJdGVtc0J5TW9kZShmYWxzZSwgIXRoaXMuaW50ZXJuYWxXcml0ZUNhbGwpO1xyXG5cclxuICAgICAgICAvLyBTZSBobyB1bmEgZ2VyYXJjaGlhLCBhc3NlZ25vIGkgbGl2ZWxsaSBnZXJhcmNoaWNpIGFsbGEgVE1QQm91bmRTb3VyY2VcclxuICAgICAgICBpZiAodGhpcy5IaWVyYXJjaHkgJiYgIWhhc1Jvd0dyb3VwcylcclxuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlNb2RlX0guYXNzaWduSGllcmFyY2h5TGV2ZWxzKHRoaXMuVE1QQm91bmRTb3VyY2UpO1xyXG5cclxuICAgICAgICAvLyBMJ2hhc2hpbmcgZGVnbGkgb2dnZXR0aSBsbyBmYWNjaW8gYSBwcmVzY2luZGVyZVxyXG4gICAgICAgIHRoaXMudXRpbGl0aWVzX0guY2FsY3VsYXRlSGFzaCh0aGlzLlRNUEJvdW5kU291cmNlKTtcclxuXHJcbiAgICAgICAgLy8gQXNzZWdubyBhIHVuYSB2YXJpYWJpbGUgbWlhIGwnZXZlbnR1YWxlIG92ZXJyaWRlIHBlciBsYSBjbGFzc2UgZGVsbGEgcmlnYVxyXG4gICAgICAgIC8vIFNlIHBvaSBzb25vIGluIG1vZGFsaXTDoCBnZXJhcmNoaWNhIGluaWV0dG8gYW5jaGUgbGEgY2xhc3NlIHBlciBsYSBjb25maWd1cmF6aW9uZSBkZWwgbGl2ZWxsbyBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCh0aGlzLlRNUEJvdW5kU291cmNlICYmIHRoaXMuUm93Q2xhc3NBc3NpZ25lcikgfHwgdGhpcy5IaWVyYXJjaHkpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLlRNUEJvdW5kU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuVE1QQm91bmRTb3VyY2VbaV07XHJcbiAgICAgICAgICAgICAgICBpdGVtLl9yb3dDbGFzcyA9IHRoaXMuUm93Q2xhc3NBc3NpZ25lciA/IHRoaXMuUm93Q2xhc3NBc3NpZ25lcihpdGVtKSA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICBpdGVtLl9yb3dDbGFzcyArPSB0aGlzLkhpZXJhcmNoeSA/IFwiIGVzdC1yb3ctbHZsLVwiICsgaXRlbS5fbGV2ZWwgOiBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZW5lcmEgbGUgaW5mb3JtemlvbmkgZGkgcGFnaW5hemlvbmUgcGVyIGxhIHZpc3RhIGdsb2JhbGUgZGVsbCdlcy10YWJsZSAqL1xyXG4gICAgcHJpdmF0ZSBzZXR1cFBhZ2luZ0luZm9ybWF0aW9ucygpIHtcclxuXHJcbiAgICAgICAgLy8gRGVmYXVsdCBjaGUgdmFsZ29ubyBkaSBiYXNlLCBwb2kgZXZlbnR1YWxtZW50ZSBtb2RkYXRpIGRhbGxlIGZ1bnppb25pIHNvdHRvXHJcbiAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50ID0gIXRoaXMuSGlkZVBhZ2luZ0NvdW50O1xyXG4gICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gIXRoaXMuSGlkZVBhZ2luZ0J1dHRvbnM7XHJcbiAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd1BhZ2luZyA9ICF0aGlzLkhpZGVQYWdpbmdcclxuICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5Vc2VzVmlldyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSAmJiB0aGlzLlVzZUFycmF5TW9kZVBhZ2luZyAmJiAhdGhpcy5TZWFyY2hWaWV3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlBhZ2VyQ291bnQgPSAoPGFueVtdPnRoaXMuVmlldykubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnMgJiYgdGhpcy5WaWV3Lmxlbmd0aCA+IDEwO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5WaWV3ID0gdGhpcy5WaWV3O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5Vc2VzVmlldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93UGFnaW5nT3B0aW9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmFycmF5TW9kZSAmJiAoIXRoaXMuVXNlQXJyYXlNb2RlUGFnaW5nIHx8IHRoaXMuU2VhcmNoVmlldykpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuU2VhcmNoVmlldykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuVmlldyA9IHRoaXMuU2VhcmNoVmlld1xyXG4gICAgICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuUGFnZXJDb3VudCA9IHRoaXMuU2VhcmNoVmlldy5vYmplY3Rjb3VudCB8fCAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlBhZ2VyQ291bnQgPSAoPGFueVtdPnRoaXMuVmlldykubGVuZ3RoIHx8IDBcclxuXHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnMgJiYgKHRoaXMuVmlldy5sZW5ndGggPiAxMCB8fCAodGhpcy5TZWFyY2hWaWV3Py5vYmplY3Rjb3VudCB8fCAwKSA+IDEwKTtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50ID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50IHx8ICh0aGlzLlZpZXcgJiYgdGhpcy5WaWV3Lmxlbmd0aCkgfHwgKHRoaXMuU2VhcmNoVmlldyAmJiB0aGlzLlNlYXJjaFZpZXcub2JqZWN0Y291bnQgJiYgdGhpcy5TZWFyY2hWaWV3Lm9iamVjdGNvdW50ICE9IC0xKTtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd1BhZ2luZyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zIHx8IHRoaXMuUGFnZXJPcHRpb25zLlNob3dDb3VudDtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd1BhZ2luZ09wdGlvbnMgPSB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy52aWV3TW9kZSkge1xyXG4gICAgICAgICAgICBsZXQgdG1wVmlldyA9IHRoaXMuTWFpbkdyb3VwVmlldyB8fCB0aGlzLlZpZXc7XHJcbiAgICAgICAgICAgIGxldCBjb3VudCA9IHRtcFZpZXc/Lmdyb3VwY291bnQgfHwgdG1wVmlldz8ub2JqZWN0Y291bnQ7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNlYXJjaGVzID0gdG1wVmlldz8uZ3JvdXBjb3VudCAhPSBudWxsICYmIHRtcFZpZXc/Lmdyb3VwY291bnQgIT0gdW5kZWZpbmVkID8gJ2dyb3VwcycgOiAnaXRlbXMnO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5QYWdlckNvdW50ID0gY291bnQgfHwgMDtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuVmlldyA9IHRtcFZpZXc7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dDb3VudCA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dDb3VudCB8fCAodG1wVmlldyAmJiBjb3VudCAmJiBjb3VudCAhPSAtMSk7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnMgJiYgKHRtcFZpZXcucGFnaW5nYXZhaWxhYmxlIHx8IHRoaXMuUGFnZXJPcHRpb25zLlNob3dDb3VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dQYWdpbmdPcHRpb25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGxhbmNpYXRvIGRvcG8gY2hlIGxhIHNvcmdlbnRlIGRhdGkgw6ggc3RhdGEgY29ycmV0dGFtZW50ZSBiaW5kYXRhLCBzaSBvY2N1cGEgZGkgcmljYWxjb2xhcmUgdHV0dG8gY2nDsiBjaGUgc2VydmVcclxuICAgICAqIGFsbCdlcy10YWJsZSBwZXIgcmVuZGVyaXp6YXJlIGkgdmFsb3JpIGRhIG1vc3RyYXJlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcG9zdEJvdW5kU291cmNlQ2FsY3VsYXRpb24oKSB7XHJcbiAgICAgICAgLy8gUmVzZXR0byB0dXR0byB0cmFubmUgUm93VERzIGUgUm93VEhzIHBlciBldml0YXJlIGZsaWNrZXJpbmcuIFJvd1REcyBlIFJvd1RIcyBzYXJhbm5vIG1vZGlmaWNhdGUgYWxsJ2ludGVybm8gZGVsIHByb3NzaW1vIGNpY2xvIGRpIENEXHJcbiAgICAgICAgdGhpcy5Sb3dDb250ZXh0cyA9IFtdO1xyXG4gICAgICAgIHRoaXMuT3JkZXJEaXJlY3RpdmVzID0gW107XHJcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRJdGVtSUQgPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLmludGVybmFsUG9zdEJvdW5kU291cmNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFBlciBwb3RlciBkaXN0aW5ndWVyZSBsZSBjaGlhbWF0ZSBhIHF1ZXN0byBtZXRvZG86IERvcG8gaWwgc2V0VGltZW91dCBzZSB1c28gZ2xpIEVzVGQvRXNUaCB2ZWNjaGksIHNlbnphIGlsIHNldFRpbWVvdXQgc2UgdXNvIGxlIG51b3ZlIGRpcmV0dGl2ZSAqL1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbFBvc3RCb3VuZFNvdXJjZSgpIHtcclxuICAgICAgICBsZXQgVmlldyA9IHRoaXMuVmlldztcclxuXHJcbiAgICAgICAgbGV0IHRkc0QgPSB0aGlzLkVzVGRzRGlyZWN0aXZlLmxlbmd0aCA9PSAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Rkc0RpcmVjdGl2ZT8ubGVuZ3RoID4gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUZHNEaXJlY3RpdmUgOiB0aGlzLkVzVGRzRGlyZWN0aXZlIDogdGhpcy5Fc1Rkc0RpcmVjdGl2ZTtcclxuICAgICAgICBsZXQgdGhzRCA9IHRoaXMuRXNUaHNEaXJlY3RpdmUubGVuZ3RoID09IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGhzRGlyZWN0aXZlPy5sZW5ndGggPiAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Roc0RpcmVjdGl2ZSA6IHRoaXMuRXNUaHNEaXJlY3RpdmUgOiB0aGlzLkVzVGhzRGlyZWN0aXZlO1xyXG5cclxuICAgICAgICBsZXQgdGhzID0gdGhzRCAmJiB0aHNELmxlbmd0aCA+IDAgPyB0aHNELnRvQXJyYXkoKSA6IFtdO1xyXG4gICAgICAgIGxldCB0ZHMgPSB0ZHNEICYmIHRkc0QubGVuZ3RoID4gMCA/IHRkc0QudG9BcnJheSgpIDogW107XHJcblxyXG4gICAgICAgIC8vIFNlIG5vbiBobyBjb2xvbm5lIGRpbmFtaWNoZSBtYSBzb25vIGluIG1vZGFsaXTDoCBkaW5hbWljYSAobG8gY2FwaXNjbyBwZXJjaMOpIGMnw6ggdW5hIHZpZXcgcGllbmEgZGkgZ2VuZXJpY2l0ZW0pIG1ldHRvIGlsIGRlZmF1bHQgZGVsbGUgY29sb25uZVxyXG4gICAgICAgIHRoaXMuZHluYW1pY01vZGVfSC5ldmVudHVhbGx5UmV2aWV3RHluYW1pY0NvbHVtbnMoKTtcclxuICAgICAgICB0aGlzLmJpbmREaXNwbGF5VG9Mb2FkZWRJdGVtc09yR3JvdXBzKFZpZXcpO1xyXG5cclxuICAgICAgICAvLyBRdWVzdG8gZGV2J2Vzc2VyZSBwZXIgZm9yemEgbGFuY2lhdG8gZG9wbyAqKmJpbmREaXNwbGF5VG9Mb2FkZWRJdGVtc09yR3JvdXBzKiogZGF0byBjaGUgw6ggbMOsIGNoZSBhbGN1bmUgY29zZSB2ZW5nb25vIHZhbG9yaXp6YXRlXHJcbiAgICAgICAgdGhpcy5zZXR1cFBhZ2luZ0luZm9ybWF0aW9ucygpO1xyXG5cclxuICAgICAgICAvLyBNb2x0ZSBjb3NlIHNvbm8gb3Z2aWFtZW50ZSBkaXNwb25pYmlsaSBzb2xvIGluIG1vZGFsaXTDoCBWaWV3XHJcbiAgICAgICAgaWYgKCh0aGlzLnZpZXdNb2RlIHx8IHRoaXMuYXJyYXlNb2RlKSAmJiB0aGlzLlVzZUN1c3RvbUNlbGxzKSB7XHJcbiAgICAgICAgICAgIGxldCB2aWV3ID0gdGhpcy52aWV3TW9kZSA/IFZpZXcgYXMgQXBwU2VhcmNoPGFueT4gOiBudWxsO1xyXG4gICAgICAgICAgICBsZXQgaXRlbXNBbmRHcm91cHMgPSB0aGlzLnZpZXdNb2RlID8gWy4uLih2aWV3Lml0ZW1zIHx8IFtdKSwgLi4uKHZpZXcuZ3JvdXBzIHx8IFtdKV0gOiBWaWV3IGFzIGFueVtdO1xyXG4gICAgICAgICAgICBsZXQgc2kgPSB0aGlzLnZpZXdNb2RlID8gdmlldy5zZWxlY3Rpb24gOiB0aGlzLmFycmF5bW9kZVNlbGVjdGlvbjtcclxuICAgICAgICAgICAgLy8gTi5COiBSaXNwZXR0YXJlIGwnb3JkaW5lIGRpIHF1ZXN0ZSAzIG1hY3JvY2F0ZWdvcmllIMOoIFZJVEFMRVxyXG5cclxuICAgICAgICAgICAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgU2lzdGVtYXppb25pIGRpIFRILCBURCwgZSB2aXNpYmlsaXTDoCB2YXJpZSAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHJcbiAgICAgICAgICAgIC8vIEVzcGFuZG8gaSB0aCBlIGkgdGQgbXVsdGlwbGkgZHVwbGljYW5kb2xpXHJcbiAgICAgICAgICAgIGxldCByZXQgPSB0aGlzLmNvbHVtbk1ldGFkYXRhX0guZXhwYW5kTXVsdGlUaHNBbmRUZHModGhzLCB0ZHMsIGl0ZW1zQW5kR3JvdXBzKTtcclxuICAgICAgICAgICAgdGhzID0gcmV0LmV4cFRocztcclxuICAgICAgICAgICAgdGRzID0gcmV0LmV4cFRkcztcclxuXHJcbiAgICAgICAgICAgIC8vIEdlc3Rpb25lIGRlbGxlIHZpZXcgaW4gbW9kYWxpdMOgIHJlcG9ydCwgaSB0aCBlIGkgdGQgdmVuZ29ubyByaWdlbmVyYXRpIGRhbGxlIGNvbmZpZ3VyYXppb25pIGRlbGxhIHZpZXdcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmFycmF5TW9kZSAmJiB2aWV3LnJlcG9ydF9jb2x1bW5zKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmV0ID0gdGhpcy5yZXBvcnRNb2RlX0guZ2VuZXJhdGVUaHNBbmRUZHNGcm9tVmlldyh2aWV3KTtcclxuICAgICAgICAgICAgICAgIHRocyA9IHJldC50aHM7XHJcbiAgICAgICAgICAgICAgICB0ZHMgPSByZXQudGRzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBQcmVwYXNzYWdnaW8gcGVyIHRpcmFyZSBmdW9yaSB0dXR0ZSBsZSBpbmZvIHV0aWxpIHN1Z2xpIGhlYWRlcnMgaW4gbW9kbyBkYSBub24gcmljYWNvbGFyc2VsaSBzZW1wcmUgZG9wb1xyXG4gICAgICAgICAgICBsZXQgaEkgPSB0aGlzLmNvbHVtbk1ldGFkYXRhX0guZXZhbHVhdGVIZWFkZXJzR3JvdXBpbmdJbmZvcyh0aHMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuYXJyYXlNb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gbW9kYWxpdMOgIGFycmF5IG5vbiBobyB1biBiYWNrZW5kLi4uXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvd0dyb3VwaW5nX0guYXJyYXlNb2RlUmV2aWV3R3JvdXBpbmdzKGhJLmxlYWZzKTsgIC8vIC4uLiBpIHJhZ2dydXBwYW1lbnRpIGxpIGRldm8gZmFyZSBsYXRvIGNsaWVudFxyXG5cclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILnJldmlld0NvbHVtbnNMaXN0KGhJLmxlYWZzKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIEFnZ2lvcm5hIGxhIGxpc3RhIGRlbGxlIGNvbG9ubmUgZGEgbW9zdHJhcmUgbmVsbGEgZGlhbG9nIHBlciBvcmRpbmFtZW50byBlY2NcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmFsaWduQ29sdW1uc0lmTG9hZGVkVmlldyh2aWV3KTsgICAgICAgICAgICAgICAgICAgIC8vIFNlIHN0byBjYXJpY2FuZG8gdW5hIFZpZXcgZGEgaG90cG90YXRvIChxdWluZGkgY29uIHNhdmVkc3RhdGUgPSB0cnVlKSByaWFsbGluZW8gbGEgdmlzaWJpbGl0w6AgZGVsbGUgY29sb25uZSBlIGlsIGxvcm8gb3JkaW5lLlxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0gubW92ZUZpeGVkQ29sdW1uc0F0VGhlQmVnaW5uaW5nKGhJLmxlYWZzLCB0ZHMpOyAgICAgLy8gU3Bvc3RvIHR1dHRlIGxlIGNvc2UgZml4ZWQgYWxsJ2luaXppbyBpbiBtb2RvIGNoZSBsYSBjcmVhemlvbmUgZGkgdGggZSB0ZCBzaWEgcGnDuSBzbmVsbGEgKFV0aWxpenphIGxlIENvbHVtbnNMaXN0LCBxdWluZGkgZGV2J2Vzc2VyZSByaWNoaWFtYXRhIFBJUk1BIGRpIHJldmlld0NvbHVtbnNMaXN0KVxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0guYWxpZ25IZWFkZXJzT3JkZXJpbmcoaEkubGVhZnMsIHZpZXcpOyAgICAgICAgICAgICAgLy8gQWxsaW5lbyBnbGkgb3JkaW5hbWVudGkgYWdsaSBoZWFkZXJcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILnJlZnJlc2hDb2x1bW5zVmlzaWJpbGl0eShoSS5sZWFmcywgdGRzLCB2aWV3KTsgICAgIC8vIExhdm9ybyBzdWkgVEggZWQgZXZlbnR1YWxtZW50ZSBtb2RpZmljbyBsYSB2aXNpYmlsaXTDoCBhbmNoZSBkZWkgVEQuXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5ldmFsdWF0ZVBpbm5lZENvbHVtbnNXaWR0aCgpOyAgICAgICAgICAgICAgICAgICAgICAvLyBTZSBzb25vIHByZXNlbnRpIGNvbG9ubmUgcGlubmF0ZSB2YWx1dGEgbGEgZGltZW5zaW9uZSBkZWwgY29udGVuaXRvcmVcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmdlbmVyYXRlRGVmYXVsdE9yZGVyKGhJLmxlYWZzLCB2aWV3KTsgICAgICAgICAgICAgIC8vIEdlbmVybyBsZSBkaXJldHRpdmUgZGkgb3JkaW5hbWVudG8sIGNoZSBzaWFubyBkZWZhdWx0IG8gZGVyaXZhbnRpIGRhbGxhIEFwcFNlYXJjaFxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0guZXZhbHVhdGVIZWFkZXJHcm91cHMoaEkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsdXRvIGkgcmFnZ3J1cHBhbWVudGkgZGVnbGkgaGVhZGVyIHNlIHByZXNlbnRpXHJcblxyXG4gICAgICAgICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICBHZW5lcmF6aW9uZSBiaW5kaW5nIHBlciByaWdoZSBlIGNvbG9ubmUgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblxyXG4gICAgICAgICAgICB0aGlzLmV2YWx1YXRlUm93VGhzKGhJLmxlYWZzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSYWNjb2xnbyBpIFRIXHJcbiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVSb3dUZHMoaEkubGVhZnMsIHRkcyk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhY2NvbGdvIGkgVEQgaW4gY29udGVzdGkgc2VwYXJhdGksIHVuIGNvbnRlc3RvIHBlciBvZ25pIGl0ZW0gbyBncnVwcG9cclxuXHJcbiAgICAgICAgICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgIFVsdGltaSBhZ2dpdXN0bWFlbnRpIGRlaSBiaW5kaW5nICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5hcHBseU9yZGVyaW5nKHZpZXcsIHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGxpY28gbCdvcmRpbmFtZW50byBzdWxsZSBjb2xvbm5lIChub24gQVNDIERFU0MsIG1hIFwicHJpbWEgcXVlc3RhIG8gcXVlbGxhIGNvbG9ubmFcIilcclxuICAgICAgICAgICAgdGhpcy5Nb3ZlVGVtcG9yYXJ5VmFyaWFibGVzVG9SZWFsT25lcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29sbGVnbyBUSCBlIFREIGFnZ2l1c3RhdGkgZmlubyBhZCBvcmEgYWxsZSB2YXJpYWJpbGkgZGkgQmluZGluZyBIVE1MXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guZXZhbHVhdGVTZWxlY3Rpb24oaXRlbXNBbmRHcm91cHMsIHNpKTsgICAgICAgICAgICAgICAgIC8vIFJpYWxsaW5lbyBsZSBpbmZvIGRpIHNlbGV6aW9uZSBkZWdsaSBlbGVtZW50aSBkZWxsYSBWaWV3XHJcblxyXG4gICAgICAgICAgICAvLyBWYWx1dGEgbG8gc3RhdG8gaW5pemlhbGUgZGkgc2VsZXppb25lIGEgcmFuZ2VcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5ldmFsdWF0ZVNpbmdsZUNlbGxTZWxlY3Rpb24oaXRlbXNBbmRHcm91cHMsIGhJLmxlYWZzLCB0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbik7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5SZXNlYXJjaE5lZWRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVzZWFyY2hOZWVkZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICgodGhpcy52aWV3TW9kZSB8fCB0aGlzLmFycmF5TW9kZSkgJiYgIXRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHtcclxuICAgICAgICAgICAgLy8gUmlhbGxpbmVvIGxlIGluZm8gZGkgc2VsZXppb25lIGRlZ2xpIGVsZW1lbnRpIGRlbGxhIFZpZXdcclxuICAgICAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy52aWV3TW9kZSA/IChWaWV3IGFzIEFwcFNlYXJjaDxhbnk+KS5pdGVtcyA6IFZpZXcgYXMgYW55W107XHJcbiAgICAgICAgICAgIGxldCBzaSA9IHRoaXMudmlld01vZGUgPyAoVmlldyBhcyBBcHBTZWFyY2g8YW55Pikuc2VsZWN0aW9uIDogdGhpcy5hcnJheW1vZGVTZWxlY3Rpb247XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guZXZhbHVhdGVTZWxlY3Rpb24oaXRlbXMsIHNpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFBlciBlc3NlcmUgc2ljdXJvIGNoZSBkb3BvIHVuIGJpbmQgZGkgb2dnZXR0aSBsYSBlcy10YWJsZSBhZ2dpb3JuaSBsYSBncmFmaWNhXHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgdGhpcy5GaXJzdEJpbmQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVmZmV0dHVhIGlsIGJpbmRpbmcgZGVnbGkgb2dnZXR0aSBwZXJ2ZW51dGkgZGEgcXVlc3RhIGNoaWFtYXRhIGNvbiBnbGkgb2dnZXR0aSBlZmZldHRpdmFtZW50ZSBkYSBncmFmaWNhcmVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IHZpZXcgVmlldyBkYSBjdWkgc29ubyBhcnJpdmF0aSBnbGkgb2dnZXR0aS4gUHXDsiBlc3NlcmUgbyB1biBhcnJheSBzZSBzb25vIGluICoqYXJyYXlNb2RlKiogbyB1bmEgQXBwU2VhcmNoPFQ+IHNlIHNvbm8gaW4gKip2aWV3TW9kZSoqXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYmluZERpc3BsYXlUb0xvYWRlZEl0ZW1zT3JHcm91cHModmlldzogYW55KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLlRNUEJvdW5kU291cmNlIHx8IHRoaXMuVE1QQm91bmRTb3VyY2UubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5CYXNlSXRlbXNDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSBbXTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXJyYXlNb2RlIHx8ICF0aGlzLlVzZUN1c3RvbUNlbGxzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLlRNUEJvdW5kU291cmNlO1xyXG4gICAgICAgICAgICB0aGlzLkJhc2VJdGVtc0NvdW50ID0gdmlldz8ub2JqZWN0Y291bnQgfHwgdmlldz8ubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBncm91cGluZ0tleXMgPSB2aWV3Py5ncm91cGluZ3M/LmZpbHRlcih0ID0+ICF0LmFnZ3JlZ2F0aW9uKT8ubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgaWYgKGdyb3VwaW5nS2V5cyA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLlRNUEJvdW5kU291cmNlO1xyXG4gICAgICAgICAgICB0aGlzLkJhc2VJdGVtc0NvdW50ID0gdmlldz8ub2JqZWN0Y291bnQgfHwgMDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yb3dHcm91cGluZ19ILmhhbmRsZU5ld0RhdGFPblJvd0dyb3VwaW5nKHZpZXcsIGdyb3VwaW5nS2V5cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIE1ldG9kbyByaWNoaWFtYXRvIHNvbG8gcXVhbmRvICoqVE1QUm93VERzKiogZSAqKlRNUFJvd1RIcyoqIHNvbm8gY29tcGxldGFtZW50ZSBnZW5lcmF0aSBlZCBhZ2dpdXN0YXRpLiBTZXJ2ZSBwZXIgY29sbGVnYXJsaSBhbGxlIHZhcmlhYmlsaSB1c2F0ZSBsYXRvIGJpbmRpbmcgSFRNTCAqL1xyXG4gICAgcHJpdmF0ZSBNb3ZlVGVtcG9yYXJ5VmFyaWFibGVzVG9SZWFsT25lcygpIHtcclxuXHJcbiAgICAgICAgdGhpcy5Sb3dURHMgPSB0aGlzLlRNUFJvd1REcztcclxuICAgICAgICB0aGlzLlJvd1RIcyA9IHRoaXMuVE1QUm93VEhzO1xyXG4gICAgICAgIHRoaXMuUm93VGhHcm91cHMgPSB0aGlzLlRNUFJvd1RoR3JvdXBzID8gdGhpcy5UTVBSb3dUaEdyb3Vwcy5yZXZlcnNlKCkgOiBudWxsO1xyXG4gICAgICAgIHRoaXMuRW1wdHlSb3dUZHMgPSB0aGlzLmlzRW1wdHkodGhpcy5Sb3dURHMpO1xyXG5cclxuICAgICAgICB0aGlzLkNvbHVtbnMuVmlzaWJpbGUgPSB0aGlzLlJvd1RIcy5maWx0ZXIodCA9PiB0LlZpc2libGUpLmxlbmd0aDtcclxuICAgICAgICB0aGlzLkNvbHVtbnMuVmlzaWJsZVVucGlubmVkID0gdGhpcy5Sb3dUSHMuZmlsdGVyKHQgPT4gdC5WaXNpYmxlICYmICF0LlBpbm5lZCkubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMuQ29sdW1ucy5HbG9iYWwgPSB0aGlzLkNvbHVtbnMuVmlzaWJsZVVucGlubmVkICsgKHRoaXMuSGFzUGlubmVkQ29sdW1ucyA/IDEgOiAwKSArICh0aGlzLlNlbGVjdGlvbiA/IDEgOiAwKSArICh0aGlzLlJlbW92YWwgPyAxIDogMCkgKyAodGhpcy5FeHBvcnQgfHwgdGhpcy5IaWRkZW5Db2x1bW5zIHx8IHRoaXMuQ29sdW1uc09yZGVyaW5nIHx8IHRoaXMuQ29ybmVyTWVudU9wdGlvbnMgPyAxIDogMClcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBNZXRvZG8gcGVyIGNhcGlyZSBzZSB1biBvZ2dldHRvIMOoIGNvbXBsZXRhbWVudGUgdnVvdG8gXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkYSBjb250cm9sbGFyZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbCdvZ2dldHRvIMOoIHZ1b3RvLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBpc0VtcHR5KG9iajogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yICh2YXIgXyBpbiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJtZXR0ZSBkaSBzZWxlemlvbmFyZSBvIGRlc2VsZXppb25hcmUgaW4gbWFuaWVyYSBhcmJpdHJhcmlhIGRlZ2xpIG9nZ2V0dGlcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gaXRlbXMgT2dnZXR0aSBkYSBzZWxlemlvbmFyZSBvIGRlc2VsZXppb25hcmVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VsZWN0ICoqdHJ1ZSoqIHBlciBzZWxlemlvbmFybGksICoqZmFsc2UqKiBwZXIgbm9uIHRvY2NhcmxpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTZWxlY3Rpb25TdGF0dXMoaXRlbXM6IGFueVtdLCBhbGw6IGJvb2xlYW4sIHNlbGVjdDogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChhbGwpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLlNlbGVjdEFsbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkltcG9zc2liaWxlIGltcG9zdGFyZSBsYSBzZWxlemlvbmUgY29uIGwnYWxsIHNlbGVjdGlvbiBxdWFuZG8gbCdJbnB1dCBTZWxlY3RBbGwgw6ggZmFsc2VcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBzaSA9ICh0aGlzLlZpZXcgYXMgQXBwU2VhcmNoPGFueT4pPy5zZWxlY3Rpb24gfHwgdGhpcy5hcnJheW1vZGVTZWxlY3Rpb247XHJcbiAgICAgICAgICAgIC8vc2UgZGVzZWxlemlvbm8gY29uIGF0dHVhbGUgc2VsZXppb25lIGFkIGFsbCBvIHNlIHNlbGV6aW9ubyBjb24gYXR0dWFsZSBzZWxlemlvbmUgbWFudWFsZSBkZXZvIHJpY2hpYW1hcmUgbGEgKipzZWxlY3RBbGxPclJlc2V0U2VsZWN0aW9uKipcclxuICAgICAgICAgICAgaWYgKChzaS5hbGwgJiYgIXNlbGVjdCkgfHwgKCFzaS5hbGwgJiYgc2VsZWN0KSlcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guc2VsZWN0QWxsT3JSZXNldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guaGFuZGxlSXRlbXNTZWxlY3Rpb24oaXRlbXMsIHNlbGVjdCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGNoZSBnZXN0aXNjZSBpbCBjYW1iaW8gZGkgT3JkaW5hbWVudG8gZGkgdW5hIGNvbG9ubmFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgSUQgZGVsbGEgY29sb25uYSBpbCBjdWkgb3JpZG5hbWVudG8gw6ggY2FtYmlhdG9cclxuICAgICAqIEBwYXJhbSB7J0RFU0MnIHwgJ0FTQyd9IG9yZGVyIE51b3ZvIG9yZGluZSBzZWxlemlvbmF0byBwZXIgbGEgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdGhPcmRlckNoYW5nZWQoaWQ6IHN0cmluZywgb3JkZXI/OiAnREVTQycgfCAnQVNDJykge1xyXG4gICAgICAgIGlmICghdGhpcy52aWV3TW9kZSAmJiAhdGhpcy5hcnJheU1vZGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdPcmRlciBjaGFuZ2VkIG9uIGEgdGFibGUgbm90IGluIHZpZXdNb2RlIG9yIEFycmF5IG1vZGUuIE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5PcmRlckJ5Q29sdW1uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5oYW5kbGVUSE9yZGVyQ2hhbmdlKGlkLCBvcmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gZGEgY2hpYW1hcmUgb2duaSB2b2x0YSBjaGUgc2kgdnVvbGUgZGFyZSBldmlkZW56YSBhbGwnZXN0ZXJubyBkZWwgYmlzb2dubyBkaSByaWVmZmV0dHVhcmUgbGEgcmljZXJjYVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlc2V0c1BhZ2UgSW5kaWNhIGFsIGxpc3RlbmVyIGNoZSBkZXZlIHJlc2V0dGFyZSBpbCBudW1lcm8gZGkgcGFnaW5hXHJcbiAgICAgKiBAcGFyYW0ge0FwcFNlYXJjaDxhbnk+fSB2aWV3T3ZlcnJpZGUgT3ZlcnJpZGUgZGVsbGEgdmlldyBkYSBlbWV0dGVyZSBwZXIgcXVlc3RhIHJpY2VyY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGVtaXRTZWFyY2hSZXF1ZXN0KHJlc2V0c1BhZ2U6IGJvb2xlYW4sIHZpZXdPdmVycmlkZT86IEFwcFNlYXJjaDxhbnk+KSB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlld01vZGUgJiYgIXZpZXdPdmVycmlkZSkge1xyXG4gICAgICAgICAgICAodGhpcy5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+KS5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2aWV3T3ZlcnJpZGUpIHtcclxuICAgICAgICAgICAgaWYgKHJlc2V0c1BhZ2UpXHJcbiAgICAgICAgICAgICAgICB2aWV3T3ZlcnJpZGUucGFnZSA9IDE7XHJcbiAgICAgICAgICAgIHZpZXdPdmVycmlkZS5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgPSB0cnVlXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlc2VhcmNoSW5Qcm9ncmVzcyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlZpZXcgJiYgIXRoaXMuVmlldy5zZWxmc2VhcmNoICYmIHRoaXMuRXNUYWJsZUhhbmRsZWRTZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGZzZWFyY2ggPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMub25TZWFyY2hSZXF1ZXN0LmVtaXQoZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5vblNlYXJjaFJlcXVlc3QuZW1pdCh2aWV3T3ZlcnJpZGUgPyB2aWV3T3ZlcnJpZGUgOiByZXNldHNQYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnRlbmRvIGRhZ2xpICoqRXNUZHMqKiBiaW5kYXRpIGdlbmVyYSwgYWxsJ2ludGVybm8gZGVsIGRpemlvbmFyaW8gKipUTVBSb3dURHMqKiB0dXR0aSBpIGNvbnRlc3RpIGRlaSB2YXJpIG9nZ2V0dGkuXHJcbiAgICAgKlxyXG4gICAgICogVmVuZ29ubyBlc2NsdXNpIGkgVEQgXCJJbnRlcm5pXCIgaW4gcXVhbnRvIHZlbmdvbm8gZ2VuZXJhdGkgZGFnbGkgb3JpZ2luYWxpIHF1aW5kaSBpbmNsdWRlcmxpIHZvcnJlYmJlIGRpcmUgcmllZmZldHR1YXJlIGxlIG9wZXJhemlvbmkgZHVlIHZvbHRlXHJcbiAgICAgKlxyXG4gICAgICogQ29zdG86IDIgc2NhbiBFc1RocywgMSBzY2FuIEVzVGRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFc1RoRGlyZWN0aXZlW119IHRocyBDb2xvbm5lIGRlbGxhIHRhYmVsbGFcclxuICAgICAqIEBwYXJhbSB7RXNUZERpcmVjdGl2ZVtdfSB0ZHMgQ2VsbGUgZGVsbGEgdGFiZWxsYVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlUm93VGRzKHRoczogRXNUaERpcmVjdGl2ZVtdLCB0ZHM6IEVzVGREaXJlY3RpdmVbXSkge1xyXG4gICAgICAgIGlmICh0ZHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IHRoc0NhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogRXNUaERpcmVjdGl2ZSB9ID0ge307XHJcbiAgICAgICAgbGV0IGNvbHVtbnNDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IEVzVGFibGVDb2x1bW4gfSA9IHt9O1xyXG5cclxuICAgICAgICBmb3IgKGxldCBjb2xpID0gMDsgY29saSA8IHRoaXMuQ29sdW1uc0xpc3QubGVuZ3RoOyBjb2xpKyspIHtcclxuICAgICAgICAgICAgbGV0IGNvbCA9IHRoaXMuQ29sdW1uc0xpc3RbY29saV07XHJcbiAgICAgICAgICAgIGNvbHVtbnNDYWNoZVtjb2wuaWRdID0gY29sO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldO1xyXG4gICAgICAgICAgICB0aHNDYWNoZVt0aC50aF0gPSB0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuVE1QUm93VERzID0ge307XHJcbiAgICAgICAgLy8gVmFyaWFiaWxlIGQnYXBwb2dnaW8gcGVyIHBlcm1ldHRlcm1pIGRpIGluc2VyaXJlIHR1dHRlIGxlIGNvbG9ubmUgXCJGaXhlZFwiIGRhdmFudGlcclxuICAgICAgICBsZXQgY29udGV4dEZpeGVkczogeyBbY29udGV4dDogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdGQgPSB0ZHNbaV07XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYm91bmRTb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBpdGVtID0gdGhpcy5ib3VuZFNvdXJjZVtpXTtcclxuICAgICAgICAgICAgICAgIGxldCBjdHggPSBpdGVtLl9oYXNoO1xyXG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IHRkLnRkO1xyXG4gICAgICAgICAgICAgICAgbGV0IHRoID0gdGhzQ2FjaGVbdGQudGRdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghIXRoKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoLl9yZWZlcmVuY2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTa2lwcGFyZSBzZW56YSB0aCAoY2FzaXN0aWNhIHRhYmVsbGEgZGluYW1pY2EpXHJcbiAgICAgICAgICAgICAgICBpZiAodGggJiYgKHRkLnRkSWYgfHwgdGgudGhHcm91cCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdGhDYXN0ZWQgPSA8RXNUaERpcmVjdGl2ZT50aDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaXNGaXhlZCA9IHRoLnRoRml4ZWQgfHwgdGgudGhHcm91cCB8fCB0aC50aFBpbm5lZDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbVRvQWRkID0gaXRlbS5faXRlbSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZEVsZW1lbnQ+eyBMZWZ0Qm9yZGVyOiAoPGFueT50aENhc3RlZCkuX2xib3JkLCBSaWdodEJvcmRlcjogKDxhbnk+dGhDYXN0ZWQpLl9yYm9yZCwgSUQ6IGtleSwgUGlubmVkOiBjb2x1bW5zQ2FjaGVbdGQudGRdLnBpbm5lZCwgUGlubmVkV2lkdGg6IHRoQ2FzdGVkLnRoUGlubmVkV2lkdGgsIEdyb3VwSGVhZGVyOiBmYWxzZSwgR3JvdXBBZ2dyZWdhdGlvbjogZmFsc2UsIFZpc2libGU6IGNvbHVtbnNDYWNoZVt0ZC50ZF0udmlzaWJsZSwgV3JhcHM6IGZhbHNlLCBDbGFzczogdGQudGRDbGFzcywgVGVtcGxhdGU6IHRoQ2FzdGVkLnRoR3JvdXAgJiYgIXRoaXMuU2hvd0l0ZW1Hcm91cHNDb2x1bW5zID8gbnVsbCA6IHRkLlRlbXBsYXRlLCBNdWx0aTogdGQuX211bHRpLCBNdWx0aVByb3A6IHRkLl9tdWx0aSA/IHRkLnRkLnNwbGl0KCdfJylbMF0gOiBudWxsLCBNdWx0aUluZGV4OiB0ZC5fbXVsdGkgPyB0ZC50ZC5zcGxpdCgnXycpWzFdIDogbnVsbCwgUHJvcGVydHlOYW1lOiB0aC50aFByb3BlcnR5LCBQcm9wZXJ0eVR5cGU6IHRoLnRoVHlwZSwgUHJvcGVydHlTb3VyY2U6IHRoLnRoU291cmNlLCBQcm9wQWNjZXNzb3I6IHRkLnRkUHJvcGVydHlBY2Nlc3NvciB9IDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgPFRkRWxlbWVudD57IExlZnRCb3JkZXI6ICg8YW55PnRoQ2FzdGVkKS5fbGJvcmQsIFJpZ2h0Qm9yZGVyOiAoPGFueT50aENhc3RlZCkuX3Jib3JkLCBJRDoga2V5LCBQaW5uZWQ6IGNvbHVtbnNDYWNoZVt0ZC50ZF0ucGlubmVkLCBQaW5uZWRXaWR0aDogdGhDYXN0ZWQudGhQaW5uZWRXaWR0aCwgR3JvdXBIZWFkZXI6IHRoQ2FzdGVkLnRoR3JvdXAsIEdyb3VwQWdncmVnYXRpb246ICEhdGhDYXN0ZWQudGhBZ2dyZWdhdGlvbiwgVmlzaWJsZTogY29sdW1uc0NhY2hlW3RkLnRkXS52aXNpYmxlLCBXcmFwczogZmFsc2UsIENsYXNzOiB0aENhc3RlZC50aEdyb3VwQ2xhc3MgfHwgJycsIENvbnRlbnQ6IHRoaXMucm93R3JvdXBpbmdfSC5nZXRHcm91cENlbGxEaXNwbGF5KDxHcm91cD5pdGVtLCBrZXksIDxFc1RoRGlyZWN0aXZlPnRoKSB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5UTVBSb3dURHNbY3R4XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRNUFJvd1REc1tjdHhdLnB1c2goaXRlbVRvQWRkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUm93Q29udGV4dHMucHVzaChjdHgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRNUFJvd1REc1tjdHhdID0gW2l0ZW1Ub0FkZF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRGaXhlZHNbY3R4XSA9IGlzRml4ZWQgPyAxIDogMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNlIG5vbiBobyBvZ2dldHRpIMOoIGludXRpbGUgY2hlIGNvbnRyb2xsbyBnbGkgZXJyb3JpLCBkYXRvIGNoZSBnbGkgZXMtdGQgbm9uIGVzaXN0ZXJhbm5vIGRpIGNlcnRvIGUgZGkgY29uc2VndWVuemEgZ2xpIGVzLXRoIG5vbiBzYXJhbm5vIHJlZmVyZW56aWF0aVxyXG4gICAgICAgIGlmICh0aGlzLlRNUEJvdW5kU291cmNlLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHZhciBlcnJzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0aCA9IHRoc1tpXTtcclxuICAgICAgICAgICAgaWYgKCF0aC5fcmVmZXJlbmNlZClcclxuICAgICAgICAgICAgICAgIGVycnMucHVzaCh0aC50aCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXJycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBlcnJJZHMgPSBlcnJzLmpvaW4oJywgJyk7XHJcbiAgICAgICAgICAgIHRocm93IFwiTCdJRCBkaSB1bm8gbyBwacO5IEVzVGggbm9uIGhhbm5vIGFsY3VuIEVzVGQgYXNzb2NpYXRvOiBcIiArIGVycklkcztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJ0ZW5kbyBkYWdsaSAqKkVzVGhzKiogYmluZGF0aSBnZW5lcmEsIGFsbCdpbnRlcm5vIGRlbCBkaXppb25hcmlvICoqVE1QUm93VEhzKiogdHV0dGkgaSBjb250ZXN0aSBkZWkgdmFyaSBvZ2dldHRpLlxyXG4gICAgICpcclxuICAgICAqIFZlbmdvbm8gZXNjbHVzaSBpIFRIIFwiSW50ZXJuaVwiIGluIHF1YW50byB2ZW5nb25vIGdlbmVyYXRpIGRhZ2xpIG9yaWdpbmFsaSBxdWluZGkgaW5jbHVkZXJsaSB2b3JyZWJiZSBkaXJlIHJpZWZmZXR0dWFyZSBsZSBvcGVyYXppb25pIGR1ZSB2b2x0ZVxyXG4gICAgICpcclxuICAgICAqIENvc3RvOiAxIHNjYW4gRXNUaHMgKyAxIHNjYW4gQ29sdW1uc0xpc3RcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VzVGhEaXJlY3RpdmVbXX0gdGhzIENvbG9ubmUgZGVsbGEgdGFiZWxsYVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlUm93VGhzKHRoczogRXNUaERpcmVjdGl2ZVtdKSB7XHJcbiAgICAgICAgaWYgKHRocy5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgY29sdW1uc0xpc3RDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IEVzVGFibGVDb2x1bW4gfSA9IHt9O1xyXG4gICAgICAgIGxldCBjYXN0ZWRWaWV3ID0gPEFwcFNlYXJjaDxhbnk+PnRoaXMuVmlldztcclxuICAgICAgICBsZXQgZ3JvdXBpbmdzVW5kZWZpbmVkID0gdGhpcy52aWV3TW9kZSAmJiAoY2FzdGVkVmlldyAmJiAhY2FzdGVkVmlldy5ncm91cGluZ3MgfHwgY2FzdGVkVmlldy5ncm91cGluZ3MubGVuZ3RoID09IDApO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuQ29sdW1uc0xpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGl0bSA9IHRoaXMuQ29sdW1uc0xpc3RbaV07XHJcbiAgICAgICAgICAgIGNvbHVtbnNMaXN0Q2FjaGVbaXRtLmlkXSA9IGl0bVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5UTVBSb3dUSHMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdGggPSB0aHNbaV07XHJcbiAgICAgICAgICAgIGxldCB0b0FkZDogVGhFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoLnRoSWYgfHwgdGgudGhHcm91cCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCB0aENsYXNzID0gKHRoLnRoQ2xhc3MgfHwgJycpICsgKHRoLnRoR3JvdXAgPyBcIiBlc3QtY29sLW1pblwiIDogXCJcIik7XHJcbiAgICAgICAgICAgICAgICB0b0FkZCA9IHsgUGlubmVkOiBjb2x1bW5zTGlzdENhY2hlW3RoLnRoXS5waW5uZWQsIEZpeGVkOiB0aC50aEZpeGVkLCBQaW5uZWRXaWR0aDogdGgudGhQaW5uZWRXaWR0aCwgSUQ6IHRoLnRoLCBWaXNpYmxlOiB0aC50aFZpc2libGUsIENsYXNzOiB0aENsYXNzLCBPcmRlcjogdGgudGhPcmRlciwgT3JkZXJhYmxlOiB0aC50aE9yZGVyYWJsZSwgVGVtcGxhdGU6IHRoLlRlbXBsYXRlLCBDb250ZW50OiB0aC50aFN0YXRpY0NvbnRlbnQsIFdyYXA6IHRoLnRoV3JhcCwgTGVmdEJvcmRlcjogKDxhbnk+dGgpLl9sYm9yZCwgUmlnaHRCb3JkZXI6ICg8YW55PnRoKS5fcmJvcmQsIE11bHRpOiB0aC5fbXVsdGksIE11bHRpQ29udGVudDogdGguX211bHRpX2NvbnRlbnQgfTtcclxuICAgICAgICAgICAgICAgIHRoaXMuVE1QUm93VEhzLnB1c2godG9BZGQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFNlIGhvIHVuIG1vZGVsbG8gY2hlIGRldmUgZnVuemlvbmFyZSBhIHJvd2dyb3VwaW5nIG1hIG5vbiDDqCBhbmNvcmEgc3RhdGEgZWZmZXR0dWF0YSBuZXNzdW5hIHJpY2VyY2Egc3VpIGdydXBwaSBwcmluY2lwYWxpIChncm91cGluZ3NVbmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICAvLyBsaSBnZW5lcm8gZSBtYW5kbyBsYSBwcmltYSByaWNlcmNhIGNoZSBkZXYnZXNzZXJlIHNwZWRpdGEgYWwgYmFja2VuZCBwZXIgaWwgcHJpbW8gY2FyaWNhbWVudG8gZGVpIGdydXBwaVxyXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwaW5nc1VuZGVmaW5lZCAmJiAodGgudGhBZ2dyZWdhdGlvbiB8fCB0aC50aEdyb3VwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBncm91cEFnZ3JlZ2F0aW9uczogR3JvdXBPckFnZ3JlZ2F0aW9uW10gPSB0aGlzLnJvd0dyb3VwaW5nX0guZ2V0R3JvdXBBZ2dyZWdhdGlvbnModGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2FzdGVkVmlldy5ncm91cGluZ3MpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RlZFZpZXcuZ3JvdXBpbmdzID0gZ3JvdXBBZ2dyZWdhdGlvbnM7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXN0ZWRWaWV3Lmdyb3VwaW5ncy5wdXNoKC4uLmdyb3VwQWdncmVnYXRpb25zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5SZXNlYXJjaE5lZWRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcG9zdGEgbGEgcmljZXJjYSBkaSB1bmEgcGFnaW5hIGluIGF2YW50aSAobyBpbmRpZXRybylcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBOdW1lcm8gZGkgcGFnaW5lIGRhIGFnZ2l1bmdlcmUgKG8gc290dHJhcnJlLCBzZSBuZWdhdGl2bykgYWxsYSBwYWdpbmEgYXR0dWFsZVxyXG4gICAgICogQHBhcmFtIHthbnl9IHBhZ2VyIEVsZW1lbnRvIGRpIHNlcGFyYXppb25lIHN1IGN1aSDDqCBlZmZldHR1YXRhIGxhIHJpY2VyY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFRvUGFnZUdyb3VwKHBhZ2U6IG51bWJlciwgcGFnZXI6IEdyb3VwUGFnZXIpIHtcclxuICAgICAgICB0aGlzLmdvVG9QYWdlR3JvdXAocGFnZXIudmlldy5wYWdlICsgcGFnZSwgcGFnZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Bvc3RhIGxhIHJpY2VyY2EgYWxsYSBwYWdpbmEgc3BlY2lmaWNhdGFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBQYWdpbmEgYSBjdWkgbmF2aWdhcmVcclxuICAgICAqIEBwYXJhbSB7YW55fSBwYWdlciBFbGVtZW50byBkaSBzZXBhcmF6aW9uZSBzdSBjdWkgw6ggZWZmZXR0dWF0YSBsYSByaWNlcmNhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnb1RvUGFnZUdyb3VwKHBhZ2U6IG51bWJlciwgcGFnZXI6IEdyb3VwUGFnZXIpIHtcclxuXHJcbiAgICAgICAgbGV0IGFwcFNlYXJjaEVsZW1lbnQgPSBwYWdlci52aWV3O1xyXG4gICAgICAgIGlmIChwYWdlID09PSAwIHx8IChwYWdlID4gYXBwU2VhcmNoRWxlbWVudC5wYWdlcyAmJiBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzID4gMCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgYXBwU2VhcmNoRWxlbWVudC5wYWdlID0gcGFnZTtcclxuICAgICAgICBwYWdlci5idXR0b25zID0gdGhpcy51dGlsaXRpZXNfSC5nZXRQYWdlc0FycmF5KDYsIGFwcFNlYXJjaEVsZW1lbnQucGFnZSwgYXBwU2VhcmNoRWxlbWVudC5wYWdlcyk7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QoZmFsc2UsIGFwcFNlYXJjaEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBUT0RPIFNwb3N0YXJlIGluIFNlbGVjdGlvbkhhbmRsZXJcclxuICAgICAqIFxyXG4gICAgICogR2VzdGlzY2UgaSBjbGljayBzdWxsYSB0YWJlbGxhIHNvbG8gcGVyIGxlIHJpZ2hlIGEgZ3J1cHBvLiBcclxuICAgICAqIE8gcmltdW92ZSBnbGkgZWxlbWVudGkgYXR0dWFsbWVudGUgcHJlc2VudGkgbyBjYXJpY2EgaWwgY29udGVudXRvIGRlbCBncnVwcG9cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gZ3JvdXAgR3J1cHBvIGJpbmRhdG8gc3UgY3VpIHNpIMOoIGVmZmV0dHVhdG8gaWwgY2xpY2tcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbCdvcGVyYWl6b25lIMOoIGFuZGF0YSBhIGJ1b24gZmluZSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhbmRsZUdyb3VwQ2xpY2soZ3JvdXA6IEdyb3VwKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGNhc3RlZCA9IHRoaXMuVmlldyBhcyBBcHBTZWFyY2g8YW55PjtcclxuICAgICAgICBsZXQgYW55RyA9ICg8YW55Pmdyb3VwKTtcclxuICAgICAgICBhbnlHLl9leHBhbmRlZCA9ICFhbnlHLl9leHBhbmRlZDtcclxuXHJcbiAgICAgICAgLy8gU29ubyBpbiBtb2RhbGl0w6AgcmFnZ3J1cHBhbWVudG8gdmlydHVhbGUgZGEgYXJyYXk6IEVzcGFuZGVyZSBzaWduaWZpY2EgcmVuZGVyZSB2aXNpYmlsaSB0dXR0aSBnbGkgb2dnZXR0aSByZWxhdGl2aSBhIHF1ZXN0byBncnVwcG8sIHZpY2V2ZXJzYSBpbCBjb250cmFycmVcclxuICAgICAgICBpZiAodGhpcy5BcnJheUdyb3VwaW5nKSB7XHJcbiAgICAgICAgICAgIGxldCBhbGxSZWxhdGl2ZXMgPSB0aGlzLmJvdW5kU291cmNlLmZpbHRlcih0ID0+XHJcbiAgICAgICAgICAgICAgICAodC5fZ3JvdXAgJiYgKChhbnlHLl9leHBhbmRlZCAmJiB0Ll9wYXJlbnQgPT0gYW55Ry5fdGhpc0tleSkgfHwgKCFhbnlHLl9leHBhbmRlZCAmJiB0Ll9wYXJlbnQgJiYgdC5fcGFyZW50LnN0YXJ0c1dpdGgoYW55Ry5fdGhpc0tleSkpKSkgfHxcclxuICAgICAgICAgICAgICAgICh0Ll9pdGVtICYmICgoYW55Ry5fZXhwYW5kZWQgJiYgdC5fdGhpc0tleSA9PSBhbnlHLl90aGlzS2V5KSB8fCAoIWFueUcuX2V4cGFuZGVkICYmIHQuX3RoaXNLZXkuc3RhcnRzV2l0aChhbnlHLl90aGlzS2V5KSkpKSlcclxuICAgICAgICAgICAgYWxsUmVsYXRpdmVzLmZvckVhY2godCA9PiB7IHQuX3Zpc2libGUgPSBhbnlHLl9leHBhbmRlZDsgaWYgKHQuX2dyb3VwKSB0Ll9leHBhbmRlZCA9IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYW55Ry5fZXhwYW5kZWQpIHtcclxuICAgICAgICAgICAgLy8gUmVzZXR0byBpcHBcclxuICAgICAgICAgICAgY2FzdGVkLml0ZW1zcGVycGFnZW92ZXJyaWRlID0gMTU7XHJcbiAgICAgICAgICAgIGlmICghY2FzdGVkLnJlcXVlc3RlZGdyb3VwcylcclxuICAgICAgICAgICAgICAgIGNhc3RlZC5yZXF1ZXN0ZWRncm91cHMgPSBbbmV3IEdyb3VwRmlsdGVyKGdyb3VwLmNvbHVtbiwgZ3JvdXAudmFsdWUpXTtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbGV2ZWwgPSBhbnlHLl9ncm91cGxldmVsO1xyXG4gICAgICAgICAgICAgICAgLy8gc2UgaWwgZ3J1cHBvIGNsaWNjYXRvIG5vbiBoYSB1biBsaXZlbGxvIMOoIGlsIHByaW1vIGdydXBwbywgcXVpbmRpIG9yZGluYW1lbnRvIHVuaWNvXHJcbiAgICAgICAgICAgICAgICAvLyBhbHRyaW1lbnRpIGRldm8gcmltdW92ZXJlIHR1dHRpIGkgZmlsdHJpIHN1IGxpdmVsbGkgc3VwZXJpb3JpIGFsIGxldmVsIGNsaWNjYXRvIGUgYWdnaXVuZ2VyZSBpbCBsZXZlbCBjbGljY2F0b1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsZXZlbClcclxuICAgICAgICAgICAgICAgICAgICBjYXN0ZWQucmVxdWVzdGVkZ3JvdXBzID0gW25ldyBHcm91cEZpbHRlcihncm91cC5jb2x1bW4sIGdyb3VwLnZhbHVlKV07XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXN0ZWQucmVxdWVzdGVkZ3JvdXBzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgYW55Ry5fcGFyZW50Um91dGUuZm9yRWFjaCgoc3RlcDogR3JvdXBSb3V0ZUZyYWdtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RlZC5yZXF1ZXN0ZWRncm91cHMucHVzaChuZXcgR3JvdXBGaWx0ZXIoc3RlcC5jb2x1bW4sIHN0ZXAudmFsdWUpKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBjYXN0ZWQucmVxdWVzdGVkZ3JvdXBzLnB1c2gobmV3IEdyb3VwRmlsdGVyKGdyb3VwLmNvbHVtbiwgZ3JvdXAudmFsdWUpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcGF0aCA9IChhbnlHLl9wYXJlbnQgfHwgJycpICsgZ3JvdXAudmFsdWU7XHJcblxyXG4gICAgICAgICAgICAvLyBTZSBobyBjaGl1c28gdW4gZ3J1cHBvIG5vbiBtaSBzZXJ2ZSByaWVmZmV0dHVhcmUgcmljZXJjZSwgbWkgYmFzdGEgZWxpbWluYXJlIGRhZ2xpIG9nZ2V0dGkgYmluZGF0aSB0dXR0aSBnbGkgZWxlbWVudGkgc290dG9zdGFudGkgYSBxdWVsIGdydXBwb1xyXG4gICAgICAgICAgICB0aGlzLmJvdW5kU291cmNlID0gdGhpcy5ib3VuZFNvdXJjZS5maWx0ZXIodCA9PiAhdC5fcGFyZW50IHx8ICF0Ll9wYXJlbnQuc3RhcnRzV2l0aChwYXRoKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBkZXZvIHBlcsOyIGFuY2hlIHJpbXVvdmVyZSBldmVudHVhbGkgY2FjaGUgcmVsYXRpdmVcclxuICAgICAgICAgICAgdGhpcy5ncm91cFNlYXJjaFJlcXVlc3RzQ2FjaGUgPSB0aGlzLmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZS5maWx0ZXIodCA9PiB0LnBhdGggIT0gcGF0aCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXN0aXNjZSBsYSBzZWxlemlvbmUgZ2xvYmFsZSBkZWdsaSBvZ2dldHRpLCBzaWEgcGVyIHBhZ2luYSBjaGUgYSBsaXZlbGxvIGRpICoqU2VsZWN0QWxsKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlZFZhbCBWYWxvcmUgZm9yemF0byBkaSBjaGVjayBkYSBhc3NlZ25hcmUgYWdsaSBvZ2dldHRpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnbG9iYWxDaGVja0NoYW5nZWQoZm9yY2VkVmFsOiBib29sZWFuID0gbnVsbCkge1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzKCk7XHJcblxyXG4gICAgICAgIC8vIFByZW5kbyB0dXR0aSBnbGkgZWxlbWVudGkgcHJlc2VudGkgaW4gcXVlc3RhIHZpc3RhLiBTZSBobyBncnVwcGkgcHJlbmRvIHNvbG8gaSBncnVwcGkgYSBsaXZlbGxvIDAsIGFsdHJpbWVudGkgcHJlbmRvIHR1dHRpIGdsaSBvZ2dldHRpIHBlciBzZWxlemlvbmFybGlcclxuICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLmJvdW5kU291cmNlLmZpbmQodCA9PiB0Ll9ncm91cCkgPyB0aGlzLmJvdW5kU291cmNlLmZpbHRlcih0ID0+IHQuX2dyb3VwICYmICF0Ll9wYXJlbnQpIDogdGhpcy5ib3VuZFNvdXJjZTtcclxuICAgICAgICB2YXIgaXRlbVNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uX0guaGFuZGxlSXRlbXNTZWxlY3Rpb24oaXRlbXMsIGZvcmNlZFZhbCwgdGhpcy5nbG9iYWxDaGVjayk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoaXRlbVNlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAVE9ETyBTcG9zdGFyZSBpbiBTZWxlY3Rpb25IYW5kbGVyXHJcbiAgICAgKiBcclxuICAgICAqIEdlc3Rpc2NlIGkgY2xpY2sgc3VsbGEgdGFiZWxsYSwgZ2VzdGVuZG8gZXZlbnR1YWxtZW50ZSBhbmNoZSBnbGkgU2hpZnQgKyBDbGljayBwZXIgc2VsZXppb25hcmUgdW4gcmFuZ2UgZGkgb2dnZXR0aVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55fSBldmVudCBFdmVudG8gbmF0aXZvIEhUTUwgZGVsIGNsaWNrXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIGJpbmRhdG8gc3UgY3VpIHNpIMOoIGVmZmV0dHVhdG8gaWwgY2xpY2tcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbCdvcGVyYWl6b25lIMOoIGFuZGF0YSBhIGJ1b24gZmluZSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhbmRsZUNsaWNrKGV2ZW50OiBhbnksIGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJUZXh0U2VsZWN0aW9uKGV2ZW50KTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzKCk7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RlZGl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSAmJiB0aGlzLlNoaWZ0Q2xpY2sgJiYgIXRoaXMuU2luZ2xlU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGxldCBzdGFydFNlbGVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5ib3VuZFNvdXJjZS5maWx0ZXIodCA9PiAhdC5fZ3JvdXAgJiYgIXQuX3NlcCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCB0ID0gaXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRTZWxlY3RpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0Ll9zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRpdGVtcy5wdXNoKHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCh0ID09IGl0ZW0gfHwgdCA9PSB0aGlzLmxhc3RTZWxlY3RlZCkgJiYgIXN0YXJ0U2VsZWN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRTZWxlY3RpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHQuX3NlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZGl0ZW1zLnB1c2godCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0ID09IGl0ZW0gfHwgdCA9PSB0aGlzLmxhc3RTZWxlY3RlZCkgJiYgc3RhcnRTZWxlY3RpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRTZWxlY3RpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGl0ZW0uX3NlbGVjdGVkID0gIWl0ZW0uX3NlbGVjdGVkO1xyXG4gICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZCA9IGl0ZW07XHJcbiAgICAgICAgICAgIHNlbGVjdGVkaXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBpdGVtU2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25fSC5oYW5kbGVJdGVtc1NlbGVjdGlvbihzZWxlY3RlZGl0ZW1zKTtcclxuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQuZW1pdChpdGVtU2VsZWN0aW9uKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcG9zdGEgbGEgcmljZXJjYSBkaSB1bmEgcGFnaW5hIGluIGF2YW50aSAobyBpbmRlaXRybylcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBOdW1lcm8gZGkgcGFnaW5lIGRhIGFnZ2l1bmdlcmUgKG8gc290dHJhcnJlLCBzZSBuZWdhdGl2bykgYWxsYSBwYWdpbmEgYXR0dWFsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIGxldCB2aWV3ID0gdGhpcy5NYWluR3JvdXBWaWV3ID8gdGhpcy5NYWluR3JvdXBWaWV3IDogdGhpcy5WaWV3O1xyXG5cclxuICAgICAgICB0aGlzLmdvVG9QYWdlKCgodGhpcy5TZWFyY2hWaWV3IHx8IHZpZXcpPy5wYWdlIHx8IDApICsgcGFnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcG9zdGEgbGEgcmljZXJjYSBhbGxhIHBhZ2luYSBzcGVjaWZpY2F0YVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlIFBhZ2luYSBhIGN1aSBuYXZpZ2FyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ29Ub1BhZ2UocGFnZTogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHZpZXcgPSB0aGlzLk1haW5Hcm91cFZpZXcgPyB0aGlzLk1haW5Hcm91cFZpZXcgOiAodGhpcy5hcnJheU1vZGUgPyB0aGlzLlNlYXJjaFZpZXcgOiB0aGlzLlZpZXcpO1xyXG4gICAgICAgIGlmICghdmlldy5wYWdlIHx8ICF2aWV3LnBhZ2VzKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBhcHBTZWFyY2hFbGVtZW50ID0gdGhpcy5TZWFyY2hWaWV3IHx8IHZpZXc7XHJcbiAgICAgICAgaWYgKHBhZ2UgPT09IDAgfHwgKHBhZ2UgPiBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzICYmIGFwcFNlYXJjaEVsZW1lbnQucGFnZXMgPiAwKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBhcHBTZWFyY2hFbGVtZW50LnBhZ2UgPSBwYWdlO1xyXG4gICAgICAgIGxldCBjb3VudCA9ICh2aWV3Lml0ZW1zLmxlbmd0aCB8fCB2aWV3Lmdyb3Vwcz8ubGVuZ3RoIHx8IDApO1xyXG4gICAgICAgIGxldCBpcHAgPSB2aWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlIHx8IDE1O1xyXG4gICAgICAgIHRoaXMuYXJyYXlQdWxzYW50aSA9IHRoaXMudXRpbGl0aWVzX0guZ2V0UGFnZXNBcnJheSg2LCBhcHBTZWFyY2hFbGVtZW50LnBhZ2UsIGFwcFNlYXJjaEVsZW1lbnQucGFnZXMsIGNvdW50LCBpcHApO1xyXG5cclxuICAgICAgICBsZXQgaGFzR3JvdXBpbmdzID0gISF0aGlzLk1haW5Hcm91cFZpZXc7XHJcbiAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdChmYWxzZSwgaGFzR3JvdXBpbmdzID8gdmlldyA6IHRoaXMuU2VhcmNoVmlldyA/IHRoaXMuU2VhcmNoVmlldyA6IG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnRvIHJpY2hpYW1hdG8gc3VsIGNhbWJpbyBkZWxsYSBwYWdpbmF6aW9uZS4gVmVycsOgIHJpY2hpYW1hdG8gbCdldmVudG8gKiplbWl0U2VhcmNoUmVxdWVzdCoqXHJcbiAgICAgKiBwZXIgY29tdW5pY2FyZSBhbCBjb21wb25lbnRlIGNoZSB1dGlsaXp6YSBxdWVzdGEgdGFiZWxsYSBjaGUgaSBkYXRpIHNvbm8gZGEgYWdnaW9ybmFyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25JdGVtc1BlclBhZ2VDaGFuZ2VkKG5ld0lwcCkge1xyXG4gICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlZpZXcuaXRlbXNwZXJwYWdlb3ZlcnJpZGUgPSBuZXdJcHA7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuTWFpbkdyb3VwVmlldylcclxuICAgICAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlLCB0aGlzLk1haW5Hcm91cFZpZXcpO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuU2VhcmNoVmlldykge1xyXG4gICAgICAgICAgICAvLyBRdWVzdG8gc2Vjb25kbyBtZSBzaSBwdcOyIHBvcnRhcmUgYSBsaXZlbGxvIHVuIHBvJyBwacO5IGFsdG9cclxuICAgICAgICAgICAgdGhpcy5TZWFyY2hWaWV3LnBhZ2UgPSAxO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KHRydWUsIHRoaXMuU2VhcmNoVmlldyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gc3VsIGNhbWJpbyBkZWxsYSBwYWdpbmF6aW9uZS4gVmVycsOgIHJpY2hpYW1hdG8gbCdldmVudG8gKiplbWl0U2VhcmNoUmVxdWVzdCoqIGNvbiBsYSB2aXN0YSBkZWwgc2VwYXJhdG9yZSAqL1xyXG4gICAgcHVibGljIG9uR3JvdXBJdGVtc1BlclBhZ2VDaGFuZ2VkKHBhZ2VyOiBHcm91cFBhZ2VyLCBuZXdJcHA6IG51bWJlcikge1xyXG4gICAgICAgIHBhZ2VyLnZpZXcuaXRlbXNwZXJwYWdlb3ZlcnJpZGUgPSBuZXdJcHA7XHJcbiAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlLCBwYWdlci52aWV3KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqIE1ldG9kbyBjaGUgZ2VzdGlzY2UgbGEgbW9kaWZpY2EgZGVsIHRlbXBvIHNwZWNpZmljYXRvIHBlciBsJ2FnZ2lvcm5hbWVudG8gYXV0b21hdGljbyAqL1xyXG4gICAgcHVibGljIGF1dG9VcGRhdGVDaGFuZ2VkKCkge1xyXG4gICAgICAgIGlmICghL15bMS05XVxcZCokLy50ZXN0KHRoaXMuc2Vjb25kcykpXHJcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kcyA9ICcxMCc7XHJcblxyXG4gICAgICAgIGxldCBzZWNvbmRzSW5NcyA9IHBhcnNlSW50KHRoaXMuc2Vjb25kcywgbnVsbCkgKiAxMDAwO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hdXRvVXBkYXRlKVxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4geyB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KGZhbHNlKTsgfSwgc2Vjb25kc0luTXMpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnVwZGF0ZVRpbWVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBjaGlhbWF0byBkYWwgY2xpY2sgc3UgdW5hIGRlbGxlIGNvbG9ubmUgZ2VuZXJhdGUgZGFsbCdJbnB1dCAqKkR5bmFtaWNPcGVyYXRpb25zKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBMJ29nZ2V0dG8gc3UgY3VpIHZhIGVmZmV0dHVhdGEgbCdvcGVyYXppb25lXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3BpZCBDb2RpY2UgaWRlbnRpZmljYXRpdm8gZGVsbCdvcGVyYXppb25lIGRhIGVmZmV0dHVhcnNpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkeW5hbWljT3BlcmF0aW9uKGl0ZW06IGFueSwgb3BpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5vbkR5bmFtaWNPcGVyYXRpb24uZW1pdCh7IGlkOiBvcGlkLCBpdGVtOiBpdGVtIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpbCBjb250ZW51dG8gZGVsbCdFc1RkIGRhIHV0aWxpenphcmUgcGVyIGxhIGNvbG9ubmEgc3BlY2lmaWNhdGFcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtbiBDb2xvbm5hIHBlciBjdWkgY2VyY2FyZSBsYSBjZWxsYVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTm9tZSBkaXJldHRvIHBlciBjZXJjYXJlIGlsIFREIGNvbiBsJ0lELiBRdWVzdGEgdmFyaWFiaWxlIGhhIHByaW9yaXTDoCByaXNwZXR0byBhICoqY29sdW1uKipcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge1RlbXBsYXRlUmVmPGFueT59IFRlbXBsYXRlIGRhIHVzYXJlIHBlciBsYSBjb2xvbm5hXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaW5kRXNUZChjb2x1bW46IHN0cmluZywgbmFtZTogc3RyaW5nID0gbnVsbCk6IFRlbXBsYXRlUmVmPGFueT4ge1xyXG4gICAgICAgIHZhciBFc1RkID0gdGhpcy5Fc1Rkc0RpcmVjdGl2ZS5maW5kKChpdGVtKSA9PiBuYW1lID8gaXRlbS50ZCA9PT0gbmFtZSA6IGl0ZW0udGRGb3JQcm9wZXJ0eSA9PT0gY29sdW1uKTtcclxuICAgICAgICAvLyBOYW1lIG5vbiB0cm92YXRvLCBmYWxsYmFjayBhbCBub21lIGRlbGxhIGNvbG9ubmFcclxuICAgICAgICBpZiAobmFtZSAmJiBjb2x1bW4gJiYgIUVzVGQpXHJcbiAgICAgICAgICAgIEVzVGQgPSB0aGlzLkVzVGRzRGlyZWN0aXZlLmZpbmQoKGl0ZW0pID0+IGl0ZW0udGRGb3JQcm9wZXJ0eSA9PT0gY29sdW1uKTtcclxuICAgICAgICByZXR1cm4gRXNUZCA/IEVzVGQuVGVtcGxhdGUgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpbCBjb250ZW51dG8gZGVsbCdlZGl0b3IgRXNUZCBkYSB1dGlsaXp6YXJlIHBlciBsYSBjb2xvbm5hIHNwZWNpZmljYXRhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW4gQ29sb25uYSBwZXIgY3VpIGNlcmNhcmUgbCdlZGl0b3JcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5vbWUgZGlyZXR0byBwZXIgY2VyY2FyZSBsJ0VkaXRvciBjb24gbCdJRC4gUXVlc3RhIHZhcmlhYmlsZSBoYSBwcmlvcml0w6AgcmlzcGV0dG8gYSAqKmNvbHVtbioqXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtUZW1wbGF0ZVJlZjxhbnk+fSBUZW1wbGF0ZSBkYSB1c2FyZSBwZXIgbGEgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmluZEVkaXRvcihjb2x1bW46IHN0cmluZywgbmFtZTogc3RyaW5nID0gbnVsbCk6IFRlbXBsYXRlUmVmPGFueT4ge1xyXG4gICAgICAgIHZhciBFZGl0b3IgPSB0aGlzLkVzVGRFZGl0b3JEaXJlY3RpdmVzLmZpbmQoKGl0ZW0pID0+IG5hbWUgPyBpdGVtLmVkaXRvciA9PT0gbmFtZSA6IGl0ZW0uZWRpdG9yRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgLy8gTmFtZSBub24gdHJvdmF0bywgZmFsbGJhY2sgYWwgbm9tZSBkZWxsYSBjb2xvbm5hXHJcbiAgICAgICAgaWYgKG5hbWUgJiYgY29sdW1uICYmICFFZGl0b3IpXHJcbiAgICAgICAgICAgIEVkaXRvciA9IHRoaXMuRXNUZEVkaXRvckRpcmVjdGl2ZXMuZmluZCgoaXRlbSkgPT4gaXRlbS5lZGl0b3JGb3JQcm9wZXJ0eSA9PT0gY29sdW1uKTtcclxuICAgICAgICByZXR1cm4gRWRpdG9yID8gRWRpdG9yLlRlbXBsYXRlIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVxdWl2YWxlbnRlIGRlbCBtZXRvZG8gKiphZGRUb1BhZ2UqKiByaWFkYXR0YXRvIHBlciBsYSBtb2RhbGl0w6AgYXJyYXlcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBOdW1lcm8gZGkgcGFnaW5lIGRhIGFnZ2l1bmdlcmUgKG8gc290dHJhcnJlLCBzZSBuZWdhdGl2bykgYWxsYSBwYWdpbmEgYXR0dWFsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXJyYXlBZGRUb1BhZ2UocGFnZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5hcnJheUdvVG9QYWdlKHRoaXMuYXJyYXltb2RlUGFnZSArIHBhZ2UpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFcXVpdmFsZW50ZSBkZWwgbWV0b2RvICoqZ29Ub1BhZ2UqKiByaWFkYXR0YXRvIHBlciBsYSBtb2RhbGl0w6AgYXJyYXlcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBQYWdpbmEgYSBjdWkgbmF2aWdhcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFycmF5R29Ub1BhZ2UocGFnZTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHBhZ2UgPT09IDAgfHwgcGFnZSA+IHRoaXMuYXJyYXltb2RlUGFnZXMpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB0aGlzLmFycmF5bW9kZVBhZ2UgPSBwYWdlO1xyXG5cclxuICAgICAgICAvLyBSaWZvcnpvIGlsIHdyaXRldmFsdWUgaW4gbW9kbyBjaGUgaWwgY29kaWNlIHBhc3NpIGRhbGxhIGdlc3Rpb25lIGNvbWUgc2UgZm9zc2UgZmF0dGEgcmlwYXJ0aXJlIHVuYSByaWNlcmNhXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFdyaXRlVmFsdWUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlc3Rpb25lIGRlaSBjbGljayBzdWxsZSBvcHppb25pIGRlbCBtZW7DuSBjb250ZXN0dWFsZSBpbiBhbHRvIGEgZGVzdHJhIGdlbmVyYXRvIGRhbGwnSW5wdXQgKipDb3JuZXJNZW51T3B0aW9ucyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvcm5lcmlkIENvZGljZSBkZWxsJ29wZXJhemlvbmUgc2VsZXppb25hdGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvcm5lckFjdGlvbkNsaWNrZWQoY29ybmVyaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMub25Db3JuZXJBY3Rpb24uZW1pdCh7IGlkOiBjb3JuZXJpZCwgZXN0YWJsZTogdGhpcyB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBJbXBvc3RhemlvbmUgbW9kYWxpdMOgIGRlbGwnRXNUYWJsZSBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHsnYXJyYXknIHwgJ3ZpZXcnIHwgJ3JlcG9ydCd9IG1vZGUgTW9kYWxpdMOgIGRhIGltcG9zdGFyZVxyXG4gICAgICoqL1xyXG4gICAgcHJpdmF0ZSBzZXRNb2RlKG1vZGU6ICdhcnJheScgfCAndmlldycpIHtcclxuICAgICAgICB0aGlzLnZpZXdNb2RlID0gbW9kZSA9PSAndmlldyc7XHJcbiAgICAgICAgdGhpcy5hcnJheU1vZGUgPSBtb2RlID09ICdhcnJheSc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgcGVyIGVmZmV0dHVhcmUgY2hpYW1hdGUgaW50ZXJuZSBkaSBhbGxpbmVhbWVudG8gYWxsYSBmdW56aW9uZSAqKndyaXRlVmFsdWUqKiwgXHJcbiAgICAgKiBpbXBvc3RhbmRvIHByaW1hICoqaW50ZXJuYWxXcml0ZUNhbGwqKiBpbiBtb2RvIGRhIG5vbiBlZmZldHR1YXJlIG9wZXJhemlvbmkgaW51dGlsaVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW50ZXJuYWxXcml0ZVZhbHVlKCkge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxXcml0ZUNhbGwgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLlZpZXcpO1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxXcml0ZUNhbGwgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogTWV0b2RvIGV2ZW50dWFsbWVudGUgcmljaGlhbWFiaWxlIGFuY2hlIGRhbCBjb21wb25lbnRlIGVzdGVybm8gY2hlIHBlcm1ldHRlIGRpIGZvcnphcmUgdW4gcmVmcmVzaCBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBwdWJsaWMgZm9yY2VSZWZyZXNoKCkge1xyXG5cclxuICAgICAgICAvLyBTZSBzb25vIGluIG1vZGFsaXTDoCBWaWV3IHZpZW5lIG1hbnRlbnV0byBpbiBhdXRvbWF0aWNvIGlsIG51bWVybyBkaSBwYWdpbmEsIG1hIHBlciBsYSBtb2RhbGl0w6AgYXJyYXkgZGV2byBwcmVuZGVyZSBsZSBpbmZvIGRpIHBhZ2luYXppb25lIHByaW1hIGUgcmlhcHBsaWNhcmxlIGRvcG9cclxuICAgICAgICBsZXQgYXJyYXlQYWdlOiBudW1iZXI7XHJcbiAgICAgICAgbGV0IGFycmF5SXBwOiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuYXJyYXlNb2RlKSB7XHJcbiAgICAgICAgICAgIGFycmF5UGFnZSA9IHRoaXMuYXJyYXltb2RlUGFnZTtcclxuICAgICAgICAgICAgYXJyYXlJcHAgPSB0aGlzLkFycmF5bW9kZUl0ZW1zUGVyUGFnZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLlZpZXcpO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXJyYXlNb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQXJyYXltb2RlSXRlbXNQZXJQYWdlID0gYXJyYXlJcHA7XHJcbiAgICAgICAgICAgIHRoaXMuYXJyYXlHb1RvUGFnZShhcnJheVBhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bnppb25lIGNoZSBpbiBiYXNlIGFpIGNsaWNrIHN1IHVuYSBjZWxsYSBjYXBpc2NlIHNlIHN0byBlZmZldHR1YW5kbyB1bidvcGVyYXppb25lIGRpIHNlbGV6aW9uZSBvIHNlIHN0byBlbnRyYW5kbyBuZWxsJ2VkaXQgZGkgdW5hIGNlbGxhIGNvbiB1biBkb3BwaW8gY2xpY2tcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9ICRldmVudCBFdmVudG8gbmF0aXZvIGphdmFzY3JpcHRcclxuICAgICAqIEBwYXJhbSB7VGRFbGVtZW50fSByb3dJdGVtIFJpZmVyaW1lbnRvIGEgYmluZGVyIGRlbGxhIHJpZ2FcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIEl0ZW0gY2hlIHJhcHByZXNlbnRhIGlsIGNvbnRlc3RvIHN1IGN1aSDDqCBzdGF0byBlZmZldHR1YXRvIHVuIGNsaWNrXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcm93SW5kZXggSW5kaWNlIGRlbGxhIHJpZ2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRiQ2xpY2tFZGl0T3JTaW5nbGVDbGlja1Jvd1NlbGVjdGlvbigkZXZlbnQ6IGFueSwgcm93SXRlbTogVGRFbGVtZW50LCBpdGVtOiBhbnksIHJvd0luZGV4OiBudW1iZXIpIHtcclxuXHJcbiAgICAgICAgLy8gTW9kYWxpdMOgIEVkaXRhYmxlLCBnZXN0aXNjbyBpIGRvcHBpIGNsaWNrIHNlbnphIHBlcsOyIHJhbGxlbnRhcmUgbGEgbW9kYWxpdMOgIGRpIHNlbGV6aW9uZSBhIHJhbmdlXHJcbiAgICAgICAgaWYgKHRoaXMuRWRpdGFibGUpIHtcclxuICAgICAgICAgICAgLy8gU2Vjb25kbyBjbGljazogc2UgaWwgdGltZXIgbm9uIMOoIHNjYWR1dG8gw6ggdW4gZG9wcGlvIGNsaWNrIGVkIGVzZWd1byBpbCByZXN0b1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jZWxsRGJDbGlja1RpbWVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocm93SXRlbS5Qcm9wZXJ0eU5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR1cFVzZXJFZGl0KHJvd0l0ZW0sIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckNlbGxDbGlja1RpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFByaW1vIGNsaWNrOiBub24gZmEgbmllbnRlIGUgc2UgaWwgdGVtcG8gcGVyIGlsIHNlY29uZG8gY2xpY2sgc2NhZGUgcmVzZXR0YSB0dXR0b1xyXG4gICAgICAgICAgICB0aGlzLmNlbGxEYkNsaWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJDZWxsQ2xpY2tUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUm93Q2xpY2soJGV2ZW50LCBpdGVtLCB0aGlzLlNlbGVjdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0sIHRoaXMuZG91YmxlQ2xpY2tCdWZmZXJNcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJbiBtb2RhbGl0w6AgYSByYW5nZSBsYSBjcmVhemlvbmUgZGVsIHJhbmdlIMOoIGdlc3RpdGEgZGFpIG1vdXNlZG93biwgbW92ZSBlZCB1cC4uLlxyXG4gICAgICAgIC8vIExhIHNlbGV6aW9uZSBkZWxsZSByaWdoZSBpbnZlY2Ugw6ggZ2VzdGl0YSBkYWxsZSBjYXNlbGxpbmUgYSBzaW5pc3RyYVxyXG4gICAgICAgIGlmICh0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFNlIGhvIGZhdHRvIGNsaWNrIGNvbCBjb250cm9sIGF0dGFjY2F0byBlc2NvIHN1Yml0byBkYXRvIGNoZSBkZXZlIHNvbG8gcGVybWV0dGVyZSBsYSBuYXZpZ2F6aW9uZSBkZWkgbGlua1xyXG4gICAgICAgIGlmICgkZXZlbnQuY3RybEtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBUdXR0aSBpIGNsaWNrIHN1IHVuYSBjZWxsYSBnacOgIGluIGVkaXQgbm9uIGRldm9ubyBlZmZldHR1YXJlIGxhIHNlbGV6aW9uZSBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCh0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbj8ubGVuZ3RoID4gMCAmJiAoPEVzVGFibGVDb2x1bW5zRGVmaW5pdGlvbj48YW55PnJvd0l0ZW0pLmVkaXRzICYmICg8RXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uPjxhbnk+cm93SXRlbSkuZWRpdHNbaXRlbS5faGFzaF0/Ll9lZGl0aW5nKSB8fFxyXG4gICAgICAgICAgICAoPGFueT5yb3dJdGVtKS5fZWRpdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBQZXIgZXZpdGFyZSBkaSByYWxsZW50YXJlIGEgcHJlc2NpbmRlcmVcclxuICAgICAgICBpZiAoIXRoaXMuRWRpdGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVSb3dDbGljaygkZXZlbnQsIGl0ZW0sIHRoaXMuU2VsZWN0aW9uLCB0cnVlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogRXZlbnRvIGNoZSBnZXN0aXNjZSBpbCBjb21hbmRvIFwiQ29waWFcIiBidXR0YW5kbyBpIHZhbG9yaSBzZWxlemlvbmF0aSBuZWxsYSBjbGlwYm9hcmQgaW4gYmFzZSBhbCBsb3JvIHRpcG8gKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQ29weSgpIHtcclxuICAgICAgICBpZighdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxldCBzZWwgPSB0aGlzLnNlbGVjdGlvbl9ILmdldFNlbGVjdGlvblN0YXR1c1NlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWwubGVuZ3RoID4gMCAmJiBzZWxbMF0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgc2VsZWN0aW9uVGV4dCA9IHRoaXMuc2VsZWN0aW9uX0guZ2V0Q2xpcGJhcmRUZXh0RnJvbVNlbGVjdGlvbihzZWwpO1xyXG4gICAgICAgICAgICB0aGlzLmNsaXBib2FyZFNlcnZpY2UuY29weVRleHRUb0NsaXBib2FyZChzZWxlY3Rpb25UZXh0KTtcclxuICAgICAgICAgICAgdGhpcy5tc2dFeHRzLnNpbXBsZUluZm8odGhpcy5sYy5sb2MoXCJWYWx1ZXMgY29waWVkIGluIHRoZSBjbGlwYm9hcmRcIiksIFwidG9hc3RyXCIsIDEwMDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogRXZlbnRvIGNoZSBnZXN0aXNjZSBpbCBjb21hbmRvIFwiSW5jb2xsYVwiIHByZW5kZW5kbyBpIGRhdGkgZGVsbGEgY2xpcGJvYXJkIGUgYXBwbGljYW5kb2xpIGFsIHJhbmdlIGRpIHNlbGV6aW9uZSBhdHR1YWxlIGluIGJhc2UgYWwgdGlwbyBkZWxsZSBjZWxsZSBzb3R0byAqL1xyXG4gICAgaGFuZGxlUGFzdGUoKSB7XHJcbiAgICAgICAgaWYoIXRoaXMuUmFuZ2VTZWxlY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsZXQgc2VsID0gdGhpcy5zZWxlY3Rpb25fSC5nZXRTZWxlY3Rpb25TdGF0dXNTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsLmxlbmd0aCA+IDAgJiYgc2VsWzBdLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRTZXJ2aWNlLmdldENsaXBib2FyZChcIm1hdHJpeFwiLCAodmFsdWVzOiBzdHJpbmdbXVtdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBGaXggY2xpcGJvYXJkIHNlcnZpY2UgY2hlIHBhcmUgdW4gcG8nIHN0cm9uemEsIHJpbXVvdm8gbCd1bHRpbW8gYXJyYXkgc2UgbWkgYWNjb3JnbyBjaGUgw6ggdW4gc2luZ29sbyBhcnJheSBjb24gdW4gc29sbyBlbGVtZW50byB2dW90b1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwICYmIHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV0ubGVuZ3RoID09IDEgJiYgdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXVswXSA9PSAnJylcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuc3BsaWNlKHZhbHVlcy5sZW5ndGggLSAxLCAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDAgJiYgdmFsdWVzWzBdLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgc2UgbGEgbW9kaWZpY2Egw6ggYWJpbGl0YXRhXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLkVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubXNnRXh0cy5zaW1wbGVXYXJuaW5nKHRoaXMubGMubG9jKFwiRGF0YSBmb3IgdGhpcyB0YWJsZSBjYW5ub3QgYmUgZWRpdGVkXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29udHJvbGxvIGNoZSBxdWVsbG8gY2hlIHN0byBjb3BpYW5kbyBzaWEgZGVsbGEgc3Rlc3NhIGRpbWVuc2lvbmUgZGVsbGEgc2VsZXppb25lIHN1bGwnZXMtdGFibGUsIHRyYW5uZSBuZWwgY2FzbyBobyB1biBzaW5nb2xvIHZhbG9yZSBkYSBjb3BpYXJlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKChzZWwubGVuZ3RoICE9IHZhbHVlcy5sZW5ndGggfHwgc2VsWzBdLmxlbmd0aCAhPSB2YWx1ZXNbMF0ubGVuZ3RoKSAmJiAodmFsdWVzLmxlbmd0aCAhPSAxIHx8IHZhbHVlc1swXS5sZW5ndGggIT0gMSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tc2dFeHRzLnNpbXBsZVdhcm5pbmcodGhpcy5sYy5sb2MoXCJTaXplIG9mIGNvcGllZCBkYXRhIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzaXplIG9mIHRoZSBzZWxlY3Rpb25cIikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBTZSBsZSBkaW1lbnNpb25pIGNvaW5jaWRvbm8gY29waW8gZGEgdW5hIHBhcnRlIGFsbCdhbHRyYVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaGFuZ2VzOiBFc1RhYmxlTW9kZWxDaGFuZ2VbXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgc2VsLmxlbmd0aDsgcisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSBzZWxbcl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgcm93Lmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2VsbCA9IHJvd1tjXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlIGhvIHVuIHNpbmdvbG8gdmFsb3JlIGxvIGFwcGxpY28gYSB0dXR0YSBsYSBzZWxlemlvbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHZhbHVlcy5sZW5ndGggPT0gMSAmJiB2YWx1ZXNbMF0ubGVuZ3RoID09IDEgPyB2YWx1ZXNbMF1bMF0gOiB2YWx1ZXNbcl1bY11cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvbGQgPSBjZWxsLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5pdSA9IGNlbGwudmFsX3NldHRlcih2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9sZGRhdGUgPSB0aGlzLmRhdGVFeHRzLmdldERhdGVDb252ZXJ0aW9uKG9sZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbml1ZGF0ZSA9IHRoaXMuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24obml1KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgob2xkZGF0ZSAmJiBuaXVkYXRlICYmIG9sZGRhdGUuaXNTYW1lICYmIG9sZGRhdGUuaXNTYW1lKG5pdWRhdGUpKSB8fCBvbGQgPT09IG5pdSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2gobmV3IEVzVGFibGVNb2RlbENoYW5nZShjZWxsLml0ZW0sIGNlbGwuaGVhZGVyLCBjZWxsLnByb3BlcnR5LCBvbGQsIG5pdSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UuZW1pdChjaGFuZ2VzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSaXB1bGlzY2UgaWwgdGltZXIgdXRpbGl6emF0byBwZXIgY2FwaXJlIHNlIMOoIHN0YXRvIGVmZmV0dHVhdG8gdW4gZG9wcGlvIGNsaWNrIG8gbWVubyAqL1xyXG4gICAgcHJpdmF0ZSBjbGVhckNlbGxDbGlja1RpbWVyKCkge1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNlbGxEYkNsaWNrVGltZXIpXHJcbiAgICAgICAgdGhpcy5jZWxsRGJDbGlja1RpbWVyID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXIgY2xpY2sgc2luZ29sbyBzdSB1bmEgcmlnYVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gJGV2ZW50IEV2ZW50byBuYXRpdm8gamF2YXNjcmlwdFxyXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gSXRlbSBjaGUgcmFwcHJlc2VudGEgaWwgY29udGVzdG8gc3UgY3VpIMOoIHN0YXRvIGVmZmV0dHVhdG8gdW4gY2xpY2tcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VsZWN0aW9uIEluZGljYSBzZSBsYSBzZWxlemlvbmUgw6ggYXR0aXZhXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGludGVybmFsQ2FsbCBJbmRpY2Egc2UgbGEgY2hpYW1hdGEgYSBxdWVzdGEgZnVuemlvbmUgw6ggaW50ZXJuYTogcGVybWV0dGUgZGkgc2tpcHBhcmUgaSBjaGVjayBzdWxsZSBDdXN0b21DZWxsc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFuZGxlUm93Q2xpY2soJGV2ZW50OiBhbnksIGl0ZW06IGFueSwgc2VsZWN0aW9uOiBib29sZWFuLCBpbnRlcm5hbENhbGw6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIC8vIFNlIGhvIHVuIGN0cmwgcHJlbXV0byBlc2NvIGNvbiB0cnVlIGluIG1vZG8gZGEgZmFyZSBidWJibGluZyBkZWxsJ2V2ZW50byBlIGxhc2NpYXJsbyBnZXN0aXJlIGFsIGJyb3dzZXIgKGxpbmsgZWNjLi4uKVxyXG4gICAgICAgIC8vIFN0ZXNzYSBjb3NhIHNlIGhvIGN1c3RvbSBjZWxsIGRhdG8gY2hlIGxhIGdlc3Rpb25lIGRlaSBjbGljayB2aWVuZSBhZmZpZGF0YSBhaSBzaW5nb2xpIFREXHJcbiAgICAgICAgaWYgKCRldmVudC5jdHJsS2V5IHx8ICh0aGlzLlVzZUN1c3RvbUNlbGxzICYmICFpbnRlcm5hbENhbGwpKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiAhaXRlbS5sb2NrZWQgJiYgIWl0ZW0uX3NlcCAmJiAhaXRlbS5fZ3JvdXApIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5jbGVhclNlbGVjdGlvblN0YXR1cygpO1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNsaWNrKCRldmVudCwgaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGl0ZW0uX2dyb3VwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJTZWxlY3Rpb25TdGF0dXMoKTtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVHcm91cENsaWNrKGl0ZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gT3JhIGNoZSBub24gw6ggYXR0YWNjYXRvIGRpcmV0dGFtZW50ZSBhbGwnaHRtbCBkZXZvIGZhcmUgdW4gbWFya2ZvcmNoZWNrIGZpbml0ZSBsZSBvcGVyYXppb25pIHN1aSBncm91cGluZ1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VzdGlvbmUgZGVsIGNsaWNrIGRlc3RybyBzdWxsJ2VzLXRhYmxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblJpZ2h0Q2xpY2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLm9uT3BlbkNvbnRleHRNZW51LmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExhIG1vZGlmaWNhIGRlbGwndXRlbnRlIMOoIGluaXppYXRhLiBTaSBpbXBvc3RhIGxhIHZhcmlhYmlsZSByZWxhdGl2YSBhIFwidHJ1ZVwiIGluIG1vZG8gZGEgbW9zdHJhcmUgbCdpbnB1dCBkaSB0ZXN0b1xyXG4gICAgICogXHJcbiAgICAgKiBEb3BvIGNoZSBsJ2lucHV0IMOoIGFwcGFyc28sIGRvcG8gdW4gY2ljbG8gZGkgQ2hhbmdlIERldGVjdGlvbiB2aWVuZSBhdHRpdmF0byBpbCBTdWJqZWN0IGNvbGxlZ2F0byBhbGwnaW5wdXQgY2hlIHNlcnZpcsOgIGEgZWZmZXR0dWFyZSBpbCBmb2N1c1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge1RkRWxlbWVudH0gcm93SXRlbSBFbGVtZW50byBkaSByaWdhIHN1IGN1aSDDqCBzdGF0YSBhdHRpdmF0YSBsYSBtb2RpZmljYVxyXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gT2dnZXR0byBzb3ByYSBpbCBxdWFsZSDDqCBzdGF0YSBhdHRpdmF0YSBsYSBtb2RpZmljYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0dXBVc2VyRWRpdChyb3dJdGVtOiBUZEVsZW1lbnQsIGl0ZW06IGFueSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJTZWxlY3Rpb25TdGF0dXMoKTtcclxuICAgICAgICBpZiAodGhpcy5FZGl0YWJsZSAmJiByb3dJdGVtLlByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5EeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb24/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICg8RXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uPjxhbnk+cm93SXRlbSkuZWRpdHNbaXRlbS5faGFzaF0gPSB7IF9lZGl0aW5nOiB0cnVlLCBvbGRfdmFsdWU6IGl0ZW1bcm93SXRlbS5Qcm9wZXJ0eU5hbWVdIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAoPGFueT5yb3dJdGVtKS5fZWRpdGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAoPGFueT5yb3dJdGVtKS5vbGRfdmFsdWUgPSBpdGVtW3Jvd0l0ZW0uUHJvcGVydHlOYW1lXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLkZvY3VzU3ViamVjdC5uZXh0KCk7IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGEgbW9kaWZpY2EgZGVsbCd1dGVudGUgw6ggdGVybWluYXRhLiBTaSByZWltcG9zdGEgbGEgdmFyaWFiaWxlIHJlbGF0aXZhIGEgXCJmYWxzZVwiIGluIG1vZG8gZGEgbmFzY29uZGVyZSBsJ2lucHV0IGRpIHRlc3RvIGUgc2kgZW1ldHRlIGxhIG1vZGlmaWNhIGRlbCB2YWxvcmVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtUZEVsZW1lbnR9IHJvd0l0ZW0gRWxlbWVudG8gZGkgcmlnYSBzdSBjdWkgw6ggc3RhdGEgYXR0aXZhdGEgbGEgbW9kaWZpY2FcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gc29wcmEgaWwgcXVhbGUgw6ggc3RhdGEgYXR0aXZhdGEgbGEgbW9kaWZpY2FcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2x1bW5JbmRleCBJbmRpY2UgZGVsbGEgY29sb25uYSBzdSBjdWkgw6ggYXZ2ZW51dGEgbGEgbW9kaWZpY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpbmFsaXplVXNlckVkaXQocm93SXRlbTogVGRFbGVtZW50LCBpdGVtOiBhbnksIGNvbHVtbkluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgZHluTW9kZSA9IHRoaXMuRHluYW1pY1Jvd0NvbHVtbnNEZWZpbml0aW9uPy5sZW5ndGggPiAwO1xyXG4gICAgICAgIGxldCByb3dJdG0gPSBkeW5Nb2RlID8gKCg8RXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uPjxhbnk+cm93SXRlbSkuZWRpdHNbaXRlbS5faGFzaF0pIDogKDxhbnk+cm93SXRlbSk7XHJcbiAgICAgICAgcm93SXRtLl9lZGl0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGxldCBvbGQgPSByb3dJdG0ub2xkX3ZhbHVlO1xyXG4gICAgICAgIGxldCBuaXUgPSBkeW5Nb2RlID8gaXRlbS5wcm9wZXJ0aWVzW3Jvd0l0ZW0uUHJvcGVydHlOYW1lXSA6IGl0ZW1bcm93SXRlbS5Qcm9wZXJ0eU5hbWVdO1xyXG5cclxuICAgICAgICBsZXQgb2xkZGF0ZSA9IHRoaXMuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24ob2xkKTtcclxuICAgICAgICBsZXQgbml1ZGF0ZSA9IHRoaXMuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24obml1KTtcclxuICAgICAgICBpZiAoKG9sZGRhdGUgJiYgbml1ZGF0ZSAmJiBvbGRkYXRlLmlzU2FtZSAmJiBvbGRkYXRlLmlzU2FtZShuaXVkYXRlKSkgfHwgb2xkID09PSBuaXUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlLmVtaXQoW25ldyBFc1RhYmxlTW9kZWxDaGFuZ2UoaXRlbSwgcm93SXRlbS5JRCwgcm93SXRlbS5Qcm9wZXJ0eU5hbWUsIG9sZCwgbml1KV0pO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdW2NvbHVtbkluZGV4XS52YWxfc2V0dGVyKG5pdSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2VsZWN0ZWQoc291cmNlOiB7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVtdLCB2YWx1ZTogc3RyaW5nKTogeyBpZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nIH0ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChzb3VyY2VbaV0uaWQgPT0gdmFsdWUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlW2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyBpZDogXCJcIiwgZGVzY3JpcHRpb246IFwiXCIgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSYW5nZSBzZWxlY3Rpb24gRXhwZXJpbWVudGFsc1xyXG5cclxuICAgIHByaXZhdGUgbW91c2VJc0Rvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgZmlyc3RDb29yZGluYXRlczoge3JvdzogbnVtYmVyLCBjb2x1bW46IG51bWJlcn0gPSBudWxsO1xyXG5cclxuICAgIG1vdXNlZG93bihldmVudDogTW91c2VFdmVudCwgcm93SXRlbTogYW55LCBpdGVtOiBhbnkpIHtcclxuICAgICAgICAvLyBUYXN0byBkaXZlcnNvIGRhbCBjbGljayBzaW5pc3RybyAtPiBjaWFvIMOoIHN0YXRvIGJlbGxvIGUgaW50ZW5zb1xyXG4gICAgICAgIGlmKGV2ZW50LmJ1dHRvbnMgIT0gMSB8fCAhdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBUdXR0aSBpIGNsaWNrIHN1IHVuYSBjZWxsYSBnacOgIGluIGVkaXQgbm9uIGRldm9ubyBlZmZldHR1YXJlIGxhIHNlbGV6aW9uZSBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCh0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbj8ubGVuZ3RoID4gMCAmJiAoPEVzVGFibGVDb2x1bW5zRGVmaW5pdGlvbj48YW55PnJvd0l0ZW0pLmVkaXRzICYmICg8RXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uPjxhbnk+cm93SXRlbSkuZWRpdHNbaXRlbS5faGFzaF0/Ll9lZGl0aW5nKSB8fFxyXG4gICAgICAgICAgICAoPGFueT5yb3dJdGVtKS5fZWRpdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB2YXIgaWQgPSAoPEhUTUxFbGVtZW50PmV2ZW50LmN1cnJlbnRUYXJnZXQpLmlkO1xyXG4gICAgICAgIHRoaXMubW91c2VJc0Rvd24gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZmlyc3RDb29yZGluYXRlcyA9IHsgcm93OiBwYXJzZUludChpZC5zcGxpdCgnXycpWzBdKSwgY29sdW1uOiBwYXJzZUludChpZC5zcGxpdCgnXycpWzFdKSB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5zaW5nbGVDZWxsU2VsZWN0aW9uKHsgdmlldzogZXZlbnQudmlldywgc2hpZnRLZXk6IGZhbHNlIH0sIHRoaXMuZmlyc3RDb29yZGluYXRlcy5yb3csIHRoaXMuZmlyc3RDb29yZGluYXRlcy5jb2x1bW4pO1xyXG4gICAgfVxyXG5cclxuICAgIG1vdXNlZW50ZXIoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICBpZighdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAoZXZlbnQuYnV0dG9ucyA9PSAwKVxyXG4gICAgICAgICAgICB0aGlzLm1vdXNlSXNEb3duID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1vdXNlSXNEb3duICYmIHRoaXMuZmlyc3RDb29yZGluYXRlcykge1xyXG4gICAgICAgICAgICB2YXIgaWQgPSAoPEhUTUxFbGVtZW50PmV2ZW50LmN1cnJlbnRUYXJnZXQpLmlkO1xyXG4gICAgICAgICAgICB2YXIgbmV3Q29vcmRzID0geyByb3c6IHBhcnNlSW50KGlkLnNwbGl0KCdfJylbMF0pLCBjb2x1bW46IHBhcnNlSW50KGlkLnNwbGl0KCdfJylbMV0pIH1cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5zaW5nbGVDZWxsU2VsZWN0aW9uKHsgdmlldzogZXZlbnQudmlldywgc2hpZnRLZXk6IHRydWUgfSwgbmV3Q29vcmRzLnJvdywgbmV3Q29vcmRzLmNvbHVtbiwgdGhpcy5maXJzdENvb3JkaW5hdGVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbW91c2V1cChldmVudDogYW55KXtcclxuICAgICAgICBpZighdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLm1vdXNlSXNEb3duID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8qIFBpYW5nb1xyXG4gICAgcHJpdmF0ZSBFc1Rkc0xpc3Q6IEVzVGRSZWZlcmVuY2VbXSA9IFtdO1xyXG4gICAgZ2V0Q2VsbFJlZmVyZW5jZShvYmplY3Q6IGFueSwgY29sdW1uOiBzdHJpbmcpOiBFc1RkIHtcclxuICAgICAgICBsZXQgZmtUaGlzU2hpdEltT3V0ID0gdGhpcy51dGlFeHRzLmRlZXBDbG9uZShvYmplY3QpO1xyXG4gICAgICAgIHRoaXMudXRpbGl0aWVzX0guY2FsY3VsYXRlSGFzaChbZmtUaGlzU2hpdEltT3V0XSk7XHJcbiAgICAgICAgbGV0IHByb3AgPSBjb2x1bW47XHJcbiAgICAgICAgbGV0IGhhc2ggPSBma1RoaXNTaGl0SW1PdXQuX2hhc2g7XHJcblxyXG4gICAgICAgIGxldCB0b1JldCA9IHRoaXMuRXNUZHNMaXN0LmZpbmQoZiA9PiBmLmlkID09IHByb3AgJiYgZi5oYXNoID09IGhhc2gpPy5zZWxmO1xyXG4gICAgICAgIHJldHVybiB0b1JldDtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlckNlbGwoZXZlbnQ6IEVzVGRSZWZlcmVuY2UpIHtcclxuICAgICAgICB0aGlzLkVzVGRzTGlzdC5wdXNoKGV2ZW50KTtcclxuICAgIH1cclxuICAgIC8vKiBQaWFuZ28gYW5jb3JhXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBFc1RkUmVmZXJlbmNlIHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBoYXNoOiBzdHJpbmc7IFxyXG4gICAgc2VsZjogRXNUZDtcclxufSJdfQ==
1606
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNfdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL2VzLXRhYmxlL2VzX3RhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsVUFBVTtBQUNWLE9BQU8sRUFDSCxTQUFTLEVBQUUsZUFBZSxFQUFhLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFDeEYsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLFNBQVMsRUFBYyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFlLE1BQU0sRUFDOUksTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRSxpQkFBaUI7QUFDakIsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBYyxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hJLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSzNELGlCQUFpQjtBQUNqQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFVdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRWpGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUUzRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUUvRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUVuRiw4QkFBOEI7QUFDOUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxh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K0JBT04sU0FBUyxTQUFDLGtCQUFrQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs2QkFFL0MsU0FBUyxTQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7b0NBVXZDLEtBQUs7O0FBazFDVixNQUFNLE9BQU8sYUFBYTtDQUl6QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBRdWVyeUxpc3QsIENoYW5nZURldGVjdG9yUmVmLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgSW5wdXQsXHJcbiAgICBFdmVudEVtaXR0ZXIsIE91dHB1dCwgQ29udGVudENoaWxkLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgVmlld0VuY2Fwc3VsYXRpb24sIE9wdGlvbmFsLCBTZWxmLCBUZW1wbGF0ZVJlZiwgSW5qZWN0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG4vLyBDb25maWd1cmF6aW9uaVxyXG5pbXBvcnQgeyBVdGlsaXR5U2VydmljZSwgRXhwb3J0U2VydmljZSwgTWVzc2FnZVNlcnZpY2UsIERhdGVTZXJ2aWNlLCBDc3ZIZWFkZXJzLCBDbGlwYm9hcmRTZXJ2aWNlIH0gZnJvbSAnQGVzZmFlbnphL2V4dGVuc2lvbnMnO1xyXG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnQGVzZmFlbnphL2xvY2FsaXphdGlvbnMnO1xyXG5pbXBvcnQgeyBQcmVmZXJlbmNlc1NlcnZpY2UgfSBmcm9tICdAZXNmYWVuemEvcHJlZmVyZW5jZXMnO1xyXG5cclxuLy8gUGx1Z2luc1xyXG5pbXBvcnQgeyBDb250ZXh0TWVudUNvbXBvbmVudCB9IGZyb20gJ0Blc2ZhZW56YS9uZ3gtY29udGV4dG1lbnUnO1xyXG5cclxuLy8gTW9kZWxsaSAvIFRpcGlcclxuaW1wb3J0IHsgQXBwU2VhcmNoIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvYXBwc2VhcmNoL0FwcFNlYXJjaFwiO1xyXG5pbXBvcnQgeyBBcHBPcmRlcmluZyB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9BcHBPcmRlcmluZ1wiO1xyXG5pbXBvcnQgeyBFc1RhYmxlQ29sdW1uc0RlZmluaXRpb24gfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9Fc1RhYmxlQ29sdW1uc0RlZmluaXRpb25cIjtcclxuaW1wb3J0IHsgQ29ybmVyTWVudU9wdGlvbiB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL0Nvcm5lck1lbnVPcHRpb25cIjtcclxuaW1wb3J0IHsgRXNUYWJsZU9wZXJhdGlvbkRlZmluaXRpb24gfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9Fc1RhYmxlT3BlcmF0aW9uRGVmaW5pdGlvblwiO1xyXG5pbXBvcnQgeyBFc1RhYmxlQ29sdW1uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvRXNUYWJsZUNvbHVtblwiO1xyXG5pbXBvcnQgeyBHcm91cFBhZ2VyIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvR3JvdXBQYWdlclwiO1xyXG5pbXBvcnQgeyBHcm91cFJvdXRlRnJhZ21lbnQgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9Hcm91cFJvdXRlRnJhZ21lbnRcIjtcclxuaW1wb3J0IHsgVGhFbGVtZW50IH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvVGhFbGVtZW50XCI7XHJcbmltcG9ydCB7IFRkRWxlbWVudCB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL1RkRWxlbWVudFwiO1xyXG5pbXBvcnQgeyBJdGVtc1NlbGVjdGlvbiB9IGZyb20gJy4uLy4uL2RvbWFpbi9leHRlcm5hbHMvYXBwc2VhcmNoL0l0ZW1zU2VsZWN0aW9uJztcclxuaW1wb3J0IHsgR3JvdXBPckFnZ3JlZ2F0aW9uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvYXBwc2VhcmNoL0dyb3VwT3JBZ2dyZWdhdGlvblwiO1xyXG5pbXBvcnQgeyBHcm91cEZpbHRlciB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9Hcm91cEZpbHRlclwiO1xyXG5pbXBvcnQgeyBHcm91cCB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9Hcm91cFwiO1xyXG5pbXBvcnQgeyBFc1RhYmxlTW9kZWxDaGFuZ2UgfSBmcm9tICcuLi8uLi9kb21haW4vZXh0ZXJuYWxzL0VzVGFibGVNb2RlbENoYW5nZSc7XHJcbmltcG9ydCB7IEl0ZW1Qcm9wRWRpdGFibGVSZWZlcmVuY2UgfSBmcm9tICcuLi8uLi9kb21haW4vZXh0ZXJuYWxzL0l0ZW1Qcm9wRWRpdGFibGVSZWZlcmVuY2UnO1xyXG5pbXBvcnQgeyBFc1RhYmxlRGVmYXVsdGFibGUgfSBmcm9tICcuLi8uLi9kb21haW4vY29uZmlndXJhdGlvbi9Fc1RhYmxlRGVmYXVsdGFibGUnO1xyXG5cclxuLy8gQ29tcG9uZW50aSBlIExvY2FsaXp6YXppb25lXHJcbmltcG9ydCB7IEVzVGREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2VzX3RkLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEVzVGhEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2VzX3RoLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEVzVGRFZGl0b3JEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2VzX3RkX2VkaXRvci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBJRXNUYWJsZVRlbXBsYXRlV3JhcHBlciB9IGZyb20gJy4uL2VzLXRhYmxlLXRlbXBsYXRlL2VzX3RhYmxlX3RlbXBsYXRlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEVzVGFibGVMb2MgfSBmcm9tICcuL2VzX3RhYmxlLmNvbXBvbmVudC5sb2MnO1xyXG5cclxuaW1wb3J0IHsgRVNUX0RFRkFVTFRTLCBFU1RfTE9DQUxFIH0gZnJvbSAnLi4vLi4vdG9rZW5zJztcclxuXHJcbi8vIEhhbmRsZXJzXHJcbmltcG9ydCB7IEV4cG9ydEhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9FeHBvcnRIYW5kbGVyXCI7XHJcbmltcG9ydCB7IENvbHVtbk1ldGFkYXRhSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL0NvbHVtbk1ldGFkYXRhSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBEeW5hbWljTW9kZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9EeW5hbWljTW9kZUhhbmRsZXJcIjtcclxuaW1wb3J0IHsgSGllcmFyY2h5TW9kZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9IaWVyYXJjaHlNb2RlSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBJdGVtc0hhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9JdGVtc0hhbmRsZXJcIjtcclxuaW1wb3J0IHsgUmVwb3J0TW9kZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9SZXBvcnRNb2RlSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBSb3dHcm91cGluZ0hhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9Sb3dHcm91cGluZ0hhbmRsZXJcIjtcclxuaW1wb3J0IHsgU2VsZWN0aW9uSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL1NlbGVjdGlvbkhhbmRsZXJcIjtcclxuaW1wb3J0IHsgVXRpbGl0aWVzSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL1V0aWxpdGllc0hhbmRsZXJcIjtcclxuaW1wb3J0IHsgQ29weVBhc3RlRGV0ZWN0b3IgfSBmcm9tICcuLi8uLi9jb3JlL0NvcHlQYXN0ZURldGVjdG9yJztcclxuXHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBFc1RkIH0gZnJvbSAnLi4vZXMtdGQvZXNfdGQuY29tcG9uZW50JztcclxuXHJcbi8qKiBDb21wb25lbnRlIGNoZSBwZXJtZXR0ZSBkaSByYXBwcmVzZW50YXJlIHVuYSBncmlnbGlhIGRpIHZhbG9yaSAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZXMtdGFibGUnLFxyXG4gICAgdmlld1Byb3ZpZGVyczogW3sgcHJvdmlkZTogTG9jYWxpemF0aW9uU2VydmljZSwgdXNlQ2xhc3M6IEVzVGFibGVMb2MgfV0sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9lc190YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2VzX3RhYmxlLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRXNUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMge1xyXG5cclxuICAgIC8vIENvbXBvbmVudGkgcGVyIGxhIGdlc3Rpb25lIGRlbGxlIHZhcmllIGZ1bnppb25hbGl0w6AgZGVsbCdlcy10YWJsZVxyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIGV4cG9ydF9IOiBFeHBvcnRIYW5kbGVyO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIGNvbHVtbk1ldGFkYXRhX0g6IENvbHVtbk1ldGFkYXRhSGFuZGxlcjtcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBkeW5hbWljTW9kZV9IOiBEeW5hbWljTW9kZUhhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgaGllcmFyY2h5TW9kZV9IOiBIaWVyYXJjaHlNb2RlSGFuZGxlcjtcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBpdGVtc19IOiBJdGVtc0hhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgcmVwb3J0TW9kZV9IOiBSZXBvcnRNb2RlSGFuZGxlcjtcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyByb3dHcm91cGluZ19IOiBSb3dHcm91cGluZ0hhbmRsZXJcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBzZWxlY3Rpb25fSDogU2VsZWN0aW9uSGFuZGxlcjtcclxuXHJcbiAgICAvLyBTdWJzY3JpYmVycyBwZXIgZ2xpIGV2ZW50aSBkaSBjb3BpYSBlIGluY29sbGFcclxuICAgIC8qKiBAaWdub3JlICovIHByaXZhdGUgY29weVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHJpdmF0ZSBwYXN0ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBAU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcclxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHByZWZTZXJ2aWNlOiBQcmVmZXJlbmNlc1NlcnZpY2UsXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChFU1RfREVGQVVMVFMpIHByaXZhdGUgZGVhZnVsdHM6IEVzVGFibGVEZWZhdWx0YWJsZSxcclxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVTVF9MT0NBTEUpIHB1YmxpYyBsb2NhbGU6IHN0cmluZyxcclxuICAgICAgICBwdWJsaWMgbGM6IExvY2FsaXphdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSB1dGlsaXRpZXNfSDogVXRpbGl0aWVzSGFuZGxlcixcclxuICAgICAgICBwdWJsaWMgdXRpRXh0czogVXRpbGl0eVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBleHBFeHRzOiBFeHBvcnRTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBkYXRlRXh0czogRGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBtc2dFeHRzOiBNZXNzYWdlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGNvcHlQYXN0ZURldGVjdG9yOiBDb3B5UGFzdGVEZXRlY3RvcixcclxuICAgICAgICBwcml2YXRlIGNsaXBib2FyZFNlcnZpY2U6IENsaXBib2FyZFNlcnZpY2UpIHtcclxuXHJcbiAgICAgICAgLy8gQ29waWEgZSBpbmNvbGxhIHNpIGVmZmV0dHVhbm8gc29sbyBzZSBsYSB0YWJlbGxhIGF0dHVhbGUgw6ggdW5pdm9jYW1lbnRlIHNlbGV6aW9uYXRhXHJcbiAgICAgICAgdGhpcy5jb3B5U3Vic2NyaXB0aW9uID0gdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5PbkNvcHkuc3Vic2NyaWJlKCgpID0+IHsgaWYgKHRoaXMuY29weVBhc3RlRGV0ZWN0b3IuQWN0aXZlRXN0UmVmZXJlbmNlID09IHRoaXMpIHRoaXMuaGFuZGxlQ29weSgpOyB9KTtcclxuICAgICAgICB0aGlzLnBhc3RlU3Vic2NyaXB0aW9uID0gdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5PblBhc3RlLnN1YnNjcmliZSgoKSA9PiB7IGlmICh0aGlzLmNvcHlQYXN0ZURldGVjdG9yLkFjdGl2ZUVzdFJlZmVyZW5jZSA9PSB0aGlzKSB0aGlzLmhhbmRsZVBhc3RlKCk7IH0pO1xyXG5cclxuICAgICAgICB0aGlzLmV4cG9ydF9IID0gbmV3IEV4cG9ydEhhbmRsZXIodGhpcywgdGhpcy5leHBFeHRzLCB0aGlzLm1zZ0V4dHMsIHRoaXMudXRpRXh0cywgdGhpcy5kYXRlRXh0cyk7XHJcbiAgICAgICAgdGhpcy5yb3dHcm91cGluZ19IID0gbmV3IFJvd0dyb3VwaW5nSGFuZGxlcih0aGlzLCB0aGlzLnV0aWxpdGllc19ILCB0aGlzLmRhdGVFeHRzKTtcclxuICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0ggPSBuZXcgQ29sdW1uTWV0YWRhdGFIYW5kbGVyKHRoaXMsIHRoaXMudXRpbGl0aWVzX0gsIHRoaXMudXRpRXh0cywgdGhpcy5wcmVmU2VydmljZSwgdGhpcy5yb3dHcm91cGluZ19IKTtcclxuICAgICAgICB0aGlzLmR5bmFtaWNNb2RlX0ggPSBuZXcgRHluYW1pY01vZGVIYW5kbGVyKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaGllcmFyY2h5TW9kZV9IID0gbmV3IEhpZXJhcmNoeU1vZGVIYW5kbGVyKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaXRlbXNfSCA9IG5ldyBJdGVtc0hhbmRsZXIodGhpcywgdGhpcy51dGlsaXRpZXNfSCk7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRNb2RlX0ggPSBuZXcgUmVwb3J0TW9kZUhhbmRsZXIodGhpcywgdGhpcy51dGlsaXRpZXNfSCk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25fSCA9IG5ldyBTZWxlY3Rpb25IYW5kbGVyKHRoaXMsIHRoaXMucm93R3JvdXBpbmdfSCk7XHJcblxyXG4gICAgICAgIGlmIChuZ0NvbnRyb2wpXHJcbiAgICAgICAgICAgIG5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcclxuXHJcbiAgICAgICAgLy8gQXNzZWduYXppb25lIHBlciB0dXR0aSBnbGkgSW5wdXQgZGkgZGVmYXVsdFxyXG4gICAgICAgIHRoaXMuQ29sdW1uc1Jlc2l6YWJsZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5Db2x1bW5zUmVzaXphYmxlLCB0aGlzLmRlYWZ1bHRzPy5Db2x1bW5zUmVzaXphYmxlKTtcclxuICAgICAgICB0aGlzLkF1dG9VcGRhdGUgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuQXV0b1VwZGF0ZSwgdGhpcy5kZWFmdWx0cz8uQXV0b1VwZGF0ZSk7XHJcbiAgICAgICAgdGhpcy5BbGxTZWFyY2ggPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuQWxsU2VhcmNoLCB0aGlzLmRlYWZ1bHRzPy5BbGxTZWFyY2gsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuRXhwb3J0ID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkV4cG9ydCwgdGhpcy5kZWFmdWx0cz8uRXhwb3J0KTtcclxuICAgICAgICB0aGlzLkhpZGVQYWdpbmcgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuSGlkZVBhZ2luZywgdGhpcy5kZWFmdWx0cz8uSGlkZVBhZ2luZywgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuSGlkZVBhZ2luZ0NvdW50ID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkhpZGVQYWdpbmdDb3VudCwgdGhpcy5kZWFmdWx0cz8uSGlkZVBhZ2luZ0NvdW50KTtcclxuICAgICAgICB0aGlzLkhpZGVQYWdpbmdCdXR0b25zID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkhpZGVQYWdpbmdCdXR0b25zLCB0aGlzLmRlYWZ1bHRzPy5IaWRlUGFnaW5nQnV0dG9ucyk7XHJcbiAgICAgICAgdGhpcy5Db250YWluZXJDbGFzcyA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5Db250YWluZXJDbGFzcywgdGhpcy5kZWFmdWx0cz8uQ29udGFpbmVyQ2xhc3MsICcnKTtcclxuICAgICAgICB0aGlzLlRhYmxlQ2xhc3MgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuVGFibGVDbGFzcywgdGhpcy5kZWFmdWx0cz8uVGFibGVDbGFzcywgJ3RhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtaG92ZXIgdGFibGUtc20nKTtcclxuICAgICAgICB0aGlzLlNlbGVjdGlvbiA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5TZWxlY3Rpb24sIHRoaXMuZGVhZnVsdHM/LlNlbGVjdGlvbik7XHJcbiAgICAgICAgdGhpcy5TYXZlUHJlZmVyZW5jZXMgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuU2F2ZVByZWZlcmVuY2VzLCB0aGlzLmRlYWZ1bHRzPy5TYXZlUHJlZmVyZW5jZXMpO1xyXG4gICAgICAgIHRoaXMuUGFnaW5nU3R5bGUgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuUGFnaW5nU3R5bGUsIHRoaXMuZGVhZnVsdHM/LlBhZ2luZ1N0eWxlLCAnYm90dG9tJyk7XHJcbiAgICAgICAgdGhpcy5Sb3dHcm91cGluZ1BhZ2luZ1N0eWxlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlJvd0dyb3VwaW5nUGFnaW5nU3R5bGUsIHRoaXMuZGVhZnVsdHM/LlJvd0dyb3VwaW5nUGFnaW5nU3R5bGUsICdsZWZ0Jyk7XHJcbiAgICAgICAgdGhpcy5Vc2VTZWxlY3Rpb25DYWNoZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5Vc2VTZWxlY3Rpb25DYWNoZSwgdGhpcy5kZWFmdWx0cz8uVXNlU2VsZWN0aW9uQ2FjaGUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuU2hvd0l0ZW1Hcm91cHNDb2x1bW5zID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlNob3dJdGVtR3JvdXBzQ29sdW1ucywgdGhpcy5kZWFmdWx0cz8uU2hvd0l0ZW1Hcm91cHNDb2x1bW5zLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5BcnJheW1vZGVJdGVtc1BlclBhZ2UgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuQXJyYXltb2RlSXRlbXNQZXJQYWdlLCB0aGlzLmRlYWZ1bHRzPy5BcnJheW1vZGVJdGVtc1BlclBhZ2UsIDE1KTtcclxuICAgICAgICB0aGlzLkNvbHVtbnNQaW5uYWJsZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5Db2x1bW5zUGlubmFibGUsIHRoaXMuZGVhZnVsdHM/LkNvbHVtbnNQaW5uYWJsZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFN1YmplY3QgdXRpbGl6emF0byBpbnRlcm5hbWVudGUgbGF0byBFc1RhYmxlIHBlciBjYXVzYXJlIGlsIEZvY3VzIGxhdG8gY29tcG9uZW50ZSBkaSBJbnB1dCAqL1xyXG4gICAgcHVibGljIEZvY3VzU3ViamVjdDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcclxuICAgIC8qKiBUaW1lciBjaGUgdmVycsOgIGltcG9zdGF0byBhICoqZG91YmxlQ2xpY2tCdWZmZXJNcyoqIHBlciBjYXBpcmUgc2Ugw6ggc3RhdG8gZWZmZXR0dWF0byB1biBjbGljayBzaW5nb2xvIG8gdW4gZG91YmxlY2xpY2sgKi9cclxuICAgIHByaXZhdGUgY2VsbERiQ2xpY2tUaW1lcjogYW55O1xyXG4gICAgLyoqIFNlIHZlbmdvbm8gZWZmZXR0dWF0aSAyIGNsaWNrIGEgZGlzdGFuemEgaW5mZXJpb3JlIGEgcXVlc3RpIE1pbGxpc2Vjb25kaSB2aWVuZSBjb25zaWRlcmF0byB1biBkb3BwaW8gY2xpY2sgKi9cclxuICAgIHByaXZhdGUgZG91YmxlQ2xpY2tCdWZmZXJNczogbnVtYmVyID0gMjAwO1xyXG4gICAgLyoqIFZpZXcgZmluYWxlIHN1IGN1aSBiaW5kYXJzaSBsYXRvIEZyb250ZW5kLCBpbCB0aXBvIHB1w7IgZXNzZXJlIElBcHBTZWFyY2g8YW55PiAocGVyIGxhICoqdmlld01vZGUqKiksIGFueVtdIChwZXIgbCcqKmFycmF5TW9kZSoqKSAqL1xyXG4gICAgcHVibGljIFZpZXc6IGFueSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyBkYSBjdWkgbCdlcy10YWJsZSBtb3N0cmEgaSBwdWxzYW50aSBkaSBwYWdpbmF6aW9uZSBpbiBiYXNzbyBhIGRlc3RyYSAqL1xyXG4gICAgcHVibGljIGFycmF5UHVsc2FudGk6IGFueTtcclxuICAgIC8qKiBJbmRpY2Egc2UgbCdlcy10YWJsZSBkZXZlIG1vc3RyYXJlIGlsIGNoZWNrIGdsb2JhbGUgbmVsbCdoZWFkZXIgcGVyIGZhcmUgaWwgXCJzZWxlemlvbmEgdHV0dG9cIiAqL1xyXG4gICAgcHVibGljIGdsb2JhbENoZWNrID0gZmFsc2U7XHJcbiAgICAvKiogVGllbmUgZGEgY29udG8gbCd1bHRpbW8gZWxlbWVudG8gc2VsZXppb25hdG8gaW4gbW9kbyBkYSBwb3RlciBlZmZldHR1YXJlIGlsIFNISUZUK0NMSUNLICovXHJcbiAgICBwcml2YXRlIGxhc3RTZWxlY3RlZDogYW55ID0gbnVsbDtcclxuICAgIC8qKiBDb250ZWdnaW8gaW50ZXJubyBwZXIgaWwgbnVtZXJvIGRpIGVsZW1lbnRpIHNlbGV6aW9uYXRpICovXHJcbiAgICBwdWJsaWMgc2VsZWN0ZWRPYmplY3RzID0gMDtcclxuICAgIC8qKiBJbmRpY2Egc2Ugw6ggcG9zc2liaWxlIGVmZmV0dHVhcmUgdW5hIHNlbGV6aW9uZSBtYXNzaXZhICovXHJcbiAgICBwdWJsaWMgY2FuU2VsZWN0QWxsID0gZmFsc2U7XHJcbiAgICAvKiogSW5kaWNhIHNlIGlsIGNvbXBvbmVudGUgc3RhIGdlc3RlbmRvIHVuIElBcHBTZWFyY2g8YW55PiAqL1xyXG4gICAgcHVibGljIHZpZXdNb2RlID0gZmFsc2U7XHJcbiAgICAvKiogSW5kaWNhIHNlIGlsIGNvbXBvbmVudGUgc3RhIGdlc3RlbmRvIHVuIGFueVtdICovXHJcbiAgICBwdWJsaWMgYXJyYXlNb2RlID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250ZW5pdG9yZSBkZWdsaSBlbGVtZW50aSBkYSBsaXN0YXJlIGxhdG8gaW50ZXJmYWNjaWEgZG9wbyB0dXR0ZSBsZSBlbGFib3JhemlvbmkgZGVsIGNhc28sXHJcbiAgICAgKiBnZW5lcmFsbWVudGUgbm9uIHNvbm8gYWx0cm8gY2hlIHR1dHRpIGdsaSBvZ2dldHRpIGRhIHByZXNlbnRhcmUgY29uIGluIHBpw7kgbCdoYXNoIGNhbGNvbGF0byBwZXIgaWRlbnRpZmljYXJlIDEgb2dnZXR0byBjb24gbGEgcHJvcHJpYSByaWdhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBib3VuZFNvdXJjZTogYW55W10gPSBbXTtcclxuICAgIC8qKiBTdGVzc2EgY29zYSBkZWxsYSAqKmJvdW5kU291cmNlKiosIHV0aWxpenphdGEgY29tZSBhcHBvZ2dpbyB0ZW1wb3JhbmVvIGludGVybm8gKi9cclxuICAgIHB1YmxpYyBUTVBCb3VuZFNvdXJjZTogYW55W10gPSBbXTtcclxuICAgIC8qKiBcIkZldHRhXCIgZGkgb2dnZXR0aSB1dGlsaXp6YXRhIG5lbGwnZW5kbGVzcyBzY3JvbGwsIG9nbmkgZWxlbWVudG8gZGkgcXVlc3RvIGFycmF5IMOoIHVuIGJsb2NjaGV0dG8gZGkgMTAwIGVsZW1lbnRpICovXHJcbiAgICBwdWJsaWMgYm91bmRTdWJTb3VyY2VzOiBhbnlbXSA9IFtdO1xyXG4gICAgLyoqIFF1ZXN0YSBmdW5nZSBkYSBpbmRpY2F0b3JlIHBlciBnbGkgc2xpY2UgaW5zZXJpdGksIGxhIGx1bmdoZXp6YSBkb3ZyZWJiZSBlc3NlcmUgY29ycmlzcG9uZGVudGUgYSAqKmJvdW5kU3ViU291cmNlcyoqICovXHJcbiAgICBwdWJsaWMgYWRkZWRTbGljZXM6IG51bWJlcltdID0gW107XHJcbiAgICAvKiogVmFyaWFiaWxlIGNoZSBpZGVudGlmaWNhIGlsIHZhbG9yZSBkZWwgXCJzZWxlemlvbmEgVHV0dG9cIiBuZWxsYSBwYWdpbmF6aW9uZSAqL1xyXG4gICAgcHVibGljIGRlZmF1bHRBbGxQYWdlT3ZlcnJpZGUgPSA5OTk5OTk7XHJcbiAgICAvKiogU2VydmUgcGVyIHRlbmVyZSBpbiBtZW1vcmlhIGlsIGNvbnRlZ2dpbyBwcmVjZWRlbnRlIGUgcmVjdXBlcmFybG8gaW4gY2FzbyBkaXZlbnRpIC0yICh2ZXJpZmljYXJlIGNvbiBBbGUgcGVyY2jDqSBsYSBsb2dpY2EgZGVsIC0yKSAqL1xyXG4gICAgcHVibGljIHByZXZpb3VzQ291bnQ6IG51bWJlcjtcclxuICAgIC8qKiBJbmRpY2Egc2UgdXRpbGl6emFyZSBpbCBzaXN0ZW1hIGRpIGF1dG91cGRhdGUsIGNpb8OoIHVuIHRyaWdnZXIgdGltZS1penphdG8gaW4gYWx0byBhIGRlc3RyYSBkZWxsYSB0YWJlbGxhIGNoZSByaXBldGUgbGUgcmljZXJjaGUgb2duaSBYICoqc2Vjb25kcyoqICovXHJcbiAgICBwdWJsaWMgYXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG4gICAgLyoqIE51bWVybyBkaSBzZWNvbmRpIGRhIGZhcmUgdHJhc2NvcnJlcmUgZnJhIHVuYSByaWNlcmNhIGUgbCdhbHRyYSAqL1xyXG4gICAgcHVibGljIHNlY29uZHMgPSAnMTAnO1xyXG4gICAgLyoqIFJpZmVyaW1lbnRvIGFsbCdJbnRlcnZhbCBjaGUgdmllbmUgZ2VuZXJhdG8gc2UgKiphdXRvVXBkYXRlKiogw6ggaW1wb3N0YXRhIGEgdHJ1ZSBpbiBtb2RvIGRhIHBvdGVybG8gcmlwdWxpcmUgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVUaW1lcjogYW55O1xyXG4gICAgLyoqIEltcG9zdGF0YSBhIHRydWUgb2duaSB2b2x0YSBjaGUgdmllbmUgYXZ2aWF0YSB1bmEgcmljZXJjYSwgZSBhIGZhbHNlIG9nbmkgdm9sdGEgY2hlIHVuIG51b3ZvIHZhbG9yZSB2aWVuZSByaWNldnV0byAqL1xyXG4gICAgcHVibGljIHJlc2VhcmNoSW5Qcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIE1vZGVsbG8gcmFwcHJlc2VudGFudGUgdW4gZGl6aW9uYXJpbyBkaSByaWdoZSBkZWxsYSB0YWJlbGxhLCBjb24gY2hpYXZlIGwnaGFzaCBlIHZhbG9yZSBsYSBsaXN0YSBkaSBjZWxsZSAqL1xyXG4gICAgcHVibGljIFJvd1REczogeyBbY29udGV4dDogc3RyaW5nXTogVGRFbGVtZW50W10gfSA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlICoqUm93VERzKiogw6ggdW4gb2dnZXR0byB2dW90byBvIG1lbm8gKi9cclxuICAgIHB1YmxpYyBFbXB0eVJvd1RkczogYm9vbGVhbjtcclxuICAgIC8qKiBNb2RlbGxvIGRpIGFwcG9nZ2lvIHRlbXBvcmFuZW8gcGVyIGkgKipSb3dURHMqKiAqL1xyXG4gICAgcHVibGljIFRNUFJvd1REczogeyBbY29udGV4dDogc3RyaW5nXTogVGRFbGVtZW50W10gfSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyByYXBwcmVzZW50YW50ZSB1biBzaW5nb2xvIHRoIGRlbGxhIHRhYmVsbGEsIGdlbmVyYXRvIGluIGJhc2UgYWxsZSBjb25maWd1cmF6aW9uaSBlIGFnbGkgb2dnZXR0aSByaWNldnV0aSAqL1xyXG4gICAgcHVibGljIFJvd1RIczogVGhFbGVtZW50W10gPSBudWxsO1xyXG4gICAgLyoqIE1vZGVsbG8gZGkgYXBwb2dnaW8gdGVtcG9yYW5lbyBwZXIgaSAqKlJvd1RIcyoqICovXHJcbiAgICBwdWJsaWMgVE1QUm93VEhzOiBUaEVsZW1lbnRbXSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyBkaSBhcHBvZ2dpbyB0ZW1wb3JhbmVvIHBlciBpICoqUm93VGhHcm91cHMqKiAqL1xyXG4gICAgcHVibGljIFRNUFJvd1RoR3JvdXBzOiB7IFNwYW46IG51bWJlciwgVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfVtdW10gPSBudWxsO1xyXG4gICAgLyoqIE1vZGVsbG8gcmFwcHJlc2VudGFudGUgdW4gc2luZ29sbyBoZWFkZXIgZ3JvdXAgZGVsbGEgdGFiZWxsYS4gUXVlc3RhIGxpc3RhIMOoIGdpw6Agb3JkaW5hdGEgZSBwcm9udGEgcGVyIGVzc2VyZSB1dGlsaXp6YXRhIGluIG5nRm9yICovXHJcbiAgICBwdWJsaWMgUm93VGhHcm91cHM6IHsgU3BhbjogbnVtYmVyLCBUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB9W11bXSA9IG51bGw7XHJcbiAgICAvKiogQ2FjaGUgcGVyIGkgcm91dGVyTGluayBnZW5lcmF0aSBuZWxsZSB0YWJlbGxlIGRpbmFtaWNoZSAqL1xyXG4gICAgcHVibGljIER5bmFtaWNUYWJsZVJvdXRlckxpbmtDYWNoZToge30gPSB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIExpc3RhIGRlaSBjb250ZXN0aS4gVW4gY29udGVzdG8gbm9uIMOoIGFsdHJvIGNoZSB1biBoYXNoIHBhcnRpY29sYXJlIGNhbGNvbGF0byBzdSB1biBvZ2dldHRvIGNoZSBpZGVudGlmaWNhIHVuaXZvY2FtZW50ZSB0YWxlIG9nZ2V0dG8uXHJcbiAgICAgKlxyXG4gICAgICogT2dudW5vIGRpIHF1ZXN0aSBjb250ZXN0aSByYXBwcmVzZW50ZXLDoCBhIHN1YSB2b2x0YSwgdW5pdm9jYW1lbnRlLCB1bmEgcmlnYSBhbGwnaW50ZXJubyBkZWxsYSB0YWJlbGxhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSb3dDb250ZXh0czogYW55W10gPSBbXTtcclxuICAgIC8qKiBEaXJldHRpdmUgZGkgb3JkaW5hbWVudG8gZGVsbGUgY29sb25uZSAobm9uIG9yZGluYW1lbnRvIGRlaSBkYXRpIG1hIGRlbGxlIGNvbG9ubmUgaW4gc2UpICovXHJcbiAgICBwdWJsaWMgT3JkZXJEaXJlY3RpdmVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLyoqIENvZGljZSBkZWxsJ3VsdGltbyBvZ2dldHRvIHNvbGV6aW9uYXRvICovXHJcbiAgICBwdWJsaWMgbGFzdFNlbGVjdGVkSXRlbUlEID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBvbHRyZSBhbGxlIGNvbG9ubmUgZGluYW1pY2hlIHNwZWNpZmljaGUgZGkgdW4gdGlwbyBkaSBvZ2dldHRvIGNpIHNvbm8gYW5jaGUgY29sb25uZSBkaW5hbWljaGUgYWdnaXVudGUgZGFsbCd1dGVudGVcclxuICAgICAqXHJcbiAgICAgKiBFcy4gdW5hIGNvbG9ubmEgaW4gY3VpIG1vc3RyYXJlIHNlbXByZSB1biBpY29uY2luYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVXNlckRlZmluZWREeW5hbWljQ29sczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBjaGUgcXVlc3RvIMOoIGlsIHByaW1vIEJpbmQgZGVsbGEgdGFiZWxsYSwgdmllbmUgc2V0dGF0byBhIGZhbHNlIG5vbiBhcHBlbmEgaWwgcHJpbW8gYmluZCB2aWVuZSB0ZXJtaW5hdG8gY29uIHN1Y2Nlc3NvICovXHJcbiAgICBwdWJsaWMgRmlyc3RCaW5kOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIC8qKiBMaXN0YSBkaSBjb2xvbm5lIGNoZSBzaSBwb3Nzb25vIHZpc3VhbGl6emFyZS9vcmRpbmFyZSBmcmEgZGkgbG9ybyAqL1xyXG4gICAgcHVibGljIENvbHVtbnNMaXN0OiBFc1RhYmxlQ29sdW1uW10gPSBbXTtcclxuICAgIC8qKiBWYXJpYWJpbGUgZCdhcHBvZ2dpbyB1c2F0YSBkYWxsYSBkaWFsb2cgZGkgc2VsZXppb25lL25hc2NvbmRpbWVudG8sIHBlciBldml0YXJlIGRpIGRhbm5lZ2dpYXJlICoqQ29sdW1uc0xpc3QqKiBpbiBjYXNvIGRpIG1vZGlmaWNoZSBwb2kgYW5udWxsYXRlICovXHJcbiAgICBwdWJsaWMgVE1QQ29sdW1uc0xpc3Q6IEVzVGFibGVDb2x1bW5bXSA9IFtdO1xyXG4gICAgLyoqIFZhbG9yZSBkZWwgY2hlY2sgZ2xvYmFsZSBkaSB2aXNpYmlsaXTDoCB2YWxpZG8gcGVyIHR1dHRlIGxlIGNvbG9ubmUgaW4gKipDb2x1bW5zTGlzdCoqICovXHJcbiAgICBwdWJsaWMgZ2xvYmFsQ29sVmlzQ2hlY2sgPSBmYWxzZTtcclxuXHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgdHV0dGUgbGUgZGlyZXR0aXZlIHBlciBnbGkgZWRpdG9yIGN1c3RvbSBkZWxsZSBjZWxsZSAqL1xyXG4gICAgQENvbnRlbnRDaGlsZHJlbihFc1RkRWRpdG9yRGlyZWN0aXZlKSBFc1RkRWRpdG9yRGlyZWN0aXZlczogUXVlcnlMaXN0PEVzVGRFZGl0b3JEaXJlY3RpdmU+O1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIHR1dHRlIGxlIG51b3ZlIGRpcmV0dGl2ZSAgYXNzZWduYXRpIGEgZGlyZXR0aXZhIChQZXIgbGEgbW9kYWxpdMOgIGRpbmFtaWNhIGRlbGwnZXMtdGFibGUpICovXHJcbiAgICBAQ29udGVudENoaWxkcmVuKEVzVGREaXJlY3RpdmUpIEVzVGRzRGlyZWN0aXZlOiBRdWVyeUxpc3Q8RXNUZERpcmVjdGl2ZT47XHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgdHV0dGkgZ2xpIGVzLXRkIGFzc2VnbmF0aSBhIGRpcmV0dGl2YSAoUGVyIGxhIG1vZGFsaXTDoCBkaW5hbWljYSBkZWxsJ2VzLXRhYmxlKSAqL1xyXG4gICAgQENvbnRlbnRDaGlsZHJlbihFc1RoRGlyZWN0aXZlKSBFc1Roc0RpcmVjdGl2ZTogUXVlcnlMaXN0PEVzVGhEaXJlY3RpdmU+O1xyXG4gICAgLyoqIElucHV0IGNvbGxlZ2F0byBhIHVuIHRlbXBsYXRlIGNoZSBjb250aWVuZSBsZSBkaXJldHRpdmUgcGVyIHJlbmRlcml6emFyZSBxdWVzdGEgdGFiZWxsYS4gc2UgY2kgc29ubyAqKkVzVGRzRGlyZWN0aXZlKiogZSAqKkVzVGhzRGlyZWN0aXZlKiogcXVlc3RpIGhhbm5vIGxhIHByaW9yaXTDoCAqL1xyXG4gICAgQElucHV0KCkgRXNUYWJsZVRlbXBsYXRlOiBJRXNUYWJsZVRlbXBsYXRlV3JhcHBlcjtcclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSBsZSBpbmZvcm1hemlvbmkgZGVsIGJvZHkgKHB1bnRvIGRlbGxhIHRhYmVsbGEgZG92ZSB2ZW5nb25vIG1vc3RyYXRlIGxlIHJpZ2hlKSAqL1xyXG4gICAgQENvbnRlbnRDaGlsZCgnYm9keScsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgYm9keVJlZjogYW55O1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIGxlIGluZm9ybWF6aW9uaSBkZWxsJ2hlYWRlciAocHVudG8gZGVsbGEgdGFiZWxsYSBkb3ZlIHZlbmdvbm8gbW9zdHJhdGUgbGUgaW50ZXN0YXppb25pIGRlbGxlIHJpZ2hlKSAqL1xyXG4gICAgQENvbnRlbnRDaGlsZCgnaGVhZGVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBoZWFkZXJSZWY6IGFueTtcclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSBsZSBpbmZvcm1hemlvbmkgc3VsIHJhZ2dydXBwYW1lbnRvIGRlZ2xpIGhlYWRlciAqL1xyXG4gICAgQENvbnRlbnRDaGlsZCgnaGVhZGVyR3JvdXAnLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGhlYWRlckdyb3VwUmVmOiBhbnk7XHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgbGUgaW5mb3JtYXppb25pIHN1bCByYWdncnVwcGFtZW50byBkaSBzZWNvbmRvIGxpdmVsbG8gZGVnbGkgaGVhZGVyICovXHJcbiAgICBAQ29udGVudENoaWxkKCdzZWNvbmRhcnlIZWFkZXJHcm91cCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgc2Vjb25kYXJ5SGVhZGVyR3JvdXBSZWY6IGFueTtcclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSBpbCBjYW1wbyBkaSBJbnB1dCBhdHR1YWxlLiBEb3BvIHVuIGRvcHBpbyBjbGljayBsbyBiZWNjbyBlIGxvIGZvY3Vzc28gYXBwZW5hIHRlcm1pbmEgbGEgY2hhZ25lIGRldGVjdGlvbiAqL1xyXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGlucHV0RmllbGQ6IEVsZW1lbnRSZWY7XHJcbiAgICAvKiogT3B6aW9uaSBleHRyYSBjaGUgZGV2b25vIGFwcGFyaXJlIG5lbCBNZW7DuSBjb250ZXN0dWFsZSBpbiBhbHRvIGEgZGVzdHJhLCByaWNoaWFtYXRvIGRhaSAzIHBhbGxpbmkgdmVydGljYWxpICovXHJcbiAgICBASW5wdXQoKSBDb3JuZXJNZW51T3B0aW9uczogQ29ybmVyTWVudU9wdGlvbltdID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgZGV2J2Vzc2VyZSBwb3NzaWJpbGUgZWZmZXR0dWFyZSBpbCByZXNpemUgZGVsbGUgY29sb25uZSAqL1xyXG4gICAgQElucHV0KCkgQ29sdW1uc1Jlc2l6YWJsZTogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIGRldidlc3NlcmUgcG9zc2liaWxlIGVmZmV0dHVhcmUgaWwgcGlubmluZyBkZWxsZSBjb2xvbm5lICovXHJcbiAgICBASW5wdXQoKSBDb2x1bW5zUGlubmFibGU6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBkZXYnZXNzZXJlIGRpc3BvbmliaWxlIGlsIHNpc3RlbWEgZGkgYWdnaW9ybmFtZW50byBhdXRvbWF0aWNvICovXHJcbiAgICBASW5wdXQoKSBBdXRvVXBkYXRlOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBcclxuICAgICAqIEBleHBlcmltZW50YWwgSW5kaWNhIHNlIGRldidlc3NlcmUgbCdlc3RhYmxlIGEgZ2VzdGlyZSBsYSByaWNlcmNhLCBhbmNoZSBsYSBwcmltYS4gXHJcbiAgICAgKiBcclxuICAgICAqICoqQVRURU5aSU9ORTogUklDSElFREUgTU9ESUZJQ0hFIE5PTiBUUklWSUFMSSBBTExBIFBBR0lOQSBESSBSSUNFUkNBIENIRSBVVElMSVpaQSBRVUVTVE8gVElQTyBESSBFUy1UQUJMRS4gTk9OIFVUSUxJWlpBUkUgU0UgTk9OIFNJIFNBIENJTycgQ0hFIFNJIFNUQSBGQUNFTkRPKipcclxuICAgICAqKi9cclxuICAgIEBJbnB1dCgpIEVzVGFibGVIYW5kbGVkU2VhcmNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWNpZGUgc2UgdXRpbGl6emFyZSBvIG1lbm8gbGUgQ3VzdG9tQ2VsbHMuIEltcG9zdGFuZG9sbyBhICoqdHJ1ZSoqIGwnZXMtdGFibGUgZGl2ZW50YSBpbiBncmFkbyBkaSBnZXN0aXJlIG5hdGl2YW1lbnRlOlxyXG4gICAgICpcclxuICAgICAqIDEpIE9yZGluYW1lbnRvIGUgdmlzaWJpbGl0w6AgZGVsbGUgY29sb25uZVxyXG4gICAgICpcclxuICAgICAqIDIpIE9yZGluYW1lbnRvIGRlaSBkYXRpXHJcbiAgICAgKlxyXG4gICAgICogMykgTW9kYWxpdMOgIEdlcmFyY2hpY2FcclxuICAgICAqXHJcbiAgICAgKiBlY2MuLi5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgVXNlQ3VzdG9tQ2VsbHM6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIGltcG9zdGFyZSBsJ2FsdGV6emEgbWFzc2ltYSBkZWxsYSB0YWJlbGxhLiBTZSBudWxsIGxhIGRpbWVuc2lvbmUgc2kgYWRhdHRhIGFsIG51bWVybyBkaSBlbGVtZW50aSBhdHR1YWxtZW50ZSBpbiB2aXN1YWxpenphemlvbmUgKi9cclxuICAgIEBJbnB1dCgpIE1heEhlaWdodDogbnVtYmVyID0gbnVsbDtcclxuICAgIC8qKiBDbGFzc2kgZGEgYXBwbGljYXJlIGFsIGNvbnRlbml0b3JlIGRlbGxhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIENvbnRhaW5lckNsYXNzID0gbnVsbDtcclxuICAgIC8qKiBQZXJtZXR0ZSBvIG1lbm8gbCdleHBvcnQgaW4gZm9ybWF0byBYTFNYICovXHJcbiAgICBASW5wdXQoKSBYTFNYRXhwb3J0OiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBQZXJtZXR0ZSBvIG1lbm8gbCdleHBvcnQgaW4gZm9ybWF0byBDU1YgKi9cclxuICAgIEBJbnB1dCgpIENTVkV4cG9ydCA9IHRydWU7XHJcbiAgICAvKiogUGVybWV0dGUgZGkgdmlzdWFsaXp6YXJlIG8gbWVubyBsJ29wemlvbmUgZGkgcGFnaW5hemlvbmUgXCJUdXR0aVwiICovXHJcbiAgICBASW5wdXQoKSBBbGxTZWFyY2ggPSBudWxsO1xyXG4gICAgLyoqIERpbWludWlzY2UgZ2xpIHNwYXppIGZyYSB1bmEgY2VsbGEgZSBsJ2FsdHJhLCBlIGludGVybmFtZW50ZSBpbCBwYWRkaW5nIGRlbCBmb250IGluIG1vZG8gZGEgcHJlc2VudGFyZSBtb2x0aSBwacO5IGRhdGkgaW4gdW4ndW5pY2EgcGFnaW5hICovXHJcbiAgICBASW5wdXQoKSBIaWdoQ2VsbERlbnNpdHk6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEFiaWxpdGEgbyBtZW5vIGxhIHBvc3NpYmlsaXTDoCBkaSBzZWxlemlvbmFyZSBvZ2dldHRpICovXHJcbiAgICBASW5wdXQoKSBTZWxlY3Rpb246IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIE1vc3RyYSBvIG1lbm8gdW4gbWVzc2FnZ2lvIGRpIExvYWRpbmcgYWwgcHJpbW8gY2FyaWNhbWVudG8gZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgU2hvd0xvYWRpbmdPbkJvb3RzdHJhcDogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogU2UgaW1wb3N0YXRvIGEgKip0cnVlKiogYWdnaXVuZ2UgdW5hIGNvbG9ubmEgY29uIHB1bHNhbnRlIGRpIGVsaW1pbmF6aW9uZSBwZXIgZWZmZXR0dWFyZSBsJ2VsaW1pbmEgZGVsbCdvZ2dldHRvIHJlbGF0aXZvICovXHJcbiAgICBASW5wdXQoKSBSZW1vdmFsOiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbmRpemlvbmUgY2hlIG5hc2NvbmRlIGwnaWNvbmEgZGkgZWxpbWluYXppb25lIGluc2VyaXRhIGltcG9zdGFuZG8gKipSZW1vdmFsKiogYSB0cnVlIHF1YWxvcmEgbGEgY29uZGl6aW9uZSBub24gdmVuaXNzZSByaXNwZXR0YXRhXHJcbiAgICAgKlxyXG4gICAgICogQ29tZSBjb25kaXppb25lIHNpIGNvbnNpZGVyYSB1biBzZW1wbGljZSBjYW1wbyBzdSBjdWkgZWZmZXR0dWFyZSB1biBjb250cm9sbG8gYm9vbGVhbm8sIGNvbWUgYWQgZXNlbXBpbyBcImNhbnJlbW92ZVwiXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFJlbW92YWxDb25kaXRpb24gPSAnJztcclxuICAgIC8qKiBJbmRpY2Egc2UgYWJpbGl0YXJlIGxhIHBvc3NpYmlsaXTDoCBkaSBlc3BvcnRhcmUgbGEgdmlzdGEgZGF0aSBhdHR1YWxlICovXHJcbiAgICBASW5wdXQoKSBFeHBvcnQ6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBwZXJtZXR0ZXJlIGxhIHNlbGV6aW9uZSBtdWx0aXBsYSBXaW5kb3dzLWxpa2UgY2xpY2NhbmRvIHVuIG9nZ2V0dG8gZSBmYWNlbmRvIHBvaSBTaGlmdCArIGNsaWNrIHN1IHVuIG9nZ2V0dG8gc3VjY2Vzc2l2byAqL1xyXG4gICAgQElucHV0KCkgU2hpZnRDbGljazogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIGlsIHRlc3RvIGNoZSB2YSBhIHNvc3RpdHVpcmUgXCJPZ2dldHRpIFZpc3VhbGl6emF0aVwiIGluIGNhc28gc2kgc3RpYSBmYWNlbmRvIHF1YWxjb3NhIGRpIGN1c3RvbSAqL1xyXG4gICAgQElucHV0KCkgQ291bnRMYWJlbDogc3RyaW5nID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgbmFzY29uZGVyZSBvIG1vc3RyYXJlIGlsIGNvbXBvbmVudGUgZGkgcGFnaW5hemlvbmUgKi9cclxuICAgIEBJbnB1dCgpIEhpZGVQYWdpbmc6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBuYXNjb25kZXJlIG8gbW9zdHJhcmUgaWwgY29udGVnZ2lvIGRlZ2xpIGVsZW1lbnRpIHRyb3ZhdGkgKi9cclxuICAgIEBJbnB1dCgpIEhpZGVQYWdpbmdDb3VudDogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5hc2NvbmRlcmUgbyBtb3N0cmFyZSBpIHB1bHNhbnRpIGRpIHBhZ2luYXppb25lICovXHJcbiAgICBASW5wdXQoKSBIaWRlUGFnaW5nQnV0dG9uczogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogUmlmZXJpbWVudG8gYWwgQ29udGV4dE1lbnUgKG5neC1jb250ZXh0bWVudSkgYXNzb2NpYXRvIGFsIGNsaWNrIGRlc3RybyBkaSB1bm8gbyBwacO5IGVsZW1lbnRpIHNlbGV6aW9uYXRpIG5lbGxhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIENvbnRleHRNZW51OiBDb250ZXh0TWVudUNvbXBvbmVudCA9IG51bGw7XHJcbiAgICAvKiogTm9tZSBkZWxsJ2VzcG9ydGF6aW9uZSBnZW5lcmF0YSBkYSBxdWVzdGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgRXhwb3J0RmlsZU5hbWUgPSAnRXhwb3J0LmNzdic7XHJcbiAgICAvKiogQ2xhc3NlIChIVE1MKSBkaSBkZWZhdWx0IGRlbGxhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIFRhYmxlQ2xhc3MgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuemlvbmUgZGEgdXRpbGl6emFyZSBpbiBlc3BvcnRhemlvbmUuIE5lbCBmb3JtYXRvIFwiUmVwb3J0XCIgYXZyw6AgdW4gdW5pY28gcGFyYW1ldHJvIFwiRm9ybWF0b1wiIGUgbmVzc3VuIHZhbG9yZSBkaSByaXRvcm5vLlxyXG4gICAgICpcclxuICAgICAqIE5lbCBmb3JtYXRvIFwiVmlld1wiIGhhIGNvbWUgcGFyYW1ldHJvIHVuYSBjYWxsYmFjayBjb24gaSBkYXRpIGNvbXBsZXRpIGRhIGVzcG9ydGFyZSAoZGF0byBjaGUgZGkgZGVmYXVsdCBsYSByaWNlcmNhIMOoIHBhZ2luYXRhKVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBFeHBvcnRGdW5jdGlvbjogYW55O1xyXG4gICAgLyoqIEluZGljYSBkaSBlc3BvcnRhcmUgc29sbyBsZSBjb2xvbm5lIGF0dHVhbG1lbnRlIHZpc2liaWxpIGRlbGxhIHZpZXcgKi9cclxuICAgIEBJbnB1dCgpIEV4cG9ydE9ubHlWaXNpYmxlQ29sdW1uczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBsYSBwcmVzZW56YSBkaSByYWdncnVwcGFtZW50aSBhIGxpdmVsbG8gZGkgaGVhZGVyICovXHJcbiAgICBASW5wdXQoKSBIYXNIZWFkZXJHcm91cDogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIGxhIHByZXNlbnphIGRpIHJhZ2dydXBwYW1lbnRpIGEgbGl2ZWxsbyBkZWwgcmFnZ3J1cHBhbWVudG8gcHJlY2VkZW50ZW1lbnRlIGVzaXN0ZW50ZSwgY2hpYXJhbWVudGUgw6ggaW5zZW5zYXRhIHNlbnphICoqSGFzSGVhZGVyR3JvdXAqKiAqL1xyXG4gICAgQElucHV0KCkgSGFzU2Vjb25kYXJ5SGVhZGVyR3JvdXA6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBuYXNjb25kZXJlIGdsaSBIZWFkZXIgZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgSGVhZGVySGlkZGVuOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgbmFzY29uZGVyZSBpbCBCb2R5IGRlbGxhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIEJvZHlIaWRkZW46IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIGxhIHNlbGV6aW9uZSDDqCB0ZW1wb3JhbmVhbWVudGUgZGlzYWJpbGl0YXRhLiBSaXNwZXR0byBhbGwnSW5wdXQgKipTZWxlY3Rpb24qKiBjaGUgdmlzaXZhbWVudGUgZ2VzdGlzY2Ugc2UgY2kgc29ubyBvIG5vIGdsaSBpbnB1dCBkaSBzZWxlemlvbmUsXHJcbiAgICAgKiBxdWVzdG8gSW5wdXQgZ2VzdGlzY2Ugc2UgcXVlc3RpIGlucHV0IHNvbm8gYWJpbGl0YXRpIG8gbWVub1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBTZWxlY3Rpb25EaXNhYmxlZDogYm9vbGVhbiA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgZm9yemFyZSBpbCBzaXN0ZW1hIGRpIHNlbGV6aW9uZSBhIGdlc3RpcmUgdW4gZWxlbWVudG8gcGVyIHZvbHRhLlxyXG4gICAgICogU2VsZXppb25hcmUgdW4nYWx0cmEgcmlnYSBjb24gdW5hIGdpw6Agc2VsZXppb25hdGEgYXBwbGljaGVyw6AgbGEgc2VsZXppb25lIGFsbGEgbnVvdmEgcmlnYSwgcmltdW92ZW5kb2xhIGRhbGwnYXR0dWFsZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBTaW5nbGVTZWxlY3Rpb246IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIENhbGxiYWNrIGNoZSBkYXRvIHVuIG9nZ2V0dG8gcmVzaXR1aXNjZSBsJ2V2ZW50dWFsZSBjbGFzc2UgZGEgYXBwbGljYXJlIGFsbGEgcmlnYSBjb2xsZWdhdGEgYWxsJ29nZ2V0dG8gKi9cclxuICAgIEBJbnB1dCgpIFJvd0NsYXNzQXNzaWduZXI6IGFueSA9IG51bGw7XHJcbiAgICAvKiogUGVybWV0dGUgZGkgb3JkaW5hcmUgaSBkYXRpIGluIG1hbmllcmEgZGlzY2VuZGVudGUgbyBhc2NlbmRlbnRlICovXHJcbiAgICBASW5wdXQoKSBPcmRlckJ5Q29sdW1uOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBhdmVyZSBwacO5IGRpcmV0dGl2ZSBkaSBvcmRpbmFtZW50byBkZWkgZGF0aSAqL1xyXG4gICAgQElucHV0KCkgTXVsdGlwbGVPcmRlcmluZ0RpcmVjdGl2ZXMgPSB0cnVlO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIG5hc2NvbmRlcmUgbGUgY29sb25uZSBpbiBiYXNlIGFsbGUgc2VsZXppb25pIGVmZmV0dHVhdGUgZGFsIE1lbsO5IGNvbnRlc3R1YWxlIGluIGFsdG8gYSBkZXN0cmEgKi9cclxuICAgIEBJbnB1dCgpIEhpZGRlbkNvbHVtbnM6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIHJpb3JkaW5hcmUgbGUgY29sb25uZSBpbiBiYXNlIGFsbGUgaW1wb3N0YXppb25pIGVmZmV0dHVhdGUgZGFsIE1lbsO5IGNvbnRlc3R1YWxlIGluIGFsdG8gYSBkZXN0cmEgKi9cclxuICAgIEBJbnB1dCgpIENvbHVtbnNPcmRlcmluZzogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogRXZlbnR1YWxlIHN1cHBvcnRvIGFsbGUgcmljZXJjaGUgYXBwbGljYXRlIGFsbGEgbW9kYWxpdMOgIEFycmF5ICovXHJcbiAgICBASW5wdXQoKSBTZWFyY2hWaWV3ID0gbnVsbCBhcyBBcHBTZWFyY2g8YW55PjtcclxuICAgIC8qKiBBYmlsaXRhIG8gZGlzYWJpbGl0YSBpbCBzaXN0ZW1hIGNoZSBwZXJtZXR0ZSBkaSBzZWxlemlvbmFyZSB0dXR0aSBnbGkgZWxlbWVudGkgbmVsbGEgdmlzdGEgKi9cclxuICAgIEBJbnB1dCgpIFNlbGVjdEFsbDogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogU2ltdWxhIGxhIHBhZ2luYXppb25lIGFuY2hlIHBlciBsZSB0YWJlbGxlIGNoZSBmdW56aW9uYW5vIGluIG1vZGFsaXTDoCBBcnJheSAqL1xyXG4gICAgQElucHV0KCkgVXNlQXJyYXlNb2RlUGFnaW5nID0gdHJ1ZTtcclxuICAgIC8qKiBEZWZpbml6aW9uZSBkaSBjb2xvbm5lIGRpbmFtY2hlIHBlciBsYSBtb2RhbGl0w6AsIGFwcHVudG8sIGRpbmFtaWNhICovXHJcbiAgICBASW5wdXQoKSBEeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb246IEVzVGFibGVDb2x1bW5zRGVmaW5pdGlvbltdID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egb3BlcmF6aW9uaSBkaW5hbWljaGUgZ2VuZXJpY2hlIGNoZSBwb3Nzb25vIGVzc2VyZSBlZmZldHR1YXRlIHBlciByaWdhLiBBcHBhaW9ubyBjb21lIGNvbG9ubmUgZXh0cmEgc3VsIGxhdG8gc2luaXN0cm8gZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgRHluYW1pY09wZXJhdGlvbnM6IEVzVGFibGVPcGVyYXRpb25EZWZpbml0aW9uW10gPSBbXTtcclxuICAgIC8qKiBJbmRpY2Egc2UgdmlzdWFsaXp6YXJlIGkgZGF0aSBpbiBtYW5pZXJhIGdlcmFyY2hpY2EgKi9cclxuICAgIEBJbnB1dCgpIEhpZXJhcmNoeTogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogTm9tZSBkZWxsYSBwcm9wcmlldMOgIGNoZSBjb250aWVuZSBsJ0lEIGRlbCBwYWRyZS4gRGEgdXRpbGl6emFyZSBzZSAqKkhpZXJhcmNoeSoqIMOoIGltcG9zdGF0byAqL1xyXG4gICAgQElucHV0KCkgUGFyZW50S2V5ID0gJyc7XHJcbiAgICAvKiogTm9tZSBkZWxsYSBwcm9wcmlldMOgIGNoZSBjb250aWVuZSBsJ0lEIGRlbGwnb2dnZXR0byBhdHR1YWxlLiBEYSB1dGlsaXp6YXJlIHNlICoqSGllcmFyY2h5Kiogw6ggaW1wb3N0YXRvICovXHJcbiAgICBASW5wdXQoKSBPd25LZXkgPSAnJztcclxuICAgIC8qKiBJbmRpY2Egc2UgcGFydGlyZSBjb24gdW4gYWxiZXJvIGVzcGFuc28uIERhIHV0aWxpenphcmUgc2UgKipIaWVyYXJjaHkqKiDDqCBpbXBvc3RhdG8gKi9cclxuICAgIEBJbnB1dCgpIFN0YXJ0c0V4cGFuZGVkID0gdHJ1ZTtcclxuICAgIC8qKiBJbmRpY2Egc2UgZWZmZXR0dWFyZSBpbCBzYWx2YXRhZ2dpbyBkZWxsZSBwcmVmZXJlbnplIGRpIHJpY2VyY2EgKi9cclxuICAgIEBJbnB1dCgpIFNhdmVQcmVmZXJlbmNlczogYm9vbGVhbiA9IG51bGw7XHJcblxyXG4gICAgLyoqIEluZGljYSBkb3ZlIHZpc3VhbGl6emFyZSBsZSBpbmZvcm1hemlvbmkgZGkgcGFnaW5hemlvbmUsIHNlIHNvcHJhLCBzb3R0byBvIGluIGVudHJhbWJpICovXHJcbiAgICBASW5wdXQoKSBQYWdpbmdTdHlsZTogJ2JvdGgnIHwgJ3RvcCcgfCAnYm90dG9tJyA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIGRvdmUgdmlzdWFsaXp6YXJlIGxlIGluZm9ybWF6aW9uaSBkaSBwYWdpbmF6aW9uZSwgc2Ugc29wcmEsIHNvdHRvIG8gaW4gZW50cmFtYmkgKi9cclxuICAgIEBJbnB1dCgpIFJvd0dyb3VwaW5nUGFnaW5nU3R5bGU6ICdsZWZ0JyB8ICdyaWdodCcgPSBudWxsO1xyXG4gICAgLyoqIFF1YWxvcmEgcGVyIHF1YWxzaWFzaSBtb3Rpdm8gbm9uIHZlbmlzc2UgdXNhdG8gKippdGVtcyoqIGRlbGwnQXBwU2VhcmNoIHF1ZXN0byBJbnB1dCBpbmRpY2EgcXVhbCDDqCBpbCBub21lIGRlbGxhIHByb3ByaWV0w6AgZGEgdXRpbGl6emFyZSAqL1xyXG4gICAgQElucHV0KCkgSXRlbVNvdXJjZVByb3BlcnR5OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgLyoqIEluZGljYSBzZSB1dGlsaXp6YXJlIGxhIGNhY2hlIGRpIHNlbGV6aW9uZSBjaGUgcGVybWV0dGUgZGkgbWFudGVuZXJlIGdsaSBzdGF0aSBkaSBzZWxlemlvbmUgZGVpIHZhcmkgb2dnZXR0aSBuYXZpZ2FuZG8gZGEgdW5hIHBhZ2luYSBhbGwnYWx0cmEgKi9cclxuICAgIEBJbnB1dCgpIFVzZVNlbGVjdGlvbkNhY2hlID0gbnVsbDtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBkZWNpZGVyZSBzZSwgaW4gbW9kYWxpdMOgIHJhZ2dydXBwYW1lbnRvLCBtb3N0cmFyZSBvIG1lbm8gaWwgdmFsb3JlIGRlbGxlIGNvbG9ubmUgZGkgZ3J1cHBvIG5lZ2xpIG9nZ2V0dGkgZmluYWxpLiBEaSBkZWZhdWx0IHNvbm8gbmFzY29zdGkgKi9cclxuICAgIEBJbnB1dCgpIFNob3dJdGVtR3JvdXBzQ29sdW1ucyA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIGNoZSB0dXR0aSBpIGNhbXBpIGNoZSBkZWZpbmlzY29ubyBsZSBtb2RhbGl0w6AgZGkgbW9kaWZpY2EgY2FtcG8gcG9zc29ubyBlc3NlcmUgbW9kaWZpY2F0aSBpbiBiYXNlIGFsbGUgaW1wb3N0YXppb25pICovXHJcbiAgICBASW5wdXQoKSBFZGl0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBzZSDDqCBwb3NzaWJpbGUgZWZmZXR0dWFyZSBzZWxlemlvbmkgYSByYW5nZSBwZXIgcG9pIGZhcmNpIGV2ZW50dWFsbWVudGUgY29waWEgaW5jb2xsYSAqL1xyXG4gICAgQElucHV0KCkgUmFuZ2VTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBJbmRpY2EgaWwgbnVtZXJvIGRpIG1pbGxpc2Vjb25kaSBwZXIgY3VpIGRlYm91bmNhcmUgaWwgd3JpdGVWYWx1ZSBwZXIgbGEgbW9kYWxpdMOgICoqRXNUYWJsZUhhbmRsZWRTZWFyY2gqKiAqL1xyXG4gICAgQElucHV0KCkgU2VhcmNoVGhyb3R0bGU6IG51bWJlciA9IDUwO1xyXG4gICAgLyoqIEV2ZW50byBjaGUgdmllbmUgcmljaGlhbWF0byBhbCBjYW1iaW8gZGkgb3JpZG5hbWVudG8gZGkgdW5hIGNvbG9ubmEgKi9cclxuICAgIEBPdXRwdXQoKSBvbk9yZGVyQ2hhbmdlZDogRXZlbnRFbWl0dGVyPEFwcE9yZGVyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8QXBwT3JkZXJpbmc+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmVudG8gY2hlIHZpZW5lIHJpY2hpYW1hdG8gcXVhbmRvIGwnZXMtdGFibGUgcml0aWVuZSBzaWEgbmVjZXNzYXJpbyByaS1lZmZldHR1YXJlIGxhIHJpY2VyY2EuXHJcbiAgICAgKiBJbCBib29sZWFubyBkZWxsJ2V2ZW50byBpbmRpY2Egc2UgdmllbmUgc3VnZ2VyaXRvIGRpIHJlc2V0dGFyZSBsYSBwYWdpbmEgbyBtZW5vLlxyXG4gICAgICogXHJcbiAgICAgKiBTb2xvIGluIGNhc28gdmVuZ2EgdXRpbGl6emF0YSBsYSBtb2RhbGl0w6AgYSByYWdncnVwcGFtZW50aSBkaSByaWdoZSBwdcOyIHN1Y2NlZGVyZSBjaGUgbCdlcy10YWJsZSBwYXNzaSB1biBpbnRlcm8gQXBwU2VhcmNoIGNvbWUgcGFyYW1ldHJvIGRpIHJpY2VyY2EsXHJcbiAgICAgKiBpbiBxdWVsIGNhc28gbCdhcHBsaWNhemlvbmUgcmljZXZlbnRlIGRvdnLDoCBvbm9yYXJlIGxhIHJpY2hpZXN0YSBzcGVkZW5kbyBhbCBiYWNrYW5kIGwnb2dnZXR0byBkaSByaWNlcmNhIEFTLUlTXHJcbiAgICAgKiBcclxuICAgICAqIGlsIHRpcG8gZGVsbCdFbWl0dGVyIGludmVjZSBkaSBlc3NlcmUgW2Jvb2xlYW4gfCBBcHBTZWFyY2g8YW55Pl0gw6ggc3RhdG8gaW1wb3N0YXRvIGEgXCJhbnlcIiBwZXIgZXZpdGFyZSBwcm9ibGVtaSBkaSByZXRyb2NvbXBhdGliaWxpdMOgXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBvblNlYXJjaFJlcXVlc3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICAvKiogRXZlbnRvIGNoZSBwYXJ0ZSBhZCBvZ25pIG1vZGlmaWNhIGRpIFwiY2hlY2thZ2dpb1wiIGluIGZvcm1hIGRpIGNvbW9kbyBhcnJheS4gRXNwb25lIGwnb2dnZXR0byBjb24gbG8gc3RhdG8gZGkgY2hlY2sgYXR0dWFsZSAqL1xyXG4gICAgQE91dHB1dCgpIG9uU2VsZWN0aW9uQ2hhbmdlZDogRXZlbnRFbWl0dGVyPEl0ZW1zU2VsZWN0aW9uPGFueT4+ID0gbmV3IEV2ZW50RW1pdHRlcjxJdGVtc1NlbGVjdGlvbjxhbnk+PigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIGFsbCdlbGltaW5hemlvbmUgZGkgdW4gb2dnZXR0byAqL1xyXG4gICAgQE91dHB1dCgpIG9uUmVtb3ZhbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIC8qKiBFdmVudG8gcmljaGlhbWF0byBhbGwnYW5udWxsYW1lbnRvIGRpIHVuJ2VsaW1pbmF6aW9uZSAqL1xyXG4gICAgQE91dHB1dCgpIG9uQWJvcnRSZW1vdmFsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIGFsbGEgbW9kaWZpY2EgZGVpIG1vZGVsbGkgYmluZGF0aSAqL1xyXG4gICAgQE91dHB1dCgpIG9uTW9kZWxDaGFuZ2U6IEV2ZW50RW1pdHRlcjxFc1RhYmxlTW9kZWxDaGFuZ2VbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPEVzVGFibGVNb2RlbENoYW5nZVtdPigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIGFsbCdhcGVydHVyYSBkZWwgbWVuw7kgY29udGVzdHVhbGUgKi9cclxuICAgIEBPdXRwdXQoKSBvbk9wZW5Db250ZXh0TWVudTogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIC8qKiBFdmVudG8gcmljaGlhbWF0byBxdWFuZG8gc2kgY2xpY2NhIHN1IHVuIG9wemlvbmUgZGVmaW5pdGEgbmVsbGUgKipDb3JuZXJNZW51T3B0aW9ucyoqICovXHJcbiAgICBAT3V0cHV0KCkgb25Db3JuZXJBY3Rpb246IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmcsIGVzdGFibGU6IGFueSB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nLCBlc3RhYmxlOiBhbnkgfT4oKTtcclxuICAgIC8qKiBFdmVudG8gcmljaGlhbWF0byBxdWFuZG8gc2kgY2xpY2NhIHN1IHVuIG9wemlvbmUgZGVmaW5pdGEgbmVsbGUgKipEeW5hbWljT3BlcmF0aW9ucyoqICovXHJcbiAgICBAT3V0cHV0KCkgb25EeW5hbWljT3BlcmF0aW9uOiBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nLCBpdGVtOiBhbnkgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IHN0cmluZywgaXRlbTogYW55IH0+KCk7XHJcblxyXG4gICAgLyoqIERhdGkgZXNwb3J0YXRpIGRhIG5neC1jc3YgKi9cclxuICAgIHB1YmxpYyBkYXRhOiBhbnlbXTtcclxuICAgIC8qKiBIZWFkZXIgZGVpIGRhdGkgZXNwb3J0YXRpIGRhIG5neC1jc3YgKi9cclxuICAgIHB1YmxpYyBoZWFkZXJzOiBDc3ZIZWFkZXJzW107XHJcbiAgICAvKiogRWxlbWVudG8gSFRNTCBkYSBjbGljY2FyZSBwZXIgbCdlc3BvcnRhemlvbmUgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2V4cG9ydERvd25sb2FkZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGV4cG9ydERvd25sb2FkZXI6IEVsZW1lbnRSZWY7XHJcbiAgICAvKiogUGxhY2Vob2xkZXIgZGkgbWVuw7kgY29udGVzdHVhbGUgcGVyIHF1YW5kbyBub24gY2kgc29ubyBvcHppb25pIG5lbCBwbGFjZWhvbGRlciBcIlZlcm9cIiAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2VtcHR5TWVudScsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyB0YWJsZUVtcHR5TWVudTogQ29udGV4dE1lbnVDb21wb25lbnQ7XHJcblxyXG4gICAgLyoqIFN1YnNjcmlwdGlvbiBzdWxsJ2FwZXJ0dXJhIGRlbCBjb250ZXh0IG1lbnUgZGEgcmlwdWxpcmUgYWwgZGVzdHJveSBkZWxsYSBjbGFzc2UgKi9cclxuICAgIHByaXZhdGUgY3R4TWVudVN1YnNjcmlwdGlvbjogYW55O1xyXG5cclxuICAgIC8qKiBQYWdpbmEgaW4gdmlzdWFsaXp6YXppb25lIChkdXJhbnRlIGxhIHBhZ2luYXppb25lIGluIG1vZGFsaXTDoCBBcnJheSkgKi9cclxuICAgIHB1YmxpYyBhcnJheW1vZGVQYWdlID0gMTtcclxuICAgIC8qKiBOdW1lcm8gZGkgcGFnaW5lIChkdXJhbnRlIGxhIHBhZ2luYXppb25lIGluIG1vZGFsaXTDoCBBcnJheSkgKi9cclxuICAgIHB1YmxpYyBhcnJheW1vZGVQYWdlcyA9IDE7XHJcbiAgICAvKiogT2dnZXR0aSBwZXIgb2duaSBwYWdpbmEgKGR1cmFudGUgbGEgcGFnaW5hemlvbmUgaW4gbW9kYWxpdMOgIEFycmF5KSAqL1xyXG4gICAgQElucHV0KCkgQXJyYXltb2RlSXRlbXNQZXJQYWdlID0gbnVsbDtcclxuICAgIC8qKiBPZ2dldHRvIGRpIHNlbGV6aW9uZSBwZXIgbGEgbW9kYWxpdMOgIEFycmF5LCBjaGUgZGV2ZSBjb21wb3J0YXJzaSBjb21lIGxhIGNvbnRyb3BhcnRlIGluIG1vZGFsaXTDoCBWaWV3ICovXHJcbiAgICBwdWJsaWMgYXJyYXltb2RlU2VsZWN0aW9uOiBJdGVtc1NlbGVjdGlvbjxhbnk+O1xyXG4gICAgLyoqIENvbG9ubmUgZGEgdmlzdWFsaXp6YXJlIGluIG1vZGFsaXTDoCBhcnJheSAqL1xyXG4gICAgcHVibGljIGFycmF5Q29sdW1uczogc3RyaW5nW10gPSBbXTtcclxuICAgIC8qKiBPcmRpbmUgZGVsbGUgY29sb25uZSBkYSB2aXN1YWxpenphcmUgaW4gbW9kYWxpdMOgIGFycmF5ICovXHJcbiAgICBwdWJsaWMgYXJyYXlDb2x1bW5PcmRlcmluZzogc3RyaW5nW10gPSBbXTtcclxuICAgIC8qKiBPcmRpbmFtZW50aSBBU0MtREVTQyBzdWxsZSBjb2xvbm5lIGluIG1vZGFsaXTDoCBhcnJheSAqL1xyXG4gICAgcHVibGljIGFycmF5T3JkZXJzOiBBcHBPcmRlcmluZ1tdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYXJpYWJpbGUgY2hlIHNlcnZlIGEgZ2VzdGlyZSBpbCBtb21lbnRvIGluIGN1aSBsJ2VzLXRhYmxlIGFnZ2lvcm5hIGxhIHBhZ2luYXppb25lIChwdWxzYW50aSBlY2MpLlxyXG4gICAgICogRXNzZW5kbyBvcGVyYXppb25pIGNvbXVucXVlIGNvc3Rvc2UgbGUgZWZmZXR0dW8gc29sbyBzdSBiaW5kaW5nIGVzdGVybmksIG5vbiBzdSByZXdyaXRlIGdlbmVyYXRpIGludGVybmFtZW50ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGludGVybmFsV3JpdGVDYWxsID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWNoZSBjaGUgY29udGVycsOgIHR1dHRlIGxlIHJpY2VyY2hlIGVmZmV0dHVhdGUgc3UgZ3J1cHBpIGRpdmVyc2kgZGFsIHByaW1vIGUgc3UgZWxlbWVudGkgY29udGVudXRpIG5laSBncnVwcGkuXHJcbiAgICAgKiBJbiBjYXNvIGRpIGNhbWJpIGRpIG9yZGluYW1lbnRvIGRlbGxlIGNvbG9ubmUgZGl2ZXJzZSBkYWxsYSBwcmltYSB0dXR0ZSBsZSBjaGlhbWF0ZSBmYXR0ZSBkYWwgc2Vjb25kbyBsaXZlbGxvIGluIHBvaSBkZXZvbm8gZXNzZXJlIHJpZXNlZ3VpdGUgc2Vjb25kbyBsYSBzZWd1ZW50ZSBsb2dpY2E6XHJcbiAgICAgKiBcclxuICAgICAqIFxyXG4gICAgICogKipDYW1iaW8gb3JkaW5hbWVudG8gc3VsIHByaW1vIGdydXBwbyoqOiByZWxvYWQgY29tcGxldG8sIG5vbiBtaSBvY2N1cG8gZGkgcmlwdWxpcmUgZ2xpIGVsZW1lbnRpIGJpbmRhdGkgaW4gYWxjdW4gbW9kb1xyXG4gICAgICogXHJcbiAgICAgKiAqKkNhbWJpbyBvcmRpbmFtZW50byBzdWxsYSBjb2xvbm5hIHJlbGF0aXZhIGFsbCdOLWVzaW1vIGdydXBwbyoqOiByZWxvYWQgY29tcGxldG8gZGVsIGNvbnRlbnV0byBkZWkgZ3J1cHBpIHByZWNlZGVudGksIHJpcHVsZW5kbyBwcmVjZWRlbnRlbWVudGUgXHJcbiAgICAgKiB0dXR0aSBnbGkgZWxlbWVudGkgY29uICoqX2dyb3VwbGV2ZWwqKiA9IE5cclxuICAgICAqIFxyXG4gICAgICogKipDYW1iaW8gb3JkaW5hbWVudG8gc3UgdW5hIGNvbG9ubmEgbm9uIHJhZ2dydXBwYXRhKio6IHJlbG9hZCBjb21wbGV0byBwZXIgdHV0dGkgaSBncnVwcGkgZmluYWxpIGFwZXJ0aSwgZGV2byBwcmVjZWRlbnRlbWVudGUgcmlwdWxpcmUgdHV0dGkgZ2xpIGVsZW1lbnRpIGNvbiAqKl9pdGVtKiogPSB0cnVlXHJcbiAgICAgKiBcclxuICAgICAqIEFsdHJpIGV2ZW50aSBub24gZG92cmViYmVybyByYXBwcmVzZW50YXJlIHByb2JsZW1pOlxyXG4gICAgICogLSBTZWxlemlvbmU6IG5vbiBjYW1iaWEgbnVsbGFcclxuICAgICAqIC0gUGFnaW5hemlvbmU6IGNhbWJpYSBhIGxpdmVsbG8gcm9vdCBxdWluZGkgdmllbmUgcmljYXJpY2F0byB0dXR0byBjb211bnF1ZSwgc3Rlc3NvIHZhbGUgcGVyIGxlIHBhZ2luYXppb25pIGludGVybmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZTogeyBwYXRoOiBzdHJpbmcsIHJvdXRlOiBHcm91cFJvdXRlRnJhZ21lbnRbXSwgdmlldzogQXBwU2VhcmNoPGFueT4sIGdyb3VwX2NvbHVtbjogc3RyaW5nIH1bXSA9IFtdO1xyXG5cclxuICAgIC8qKiBWYXJpYWJpbGUgZCdhcHBvZ2dpbyBwZXIgY2FwaXJlIHNlIGMnw6ggYmlzb2dubyBkaSByaS1lZmZldHR1YXJlIHVuYSByaWNlcmNhIG8gbWVubyAqL1xyXG4gICAgcHJpdmF0ZSBSZXNlYXJjaE5lZWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIENvbG9ubmUgdmlzaWJpbGkgZGVsbGEgdmlzdGEgYXR0dWFsZS4gVmFsb3JpenphdG8gZGkgZGVmYXVsdCBhbCBudW1lcm8gbWFzc2ltbyBkaSBjb2xvbm5lIHN1cHBvcnRhdGUgZGFsbGEgdGFiZWxsYSBwZXIgbGUgY2FzaXN0aWNoZSBpbiBhc3NlbnphIGRpIGN1c3RvbSBjZWxscyAqL1xyXG4gICAgcHVibGljIENvbHVtbnM6IHsgVmlzaWJpbGU6IG51bWJlciwgVmlzaWJsZVVucGlubmVkOiBudW1iZXIsIEdsb2JhbDogbnVtYmVyIH0gPSB7IFZpc2liaWxlOiAxMDAsIFZpc2libGVVbnBpbm5lZDogMTAwLCBHbG9iYWw6IDEwMCB9O1xyXG4gICAgLyoqIEluIGNhc28gZGkgUm93IEdyb3VwaW5nIHF1aSB2aWVuZSBzYWx2YXRhIGxhIHZpc3RhIHByaW5jaXBhbGUgZGVpIGdydXBwaSBiYXNlICovXHJcbiAgICBwdWJsaWMgTWFpbkdyb3VwVmlldzogQXBwU2VhcmNoPGFueT4gPSBudWxsO1xyXG4gICAgLyoqIENvbnRlZ2dpbyBiYXNlIGRlZ2xpIG9nZ2V0dGkuIEluIG1vZGFsaXTDoCBub3JtYWxlIHZpZW5lIHJlc2V0dGF0byBhZCBvZ25pIG51b3ZhIFZpZXcgaW5zZXJpdGEsIGluIG1vZGFsaXTDoCBSb3dHcm91cGluZyB2aWVuZSByZXNldHRhdG8gc29sbyBhZCB1bmEgbnVvdmEgVmlldyBkaSBsaXZlbGxvIFwiMFwiICovXHJcbiAgICBwdWJsaWMgQmFzZUl0ZW1zQ291bnQgPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBjaSBzb25vIGRlbGxlIGNvbG9ubmUgcGlubmF0ZSBlIHZpc2liaWxpLiBTZXJ2ZSBwZXIgcG90ZXIgc2V0dGFyZSB0dXR0ZSBsZSBjb2xvbm5lIHByaW1hIGNoZSBhcnJpdmlubyBkYXRpIGEgcGlubmVkKi9cclxuICAgIHB1YmxpYyBIYXNQaW5uZWRDb2x1bW5zOiBib29sZWFuXHJcbiAgICAvKiogTGFyZ2hlenphIGNhbGNvbGF0YSBkZWwgY29udGFpbmVyIGRlbGxlIGNvbG9ubmUgcGlubmF0ZSAqL1xyXG4gICAgcHVibGljIFBpbm5lZENvbnRhaW5lcldpZHRoOiBudW1iZXI7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5vbm9zdGFudGUgc2lhbW8gaW4gbW9kYWxpdMOgIGFycmF5IHNvbm8gc3RhdGkgaW5kaXZpZHVhdGkgZGVpIGdydXBwaS4gSW4gdGFsIGNhc28gZXMtdGFibGUgc2kgY29tcG9ydGEgZGEgcHNldWRvIGJhY2tlbmQgZWQgZWZmZXR0dWEgbGUgYWdncmVnYXppb25pIGUgcmFnZ3J1cHBhbWVudGkgY29tcGxldGFtZW50ZSBsYXRvIGNsaWVudCAqL1xyXG4gICAgcHVibGljIEFycmF5R3JvdXBpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBJbmRpY2EgY2hlIGwnZXMtdGFibGUgw6ggYmFzYXRhIHN1bGxlIGRpcmV0dGl2ZSAobnVvdmEgbW9kYWxpdMOgKSAqL1xyXG4gICAgcHVibGljIERpcmVjdGl2ZXNCYXNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBsbyBzdGF0byBkaSBzZWxlemlvbmUgcGVyIHNpbmdvbGEgY2VsbGEgKi9cclxuICAgIHB1YmxpYyBzZWxlY3Rpb25TdGF0dXM6IHsgW2luZGV4OiBudW1iZXJdOiB7IFtpbmRleDogbnVtYmVyXTogSXRlbVByb3BFZGl0YWJsZVJlZmVyZW5jZSB9IH0gPSB7fTtcclxuICAgIC8qKiBDaGlhbWF0YSByZWFsZSBhbCB3cml0ZVZhbHVlIGRvcG8gaWwgcGFzc2FnZ2lvIGRpICoqU2VhcmNoVGhyb3R0bGUqKiBtaWxsaXNlY29uZGkuIFNvbG8gbW9kYWxpdMOgIEVzVGFibGVIYW5kbGVkU2VhcmNoICovXHJcbiAgICBwcml2YXRlIGNhbGxUaW1lb3V0IDogYW55ID0gbnVsbDtcclxuXHJcbiAgICAvKiogT3B6aW9uaSBkaSBwYWdpbmF6aW9uZSAqL1xyXG4gICAgcHVibGljIFBhZ2VyT3B0aW9uczogeyBQYWdlckNvdW50OiBudW1iZXIsIFNob3dDb3VudDogYm9vbGVhbiwgU2hvd1BhZ2luZzogYm9vbGVhbiwgVXNlc1ZpZXc6IGJvb2xlYW4sIFNob3dCdXR0b25zOiBib29sZWFuLCBTaG93UGFnaW5nT3B0aW9uczogYm9vbGVhbiwgVmlldzogYW55LCBSZWFkeTogYm9vbGVhbiwgU2VhcmNoZXM6ICdpdGVtcycgfCAnZ3JvdXBzJyB9ID1cclxuICAgICAgICB7IFBhZ2VyQ291bnQ6IG51bGwsIFNob3dDb3VudDogdHJ1ZSwgU2hvd1BhZ2luZzogdHJ1ZSwgU2hvd0J1dHRvbnM6IHRydWUsIFNob3dQYWdpbmdPcHRpb25zOiB0cnVlLCBVc2VzVmlldzogdHJ1ZSwgVmlldzogbnVsbCwgUmVhZHk6IGZhbHNlLCBTZWFyY2hlczogJ2l0ZW1zJyB9O1xyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgLy8gY2xpY2sgZGVzdHJvIHN1IHVuYSByaWdhIGNvbiBzZWxlemlvbmUgYXR0aXZhOiBUaXJvIGZ1b3JpIGlsIGNvbnRleHQgbWVudSBlIHNlbGV6aW9uZSBsJ2VsZW1lbnRvIGNvcnJlbnRlXHJcbiAgICAgICAgdGhpcy5jdHhNZW51U3Vic2NyaXB0aW9uID0gKHRoaXMuQ29udGV4dE1lbnUgfHwgdGhpcy50YWJsZUVtcHR5TWVudSkub3Blbi5zdWJzY3JpYmUodCA9PiB7XHJcbiAgICAgICAgICAgIC8vIEdydXBwaSB2YSBiZW5lLCBvZ2dldHRpIHB1cmUsIG1hIHNlcGFyYXRvcmkgZnJhIGdydXBwaSBwcm9wcmlvIG5vLi4uXHJcbiAgICAgICAgICAgIGlmICh0Lml0ZW0uX3NlcCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgbGV0IHNob3VsZEVtaXQgPSAhdC5pdGVtLl9zZWxlY3RlZDtcclxuXHJcbiAgICAgICAgICAgIHQuaXRlbS5fc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzKCk7XHJcbiAgICAgICAgICAgIHZhciBpdGVtU2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25fSC5oYW5kbGVJdGVtc1NlbGVjdGlvbihbdC5pdGVtXSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNob3VsZEVtaXQpXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KGl0ZW1TZWxlY3Rpb24pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIC8vIFNlIHV0aWxpenpvIGxhIG5ldyBzcGljeSBtb2RlIGRlZHVjbyB0dXR0aSBpIHBhcmFtZXRyaSBkaSBsYXZvcm8gcG9zc2liaWxpIGFsIGNhcmljYW1lbnRvIGRlbGxhIHRhYmVsbGFcclxuICAgICAgICAvLyBWZW5nb25vIHNvdnJhc2NyaXR0ZSBzb2xvIGxlIHByb3ByaWV0w6Agbm9uIGltcG9zdGF0ZSBkYWxsJ3V0ZW50ZVxyXG4gICAgICAgIGxldCB0ZHNEID0gdGhpcy5Fc1Rkc0RpcmVjdGl2ZS5sZW5ndGggPT0gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUZHNEaXJlY3RpdmU/Lmxlbmd0aCA+IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGRzRGlyZWN0aXZlIDogdGhpcy5Fc1Rkc0RpcmVjdGl2ZSA6IHRoaXMuRXNUZHNEaXJlY3RpdmU7XHJcbiAgICAgICAgbGV0IHRoc0QgPSB0aGlzLkVzVGhzRGlyZWN0aXZlLmxlbmd0aCA9PSAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Roc0RpcmVjdGl2ZT8ubGVuZ3RoID4gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUaHNEaXJlY3RpdmUgOiB0aGlzLkVzVGhzRGlyZWN0aXZlIDogdGhpcy5Fc1Roc0RpcmVjdGl2ZTtcclxuICAgICAgICBsZXQgdXNlc1Roc0FuZFRkc0RpcmVjdGl2ZXMgPSB0ZHNEICYmIHRkc0QubGVuZ3RoID4gMCAmJiB0aHNEICYmIHRoc0QubGVuZ3RoID4gMDtcclxuICAgICAgICBsZXQgaGFzTm9Db250ZW50UHJvamVjdGlvbiA9ICF0aGlzLmJvZHlSZWYgJiYgIXRoaXMuaGVhZGVyUmVmICYmICF0aGlzLmhlYWRlckdyb3VwUmVmICYmICF0aGlzLnNlY29uZGFyeUhlYWRlckdyb3VwUmVmO1xyXG5cclxuICAgICAgICBpZiAodXNlc1Roc0FuZFRkc0RpcmVjdGl2ZXMgfHwgaGFzTm9Db250ZW50UHJvamVjdGlvbikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5Vc2VDdXN0b21DZWxscyA9PSBudWxsKSB0aGlzLlVzZUN1c3RvbUNlbGxzID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuSGlkZGVuQ29sdW1ucyA9PSBudWxsICYmIHRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHRoaXMuSGlkZGVuQ29sdW1ucyA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkNvbHVtbnNPcmRlcmluZyA9PSBudWxsICYmIHRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHRoaXMuQ29sdW1uc09yZGVyaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuT3JkZXJCeUNvbHVtbiA9PSBudWxsICYmIHRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHRoaXMuT3JkZXJCeUNvbHVtbiA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNlbGVjdEFsbCA9PSBudWxsICYmIHRoaXMuU2VsZWN0aW9uKSB0aGlzLlNlbGVjdEFsbCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNoaWZ0Q2xpY2sgPT0gbnVsbCAmJiB0aGlzLlNlbGVjdGlvbikgdGhpcy5TaGlmdENsaWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5EaXJlY3RpdmVzQmFzZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9QZXIgcG90ZXIgY2FtYmlhcmUgaWwgbGF5b3V0IGluIGJhc2UgYWwgbGl2ZWxsbyBnZXJhcmNoaWNvIGlsIGNvbXBvbmVudGUgZGV2YSBhdmVyZSBpbCBwaWVubyBjb250cm9sbG8gZGkgb2duaSBjZWxsYSxcclxuICAgICAgICAvL2NoZSBjb24gc29sbyBsYSBwcm9pZXppb25lIChzZW56YSBjZWxsZSBjdXNvdG0pIG5vbiDDqCBkaXNwb25pYmlsZVxyXG4gICAgICAgIGlmICh0aGlzLkhpZXJhcmNoeSAmJiAhdGhpcy5Vc2VDdXN0b21DZWxscylcclxuICAgICAgICAgICAgdGhyb3cgXCJFcy10YWJsZSBlcnJvcjogUGVyIHBvdGVyIHV0aWxpenphcmUgbCdlcy10YWJsZSBjb24gW0hpZXJhcmNoeV09XFxcInRydWVcXFwiIMOoIHJpY2hpZXN0byBhbmNoZSBbVXNlQ3VzdG9tQ2VsbHNdPVxcXCJ0cnVlXFxcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29weVN1YnNjcmlwdGlvbilcclxuICAgICAgICAgICAgdGhpcy5jb3B5U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhc3RlU3Vic2NyaXB0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLnBhc3RlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN0eE1lbnVTdWJzY3JpcHRpb24pXHJcbiAgICAgICAgICAgIHRoaXMuY3R4TWVudVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIGxldCBuZXdTZWFyY2hWaWV3ID0gY2hhbmdlc1snU2VhcmNoVmlldyddO1xyXG4gICAgICAgIGlmIChuZXdTZWFyY2hWaWV3ICYmIHRoaXMuU2VhcmNoVmlldylcclxuICAgICAgICAgICAgdGhpcy5hcnJheVB1bHNhbnRpID0gdGhpcy51dGlsaXRpZXNfSC5nZXRQYWdlc0FycmF5KDYsIHRoaXMuU2VhcmNoVmlldy5wYWdlLCB0aGlzLlNlYXJjaFZpZXcucGFnZXMgfHwgMSwgdGhpcy5TZWFyY2hWaWV3Lm9iamVjdGNvdW50LCB0aGlzLlNlYXJjaFZpZXcuaXRlbXNwZXJwYWdlb3ZlcnJpZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbik6IHZvaWQgeyB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuOyB9XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKTogdm9pZCB7IH1cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgY2hhbmdlZChjbGVhckl0ZW1zOiBib29sZWFuID0gZmFsc2UpIHsgXHJcbiAgICAgICAgaWYoY2xlYXJJdGVtcyAmJiB0aGlzLnZpZXdNb2RlKVxyXG4gICAgICAgICAgICAoPEFwcFNlYXJjaDxhbnk+PnRoaXMuVmlldykuaXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5WaWV3KTsgXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyBhc3luYyB3cml0ZVZhbHVlKG9iajogYW55LCB0aHJvdHRsZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICB0aGlzLlZpZXcgPSBvYmogPyBvYmogOiBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5Fc1RhYmxlSGFuZGxlZFNlYXJjaCAmJiB0aHJvdHRsZSkge1xyXG4gICAgICAgICAgICBpZih0aGlzLmNhbGxUaW1lb3V0KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2FsbFRpbWVvdXQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jYWxsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLndyaXRlVmFsdWUob2JqLCBmYWxzZSk7IH0sIHRoaXMuU2VhcmNoVGhyb3R0bGUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgXHJcbiAgICAgICAgLy8gTWkgw6ggYXJyaXZhdGEgbCdBcHBTZWFyY2ggcXVpbmRpIGRpIHNpY3VybyBub24gaG8gdW5hIHJpY2VyY2EgaW4gcHJvZ3Jlc3NcclxuICAgICAgICB0aGlzLnJlc2VhcmNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuVmlldyAmJiAhdGhpcy5TZWFyY2hWaWV3KSB7XHJcbiAgICAgICAgICAgIC8vIFN1IHZpZXcgbnVsbGEgZXZpdG8gZGkgZmFyZSBwcmVzc29jaMOpIHF1YWxzaWFzaSBjb3NhLiBTZSBhcnJpdmEgdW4gbnVsbCBkZXZvIGFuY2hlIGFzc2ljdXJhcm1pIGRpIG5vbiBtb3N0cmFyZSBudWxsYVxyXG4gICAgICAgICAgICB0aGlzLmJvdW5kU291cmNlID0gdGhpcy5UTVBCb3VuZFNvdXJjZSB8fCBbXTtcclxuXHJcbiAgICAgICAgICAgIC8vIFBlciBlc3NlcmUgc2ljdXJvIGNoZSBkb3BvIHVuIGJpbmQgZGkgb2dnZXR0aSBsYSBlcy10YWJsZSBhZ2dpb3JuaSBsYSBncmFmaWNhXHJcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZSBwZXIgc2JhZ2xpbyBsJ29nZ2V0dG8gY2hlIG1pIGFycml2YSBub24gw6ggdGlwaXp6YXRvIChpbnN0YW5jZW9mIEFwcFNlYXJjaCByZXN0aXR1aXNjZSBmYWxzZSBhbmNoZSBzZSDDqCBkZWwgdGlwbyBnaXVzdG8pXHJcbiAgICAgICAgLy8gbG8gY29ycmVnZ28tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgIGlmICh0aGlzLlZpZXcgJiYgdHlwZW9mICh0aGlzLlZpZXcgYXMgYW55KS5pdGVtc3BlcnBhZ2VvdmVycmlkZSAhPSAndW5kZWZpbmVkJyAmJiAhKHRoaXMuVmlldyBpbnN0YW5jZW9mIEFwcFNlYXJjaCkpXHJcbiAgICAgICAgICAgICh0aGlzLlZpZXcgYXMgYW55KS5fX3Byb3RvX18gPSBuZXcgQXBwU2VhcmNoKCk7XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5TZWFyY2hWaWV3ICYmIHR5cGVvZiAodGhpcy5TZWFyY2hWaWV3IGFzIGFueSkuaXRlbXNwZXJwYWdlb3ZlcnJpZGUgIT0gJ3VuZGVmaW5lZCcgJiYgISh0aGlzLlNlYXJjaFZpZXcgaW5zdGFuY2VvZiBBcHBTZWFyY2gpKVxyXG4gICAgICAgICAgICAodGhpcy5TZWFyY2hWaWV3IGFzIGFueSkuX19wcm90b19fID0gbmV3IEFwcFNlYXJjaCgpO1xyXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuVmlldyAmJiB0aGlzLlZpZXcgaW5zdGFuY2VvZiBBcHBTZWFyY2gpIHtcclxuICAgICAgICAgICAgLy8gU2UgY2FtYmlhIGwnb2dnZXR0byBpbnRlcm8gc2lnbmlmaWNhIGNoZSBobyByaW1hbmRhdG8gbGEgcmljZXJjYVxyXG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ3ZpZXcnKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBmaXJzdEl0ZW1Hcm91cE9yTm9Hcm91cGluZyA9ICh0aGlzLlZpZXcucmVxdWVzdGVkZ3JvdXBzPy5sZW5ndGggfHwgMCkgPT0gMDtcclxuXHJcbiAgICAgICAgICAgIC8vIFNlIHZlbmdvIGRhIHVuYSByaWNlcmNhIGludGVybmEgbWFudGVuZ28gbG8gc3RhdG8gZGkgc2VsZXppb25lIHByZWNlZGVudGUgKHF1aW5kaSBzdSBjYW1iaW8gcGFnaW5hLCBjYW1iaW8gaXBwLCBlY2MuLi4pXHJcbiAgICAgICAgICAgIC8vIHNlIGludmVjZSBsJ3V0ZW50ZSBoYSBmYXR0byB1bmEgcmljZXJjYSBsdWkgKHF1aW5kaSBjYW1iaWFuZG8gZmlsdHJpKSwgc2VjY28gbGUgaW5mbyBkaSBzZWxlemlvbmVcclxuICAgICAgICAgICAgaWYgKCF0aGlzLlZpZXcuc2VsZWN0aW9uIHx8ICghdGhpcy5WaWV3LmludGVybmFsc2VhcmNocmVxdWVzdCAmJiBmaXJzdEl0ZW1Hcm91cE9yTm9Hcm91cGluZykgfHwgIXRoaXMuVXNlU2VsZWN0aW9uQ2FjaGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJTZWxlY3Rpb25DYWNoZXMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuVmlldy5zZWxlY3Rpb24gPSBuZXcgSXRlbXNTZWxlY3Rpb24oW10pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQuZW1pdCh0aGlzLlZpZXcuc2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5WaWV3LmludGVybmFsc2VhcmNocmVxdWVzdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVjdXBlcm8gUHJlZmVyZW5jZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5TYXZlUHJlZmVyZW5jZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uZ0NvbnRyb2wubmFtZSlcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm9uIHBvc3NvIHV0aWxpenphcmUgbGUgcHJlZmVyZW5jZSBzZW56YSBhdmVyZSB1biAnbmFtZScgcGVyIHF1ZXN0YSB0YWJlbGxhXCIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMucHJlZlNlcnZpY2UpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vbiBwb3NzbyB1dGlsaXp6YXJlIGxlIHByZWZlcmVuY2Ugc2VuemEgY2hlIGlsIHBhY2NoZXR0byBAZXNmYWVuemEvcHJlZmVyZW5jZXMgc2lhIGluc3RhbGxhdG9cIik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJlZnMgPSBhd2FpdCB0aGlzLnByZWZTZXJ2aWNlLmdldEl0ZW08eyBjb2x1bW5zOiBzdHJpbmdbXSwgY29sdW1uX29yZGVyaW5nOiBzdHJpbmdbXSwgb3JkZXJzOiBBcHBPcmRlcmluZ1tdIH0+KDxzdHJpbmc+dGhpcy5uZ0NvbnRyb2wubmFtZSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzaSBsYSBnZW50ZSBzaSBtZXR0YSBhIHNwYW1tYXJlIHJlZnJlc2ggY29uIG5naWYgc3RyYW5pIHN1bGwnZXN0YWJsZSBjcmVhbmRvbGEgZSBkaXN0cnVnZ2VuZG9sYSBOIHZvbHRlIGFsIHNlY29uZG8gbmVsIHRlbXBvIGNoZSBjaSBtZXR0ZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGlyYXJlIHN1IGxlIHByZWZlcmVuY2UgZGEgcXVpIHNvcHJhIGxhIFZpZXcgcG90cmViYmUgZXNzZXJlIGNhbWJpYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuVmlldykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29scyA9IHByZWZzPy5jb2x1bW5zIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZFByZWZzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcG9zaXRvcnk6IHN0cmluZ1tdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlOiBzdHJpbmdbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlZpZXcucmVwb3J0X2NvbHVtbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSB0aGlzLlZpZXcucmVwb3J0X2NvbHVtbnMubWFwKHQgPT4gdC5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSBjb2xzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IGNvbHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSB0aGlzLlZpZXcuY29sdW1ucztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gbW9kYWxpdMOgIHJlcG9ydCBkZXZvIGNvbnRyb2xsYXJlIGNoZSB0dXR0ZSBsZSBjb2xvbm5lIHNhbHZhdGUgZmFjY2lhbm8gcGFydGUgZGVsbGEgdmlzdGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gbW9kYWxpdMOgIG5vcm1hbGUgaW52ZWNlIHNlIGxlIHByZWZlcmVuemUgZmFubm8gcmlmZXJpbWVudG8gYSBkZWxsZSBjb2xvbm5lIGNoZSBpbyBub24gaG8gbmVsbGEgVmlldyBhdHR1YWxlIHNpZ25pZmljYSBjaGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvIGZhY2VuZG8gcmlmZXJpbWVudG8gYSB1bmEgdmVyc2lvbmUgdmVjY2hpYSBkZWxsJ2VzLXRhYmxlLCBxdWluZGkgbm9uIGZhY2NpbyBvcGVyYXppb25pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwb3NpdG9yeS5pbmRleE9mKHNvdXJjZVtpXSkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUHJlZnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2UgbWkgYmFzbyBzdSBkaXJldHRpdmUgbWEgbmVsbGUgcHJlZmVyZW5jZSDDqCBwcmVzZW50ZSBhbmNoZSBzb2xvIHVuYSBjb2xvbm5hIG5vbiBwcmVzZW50ZSBuZWxsZSBkaXJldHRpdmUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZ1b2wgZGlyZSBjaGUgbCdlcy10YWJsZSDDqCBjYW1iaWF0YSBxdWluZGkgbm9uIGltcG9zdG8gcHJlZmVyZW5jZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuRXNUaHNEaXJlY3RpdmU/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcnIgPSB0aGlzLkVzVGhzRGlyZWN0aXZlLnRvQXJyYXkoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRoc0NhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogRXNUaERpcmVjdGl2ZSB9ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aCA9IGFycltpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHNDYWNoZVt0aC50aF0gPSB0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVwb3NpdG9yeS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhzQ2FjaGVbcmVwb3NpdG9yeVtpXV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByZWZzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRQcmVmcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WaWV3LmNvbHVtbnMgPSBwcmVmcz8uY29sdW1ucyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5jb2x1bW5fb3JkZXJpbmcgPSBwcmVmcz8uY29sdW1uX29yZGVyaW5nIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2UgbGUgcHJlZiBzb25vIG51bGxlIG5vbiBzb3ZyYXNjcml2byBnbGkgb3JkaW5pIGRhdG8gY2hlIHBvdHJlYmJlIHNlcnZpcmUgbWV0dGVyZSBkZWdsaSBvcmRpbmFtZW50aSBkaSBkZWZhdWx0IGxhdG8gdHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZWZzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5vcmRlcnMgPSBwcmVmcz8ub3JkZXJzIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBMYSBwYWdpbmF6aW9uZSBkZXZvIGZhcmxhIHNvbGFtZW50ZSBxdWFuZG8gcmljaGllZG8gbyB1biBncnVwcG8gcHJpbmNpcGFsZSAoc2Ugc29ubyBpbiByb3cgZ3JvdXBpbmcpIG8gc2Ugbm9uIHJpY2hpZWRvIGdydXBwaSAoaW4gdHV0dGkgbGdpIGFsdHJpIGNhc2kpXHJcbiAgICAgICAgICAgIGlmIChmaXJzdEl0ZW1Hcm91cE9yTm9Hcm91cGluZylcclxuICAgICAgICAgICAgICAgIHRoaXMuYXJyYXlQdWxzYW50aSA9IHRoaXMudXRpbGl0aWVzX0guZ2V0UGFnZXNBcnJheSg2LCB0aGlzLlZpZXcucGFnZSwgdGhpcy5WaWV3LnBhZ2VzIHx8IDEsIHRoaXMuVmlldy5pdGVtcy5sZW5ndGgsIHRoaXMuVmlldy5pdGVtc3BlcnBhZ2VvdmVycmlkZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuVmlldyAmJiAodGhpcy5WaWV3Lmxlbmd0aCAhPSBudWxsICYmIHRoaXMuVmlldy5sZW5ndGggIT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ2FycmF5Jyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuVXNlU2VsZWN0aW9uQ2FjaGUgfHwgIXRoaXMuYXJyYXltb2RlU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uQ2FjaGVzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFycmF5bW9kZVNlbGVjdGlvbiA9IG5ldyBJdGVtc1NlbGVjdGlvbihbXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHRoaXMuYXJyYXltb2RlU2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUmVjdXBlcm8gUHJlZmVyZW5jZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5TYXZlUHJlZmVyZW5jZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uZ0NvbnRyb2wubmFtZSlcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm9uIHBvc3NvIHV0aWxpenphcmUgbGUgcHJlZmVyZW5jZSBzZW56YSBhdmVyZSB1biAnbmFtZScgcGVyIHF1ZXN0YSB0YWJlbGxhXCIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMucHJlZlNlcnZpY2UpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vbiBwb3NzbyB1dGlsaXp6YXJlIGxlIHByZWZlcmVuY2Ugc2VuemEgY2hlIGlsIHBhY2NoZXR0byBAZXNmYWVuemEvcHJlZmVyZW5jZXMgc2lhIGluc3RhbGxhdG9cIik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJlZnMgPSBhd2FpdCB0aGlzLnByZWZTZXJ2aWNlLmdldEl0ZW08eyBjb2x1bW5zOiBzdHJpbmdbXSwgY29sdW1uX29yZGVyaW5nOiBzdHJpbmdbXSwgb3JkZXJzOiBBcHBPcmRlcmluZ1tdIH0+KDxzdHJpbmc+dGhpcy5uZ0NvbnRyb2wubmFtZSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbHMgPSBwcmVmcz8uY29sdW1ucyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZFByZWZzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVwb3NpdG9yeTogc3RyaW5nW107XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZTogc3RyaW5nW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlZpZXcucmVwb3J0X2NvbHVtbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucy5tYXAodCA9PiB0LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gY29scztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBjb2xzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSB0aGlzLlZpZXcuY29sdW1ucztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCByZXBvcnQgZGV2byBjb250cm9sbGFyZSBjaGUgdHV0dGUgbGUgY29sb25uZSBzYWx2YXRlIGZhY2NpYW5vIHBhcnRlIGRlbGxhIHZpc3RhXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gbW9kYWxpdMOgIG5vcm1hbGUgaW52ZWNlIHNlIGxlIHByZWZlcmVuemUgZmFubm8gcmlmZXJpbWVudG8gYSBkZWxsZSBjb2xvbm5lIGNoZSBpbyBub24gaG8gbmVsbGEgVmlldyBhdHR1YWxlIHNpZ25pZmljYSBjaGVcclxuICAgICAgICAgICAgICAgICAgICAvLyBzdG8gZmFjZW5kbyByaWZlcmltZW50byBhIHVuYSB2ZXJzaW9uZSB2ZWNjaGlhIGRlbGwnZXMtdGFibGUsIHF1aW5kaSBub24gZm9jY2lvIG9wZXJhemlvbmlcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwb3NpdG9yeS5pbmRleE9mKHNvdXJjZVtpXSkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRQcmVmcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkUHJlZnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WaWV3LmNvbHVtbnMgPSBwcmVmcz8uY29sdW1ucyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WaWV3LmNvbHVtbl9vcmRlcmluZyA9IHByZWZzPy5jb2x1bW5fb3JkZXJpbmcgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZSBsZSBwcmVmIHNvbm8gbnVsbGUgbm9uIHNvdnJhc2NyaXZvIGdsaSBvcmRpbmkgZGF0byBjaGUgcG90cmViYmUgc2VydmlyZSBtZXR0ZXJlIGRlZ2xpIG9yZGluYW1lbnRpIGRpIGRlZmF1bHQgbGF0byB0c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihwcmVmcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5vcmRlcnMgPSBwcmVmcz8ub3JkZXJzIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuU2VhcmNoVmlldylcclxuICAgICAgICAgICAgICAgIHRoaXMuYXJyYXlQdWxzYW50aSA9IHRoaXMudXRpbGl0aWVzX0guZ2V0UGFnZXNBcnJheSg2LCB0aGlzLlNlYXJjaFZpZXcucGFnZSwgdGhpcy5TZWFyY2hWaWV3LnBhZ2VzIHx8IDEsIHRoaXMuU2VhcmNoVmlldy5pdGVtcy5sZW5ndGgsIHRoaXMuU2VhcmNoVmlldy5pdGVtc3BlcnBhZ2VvdmVycmlkZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZpbmFsaXplQ29udGV4dCgpO1xyXG5cclxuICAgICAgICB0aGlzLnBvc3RCb3VuZFNvdXJjZUNhbGN1bGF0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlZpZXcgJiYgIXRoaXMuVmlldy5zZWxmc2VhcmNoICYmIHRoaXMuRXNUYWJsZUhhbmRsZWRTZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGZzZWFyY2ggPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMub25TZWFyY2hSZXF1ZXN0LmVtaXQoZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuVmlldyAmJiB0aGlzLlZpZXcuc2VsZnNlYXJjaCAmJiB0aGlzLkVzVGFibGVIYW5kbGVkU2VhcmNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuVmlldy5zZWxmc2VhcmNoID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogRnVuemlvbmUgZGkgdHJhY2tieSBwZXIgaWwgYm9keSBjaGUgZG92cmViYmUgZXZpdGFyZSBpbCA5MCUgZGVsbGUgY2hhbmdlIGRldGVjdGlvbiAqL1xyXG4gICAgcHVibGljIGJvZHlUcmFja0J5ID0gKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkgPT4gaXRlbS5faGFzaDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN1Y2Nlc3NpdmFtZW50ZSBhbCBiaW5kIGRlbCBudW92byBpbnB1dCBxdWVzdGEgZnVuemlvbmUgc2kgb2NjdXBhIGRpIGZpbmFsaXp6YXJlIHR1dHRpIGkgcGFyYW1ldHJpIGRpIGZ1bnppb25hbWVudG8gZGVsbCdlcy10YWJsZSBcclxuICAgICAqIGluIGJhc2UgYSBJbnB1dCAtIE1vZGVsbG8sIGUgcXVhbHNpYXNpIGFsdHJhIGNvc2EgcG9zc2Egc2VydmlyZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZpbmFsaXplQ29udGV4dCgpIHtcclxuICAgICAgICBsZXQgdmlld0Nhc3RlZCA9IHRoaXMuVmlldyBhcyBBcHBTZWFyY2g8YW55PjtcclxuXHJcbiAgICAgICAgbGV0IGhhc1Jvd0dyb3VwcyA9IHZpZXdDYXN0ZWQgJiYgKHZpZXdDYXN0ZWQuZ3JvdXBpbmdzICYmIHZpZXdDYXN0ZWQuZ3JvdXBpbmdzLmZpbHRlcih0ID0+ICF0LmFnZ3JlZ2F0aW9uKS5sZW5ndGggPiAwKSB8fCAodGhpcy5hcnJheU1vZGUgJiYgdGhpcy5Fc1Roc0RpcmVjdGl2ZS5zb21lKHQgPT4gdC50aEdyb3VwKSk7XHJcblxyXG4gICAgICAgIC8vIFNlIGhvIGRlaSBncnVwcGkgaW4gbW9kYWxpdMOgIGFycmF5IGRldm8gc2lzdGVtYXJlIHVuIHBvJyBkaSB2YXJpYWJpbGkgY2hlIGRpdmVudGFubyBpbnNlbnNhdGVcclxuICAgICAgICBpZiAodGhpcy5hcnJheU1vZGUgJiYgaGFzUm93R3JvdXBzKVxyXG4gICAgICAgICAgICB0aGlzLlVzZUFycmF5TW9kZVBhZ2luZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBSaWVtcGltZW50byBkZWxsYSBUTVBCb3VuZFNvdXJjZSBjb24gZ2xpIG9nZ2V0dGkgY2hlIHZlcnJhbm5vIHBvaSBtb3N0cmF0aSBhZCBpbnRlcmZhY2NpYVxyXG4gICAgICAgIHRoaXMuVE1QQm91bmRTb3VyY2UgPSB0aGlzLml0ZW1zX0guZ2V0SXRlbXNCeU1vZGUoZmFsc2UsICF0aGlzLmludGVybmFsV3JpdGVDYWxsKTtcclxuXHJcbiAgICAgICAgLy8gU2UgaG8gdW5hIGdlcmFyY2hpYSwgYXNzZWdubyBpIGxpdmVsbGkgZ2VyYXJjaGljaSBhbGxhIFRNUEJvdW5kU291cmNlXHJcbiAgICAgICAgaWYgKHRoaXMuSGllcmFyY2h5ICYmICFoYXNSb3dHcm91cHMpXHJcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5TW9kZV9ILmFzc2lnbkhpZXJhcmNoeUxldmVscyh0aGlzLlRNUEJvdW5kU291cmNlKTtcclxuXHJcbiAgICAgICAgLy8gTCdoYXNoaW5nIGRlZ2xpIG9nZ2V0dGkgbG8gZmFjY2lvIGEgcHJlc2NpbmRlcmVcclxuICAgICAgICB0aGlzLnV0aWxpdGllc19ILmNhbGN1bGF0ZUhhc2godGhpcy5UTVBCb3VuZFNvdXJjZSk7XHJcblxyXG4gICAgICAgIC8vIEFzc2Vnbm8gYSB1bmEgdmFyaWFiaWxlIG1pYSBsJ2V2ZW50dWFsZSBvdmVycmlkZSBwZXIgbGEgY2xhc3NlIGRlbGxhIHJpZ2FcclxuICAgICAgICAvLyBTZSBwb2kgc29ubyBpbiBtb2RhbGl0w6AgZ2VyYXJjaGljYSBpbmlldHRvIGFuY2hlIGxhIGNsYXNzZSBwZXIgbGEgY29uZmlndXJhemlvbmUgZGVsIGxpdmVsbG8gZGVsbGEgcmlnYVxyXG4gICAgICAgIGlmICgodGhpcy5UTVBCb3VuZFNvdXJjZSAmJiB0aGlzLlJvd0NsYXNzQXNzaWduZXIpIHx8IHRoaXMuSGllcmFyY2h5KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5UTVBCb3VuZFNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLlRNUEJvdW5kU291cmNlW2ldO1xyXG4gICAgICAgICAgICAgICAgaXRlbS5fcm93Q2xhc3MgPSB0aGlzLlJvd0NsYXNzQXNzaWduZXIgPyB0aGlzLlJvd0NsYXNzQXNzaWduZXIoaXRlbSkgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgaXRlbS5fcm93Q2xhc3MgKz0gdGhpcy5IaWVyYXJjaHkgPyBcIiBlc3Qtcm93LWx2bC1cIiArIGl0ZW0uX2xldmVsIDogXCJcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogR2VuZXJhIGxlIGluZm9ybXppb25pIGRpIHBhZ2luYXppb25lIHBlciBsYSB2aXN0YSBnbG9iYWxlIGRlbGwnZXMtdGFibGUgKi9cclxuICAgIHByaXZhdGUgc2V0dXBQYWdpbmdJbmZvcm1hdGlvbnMoKSB7XHJcblxyXG4gICAgICAgIC8vIERlZmF1bHQgY2hlIHZhbGdvbm8gZGkgYmFzZSwgcG9pIGV2ZW50dWFsbWVudGUgbW9kZGF0aSBkYWxsZSBmdW56aW9uaSBzb3R0b1xyXG4gICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dDb3VudCA9ICF0aGlzLkhpZGVQYWdpbmdDb3VudDtcclxuICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucyA9ICF0aGlzLkhpZGVQYWdpbmdCdXR0b25zO1xyXG4gICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dQYWdpbmcgPSAhdGhpcy5IaWRlUGFnaW5nXHJcbiAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuVXNlc1ZpZXcgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hcnJheU1vZGUgJiYgdGhpcy5Vc2VBcnJheU1vZGVQYWdpbmcgJiYgIXRoaXMuU2VhcmNoVmlldykge1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5QYWdlckNvdW50ID0gKDxhbnlbXT50aGlzLlZpZXcpLmxlbmd0aCB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zICYmIHRoaXMuVmlldy5sZW5ndGggPiAxMDtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuVmlldyA9IHRoaXMuVmlldztcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuVXNlc1ZpZXcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd1BhZ2luZ09wdGlvbnMgPSB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5hcnJheU1vZGUgJiYgKCF0aGlzLlVzZUFycmF5TW9kZVBhZ2luZyB8fCB0aGlzLlNlYXJjaFZpZXcpKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNlYXJjaFZpZXcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlZpZXcgPSB0aGlzLlNlYXJjaFZpZXdcclxuICAgICAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlBhZ2VyQ291bnQgPSB0aGlzLlNlYXJjaFZpZXcub2JqZWN0Y291bnQgfHwgMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5QYWdlckNvdW50ID0gKDxhbnlbXT50aGlzLlZpZXcpLmxlbmd0aCB8fCAwXHJcblxyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zICYmICh0aGlzLlZpZXcubGVuZ3RoID4gMTAgfHwgKHRoaXMuU2VhcmNoVmlldz8ub2JqZWN0Y291bnQgfHwgMCkgPiAxMCk7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dDb3VudCA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dDb3VudCB8fCAodGhpcy5WaWV3ICYmIHRoaXMuVmlldy5sZW5ndGgpIHx8ICh0aGlzLlNlYXJjaFZpZXcgJiYgdGhpcy5TZWFyY2hWaWV3Lm9iamVjdGNvdW50ICYmIHRoaXMuU2VhcmNoVmlldy5vYmplY3Rjb3VudCAhPSAtMSk7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dQYWdpbmcgPSB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucyB8fCB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQ7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dQYWdpbmdPcHRpb25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMudmlld01vZGUpIHtcclxuICAgICAgICAgICAgbGV0IHRtcFZpZXcgPSB0aGlzLk1haW5Hcm91cFZpZXcgfHwgdGhpcy5WaWV3O1xyXG4gICAgICAgICAgICBsZXQgY291bnQgPSB0bXBWaWV3Py5ncm91cGNvdW50IHx8IHRtcFZpZXc/Lm9iamVjdGNvdW50O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TZWFyY2hlcyA9IHRtcFZpZXc/Lmdyb3VwY291bnQgIT0gbnVsbCAmJiB0bXBWaWV3Py5ncm91cGNvdW50ICE9IHVuZGVmaW5lZCA/ICdncm91cHMnIDogJ2l0ZW1zJztcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuUGFnZXJDb3VudCA9IGNvdW50IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlZpZXcgPSB0bXBWaWV3O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQgPSB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQgfHwgKHRtcFZpZXcgJiYgY291bnQgJiYgY291bnQgIT0gLTEpO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zICYmICh0bXBWaWV3LnBhZ2luZ2F2YWlsYWJsZSB8fCB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQpO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93UGFnaW5nT3B0aW9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBsYW5jaWF0byBkb3BvIGNoZSBsYSBzb3JnZW50ZSBkYXRpIMOoIHN0YXRhIGNvcnJldHRhbWVudGUgYmluZGF0YSwgc2kgb2NjdXBhIGRpIHJpY2FsY29sYXJlIHR1dHRvIGNpw7IgY2hlIHNlcnZlXHJcbiAgICAgKiBhbGwnZXMtdGFibGUgcGVyIHJlbmRlcml6emFyZSBpIHZhbG9yaSBkYSBtb3N0cmFyZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBvc3RCb3VuZFNvdXJjZUNhbGN1bGF0aW9uKCkge1xyXG4gICAgICAgIC8vIFJlc2V0dG8gdHV0dG8gdHJhbm5lIFJvd1REcyBlIFJvd1RIcyBwZXIgZXZpdGFyZSBmbGlja2VyaW5nLiBSb3dURHMgZSBSb3dUSHMgc2FyYW5ubyBtb2RpZmljYXRlIGFsbCdpbnRlcm5vIGRlbCBwcm9zc2ltbyBjaWNsbyBkaSBDRFxyXG4gICAgICAgIHRoaXMuUm93Q29udGV4dHMgPSBbXTtcclxuICAgICAgICB0aGlzLk9yZGVyRGlyZWN0aXZlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbUlEID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFBvc3RCb3VuZFNvdXJjZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBQZXIgcG90ZXIgZGlzdGluZ3VlcmUgbGUgY2hpYW1hdGUgYSBxdWVzdG8gbWV0b2RvOiBEb3BvIGlsIHNldFRpbWVvdXQgc2UgdXNvIGdsaSBFc1RkL0VzVGggdmVjY2hpLCBzZW56YSBpbCBzZXRUaW1lb3V0IHNlIHVzbyBsZSBudW92ZSBkaXJldHRpdmUgKi9cclxuICAgIHByaXZhdGUgaW50ZXJuYWxQb3N0Qm91bmRTb3VyY2UoKSB7XHJcbiAgICAgICAgbGV0IFZpZXcgPSB0aGlzLlZpZXc7XHJcblxyXG4gICAgICAgIGxldCB0ZHNEID0gdGhpcy5Fc1Rkc0RpcmVjdGl2ZS5sZW5ndGggPT0gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUZHNEaXJlY3RpdmU/Lmxlbmd0aCA+IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGRzRGlyZWN0aXZlIDogdGhpcy5Fc1Rkc0RpcmVjdGl2ZSA6IHRoaXMuRXNUZHNEaXJlY3RpdmU7XHJcbiAgICAgICAgbGV0IHRoc0QgPSB0aGlzLkVzVGhzRGlyZWN0aXZlLmxlbmd0aCA9PSAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Roc0RpcmVjdGl2ZT8ubGVuZ3RoID4gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUaHNEaXJlY3RpdmUgOiB0aGlzLkVzVGhzRGlyZWN0aXZlIDogdGhpcy5Fc1Roc0RpcmVjdGl2ZTtcclxuXHJcbiAgICAgICAgbGV0IHRocyA9IHRoc0QgJiYgdGhzRC5sZW5ndGggPiAwID8gdGhzRC50b0FycmF5KCkgOiBbXTtcclxuICAgICAgICBsZXQgdGRzID0gdGRzRCAmJiB0ZHNELmxlbmd0aCA+IDAgPyB0ZHNELnRvQXJyYXkoKSA6IFtdO1xyXG5cclxuICAgICAgICAvLyBTZSBub24gaG8gY29sb25uZSBkaW5hbWljaGUgbWEgc29ubyBpbiBtb2RhbGl0w6AgZGluYW1pY2EgKGxvIGNhcGlzY28gcGVyY2jDqSBjJ8OoIHVuYSB2aWV3IHBpZW5hIGRpIGdlbmVyaWNpdGVtKSBtZXR0byBpbCBkZWZhdWx0IGRlbGxlIGNvbG9ubmVcclxuICAgICAgICB0aGlzLmR5bmFtaWNNb2RlX0guZXZlbnR1YWxseVJldmlld0R5bmFtaWNDb2x1bW5zKCk7XHJcbiAgICAgICAgdGhpcy5iaW5kRGlzcGxheVRvTG9hZGVkSXRlbXNPckdyb3VwcyhWaWV3KTtcclxuXHJcbiAgICAgICAgLy8gUXVlc3RvIGRldidlc3NlcmUgcGVyIGZvcnphIGxhbmNpYXRvIGRvcG8gKipiaW5kRGlzcGxheVRvTG9hZGVkSXRlbXNPckdyb3VwcyoqIGRhdG8gY2hlIMOoIGzDrCBjaGUgYWxjdW5lIGNvc2UgdmVuZ29ubyB2YWxvcml6emF0ZVxyXG4gICAgICAgIHRoaXMuc2V0dXBQYWdpbmdJbmZvcm1hdGlvbnMoKTtcclxuXHJcbiAgICAgICAgLy8gTW9sdGUgY29zZSBzb25vIG92dmlhbWVudGUgZGlzcG9uaWJpbGkgc29sbyBpbiBtb2RhbGl0w6AgVmlld1xyXG4gICAgICAgIGlmICgodGhpcy52aWV3TW9kZSB8fCB0aGlzLmFycmF5TW9kZSkgJiYgdGhpcy5Vc2VDdXN0b21DZWxscykge1xyXG4gICAgICAgICAgICBsZXQgdmlldyA9IHRoaXMudmlld01vZGUgPyBWaWV3IGFzIEFwcFNlYXJjaDxhbnk+IDogbnVsbDtcclxuICAgICAgICAgICAgbGV0IGl0ZW1zQW5kR3JvdXBzID0gdGhpcy52aWV3TW9kZSA/IFsuLi4odmlldy5pdGVtcyB8fCBbXSksIC4uLih2aWV3Lmdyb3VwcyB8fCBbXSldIDogVmlldyBhcyBhbnlbXTtcclxuICAgICAgICAgICAgbGV0IHNpID0gdGhpcy52aWV3TW9kZSA/IHZpZXcuc2VsZWN0aW9uIDogdGhpcy5hcnJheW1vZGVTZWxlY3Rpb247XHJcbiAgICAgICAgICAgIC8vIE4uQjogUmlzcGV0dGFyZSBsJ29yZGluZSBkaSBxdWVzdGUgMyBtYWNyb2NhdGVnb3JpZSDDqCBWSVRBTEVcclxuXHJcbiAgICAgICAgICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgIFNpc3RlbWF6aW9uaSBkaSBUSCwgVEQsIGUgdmlzaWJpbGl0w6AgdmFyaWUgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblxyXG4gICAgICAgICAgICAvLyBFc3BhbmRvIGkgdGggZSBpIHRkIG11bHRpcGxpIGR1cGxpY2FuZG9saVxyXG4gICAgICAgICAgICBsZXQgcmV0ID0gdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmV4cGFuZE11bHRpVGhzQW5kVGRzKHRocywgdGRzLCBpdGVtc0FuZEdyb3Vwcyk7XHJcbiAgICAgICAgICAgIHRocyA9IHJldC5leHBUaHM7XHJcbiAgICAgICAgICAgIHRkcyA9IHJldC5leHBUZHM7XHJcblxyXG4gICAgICAgICAgICAvLyBHZXN0aW9uZSBkZWxsZSB2aWV3IGluIG1vZGFsaXTDoCByZXBvcnQsIGkgdGggZSBpIHRkIHZlbmdvbm8gcmlnZW5lcmF0aSBkYWxsZSBjb25maWd1cmF6aW9uaSBkZWxsYSB2aWV3XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5hcnJheU1vZGUgJiYgdmlldy5yZXBvcnRfY29sdW1ucykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHJldCA9IHRoaXMucmVwb3J0TW9kZV9ILmdlbmVyYXRlVGhzQW5kVGRzRnJvbVZpZXcodmlldyk7XHJcbiAgICAgICAgICAgICAgICB0aHMgPSByZXQudGhzO1xyXG4gICAgICAgICAgICAgICAgdGRzID0gcmV0LnRkcztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUHJlcGFzc2FnZ2lvIHBlciB0aXJhcmUgZnVvcmkgdHV0dGUgbGUgaW5mbyB1dGlsaSBzdWdsaSBoZWFkZXJzIGluIG1vZG8gZGEgbm9uIHJpY2Fjb2xhcnNlbGkgc2VtcHJlIGRvcG9cclxuICAgICAgICAgICAgbGV0IGhJID0gdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmV2YWx1YXRlSGVhZGVyc0dyb3VwaW5nSW5mb3ModGhzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCBhcnJheSBub24gaG8gdW4gYmFja2VuZC4uLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3dHcm91cGluZ19ILmFycmF5TW9kZVJldmlld0dyb3VwaW5ncyhoSS5sZWFmcyk7ICAvLyAuLi4gaSByYWdncnVwcGFtZW50aSBsaSBkZXZvIGZhcmUgbGF0byBjbGllbnRcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5yZXZpZXdDb2x1bW5zTGlzdChoSS5sZWFmcyk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBBZ2dpb3JuYSBsYSBsaXN0YSBkZWxsZSBjb2xvbm5lIGRhIG1vc3RyYXJlIG5lbGxhIGRpYWxvZyBwZXIgb3JkaW5hbWVudG8gZWNjXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5hbGlnbkNvbHVtbnNJZkxvYWRlZFZpZXcodmlldyk7ICAgICAgICAgICAgICAgICAgICAvLyBTZSBzdG8gY2FyaWNhbmRvIHVuYSBWaWV3IGRhIGhvdHBvdGF0byAocXVpbmRpIGNvbiBzYXZlZHN0YXRlID0gdHJ1ZSkgcmlhbGxpbmVvIGxhIHZpc2liaWxpdMOgIGRlbGxlIGNvbG9ubmUgZSBpbCBsb3JvIG9yZGluZS5cclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILm1vdmVGaXhlZENvbHVtbnNBdFRoZUJlZ2lubmluZyhoSS5sZWFmcywgdGRzKTsgICAgIC8vIFNwb3N0byB0dXR0ZSBsZSBjb3NlIGZpeGVkIGFsbCdpbml6aW8gaW4gbW9kbyBjaGUgbGEgY3JlYXppb25lIGRpIHRoIGUgdGQgc2lhIHBpw7kgc25lbGxhIChVdGlsaXp6YSBsZSBDb2x1bW5zTGlzdCwgcXVpbmRpIGRldidlc3NlcmUgcmljaGlhbWF0YSBQSVJNQSBkaSByZXZpZXdDb2x1bW5zTGlzdClcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmFsaWduSGVhZGVyc09yZGVyaW5nKGhJLmxlYWZzLCB2aWV3KTsgICAgICAgICAgICAgIC8vIEFsbGluZW8gZ2xpIG9yZGluYW1lbnRpIGFnbGkgaGVhZGVyXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5yZWZyZXNoQ29sdW1uc1Zpc2liaWxpdHkoaEkubGVhZnMsIHRkcywgdmlldyk7ICAgICAvLyBMYXZvcm8gc3VpIFRIIGVkIGV2ZW50dWFsbWVudGUgbW9kaWZpY28gbGEgdmlzaWJpbGl0w6AgYW5jaGUgZGVpIFRELlxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0guZXZhbHVhdGVQaW5uZWRDb2x1bW5zV2lkdGgoKTsgICAgICAgICAgICAgICAgICAgICAgLy8gU2Ugc29ubyBwcmVzZW50aSBjb2xvbm5lIHBpbm5hdGUgdmFsdXRhIGxhIGRpbWVuc2lvbmUgZGVsIGNvbnRlbml0b3JlXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5nZW5lcmF0ZURlZmF1bHRPcmRlcihoSS5sZWFmcywgdmlldyk7ICAgICAgICAgICAgICAvLyBHZW5lcm8gbGUgZGlyZXR0aXZlIGRpIG9yZGluYW1lbnRvLCBjaGUgc2lhbm8gZGVmYXVsdCBvIGRlcml2YW50aSBkYWxsYSBBcHBTZWFyY2hcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmV2YWx1YXRlSGVhZGVyR3JvdXBzKGhJKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhbHV0byBpIHJhZ2dydXBwYW1lbnRpIGRlZ2xpIGhlYWRlciBzZSBwcmVzZW50aVxyXG5cclxuICAgICAgICAgICAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgR2VuZXJhemlvbmUgYmluZGluZyBwZXIgcmlnaGUgZSBjb2xvbm5lICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cclxuICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZVJvd1RocyhoSS5sZWFmcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmFjY29sZ28gaSBUSFxyXG4gICAgICAgICAgICB0aGlzLmV2YWx1YXRlUm93VGRzKGhJLmxlYWZzLCB0ZHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSYWNjb2xnbyBpIFREIGluIGNvbnRlc3RpIHNlcGFyYXRpLCB1biBjb250ZXN0byBwZXIgb2duaSBpdGVtIG8gZ3J1cHBvXHJcblxyXG4gICAgICAgICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICBVbHRpbWkgYWdnaXVzdG1hZW50aSBkZWkgYmluZGluZyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0guYXBwbHlPcmRlcmluZyh2aWV3LCB0cnVlKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBsaWNvIGwnb3JkaW5hbWVudG8gc3VsbGUgY29sb25uZSAobm9uIEFTQyBERVNDLCBtYSBcInByaW1hIHF1ZXN0YSBvIHF1ZWxsYSBjb2xvbm5hXCIpXHJcbiAgICAgICAgICAgIHRoaXMuTW92ZVRlbXBvcmFyeVZhcmlhYmxlc1RvUmVhbE9uZXMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbGxlZ28gVEggZSBURCBhZ2dpdXN0YXRpIGZpbm8gYWQgb3JhIGFsbGUgdmFyaWFiaWxpIGRpIEJpbmRpbmcgSFRNTFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmV2YWx1YXRlU2VsZWN0aW9uKGl0ZW1zQW5kR3JvdXBzLCBzaSk7ICAgICAgICAgICAgICAgICAvLyBSaWFsbGluZW8gbGUgaW5mbyBkaSBzZWxlemlvbmUgZGVnbGkgZWxlbWVudGkgZGVsbGEgVmlld1xyXG5cclxuICAgICAgICAgICAgLy8gVmFsdXRhIGxvIHN0YXRvIGluaXppYWxlIGRpIHNlbGV6aW9uZSBhIHJhbmdlXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guZXZhbHVhdGVTaW5nbGVDZWxsU2VsZWN0aW9uKGl0ZW1zQW5kR3JvdXBzLCBoSS5sZWFmcywgdGhpcy5EeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb24pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuUmVzZWFyY2hOZWVkZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlJlc2VhcmNoTmVlZGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoKHRoaXMudmlld01vZGUgfHwgdGhpcy5hcnJheU1vZGUpICYmICF0aGlzLlVzZUN1c3RvbUNlbGxzKSB7XHJcbiAgICAgICAgICAgIC8vIFJpYWxsaW5lbyBsZSBpbmZvIGRpIHNlbGV6aW9uZSBkZWdsaSBlbGVtZW50aSBkZWxsYSBWaWV3XHJcbiAgICAgICAgICAgIGxldCBpdGVtcyA9IHRoaXMudmlld01vZGUgPyAoVmlldyBhcyBBcHBTZWFyY2g8YW55PikuaXRlbXMgOiBWaWV3IGFzIGFueVtdO1xyXG4gICAgICAgICAgICBsZXQgc2kgPSB0aGlzLnZpZXdNb2RlID8gKFZpZXcgYXMgQXBwU2VhcmNoPGFueT4pLnNlbGVjdGlvbiA6IHRoaXMuYXJyYXltb2RlU2VsZWN0aW9uO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmV2YWx1YXRlU2VsZWN0aW9uKGl0ZW1zLCBzaSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBQZXIgZXNzZXJlIHNpY3VybyBjaGUgZG9wbyB1biBiaW5kIGRpIG9nZ2V0dGkgbGEgZXMtdGFibGUgYWdnaW9ybmkgbGEgZ3JhZmljYVxyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIHRoaXMuRmlyc3RCaW5kID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFZmZldHR1YSBpbCBiaW5kaW5nIGRlZ2xpIG9nZ2V0dGkgcGVydmVudXRpIGRhIHF1ZXN0YSBjaGlhbWF0YSBjb24gZ2xpIG9nZ2V0dGkgZWZmZXR0aXZhbWVudGUgZGEgZ3JhZmljYXJlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSB2aWV3IFZpZXcgZGEgY3VpIHNvbm8gYXJyaXZhdGkgZ2xpIG9nZ2V0dGkuIFB1w7IgZXNzZXJlIG8gdW4gYXJyYXkgc2Ugc29ubyBpbiAqKmFycmF5TW9kZSoqIG8gdW5hIEFwcFNlYXJjaDxUPiBzZSBzb25vIGluICoqdmlld01vZGUqKlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGJpbmREaXNwbGF5VG9Mb2FkZWRJdGVtc09yR3JvdXBzKHZpZXc6IGFueSkge1xyXG4gICAgICAgIGlmICghdGhpcy5UTVBCb3VuZFNvdXJjZSB8fCB0aGlzLlRNUEJvdW5kU291cmNlLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQmFzZUl0ZW1zQ291bnQgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLmJvdW5kU291cmNlID0gW107XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSB8fCAhdGhpcy5Vc2VDdXN0b21DZWxscykge1xyXG4gICAgICAgICAgICB0aGlzLmJvdW5kU291cmNlID0gdGhpcy5UTVBCb3VuZFNvdXJjZTtcclxuICAgICAgICAgICAgdGhpcy5CYXNlSXRlbXNDb3VudCA9IHZpZXc/Lm9iamVjdGNvdW50IHx8IHZpZXc/Lmxlbmd0aCB8fCAwO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZ3JvdXBpbmdLZXlzID0gdmlldz8uZ3JvdXBpbmdzPy5maWx0ZXIodCA9PiAhdC5hZ2dyZWdhdGlvbik/Lmxlbmd0aCB8fCAwO1xyXG4gICAgICAgIGlmIChncm91cGluZ0tleXMgPT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmJvdW5kU291cmNlID0gdGhpcy5UTVBCb3VuZFNvdXJjZTtcclxuICAgICAgICAgICAgdGhpcy5CYXNlSXRlbXNDb3VudCA9IHZpZXc/Lm9iamVjdGNvdW50IHx8IDA7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucm93R3JvdXBpbmdfSC5oYW5kbGVOZXdEYXRhT25Sb3dHcm91cGluZyh2aWV3LCBncm91cGluZ0tleXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBNZXRvZG8gcmljaGlhbWF0byBzb2xvIHF1YW5kbyAqKlRNUFJvd1REcyoqIGUgKipUTVBSb3dUSHMqKiBzb25vIGNvbXBsZXRhbWVudGUgZ2VuZXJhdGkgZWQgYWdnaXVzdGF0aS4gU2VydmUgcGVyIGNvbGxlZ2FybGkgYWxsZSB2YXJpYWJpbGkgdXNhdGUgbGF0byBiaW5kaW5nIEhUTUwgKi9cclxuICAgIHByaXZhdGUgTW92ZVRlbXBvcmFyeVZhcmlhYmxlc1RvUmVhbE9uZXMoKSB7XHJcblxyXG4gICAgICAgIHRoaXMuUm93VERzID0gdGhpcy5UTVBSb3dURHM7XHJcbiAgICAgICAgdGhpcy5Sb3dUSHMgPSB0aGlzLlRNUFJvd1RIcztcclxuICAgICAgICB0aGlzLlJvd1RoR3JvdXBzID0gdGhpcy5UTVBSb3dUaEdyb3VwcyA/IHRoaXMuVE1QUm93VGhHcm91cHMucmV2ZXJzZSgpIDogbnVsbDtcclxuICAgICAgICB0aGlzLkVtcHR5Um93VGRzID0gdGhpcy5pc0VtcHR5KHRoaXMuUm93VERzKTtcclxuXHJcbiAgICAgICAgdGhpcy5Db2x1bW5zLlZpc2liaWxlID0gdGhpcy5Sb3dUSHMuZmlsdGVyKHQgPT4gdC5WaXNpYmxlKS5sZW5ndGg7XHJcbiAgICAgICAgdGhpcy5Db2x1bW5zLlZpc2libGVVbnBpbm5lZCA9IHRoaXMuUm93VEhzLmZpbHRlcih0ID0+IHQuVmlzaWJsZSAmJiAhdC5QaW5uZWQpLmxlbmd0aDtcclxuICAgICAgICB0aGlzLkNvbHVtbnMuR2xvYmFsID0gdGhpcy5Db2x1bW5zLlZpc2libGVVbnBpbm5lZCArICh0aGlzLkhhc1Bpbm5lZENvbHVtbnMgPyAxIDogMCkgKyAodGhpcy5TZWxlY3Rpb24gPyAxIDogMCkgKyAodGhpcy5SZW1vdmFsID8gMSA6IDApICsgKHRoaXMuRXhwb3J0IHx8IHRoaXMuSGlkZGVuQ29sdW1ucyB8fCB0aGlzLkNvbHVtbnNPcmRlcmluZyB8fCB0aGlzLkNvcm5lck1lbnVPcHRpb25zID8gMSA6IDApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogTWV0b2RvIHBlciBjYXBpcmUgc2UgdW4gb2dnZXR0byDDqCBjb21wbGV0YW1lbnRlIHZ1b3RvIFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZGEgY29udHJvbGxhcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIGwnb2dnZXR0byDDqCB2dW90bywgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgaXNFbXB0eShvYmo6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGZvciAodmFyIF8gaW4gb2JqKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVybWV0dGUgZGkgc2VsZXppb25hcmUgbyBkZXNlbGV6aW9uYXJlIGluIG1hbmllcmEgYXJiaXRyYXJpYSBkZWdsaSBvZ2dldHRpXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55W119IGl0ZW1zIE9nZ2V0dGkgZGEgc2VsZXppb25hcmUgbyBkZXNlbGV6aW9uYXJlXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNlbGVjdCAqKnRydWUqKiBwZXIgc2VsZXppb25hcmxpLCAqKmZhbHNlKiogcGVyIG5vbiB0b2NjYXJsaVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0U2VsZWN0aW9uU3RhdHVzKGl0ZW1zOiBhbnlbXSwgYWxsOiBib29sZWFuLCBzZWxlY3Q6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoYWxsKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5TZWxlY3RBbGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJJbXBvc3NpYmlsZSBpbXBvc3RhcmUgbGEgc2VsZXppb25lIGNvbiBsJ2FsbCBzZWxlY3Rpb24gcXVhbmRvIGwnSW5wdXQgU2VsZWN0QWxsIMOoIGZhbHNlXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgc2kgPSAodGhpcy5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+KT8uc2VsZWN0aW9uIHx8IHRoaXMuYXJyYXltb2RlU2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAvL3NlIGRlc2VsZXppb25vIGNvbiBhdHR1YWxlIHNlbGV6aW9uZSBhZCBhbGwgbyBzZSBzZWxlemlvbm8gY29uIGF0dHVhbGUgc2VsZXppb25lIG1hbnVhbGUgZGV2byByaWNoaWFtYXJlIGxhICoqc2VsZWN0QWxsT3JSZXNldFNlbGVjdGlvbioqXHJcbiAgICAgICAgICAgIGlmICgoc2kuYWxsICYmICFzZWxlY3QpIHx8ICghc2kuYWxsICYmIHNlbGVjdCkpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILnNlbGVjdEFsbE9yUmVzZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmhhbmRsZUl0ZW1zU2VsZWN0aW9uKGl0ZW1zLCBzZWxlY3QpO1xyXG5cclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBjaGUgZ2VzdGlzY2UgaWwgY2FtYmlvIGRpIE9yZGluYW1lbnRvIGRpIHVuYSBjb2xvbm5hXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIElEIGRlbGxhIGNvbG9ubmEgaWwgY3VpIG9yaWRuYW1lbnRvIMOoIGNhbWJpYXRvXHJcbiAgICAgKiBAcGFyYW0geydERVNDJyB8ICdBU0MnfSBvcmRlciBOdW92byBvcmRpbmUgc2VsZXppb25hdG8gcGVyIGxhIGNvbG9ubmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRoT3JkZXJDaGFuZ2VkKGlkOiBzdHJpbmcsIG9yZGVyPzogJ0RFU0MnIHwgJ0FTQycpIHtcclxuICAgICAgICBpZiAoIXRoaXMudmlld01vZGUgJiYgIXRoaXMuYXJyYXlNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignT3JkZXIgY2hhbmdlZCBvbiBhIHRhYmxlIG5vdCBpbiB2aWV3TW9kZSBvciBBcnJheSBtb2RlLiBPcGVyYXRpb24gbm90IHN1cHBvcnRlZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuT3JkZXJCeUNvbHVtbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0guaGFuZGxlVEhPcmRlckNoYW5nZShpZCwgb3JkZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGRhIGNoaWFtYXJlIG9nbmkgdm9sdGEgY2hlIHNpIHZ1b2xlIGRhcmUgZXZpZGVuemEgYWxsJ2VzdGVybm8gZGVsIGJpc29nbm8gZGkgcmllZmZldHR1YXJlIGxhIHJpY2VyY2FcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSByZXNldHNQYWdlIEluZGljYSBhbCBsaXN0ZW5lciBjaGUgZGV2ZSByZXNldHRhcmUgaWwgbnVtZXJvIGRpIHBhZ2luYVxyXG4gICAgICogQHBhcmFtIHtBcHBTZWFyY2g8YW55Pn0gdmlld092ZXJyaWRlIE92ZXJyaWRlIGRlbGxhIHZpZXcgZGEgZW1ldHRlcmUgcGVyIHF1ZXN0YSByaWNlcmNhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBlbWl0U2VhcmNoUmVxdWVzdChyZXNldHNQYWdlOiBib29sZWFuLCB2aWV3T3ZlcnJpZGU/OiBBcHBTZWFyY2g8YW55Pikge1xyXG4gICAgICAgIGlmICh0aGlzLnZpZXdNb2RlICYmICF2aWV3T3ZlcnJpZGUpIHtcclxuICAgICAgICAgICAgKHRoaXMuVmlldyBhcyBBcHBTZWFyY2g8YW55PikuaW50ZXJuYWxzZWFyY2hyZXF1ZXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodmlld092ZXJyaWRlKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXNldHNQYWdlKVxyXG4gICAgICAgICAgICAgICAgdmlld092ZXJyaWRlLnBhZ2UgPSAxO1xyXG4gICAgICAgICAgICB2aWV3T3ZlcnJpZGUuaW50ZXJuYWxzZWFyY2hyZXF1ZXN0ID0gdHJ1ZVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yZXNlYXJjaEluUHJvZ3Jlc3MgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5WaWV3ICYmICF0aGlzLlZpZXcuc2VsZnNlYXJjaCAmJiB0aGlzLkVzVGFibGVIYW5kbGVkU2VhcmNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuVmlldy5zZWxmc2VhcmNoID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLm9uU2VhcmNoUmVxdWVzdC5lbWl0KGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMub25TZWFyY2hSZXF1ZXN0LmVtaXQodmlld092ZXJyaWRlID8gdmlld092ZXJyaWRlIDogcmVzZXRzUGFnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJ0ZW5kbyBkYWdsaSAqKkVzVGRzKiogYmluZGF0aSBnZW5lcmEsIGFsbCdpbnRlcm5vIGRlbCBkaXppb25hcmlvICoqVE1QUm93VERzKiogdHV0dGkgaSBjb250ZXN0aSBkZWkgdmFyaSBvZ2dldHRpLlxyXG4gICAgICpcclxuICAgICAqIFZlbmdvbm8gZXNjbHVzaSBpIFREIFwiSW50ZXJuaVwiIGluIHF1YW50byB2ZW5nb25vIGdlbmVyYXRpIGRhZ2xpIG9yaWdpbmFsaSBxdWluZGkgaW5jbHVkZXJsaSB2b3JyZWJiZSBkaXJlIHJpZWZmZXR0dWFyZSBsZSBvcGVyYXppb25pIGR1ZSB2b2x0ZVxyXG4gICAgICpcclxuICAgICAqIENvc3RvOiAyIHNjYW4gRXNUaHMsIDEgc2NhbiBFc1Rkc1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RXNUaERpcmVjdGl2ZVtdfSB0aHMgQ29sb25uZSBkZWxsYSB0YWJlbGxhXHJcbiAgICAgKiBAcGFyYW0ge0VzVGREaXJlY3RpdmVbXX0gdGRzIENlbGxlIGRlbGxhIHRhYmVsbGFcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBldmFsdWF0ZVJvd1Rkcyh0aHM6IEVzVGhEaXJlY3RpdmVbXSwgdGRzOiBFc1RkRGlyZWN0aXZlW10pIHtcclxuICAgICAgICBpZiAodGRzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCB0aHNDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IEVzVGhEaXJlY3RpdmUgfSA9IHt9O1xyXG4gICAgICAgIGxldCBjb2x1bW5zQ2FjaGU6IHsgW2luZGV4OiBzdHJpbmddOiBFc1RhYmxlQ29sdW1uIH0gPSB7fTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgY29saSA9IDA7IGNvbGkgPCB0aGlzLkNvbHVtbnNMaXN0Lmxlbmd0aDsgY29saSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBjb2wgPSB0aGlzLkNvbHVtbnNMaXN0W2NvbGldO1xyXG4gICAgICAgICAgICBjb2x1bW5zQ2FjaGVbY29sLmlkXSA9IGNvbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0aCA9IHRoc1tpXTtcclxuICAgICAgICAgICAgdGhzQ2FjaGVbdGgudGhdID0gdGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLlRNUFJvd1REcyA9IHt9O1xyXG4gICAgICAgIC8vIFZhcmlhYmlsZSBkJ2FwcG9nZ2lvIHBlciBwZXJtZXR0ZXJtaSBkaSBpbnNlcmlyZSB0dXR0ZSBsZSBjb2xvbm5lIFwiRml4ZWRcIiBkYXZhbnRpXHJcbiAgICAgICAgbGV0IGNvbnRleHRGaXhlZHM6IHsgW2NvbnRleHQ6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRkID0gdGRzW2ldO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJvdW5kU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuYm91bmRTb3VyY2VbaV07XHJcbiAgICAgICAgICAgICAgICBsZXQgY3R4ID0gaXRlbS5faGFzaDtcclxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSB0ZC50ZDtcclxuICAgICAgICAgICAgICAgIGxldCB0aCA9IHRoc0NhY2hlW3RkLnRkXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoISF0aClcclxuICAgICAgICAgICAgICAgICAgICB0aC5fcmVmZXJlbmNlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gU2tpcHBhcmUgc2VuemEgdGggKGNhc2lzdGljYSB0YWJlbGxhIGRpbmFtaWNhKVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoICYmIHRoLnRoSWYgJiYgKHRkLnRkSWYgfHwgdGgudGhHcm91cCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdGhDYXN0ZWQgPSA8RXNUaERpcmVjdGl2ZT50aDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaXNGaXhlZCA9IHRoLnRoRml4ZWQgfHwgdGgudGhHcm91cCB8fCB0aC50aFBpbm5lZDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbVRvQWRkID0gaXRlbS5faXRlbSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZEVsZW1lbnQ+eyBMZWZ0Qm9yZGVyOiAoPGFueT50aENhc3RlZCkuX2xib3JkLCBSaWdodEJvcmRlcjogKDxhbnk+dGhDYXN0ZWQpLl9yYm9yZCwgSUQ6IGtleSwgUGlubmVkOiBjb2x1bW5zQ2FjaGVbdGQudGRdLnBpbm5lZCwgUGlubmVkV2lkdGg6IHRoQ2FzdGVkLnRoUGlubmVkV2lkdGgsIEdyb3VwSGVhZGVyOiBmYWxzZSwgR3JvdXBBZ2dyZWdhdGlvbjogZmFsc2UsIFZpc2libGU6IGNvbHVtbnNDYWNoZVt0ZC50ZF0udmlzaWJsZSwgV3JhcHM6IGZhbHNlLCBDbGFzczogdGQudGRDbGFzcywgVGVtcGxhdGU6IHRoQ2FzdGVkLnRoR3JvdXAgJiYgIXRoaXMuU2hvd0l0ZW1Hcm91cHNDb2x1bW5zID8gbnVsbCA6IHRkLlRlbXBsYXRlLCBNdWx0aTogdGQuX211bHRpLCBNdWx0aVByb3A6IHRkLl9tdWx0aSA/IHRkLnRkLnNwbGl0KCdfJylbMF0gOiBudWxsLCBNdWx0aUluZGV4OiB0ZC5fbXVsdGkgPyB0ZC50ZC5zcGxpdCgnXycpWzFdIDogbnVsbCwgUHJvcGVydHlOYW1lOiB0aC50aFByb3BlcnR5LCBQcm9wZXJ0eVR5cGU6IHRoLnRoVHlwZSwgUHJvcGVydHlTb3VyY2U6IHRoLnRoU291cmNlLCBQcm9wQWNjZXNzb3I6IHRkLnRkUHJvcGVydHlBY2Nlc3NvciB9IDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgPFRkRWxlbWVudD57IExlZnRCb3JkZXI6ICg8YW55PnRoQ2FzdGVkKS5fbGJvcmQsIFJpZ2h0Qm9yZGVyOiAoPGFueT50aENhc3RlZCkuX3Jib3JkLCBJRDoga2V5LCBQaW5uZWQ6IGNvbHVtbnNDYWNoZVt0ZC50ZF0ucGlubmVkLCBQaW5uZWRXaWR0aDogdGhDYXN0ZWQudGhQaW5uZWRXaWR0aCwgR3JvdXBIZWFkZXI6IHRoQ2FzdGVkLnRoR3JvdXAsIEdyb3VwQWdncmVnYXRpb246ICEhdGhDYXN0ZWQudGhBZ2dyZWdhdGlvbiwgVmlzaWJsZTogY29sdW1uc0NhY2hlW3RkLnRkXS52aXNpYmxlLCBXcmFwczogZmFsc2UsIENsYXNzOiB0aENhc3RlZC50aEdyb3VwQ2xhc3MgfHwgJycsIENvbnRlbnQ6IHRoaXMucm93R3JvdXBpbmdfSC5nZXRHcm91cENlbGxEaXNwbGF5KDxHcm91cD5pdGVtLCBrZXksIDxFc1RoRGlyZWN0aXZlPnRoKSB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5UTVBSb3dURHNbY3R4XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRNUFJvd1REc1tjdHhdLnB1c2goaXRlbVRvQWRkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUm93Q29udGV4dHMucHVzaChjdHgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRNUFJvd1REc1tjdHhdID0gW2l0ZW1Ub0FkZF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRGaXhlZHNbY3R4XSA9IGlzRml4ZWQgPyAxIDogMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNlIG5vbiBobyBvZ2dldHRpIMOoIGludXRpbGUgY2hlIGNvbnRyb2xsbyBnbGkgZXJyb3JpLCBkYXRvIGNoZSBnbGkgZXMtdGQgbm9uIGVzaXN0ZXJhbm5vIGRpIGNlcnRvIGUgZGkgY29uc2VndWVuemEgZ2xpIGVzLXRoIG5vbiBzYXJhbm5vIHJlZmVyZW56aWF0aVxyXG4gICAgICAgIGlmICh0aGlzLlRNUEJvdW5kU291cmNlLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHZhciBlcnJzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0aCA9IHRoc1tpXTtcclxuICAgICAgICAgICAgaWYgKCF0aC5fcmVmZXJlbmNlZClcclxuICAgICAgICAgICAgICAgIGVycnMucHVzaCh0aC50aCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXJycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBlcnJJZHMgPSBlcnJzLmpvaW4oJywgJyk7XHJcbiAgICAgICAgICAgIHRocm93IFwiTCdJRCBkaSB1bm8gbyBwacO5IEVzVGggbm9uIGhhbm5vIGFsY3VuIEVzVGQgYXNzb2NpYXRvOiBcIiArIGVycklkcztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJ0ZW5kbyBkYWdsaSAqKkVzVGhzKiogYmluZGF0aSBnZW5lcmEsIGFsbCdpbnRlcm5vIGRlbCBkaXppb25hcmlvICoqVE1QUm93VEhzKiogdHV0dGkgaSBjb250ZXN0aSBkZWkgdmFyaSBvZ2dldHRpLlxyXG4gICAgICpcclxuICAgICAqIFZlbmdvbm8gZXNjbHVzaSBpIFRIIFwiSW50ZXJuaVwiIGluIHF1YW50byB2ZW5nb25vIGdlbmVyYXRpIGRhZ2xpIG9yaWdpbmFsaSBxdWluZGkgaW5jbHVkZXJsaSB2b3JyZWJiZSBkaXJlIHJpZWZmZXR0dWFyZSBsZSBvcGVyYXppb25pIGR1ZSB2b2x0ZVxyXG4gICAgICpcclxuICAgICAqIENvc3RvOiAxIHNjYW4gRXNUaHMgKyAxIHNjYW4gQ29sdW1uc0xpc3RcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VzVGhEaXJlY3RpdmVbXX0gdGhzIENvbG9ubmUgZGVsbGEgdGFiZWxsYVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlUm93VGhzKHRoczogRXNUaERpcmVjdGl2ZVtdKSB7XHJcbiAgICAgICAgaWYgKHRocy5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgY29sdW1uc0xpc3RDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IEVzVGFibGVDb2x1bW4gfSA9IHt9O1xyXG4gICAgICAgIGxldCBjYXN0ZWRWaWV3ID0gPEFwcFNlYXJjaDxhbnk+PnRoaXMuVmlldztcclxuICAgICAgICBsZXQgZ3JvdXBpbmdzVW5kZWZpbmVkID0gdGhpcy52aWV3TW9kZSAmJiAoY2FzdGVkVmlldyAmJiAhY2FzdGVkVmlldy5ncm91cGluZ3MgfHwgY2FzdGVkVmlldy5ncm91cGluZ3MubGVuZ3RoID09IDApO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuQ29sdW1uc0xpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGl0bSA9IHRoaXMuQ29sdW1uc0xpc3RbaV07XHJcbiAgICAgICAgICAgIGNvbHVtbnNMaXN0Q2FjaGVbaXRtLmlkXSA9IGl0bVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5UTVBSb3dUSHMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdGggPSB0aHNbaV07XHJcbiAgICAgICAgICAgIGxldCB0b0FkZDogVGhFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoLnRoSWYgfHwgdGgudGhHcm91cCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCB0aENsYXNzID0gKHRoLnRoQ2xhc3MgfHwgJycpICsgKHRoLnRoR3JvdXAgPyBcIiBlc3QtY29sLW1pblwiIDogXCJcIik7XHJcbiAgICAgICAgICAgICAgICB0b0FkZCA9IHsgUGlubmVkOiBjb2x1bW5zTGlzdENhY2hlW3RoLnRoXS5waW5uZWQsIEZpeGVkOiB0aC50aEZpeGVkLCBQaW5uZWRXaWR0aDogdGgudGhQaW5uZWRXaWR0aCwgSUQ6IHRoLnRoLCBWaXNpYmxlOiB0aC50aFZpc2libGUsIENsYXNzOiB0aENsYXNzLCBPcmRlcjogdGgudGhPcmRlciwgT3JkZXJhYmxlOiB0aC50aE9yZGVyYWJsZSwgVGVtcGxhdGU6IHRoLlRlbXBsYXRlLCBDb250ZW50OiB0aC50aFN0YXRpY0NvbnRlbnQsIFdyYXA6IHRoLnRoV3JhcCwgTGVmdEJvcmRlcjogKDxhbnk+dGgpLl9sYm9yZCwgUmlnaHRCb3JkZXI6ICg8YW55PnRoKS5fcmJvcmQsIE11bHRpOiB0aC5fbXVsdGksIE11bHRpQ29udGVudDogdGguX211bHRpX2NvbnRlbnQgfTtcclxuICAgICAgICAgICAgICAgIHRoaXMuVE1QUm93VEhzLnB1c2godG9BZGQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFNlIGhvIHVuIG1vZGVsbG8gY2hlIGRldmUgZnVuemlvbmFyZSBhIHJvd2dyb3VwaW5nIG1hIG5vbiDDqCBhbmNvcmEgc3RhdGEgZWZmZXR0dWF0YSBuZXNzdW5hIHJpY2VyY2Egc3VpIGdydXBwaSBwcmluY2lwYWxpIChncm91cGluZ3NVbmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICAvLyBsaSBnZW5lcm8gZSBtYW5kbyBsYSBwcmltYSByaWNlcmNhIGNoZSBkZXYnZXNzZXJlIHNwZWRpdGEgYWwgYmFja2VuZCBwZXIgaWwgcHJpbW8gY2FyaWNhbWVudG8gZGVpIGdydXBwaVxyXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwaW5nc1VuZGVmaW5lZCAmJiAodGgudGhBZ2dyZWdhdGlvbiB8fCB0aC50aEdyb3VwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBncm91cEFnZ3JlZ2F0aW9uczogR3JvdXBPckFnZ3JlZ2F0aW9uW10gPSB0aGlzLnJvd0dyb3VwaW5nX0guZ2V0R3JvdXBBZ2dyZWdhdGlvbnModGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2FzdGVkVmlldy5ncm91cGluZ3MpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RlZFZpZXcuZ3JvdXBpbmdzID0gZ3JvdXBBZ2dyZWdhdGlvbnM7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXN0ZWRWaWV3Lmdyb3VwaW5ncy5wdXNoKC4uLmdyb3VwQWdncmVnYXRpb25zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5SZXNlYXJjaE5lZWRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcG9zdGEgbGEgcmljZXJjYSBkaSB1bmEgcGFnaW5hIGluIGF2YW50aSAobyBpbmRpZXRybylcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBOdW1lcm8gZGkgcGFnaW5lIGRhIGFnZ2l1bmdlcmUgKG8gc290dHJhcnJlLCBzZSBuZWdhdGl2bykgYWxsYSBwYWdpbmEgYXR0dWFsZVxyXG4gICAgICogQHBhcmFtIHthbnl9IHBhZ2VyIEVsZW1lbnRvIGRpIHNlcGFyYXppb25lIHN1IGN1aSDDqCBlZmZldHR1YXRhIGxhIHJpY2VyY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFRvUGFnZUdyb3VwKHBhZ2U6IG51bWJlciwgcGFnZXI6IEdyb3VwUGFnZXIpIHtcclxuICAgICAgICB0aGlzLmdvVG9QYWdlR3JvdXAocGFnZXIudmlldy5wYWdlICsgcGFnZSwgcGFnZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Bvc3RhIGxhIHJpY2VyY2EgYWxsYSBwYWdpbmEgc3BlY2lmaWNhdGFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBQYWdpbmEgYSBjdWkgbmF2aWdhcmVcclxuICAgICAqIEBwYXJhbSB7YW55fSBwYWdlciBFbGVtZW50byBkaSBzZXBhcmF6aW9uZSBzdSBjdWkgw6ggZWZmZXR0dWF0YSBsYSByaWNlcmNhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnb1RvUGFnZUdyb3VwKHBhZ2U6IG51bWJlciwgcGFnZXI6IEdyb3VwUGFnZXIpIHtcclxuXHJcbiAgICAgICAgbGV0IGFwcFNlYXJjaEVsZW1lbnQgPSBwYWdlci52aWV3O1xyXG4gICAgICAgIGlmIChwYWdlID09PSAwIHx8IChwYWdlID4gYXBwU2VhcmNoRWxlbWVudC5wYWdlcyAmJiBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzID4gMCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgYXBwU2VhcmNoRWxlbWVudC5wYWdlID0gcGFnZTtcclxuICAgICAgICBwYWdlci5idXR0b25zID0gdGhpcy51dGlsaXRpZXNfSC5nZXRQYWdlc0FycmF5KDYsIGFwcFNlYXJjaEVsZW1lbnQucGFnZSwgYXBwU2VhcmNoRWxlbWVudC5wYWdlcyk7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QoZmFsc2UsIGFwcFNlYXJjaEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBUT0RPIFNwb3N0YXJlIGluIFNlbGVjdGlvbkhhbmRsZXJcclxuICAgICAqIFxyXG4gICAgICogR2VzdGlzY2UgaSBjbGljayBzdWxsYSB0YWJlbGxhIHNvbG8gcGVyIGxlIHJpZ2hlIGEgZ3J1cHBvLiBcclxuICAgICAqIE8gcmltdW92ZSBnbGkgZWxlbWVudGkgYXR0dWFsbWVudGUgcHJlc2VudGkgbyBjYXJpY2EgaWwgY29udGVudXRvIGRlbCBncnVwcG9cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gZ3JvdXAgR3J1cHBvIGJpbmRhdG8gc3UgY3VpIHNpIMOoIGVmZmV0dHVhdG8gaWwgY2xpY2tcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbCdvcGVyYWl6b25lIMOoIGFuZGF0YSBhIGJ1b24gZmluZSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhbmRsZUdyb3VwQ2xpY2soZ3JvdXA6IEdyb3VwKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGNhc3RlZCA9IHRoaXMuVmlldyBhcyBBcHBTZWFyY2g8YW55PjtcclxuICAgICAgICBsZXQgYW55RyA9ICg8YW55Pmdyb3VwKTtcclxuICAgICAgICBhbnlHLl9leHBhbmRlZCA9ICFhbnlHLl9leHBhbmRlZDtcclxuXHJcbiAgICAgICAgLy8gU29ubyBpbiBtb2RhbGl0w6AgcmFnZ3J1cHBhbWVudG8gdmlydHVhbGUgZGEgYXJyYXk6IEVzcGFuZGVyZSBzaWduaWZpY2EgcmVuZGVyZSB2aXNpYmlsaSB0dXR0aSBnbGkgb2dnZXR0aSByZWxhdGl2aSBhIHF1ZXN0byBncnVwcG8sIHZpY2V2ZXJzYSBpbCBjb250cmFycmVcclxuICAgICAgICBpZiAodGhpcy5BcnJheUdyb3VwaW5nKSB7XHJcbiAgICAgICAgICAgIGxldCBhbGxSZWxhdGl2ZXMgPSB0aGlzLmJvdW5kU291cmNlLmZpbHRlcih0ID0+XHJcbiAgICAgICAgICAgICAgICAodC5fZ3JvdXAgJiYgKChhbnlHLl9leHBhbmRlZCAmJiB0Ll9wYXJlbnQgPT0gYW55Ry5fdGhpc0tleSkgfHwgKCFhbnlHLl9leHBhbmRlZCAmJiB0Ll9wYXJlbnQgJiYgdC5fcGFyZW50LnN0YXJ0c1dpdGgoYW55Ry5fdGhpc0tleSkpKSkgfHxcclxuICAgICAgICAgICAgICAgICh0Ll9pdGVtICYmICgoYW55Ry5fZXhwYW5kZWQgJiYgdC5fdGhpc0tleSA9PSBhbnlHLl90aGlzS2V5KSB8fCAoIWFueUcuX2V4cGFuZGVkICYmIHQuX3RoaXNLZXkuc3RhcnRzV2l0aChhbnlHLl90aGlzS2V5KSkpKSlcclxuICAgICAgICAgICAgYWxsUmVsYXRpdmVzLmZvckVhY2godCA9PiB7IHQuX3Zpc2libGUgPSBhbnlHLl9leHBhbmRlZDsgaWYgKHQuX2dyb3VwKSB0Ll9leHBhbmRlZCA9IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYW55Ry5fZXhwYW5kZWQpIHtcclxuICAgICAgICAgICAgLy8gUmVzZXR0byBpcHBcclxuICAgICAgICAgICAgY2FzdGVkLml0ZW1zcGVycGFnZW92ZXJyaWRlID0gMTU7XHJcbiAgICAgICAgICAgIGlmICghY2FzdGVkLnJlcXVlc3RlZGdyb3VwcylcclxuICAgICAgICAgICAgICAgIGNhc3RlZC5yZXF1ZXN0ZWRncm91cHMgPSBbbmV3IEdyb3VwRmlsdGVyKGdyb3VwLmNvbHVtbiwgZ3JvdXAudmFsdWUpXTtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbGV2ZWwgPSBhbnlHLl9ncm91cGxldmVsO1xyXG4gICAgICAgICAgICAgICAgLy8gc2UgaWwgZ3J1cHBvIGNsaWNjYXRvIG5vbiBoYSB1biBsaXZlbGxvIMOoIGlsIHByaW1vIGdydXBwbywgcXVpbmRpIG9yZGluYW1lbnRvIHVuaWNvXHJcbiAgICAgICAgICAgICAgICAvLyBhbHRyaW1lbnRpIGRldm8gcmltdW92ZXJlIHR1dHRpIGkgZmlsdHJpIHN1IGxpdmVsbGkgc3VwZXJpb3JpIGFsIGxldmVsIGNsaWNjYXRvIGUgYWdnaXVuZ2VyZSBpbCBsZXZlbCBjbGljY2F0b1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsZXZlbClcclxuICAgICAgICAgICAgICAgICAgICBjYXN0ZWQucmVxdWVzdGVkZ3JvdXBzID0gW25ldyBHcm91cEZpbHRlcihncm91cC5jb2x1bW4sIGdyb3VwLnZhbHVlKV07XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXN0ZWQucmVxdWVzdGVkZ3JvdXBzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgYW55Ry5fcGFyZW50Um91dGUuZm9yRWFjaCgoc3RlcDogR3JvdXBSb3V0ZUZyYWdtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RlZC5yZXF1ZXN0ZWRncm91cHMucHVzaChuZXcgR3JvdXBGaWx0ZXIoc3RlcC5jb2x1bW4sIHN0ZXAudmFsdWUpKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBjYXN0ZWQucmVxdWVzdGVkZ3JvdXBzLnB1c2gobmV3IEdyb3VwRmlsdGVyKGdyb3VwLmNvbHVtbiwgZ3JvdXAudmFsdWUpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcGF0aCA9IChhbnlHLl9wYXJlbnQgfHwgJycpICsgZ3JvdXAudmFsdWU7XHJcblxyXG4gICAgICAgICAgICAvLyBTZSBobyBjaGl1c28gdW4gZ3J1cHBvIG5vbiBtaSBzZXJ2ZSByaWVmZmV0dHVhcmUgcmljZXJjZSwgbWkgYmFzdGEgZWxpbWluYXJlIGRhZ2xpIG9nZ2V0dGkgYmluZGF0aSB0dXR0aSBnbGkgZWxlbWVudGkgc290dG9zdGFudGkgYSBxdWVsIGdydXBwb1xyXG4gICAgICAgICAgICB0aGlzLmJvdW5kU291cmNlID0gdGhpcy5ib3VuZFNvdXJjZS5maWx0ZXIodCA9PiAhdC5fcGFyZW50IHx8ICF0Ll9wYXJlbnQuc3RhcnRzV2l0aChwYXRoKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBkZXZvIHBlcsOyIGFuY2hlIHJpbXVvdmVyZSBldmVudHVhbGkgY2FjaGUgcmVsYXRpdmVcclxuICAgICAgICAgICAgdGhpcy5ncm91cFNlYXJjaFJlcXVlc3RzQ2FjaGUgPSB0aGlzLmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZS5maWx0ZXIodCA9PiB0LnBhdGggIT0gcGF0aCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXN0aXNjZSBsYSBzZWxlemlvbmUgZ2xvYmFsZSBkZWdsaSBvZ2dldHRpLCBzaWEgcGVyIHBhZ2luYSBjaGUgYSBsaXZlbGxvIGRpICoqU2VsZWN0QWxsKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlZFZhbCBWYWxvcmUgZm9yemF0byBkaSBjaGVjayBkYSBhc3NlZ25hcmUgYWdsaSBvZ2dldHRpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnbG9iYWxDaGVja0NoYW5nZWQoZm9yY2VkVmFsOiBib29sZWFuID0gbnVsbCkge1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzKCk7XHJcblxyXG4gICAgICAgIC8vIFByZW5kbyB0dXR0aSBnbGkgZWxlbWVudGkgcHJlc2VudGkgaW4gcXVlc3RhIHZpc3RhLiBTZSBobyBncnVwcGkgcHJlbmRvIHNvbG8gaSBncnVwcGkgYSBsaXZlbGxvIDAsIGFsdHJpbWVudGkgcHJlbmRvIHR1dHRpIGdsaSBvZ2dldHRpIHBlciBzZWxlemlvbmFybGlcclxuICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLmJvdW5kU291cmNlLmZpbmQodCA9PiB0Ll9ncm91cCkgPyB0aGlzLmJvdW5kU291cmNlLmZpbHRlcih0ID0+IHQuX2dyb3VwICYmICF0Ll9wYXJlbnQpIDogdGhpcy5ib3VuZFNvdXJjZTtcclxuICAgICAgICB2YXIgaXRlbVNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uX0guaGFuZGxlSXRlbXNTZWxlY3Rpb24oaXRlbXMsIGZvcmNlZFZhbCwgdGhpcy5nbG9iYWxDaGVjayk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoaXRlbVNlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAVE9ETyBTcG9zdGFyZSBpbiBTZWxlY3Rpb25IYW5kbGVyXHJcbiAgICAgKiBcclxuICAgICAqIEdlc3Rpc2NlIGkgY2xpY2sgc3VsbGEgdGFiZWxsYSwgZ2VzdGVuZG8gZXZlbnR1YWxtZW50ZSBhbmNoZSBnbGkgU2hpZnQgKyBDbGljayBwZXIgc2VsZXppb25hcmUgdW4gcmFuZ2UgZGkgb2dnZXR0aVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55fSBldmVudCBFdmVudG8gbmF0aXZvIEhUTUwgZGVsIGNsaWNrXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIGJpbmRhdG8gc3UgY3VpIHNpIMOoIGVmZmV0dHVhdG8gaWwgY2xpY2tcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbCdvcGVyYWl6b25lIMOoIGFuZGF0YSBhIGJ1b24gZmluZSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhbmRsZUNsaWNrKGV2ZW50OiBhbnksIGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJUZXh0U2VsZWN0aW9uKGV2ZW50KTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzKCk7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RlZGl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSAmJiB0aGlzLlNoaWZ0Q2xpY2sgJiYgIXRoaXMuU2luZ2xlU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGxldCBzdGFydFNlbGVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5ib3VuZFNvdXJjZS5maWx0ZXIodCA9PiAhdC5fZ3JvdXAgJiYgIXQuX3NlcCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCB0ID0gaXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRTZWxlY3RpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0Ll9zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRpdGVtcy5wdXNoKHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCh0ID09IGl0ZW0gfHwgdCA9PSB0aGlzLmxhc3RTZWxlY3RlZCkgJiYgIXN0YXJ0U2VsZWN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRTZWxlY3RpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHQuX3NlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZGl0ZW1zLnB1c2godCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0ID09IGl0ZW0gfHwgdCA9PSB0aGlzLmxhc3RTZWxlY3RlZCkgJiYgc3RhcnRTZWxlY3RpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRTZWxlY3RpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGl0ZW0uX3NlbGVjdGVkID0gIWl0ZW0uX3NlbGVjdGVkO1xyXG4gICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZCA9IGl0ZW07XHJcbiAgICAgICAgICAgIHNlbGVjdGVkaXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBpdGVtU2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25fSC5oYW5kbGVJdGVtc1NlbGVjdGlvbihzZWxlY3RlZGl0ZW1zKTtcclxuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQuZW1pdChpdGVtU2VsZWN0aW9uKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcG9zdGEgbGEgcmljZXJjYSBkaSB1bmEgcGFnaW5hIGluIGF2YW50aSAobyBpbmRlaXRybylcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBOdW1lcm8gZGkgcGFnaW5lIGRhIGFnZ2l1bmdlcmUgKG8gc290dHJhcnJlLCBzZSBuZWdhdGl2bykgYWxsYSBwYWdpbmEgYXR0dWFsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIGxldCB2aWV3ID0gdGhpcy5NYWluR3JvdXBWaWV3ID8gdGhpcy5NYWluR3JvdXBWaWV3IDogdGhpcy5WaWV3O1xyXG5cclxuICAgICAgICB0aGlzLmdvVG9QYWdlKCgodGhpcy5TZWFyY2hWaWV3IHx8IHZpZXcpPy5wYWdlIHx8IDApICsgcGFnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcG9zdGEgbGEgcmljZXJjYSBhbGxhIHBhZ2luYSBzcGVjaWZpY2F0YVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlIFBhZ2luYSBhIGN1aSBuYXZpZ2FyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ29Ub1BhZ2UocGFnZTogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHZpZXcgPSB0aGlzLk1haW5Hcm91cFZpZXcgPyB0aGlzLk1haW5Hcm91cFZpZXcgOiAodGhpcy5hcnJheU1vZGUgPyB0aGlzLlNlYXJjaFZpZXcgOiB0aGlzLlZpZXcpO1xyXG4gICAgICAgIGlmICghdmlldy5wYWdlIHx8ICF2aWV3LnBhZ2VzKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBhcHBTZWFyY2hFbGVtZW50ID0gdGhpcy5TZWFyY2hWaWV3IHx8IHZpZXc7XHJcbiAgICAgICAgaWYgKHBhZ2UgPT09IDAgfHwgKHBhZ2UgPiBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzICYmIGFwcFNlYXJjaEVsZW1lbnQucGFnZXMgPiAwKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBhcHBTZWFyY2hFbGVtZW50LnBhZ2UgPSBwYWdlO1xyXG4gICAgICAgIGxldCBjb3VudCA9ICh2aWV3Lml0ZW1zLmxlbmd0aCB8fCB2aWV3Lmdyb3Vwcz8ubGVuZ3RoIHx8IDApO1xyXG4gICAgICAgIGxldCBpcHAgPSB2aWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlIHx8IDE1O1xyXG4gICAgICAgIHRoaXMuYXJyYXlQdWxzYW50aSA9IHRoaXMudXRpbGl0aWVzX0guZ2V0UGFnZXNBcnJheSg2LCBhcHBTZWFyY2hFbGVtZW50LnBhZ2UsIGFwcFNlYXJjaEVsZW1lbnQucGFnZXMsIGNvdW50LCBpcHApO1xyXG5cclxuICAgICAgICBsZXQgaGFzR3JvdXBpbmdzID0gISF0aGlzLk1haW5Hcm91cFZpZXc7XHJcbiAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdChmYWxzZSwgaGFzR3JvdXBpbmdzID8gdmlldyA6IHRoaXMuU2VhcmNoVmlldyA/IHRoaXMuU2VhcmNoVmlldyA6IG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnRvIHJpY2hpYW1hdG8gc3VsIGNhbWJpbyBkZWxsYSBwYWdpbmF6aW9uZS4gVmVycsOgIHJpY2hpYW1hdG8gbCdldmVudG8gKiplbWl0U2VhcmNoUmVxdWVzdCoqXHJcbiAgICAgKiBwZXIgY29tdW5pY2FyZSBhbCBjb21wb25lbnRlIGNoZSB1dGlsaXp6YSBxdWVzdGEgdGFiZWxsYSBjaGUgaSBkYXRpIHNvbm8gZGEgYWdnaW9ybmFyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25JdGVtc1BlclBhZ2VDaGFuZ2VkKG5ld0lwcCkge1xyXG4gICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlZpZXcuaXRlbXNwZXJwYWdlb3ZlcnJpZGUgPSBuZXdJcHA7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuTWFpbkdyb3VwVmlldylcclxuICAgICAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlLCB0aGlzLk1haW5Hcm91cFZpZXcpO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuU2VhcmNoVmlldykge1xyXG4gICAgICAgICAgICAvLyBRdWVzdG8gc2Vjb25kbyBtZSBzaSBwdcOyIHBvcnRhcmUgYSBsaXZlbGxvIHVuIHBvJyBwacO5IGFsdG9cclxuICAgICAgICAgICAgdGhpcy5TZWFyY2hWaWV3LnBhZ2UgPSAxO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KHRydWUsIHRoaXMuU2VhcmNoVmlldyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gc3VsIGNhbWJpbyBkZWxsYSBwYWdpbmF6aW9uZS4gVmVycsOgIHJpY2hpYW1hdG8gbCdldmVudG8gKiplbWl0U2VhcmNoUmVxdWVzdCoqIGNvbiBsYSB2aXN0YSBkZWwgc2VwYXJhdG9yZSAqL1xyXG4gICAgcHVibGljIG9uR3JvdXBJdGVtc1BlclBhZ2VDaGFuZ2VkKHBhZ2VyOiBHcm91cFBhZ2VyLCBuZXdJcHA6IG51bWJlcikge1xyXG4gICAgICAgIHBhZ2VyLnZpZXcuaXRlbXNwZXJwYWdlb3ZlcnJpZGUgPSBuZXdJcHA7XHJcbiAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlLCBwYWdlci52aWV3KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqIE1ldG9kbyBjaGUgZ2VzdGlzY2UgbGEgbW9kaWZpY2EgZGVsIHRlbXBvIHNwZWNpZmljYXRvIHBlciBsJ2FnZ2lvcm5hbWVudG8gYXV0b21hdGljbyAqL1xyXG4gICAgcHVibGljIGF1dG9VcGRhdGVDaGFuZ2VkKCkge1xyXG4gICAgICAgIGlmICghL15bMS05XVxcZCokLy50ZXN0KHRoaXMuc2Vjb25kcykpXHJcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kcyA9ICcxMCc7XHJcblxyXG4gICAgICAgIGxldCBzZWNvbmRzSW5NcyA9IHBhcnNlSW50KHRoaXMuc2Vjb25kcywgbnVsbCkgKiAxMDAwO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hdXRvVXBkYXRlKVxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4geyB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KGZhbHNlKTsgfSwgc2Vjb25kc0luTXMpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnVwZGF0ZVRpbWVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBjaGlhbWF0byBkYWwgY2xpY2sgc3UgdW5hIGRlbGxlIGNvbG9ubmUgZ2VuZXJhdGUgZGFsbCdJbnB1dCAqKkR5bmFtaWNPcGVyYXRpb25zKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBMJ29nZ2V0dG8gc3UgY3VpIHZhIGVmZmV0dHVhdGEgbCdvcGVyYXppb25lXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3BpZCBDb2RpY2UgaWRlbnRpZmljYXRpdm8gZGVsbCdvcGVyYXppb25lIGRhIGVmZmV0dHVhcnNpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkeW5hbWljT3BlcmF0aW9uKGl0ZW06IGFueSwgb3BpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5vbkR5bmFtaWNPcGVyYXRpb24uZW1pdCh7IGlkOiBvcGlkLCBpdGVtOiBpdGVtIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpbCBjb250ZW51dG8gZGVsbCdFc1RkIGRhIHV0aWxpenphcmUgcGVyIGxhIGNvbG9ubmEgc3BlY2lmaWNhdGFcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtbiBDb2xvbm5hIHBlciBjdWkgY2VyY2FyZSBsYSBjZWxsYVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTm9tZSBkaXJldHRvIHBlciBjZXJjYXJlIGlsIFREIGNvbiBsJ0lELiBRdWVzdGEgdmFyaWFiaWxlIGhhIHByaW9yaXTDoCByaXNwZXR0byBhICoqY29sdW1uKipcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge1RlbXBsYXRlUmVmPGFueT59IFRlbXBsYXRlIGRhIHVzYXJlIHBlciBsYSBjb2xvbm5hXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaW5kRXNUZChjb2x1bW46IHN0cmluZywgbmFtZTogc3RyaW5nID0gbnVsbCk6IFRlbXBsYXRlUmVmPGFueT4ge1xyXG4gICAgICAgIHZhciBFc1RkID0gdGhpcy5Fc1Rkc0RpcmVjdGl2ZS5maW5kKChpdGVtKSA9PiBuYW1lID8gaXRlbS50ZCA9PT0gbmFtZSA6IGl0ZW0udGRGb3JQcm9wZXJ0eSA9PT0gY29sdW1uKTtcclxuICAgICAgICAvLyBOYW1lIG5vbiB0cm92YXRvLCBmYWxsYmFjayBhbCBub21lIGRlbGxhIGNvbG9ubmFcclxuICAgICAgICBpZiAobmFtZSAmJiBjb2x1bW4gJiYgIUVzVGQpXHJcbiAgICAgICAgICAgIEVzVGQgPSB0aGlzLkVzVGRzRGlyZWN0aXZlLmZpbmQoKGl0ZW0pID0+IGl0ZW0udGRGb3JQcm9wZXJ0eSA9PT0gY29sdW1uKTtcclxuICAgICAgICByZXR1cm4gRXNUZCA/IEVzVGQuVGVtcGxhdGUgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpbCBjb250ZW51dG8gZGVsbCdlZGl0b3IgRXNUZCBkYSB1dGlsaXp6YXJlIHBlciBsYSBjb2xvbm5hIHNwZWNpZmljYXRhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW4gQ29sb25uYSBwZXIgY3VpIGNlcmNhcmUgbCdlZGl0b3JcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5vbWUgZGlyZXR0byBwZXIgY2VyY2FyZSBsJ0VkaXRvciBjb24gbCdJRC4gUXVlc3RhIHZhcmlhYmlsZSBoYSBwcmlvcml0w6AgcmlzcGV0dG8gYSAqKmNvbHVtbioqXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtUZW1wbGF0ZVJlZjxhbnk+fSBUZW1wbGF0ZSBkYSB1c2FyZSBwZXIgbGEgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmluZEVkaXRvcihjb2x1bW46IHN0cmluZywgbmFtZTogc3RyaW5nID0gbnVsbCk6IFRlbXBsYXRlUmVmPGFueT4ge1xyXG4gICAgICAgIHZhciBFZGl0b3IgPSB0aGlzLkVzVGRFZGl0b3JEaXJlY3RpdmVzLmZpbmQoKGl0ZW0pID0+IG5hbWUgPyBpdGVtLmVkaXRvciA9PT0gbmFtZSA6IGl0ZW0uZWRpdG9yRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgLy8gTmFtZSBub24gdHJvdmF0bywgZmFsbGJhY2sgYWwgbm9tZSBkZWxsYSBjb2xvbm5hXHJcbiAgICAgICAgaWYgKG5hbWUgJiYgY29sdW1uICYmICFFZGl0b3IpXHJcbiAgICAgICAgICAgIEVkaXRvciA9IHRoaXMuRXNUZEVkaXRvckRpcmVjdGl2ZXMuZmluZCgoaXRlbSkgPT4gaXRlbS5lZGl0b3JGb3JQcm9wZXJ0eSA9PT0gY29sdW1uKTtcclxuICAgICAgICByZXR1cm4gRWRpdG9yID8gRWRpdG9yLlRlbXBsYXRlIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVxdWl2YWxlbnRlIGRlbCBtZXRvZG8gKiphZGRUb1BhZ2UqKiByaWFkYXR0YXRvIHBlciBsYSBtb2RhbGl0w6AgYXJyYXlcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBOdW1lcm8gZGkgcGFnaW5lIGRhIGFnZ2l1bmdlcmUgKG8gc290dHJhcnJlLCBzZSBuZWdhdGl2bykgYWxsYSBwYWdpbmEgYXR0dWFsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXJyYXlBZGRUb1BhZ2UocGFnZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5hcnJheUdvVG9QYWdlKHRoaXMuYXJyYXltb2RlUGFnZSArIHBhZ2UpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFcXVpdmFsZW50ZSBkZWwgbWV0b2RvICoqZ29Ub1BhZ2UqKiByaWFkYXR0YXRvIHBlciBsYSBtb2RhbGl0w6AgYXJyYXlcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBQYWdpbmEgYSBjdWkgbmF2aWdhcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFycmF5R29Ub1BhZ2UocGFnZTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHBhZ2UgPT09IDAgfHwgcGFnZSA+IHRoaXMuYXJyYXltb2RlUGFnZXMpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB0aGlzLmFycmF5bW9kZVBhZ2UgPSBwYWdlO1xyXG5cclxuICAgICAgICAvLyBSaWZvcnpvIGlsIHdyaXRldmFsdWUgaW4gbW9kbyBjaGUgaWwgY29kaWNlIHBhc3NpIGRhbGxhIGdlc3Rpb25lIGNvbWUgc2UgZm9zc2UgZmF0dGEgcmlwYXJ0aXJlIHVuYSByaWNlcmNhXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFdyaXRlVmFsdWUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlc3Rpb25lIGRlaSBjbGljayBzdWxsZSBvcHppb25pIGRlbCBtZW7DuSBjb250ZXN0dWFsZSBpbiBhbHRvIGEgZGVzdHJhIGdlbmVyYXRvIGRhbGwnSW5wdXQgKipDb3JuZXJNZW51T3B0aW9ucyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvcm5lcmlkIENvZGljZSBkZWxsJ29wZXJhemlvbmUgc2VsZXppb25hdGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvcm5lckFjdGlvbkNsaWNrZWQoY29ybmVyaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMub25Db3JuZXJBY3Rpb24uZW1pdCh7IGlkOiBjb3JuZXJpZCwgZXN0YWJsZTogdGhpcyB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBJbXBvc3RhemlvbmUgbW9kYWxpdMOgIGRlbGwnRXNUYWJsZSBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHsnYXJyYXknIHwgJ3ZpZXcnIHwgJ3JlcG9ydCd9IG1vZGUgTW9kYWxpdMOgIGRhIGltcG9zdGFyZVxyXG4gICAgICoqL1xyXG4gICAgcHJpdmF0ZSBzZXRNb2RlKG1vZGU6ICdhcnJheScgfCAndmlldycpIHtcclxuICAgICAgICB0aGlzLnZpZXdNb2RlID0gbW9kZSA9PSAndmlldyc7XHJcbiAgICAgICAgdGhpcy5hcnJheU1vZGUgPSBtb2RlID09ICdhcnJheSc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgcGVyIGVmZmV0dHVhcmUgY2hpYW1hdGUgaW50ZXJuZSBkaSBhbGxpbmVhbWVudG8gYWxsYSBmdW56aW9uZSAqKndyaXRlVmFsdWUqKiwgXHJcbiAgICAgKiBpbXBvc3RhbmRvIHByaW1hICoqaW50ZXJuYWxXcml0ZUNhbGwqKiBpbiBtb2RvIGRhIG5vbiBlZmZldHR1YXJlIG9wZXJhemlvbmkgaW51dGlsaVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW50ZXJuYWxXcml0ZVZhbHVlKCkge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxXcml0ZUNhbGwgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLlZpZXcpO1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxXcml0ZUNhbGwgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogTWV0b2RvIGV2ZW50dWFsbWVudGUgcmljaGlhbWFiaWxlIGFuY2hlIGRhbCBjb21wb25lbnRlIGVzdGVybm8gY2hlIHBlcm1ldHRlIGRpIGZvcnphcmUgdW4gcmVmcmVzaCBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBwdWJsaWMgZm9yY2VSZWZyZXNoKCkge1xyXG5cclxuICAgICAgICAvLyBTZSBzb25vIGluIG1vZGFsaXTDoCBWaWV3IHZpZW5lIG1hbnRlbnV0byBpbiBhdXRvbWF0aWNvIGlsIG51bWVybyBkaSBwYWdpbmEsIG1hIHBlciBsYSBtb2RhbGl0w6AgYXJyYXkgZGV2byBwcmVuZGVyZSBsZSBpbmZvIGRpIHBhZ2luYXppb25lIHByaW1hIGUgcmlhcHBsaWNhcmxlIGRvcG9cclxuICAgICAgICBsZXQgYXJyYXlQYWdlOiBudW1iZXI7XHJcbiAgICAgICAgbGV0IGFycmF5SXBwOiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuYXJyYXlNb2RlKSB7XHJcbiAgICAgICAgICAgIGFycmF5UGFnZSA9IHRoaXMuYXJyYXltb2RlUGFnZTtcclxuICAgICAgICAgICAgYXJyYXlJcHAgPSB0aGlzLkFycmF5bW9kZUl0ZW1zUGVyUGFnZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLlZpZXcpO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXJyYXlNb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQXJyYXltb2RlSXRlbXNQZXJQYWdlID0gYXJyYXlJcHA7XHJcbiAgICAgICAgICAgIHRoaXMuYXJyYXlHb1RvUGFnZShhcnJheVBhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bnppb25lIGNoZSBpbiBiYXNlIGFpIGNsaWNrIHN1IHVuYSBjZWxsYSBjYXBpc2NlIHNlIHN0byBlZmZldHR1YW5kbyB1bidvcGVyYXppb25lIGRpIHNlbGV6aW9uZSBvIHNlIHN0byBlbnRyYW5kbyBuZWxsJ2VkaXQgZGkgdW5hIGNlbGxhIGNvbiB1biBkb3BwaW8gY2xpY2tcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9ICRldmVudCBFdmVudG8gbmF0aXZvIGphdmFzY3JpcHRcclxuICAgICAqIEBwYXJhbSB7VGRFbGVtZW50fSByb3dJdGVtIFJpZmVyaW1lbnRvIGEgYmluZGVyIGRlbGxhIHJpZ2FcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIEl0ZW0gY2hlIHJhcHByZXNlbnRhIGlsIGNvbnRlc3RvIHN1IGN1aSDDqCBzdGF0byBlZmZldHR1YXRvIHVuIGNsaWNrXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcm93SW5kZXggSW5kaWNlIGRlbGxhIHJpZ2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRiQ2xpY2tFZGl0T3JTaW5nbGVDbGlja1Jvd1NlbGVjdGlvbigkZXZlbnQ6IGFueSwgcm93SXRlbTogVGRFbGVtZW50LCBpdGVtOiBhbnksIHJvd0luZGV4OiBudW1iZXIpIHtcclxuXHJcbiAgICAgICAgLy8gTW9kYWxpdMOgIEVkaXRhYmxlLCBnZXN0aXNjbyBpIGRvcHBpIGNsaWNrIHNlbnphIHBlcsOyIHJhbGxlbnRhcmUgbGEgbW9kYWxpdMOgIGRpIHNlbGV6aW9uZSBhIHJhbmdlXHJcbiAgICAgICAgaWYgKHRoaXMuRWRpdGFibGUpIHtcclxuICAgICAgICAgICAgLy8gU2Vjb25kbyBjbGljazogc2UgaWwgdGltZXIgbm9uIMOoIHNjYWR1dG8gw6ggdW4gZG9wcGlvIGNsaWNrIGVkIGVzZWd1byBpbCByZXN0b1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jZWxsRGJDbGlja1RpbWVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocm93SXRlbS5Qcm9wZXJ0eU5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR1cFVzZXJFZGl0KHJvd0l0ZW0sIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckNlbGxDbGlja1RpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFByaW1vIGNsaWNrOiBub24gZmEgbmllbnRlIGUgc2UgaWwgdGVtcG8gcGVyIGlsIHNlY29uZG8gY2xpY2sgc2NhZGUgcmVzZXR0YSB0dXR0b1xyXG4gICAgICAgICAgICB0aGlzLmNlbGxEYkNsaWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJDZWxsQ2xpY2tUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUm93Q2xpY2soJGV2ZW50LCBpdGVtLCB0aGlzLlNlbGVjdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0sIHRoaXMuZG91YmxlQ2xpY2tCdWZmZXJNcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJbiBtb2RhbGl0w6AgYSByYW5nZSBsYSBjcmVhemlvbmUgZGVsIHJhbmdlIMOoIGdlc3RpdGEgZGFpIG1vdXNlZG93biwgbW92ZSBlZCB1cC4uLlxyXG4gICAgICAgIC8vIExhIHNlbGV6aW9uZSBkZWxsZSByaWdoZSBpbnZlY2Ugw6ggZ2VzdGl0YSBkYWxsZSBjYXNlbGxpbmUgYSBzaW5pc3RyYVxyXG4gICAgICAgIGlmICh0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFNlIGhvIGZhdHRvIGNsaWNrIGNvbCBjb250cm9sIGF0dGFjY2F0byBlc2NvIHN1Yml0byBkYXRvIGNoZSBkZXZlIHNvbG8gcGVybWV0dGVyZSBsYSBuYXZpZ2F6aW9uZSBkZWkgbGlua1xyXG4gICAgICAgIGlmICgkZXZlbnQuY3RybEtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBUdXR0aSBpIGNsaWNrIHN1IHVuYSBjZWxsYSBnacOgIGluIGVkaXQgbm9uIGRldm9ubyBlZmZldHR1YXJlIGxhIHNlbGV6aW9uZSBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCh0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbj8ubGVuZ3RoID4gMCAmJiAoPEVzVGFibGVDb2x1bW5zRGVmaW5pdGlvbj48YW55PnJvd0l0ZW0pLmVkaXRzICYmICg8RXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uPjxhbnk+cm93SXRlbSkuZWRpdHNbaXRlbS5faGFzaF0/Ll9lZGl0aW5nKSB8fFxyXG4gICAgICAgICAgICAoPGFueT5yb3dJdGVtKS5fZWRpdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBQZXIgZXZpdGFyZSBkaSByYWxsZW50YXJlIGEgcHJlc2NpbmRlcmVcclxuICAgICAgICBpZiAoIXRoaXMuRWRpdGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVSb3dDbGljaygkZXZlbnQsIGl0ZW0sIHRoaXMuU2VsZWN0aW9uLCB0cnVlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogRXZlbnRvIGNoZSBnZXN0aXNjZSBpbCBjb21hbmRvIFwiQ29waWFcIiBidXR0YW5kbyBpIHZhbG9yaSBzZWxlemlvbmF0aSBuZWxsYSBjbGlwYm9hcmQgaW4gYmFzZSBhbCBsb3JvIHRpcG8gKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQ29weSgpIHtcclxuICAgICAgICBpZighdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxldCBzZWwgPSB0aGlzLnNlbGVjdGlvbl9ILmdldFNlbGVjdGlvblN0YXR1c1NlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWwubGVuZ3RoID4gMCAmJiBzZWxbMF0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgc2VsZWN0aW9uVGV4dCA9IHRoaXMuc2VsZWN0aW9uX0guZ2V0Q2xpcGJhcmRUZXh0RnJvbVNlbGVjdGlvbihzZWwpO1xyXG4gICAgICAgICAgICB0aGlzLmNsaXBib2FyZFNlcnZpY2UuY29weVRleHRUb0NsaXBib2FyZChzZWxlY3Rpb25UZXh0KTtcclxuICAgICAgICAgICAgdGhpcy5tc2dFeHRzLnNpbXBsZUluZm8odGhpcy5sYy5sb2MoXCJWYWx1ZXMgY29waWVkIGluIHRoZSBjbGlwYm9hcmRcIiksIFwidG9hc3RyXCIsIDEwMDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogRXZlbnRvIGNoZSBnZXN0aXNjZSBpbCBjb21hbmRvIFwiSW5jb2xsYVwiIHByZW5kZW5kbyBpIGRhdGkgZGVsbGEgY2xpcGJvYXJkIGUgYXBwbGljYW5kb2xpIGFsIHJhbmdlIGRpIHNlbGV6aW9uZSBhdHR1YWxlIGluIGJhc2UgYWwgdGlwbyBkZWxsZSBjZWxsZSBzb3R0byAqL1xyXG4gICAgaGFuZGxlUGFzdGUoKSB7XHJcbiAgICAgICAgaWYoIXRoaXMuUmFuZ2VTZWxlY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsZXQgc2VsID0gdGhpcy5zZWxlY3Rpb25fSC5nZXRTZWxlY3Rpb25TdGF0dXNTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsLmxlbmd0aCA+IDAgJiYgc2VsWzBdLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRTZXJ2aWNlLmdldENsaXBib2FyZChcIm1hdHJpeFwiLCAodmFsdWVzOiBzdHJpbmdbXVtdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBGaXggY2xpcGJvYXJkIHNlcnZpY2UgY2hlIHBhcmUgdW4gcG8nIHN0cm9uemEsIHJpbXVvdm8gbCd1bHRpbW8gYXJyYXkgc2UgbWkgYWNjb3JnbyBjaGUgw6ggdW4gc2luZ29sbyBhcnJheSBjb24gdW4gc29sbyBlbGVtZW50byB2dW90b1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwICYmIHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV0ubGVuZ3RoID09IDEgJiYgdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXVswXSA9PSAnJylcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuc3BsaWNlKHZhbHVlcy5sZW5ndGggLSAxLCAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDAgJiYgdmFsdWVzWzBdLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgc2UgbGEgbW9kaWZpY2Egw6ggYWJpbGl0YXRhXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLkVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubXNnRXh0cy5zaW1wbGVXYXJuaW5nKHRoaXMubGMubG9jKFwiRGF0YSBmb3IgdGhpcyB0YWJsZSBjYW5ub3QgYmUgZWRpdGVkXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29udHJvbGxvIGNoZSBxdWVsbG8gY2hlIHN0byBjb3BpYW5kbyBzaWEgZGVsbGEgc3Rlc3NhIGRpbWVuc2lvbmUgZGVsbGEgc2VsZXppb25lIHN1bGwnZXMtdGFibGUsIHRyYW5uZSBuZWwgY2FzbyBobyB1biBzaW5nb2xvIHZhbG9yZSBkYSBjb3BpYXJlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKChzZWwubGVuZ3RoICE9IHZhbHVlcy5sZW5ndGggfHwgc2VsWzBdLmxlbmd0aCAhPSB2YWx1ZXNbMF0ubGVuZ3RoKSAmJiAodmFsdWVzLmxlbmd0aCAhPSAxIHx8IHZhbHVlc1swXS5sZW5ndGggIT0gMSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tc2dFeHRzLnNpbXBsZVdhcm5pbmcodGhpcy5sYy5sb2MoXCJTaXplIG9mIGNvcGllZCBkYXRhIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzaXplIG9mIHRoZSBzZWxlY3Rpb25cIikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBTZSBsZSBkaW1lbnNpb25pIGNvaW5jaWRvbm8gY29waW8gZGEgdW5hIHBhcnRlIGFsbCdhbHRyYVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaGFuZ2VzOiBFc1RhYmxlTW9kZWxDaGFuZ2VbXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgc2VsLmxlbmd0aDsgcisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSBzZWxbcl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgcm93Lmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2VsbCA9IHJvd1tjXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlIGhvIHVuIHNpbmdvbG8gdmFsb3JlIGxvIGFwcGxpY28gYSB0dXR0YSBsYSBzZWxlemlvbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHZhbHVlcy5sZW5ndGggPT0gMSAmJiB2YWx1ZXNbMF0ubGVuZ3RoID09IDEgPyB2YWx1ZXNbMF1bMF0gOiB2YWx1ZXNbcl1bY11cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvbGQgPSBjZWxsLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5pdSA9IGNlbGwudmFsX3NldHRlcih2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9sZGRhdGUgPSB0aGlzLmRhdGVFeHRzLmdldERhdGVDb252ZXJ0aW9uKG9sZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbml1ZGF0ZSA9IHRoaXMuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24obml1KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgob2xkZGF0ZSAmJiBuaXVkYXRlICYmIG9sZGRhdGUuaXNTYW1lICYmIG9sZGRhdGUuaXNTYW1lKG5pdWRhdGUpKSB8fCBvbGQgPT09IG5pdSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2gobmV3IEVzVGFibGVNb2RlbENoYW5nZShjZWxsLml0ZW0sIGNlbGwuaGVhZGVyLCBjZWxsLnByb3BlcnR5LCBvbGQsIG5pdSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UuZW1pdChjaGFuZ2VzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSaXB1bGlzY2UgaWwgdGltZXIgdXRpbGl6emF0byBwZXIgY2FwaXJlIHNlIMOoIHN0YXRvIGVmZmV0dHVhdG8gdW4gZG9wcGlvIGNsaWNrIG8gbWVubyAqL1xyXG4gICAgcHJpdmF0ZSBjbGVhckNlbGxDbGlja1RpbWVyKCkge1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNlbGxEYkNsaWNrVGltZXIpXHJcbiAgICAgICAgdGhpcy5jZWxsRGJDbGlja1RpbWVyID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXIgY2xpY2sgc2luZ29sbyBzdSB1bmEgcmlnYVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gJGV2ZW50IEV2ZW50byBuYXRpdm8gamF2YXNjcmlwdFxyXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gSXRlbSBjaGUgcmFwcHJlc2VudGEgaWwgY29udGVzdG8gc3UgY3VpIMOoIHN0YXRvIGVmZmV0dHVhdG8gdW4gY2xpY2tcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VsZWN0aW9uIEluZGljYSBzZSBsYSBzZWxlemlvbmUgw6ggYXR0aXZhXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGludGVybmFsQ2FsbCBJbmRpY2Egc2UgbGEgY2hpYW1hdGEgYSBxdWVzdGEgZnVuemlvbmUgw6ggaW50ZXJuYTogcGVybWV0dGUgZGkgc2tpcHBhcmUgaSBjaGVjayBzdWxsZSBDdXN0b21DZWxsc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFuZGxlUm93Q2xpY2soJGV2ZW50OiBhbnksIGl0ZW06IGFueSwgc2VsZWN0aW9uOiBib29sZWFuLCBpbnRlcm5hbENhbGw6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIC8vIFNlIGhvIHVuIGN0cmwgcHJlbXV0byBlc2NvIGNvbiB0cnVlIGluIG1vZG8gZGEgZmFyZSBidWJibGluZyBkZWxsJ2V2ZW50byBlIGxhc2NpYXJsbyBnZXN0aXJlIGFsIGJyb3dzZXIgKGxpbmsgZWNjLi4uKVxyXG4gICAgICAgIC8vIFN0ZXNzYSBjb3NhIHNlIGhvIGN1c3RvbSBjZWxsIGRhdG8gY2hlIGxhIGdlc3Rpb25lIGRlaSBjbGljayB2aWVuZSBhZmZpZGF0YSBhaSBzaW5nb2xpIFREXHJcbiAgICAgICAgaWYgKCRldmVudC5jdHJsS2V5IHx8ICh0aGlzLlVzZUN1c3RvbUNlbGxzICYmICFpbnRlcm5hbENhbGwpKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiAhaXRlbS5sb2NrZWQgJiYgIWl0ZW0uX3NlcCAmJiAhaXRlbS5fZ3JvdXApIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5jbGVhclNlbGVjdGlvblN0YXR1cygpO1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNsaWNrKCRldmVudCwgaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGl0ZW0uX2dyb3VwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJTZWxlY3Rpb25TdGF0dXMoKTtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVHcm91cENsaWNrKGl0ZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gT3JhIGNoZSBub24gw6ggYXR0YWNjYXRvIGRpcmV0dGFtZW50ZSBhbGwnaHRtbCBkZXZvIGZhcmUgdW4gbWFya2ZvcmNoZWNrIGZpbml0ZSBsZSBvcGVyYXppb25pIHN1aSBncm91cGluZ1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VzdGlvbmUgZGVsIGNsaWNrIGRlc3RybyBzdWxsJ2VzLXRhYmxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblJpZ2h0Q2xpY2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLm9uT3BlbkNvbnRleHRNZW51LmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExhIG1vZGlmaWNhIGRlbGwndXRlbnRlIMOoIGluaXppYXRhLiBTaSBpbXBvc3RhIGxhIHZhcmlhYmlsZSByZWxhdGl2YSBhIFwidHJ1ZVwiIGluIG1vZG8gZGEgbW9zdHJhcmUgbCdpbnB1dCBkaSB0ZXN0b1xyXG4gICAgICogXHJcbiAgICAgKiBEb3BvIGNoZSBsJ2lucHV0IMOoIGFwcGFyc28sIGRvcG8gdW4gY2ljbG8gZGkgQ2hhbmdlIERldGVjdGlvbiB2aWVuZSBhdHRpdmF0byBpbCBTdWJqZWN0IGNvbGxlZ2F0byBhbGwnaW5wdXQgY2hlIHNlcnZpcsOgIGEgZWZmZXR0dWFyZSBpbCBmb2N1c1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge1RkRWxlbWVudH0gcm93SXRlbSBFbGVtZW50byBkaSByaWdhIHN1IGN1aSDDqCBzdGF0YSBhdHRpdmF0YSBsYSBtb2RpZmljYVxyXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gT2dnZXR0byBzb3ByYSBpbCBxdWFsZSDDqCBzdGF0YSBhdHRpdmF0YSBsYSBtb2RpZmljYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0dXBVc2VyRWRpdChyb3dJdGVtOiBUZEVsZW1lbnQsIGl0ZW06IGFueSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJTZWxlY3Rpb25TdGF0dXMoKTtcclxuICAgICAgICBpZiAodGhpcy5FZGl0YWJsZSAmJiByb3dJdGVtLlByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5EeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb24/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICg8RXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uPjxhbnk+cm93SXRlbSkuZWRpdHNbaXRlbS5faGFzaF0gPSB7IF9lZGl0aW5nOiB0cnVlLCBvbGRfdmFsdWU6IGl0ZW1bcm93SXRlbS5Qcm9wZXJ0eU5hbWVdIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAoPGFueT5yb3dJdGVtKS5fZWRpdGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAoPGFueT5yb3dJdGVtKS5vbGRfdmFsdWUgPSBpdGVtW3Jvd0l0ZW0uUHJvcGVydHlOYW1lXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLkZvY3VzU3ViamVjdC5uZXh0KCk7IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGEgbW9kaWZpY2EgZGVsbCd1dGVudGUgw6ggdGVybWluYXRhLiBTaSByZWltcG9zdGEgbGEgdmFyaWFiaWxlIHJlbGF0aXZhIGEgXCJmYWxzZVwiIGluIG1vZG8gZGEgbmFzY29uZGVyZSBsJ2lucHV0IGRpIHRlc3RvIGUgc2kgZW1ldHRlIGxhIG1vZGlmaWNhIGRlbCB2YWxvcmVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtUZEVsZW1lbnR9IHJvd0l0ZW0gRWxlbWVudG8gZGkgcmlnYSBzdSBjdWkgw6ggc3RhdGEgYXR0aXZhdGEgbGEgbW9kaWZpY2FcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gc29wcmEgaWwgcXVhbGUgw6ggc3RhdGEgYXR0aXZhdGEgbGEgbW9kaWZpY2FcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2x1bW5JbmRleCBJbmRpY2UgZGVsbGEgY29sb25uYSBzdSBjdWkgw6ggYXZ2ZW51dGEgbGEgbW9kaWZpY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpbmFsaXplVXNlckVkaXQocm93SXRlbTogVGRFbGVtZW50LCBpdGVtOiBhbnksIGNvbHVtbkluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgZHluTW9kZSA9IHRoaXMuRHluYW1pY1Jvd0NvbHVtbnNEZWZpbml0aW9uPy5sZW5ndGggPiAwO1xyXG4gICAgICAgIGxldCByb3dJdG0gPSBkeW5Nb2RlID8gKCg8RXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uPjxhbnk+cm93SXRlbSkuZWRpdHNbaXRlbS5faGFzaF0pIDogKDxhbnk+cm93SXRlbSk7XHJcbiAgICAgICAgcm93SXRtLl9lZGl0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGxldCBvbGQgPSByb3dJdG0ub2xkX3ZhbHVlO1xyXG4gICAgICAgIGxldCBuaXUgPSBkeW5Nb2RlID8gaXRlbS5wcm9wZXJ0aWVzW3Jvd0l0ZW0uUHJvcGVydHlOYW1lXSA6IGl0ZW1bcm93SXRlbS5Qcm9wZXJ0eU5hbWVdO1xyXG5cclxuICAgICAgICBsZXQgb2xkZGF0ZSA9IHRoaXMuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24ob2xkKTtcclxuICAgICAgICBsZXQgbml1ZGF0ZSA9IHRoaXMuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24obml1KTtcclxuICAgICAgICBpZiAoKG9sZGRhdGUgJiYgbml1ZGF0ZSAmJiBvbGRkYXRlLmlzU2FtZSAmJiBvbGRkYXRlLmlzU2FtZShuaXVkYXRlKSkgfHwgb2xkID09PSBuaXUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlLmVtaXQoW25ldyBFc1RhYmxlTW9kZWxDaGFuZ2UoaXRlbSwgcm93SXRlbS5JRCwgcm93SXRlbS5Qcm9wZXJ0eU5hbWUsIG9sZCwgbml1KV0pO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdW2NvbHVtbkluZGV4XS52YWxfc2V0dGVyKG5pdSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2VsZWN0ZWQoc291cmNlOiB7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVtdLCB2YWx1ZTogc3RyaW5nKTogeyBpZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nIH0ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChzb3VyY2VbaV0uaWQgPT0gdmFsdWUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlW2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyBpZDogXCJcIiwgZGVzY3JpcHRpb246IFwiXCIgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSYW5nZSBzZWxlY3Rpb24gRXhwZXJpbWVudGFsc1xyXG5cclxuICAgIHByaXZhdGUgbW91c2VJc0Rvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgZmlyc3RDb29yZGluYXRlczoge3JvdzogbnVtYmVyLCBjb2x1bW46IG51bWJlcn0gPSBudWxsO1xyXG5cclxuICAgIG1vdXNlZG93bihldmVudDogTW91c2VFdmVudCwgcm93SXRlbTogYW55LCBpdGVtOiBhbnkpIHtcclxuICAgICAgICAvLyBUYXN0byBkaXZlcnNvIGRhbCBjbGljayBzaW5pc3RybyAtPiBjaWFvIMOoIHN0YXRvIGJlbGxvIGUgaW50ZW5zb1xyXG4gICAgICAgIGlmKGV2ZW50LmJ1dHRvbnMgIT0gMSB8fCAhdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBTdG8gbGF2b3JhbmRvIHN1IFFVRVNUQSBlcy10YWJsZVxyXG4gICAgICAgIHRoaXMuY29weVBhc3RlRGV0ZWN0b3IuQWN0aXZlRXN0UmVmZXJlbmNlID0gdGhpcztcclxuXHJcbiAgICAgICAgLy8gVHV0dGkgaSBjbGljayBzdSB1bmEgY2VsbGEgZ2nDoCBpbiBlZGl0IG5vbiBkZXZvbm8gZWZmZXR0dWFyZSBsYSBzZWxlemlvbmUgZGVsbGEgcmlnYVxyXG4gICAgICAgIGlmICgodGhpcy5EeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb24/Lmxlbmd0aCA+IDAgJiYgKDxFc1RhYmxlQ29sdW1uc0RlZmluaXRpb24+PGFueT5yb3dJdGVtKS5lZGl0cyAmJiAoPEVzVGFibGVDb2x1bW5zRGVmaW5pdGlvbj48YW55PnJvd0l0ZW0pLmVkaXRzW2l0ZW0uX2hhc2hdPy5fZWRpdGluZykgfHxcclxuICAgICAgICAgICAgKDxhbnk+cm93SXRlbSkuX2VkaXRpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdmFyIGlkID0gKDxIVE1MRWxlbWVudD5ldmVudC5jdXJyZW50VGFyZ2V0KS5pZDtcclxuICAgICAgICB0aGlzLm1vdXNlSXNEb3duID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmZpcnN0Q29vcmRpbmF0ZXMgPSB7IHJvdzogcGFyc2VJbnQoaWQuc3BsaXQoJ18nKVswXSksIGNvbHVtbjogcGFyc2VJbnQoaWQuc3BsaXQoJ18nKVsxXSkgfVxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX0guc2luZ2xlQ2VsbFNlbGVjdGlvbih7IHZpZXc6IGV2ZW50LnZpZXcsIHNoaWZ0S2V5OiBmYWxzZSB9LCB0aGlzLmZpcnN0Q29vcmRpbmF0ZXMucm93LCB0aGlzLmZpcnN0Q29vcmRpbmF0ZXMuY29sdW1uKTtcclxuICAgIH1cclxuXHJcbiAgICBtb3VzZWVudGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgaWYoIXRoaXMuUmFuZ2VTZWxlY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbnMgPT0gMClcclxuICAgICAgICAgICAgdGhpcy5tb3VzZUlzRG93biA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5tb3VzZUlzRG93biAmJiB0aGlzLmZpcnN0Q29vcmRpbmF0ZXMpIHtcclxuICAgICAgICAgICAgdmFyIGlkID0gKDxIVE1MRWxlbWVudD5ldmVudC5jdXJyZW50VGFyZ2V0KS5pZDtcclxuICAgICAgICAgICAgdmFyIG5ld0Nvb3JkcyA9IHsgcm93OiBwYXJzZUludChpZC5zcGxpdCgnXycpWzBdKSwgY29sdW1uOiBwYXJzZUludChpZC5zcGxpdCgnXycpWzFdKSB9XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guc2luZ2xlQ2VsbFNlbGVjdGlvbih7IHZpZXc6IGV2ZW50LnZpZXcsIHNoaWZ0S2V5OiB0cnVlIH0sIG5ld0Nvb3Jkcy5yb3csIG5ld0Nvb3Jkcy5jb2x1bW4sIHRoaXMuZmlyc3RDb29yZGluYXRlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG1vdXNldXAoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIGlmICghdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLm1vdXNlSXNEb3duID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8qIFBpYW5nb1xyXG4gICAgcHJpdmF0ZSBFc1Rkc0xpc3Q6IEVzVGRSZWZlcmVuY2VbXSA9IFtdO1xyXG4gICAgZ2V0Q2VsbFJlZmVyZW5jZShvYmplY3Q6IGFueSwgY29sdW1uOiBzdHJpbmcpOiBFc1RkIHtcclxuICAgICAgICBsZXQgZmtUaGlzU2hpdEltT3V0ID0gdGhpcy51dGlFeHRzLmRlZXBDbG9uZShvYmplY3QpO1xyXG4gICAgICAgIHRoaXMudXRpbGl0aWVzX0guY2FsY3VsYXRlSGFzaChbZmtUaGlzU2hpdEltT3V0XSk7XHJcbiAgICAgICAgbGV0IHByb3AgPSBjb2x1bW47XHJcbiAgICAgICAgbGV0IGhhc2ggPSBma1RoaXNTaGl0SW1PdXQuX2hhc2g7XHJcblxyXG4gICAgICAgIGxldCB0b1JldCA9IHRoaXMuRXNUZHNMaXN0LmZpbmQoZiA9PiBmLmlkID09IHByb3AgJiYgZi5oYXNoID09IGhhc2gpPy5zZWxmO1xyXG4gICAgICAgIHJldHVybiB0b1JldDtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlckNlbGwoZXZlbnQ6IEVzVGRSZWZlcmVuY2UpIHtcclxuICAgICAgICB0aGlzLkVzVGRzTGlzdC5wdXNoKGV2ZW50KTtcclxuICAgIH1cclxuICAgIC8vKiBQaWFuZ28gYW5jb3JhXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBFc1RkUmVmZXJlbmNlIHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBoYXNoOiBzdHJpbmc7IFxyXG4gICAgc2VsZjogRXNUZDtcclxufSJdfQ==