@esfaenza/es-table 11.2.141 → 11.2.142
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.
- package/bundles/esfaenza-es-table.umd.js +1 -1
- package/bundles/esfaenza-es-table.umd.js.map +1 -1
- package/bundles/esfaenza-es-table.umd.min.js +1 -1
- package/bundles/esfaenza-es-table.umd.min.js.map +1 -1
- package/esfaenza-es-table.metadata.json +1 -1
- package/esm2015/lib/components/es-table/es_table.component.js +2 -2
- package/fesm2015/esfaenza-es-table.js +1 -1
- package/fesm2015/esfaenza-es-table.js.map +1 -1
- package/package.json +1 -1
|
@@ -1644,7 +1644,7 @@ EsTableComponent.decorators = [
|
|
|
1644
1644
|
viewProviders: [{ provide: LocalizationService, useClass: EsTableLoc }],
|
|
1645
1645
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1646
1646
|
encapsulation: ViewEncapsulation.None,
|
|
1647
|
-
template: "<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate\">\r\n <div class=\"pull-right\">\r\n {{'Update every' | localize : lc}} <input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" [ngModelOptions]=\"{'standalone': true}\" /> {{'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\" [ngModelOptions]=\"{'standalone': true}\" (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\" [style.height]=\"Height\" [style.background-color]=\"EmptySpaceBackgroundColor\">\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> {{'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> \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 est-full-height {{ContainerClass}}\" [style.max-height.px]=\"MaxHeight\">\r\n <table class=\"{{ TableClass }} est-margin-bottom-10 est\" style=\"background-color: white;\" [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; trackBy: IDTrackBy\">\r\n <th *ngFor=\"let cell of level; trackBy: IDTrackBy\" [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 [style.width.px]=\"PinnedContainerWidth\" 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; trackBy: idTrackBy\" class=\"est-col-min est-no-side-padding\"></th>\r\n \r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition; trackBy: PropertyNameTrackBy\">\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?.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; trackBy: IDTrackBy\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\" \r\n [style.width.px]=\"rowHeader.PinnedWidth\" \r\n 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\" \r\n [Fixed]=\"rowHeader.Fixed\" \r\n [Order]=\"rowHeader.Order\" \r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\" \r\n [OrderBy]=\"OrderByColumn\" \r\n [SearchInProgress]=\"!!researchInProgress\" \r\n (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\" \r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n \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; trackBy: IDTrackBy\">\r\n\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\" \r\n es-th=\"{{rowHeader.ID}}\" \r\n class=\"{{rowHeader.Class || ''}}\" \r\n [style.text-align]=\" rowHeader.Alignment || null\"\r\n [class.est-ltab-border]=\"rowHeader.LeftBorder\" \r\n [class.est-rtab-border]=\"rowHeader.RightBorder\" \r\n [class.est-nowrap]=\"!rowHeader.Wrap\" \r\n [Order]=\"rowHeader.Order\" \r\n [Resizable]=\"ColumnsResizable\" \r\n [Orderable]=\"rowHeader.Orderable\" \r\n [OrderBy]=\"OrderByColumn\" \r\n [SearchInProgress]=\"!!researchInProgress\" \r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\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; trackBy: idTrackBy\" (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; trackBy: valTrackBy\" 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, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></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 i = index, let even = even; trackBy: bodyTrackBy\">\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, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></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\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </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 let-index=\"index\">\r\n <ng-container *ngIf=\"(!UseCustomCells || EmptyRowTds) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item, index: index}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditor let-ctx>\r\n <!-- Un po' triste ma questo \u00E8 il metodo pi\u00F9 semplice per gestire il cambio di modello -->\r\n <ng-container *ngIf=\"ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Options]=\"ctx.definition.EditorOptions\" [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.EditorOptions\" [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 <!-- TODO: Formattare il valore in base a valType.type -->\r\n <ng-container *ngIf=\"ctx.type == 'enum'\">\r\n {{ (ctx.value | est_lookup : ctx.definition.PropertySource).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<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells && !EmptyRowTds\">\r\n <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\r\n <td *ngIf=\"HasPinnedColumns\" 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 cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"cell.Pinned; let pinned = true\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { $implicit: item, index: index, cell: cell, pinned: pinned };;\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <!-- Body effettivo della riga -->\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"!cell.Pinned; let pinned = false\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { $implicit: item, index: index, cell: cell, pinned: pinned };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Cella customizzata, elemento grafico base per la tabella -->\r\n<ng-template #customTd let-item let-cell=\"cell\" let-index=\"index\" let-pinned=\"pinned\">\r\n\r\n <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\r\n <ng-container *ngIf=\"cell.IconClass && cell.Visible\">\r\n <ng-container *ngIf=\"!cell.ConditionField || ((item.properties || item)[cell.ConditionField] == cell.ConditionValue)\">\r\n <td [class.est-no-right-padding]=\"index != DynamicOperations.length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{cell.Title}}\" class=\"{{cell.IconClass}} est-pointer\" (click)=\"dynamicOperation(item, cell.ID)\">{{cell.Content}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"cell.ConditionField && ((item.properties || item)[cell.ConditionField] != cell.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 <!-----------------------------------------------------------------------------------------------------------------------\r\n - ATTENZIONE: Gli spazi fra le propriet\u00E0 di questo mega td sono significativi e dividono la dichiarazione in sezioni: -\r\n - . Generiche -\r\n - . Gestione allineamento e colori per la modalit\u00E0 report -\r\n - . Gestioni grafiche particolari per il Pinned -\r\n - . Gestione della selezione a singola cella in assenza di pinned -\r\n - . Gestione click classico -\r\n ------------------------------------------------------------------------------------------------------------------------->\r\n\r\n <td *ngIf=\"!cell.IconClass && cell.Visible\" \r\n es-td=\"{{cell.Property || cell.ID}}\"\r\n id=\"estd_{{cell.Property || cell.ID}}_{{item._ordinal}}_{{index}}\" \r\n class=\"{{ cell.Class }} est-default-row-height\" \r\n [Context]=\"item._hash\" \r\n [class.est-no-selection]=\"Editable && cell.PropertyName\" \r\n [class.est-rg-hdr]=\"cell.GroupHeader\" \r\n [class.est-rg-agg]=\"cell.GroupAggregation\"\r\n [class.est-nowrap]=\"Hierarchy || !cell.Wraps\"\r\n \r\n [style.text-align]=\" (!pinned && cell.Alignment) ? cell.Alignment : null\"\r\n [style.color]=\"(!pinned && item.forecolors && cell.PropAccessor) ? item.forecolors[cell.PropAccessor] : null\"\r\n [style.background-color]=\"(!pinned && item.backcolors && cell.PropAccessor) ? item.backcolors[cell.PropAccessor] : null\"\r\n\r\n [style.width.px]=\"pinned ? cell.PinnedWidth : null\"\r\n [class.est-no-border]=\"pinned\"\r\n\r\n [class.est-ltab-border]=\"cell.LeftBorder && !selectionStatus[item._ordinal][index]?.lborder\" \r\n [class.est-rtab-border]=\"cell.RightBorder && !selectionStatus[item._ordinal][index]?.rborder\" \r\n\r\n [class.est-selected-cell]=\"selectionStatus[item._ordinal][index]?.selected\"\r\n [class.est-cell-lborder]=\"selectionStatus[item._ordinal][index]?.lborder\"\r\n [class.est-cell-rborder]=\"selectionStatus[item._ordinal][index]?.rborder\"\r\n [class.est-cell-tborder]=\"selectionStatus[item._ordinal][index]?.tborder\"\r\n [class.est-cell-bborder]=\"selectionStatus[item._ordinal][index]?.bborder\"\r\n\r\n [class.est-cell-lborder-tmp]=\"!cell.LeftBorder && !selectionStatus[item._ordinal][index]?.lborder && !selectionStatus[item._ordinal][index]?.loverlaps\"\r\n [class.est-cell-rborder-tmp]=\"!cell.RightBorder && !selectionStatus[item._ordinal][index]?.rborder && !selectionStatus[item._ordinal][index]?.roverlaps\"\r\n [class.est-cell-tborder-tmp]=\"!selectionStatus[item._ordinal][index]?.tborder && !selectionStatus[item._ordinal][index]?.toverlaps\"\r\n [class.est-cell-bborder-tmp]=\"!selectionStatus[item._ordinal][index]?.bborder && !selectionStatus[item._ordinal][index]?.boverlaps\"\r\n\r\n (mousedown)=\"mousedown($event, cell, item)\" \r\n (mouseenter)=\"mouseenter($event)\" \r\n (mouseup)=\"mouseup($event)\"\r\n (onCellGeneration)=\"registerCell($event)\"\r\n \r\n (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\">\r\n\r\n <div [class.est-edit-hidden]=\"cell._editing\" [class.est-pre]=\"!(Hierarchy && index == 0)\">\r\n\r\n <ng-container #DEBUG>\r\n <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\r\n </ng-container>\r\n\r\n <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\r\n <ng-container *ngIf=\"cell.Template\">\r\n <ng-container *ngIf=\"!cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: (item[cell.MultiProp] ? item[cell.MultiProp][cell.MultiIndex] : {}) }\"></ng-container></span>\r\n </ng-container>\r\n \r\n <!-- 8%\r\n Template non disponibile, pu\u00F2 venire da \r\n RoutePath in caso sia un link di una tabella dinamica\r\n PropAccessor in caso di ReportRow (quindi oggetti con \"values\" dentro), \r\n o Renderer se modalit\u00E0 dinamica/standard (in qual caso il renderer \u00E8 il default)\r\n -->\r\n <ng-container *ngIf=\"!cell.Template && !cell.Multi && !cell.Content\">\r\n <a *ngIf=\"cell.RoutePath\" [routerLink]=\"item | est_routerlink : cell.RoutePath : cell.RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName]\"></a>\r\n \r\n <span *ngIf=\"cell.PropAccessor\">\r\n {{(item.values? item.values[cell.PropAccessor] : item[cell.PropAccessor]) | est_format: cell.Format }}\r\n </span>\r\n\r\n <ng-container *ngIf=\"!cell.PropAccessor && !cell.RoutePath\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_renderer: { name: cell.RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: cell, value: item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName], type: cell.PropertyType} }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- 1% Se in modalit\u00E0 gerarchica metto il td per navigare la gerarchia -->\r\n <ng-container *ngIf=\"Hierarchy && index == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\r\n <ng-container *ngIf=\"cell.Content\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"cell._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_editor: { name: cell.EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: cell, columnIndex: index, item: item, finalizer: finalizeUserEdit.bind(this, cell, item, index) } }\"></ng-container>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\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 \r\n</ng-template>\r\n\r\n<!-- 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><span><em>{{'No operations available' | localize : lc}}...</em></span></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\">×</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; trackBy: idTrackBy\" \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 ( \r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last; trackBy: idTrackBy\">\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\"> - </span>\r\n </ng-container>\r\n )\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>",
|
|
1647
|
+
template: "<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate\">\r\n <div class=\"pull-right\">\r\n {{'Update every' | localize : lc}} <input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" [ngModelOptions]=\"{'standalone': true}\" /> {{'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\" [ngModelOptions]=\"{'standalone': true}\" (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\" [style.height]=\"Height\" [style.background-color]=\"EmptySpaceBackgroundColor\">\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> {{'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> \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 est-full-height {{ContainerClass}}\" [style.max-height.px]=\"MaxHeight\">\r\n <table class=\"{{ TableClass }} est-margin-bottom-10 est\" style=\"background-color: white;\" [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; trackBy: IDTrackBy\">\r\n <th *ngFor=\"let cell of level; trackBy: IDTrackBy\" [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 [style.width.px]=\"PinnedContainerWidth\" 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; trackBy: idTrackBy\" class=\"est-col-min est-no-side-padding\"></th>\r\n\r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition; trackBy: PropertyNameTrackBy\">\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?.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; trackBy: IDTrackBy\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\"\r\n [style.width.px]=\"rowHeader.PinnedWidth\"\r\n 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\"\r\n [Fixed]=\"rowHeader.Fixed\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn\"\r\n [SearchInProgress]=\"!!researchInProgress\"\r\n (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\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; trackBy: IDTrackBy\">\r\n\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [style.text-align]=\" rowHeader.Alignment || null\"\r\n [class.est-ltab-border]=\"rowHeader.LeftBorder\"\r\n [class.est-rtab-border]=\"rowHeader.RightBorder\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn\"\r\n [SearchInProgress]=\"!!researchInProgress\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\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; trackBy: idTrackBy\" (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; trackBy: valTrackBy\" 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, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></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 i = index, let even = even; trackBy: bodyTrackBy\">\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, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></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\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </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 let-index=\"index\">\r\n <ng-container *ngIf=\"(!UseCustomCells || EmptyRowTds) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item, index: index}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditor let-ctx>\r\n <!-- Un po' triste ma questo \u00E8 il metodo pi\u00F9 semplice per gestire il cambio di modello -->\r\n <ng-container *ngIf=\"ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Options]=\"ctx.definition.EditorOptions\" [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.EditorOptions\" [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 <!-- TODO: Formattare il valore in base a valType.type -->\r\n <ng-container *ngIf=\"ctx.type == 'enum'\">\r\n {{ (ctx.value | est_lookup : ctx.definition.PropertySource).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<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells && !EmptyRowTds\">\r\n <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\r\n <td *ngIf=\"HasPinnedColumns\" 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 cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"cell.Pinned\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { $implicit: item, index: index, cell: cell, pinned: true };;\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <!-- Body effettivo della riga -->\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"!cell.Pinned;\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { $implicit: item, index: index, cell: cell, pinned: false };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Cella customizzata, elemento grafico base per la tabella -->\r\n<ng-template #customTd let-item let-cell=\"cell\" let-index=\"index\" let-pinned=\"pinned\">\r\n\r\n <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\r\n <ng-container *ngIf=\"cell.IconClass && cell.Visible\">\r\n <ng-container *ngIf=\"!cell.ConditionField || ((item.properties || item)[cell.ConditionField] == cell.ConditionValue)\">\r\n <td [class.est-no-right-padding]=\"index != DynamicOperations.length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{cell.Title}}\" class=\"{{cell.IconClass}} est-pointer\" (click)=\"dynamicOperation(item, cell.ID)\">{{cell.Content}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"cell.ConditionField && ((item.properties || item)[cell.ConditionField] != cell.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 <!-----------------------------------------------------------------------------------------------------------------------\r\n - ATTENZIONE: Gli spazi fra le propriet\u00E0 di questo mega td sono significativi e dividono la dichiarazione in sezioni: -\r\n - . Generiche -\r\n - . Gestione allineamento e colori per la modalit\u00E0 report -\r\n - . Gestioni grafiche particolari per il Pinned -\r\n - . Gestione della selezione a singola cella in assenza di pinned -\r\n - . Gestione click classico -\r\n ------------------------------------------------------------------------------------------------------------------------->\r\n\r\n <td *ngIf=\"!cell.IconClass && cell.Visible\"\r\n es-td=\"{{cell.Property || cell.ID}}\"\r\n id=\"estd_{{cell.Property || cell.ID}}_{{item._ordinal}}_{{index}}\"\r\n class=\"{{ cell.Class }} est-default-row-height\"\r\n [Context]=\"item._hash\"\r\n [class.est-no-selection]=\"Editable && cell.PropertyName\"\r\n [class.est-rg-hdr]=\"cell.GroupHeader\"\r\n [class.est-rg-agg]=\"cell.GroupAggregation\"\r\n [class.est-nowrap]=\"Hierarchy || !cell.Wraps\"\r\n\r\n [style.text-align]=\" (!pinned && cell.Alignment) ? cell.Alignment : null\"\r\n [style.color]=\"(!pinned && item.forecolors && cell.PropAccessor) ? item.forecolors[cell.PropAccessor] : null\"\r\n [style.background-color]=\"(!pinned && item.backcolors && cell.PropAccessor) ? item.backcolors[cell.PropAccessor] : null\"\r\n\r\n [style.width.px]=\"pinned ? cell.PinnedWidth : null\"\r\n [class.est-no-border]=\"pinned\"\r\n\r\n [class.est-ltab-border]=\"cell.LeftBorder && !selectionStatus[item._ordinal][index]?.lborder\"\r\n [class.est-rtab-border]=\"cell.RightBorder && !selectionStatus[item._ordinal][index]?.rborder\"\r\n\r\n [class.est-selected-cell]=\"selectionStatus[item._ordinal][index]?.selected\"\r\n [class.est-cell-lborder]=\"selectionStatus[item._ordinal][index]?.lborder\"\r\n [class.est-cell-rborder]=\"selectionStatus[item._ordinal][index]?.rborder\"\r\n [class.est-cell-tborder]=\"selectionStatus[item._ordinal][index]?.tborder\"\r\n [class.est-cell-bborder]=\"selectionStatus[item._ordinal][index]?.bborder\"\r\n\r\n [class.est-cell-lborder-tmp]=\"!cell.LeftBorder && !selectionStatus[item._ordinal][index]?.lborder && !selectionStatus[item._ordinal][index]?.loverlaps\"\r\n [class.est-cell-rborder-tmp]=\"!cell.RightBorder && !selectionStatus[item._ordinal][index]?.rborder && !selectionStatus[item._ordinal][index]?.roverlaps\"\r\n [class.est-cell-tborder-tmp]=\"!selectionStatus[item._ordinal][index]?.tborder && !selectionStatus[item._ordinal][index]?.toverlaps\"\r\n [class.est-cell-bborder-tmp]=\"!selectionStatus[item._ordinal][index]?.bborder && !selectionStatus[item._ordinal][index]?.boverlaps\"\r\n\r\n (mousedown)=\"mousedown($event, cell, item)\"\r\n (mouseenter)=\"mouseenter($event)\"\r\n (mouseup)=\"mouseup($event)\"\r\n (onCellGeneration)=\"registerCell($event)\"\r\n\r\n (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\">\r\n\r\n <div [class.est-edit-hidden]=\"cell._editing\" [class.est-pre]=\"!(Hierarchy && index == 0)\">\r\n\r\n <ng-container #DEBUG>\r\n <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\r\n </ng-container>\r\n\r\n <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\r\n <ng-container *ngIf=\"cell.Template\">\r\n <ng-container *ngIf=\"!cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: (item[cell.MultiProp] ? item[cell.MultiProp][cell.MultiIndex] : {}) }\"></ng-container></span>\r\n </ng-container>\r\n\r\n <!-- 8%\r\n Template non disponibile, pu\u00F2 venire da\r\n RoutePath in caso sia un link di una tabella dinamica\r\n PropAccessor in caso di ReportRow (quindi oggetti con \"values\" dentro),\r\n o Renderer se modalit\u00E0 dinamica/standard (in qual caso il renderer \u00E8 il default)\r\n -->\r\n <ng-container *ngIf=\"!cell.Template && !cell.Multi && !cell.Content\">\r\n <a *ngIf=\"cell.RoutePath\" [routerLink]=\"item | est_routerlink : cell.RoutePath : cell.RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName]\"></a>\r\n\r\n <span *ngIf=\"cell.PropAccessor\">\r\n {{(item.values? item.values[cell.PropAccessor] : item[cell.PropAccessor]) | est_format: cell.Format }}\r\n </span>\r\n\r\n <ng-container *ngIf=\"!cell.PropAccessor && !cell.RoutePath\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_renderer: { name: cell.RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: cell, value: item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName], type: cell.PropertyType} }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- 1% Se in modalit\u00E0 gerarchica metto il td per navigare la gerarchia -->\r\n <ng-container *ngIf=\"Hierarchy && index == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\r\n <ng-container *ngIf=\"cell.Content\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"cell._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_editor: { name: cell.EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: cell, columnIndex: index, item: item, finalizer: finalizeUserEdit.bind(this, cell, item, index) } }\"></ng-container>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\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 \r\n</ng-template>\r\n\r\n<!-- 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><span><em>{{'No operations available' | localize : lc}}...</em></span></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\">×</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; trackBy: idTrackBy\"\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 ( \r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last; trackBy: idTrackBy\">\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\"> - </span>\r\n </ng-container>\r\n )\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>",
|
|
1648
1648
|
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-full-height{height:100%}.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-tborder{border-top:1.02px solid #2196f3!important}.est-cell-rborder{border-right:1.02px solid #2196f3!important}.est-cell-bborder{border-bottom:1.02px solid #2196f3!important}.est-cell-lborder-tmp{border-left:1.02px solid transparent!important}.est-cell-tborder-tmp{border-top:1.02px solid transparent!important}.est-cell-rborder-tmp{border-right:1.02px solid transparent!important}.est-cell-bborder-tmp{border-bottom:1.02px solid transparent!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}"]
|
|
1649
1649
|
},] }
|
|
1650
1650
|
];
|
|
@@ -1747,4 +1747,4 @@ EsTableComponent.propDecorators = {
|
|
|
1747
1747
|
};
|
|
1748
1748
|
export class EsTdReference {
|
|
1749
1749
|
}
|
|
1750
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNfdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL2VzLXRhYmxlL2VzX3RhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsVUFBVTtBQUNWLE9BQU8sRUFDSCxTQUFTLEVBQUUsZUFBZSxFQUFhLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFDeEYsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLFNBQVMsRUFBYyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFlLE1BQU0sRUFDOUksTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRSxpQkFBaUI7QUFDakIsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBYyxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hJLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSzNELGlCQUFpQjtBQUNqQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFTdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUVqRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFL0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFJbkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFN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QUFLOytCQUVMLEtBQUs7MEJBRUwsS0FBSztxQ0FFTCxLQUFLO2lDQUVMLEtBQUs7Z0NBRUwsS0FBSztvQ0FFTCxLQUFLO3VCQUVMLEtBQUs7NkJBRUwsS0FBSzs2QkFFTCxLQUFLOzZCQUVMLE1BQU07OEJBV04sTUFBTTtpQ0FFTixNQUFNO3dCQUVOLE1BQU07NkJBRU4sTUFBTTs0QkFFTixNQUFNO2dDQUVOLE1BQU07NkJBR04sTUFBTTtpQ0FFTixNQUFNOytCQU9OLFNBQVMsU0FBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7NkJBRS9DLFNBQVMsU0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO29DQVV2QyxLQUFLOztBQTYrQ1YsTUFBTSxPQUFPLGFBQWE7Q0FJekIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgUXVlcnlMaXN0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIElucHV0LFxyXG4gICAgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIENvbnRlbnRDaGlsZCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIFZpZXdFbmNhcHN1bGF0aW9uLCBPcHRpb25hbCwgU2VsZiwgVGVtcGxhdGVSZWYsIEluamVjdFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuLy8gQ29uZmlndXJhemlvbmlcclxuaW1wb3J0IHsgVXRpbGl0eVNlcnZpY2UsIEV4cG9ydFNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlLCBEYXRlU2VydmljZSwgQ3N2SGVhZGVycywgQ2xpcGJvYXJkU2VydmljZSB9IGZyb20gJ0Blc2ZhZW56YS9leHRlbnNpb25zJztcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gJ0Blc2ZhZW56YS9sb2NhbGl6YXRpb25zJztcclxuaW1wb3J0IHsgUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnQGVzZmFlbnphL3ByZWZlcmVuY2VzJztcclxuXHJcbi8vIFBsdWdpbnNcclxuaW1wb3J0IHsgQ29udGV4dE1lbnVDb21wb25lbnQgfSBmcm9tICdAZXNmYWVuemEvbmd4LWNvbnRleHRtZW51JztcclxuXHJcbi8vIE1vZGVsbGkgLyBUaXBpXHJcbmltcG9ydCB7IEFwcFNlYXJjaCB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9BcHBTZWFyY2hcIjtcclxuaW1wb3J0IHsgQXBwT3JkZXJpbmcgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvQXBwT3JkZXJpbmdcIjtcclxuaW1wb3J0IHsgRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uXCI7XHJcbmltcG9ydCB7IENvcm5lck1lbnVPcHRpb24gfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9Db3JuZXJNZW51T3B0aW9uXCI7XHJcbmltcG9ydCB7IEVzVGFibGVPcGVyYXRpb25EZWZpbml0aW9uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvRXNUYWJsZU9wZXJhdGlvbkRlZmluaXRpb25cIjtcclxuaW1wb3J0IHsgRXNUYWJsZUNvbHVtbiB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL0VzVGFibGVDb2x1bW5cIjtcclxuaW1wb3J0IHsgR3JvdXBQYWdlciB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL0dyb3VwUGFnZXJcIjtcclxuaW1wb3J0IHsgR3JvdXBSb3V0ZUZyYWdtZW50IH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvR3JvdXBSb3V0ZUZyYWdtZW50XCI7XHJcbmltcG9ydCB7IFRoRWxlbWVudCB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL1RoRWxlbWVudFwiO1xyXG5pbXBvcnQgeyBQYWdlckluZm9zIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvUGFnZXJJbmZvc1wiO1xyXG5pbXBvcnQgeyBUaEdyb3VwIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvVGhHcm91cFwiO1xyXG5pbXBvcnQgeyBUZEVsZW1lbnQgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9UZEVsZW1lbnRcIjtcclxuaW1wb3J0IHsgSXRlbXNTZWxlY3Rpb24gfSBmcm9tICcuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9JdGVtc1NlbGVjdGlvbic7XHJcbmltcG9ydCB7IEdyb3VwT3JBZ2dyZWdhdGlvbiB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9Hcm91cE9yQWdncmVnYXRpb25cIjtcclxuaW1wb3J0IHsgR3JvdXBGaWx0ZXIgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvR3JvdXBGaWx0ZXJcIjtcclxuaW1wb3J0IHsgR3JvdXAgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvR3JvdXBcIjtcclxuaW1wb3J0IHsgRXNUYWJsZU1vZGVsQ2hhbmdlIH0gZnJvbSAnLi4vLi4vZG9tYWluL2V4dGVybmFscy9Fc1RhYmxlTW9kZWxDaGFuZ2UnO1xyXG5pbXBvcnQgeyBJdGVtUHJvcEVkaXRhYmxlUmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vZG9tYWluL2V4dGVybmFscy9JdGVtUHJvcEVkaXRhYmxlUmVmZXJlbmNlJztcclxuaW1wb3J0IHsgRXNUYWJsZURlZmF1bHRhYmxlIH0gZnJvbSAnLi4vLi4vZG9tYWluL2NvbmZpZ3VyYXRpb24vRXNUYWJsZURlZmF1bHRhYmxlJztcclxuXHJcbi8vIENvbXBvbmVudGkgZSBMb2NhbGl6emF6aW9uZVxyXG5pbXBvcnQgeyBFc1RkIH0gZnJvbSAnLi4vZXMtdGQvZXNfdGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRXNUZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZXNfdGQuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgRXNUaERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZXNfdGguZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgRXNUZEVkaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZXNfdGRfZWRpdG9yLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IElFc1RhYmxlVGVtcGxhdGVXcmFwcGVyIH0gZnJvbSAnLi4vZXMtdGFibGUtdGVtcGxhdGUvZXNfdGFibGVfdGVtcGxhdGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRXNUYWJsZUxvYyB9IGZyb20gJy4vZXNfdGFibGUuY29tcG9uZW50LmxvYyc7XHJcblxyXG4vLyBUb2tlbnNcclxuaW1wb3J0IHsgRVNUX0RFRkFVTFRTLCBFU1RfTE9DQUxFIH0gZnJvbSAnLi4vLi4vdG9rZW5zJztcclxuXHJcbi8vIEhhbmRsZXJzXHJcbmltcG9ydCB7IEV4cG9ydEhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9FeHBvcnRIYW5kbGVyXCI7XHJcbmltcG9ydCB7IENvbHVtbk1ldGFkYXRhSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL0NvbHVtbk1ldGFkYXRhSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBEeW5hbWljTW9kZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9EeW5hbWljTW9kZUhhbmRsZXJcIjtcclxuaW1wb3J0IHsgSGllcmFyY2h5TW9kZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9IaWVyYXJjaHlNb2RlSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBJdGVtc0hhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9JdGVtc0hhbmRsZXJcIjtcclxuaW1wb3J0IHsgUmVwb3J0TW9kZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9SZXBvcnRNb2RlSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBSb3dHcm91cGluZ0hhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9Sb3dHcm91cGluZ0hhbmRsZXJcIjtcclxuaW1wb3J0IHsgU2VsZWN0aW9uSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL1NlbGVjdGlvbkhhbmRsZXJcIjtcclxuaW1wb3J0IHsgVXRpbGl0aWVzSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL1V0aWxpdGllc0hhbmRsZXJcIjtcclxuXHJcbi8vIFNlcnZpY2VcclxuaW1wb3J0IHsgQ29weVBhc3RlRGV0ZWN0b3IgfSBmcm9tICcuLi8uLi9jb3JlL0NvcHlQYXN0ZURldGVjdG9yJztcclxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vLi4vY29yZS9Mb2dnZXInO1xyXG5cclxuLy8gUnhqc1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbi8qKiBDb21wb25lbnRlIGNoZSBwZXJtZXR0ZSBkaSByYXBwcmVzZW50YXJlIHVuYSBncmlnbGlhIGRpIHZhbG9yaSAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZXMtdGFibGUnLFxyXG4gICAgdmlld1Byb3ZpZGVyczogW3sgcHJvdmlkZTogTG9jYWxpemF0aW9uU2VydmljZSwgdXNlQ2xhc3M6IEVzVGFibGVMb2MgfV0sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9lc190YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2VzX3RhYmxlLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRXNUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMge1xyXG5cclxuICAgIC8vIENvbXBvbmVudGkgcGVyIGxhIGdlc3Rpb25lIGRlbGxlIHZhcmllIGZ1bnppb25hbGl0w6AgZGVsbCdlcy10YWJsZVxyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIGV4cG9ydF9IOiBFeHBvcnRIYW5kbGVyO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIGNvbHVtbk1ldGFkYXRhX0g6IENvbHVtbk1ldGFkYXRhSGFuZGxlcjtcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBkeW5hbWljTW9kZV9IOiBEeW5hbWljTW9kZUhhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgaGllcmFyY2h5TW9kZV9IOiBIaWVyYXJjaHlNb2RlSGFuZGxlcjtcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBpdGVtc19IOiBJdGVtc0hhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgcmVwb3J0TW9kZV9IOiBSZXBvcnRNb2RlSGFuZGxlcjtcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyByb3dHcm91cGluZ19IOiBSb3dHcm91cGluZ0hhbmRsZXJcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBzZWxlY3Rpb25fSDogU2VsZWN0aW9uSGFuZGxlcjtcclxuXHJcbiAgICAvLyBTdWJzY3JpYmVycyBwZXIgZ2xpIGV2ZW50aSBkaSBjb3BpYSBlIGluY29sbGFcclxuICAgIC8qKiBAaWdub3JlICovIHByaXZhdGUgY29weVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHJpdmF0ZSBwYXN0ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBAU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcclxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHByZWZTZXJ2aWNlOiBQcmVmZXJlbmNlc1NlcnZpY2UsXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChFU1RfREVGQVVMVFMpIHByaXZhdGUgZGVhZnVsdHM6IEVzVGFibGVEZWZhdWx0YWJsZSxcclxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVTVF9MT0NBTEUpIHB1YmxpYyBsb2NhbGU6IHN0cmluZyxcclxuICAgICAgICBwdWJsaWMgbGM6IExvY2FsaXphdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSB1dGlsaXRpZXNfSDogVXRpbGl0aWVzSGFuZGxlcixcclxuICAgICAgICBwdWJsaWMgdXRpRXh0czogVXRpbGl0eVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBleHBFeHRzOiBFeHBvcnRTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBkYXRlRXh0czogRGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBtc2dFeHRzOiBNZXNzYWdlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGNvcHlQYXN0ZURldGVjdG9yOiBDb3B5UGFzdGVEZXRlY3RvcixcclxuICAgICAgICBwcml2YXRlIGNsaXBib2FyZFNlcnZpY2U6IENsaXBib2FyZFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlcikge1xyXG5cclxuICAgICAgICAvLyBDb3BpYSBlIGluY29sbGEgc2kgZWZmZXR0dWFubyBzb2xvIHNlIGxhIHRhYmVsbGEgYXR0dWFsZSDDqCB1bml2b2NhbWVudGUgc2VsZXppb25hdGFcclxuICAgICAgICB0aGlzLmNvcHlTdWJzY3JpcHRpb24gPSB0aGlzLmNvcHlQYXN0ZURldGVjdG9yLk9uQ29weS5zdWJzY3JpYmUoKCkgPT4geyBpZiAodGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5BY3RpdmVFc3RSZWZlcmVuY2UgPT0gdGhpcykgdGhpcy5oYW5kbGVDb3B5KCk7IH0pO1xyXG4gICAgICAgIHRoaXMucGFzdGVTdWJzY3JpcHRpb24gPSB0aGlzLmNvcHlQYXN0ZURldGVjdG9yLk9uUGFzdGUuc3Vic2NyaWJlKCgpID0+IHsgaWYgKHRoaXMuY29weVBhc3RlRGV0ZWN0b3IuQWN0aXZlRXN0UmVmZXJlbmNlID09IHRoaXMpIHRoaXMuaGFuZGxlUGFzdGUoKTsgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZXhwb3J0X0ggPSBuZXcgRXhwb3J0SGFuZGxlcih0aGlzLCB0aGlzLmV4cEV4dHMsIHRoaXMubXNnRXh0cywgdGhpcy51dGlFeHRzLCB0aGlzLmRhdGVFeHRzKTtcclxuICAgICAgICB0aGlzLnJvd0dyb3VwaW5nX0ggPSBuZXcgUm93R3JvdXBpbmdIYW5kbGVyKHRoaXMsIHRoaXMudXRpbGl0aWVzX0gsIHRoaXMuZGF0ZUV4dHMpO1xyXG4gICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSCA9IG5ldyBDb2x1bW5NZXRhZGF0YUhhbmRsZXIodGhpcywgdGhpcy51dGlsaXRpZXNfSCwgdGhpcy51dGlFeHRzLCB0aGlzLnByZWZTZXJ2aWNlLCB0aGlzLnJvd0dyb3VwaW5nX0gpO1xyXG4gICAgICAgIHRoaXMuZHluYW1pY01vZGVfSCA9IG5ldyBEeW5hbWljTW9kZUhhbmRsZXIodGhpcyk7XHJcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlNb2RlX0ggPSBuZXcgSGllcmFyY2h5TW9kZUhhbmRsZXIodGhpcyk7XHJcbiAgICAgICAgdGhpcy5pdGVtc19IID0gbmV3IEl0ZW1zSGFuZGxlcih0aGlzLCB0aGlzLnV0aWxpdGllc19IKTtcclxuICAgICAgICB0aGlzLnJlcG9ydE1vZGVfSCA9IG5ldyBSZXBvcnRNb2RlSGFuZGxlcih0aGlzLCB0aGlzLnV0aWxpdGllc19IKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9IID0gbmV3IFNlbGVjdGlvbkhhbmRsZXIodGhpcywgdGhpcy5yb3dHcm91cGluZ19IKTtcclxuXHJcbiAgICAgICAgaWYgKG5nQ29udHJvbClcclxuICAgICAgICAgICAgbmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG5cclxuICAgICAgICAvLyBBc3NlZ25hemlvbmUgcGVyIHR1dHRpIGdsaSBJbnB1dCBkaSBkZWZhdWx0XHJcbiAgICAgICAgdGhpcy5Db2x1bW5zUmVzaXphYmxlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkNvbHVtbnNSZXNpemFibGUsIHRoaXMuZGVhZnVsdHM/LkNvbHVtbnNSZXNpemFibGUpO1xyXG4gICAgICAgIHRoaXMuQXV0b1VwZGF0ZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5BdXRvVXBkYXRlLCB0aGlzLmRlYWZ1bHRzPy5BdXRvVXBkYXRlKTtcclxuICAgICAgICB0aGlzLkFsbFNlYXJjaCA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5BbGxTZWFyY2gsIHRoaXMuZGVhZnVsdHM/LkFsbFNlYXJjaCwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5FeHBvcnQgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuRXhwb3J0LCB0aGlzLmRlYWZ1bHRzPy5FeHBvcnQpO1xyXG4gICAgICAgIHRoaXMuSGlkZVBhZ2luZyA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5IaWRlUGFnaW5nLCB0aGlzLmRlYWZ1bHRzPy5IaWRlUGFnaW5nLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5IaWRlUGFnaW5nQ291bnQgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuSGlkZVBhZ2luZ0NvdW50LCB0aGlzLmRlYWZ1bHRzPy5IaWRlUGFnaW5nQ291bnQpO1xyXG4gICAgICAgIHRoaXMuSGlkZVBhZ2luZ0J1dHRvbnMgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuSGlkZVBhZ2luZ0J1dHRvbnMsIHRoaXMuZGVhZnVsdHM/LkhpZGVQYWdpbmdCdXR0b25zKTtcclxuICAgICAgICB0aGlzLkNvbnRhaW5lckNsYXNzID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkNvbnRhaW5lckNsYXNzLCB0aGlzLmRlYWZ1bHRzPy5Db250YWluZXJDbGFzcywgJycpO1xyXG4gICAgICAgIHRoaXMuVGFibGVDbGFzcyA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5UYWJsZUNsYXNzLCB0aGlzLmRlYWZ1bHRzPy5UYWJsZUNsYXNzLCAndGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ob3ZlciB0YWJsZS1zbScpO1xyXG4gICAgICAgIHRoaXMuU2VsZWN0aW9uID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlNlbGVjdGlvbiwgdGhpcy5kZWFmdWx0cz8uU2VsZWN0aW9uKTtcclxuICAgICAgICB0aGlzLlNhdmVQcmVmZXJlbmNlcyA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5TYXZlUHJlZmVyZW5jZXMsIHRoaXMuZGVhZnVsdHM/LlNhdmVQcmVmZXJlbmNlcyk7XHJcbiAgICAgICAgdGhpcy5QYWdpbmdTdHlsZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5QYWdpbmdTdHlsZSwgdGhpcy5kZWFmdWx0cz8uUGFnaW5nU3R5bGUsICdib3R0b20nKTtcclxuICAgICAgICB0aGlzLlJvd0dyb3VwaW5nUGFnaW5nU3R5bGUgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuUm93R3JvdXBpbmdQYWdpbmdTdHlsZSwgdGhpcy5kZWFmdWx0cz8uUm93R3JvdXBpbmdQYWdpbmdTdHlsZSwgJ2xlZnQnKTtcclxuICAgICAgICB0aGlzLlVzZVNlbGVjdGlvbkNhY2hlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlVzZVNlbGVjdGlvbkNhY2hlLCB0aGlzLmRlYWZ1bHRzPy5Vc2VTZWxlY3Rpb25DYWNoZSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5TaG93SXRlbUdyb3Vwc0NvbHVtbnMgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuU2hvd0l0ZW1Hcm91cHNDb2x1bW5zLCB0aGlzLmRlYWZ1bHRzPy5TaG93SXRlbUdyb3Vwc0NvbHVtbnMsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLkFycmF5bW9kZUl0ZW1zUGVyUGFnZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5BcnJheW1vZGVJdGVtc1BlclBhZ2UsIHRoaXMuZGVhZnVsdHM/LkFycmF5bW9kZUl0ZW1zUGVyUGFnZSwgMTUpO1xyXG4gICAgICAgIHRoaXMuQ29sdW1uc1Bpbm5hYmxlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkNvbHVtbnNQaW5uYWJsZSwgdGhpcy5kZWFmdWx0cz8uQ29sdW1uc1Bpbm5hYmxlLCB0cnVlKTtcclxuICAgICAgICB0aGlzLkRlZmF1bHRBbGlnbm1lbnQgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuRGVmYXVsdEFsaWdubWVudCwgdGhpcy5kZWFmdWx0cz8uRGVmYXVsdEFsaWdubWVudCwgJ0xlZnQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogU3ViamVjdCB1dGlsaXp6YXRvIGludGVybmFtZW50ZSBsYXRvIEVzVGFibGUgcGVyIGNhdXNhcmUgaWwgRm9jdXMgbGF0byBjb21wb25lbnRlIGRpIElucHV0ICovXHJcbiAgICBwdWJsaWMgRm9jdXNTdWJqZWN0OiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxyXG4gICAgLyoqIFRpbWVyIGNoZSB2ZXJyw6AgaW1wb3N0YXRvIGEgKipkb3VibGVDbGlja0J1ZmZlck1zKiogcGVyIGNhcGlyZSBzZSDDqCBzdGF0byBlZmZldHR1YXRvIHVuIGNsaWNrIHNpbmdvbG8gbyB1biBkb3VibGVjbGljayAqL1xyXG4gICAgcHJpdmF0ZSBjZWxsRGJDbGlja1RpbWVyOiBhbnk7XHJcbiAgICAvKiogU2UgdmVuZ29ubyBlZmZldHR1YXRpIDIgY2xpY2sgYSBkaXN0YW56YSBpbmZlcmlvcmUgYSBxdWVzdGkgTWlsbGlzZWNvbmRpIHZpZW5lIGNvbnNpZGVyYXRvIHVuIGRvcHBpbyBjbGljayAqL1xyXG4gICAgcHJpdmF0ZSBkb3VibGVDbGlja0J1ZmZlck1zOiBudW1iZXIgPSAyMDA7XHJcbiAgICAvKiogVmlldyBmaW5hbGUgc3UgY3VpIGJpbmRhcnNpIGxhdG8gRnJvbnRlbmQsIGlsIHRpcG8gcHXDsiBlc3NlcmUgSUFwcFNlYXJjaDxhbnk+IChwZXIgbGEgKip2aWV3TW9kZSoqKSwgYW55W10gKHBlciBsJyoqYXJyYXlNb2RlKiopICovXHJcbiAgICBwdWJsaWMgVmlldzogYW55ID0gbnVsbDtcclxuICAgIC8qKiBNb2RlbGxvIGRhIGN1aSBsJ2VzLXRhYmxlIG1vc3RyYSBpIHB1bHNhbnRpIGRpIHBhZ2luYXppb25lIGluIGJhc3NvIGEgZGVzdHJhICovXHJcbiAgICBwdWJsaWMgYXJyYXlQdWxzYW50aTogeyB2YWw6IG51bWJlciwgY3NzQ2xhc3M6IHN0cmluZyB9W107XHJcbiAgICAvKiogSW5kaWNhIHNlIGwnZXMtdGFibGUgZGV2ZSBtb3N0cmFyZSBpbCBjaGVjayBnbG9iYWxlIG5lbGwnaGVhZGVyIHBlciBmYXJlIGlsIFwic2VsZXppb25hIHR1dHRvXCIgKi9cclxuICAgIHB1YmxpYyBnbG9iYWxDaGVjayA9IGZhbHNlO1xyXG4gICAgLyoqIFRpZW5lIGRhIGNvbnRvIGwndWx0aW1vIGVsZW1lbnRvIHNlbGV6aW9uYXRvIGluIG1vZG8gZGEgcG90ZXIgZWZmZXR0dWFyZSBpbCBTSElGVCtDTElDSyAqL1xyXG4gICAgcHJpdmF0ZSBsYXN0U2VsZWN0ZWQ6IGFueSA9IG51bGw7XHJcbiAgICAvKiogQ29udGVnZ2lvIGludGVybm8gcGVyIGlsIG51bWVybyBkaSBlbGVtZW50aSBzZWxlemlvbmF0aSAqL1xyXG4gICAgcHVibGljIHNlbGVjdGVkT2JqZWN0cyA9IDA7XHJcbiAgICAvKiogSW5kaWNhIHNlIMOoIHBvc3NpYmlsZSBlZmZldHR1YXJlIHVuYSBzZWxlemlvbmUgbWFzc2l2YSAqL1xyXG4gICAgcHVibGljIGNhblNlbGVjdEFsbCA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBzZSBpbCBjb21wb25lbnRlIHN0YSBnZXN0ZW5kbyB1biBJQXBwU2VhcmNoPGFueT4gKi9cclxuICAgIHB1YmxpYyB2aWV3TW9kZSA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBzZSBpbCBjb21wb25lbnRlIHN0YSBnZXN0ZW5kbyB1biBhbnlbXSAqL1xyXG4gICAgcHVibGljIGFycmF5TW9kZSA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udGVuaXRvcmUgZGVnbGkgZWxlbWVudGkgZGEgbGlzdGFyZSBsYXRvIGludGVyZmFjY2lhIGRvcG8gdHV0dGUgbGUgZWxhYm9yYXppb25pIGRlbCBjYXNvLFxyXG4gICAgICogZ2VuZXJhbG1lbnRlIG5vbiBzb25vIGFsdHJvIGNoZSB0dXR0aSBnbGkgb2dnZXR0aSBkYSBwcmVzZW50YXJlIGNvbiBpbiBwacO5IGwnaGFzaCBjYWxjb2xhdG8gcGVyIGlkZW50aWZpY2FyZSAxIG9nZ2V0dG8gY29uIGxhIHByb3ByaWEgcmlnYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYm91bmRTb3VyY2U6IGFueVtdID0gW107XHJcbiAgICAvKiogU3Rlc3NhIGNvc2EgZGVsbGEgKipib3VuZFNvdXJjZSoqLCB1dGlsaXp6YXRhIGNvbWUgYXBwb2dnaW8gdGVtcG9yYW5lbyBpbnRlcm5vICovXHJcbiAgICBwdWJsaWMgVE1QQm91bmRTb3VyY2U6IGFueVtdID0gW107XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgXCJGZXR0YVwiIGRpIG9nZ2V0dGkgdXRpbGl6emF0YSBuZWxsJ2VuZGxlc3Mgc2Nyb2xsLCBvZ25pIGVsZW1lbnRvIGRpIHF1ZXN0byBhcnJheSDDqCB1biBibG9jY2hldHRvIGRpIDEwMCBlbGVtZW50aSAqL1xyXG4gICAgcHVibGljIGJvdW5kU3ViU291cmNlczogYW55W10gPSBbXTtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBRdWVzdGEgZnVuZ2UgZGEgaW5kaWNhdG9yZSBwZXIgZ2xpIHNsaWNlIGluc2VyaXRpLCBsYSBsdW5naGV6emEgZG92cmViYmUgZXNzZXJlIGNvcnJpc3BvbmRlbnRlIGEgKipib3VuZFN1YlNvdXJjZXMqKiAqL1xyXG4gICAgcHVibGljIGFkZGVkU2xpY2VzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgLyoqIFZhcmlhYmlsZSBjaGUgaWRlbnRpZmljYSBpbCB2YWxvcmUgZGVsIFwic2VsZXppb25hIFR1dHRvXCIgbmVsbGEgcGFnaW5hemlvbmUgKi9cclxuICAgIHB1YmxpYyBkZWZhdWx0QWxsUGFnZU92ZXJyaWRlID0gOTk5OTk5O1xyXG4gICAgLyoqIFNlcnZlIHBlciB0ZW5lcmUgaW4gbWVtb3JpYSBpbCBjb250ZWdnaW8gcHJlY2VkZW50ZSBlIHJlY3VwZXJhcmxvIGluIGNhc28gZGl2ZW50aSAtMiAodmVyaWZpY2FyZSBjb24gQWxlIHBlcmNow6kgbGEgbG9naWNhIGRlbCAtMikgKi9cclxuICAgIHB1YmxpYyBwcmV2aW91c0NvdW50OiBudW1iZXI7XHJcbiAgICAvKiogSW5kaWNhIHNlIHV0aWxpenphcmUgaWwgc2lzdGVtYSBkaSBhdXRvdXBkYXRlLCBjaW/DqCB1biB0cmlnZ2VyIHRpbWUtaXp6YXRvIGluIGFsdG8gYSBkZXN0cmEgZGVsbGEgdGFiZWxsYSBjaGUgcmlwZXRlIGxlIHJpY2VyY2hlIG9nbmkgWCAqKnNlY29uZHMqKiAqL1xyXG4gICAgcHVibGljIGF1dG9VcGRhdGUgPSBmYWxzZTtcclxuICAgIC8qKiBOdW1lcm8gZGkgc2Vjb25kaSBkYSBmYXJlIHRyYXNjb3JyZXJlIGZyYSB1bmEgcmljZXJjYSBlIGwnYWx0cmEgKi9cclxuICAgIHB1YmxpYyBzZWNvbmRzID0gJzEwJztcclxuICAgIC8qKiBSaWZlcmltZW50byBhbGwnSW50ZXJ2YWwgY2hlIHZpZW5lIGdlbmVyYXRvIHNlICoqYXV0b1VwZGF0ZSoqIMOoIGltcG9zdGF0YSBhIHRydWUgaW4gbW9kbyBkYSBwb3RlcmxvIHJpcHVsaXJlICovXHJcbiAgICBwdWJsaWMgdXBkYXRlVGltZXI6IGFueTtcclxuICAgIC8qKiBJbXBvc3RhdGEgYSB0cnVlIG9nbmkgdm9sdGEgY2hlIHZpZW5lIGF2dmlhdGEgdW5hIHJpY2VyY2EsIGUgYSBmYWxzZSBvZ25pIHZvbHRhIGNoZSB1biBudW92byB2YWxvcmUgdmllbmUgcmljZXZ1dG8gKi9cclxuICAgIHB1YmxpYyByZXNlYXJjaEluUHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBNb2RlbGxvIGRpIGFwcG9nZ2lvIHRlbXBvcmFuZW8gcGVyIGkgKipSb3dURHMqKiAqL1xyXG4gICAgcHVibGljIFRNUFJvd1REczogeyBbY29udGV4dDogc3RyaW5nXTogVGRFbGVtZW50W10gfSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyByYXBwcmVzZW50YW50ZSB1biBkaXppb25hcmlvIGRpIHJpZ2hlIGRlbGxhIHRhYmVsbGEsIGNvbiBjaGlhdmUgbCdoYXNoIGUgdmFsb3JlIGxhIGxpc3RhIGRpIGNlbGxlICovXHJcbiAgICBwdWJsaWMgUm93VERzOiB7IFtjb250ZXh0OiBzdHJpbmddOiBUZEVsZW1lbnRbXSB9ID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgKipSb3dURHMqKiDDqCB1biBvZ2dldHRvIHZ1b3RvIG8gbWVubyAqL1xyXG4gICAgcHVibGljIEVtcHR5Um93VGRzOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIC8qKiBNb2RlbGxvIGRpIGFwcG9nZ2lvIHRlbXBvcmFuZW8gcGVyIGkgKipSb3dUSHMqKiAqL1xyXG4gICAgcHVibGljIFRNUFJvd1RIczogVGhFbGVtZW50W10gPSBudWxsO1xyXG4gICAgLyoqIE1vZGVsbG8gcmFwcHJlc2VudGFudGUgdW4gc2luZ29sbyB0aCBkZWxsYSB0YWJlbGxhLCBnZW5lcmF0byBpbiBiYXNlIGFsbGUgY29uZmlndXJhemlvbmkgZSBhZ2xpIG9nZ2V0dGkgcmljZXZ1dGkgKi9cclxuICAgIHB1YmxpYyBSb3dUSHM6IFRoRWxlbWVudFtdID0gbnVsbDtcclxuICAgIC8qKiBNb2RlbGxvIGRpIGFwcG9nZ2lvIHRlbXBvcmFuZW8gcGVyIGkgKipSb3dUaEdyb3VwcyoqICovXHJcbiAgICBwdWJsaWMgVE1QUm93VGhHcm91cHM6IFRoR3JvdXBbXVtdID0gbnVsbDtcclxuICAgIC8qKiBNb2RlbGxvIHJhcHByZXNlbnRhbnRlIHVuIHNpbmdvbG8gaGVhZGVyIGdyb3VwIGRlbGxhIHRhYmVsbGEuIFF1ZXN0YSBsaXN0YSDDqCBnacOgIG9yZGluYXRhIGUgcHJvbnRhIHBlciBlc3NlcmUgdXRpbGl6emF0YSBpbiBuZ0ZvciAqL1xyXG4gICAgcHVibGljIFJvd1RoR3JvdXBzOiBUaEdyb3VwW11bXSA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaXN0YSBkZWkgY29udGVzdGkuIFVuIGNvbnRlc3RvIG5vbiDDqCBhbHRybyBjaGUgdW4gaGFzaCBwYXJ0aWNvbGFyZSBjYWxjb2xhdG8gc3UgdW4gb2dnZXR0byBjaGUgaWRlbnRpZmljYSB1bml2b2NhbWVudGUgdGFsZSBvZ2dldHRvLlxyXG4gICAgICpcclxuICAgICAqIE9nbnVubyBkaSBxdWVzdGkgY29udGVzdGkgcmFwcHJlc2VudGVyw6AgYSBzdWEgdm9sdGEsIHVuaXZvY2FtZW50ZSwgdW5hIHJpZ2EgYWxsJ2ludGVybm8gZGVsbGEgdGFiZWxsYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUm93Q29udGV4dHM6IGFueVtdID0gW107XHJcbiAgICAvKiogRGlyZXR0aXZlIGRpIG9yZGluYW1lbnRvIGRlbGxlIGNvbG9ubmUgKG5vbiBvcmRpbmFtZW50byBkZWkgZGF0aSBtYSBkZWxsZSBjb2xvbm5lIGluIHNlKSAqL1xyXG4gICAgcHVibGljIE9yZGVyRGlyZWN0aXZlczogc3RyaW5nW10gPSBbXTtcclxuICAgIC8qKiBDb2RpY2UgZGVsbCd1bHRpbW8gb2dnZXR0byBzb2xlemlvbmF0byAqL1xyXG4gICAgcHVibGljIGxhc3RTZWxlY3RlZEl0ZW1JRCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWNpZGUgc2UgdXRpbGl6emFyZSBvIG1lbm8gbGUgQ3VzdG9tQ2VsbHMuIEltcG9zdGFuZG9sbyBhICoqdHJ1ZSoqIGwnZXMtdGFibGUgZGl2ZW50YSBpbiBncmFkbyBkaSBnZXN0aXJlIG5hdGl2YW1lbnRlOlxyXG4gICAgICpcclxuICAgICAqIDEpIE9yZGluYW1lbnRvIGUgdmlzaWJpbGl0w6AgZGVsbGUgY29sb25uZVxyXG4gICAgICpcclxuICAgICAqIDIpIE9yZGluYW1lbnRvIGRlaSBkYXRpXHJcbiAgICAgKlxyXG4gICAgICogMykgTW9kYWxpdMOgIEdlcmFyY2hpY2FcclxuICAgICAqXHJcbiAgICAgKiBlY2MuLi5cclxuICAgICAqIHZpZW5lIGRlZG90dG8gZGFsIHNpc3RlbWEgaW4gYXV0b21hdGljb1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVXNlQ3VzdG9tQ2VsbHM6IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIG9sdHJlIGFsbGUgY29sb25uZSBkaW5hbWljaGUgc3BlY2lmaWNoZSBkaSB1biB0aXBvIGRpIG9nZ2V0dG8gY2kgc29ubyBhbmNoZSBjb2xvbm5lIGRpbmFtaWNoZSBhZ2dpdW50ZSBkYWxsJ3V0ZW50ZVxyXG4gICAgICpcclxuICAgICAqIEVzLiB1bmEgY29sb25uYSBpbiBjdWkgbW9zdHJhcmUgc2VtcHJlIHVuIGljb25jaW5hXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBVc2VyRGVmaW5lZER5bmFtaWNDb2xzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogSW5kaWNhIGNoZSBxdWVzdG8gw6ggaWwgcHJpbW8gQmluZCBkZWxsYSB0YWJlbGxhLCB2aWVuZSBzZXR0YXRvIGEgZmFsc2Ugbm9uIGFwcGVuYSBpbCBwcmltbyBiaW5kIHZpZW5lIHRlcm1pbmF0byBjb24gc3VjY2Vzc28gKi9cclxuICAgIHB1YmxpYyBGaXJzdEJpbmQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLyoqIExpc3RhIGRpIGNvbG9ubmUgY2hlIHNpIHBvc3Nvbm8gdmlzdWFsaXp6YXJlL29yZGluYXJlIGZyYSBkaSBsb3JvICovXHJcbiAgICBwdWJsaWMgQ29sdW1uc0xpc3Q6IEVzVGFibGVDb2x1bW5bXSA9IFtdO1xyXG4gICAgLyoqIFZhcmlhYmlsZSBkJ2FwcG9nZ2lvIHVzYXRhIGRhbGxhIGRpYWxvZyBkaSBzZWxlemlvbmUvbmFzY29uZGltZW50bywgcGVyIGV2aXRhcmUgZGkgZGFubmVnZ2lhcmUgKipDb2x1bW5zTGlzdCoqIGluIGNhc28gZGkgbW9kaWZpY2hlIHBvaSBhbm51bGxhdGUgKi9cclxuICAgIHB1YmxpYyBUTVBDb2x1bW5zTGlzdDogRXNUYWJsZUNvbHVtbltdID0gW107XHJcbiAgICAvKiogVmFsb3JlIGRlbCBjaGVjayBnbG9iYWxlIGRpIHZpc2liaWxpdMOgIHZhbGlkbyBwZXIgdHV0dGUgbGUgY29sb25uZSBpbiAqKkNvbHVtbnNMaXN0KiogKi9cclxuICAgIHB1YmxpYyBnbG9iYWxDb2xWaXNDaGVjayA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSB0dXR0ZSBsZSBkaXJldHRpdmUgcGVyIGdsaSBlZGl0b3IgY3VzdG9tIGRlbGxlIGNlbGxlICovXHJcbiAgICBAQ29udGVudENoaWxkcmVuKEVzVGRFZGl0b3JEaXJlY3RpdmUpIEVzVGRFZGl0b3JEaXJlY3RpdmVzOiBRdWVyeUxpc3Q8RXNUZEVkaXRvckRpcmVjdGl2ZT47XHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgdHV0dGUgbGUgbnVvdmUgZGlyZXR0aXZlICBhc3NlZ25hdGkgYSBkaXJldHRpdmEgKFBlciBsYSBtb2RhbGl0w6AgZGluYW1pY2EgZGVsbCdlcy10YWJsZSkgKi9cclxuICAgIEBDb250ZW50Q2hpbGRyZW4oRXNUZERpcmVjdGl2ZSkgRXNUZHNEaXJlY3RpdmU6IFF1ZXJ5TGlzdDxFc1RkRGlyZWN0aXZlPjtcclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSB0dXR0aSBnbGkgZXMtdGQgYXNzZWduYXRpIGEgZGlyZXR0aXZhIChQZXIgbGEgbW9kYWxpdMOgIGRpbmFtaWNhIGRlbGwnZXMtdGFibGUpICovXHJcbiAgICBAQ29udGVudENoaWxkcmVuKEVzVGhEaXJlY3RpdmUpIEVzVGhzRGlyZWN0aXZlOiBRdWVyeUxpc3Q8RXNUaERpcmVjdGl2ZT47XHJcbiAgICAvKiogSW5wdXQgY29sbGVnYXRvIGEgdW4gdGVtcGxhdGUgY2hlIGNvbnRpZW5lIGxlIGRpcmV0dGl2ZSBwZXIgcmVuZGVyaXp6YXJlIHF1ZXN0YSB0YWJlbGxhLiBzZSBjaSBzb25vICoqRXNUZHNEaXJlY3RpdmUqKiBlICoqRXNUaHNEaXJlY3RpdmUqKiBxdWVzdGkgaGFubm8gbGEgcHJpb3JpdMOgICovXHJcbiAgICBASW5wdXQoKSBFc1RhYmxlVGVtcGxhdGU6IElFc1RhYmxlVGVtcGxhdGVXcmFwcGVyO1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIGxlIGluZm9ybWF6aW9uaSBkZWwgYm9keSAocHVudG8gZGVsbGEgdGFiZWxsYSBkb3ZlIHZlbmdvbm8gbW9zdHJhdGUgbGUgcmlnaGUpICovXHJcbiAgICBAQ29udGVudENoaWxkKCdib2R5JywgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBib2R5UmVmOiBhbnk7XHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgbGUgaW5mb3JtYXppb25pIGRlbGwnaGVhZGVyIChwdW50byBkZWxsYSB0YWJlbGxhIGRvdmUgdmVuZ29ubyBtb3N0cmF0ZSBsZSBpbnRlc3RhemlvbmkgZGVsbGUgcmlnaGUpICovXHJcbiAgICBAQ29udGVudENoaWxkKCdoZWFkZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGhlYWRlclJlZjogYW55O1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIFF1ZXJ5IHBlciByZWN1cGVyYXJlIGxlIGluZm9ybWF6aW9uaSBzdWwgcmFnZ3J1cHBhbWVudG8gZGVnbGkgaGVhZGVyICovXHJcbiAgICBAQ29udGVudENoaWxkKCdoZWFkZXJHcm91cCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgaGVhZGVyR3JvdXBSZWY6IGFueTtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBRdWVyeSBwZXIgcmVjdXBlcmFyZSBsZSBpbmZvcm1hemlvbmkgc3VsIHJhZ2dydXBwYW1lbnRvIGRpIHNlY29uZG8gbGl2ZWxsbyBkZWdsaSBoZWFkZXIgKi9cclxuICAgIEBDb250ZW50Q2hpbGQoJ3NlY29uZGFyeUhlYWRlckdyb3VwJywgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBzZWNvbmRhcnlIZWFkZXJHcm91cFJlZjogYW55O1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIGlsIGNhbXBvIGRpIElucHV0IGF0dHVhbGUuIERvcG8gdW4gZG9wcGlvIGNsaWNrIGxvIGJlY2NvIGUgbG8gZm9jdXNzbyBhcHBlbmEgdGVybWluYSBsYSBjaGFuZ2UgZGV0ZWN0aW9uICovXHJcbiAgICBAVmlld0NoaWxkKCdpbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgaW5wdXRGaWVsZDogRWxlbWVudFJlZjtcclxuICAgIC8qKiBPcHppb25pIGV4dHJhIGNoZSBkZXZvbm8gYXBwYXJpcmUgbmVsIE1lbsO5IGNvbnRlc3R1YWxlIGluIGFsdG8gYSBkZXN0cmEsIHJpY2hpYW1hdG8gZGFpIDMgcGFsbGluaSB2ZXJ0aWNhbGkgKi9cclxuICAgIEBJbnB1dCgpIENvcm5lck1lbnVPcHRpb25zOiBDb3JuZXJNZW51T3B0aW9uW10gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBkZXYnZXNzZXJlIHBvc3NpYmlsZSBlZmZldHR1YXJlIGlsIHJlc2l6ZSBkZWxsZSBjb2xvbm5lICovXHJcbiAgICBASW5wdXQoKSBDb2x1bW5zUmVzaXphYmxlOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgZGV2J2Vzc2VyZSBwb3NzaWJpbGUgZWZmZXR0dWFyZSBpbCBwaW5uaW5nIGRlbGxlIGNvbG9ubmUgKi9cclxuICAgIEBJbnB1dCgpIENvbHVtbnNQaW5uYWJsZTogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIGRldidlc3NlcmUgZGlzcG9uaWJpbGUgaWwgc2lzdGVtYSBkaSBhZ2dpb3JuYW1lbnRvIGF1dG9tYXRpY28gKi9cclxuICAgIEBJbnB1dCgpIEF1dG9VcGRhdGU6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBsJ2FsdGV6emEgY2FibGF0YSBjaGUgZGV2ZSBhc3N1bWVyZSBsYSB0YWJlbGxhLiBFczogXCIxMDBweFwiIHwgXCIxMDAlXCIgLi4uICAqL1xyXG4gICAgQElucHV0KCkgSGVpZ2h0OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBpbCBjb2xvcmUgZGkgc2ZvbmRvIGRlbGxvIHNwYXppbyB2dW90byAobm9uIHJpY29wZXJ0byBkYSBkYXRpKS4gUGFydGljb2xhcm1lbnRlIHV0aWxlIGRhIGltcG9zdGFyZSBpbiBjYXNvIGRpICoqSGVpZ2h0KiogZGl2ZXJzbyBkYSBudWxsICAqL1xyXG4gICAgQElucHV0KCkgRW1wdHlTcGFjZUJhY2tncm91bmRDb2xvcjogc3RyaW5nID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgZGV2J2Vzc2VyZSBsJ2VzdGFibGUgYSBnZXN0aXJlIGxhIHJpY2VyY2EsIGFuY2hlIGxhIHByaW1hLiAgKiovXHJcbiAgICBASW5wdXQoKSBFc1RhYmxlSGFuZGxlZFNlYXJjaDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBpbXBvc3RhcmUgbCdhbHRlenphIG1hc3NpbWEgZGVsbGEgdGFiZWxsYS4gU2UgbnVsbCBsYSBkaW1lbnNpb25lIHNpIGFkYXR0YSBhbCBudW1lcm8gZGkgZWxlbWVudGkgYXR0dWFsbWVudGUgaW4gdmlzdWFsaXp6YXppb25lICovXHJcbiAgICBASW5wdXQoKSBNYXhIZWlnaHQ6IG51bWJlciA9IG51bGw7XHJcbiAgICAvKiogQ2xhc3NpIGRhIGFwcGxpY2FyZSBhbCBjb250ZW5pdG9yZSBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBDb250YWluZXJDbGFzcyA9IG51bGw7XHJcbiAgICAvKiogUGVybWV0dGUgbyBtZW5vIGwnZXhwb3J0IGluIGZvcm1hdG8gWExTWCAqL1xyXG4gICAgQElucHV0KCkgWExTWEV4cG9ydDogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogUGVybWV0dGUgbyBtZW5vIGwnZXhwb3J0IGluIGZvcm1hdG8gQ1NWICovXHJcbiAgICBASW5wdXQoKSBDU1ZFeHBvcnQgPSB0cnVlO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIHZpc3VhbGl6emFyZSBvIG1lbm8gbCdvcHppb25lIGRpIHBhZ2luYXppb25lIFwiVHV0dGlcIiAqL1xyXG4gICAgQElucHV0KCkgQWxsU2VhcmNoID0gbnVsbDtcclxuICAgIC8qKiBEaW1pbnVpc2NlIGdsaSBzcGF6aSBmcmEgdW5hIGNlbGxhIGUgbCdhbHRyYSwgZSBpbnRlcm5hbWVudGUgaWwgcGFkZGluZyBkZWwgZm9udCBpbiBtb2RvIGRhIHByZXNlbnRhcmUgbW9sdGkgcGnDuSBkYXRpIGluIHVuJ3VuaWNhIHBhZ2luYSAqL1xyXG4gICAgQElucHV0KCkgSGlnaENlbGxEZW5zaXR5OiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBBYmlsaXRhIG8gbWVubyBsYSBwb3NzaWJpbGl0w6AgZGkgc2VsZXppb25hcmUgb2dnZXR0aSAqL1xyXG4gICAgQElucHV0KCkgU2VsZWN0aW9uOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBNb3N0cmEgbyBtZW5vIHVuIG1lc3NhZ2dpbyBkaSBMb2FkaW5nIGFsIHByaW1vIGNhcmljYW1lbnRvIGRlbGxhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIFNob3dMb2FkaW5nT25Cb290c3RyYXA6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFNlIGltcG9zdGF0byBhICoqdHJ1ZSoqIGFnZ2l1bmdlIHVuYSBjb2xvbm5hIGNvbiBwdWxzYW50ZSBkaSBlbGltaW5hemlvbmUgcGVyIGVmZmV0dHVhcmUgbCdlbGltaW5hIGRlbGwnb2dnZXR0byByZWxhdGl2byAqL1xyXG4gICAgQElucHV0KCkgUmVtb3ZhbDogYm9vbGVhbiA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25kaXppb25lIGNoZSBuYXNjb25kZSBsJ2ljb25hIGRpIGVsaW1pbmF6aW9uZSBpbnNlcml0YSBpbXBvc3RhbmRvICoqUmVtb3ZhbCoqIGEgdHJ1ZSBxdWFsb3JhIGxhIGNvbmRpemlvbmUgbm9uIHZlbmlzc2UgcmlzcGV0dGF0YVxyXG4gICAgICpcclxuICAgICAqIENvbWUgY29uZGl6aW9uZSBzaSBjb25zaWRlcmEgdW4gc2VtcGxpY2UgY2FtcG8gc3UgY3VpIGVmZmV0dHVhcmUgdW4gY29udHJvbGxvIGJvb2xlYW5vLCBjb21lIGFkIGVzZW1waW8gXCJjYW5yZW1vdmVcIlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBSZW1vdmFsQ29uZGl0aW9uID0gJyc7XHJcbiAgICAvKiogSW5kaWNhIHNlIGFiaWxpdGFyZSBsYSBwb3NzaWJpbGl0w6AgZGkgZXNwb3J0YXJlIGxhIHZpc3RhIGRhdGkgYXR0dWFsZSAqL1xyXG4gICAgQElucHV0KCkgRXhwb3J0OiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgcGVybWV0dGVyZSBsYSBzZWxlemlvbmUgbXVsdGlwbGEgV2luZG93cy1saWtlIGNsaWNjYW5kbyB1biBvZ2dldHRvIGUgZmFjZW5kbyBwb2kgU2hpZnQgKyBjbGljayBzdSB1biBvZ2dldHRvIHN1Y2Nlc3Npdm8gKi9cclxuICAgIEBJbnB1dCgpIFNoaWZ0Q2xpY2s6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBpbCB0ZXN0byBjaGUgdmEgYSBzb3N0aXR1aXJlIFwiT2dnZXR0aSBWaXN1YWxpenphdGlcIiBpbiBjYXNvIHNpIHN0aWEgZmFjZW5kbyBxdWFsY29zYSBkaSBjdXN0b20gKi9cclxuICAgIEBJbnB1dCgpIENvdW50TGFiZWw6IHN0cmluZyA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5hc2NvbmRlcmUgbyBtb3N0cmFyZSBpbCBjb21wb25lbnRlIGRpIHBhZ2luYXppb25lICovXHJcbiAgICBASW5wdXQoKSBIaWRlUGFnaW5nOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgbmFzY29uZGVyZSBvIG1vc3RyYXJlIGlsIGNvbnRlZ2dpbyBkZWdsaSBlbGVtZW50aSB0cm92YXRpICovXHJcbiAgICBASW5wdXQoKSBIaWRlUGFnaW5nQ291bnQ6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBuYXNjb25kZXJlIG8gbW9zdHJhcmUgaSBwdWxzYW50aSBkaSBwYWdpbmF6aW9uZSAqL1xyXG4gICAgQElucHV0KCkgSGlkZVBhZ2luZ0J1dHRvbnM6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFJpZmVyaW1lbnRvIGFsIENvbnRleHRNZW51IChuZ3gtY29udGV4dG1lbnUpIGFzc29jaWF0byBhbCBjbGljayBkZXN0cm8gZGkgdW5vIG8gcGnDuSBlbGVtZW50aSBzZWxlemlvbmF0aSBuZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBDb250ZXh0TWVudTogQ29udGV4dE1lbnVDb21wb25lbnQgPSBudWxsO1xyXG4gICAgLyoqIE5vbWUgZGVsbCdlc3BvcnRhemlvbmUgZ2VuZXJhdGEgZGEgcXVlc3RhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIEV4cG9ydEZpbGVOYW1lID0gJ0V4cG9ydC5jc3YnO1xyXG4gICAgLyoqIENsYXNzZSAoSFRNTCkgZGkgZGVmYXVsdCBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBUYWJsZUNsYXNzID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bnppb25lIGRhIHV0aWxpenphcmUgaW4gZXNwb3J0YXppb25lLiBOZWwgZm9ybWF0byBcIlJlcG9ydFwiIGF2csOgIHVuIHVuaWNvIHBhcmFtZXRybyBcIkZvcm1hdG9cIiBlIG5lc3N1biB2YWxvcmUgZGkgcml0b3Juby5cclxuICAgICAqXHJcbiAgICAgKiBOZWwgZm9ybWF0byBcIlZpZXdcIiBoYSBjb21lIHBhcmFtZXRybyB1bmEgY2FsbGJhY2sgY29uIGkgZGF0aSBjb21wbGV0aSBkYSBlc3BvcnRhcmUgKGRhdG8gY2hlIGRpIGRlZmF1bHQgbGEgcmljZXJjYSDDqCBwYWdpbmF0YSlcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRXhwb3J0RnVuY3Rpb246IGFueTtcclxuICAgIC8qKiBJbmRpY2EgZGkgZXNwb3J0YXJlIHNvbG8gbGUgY29sb25uZSBhdHR1YWxtZW50ZSB2aXNpYmlsaSBkZWxsYSB2aWV3ICovXHJcbiAgICBASW5wdXQoKSBFeHBvcnRPbmx5VmlzaWJsZUNvbHVtbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBJbmRpY2EgbGEgcHJlc2VuemEgZGkgcmFnZ3J1cHBhbWVudGkgYSBsaXZlbGxvIGRpIGhlYWRlciAqL1xyXG4gICAgQElucHV0KCkgSGFzSGVhZGVyR3JvdXA6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIEluZGljYSBsYSBwcmVzZW56YSBkaSByYWdncnVwcGFtZW50aSBhIGxpdmVsbG8gZGVsIHJhZ2dydXBwYW1lbnRvIHByZWNlZGVudGVtZW50ZSBlc2lzdGVudGUsIGNoaWFyYW1lbnRlIMOoIGluc2Vuc2F0YSBzZW56YSAqKkhhc0hlYWRlckdyb3VwKiogKi9cclxuICAgIEBJbnB1dCgpIEhhc1NlY29uZGFyeUhlYWRlckdyb3VwOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgbmFzY29uZGVyZSBnbGkgSGVhZGVyIGRlbGxhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIEhlYWRlckhpZGRlbjogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5hc2NvbmRlcmUgaWwgQm9keSBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBCb2R5SGlkZGVuOiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBsYSBzZWxlemlvbmUgw6ggdGVtcG9yYW5lYW1lbnRlIGRpc2FiaWxpdGF0YS4gUmlzcGV0dG8gYWxsJ0lucHV0ICoqU2VsZWN0aW9uKiogY2hlIHZpc2l2YW1lbnRlIGdlc3Rpc2NlIHNlIGNpIHNvbm8gbyBubyBnbGkgaW5wdXQgZGkgc2VsZXppb25lLFxyXG4gICAgICogcXVlc3RvIElucHV0IGdlc3Rpc2NlIHNlIHF1ZXN0aSBpbnB1dCBzb25vIGFiaWxpdGF0aSBvIG1lbm9cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgU2VsZWN0aW9uRGlzYWJsZWQ6IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIGZvcnphcmUgaWwgc2lzdGVtYSBkaSBzZWxlemlvbmUgYSBnZXN0aXJlIHVuIGVsZW1lbnRvIHBlciB2b2x0YS5cclxuICAgICAqIFNlbGV6aW9uYXJlIHVuJ2FsdHJhIHJpZ2EgY29uIHVuYSBnacOgIHNlbGV6aW9uYXRhIGFwcGxpY2hlcsOgIGxhIHNlbGV6aW9uZSBhbGxhIG51b3ZhIHJpZ2EsIHJpbXVvdmVuZG9sYSBkYWxsJ2F0dHVhbGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgU2luZ2xlU2VsZWN0aW9uOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBDYWxsYmFjayBjaGUgZGF0byB1biBvZ2dldHRvIHJlc2l0dWlzY2UgbCdldmVudHVhbGUgY2xhc3NlIGRhIGFwcGxpY2FyZSBhbGxhIHJpZ2EgY29sbGVnYXRhIGFsbCdvZ2dldHRvICovXHJcbiAgICBASW5wdXQoKSBSb3dDbGFzc0Fzc2lnbmVyOiBhbnkgPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIG9yZGluYXJlIGkgZGF0aSBpbiBtYW5pZXJhIGRpc2NlbmRlbnRlIG8gYXNjZW5kZW50ZSAqL1xyXG4gICAgQElucHV0KCkgT3JkZXJCeUNvbHVtbjogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogUGVybWV0dGUgZGkgYXZlcmUgcGnDuSBkaXJldHRpdmUgZGkgb3JkaW5hbWVudG8gZGVpIGRhdGkgKi9cclxuICAgIEBJbnB1dCgpIE11bHRpcGxlT3JkZXJpbmdEaXJlY3RpdmVzID0gdHJ1ZTtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBuYXNjb25kZXJlIGxlIGNvbG9ubmUgaW4gYmFzZSBhbGxlIHNlbGV6aW9uaSBlZmZldHR1YXRlIGRhbCBNZW7DuSBjb250ZXN0dWFsZSBpbiBhbHRvIGEgZGVzdHJhICovXHJcbiAgICBASW5wdXQoKSBIaWRkZW5Db2x1bW5zOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSByaW9yZGluYXJlIGxlIGNvbG9ubmUgaW4gYmFzZSBhbGxlIGltcG9zdGF6aW9uaSBlZmZldHR1YXRlIGRhbCBNZW7DuSBjb250ZXN0dWFsZSBpbiBhbHRvIGEgZGVzdHJhICovXHJcbiAgICBASW5wdXQoKSBDb2x1bW5zT3JkZXJpbmc6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIEV2ZW50dWFsZSBzdXBwb3J0byBhbGxlIHJpY2VyY2hlIGFwcGxpY2F0ZSBhbGxhIG1vZGFsaXTDoCBBcnJheSAqL1xyXG4gICAgQElucHV0KCkgU2VhcmNoVmlldyA9IG51bGwgYXMgQXBwU2VhcmNoPGFueT47XHJcbiAgICAvKiogQWJpbGl0YSBvIGRpc2FiaWxpdGEgaWwgc2lzdGVtYSBjaGUgcGVybWV0dGUgZGkgc2VsZXppb25hcmUgdHV0dGkgZ2xpIGVsZW1lbnRpIG5lbGxhIHZpc3RhICovXHJcbiAgICBASW5wdXQoKSBTZWxlY3RBbGw6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFNpbXVsYSBsYSBwYWdpbmF6aW9uZSBhbmNoZSBwZXIgbGUgdGFiZWxsZSBjaGUgZnVuemlvbmFubyBpbiBtb2RhbGl0w6AgQXJyYXkgKi9cclxuICAgIEBJbnB1dCgpIFVzZUFycmF5TW9kZVBhZ2luZyA9IHRydWU7XHJcbiAgICAvKiogRGVmaW5pemlvbmUgZGkgY29sb25uZSBkaW5hbWNoZSBwZXIgbGEgbW9kYWxpdMOgLCBhcHB1bnRvLCBkaW5hbWljYSAqL1xyXG4gICAgQElucHV0KCkgRHluYW1pY1Jvd0NvbHVtbnNEZWZpbml0aW9uOiBFc1RhYmxlQ29sdW1uc0RlZmluaXRpb25bXSA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIG9wZXJhemlvbmkgZGluYW1pY2hlIGdlbmVyaWNoZSBjaGUgcG9zc29ubyBlc3NlcmUgZWZmZXR0dWF0ZSBwZXIgcmlnYS4gQXBwYWlvbm8gY29tZSBjb2xvbm5lIGV4dHJhIHN1bCBsYXRvIHNpbmlzdHJvIGRlbGxhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIER5bmFtaWNPcGVyYXRpb25zOiBFc1RhYmxlT3BlcmF0aW9uRGVmaW5pdGlvbltdID0gW107XHJcbiAgICAvKiogSW5kaWNhIHNlIHZpc3VhbGl6emFyZSBpIGRhdGkgaW4gbWFuaWVyYSBnZXJhcmNoaWNhICovXHJcbiAgICBASW5wdXQoKSBIaWVyYXJjaHk6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIE5vbWUgZGVsbGEgcHJvcHJpZXTDoCBjaGUgY29udGllbmUgbCdJRCBkZWwgcGFkcmUuIERhIHV0aWxpenphcmUgc2UgKipIaWVyYXJjaHkqKiDDqCBpbXBvc3RhdG8gKi9cclxuICAgIEBJbnB1dCgpIFBhcmVudEtleSA9ICcnO1xyXG4gICAgLyoqIE5vbWUgZGVsbGEgcHJvcHJpZXTDoCBjaGUgY29udGllbmUgbCdJRCBkZWxsJ29nZ2V0dG8gYXR0dWFsZS4gRGEgdXRpbGl6emFyZSBzZSAqKkhpZXJhcmNoeSoqIMOoIGltcG9zdGF0byAqL1xyXG4gICAgQElucHV0KCkgT3duS2V5ID0gJyc7XHJcbiAgICAvKiogSW5kaWNhIHNlIHBhcnRpcmUgY29uIHVuIGFsYmVybyBlc3BhbnNvLiBEYSB1dGlsaXp6YXJlIHNlICoqSGllcmFyY2h5Kiogw6ggaW1wb3N0YXRvICovXHJcbiAgICBASW5wdXQoKSBTdGFydHNFeHBhbmRlZCA9IHRydWU7XHJcbiAgICAvKiogSW5kaWNhIHNlIGVmZmV0dHVhcmUgaWwgc2FsdmF0YWdnaW8gZGVsbGUgcHJlZmVyZW56ZSBkaSByaWNlcmNhICovXHJcbiAgICBASW5wdXQoKSBTYXZlUHJlZmVyZW5jZXM6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEFsbGluZWFtZW50byBkaSBkZWZhdWx0IHBlciBjZWxsZSBlIGhlYWRlcnMgKi9cclxuICAgIEBJbnB1dCgpIERlZmF1bHRBbGlnbm1lbnQ6ICdMZWZ0JyB8ICdSaWdodCcgfCAnQ2VudGVyJyA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIGRvdmUgdmlzdWFsaXp6YXJlIGxlIGluZm9ybWF6aW9uaSBkaSBwYWdpbmF6aW9uZSwgc2Ugc29wcmEsIHNvdHRvIG8gaW4gZW50cmFtYmkgKi9cclxuICAgIEBJbnB1dCgpIFBhZ2luZ1N0eWxlOiAnYm90aCcgfCAndG9wJyB8ICdib3R0b20nID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgZG92ZSB2aXN1YWxpenphcmUgbGUgaW5mb3JtYXppb25pIGRpIHBhZ2luYXppb25lLCBzZSBzb3ByYSwgc290dG8gbyBpbiBlbnRyYW1iaSAqL1xyXG4gICAgQElucHV0KCkgUm93R3JvdXBpbmdQYWdpbmdTdHlsZTogJ2xlZnQnIHwgJ3JpZ2h0JyA9IG51bGw7XHJcbiAgICAvKiogUXVhbG9yYSBwZXIgcXVhbHNpYXNpIG1vdGl2byBub24gdmVuaXNzZSB1c2F0byAqKml0ZW1zKiogZGVsbCdBcHBTZWFyY2ggcXVlc3RvIElucHV0IGluZGljYSBxdWFsIMOoIGlsIG5vbWUgZGVsbGEgcHJvcHJpZXTDoCBkYSB1dGlsaXp6YXJlICovXHJcbiAgICBASW5wdXQoKSBJdGVtU291cmNlUHJvcGVydHk6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAvKiogSW5kaWNhIHNlIHV0aWxpenphcmUgbGEgY2FjaGUgZGkgc2VsZXppb25lIGNoZSBwZXJtZXR0ZSBkaSBtYW50ZW5lcmUgZ2xpIHN0YXRpIGRpIHNlbGV6aW9uZSBkZWkgdmFyaSBvZ2dldHRpIG5hdmlnYW5kbyBkYSB1bmEgcGFnaW5hIGFsbCdhbHRyYSAqL1xyXG4gICAgQElucHV0KCkgVXNlU2VsZWN0aW9uQ2FjaGUgPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIGRlY2lkZXJlIHNlLCBpbiBtb2RhbGl0w6AgcmFnZ3J1cHBhbWVudG8sIG1vc3RyYXJlIG8gbWVubyBpbCB2YWxvcmUgZGVsbGUgY29sb25uZSBkaSBncnVwcG8gbmVnbGkgb2dnZXR0aSBmaW5hbGkuIERpIGRlZmF1bHQgc29ubyBuYXNjb3N0aSAqL1xyXG4gICAgQElucHV0KCkgU2hvd0l0ZW1Hcm91cHNDb2x1bW5zID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgY2hlIHR1dHRpIGkgY2FtcGkgY2hlIGRlZmluaXNjb25vIGxlIG1vZGFsaXTDoCBkaSBtb2RpZmljYSBjYW1wbyBwb3Nzb25vIGVzc2VyZSBtb2RpZmljYXRpIGluIGJhc2UgYWxsZSBpbXBvc3RhemlvbmkgKi9cclxuICAgIEBJbnB1dCgpIEVkaXRhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogSW5kaWNhIHNlIMOoIHBvc3NpYmlsZSBlZmZldHR1YXJlIHNlbGV6aW9uaSBhIHJhbmdlIHBlciBwb2kgZmFyY2kgZXZlbnR1YWxtZW50ZSBjb3BpYSBpbmNvbGxhICovXHJcbiAgICBASW5wdXQoKSBSYW5nZVNlbGVjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBpbCBudW1lcm8gZGkgbWlsbGlzZWNvbmRpIHBlciBjdWkgZGVib3VuY2FyZSBpbCB3cml0ZVZhbHVlIHBlciBsYSBtb2RhbGl0w6AgKipFc1RhYmxlSGFuZGxlZFNlYXJjaCoqICovXHJcbiAgICBASW5wdXQoKSBTZWFyY2hUaHJvdHRsZTogbnVtYmVyID0gNTA7XHJcbiAgICAvKiogRXZlbnRvIGNoZSB2aWVuZSByaWNoaWFtYXRvIGFsIGNhbWJpbyBkaSBvcmlkbmFtZW50byBkaSB1bmEgY29sb25uYSAqL1xyXG4gICAgQE91dHB1dCgpIG9uT3JkZXJDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8QXBwT3JkZXJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxBcHBPcmRlcmluZz4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50byBjaGUgdmllbmUgcmljaGlhbWF0byBxdWFuZG8gbCdlcy10YWJsZSByaXRpZW5lIHNpYSBuZWNlc3NhcmlvIHJpLWVmZmV0dHVhcmUgbGEgcmljZXJjYS5cclxuICAgICAqIElsIGJvb2xlYW5vIGRlbGwnZXZlbnRvIGluZGljYSBzZSB2aWVuZSBzdWdnZXJpdG8gZGkgcmVzZXR0YXJlIGxhIHBhZ2luYSBvIG1lbm8uXHJcbiAgICAgKiBcclxuICAgICAqIFNvbG8gaW4gY2FzbyB2ZW5nYSB1dGlsaXp6YXRhIGxhIG1vZGFsaXTDoCBhIHJhZ2dydXBwYW1lbnRpIGRpIHJpZ2hlIHB1w7Igc3VjY2VkZXJlIGNoZSBsJ2VzLXRhYmxlIHBhc3NpIHVuIGludGVybyBBcHBTZWFyY2ggY29tZSBwYXJhbWV0cm8gZGkgcmljZXJjYSxcclxuICAgICAqIGluIHF1ZWwgY2FzbyBsJ2FwcGxpY2F6aW9uZSByaWNldmVudGUgZG92csOgIG9ub3JhcmUgbGEgcmljaGllc3RhIHNwZWRlbmRvIGFsIGJhY2thbmQgbCdvZ2dldHRvIGRpIHJpY2VyY2EgQVMtSVNcclxuICAgICAqIFxyXG4gICAgICogaWwgdGlwbyBkZWxsJ0VtaXR0ZXIgaW52ZWNlIGRpIGVzc2VyZSBbYm9vbGVhbiB8IEFwcFNlYXJjaDxhbnk+XSDDqCBzdGF0byBpbXBvc3RhdG8gYSBcImFueVwiIHBlciBldml0YXJlIHByb2JsZW1pIGRpIHJldHJvY29tcGF0aWJpbGl0w6BcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIG9uU2VhcmNoUmVxdWVzdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIC8qKiBFdmVudG8gY2hlIHBhcnRlIGFkIG9nbmkgbW9kaWZpY2EgZGkgXCJjaGVja2FnZ2lvXCIgaW4gZm9ybWEgZGkgY29tb2RvIGFycmF5LiBFc3BvbmUgbCdvZ2dldHRvIGNvbiBsbyBzdGF0byBkaSBjaGVjayBhdHR1YWxlICovXHJcbiAgICBAT3V0cHV0KCkgb25TZWxlY3Rpb25DaGFuZ2VkOiBFdmVudEVtaXR0ZXI8SXRlbXNTZWxlY3Rpb248YW55Pj4gPSBuZXcgRXZlbnRFbWl0dGVyPEl0ZW1zU2VsZWN0aW9uPGFueT4+KCk7XHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gYWxsJ2VsaW1pbmF6aW9uZSBkaSB1biBvZ2dldHRvICovXHJcbiAgICBAT3V0cHV0KCkgb25SZW1vdmFsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIGFsbCdhbm51bGxhbWVudG8gZGkgdW4nZWxpbWluYXppb25lICovXHJcbiAgICBAT3V0cHV0KCkgb25BYm9ydFJlbW92YWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gYWxsYSBtb2RpZmljYSBkZWkgbW9kZWxsaSBiaW5kYXRpICovXHJcbiAgICBAT3V0cHV0KCkgb25Nb2RlbENoYW5nZTogRXZlbnRFbWl0dGVyPEVzVGFibGVNb2RlbENoYW5nZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8RXNUYWJsZU1vZGVsQ2hhbmdlW10+KCk7XHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gYWxsJ2FwZXJ0dXJhIGRlbCBtZW7DuSBjb250ZXN0dWFsZSAqL1xyXG4gICAgQE91dHB1dCgpIG9uT3BlbkNvbnRleHRNZW51OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIHF1YW5kbyBzaSBjbGljY2Egc3UgdW4gb3B6aW9uZSBkZWZpbml0YSBuZWxsZSAqKkNvcm5lck1lbnVPcHRpb25zKiogKi9cclxuICAgIEBPdXRwdXQoKSBvbkNvcm5lckFjdGlvbjogRXZlbnRFbWl0dGVyPHsgaWQ6IHN0cmluZywgZXN0YWJsZTogYW55IH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmcsIGVzdGFibGU6IGFueSB9PigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIHF1YW5kbyBzaSBjbGljY2Egc3UgdW4gb3B6aW9uZSBkZWZpbml0YSBuZWxsZSAqKkR5bmFtaWNPcGVyYXRpb25zKiogKi9cclxuICAgIEBPdXRwdXQoKSBvbkR5bmFtaWNPcGVyYXRpb246IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmcsIGl0ZW06IGFueSB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nLCBpdGVtOiBhbnkgfT4oKTtcclxuXHJcbiAgICAvKiogRGF0aSBlc3BvcnRhdGkgZGEgbmd4LWNzdiAqL1xyXG4gICAgcHVibGljIGRhdGE6IGFueVtdO1xyXG4gICAgLyoqIEhlYWRlciBkZWkgZGF0aSBlc3BvcnRhdGkgZGEgbmd4LWNzdiAqL1xyXG4gICAgcHVibGljIGhlYWRlcnM6IENzdkhlYWRlcnNbXTtcclxuICAgIC8qKiBFbGVtZW50byBIVE1MIGRhIGNsaWNjYXJlIHBlciBsJ2VzcG9ydGF6aW9uZSAqL1xyXG4gICAgQFZpZXdDaGlsZCgnZXhwb3J0RG93bmxvYWRlcicsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgZXhwb3J0RG93bmxvYWRlcjogRWxlbWVudFJlZjtcclxuICAgIC8qKiBQbGFjZWhvbGRlciBkaSBtZW7DuSBjb250ZXN0dWFsZSBwZXIgcXVhbmRvIG5vbiBjaSBzb25vIG9wemlvbmkgbmVsIHBsYWNlaG9sZGVyIFwiVmVyb1wiICAqL1xyXG4gICAgQFZpZXdDaGlsZCgnZW1wdHlNZW51JywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHRhYmxlRW1wdHlNZW51OiBDb250ZXh0TWVudUNvbXBvbmVudDtcclxuXHJcbiAgICAvKiogU3Vic2NyaXB0aW9uIHN1bGwnYXBlcnR1cmEgZGVsIGNvbnRleHQgbWVudSBkYSByaXB1bGlyZSBhbCBkZXN0cm95IGRlbGxhIGNsYXNzZSAqL1xyXG4gICAgcHJpdmF0ZSBjdHhNZW51U3Vic2NyaXB0aW9uOiBhbnk7XHJcblxyXG4gICAgLyoqIFBhZ2luYSBpbiB2aXN1YWxpenphemlvbmUgKGR1cmFudGUgbGEgcGFnaW5hemlvbmUgaW4gbW9kYWxpdMOgIEFycmF5KSAqL1xyXG4gICAgcHVibGljIGFycmF5bW9kZVBhZ2UgPSAxO1xyXG4gICAgLyoqIE51bWVybyBkaSBwYWdpbmUgKGR1cmFudGUgbGEgcGFnaW5hemlvbmUgaW4gbW9kYWxpdMOgIEFycmF5KSAqL1xyXG4gICAgcHVibGljIGFycmF5bW9kZVBhZ2VzID0gMTtcclxuICAgIC8qKiBPZ2dldHRpIHBlciBvZ25pIHBhZ2luYSAoZHVyYW50ZSBsYSBwYWdpbmF6aW9uZSBpbiBtb2RhbGl0w6AgQXJyYXkpICovXHJcbiAgICBASW5wdXQoKSBBcnJheW1vZGVJdGVtc1BlclBhZ2UgPSBudWxsO1xyXG4gICAgLyoqIE9nZ2V0dG8gZGkgc2VsZXppb25lIHBlciBsYSBtb2RhbGl0w6AgQXJyYXksIGNoZSBkZXZlIGNvbXBvcnRhcnNpIGNvbWUgbGEgY29udHJvcGFydGUgaW4gbW9kYWxpdMOgIFZpZXcgKi9cclxuICAgIHB1YmxpYyBhcnJheW1vZGVTZWxlY3Rpb246IEl0ZW1zU2VsZWN0aW9uPGFueT47XHJcbiAgICAvKiogQ29sb25uZSBkYSB2aXN1YWxpenphcmUgaW4gbW9kYWxpdMOgIGFycmF5ICovXHJcbiAgICBwdWJsaWMgYXJyYXlDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLyoqIE9yZGluZSBkZWxsZSBjb2xvbm5lIGRhIHZpc3VhbGl6emFyZSBpbiBtb2RhbGl0w6AgYXJyYXkgKi9cclxuICAgIHB1YmxpYyBhcnJheUNvbHVtbk9yZGVyaW5nOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLyoqIE9yZGluYW1lbnRpIEFTQy1ERVNDIHN1bGxlIGNvbG9ubmUgaW4gbW9kYWxpdMOgIGFycmF5ICovXHJcbiAgICBwdWJsaWMgYXJyYXlPcmRlcnM6IEFwcE9yZGVyaW5nW10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhcmlhYmlsZSBjaGUgc2VydmUgYSBnZXN0aXJlIGlsIG1vbWVudG8gaW4gY3VpIGwnZXMtdGFibGUgYWdnaW9ybmEgbGEgcGFnaW5hemlvbmUgKHB1bHNhbnRpIGVjYykuXHJcbiAgICAgKiBFc3NlbmRvIG9wZXJhemlvbmkgY29tdW5xdWUgY29zdG9zZSBsZSBlZmZldHR1byBzb2xvIHN1IGJpbmRpbmcgZXN0ZXJuaSwgbm9uIHN1IHJld3JpdGUgZ2VuZXJhdGkgaW50ZXJuYW1lbnRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW50ZXJuYWxXcml0ZUNhbGwgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhY2hlIGNoZSBjb250ZXJyw6AgdHV0dGUgbGUgcmljZXJjaGUgZWZmZXR0dWF0ZSBzdSBncnVwcGkgZGl2ZXJzaSBkYWwgcHJpbW8gZSBzdSBlbGVtZW50aSBjb250ZW51dGkgbmVpIGdydXBwaS5cclxuICAgICAqIEluIGNhc28gZGkgY2FtYmkgZGkgb3JkaW5hbWVudG8gZGVsbGUgY29sb25uZSBkaXZlcnNlIGRhbGxhIHByaW1hIHR1dHRlIGxlIGNoaWFtYXRlIGZhdHRlIGRhbCBzZWNvbmRvIGxpdmVsbG8gaW4gcG9pIGRldm9ubyBlc3NlcmUgcmllc2VndWl0ZSBzZWNvbmRvIGxhIHNlZ3VlbnRlIGxvZ2ljYTpcclxuICAgICAqIFxyXG4gICAgICogXHJcbiAgICAgKiAqKkNhbWJpbyBvcmRpbmFtZW50byBzdWwgcHJpbW8gZ3J1cHBvKio6IHJlbG9hZCBjb21wbGV0bywgbm9uIG1pIG9jY3VwbyBkaSByaXB1bGlyZSBnbGkgZWxlbWVudGkgYmluZGF0aSBpbiBhbGN1biBtb2RvXHJcbiAgICAgKiBcclxuICAgICAqICoqQ2FtYmlvIG9yZGluYW1lbnRvIHN1bGxhIGNvbG9ubmEgcmVsYXRpdmEgYWxsJ04tZXNpbW8gZ3J1cHBvKio6IHJlbG9hZCBjb21wbGV0byBkZWwgY29udGVudXRvIGRlaSBncnVwcGkgcHJlY2VkZW50aSwgcmlwdWxlbmRvIHByZWNlZGVudGVtZW50ZSBcclxuICAgICAqIHR1dHRpIGdsaSBlbGVtZW50aSBjb24gKipfZ3JvdXBsZXZlbCoqID0gTlxyXG4gICAgICogXHJcbiAgICAgKiAqKkNhbWJpbyBvcmRpbmFtZW50byBzdSB1bmEgY29sb25uYSBub24gcmFnZ3J1cHBhdGEqKjogcmVsb2FkIGNvbXBsZXRvIHBlciB0dXR0aSBpIGdydXBwaSBmaW5hbGkgYXBlcnRpLCBkZXZvIHByZWNlZGVudGVtZW50ZSByaXB1bGlyZSB0dXR0aSBnbGkgZWxlbWVudGkgY29uICoqX2l0ZW0qKiA9IHRydWVcclxuICAgICAqIFxyXG4gICAgICogQWx0cmkgZXZlbnRpIG5vbiBkb3ZyZWJiZXJvIHJhcHByZXNlbnRhcmUgcHJvYmxlbWk6XHJcbiAgICAgKiAtIFNlbGV6aW9uZTogbm9uIGNhbWJpYSBudWxsYVxyXG4gICAgICogLSBQYWdpbmF6aW9uZTogY2FtYmlhIGEgbGl2ZWxsbyByb290IHF1aW5kaSB2aWVuZSByaWNhcmljYXRvIHR1dHRvIGNvbXVucXVlLCBzdGVzc28gdmFsZSBwZXIgbGUgcGFnaW5hemlvbmkgaW50ZXJuZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JvdXBTZWFyY2hSZXF1ZXN0c0NhY2hlOiB7IHBhdGg6IHN0cmluZywgcm91dGU6IEdyb3VwUm91dGVGcmFnbWVudFtdLCB2aWV3OiBBcHBTZWFyY2g8YW55PiwgZ3JvdXBfY29sdW1uOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqIFZhcmlhYmlsZSBkJ2FwcG9nZ2lvIHBlciBjYXBpcmUgc2UgYyfDqCBiaXNvZ25vIGRpIHJpLWVmZmV0dHVhcmUgdW5hIHJpY2VyY2EgbyBtZW5vICovXHJcbiAgICBwcml2YXRlIFJlc2VhcmNoTmVlZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogQ29sb25uZSB2aXNpYmlsaSBkZWxsYSB2aXN0YSBhdHR1YWxlLiBWYWxvcml6emF0byBkaSBkZWZhdWx0IGFsIG51bWVybyBtYXNzaW1vIGRpIGNvbG9ubmUgc3VwcG9ydGF0ZSBkYWxsYSB0YWJlbGxhIHBlciBsZSBjYXNpc3RpY2hlIGluIGFzc2VuemEgZGkgY3VzdG9tIGNlbGxzICovXHJcbiAgICBwdWJsaWMgQ29sdW1uczogeyBWaXNpYmlsZTogbnVtYmVyLCBWaXNpYmxlVW5waW5uZWQ6IG51bWJlciwgR2xvYmFsOiBudW1iZXIgfSA9IHsgVmlzaWJpbGU6IDEwMCwgVmlzaWJsZVVucGlubmVkOiAxMDAsIEdsb2JhbDogMTAwIH07XHJcbiAgICAvKiogSW4gY2FzbyBkaSBSb3cgR3JvdXBpbmcgcXVpIHZpZW5lIHNhbHZhdGEgbGEgdmlzdGEgcHJpbmNpcGFsZSBkZWkgZ3J1cHBpIGJhc2UgKi9cclxuICAgIHB1YmxpYyBNYWluR3JvdXBWaWV3OiBBcHBTZWFyY2g8YW55PiA9IG51bGw7XHJcbiAgICAvKiogQ29udGVnZ2lvIGJhc2UgZGVnbGkgb2dnZXR0aS4gSW4gbW9kYWxpdMOgIG5vcm1hbGUgdmllbmUgcmVzZXR0YXRvIGFkIG9nbmkgbnVvdmEgVmlldyBpbnNlcml0YSwgaW4gbW9kYWxpdMOgIFJvd0dyb3VwaW5nIHZpZW5lIHJlc2V0dGF0byBzb2xvIGFkIHVuYSBudW92YSBWaWV3IGRpIGxpdmVsbG8gXCIwXCIgKi9cclxuICAgIHB1YmxpYyBCYXNlSXRlbXNDb3VudCA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIGNpIHNvbm8gZGVsbGUgY29sb25uZSBwaW5uYXRlIGUgdmlzaWJpbGkuIFNlcnZlIHBlciBwb3RlciBzZXR0YXJlIHR1dHRlIGxlIGNvbG9ubmUgcHJpbWEgY2hlIGFycml2aW5vIGRhdGkgYSBwaW5uZWQqL1xyXG4gICAgcHVibGljIEhhc1Bpbm5lZENvbHVtbnM6IGJvb2xlYW5cclxuICAgIC8qKiBMYXJnaGV6emEgY2FsY29sYXRhIGRlbCBjb250YWluZXIgZGVsbGUgY29sb25uZSBwaW5uYXRlICovXHJcbiAgICBwdWJsaWMgUGlubmVkQ29udGFpbmVyV2lkdGg6IG51bWJlcjtcclxuICAgIC8qKiBJbmRpY2Egc2Ugbm9ub3N0YW50ZSBzaWFtbyBpbiBtb2RhbGl0w6AgYXJyYXkgc29ubyBzdGF0aSBpbmRpdmlkdWF0aSBkZWkgZ3J1cHBpLiBJbiB0YWwgY2FzbyBlcy10YWJsZSBzaSBjb21wb3J0YSBkYSBwc2V1ZG8gYmFja2VuZCBlZCBlZmZldHR1YSBsZSBhZ2dyZWdhemlvbmkgZSByYWdncnVwcGFtZW50aSBjb21wbGV0YW1lbnRlIGxhdG8gY2xpZW50ICovXHJcbiAgICBwdWJsaWMgQXJyYXlHcm91cGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBjaGUgbCdlcy10YWJsZSDDqCBiYXNhdGEgc3VsbGUgZGlyZXR0aXZlIChudW92YSBtb2RhbGl0w6ApICovXHJcbiAgICBwdWJsaWMgRGlyZWN0aXZlc0Jhc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogSW5kaWNhIGxvIHN0YXRvIGRpIHNlbGV6aW9uZSBwZXIgc2luZ29sYSBjZWxsYSAqL1xyXG4gICAgcHVibGljIHNlbGVjdGlvblN0YXR1czogeyBbaW5kZXg6IG51bWJlcl06IHsgW2luZGV4OiBudW1iZXJdOiBJdGVtUHJvcEVkaXRhYmxlUmVmZXJlbmNlIH0gfSA9IHt9O1xyXG4gICAgLyoqIENoaWFtYXRhIHJlYWxlIGFsIHdyaXRlVmFsdWUgZG9wbyBpbCBwYXNzYWdnaW8gZGkgKipTZWFyY2hUaHJvdHRsZSoqIG1pbGxpc2Vjb25kaS4gU29sbyBtb2RhbGl0w6AgRXNUYWJsZUhhbmRsZWRTZWFyY2ggKi9cclxuICAgIHByaXZhdGUgY2FsbFRpbWVvdXQgOiBhbnkgPSBudWxsO1xyXG4gICAgLyoqIENhY2hlIGRlaSB0aCBwaXV0dG9zdG8gY2hlIHJpY2FsY29sYXJzZWxpIGRpIGNvbnRpbnVvICovXHJcbiAgICBwcml2YXRlIHRoc0NhY2hlOiAgeyBbaW5kZXg6IHN0cmluZ106IEVzVGhEaXJlY3RpdmUgfSA9IHt9O1xyXG4gICAgLyoqIEluZGljYSBxdWFuZG8gbGEgY2FjaGUgZGVpIHRoIMOoIHN0YXRhIGZpbGxhdGEgYWxtZW5vIGxhIHByaW1hIHZvbHRhICovXHJcbiAgICBwcml2YXRlIHRoc0NhY2hlU2V0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogXHJcbiAgICAgKiBGbGFnIGNoZSwgc2UgKip0cnVlKiosIHBlciB1biBnaXJvIGRpIGJpbmRpbmcgbWFudGllbmUgbGEgdmlzaWJpbGl0w6AgaW1wb3N0YXRhIGxvY2FsbWVudGUsIHBpdXR0b3N0byBjaGUgYWxsaW5lYXJlIGFsbGEgVmlldyBiaW5kYXRhLiBcclxuICAgICAqIFVzYXRhIHBlciBtb2RpZmljYXJlIGluIG1hbmllcmEgcHJvZ3JhbW1hdGljYSBsYSB2aXNpYmlsaXTDoCBkZWxsZSBjb2xvbm5lIGRhbCBtZXRvZG8gKipzZXRIZWFkZXJWaXNpYmlsaXR5KiosIFxyXG4gICAgICogXHJcbiAgICAgKiBEaXNjbGFpbWVyOiAqKk5PTiBNT0RJRklDQVJFKipcclxuICAgICAqKi9cclxuICAgIHB1YmxpYyB1c2VMb2NhbFZpc2liaWxpdHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBPcHppb25pIGRpIHBhZ2luYXppb25lICovXHJcbiAgICBwdWJsaWMgUGFnZXJPcHRpb25zOiBQYWdlckluZm9zID0gbmV3IFBhZ2VySW5mb3MoKVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgLy8gY2xpY2sgZGVzdHJvIHN1IHVuYSByaWdhIGNvbiBzZWxlemlvbmUgYXR0aXZhOiBUaXJvIGZ1b3JpIGlsIGNvbnRleHQgbWVudSBlIHNlbGV6aW9uZSBsJ2VsZW1lbnRvIGNvcnJlbnRlXHJcbiAgICAgICAgdGhpcy5jdHhNZW51U3Vic2NyaXB0aW9uID0gKHRoaXMuQ29udGV4dE1lbnUgfHwgdGhpcy50YWJsZUVtcHR5TWVudSkub3Blbi5zdWJzY3JpYmUodCA9PiB7XHJcbiAgICAgICAgICAgIC8vIEdydXBwaSB2YSBiZW5lLCBvZ2dldHRpIHB1cmUsIG1hIHNlcGFyYXRvcmkgZnJhIGdydXBwaSBwcm9wcmlvIG5vLi4uXHJcbiAgICAgICAgICAgIGlmICh0Lml0ZW0uX3NlcCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgbGV0IHNob3VsZEVtaXQgPSAhdC5pdGVtLl9zZWxlY3RlZDtcclxuXHJcbiAgICAgICAgICAgIHQuaXRlbS5fc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG4gICAgICAgICAgICB2YXIgaXRlbVNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uX0guaGFuZGxlSXRlbXNTZWxlY3Rpb24oW3QuaXRlbV0pO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzaG91bGRFbWl0KVxyXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQuZW1pdChpdGVtU2VsZWN0aW9uKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICAvLyBTZSB1dGlsaXp6byBsYSBuZXcgc3BpY3kgbW9kZSBkZWR1Y28gdHV0dGkgaSBwYXJhbWV0cmkgZGkgbGF2b3JvIHBvc3NpYmlsaSBhbCBjYXJpY2FtZW50byBkZWxsYSB0YWJlbGxhXHJcbiAgICAgICAgLy8gVmVuZ29ubyBzb3ZyYXNjcml0dGUgc29sbyBsZSBwcm9wcmlldMOgIG5vbiBpbXBvc3RhdGUgZGFsbCd1dGVudGVcclxuICAgICAgICBsZXQgdGRzRCA9IHRoaXMuRXNUZHNEaXJlY3RpdmUubGVuZ3RoID09IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGRzRGlyZWN0aXZlPy5sZW5ndGggPiAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Rkc0RpcmVjdGl2ZSA6IHRoaXMuRXNUZHNEaXJlY3RpdmUgOiB0aGlzLkVzVGRzRGlyZWN0aXZlO1xyXG4gICAgICAgIGxldCB0aHNEID0gdGhpcy5Fc1Roc0RpcmVjdGl2ZS5sZW5ndGggPT0gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUaHNEaXJlY3RpdmU/Lmxlbmd0aCA+IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGhzRGlyZWN0aXZlIDogdGhpcy5Fc1Roc0RpcmVjdGl2ZSA6IHRoaXMuRXNUaHNEaXJlY3RpdmU7XHJcbiAgICAgICAgbGV0IHVzZXNUaHNBbmRUZHNEaXJlY3RpdmVzID0gdGRzRCAmJiB0ZHNELmxlbmd0aCA+IDAgJiYgdGhzRCAmJiB0aHNELmxlbmd0aCA+IDA7XHJcbiAgICAgICAgbGV0IGhhc05vQ29udGVudFByb2plY3Rpb24gPSAhdGhpcy5ib2R5UmVmICYmICF0aGlzLmhlYWRlclJlZiAmJiAhdGhpcy5oZWFkZXJHcm91cFJlZiAmJiAhdGhpcy5zZWNvbmRhcnlIZWFkZXJHcm91cFJlZjtcclxuXHJcbiAgICAgICAgaWYgKHVzZXNUaHNBbmRUZHNEaXJlY3RpdmVzIHx8IGhhc05vQ29udGVudFByb2plY3Rpb24pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuVXNlQ3VzdG9tQ2VsbHMgPT0gbnVsbCkgdGhpcy5Vc2VDdXN0b21DZWxscyA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkhpZGRlbkNvbHVtbnMgPT0gbnVsbCAmJiB0aGlzLlVzZUN1c3RvbUNlbGxzKSB0aGlzLkhpZGRlbkNvbHVtbnMgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5Db2x1bW5zT3JkZXJpbmcgPT0gbnVsbCAmJiB0aGlzLlVzZUN1c3RvbUNlbGxzKSB0aGlzLkNvbHVtbnNPcmRlcmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLk9yZGVyQnlDb2x1bW4gPT0gbnVsbCAmJiB0aGlzLlVzZUN1c3RvbUNlbGxzKSB0aGlzLk9yZGVyQnlDb2x1bW4gPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5TZWxlY3RBbGwgPT0gbnVsbCAmJiB0aGlzLlNlbGVjdGlvbikgdGhpcy5TZWxlY3RBbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5TaGlmdENsaWNrID09IG51bGwgJiYgdGhpcy5TZWxlY3Rpb24pIHRoaXMuU2hpZnRDbGljayA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuRGlyZWN0aXZlc0Jhc2VkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUGVyIHBvdGVyIGNhbWJpYXJlIGlsIGxheW91dCBpbiBiYXNlIGFsIGxpdmVsbG8gZ2VyYXJjaGljbyBpbCBjb21wb25lbnRlIGRldmEgYXZlcmUgaWwgcGllbm8gY29udHJvbGxvIGRpIG9nbmkgY2VsbGEsXHJcbiAgICAgICAgLy9jaGUgY29uIHNvbG8gbGEgcHJvaWV6aW9uZSAoc2VuemEgY2VsbGUgY3Vzb3RtKSBub24gw6ggZGlzcG9uaWJpbGVcclxuICAgICAgICBpZiAodGhpcy5IaWVyYXJjaHkgJiYgIXRoaXMuVXNlQ3VzdG9tQ2VsbHMpXHJcbiAgICAgICAgICAgIHRocm93IFwiRXMtdGFibGUgZXJyb3I6IFBlciBwb3RlciB1dGlsaXp6YXJlIGwnZXMtdGFibGUgY29uIFtIaWVyYXJjaHldPVxcXCJ0cnVlXFxcIiDDqCByaWNoaWVzdG8gYW5jaGUgW1VzZUN1c3RvbUNlbGxzXT1cXFwidHJ1ZVxcXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvcHlTdWJzY3JpcHRpb24pXHJcbiAgICAgICAgICAgIHRoaXMuY29weVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wYXN0ZVN1YnNjcmlwdGlvbilcclxuICAgICAgICAgICAgdGhpcy5wYXN0ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdHhNZW51U3Vic2NyaXB0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLmN0eE1lbnVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29weVBhc3RlRGV0ZWN0b3IuQWN0aXZlRXN0UmVmZXJlbmNlID09IHRoaXMpXHJcbiAgICAgICAgICAgIHRoaXMuY29weVBhc3RlRGV0ZWN0b3IuQWN0aXZlRXN0UmVmZXJlbmNlID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBsZXQgbmV3U2VhcmNoVmlldyA9IGNoYW5nZXNbJ1NlYXJjaFZpZXcnXTtcclxuICAgICAgICBpZiAobmV3U2VhcmNoVmlldyAmJiB0aGlzLlNlYXJjaFZpZXcpXHJcbiAgICAgICAgICAgIHRoaXMuYXJyYXlQdWxzYW50aSA9IHRoaXMudXRpbGl0aWVzX0guZ2V0UGFnZXNBcnJheSg2LCB0aGlzLlNlYXJjaFZpZXcucGFnZSwgdGhpcy5TZWFyY2hWaWV3LnBhZ2VzIHx8IDEsIHRoaXMuU2VhcmNoVmlldy5vYmplY3Rjb3VudCwgdGhpcy5TZWFyY2hWaWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm4pOiB2b2lkIHsgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjsgfVxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbik6IHZvaWQgeyB9XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIGNoYW5nZWQoY2xlYXJJdGVtczogYm9vbGVhbiA9IGZhbHNlKSB7IFxyXG4gICAgICAgIGlmKGNsZWFySXRlbXMgJiYgdGhpcy52aWV3TW9kZSlcclxuICAgICAgICAgICAgKDxBcHBTZWFyY2g8YW55Pj50aGlzLlZpZXcpLml0ZW1zID0gW107XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuVmlldyk7IFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgYXN5bmMgd3JpdGVWYWx1ZShvYmo6IGFueSwgdGhyb3R0bGU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5WaWV3ID0gb2JqID8gb2JqIDogbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuRXNUYWJsZUhhbmRsZWRTZWFyY2ggJiYgdGhyb3R0bGUpIHtcclxuICAgICAgICAgICAgaWYodGhpcy5jYWxsVGltZW91dClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNhbGxUaW1lb3V0KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy53cml0ZVZhbHVlKG9iaiwgZmFsc2UpOyB9LCB0aGlzLlNlYXJjaFRocm90dGxlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgIFxyXG4gICAgICAgIC8vIE1pIMOoIGFycml2YXRhIGwnQXBwU2VhcmNoIHF1aW5kaSBkaSBzaWN1cm8gbm9uIGhvIHVuYSByaWNlcmNhIGluIHByb2dyZXNzXHJcbiAgICAgICAgdGhpcy5yZXNlYXJjaEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLlZpZXcgJiYgIXRoaXMuU2VhcmNoVmlldykge1xyXG4gICAgICAgICAgICAvLyBTdSB2aWV3IG51bGxhIGV2aXRvIGRpIGZhcmUgcHJlc3NvY2jDqSBxdWFsc2lhc2kgY29zYS4gU2UgYXJyaXZhIHVuIG51bGwgZGV2byBhbmNoZSBhc3NpY3VyYXJtaSBkaSBub24gbW9zdHJhcmUgbnVsbGFcclxuICAgICAgICAgICAgdGhpcy5ib3VuZFNvdXJjZSA9IHRoaXMuVE1QQm91bmRTb3VyY2UgfHwgW107XHJcblxyXG4gICAgICAgICAgICAvLyBQZXIgZXNzZXJlIHNpY3VybyBjaGUgZG9wbyB1biBiaW5kIGRpIG9nZ2V0dGkgbGEgZXMtdGFibGUgYWdnaW9ybmkgbGEgZ3JhZmljYVxyXG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2UgcGVyIHNiYWdsaW8gbCdvZ2dldHRvIGNoZSBtaSBhcnJpdmEgbm9uIMOoIHRpcGl6emF0byAoaW5zdGFuY2VvZiBBcHBTZWFyY2ggcmVzdGl0dWlzY2UgZmFsc2UgYW5jaGUgc2Ugw6ggZGVsIHRpcG8gZ2l1c3RvKVxyXG4gICAgICAgIC8vIGxvIGNvcnJlZ2dvLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICBpZiAodGhpcy5WaWV3ICYmIHR5cGVvZiAodGhpcy5WaWV3IGFzIGFueSkuaXRlbXNwZXJwYWdlb3ZlcnJpZGUgIT0gJ3VuZGVmaW5lZCcgJiYgISh0aGlzLlZpZXcgaW5zdGFuY2VvZiBBcHBTZWFyY2gpKVxyXG4gICAgICAgICAgICAodGhpcy5WaWV3IGFzIGFueSkuX19wcm90b19fID0gbmV3IEFwcFNlYXJjaCgpO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuU2VhcmNoVmlldyAmJiB0eXBlb2YgKHRoaXMuU2VhcmNoVmlldyBhcyBhbnkpLml0ZW1zcGVycGFnZW92ZXJyaWRlICE9ICd1bmRlZmluZWQnICYmICEodGhpcy5TZWFyY2hWaWV3IGluc3RhbmNlb2YgQXBwU2VhcmNoKSlcclxuICAgICAgICAgICAgKHRoaXMuU2VhcmNoVmlldyBhcyBhbnkpLl9fcHJvdG9fXyA9IG5ldyBBcHBTZWFyY2goKTtcclxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgICAgIGlmICh0aGlzLlZpZXcgJiYgdGhpcy5WaWV3IGluc3RhbmNlb2YgQXBwU2VhcmNoKSB7XHJcbiAgICAgICAgICAgIC8vIFNlIGNhbWJpYSBsJ29nZ2V0dG8gaW50ZXJvIHNpZ25pZmljYSBjaGUgaG8gcmltYW5kYXRvIGxhIHJpY2VyY2FcclxuICAgICAgICAgICAgdGhpcy5zZXRNb2RlKCd2aWV3Jyk7XHJcblxyXG4gICAgICAgICAgICBsZXQgZmlyc3RJdGVtR3JvdXBPck5vR3JvdXBpbmcgPSAodGhpcy5WaWV3LnJlcXVlc3RlZGdyb3Vwcz8ubGVuZ3RoIHx8IDApID09IDA7XHJcblxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gU2UgdmVuZ28gZGEgdW5hIHJpY2VyY2EgaW50ZXJuYSBtYW50ZW5nbyBsbyBzdGF0byBkaSBzZWxlemlvbmUgcHJlY2VkZW50ZSAocXVpbmRpIHN1IGNhbWJpbyBwYWdpbmEsIGNhbWJpbyBpcHAsIGVjYy4uLilcclxuICAgICAgICAgICAgLy8gc2UgaW52ZWNlIGwndXRlbnRlIGhhIGZhdHRvIHVuYSByaWNlcmNhIGx1aSAocXVpbmRpIGNhbWJpYW5kbyBmaWx0cmkpLCBzZWNjbyBsZSBpbmZvIGRpIHNlbGV6aW9uZVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuVmlldy5zZWxlY3Rpb24gfHwgKCF0aGlzLlZpZXcuaW50ZXJuYWxzZWFyY2hyZXF1ZXN0ICYmIGZpcnN0SXRlbUdyb3VwT3JOb0dyb3VwaW5nKSB8fCAhdGhpcy5Vc2VTZWxlY3Rpb25DYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5jbGVhclNlbGVjdGlvbkNhY2hlcygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGVjdGlvbiA9IG5ldyBJdGVtc1NlbGVjdGlvbihbXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHRoaXMuVmlldy5zZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLlZpZXcuaW50ZXJuYWxzZWFyY2hyZXF1ZXN0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAvLyBSZWN1cGVybyBQcmVmZXJlbmNlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNhdmVQcmVmZXJlbmNlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5nQ29udHJvbC5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJOb24gcG9zc28gdXRpbGl6emFyZSBsZSBwcmVmZXJlbmNlIHNlbnphIGF2ZXJlIHVuICduYW1lJyBwZXIgcXVlc3RhIHRhYmVsbGFcIik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5wcmVmU2VydmljZSlcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm9uIHBvc3NvIHV0aWxpenphcmUgbGUgcHJlZmVyZW5jZSBzZW56YSBjaGUgaWwgcGFjY2hldHRvIEBlc2ZhZW56YS9wcmVmZXJlbmNlcyBzaWEgaW5zdGFsbGF0b1wiKTtcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwcmVmcyA9IGF3YWl0IHRoaXMucHJlZlNlcnZpY2UuZ2V0SXRlbTx7IGNvbHVtbnM6IHN0cmluZ1tdLCBjb2x1bW5fb3JkZXJpbmc6IHN0cmluZ1tdLCBvcmRlcnM6IEFwcE9yZGVyaW5nW10gfT4oPHN0cmluZz50aGlzLm5nQ29udHJvbC5uYW1lKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNpIGxhIGdlbnRlIHNpIG1ldHRhIGEgc3BhbW1hcmUgcmVmcmVzaCBjb24gbmdpZiBzdHJhbmkgc3VsbCdlc3RhYmxlIGNyZWFuZG9sYSBlIGRpc3RydWdnZW5kb2xhIE4gdm9sdGUgYWwgc2Vjb25kbyBuZWwgdGVtcG8gY2hlIGNpIG1ldHRlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0aXJhcmUgc3UgbGUgcHJlZmVyZW5jZSBkYSBxdWkgc29wcmEgbGEgVmlldyBwb3RyZWJiZSBlc3NlcmUgY2FtYmlhdGFcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5WaWV3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2xzID0gcHJlZnM/LmNvbHVtbnMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cGRhdGVkUHJlZnMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwb3NpdG9yeTogc3RyaW5nW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2U6IHN0cmluZ1tdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucy5tYXAodCA9PiB0LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IGNvbHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gY29scztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IHRoaXMuVmlldy5jb2x1bW5zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBtb2RhbGl0w6AgcmVwb3J0IGRldm8gY29udHJvbGxhcmUgY2hlIHR1dHRlIGxlIGNvbG9ubmUgc2FsdmF0ZSBmYWNjaWFubyBwYXJ0ZSBkZWxsYSB2aXN0YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBtb2RhbGl0w6Agbm9ybWFsZSBpbnZlY2Ugc2UgbGUgcHJlZmVyZW56ZSBmYW5ubyByaWZlcmltZW50byBhIGRlbGxlIGNvbG9ubmUgY2hlIGlvIG5vbiBobyBuZWxsYSBWaWV3IGF0dHVhbGUgc2lnbmlmaWNhIGNoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG8gZmFjZW5kbyByaWZlcmltZW50byBhIHVuYSB2ZXJzaW9uZSB2ZWNjaGlhIGRlbGwnZXMtdGFibGUsIHF1aW5kaSBub24gZmFjY2lvIG9wZXJhemlvbmlcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5LmluZGV4T2Yoc291cmNlW2ldKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRQcmVmcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZSBtaSBiYXNvIHN1IGRpcmV0dGl2ZSBtYSBuZWxsZSBwcmVmZXJlbmNlIMOoIHByZXNlbnRlIGFuY2hlIHNvbG8gdW5hIGNvbG9ubmEgbm9uIHByZXNlbnRlIG5lbGxlIGRpcmV0dGl2ZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdnVvbCBkaXJlIGNoZSBsJ2VzLXRhYmxlIMOoIGNhbWJpYXRhIHF1aW5kaSBub24gaW1wb3N0byBwcmVmZXJlbmNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5Fc1Roc0RpcmVjdGl2ZT8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXBvc2l0b3J5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGhzQ2FjaGVTZXQgJiYgIXRoaXMudGhzQ2FjaGVbcmVwb3NpdG9yeVtpXV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByZWZzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRQcmVmcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WaWV3LmNvbHVtbnMgPSBwcmVmcz8uY29sdW1ucyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5jb2x1bW5fb3JkZXJpbmcgPSBwcmVmcz8uY29sdW1uX29yZGVyaW5nIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2UgbGUgcHJlZiBzb25vIG51bGxlIG5vbiBzb3ZyYXNjcml2byBnbGkgb3JkaW5pIGRhdG8gY2hlIHBvdHJlYmJlIHNlcnZpcmUgbWV0dGVyZSBkZWdsaSBvcmRpbmFtZW50aSBkaSBkZWZhdWx0IGxhdG8gdHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZWZzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5vcmRlcnMgPSBwcmVmcz8ub3JkZXJzIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBMYSBwYWdpbmF6aW9uZSBkZXZvIGZhcmxhIHNvbGFtZW50ZSBxdWFuZG8gcmljaGllZG8gbyB1biBncnVwcG8gcHJpbmNpcGFsZSAoc2Ugc29ubyBpbiByb3cgZ3JvdXBpbmcpIG8gc2Ugbm9uIHJpY2hpZWRvIGdydXBwaSAoaW4gdHV0dGkgbGdpIGFsdHJpIGNhc2kpXHJcbiAgICAgICAgICAgIGlmIChmaXJzdEl0ZW1Hcm91cE9yTm9Hcm91cGluZylcclxuICAgICAgICAgICAgICAgIHRoaXMuYXJyYXlQdWxzYW50aSA9IHRoaXMudXRpbGl0aWVzX0guZ2V0UGFnZXNBcnJheSg2LCB0aGlzLlZpZXcucGFnZSwgdGhpcy5WaWV3LnBhZ2VzIHx8IDEsIHRoaXMuVmlldy5pdGVtcy5sZW5ndGgsIHRoaXMuVmlldy5pdGVtc3BlcnBhZ2VvdmVycmlkZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuVmlldyAmJiAodGhpcy5WaWV3Lmxlbmd0aCAhPSBudWxsICYmIHRoaXMuVmlldy5sZW5ndGggIT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ2FycmF5Jyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuVXNlU2VsZWN0aW9uQ2FjaGUgfHwgIXRoaXMuYXJyYXltb2RlU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uQ2FjaGVzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFycmF5bW9kZVNlbGVjdGlvbiA9IG5ldyBJdGVtc1NlbGVjdGlvbihbXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHRoaXMuYXJyYXltb2RlU2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUmVjdXBlcm8gUHJlZmVyZW5jZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5TYXZlUHJlZmVyZW5jZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uZ0NvbnRyb2wubmFtZSlcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm9uIHBvc3NvIHV0aWxpenphcmUgbGUgcHJlZmVyZW5jZSBzZW56YSBhdmVyZSB1biAnbmFtZScgcGVyIHF1ZXN0YSB0YWJlbGxhXCIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMucHJlZlNlcnZpY2UpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vbiBwb3NzbyB1dGlsaXp6YXJlIGxlIHByZWZlcmVuY2Ugc2VuemEgY2hlIGlsIHBhY2NoZXR0byBAZXNmYWVuemEvcHJlZmVyZW5jZXMgc2lhIGluc3RhbGxhdG9cIik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJlZnMgPSBhd2FpdCB0aGlzLnByZWZTZXJ2aWNlLmdldEl0ZW08eyBjb2x1bW5zOiBzdHJpbmdbXSwgY29sdW1uX29yZGVyaW5nOiBzdHJpbmdbXSwgb3JkZXJzOiBBcHBPcmRlcmluZ1tdIH0+KDxzdHJpbmc+dGhpcy5uZ0NvbnRyb2wubmFtZSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbHMgPSBwcmVmcz8uY29sdW1ucyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZFByZWZzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVwb3NpdG9yeTogc3RyaW5nW107XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZTogc3RyaW5nW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlZpZXcucmVwb3J0X2NvbHVtbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucy5tYXAodCA9PiB0LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gY29scztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBjb2xzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSB0aGlzLlZpZXcuY29sdW1ucztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCByZXBvcnQgYWdnaW9ybm8gbGUgcHJlZmVyZW56ZSBzb2xvIHNlIGMnw6ggYWxtZW5vIHVuYSBjb2xvbm5hLCBhbHRyaW1lbnRpIHZ1b2wgZGlyZSBjaGUgc2kgcGFydGUgZGEgdnVvdGlcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb24gdHV0dGUgbGUgY29sb25uZSBkaXNwb25pYmlsaVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucyAmJiAoc291cmNlPy5sZW5ndGggfHwgMCkgPT0gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByZWZzID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCBub3JtYWxlIGludmVjZSBzZSBsZSBwcmVmZXJlbnplIGZhbm5vIHJpZmVyaW1lbnRvIGEgZGVsbGUgY29sb25uZSBjaGUgaW8gbm9uIGhvIG5lbGxhIFZpZXcgYXR0dWFsZSBzaWduaWZpY2EgY2hlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvIGZhY2VuZG8gcmlmZXJpbWVudG8gYSB1bmEgdmVyc2lvbmUgdmVjY2hpYSBkZWxsJ2VzLXRhYmxlLCBxdWluZGkgbm9uIGZvY2NpbyBvcGVyYXppb25pXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkuaW5kZXhPZihzb3VyY2VbaV0pID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUHJlZnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlZFByZWZzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5jb2x1bW5zID0gcHJlZnM/LmNvbHVtbnMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5jb2x1bW5fb3JkZXJpbmcgPSBwcmVmcz8uY29sdW1uX29yZGVyaW5nIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2UgbGUgcHJlZiBzb25vIG51bGxlIG5vbiBzb3ZyYXNjcml2byBnbGkgb3JkaW5pIGRhdG8gY2hlIHBvdHJlYmJlIHNlcnZpcmUgbWV0dGVyZSBkZWdsaSBvcmRpbmFtZW50aSBkaSBkZWZhdWx0IGxhdG8gdHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlZnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZpZXcub3JkZXJzID0gcHJlZnM/Lm9yZGVycyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNlYXJjaFZpZXcpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmFycmF5UHVsc2FudGkgPSB0aGlzLnV0aWxpdGllc19ILmdldFBhZ2VzQXJyYXkoNiwgdGhpcy5TZWFyY2hWaWV3LnBhZ2UsIHRoaXMuU2VhcmNoVmlldy5wYWdlcyB8fCAxLCB0aGlzLlNlYXJjaFZpZXcuaXRlbXMubGVuZ3RoLCB0aGlzLlNlYXJjaFZpZXcuaXRlbXNwZXJwYWdlb3ZlcnJpZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5maW5hbGl6ZUNvbnRleHQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5wb3N0Qm91bmRTb3VyY2VDYWxjdWxhdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5WaWV3ICYmICF0aGlzLlZpZXcuc2VsZnNlYXJjaCAmJiB0aGlzLkVzVGFibGVIYW5kbGVkU2VhcmNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuVmlldy5zZWxmc2VhcmNoID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLm9uU2VhcmNoUmVxdWVzdC5lbWl0KGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLlZpZXcgJiYgdGhpcy5WaWV3LnNlbGZzZWFyY2ggJiYgdGhpcy5Fc1RhYmxlSGFuZGxlZFNlYXJjaCkge1xyXG4gICAgICAgICAgICB0aGlzLlZpZXcuc2VsZnNlYXJjaCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEZ1bnppb25lIGRpIHRyYWNrYnkgcGVyIGlsIGJvZHkgY2hlIGRvdnJlYmJlIGV2aXRhcmUgaWwgOTAlIGRlbGxlIGNoYW5nZSBkZXRlY3Rpb24gKi9cclxuICAgIHB1YmxpYyBib2R5VHJhY2tCeSA9IChfOiBudW1iZXIsIGl0ZW06IGFueSkgPT4gaXRlbS5faGFzaDtcclxuXHJcbiAgICAvKiogRnVuemlvbmUgZGkgdHJhY2tieSBnZW5lcmljYSBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgY2hlIGhhbm5vIGlsIGNhbXBvIGlkICovXHJcbiAgICBwdWJsaWMgaWRUcmFja0J5ID0gKF86IG51bWJlciwgaXRlbTogYW55KSA9PiBpdGVtLmlkO1xyXG5cclxuICAgICAvKiogRnVuemlvbmUgZGkgdHJhY2tieSBnZW5lcmljYSBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgY2hlIGhhbm5vIGlsIGNhbXBvIFByb3BlcnR5TmFtZSAqL1xyXG4gICAgcHVibGljIFByb3BlcnR5TmFtZVRyYWNrQnkgPSAoXzogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW0uUHJvcGVydHlOYW1lO1xyXG5cclxuICAgIC8qKiBGdW56aW9uZSBkaSB0cmFja2J5IGdlbmVyaWNhIHBlciB0dXR0aSBnbGkgb2dnZXR0aSBjaGUgaGFubm8gaWwgY2FtcG8gSUQgKi9cclxuICAgIHB1YmxpYyBJRFRyYWNrQnkgPSAoXzogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW0uSUQ7XHJcblxyXG4gICAgLyoqIEZ1bnppb25lIGRpIHRyYWNrYnkgZ2VuZXJpY2EgcGVyIHR1dHRpIGdsaSBvZ2dldHRpIGNoZSBoYW5ubyBpbCBjYW1wbyBJRCAqL1xyXG4gICAgcHVibGljIHZhbFRyYWNrQnkgPSAoXzogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW0udmFsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VjY2Vzc2l2YW1lbnRlIGFsIGJpbmQgZGVsIG51b3ZvIGlucHV0IHF1ZXN0YSBmdW56aW9uZSBzaSBvY2N1cGEgZGkgZmluYWxpenphcmUgdHV0dGkgaSBwYXJhbWV0cmkgZGkgZnVuemlvbmFtZW50byBkZWxsJ2VzLXRhYmxlIFxyXG4gICAgICogaW4gYmFzZSBhIElucHV0IC0gTW9kZWxsbywgZSBxdWFsc2lhc2kgYWx0cmEgY29zYSBwb3NzYSBzZXJ2aXJlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmluYWxpemVDb250ZXh0KCkge1xyXG4gICAgICAgIGxldCB2aWV3Q2FzdGVkID0gdGhpcy5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+O1xyXG5cclxuICAgICAgICBsZXQgaGFzUm93R3JvdXBzID0gdmlld0Nhc3RlZCAmJiAodmlld0Nhc3RlZC5ncm91cGluZ3MgJiYgdmlld0Nhc3RlZC5ncm91cGluZ3MuZmlsdGVyKHQgPT4gIXQuYWdncmVnYXRpb24pLmxlbmd0aCA+IDApIHx8ICh0aGlzLmFycmF5TW9kZSAmJiB0aGlzLkVzVGhzRGlyZWN0aXZlLnNvbWUodCA9PiB0LnRoR3JvdXApKTtcclxuXHJcbiAgICAgICAgLy8gU2UgaG8gZGVpIGdydXBwaSBpbiBtb2RhbGl0w6AgYXJyYXkgZGV2byBzaXN0ZW1hcmUgdW4gcG8nIGRpIHZhcmlhYmlsaSBjaGUgZGl2ZW50YW5vIGluc2Vuc2F0ZVxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSAmJiBoYXNSb3dHcm91cHMpXHJcbiAgICAgICAgICAgIHRoaXMuVXNlQXJyYXlNb2RlUGFnaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIFJpZW1waW1lbnRvIGRlbGxhIFRNUEJvdW5kU291cmNlIGNvbiBnbGkgb2dnZXR0aSBjaGUgdmVycmFubm8gcG9pIG1vc3RyYXRpIGFkIGludGVyZmFjY2lhXHJcbiAgICAgICAgdGhpcy5UTVBCb3VuZFNvdXJjZSA9IHRoaXMuaXRlbXNfSC5nZXRJdGVtc0J5TW9kZShmYWxzZSwgIXRoaXMuaW50ZXJuYWxXcml0ZUNhbGwpO1xyXG5cclxuICAgICAgICAvLyBTZSBobyB1bmEgZ2VyYXJjaGlhLCBhc3NlZ25vIGkgbGl2ZWxsaSBnZXJhcmNoaWNpIGFsbGEgVE1QQm91bmRTb3VyY2VcclxuICAgICAgICBpZiAodGhpcy5IaWVyYXJjaHkgJiYgIWhhc1Jvd0dyb3VwcylcclxuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlNb2RlX0guYXNzaWduSGllcmFyY2h5TGV2ZWxzKHRoaXMuVE1QQm91bmRTb3VyY2UpO1xyXG5cclxuICAgICAgICAvLyBMJ2hhc2hpbmcgZGVnbGkgb2dnZXR0aSBsbyBmYWNjaW8gYSBwcmVzY2luZGVyZVxyXG4gICAgICAgIHRoaXMudXRpbGl0aWVzX0guY2FsY3VsYXRlSGFzaCh0aGlzLlRNUEJvdW5kU291cmNlKTtcclxuXHJcbiAgICAgICAgLy8gQXNzZWdubyBhIHVuYSB2YXJpYWJpbGUgbWlhIGwnZXZlbnR1YWxlIG92ZXJyaWRlIHBlciBsYSBjbGFzc2UgZGVsbGEgcmlnYVxyXG4gICAgICAgIC8vIFNlIHBvaSBzb25vIGluIG1vZGFsaXTDoCBnZXJhcmNoaWNhIGluaWV0dG8gYW5jaGUgbGEgY2xhc3NlIHBlciBsYSBjb25maWd1cmF6aW9uZSBkZWwgbGl2ZWxsbyBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCh0aGlzLlRNUEJvdW5kU291cmNlICYmIHRoaXMuUm93Q2xhc3NBc3NpZ25lcikgfHwgdGhpcy5IaWVyYXJjaHkpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLlRNUEJvdW5kU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuVE1QQm91bmRTb3VyY2VbaV07XHJcbiAgICAgICAgICAgICAgICBpdGVtLl9yb3dDbGFzcyA9IHRoaXMuUm93Q2xhc3NBc3NpZ25lciA/IHRoaXMuUm93Q2xhc3NBc3NpZ25lcihpdGVtKSA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICBpdGVtLl9yb3dDbGFzcyArPSB0aGlzLkhpZXJhcmNoeSA/IFwiIGVzdC1yb3ctbHZsLVwiICsgaXRlbS5fbGV2ZWwgOiBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZW5lcmEgbGUgaW5mb3JtemlvbmkgZGkgcGFnaW5hemlvbmUgcGVyIGxhIHZpc3RhIGdsb2JhbGUgZGVsbCdlcy10YWJsZSAqL1xyXG4gICAgcHJpdmF0ZSBzZXR1cFBhZ2luZ0luZm9ybWF0aW9ucygpIHtcclxuXHJcbiAgICAgICAgLy8gRGVmYXVsdCBjaGUgdmFsZ29ubyBkaSBiYXNlLCBwb2kgZXZlbnR1YWxtZW50ZSBtb2RkYXRpIGRhbGxlIGZ1bnppb25pIHNvdHRvXHJcbiAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50ID0gIXRoaXMuSGlkZVBhZ2luZ0NvdW50O1xyXG4gICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gIXRoaXMuSGlkZVBhZ2luZ0J1dHRvbnM7XHJcbiAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd1BhZ2luZyA9ICF0aGlzLkhpZGVQYWdpbmdcclxuICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5Vc2VzVmlldyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSAmJiB0aGlzLlVzZUFycmF5TW9kZVBhZ2luZyAmJiAhdGhpcy5TZWFyY2hWaWV3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlBhZ2VyQ291bnQgPSAoPGFueVtdPnRoaXMuVmlldykubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnMgJiYgdGhpcy5WaWV3Lmxlbmd0aCA+IDEwO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5WaWV3ID0gdGhpcy5WaWV3O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5Vc2VzVmlldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93UGFnaW5nT3B0aW9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmFycmF5TW9kZSAmJiAoIXRoaXMuVXNlQXJyYXlNb2RlUGFnaW5nIHx8IHRoaXMuU2VhcmNoVmlldykpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuU2VhcmNoVmlldykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuVmlldyA9IHRoaXMuU2VhcmNoVmlld1xyXG4gICAgICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuUGFnZXJDb3VudCA9IHRoaXMuU2VhcmNoVmlldy5vYmplY3Rjb3VudCB8fCAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlBhZ2VyQ291bnQgPSAoPGFueVtdPnRoaXMuVmlldykubGVuZ3RoIHx8IDBcclxuXHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnMgJiYgKHRoaXMuVmlldy5sZW5ndGggPiAxMCB8fCAodGhpcy5TZWFyY2hWaWV3Py5vYmplY3Rjb3VudCB8fCAwKSA+IDEwKTtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50ID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50IHx8ICh0aGlzLlZpZXcgJiYgdGhpcy5WaWV3Lmxlbmd0aCkgfHwgKHRoaXMuU2VhcmNoVmlldyAmJiB0aGlzLlNlYXJjaFZpZXcub2JqZWN0Y291bnQgJiYgdGhpcy5TZWFyY2hWaWV3Lm9iamVjdGNvdW50ICE9IC0xKTtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd1BhZ2luZyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dQYWdpbmcgJiYgKHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zIHx8IHRoaXMuUGFnZXJPcHRpb25zLlNob3dDb3VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dQYWdpbmdPcHRpb25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMudmlld01vZGUpIHtcclxuICAgICAgICAgICAgbGV0IHRtcFZpZXcgPSB0aGlzLk1haW5Hcm91cFZpZXcgfHwgdGhpcy5WaWV3O1xyXG4gICAgICAgICAgICBsZXQgY291bnQgPSB0bXBWaWV3Py5ncm91cGNvdW50IHx8IHRtcFZpZXc/Lm9iamVjdGNvdW50O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TZWFyY2hlcyA9IHRtcFZpZXc/Lmdyb3VwY291bnQgIT0gbnVsbCAmJiB0bXBWaWV3Py5ncm91cGNvdW50ICE9IHVuZGVmaW5lZCA/ICdncm91cHMnIDogJ2l0ZW1zJztcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuUGFnZXJDb3VudCA9IGNvdW50IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlZpZXcgPSB0bXBWaWV3O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQgPSB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQgfHwgKHRtcFZpZXcgJiYgY291bnQgJiYgY291bnQgIT0gLTEpO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zICYmICh0bXBWaWV3LnBhZ2luZ2F2YWlsYWJsZSB8fCB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQpO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93UGFnaW5nT3B0aW9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBsYW5jaWF0byBkb3BvIGNoZSBsYSBzb3JnZW50ZSBkYXRpIMOoIHN0YXRhIGNvcnJldHRhbWVudGUgYmluZGF0YSwgc2kgb2NjdXBhIGRpIHJpY2FsY29sYXJlIHR1dHRvIGNpw7IgY2hlIHNlcnZlXHJcbiAgICAgKiBhbGwnZXMtdGFibGUgcGVyIHJlbmRlcml6emFyZSBpIHZhbG9yaSBkYSBtb3N0cmFyZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBvc3RCb3VuZFNvdXJjZUNhbGN1bGF0aW9uKCkge1xyXG4gICAgICAgIC8vIFJlc2V0dG8gdHV0dG8gdHJhbm5lIFJvd1REcyBlIFJvd1RIcyBwZXIgZXZpdGFyZSBmbGlja2VyaW5nLiBSb3dURHMgZSBSb3dUSHMgc2FyYW5ubyBtb2RpZmljYXRlIGFsbCdpbnRlcm5vIGRlbCBwcm9zc2ltbyBjaWNsbyBkaSBDRFxyXG4gICAgICAgIHRoaXMuUm93Q29udGV4dHMgPSBbXTtcclxuICAgICAgICB0aGlzLk9yZGVyRGlyZWN0aXZlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbUlEID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFBvc3RCb3VuZFNvdXJjZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBQZXIgcG90ZXIgZGlzdGluZ3VlcmUgbGUgY2hpYW1hdGUgYSBxdWVzdG8gbWV0b2RvOiBEb3BvIGlsIHNldFRpbWVvdXQgc2UgdXNvIGdsaSBFc1RkL0VzVGggdmVjY2hpLCBzZW56YSBpbCBzZXRUaW1lb3V0IHNlIHVzbyBsZSBudW92ZSBkaXJldHRpdmUgKi9cclxuICAgIHByaXZhdGUgaW50ZXJuYWxQb3N0Qm91bmRTb3VyY2UoKSB7XHJcbiAgICAgICAgbGV0IFZpZXcgPSB0aGlzLlZpZXc7XHJcblxyXG4gICAgICAgIGxldCB0ZHNEID0gdGhpcy5Fc1Rkc0RpcmVjdGl2ZS5sZW5ndGggPT0gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUZHNEaXJlY3RpdmU/Lmxlbmd0aCA+IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGRzRGlyZWN0aXZlIDogdGhpcy5Fc1Rkc0RpcmVjdGl2ZSA6IHRoaXMuRXNUZHNEaXJlY3RpdmU7XHJcbiAgICAgICAgbGV0IHRoc0QgPSB0aGlzLkVzVGhzRGlyZWN0aXZlLmxlbmd0aCA9PSAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Roc0RpcmVjdGl2ZT8ubGVuZ3RoID4gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUaHNEaXJlY3RpdmUgOiB0aGlzLkVzVGhzRGlyZWN0aXZlIDogdGhpcy5Fc1Roc0RpcmVjdGl2ZTtcclxuXHJcbiAgICAgICAgbGV0IHRocyA9IHRoc0QgJiYgdGhzRC5sZW5ndGggPiAwID8gdGhzRC50b0FycmF5KCkgOiBbXTtcclxuICAgICAgICBsZXQgdGRzID0gdGRzRCAmJiB0ZHNELmxlbmd0aCA+IDAgPyB0ZHNELnRvQXJyYXkoKSA6IFtdO1xyXG5cclxuICAgICAgICAvLyBTZSBub24gaG8gY29sb25uZSBkaW5hbWljaGUgbWEgc29ubyBpbiBtb2RhbGl0w6AgZGluYW1pY2EgKGxvIGNhcGlzY28gcGVyY2jDqSBjJ8OoIHVuYSB2aWV3IHBpZW5hIGRpIGdlbmVyaWNpdGVtKSBtZXR0byBpbCBkZWZhdWx0IGRlbGxlIGNvbG9ubmVcclxuICAgICAgICB0aGlzLmR5bmFtaWNNb2RlX0guZXZlbnR1YWxseVJldmlld0R5bmFtaWNDb2x1bW5zKCk7XHJcblxyXG4gICAgICAgIC8vIEdlc3Rpc2NlIGxhIHJpY2hpZXN0YSBwZXIgZ3J1cHBpIG8gcGVyIHNpbmdvbGkgb2dnZXR0aVxyXG4gICAgICAgIHRoaXMuYmluZERpc3BsYXlUb0xvYWRlZEl0ZW1zT3JHcm91cHMoVmlldyk7XHJcblxyXG4gICAgICAgIC8vIFF1ZXN0byBkZXYnZXNzZXJlIHBlciBmb3J6YSBsYW5jaWF0byBkb3BvICoqYmluZERpc3BsYXlUb0xvYWRlZEl0ZW1zT3JHcm91cHMqKiBkYXRvIGNoZSDDqCBsw6wgY2hlIGFsY3VuZSBjb3NlIHZlbmdvbm8gdmFsb3JpenphdGVcclxuICAgICAgICB0aGlzLnNldHVwUGFnaW5nSW5mb3JtYXRpb25zKCk7XHJcblxyXG4gICAgICAgIC8vIE1vbHRlIGNvc2Ugc29ubyBvdnZpYW1lbnRlIGRpc3BvbmliaWxpIHNvbG8gaW4gbW9kYWxpdMOgIFZpZXdcclxuICAgICAgICBpZiAoKHRoaXMudmlld01vZGUgfHwgdGhpcy5hcnJheU1vZGUpICYmIHRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHtcclxuICAgICAgICAgICAgbGV0IHZpZXcgPSB0aGlzLnZpZXdNb2RlID8gVmlldyBhcyBBcHBTZWFyY2g8YW55PiA6IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBpdGVtc0FuZEdyb3VwcyA9IHRoaXMudmlld01vZGUgPyBbLi4uKHZpZXcuaXRlbXMgfHwgW10pLCAuLi4odmlldy5ncm91cHMgfHwgW10pXSA6IFZpZXcgYXMgYW55W107XHJcbiAgICAgICAgICAgIGxldCBzaSA9IHRoaXMudmlld01vZGUgPyB2aWV3LnNlbGVjdGlvbiA6IHRoaXMuYXJyYXltb2RlU2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAvLyBOLkI6IFJpc3BldHRhcmUgbCdvcmRpbmUgZGkgcXVlc3RlIDMgbWFjcm9jYXRlZ29yaWUgw6ggVklUQUxFXHJcblxyXG4gICAgICAgICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICBTaXN0ZW1hemlvbmkgZGkgVEgsIFRELCBlIHZpc2liaWxpdMOgIHZhcmllICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cclxuICAgICAgICAgICAgLy8gU2UgaG8gZGVmaW5pemlvbmkgZGluYW1pY2hlLCBwcmltYSBkaSBxdWFsc2lhc2kgYWx0cmEgY29zYSBkZXZvIHRyYXNmb3JtYXJsZSBpbiB0aC90ZCBpbiBtb2RvIGNoZSBwb2kgaWwgY29kaWNlIHF1aSBzb3R0byBmYWNjaWEgbGUgc3VlIG1hZ2llXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbj8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKFwiR2VuZXJhdGluZyB0aHMgYW5kIHRkcyBmcm9tIER5bmFtaWMgZGVmaW5pdGlvblwiKTtcclxuICAgICAgICAgICAgICAgIGxldCByZXQgPSB0aGlzLmR5bmFtaWNNb2RlX0guZW1pdFRoc0FuZFRkc0Jhc2VkT25EeW5hbWljRGVmaW5pdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhzID0gcmV0LnRocztcclxuICAgICAgICAgICAgICAgIHRkcyA9IHJldC50ZHM7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEdlc3Rpb25lIGRlbGxlIHZpZXcgaW4gbW9kYWxpdMOgIHJlcG9ydCwgaSB0aCBlIGkgdGQgdmVuZ29ubyByaWdlbmVyYXRpIGRhbGxlIGNvbmZpZ3VyYXppb25pIGRlbGxhIHZpZXdcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmFycmF5TW9kZSAmJiB2aWV3LnJlcG9ydF9jb2x1bW5zKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJHZW5lcmF0aW5nIHRocyBhbmQgdGRzIGZyb20gcmVwb3J0IHJlc3VsdHNcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmV0ID0gdGhpcy5yZXBvcnRNb2RlX0guZ2VuZXJhdGVUaHNBbmRUZHNGcm9tVmlldyh2aWV3KTtcclxuICAgICAgICAgICAgICAgIHRocyA9IHJldC50aHM7XHJcbiAgICAgICAgICAgICAgICB0ZHMgPSByZXQudGRzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBFc3BhbmRvIGkgdGggZSBpIHRkIG11bHRpcGxpIGR1cGxpY2FuZG9saVxyXG4gICAgICAgICAgICBsZXQgcmV0ID0gdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmV4cGFuZE11bHRpVGhzQW5kVGRzKHRocywgdGRzLCBpdGVtc0FuZEdyb3Vwcyk7XHJcbiAgICAgICAgICAgIHRocyA9IHJldC5leHBUaHM7XHJcbiAgICAgICAgICAgIHRkcyA9IHJldC5leHBUZHM7XHJcblxyXG4gICAgICAgICAgICAvLyBHZW5lcm8gbGEgY2FjaGUgZGVpIHRoIGRhIHVzYXJlIGRhIHF1aSBpbiBwb2ksIGRvcG8gYXZlcmdsaSBsYXNjaWF0byBmYXJlIGxlIHN1ZSBjb3NlIGluIGNhc28gY2kgc2lhbm8gZGVpIG11bHRpIG8gZGVpIHJlcG9ydFxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aHNDYWNoZVt0aC50aF0gPSB0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnRoc0NhY2hlU2V0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFByZXBhc3NhZ2dpbyBwZXIgdGlyYXJlIGZ1b3JpIHR1dHRlIGxlIGluZm8gdXRpbGkgc3VnbGkgaGVhZGVycyBpbiBtb2RvIGRhIG5vbiByaWNhY29sYXJzZWxpIHNlbXByZSBkb3BvXHJcbiAgICAgICAgICAgIGxldCBoSSA9IHRoaXMuY29sdW1uTWV0YWRhdGFfSC5ldmFsdWF0ZUhlYWRlcnNHcm91cGluZ0luZm9zKHRocyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5hcnJheU1vZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBtb2RhbGl0w6AgYXJyYXkgbm9uIGhvIHVuIGJhY2tlbmQuLi5cclxuICAgICAgICAgICAgICAgIHRoaXMucm93R3JvdXBpbmdfSC5hcnJheU1vZGVSZXZpZXdHcm91cGluZ3MoaEkubGVhZnMpOyAgLy8gLi4uIGkgcmFnZ3J1cHBhbWVudGkgbGkgZGV2byBmYXJlIGxhdG8gY2xpZW50XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0gucmV2aWV3Q29sdW1uc0xpc3QoaEkubGVhZnMpOyAgICAgICAgICAgICAgICAgICAgICAvLyBBZ2dpb3JuYSBsYSBsaXN0YSBkZWxsZSBjb2xvbm5lIGRhIG1vc3RyYXJlIG5lbGxhIGRpYWxvZyBwZXIgb3JkaW5hbWVudG8gZWNjXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5hbGlnbkNvbHVtbnNJZkxvYWRlZFZpZXcodmlldyk7ICAgICAgICAgICAgICAgICAgIC8vIFNlIHN0byBjYXJpY2FuZG8gdW5hIFZpZXcgZGEgaG90cG90YXRvIChxdWluZGkgY29uIHNhdmVkc3RhdGUgPSB0cnVlKSByaWFsbGluZW8gbGEgdmlzaWJpbGl0w6AgZGVsbGUgY29sb25uZSBlIGlsIGxvcm8gb3JkaW5lLlxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0gubW92ZUZpeGVkQ29sdW1uc0F0VGhlQmVnaW5uaW5nKGhJLmxlYWZzLCB0ZHMpOyAgICAvLyBTcG9zdG8gdHV0dGUgbGUgY29zZSBmaXhlZCBhbGwnaW5pemlvIGluIG1vZG8gY2hlIGxhIGNyZWF6aW9uZSBkaSB0aCBlIHRkIHNpYSBwacO5IHNuZWxsYSAoVXRpbGl6emEgbGUgQ29sdW1uc0xpc3QsIHF1aW5kaSBkZXYnZXNzZXJlIHJpY2hpYW1hdGEgUElSTUEgZGkgcmV2aWV3Q29sdW1uc0xpc3QpXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5hbGlnbkhlYWRlcnNPcmRlcmluZyhoSS5sZWFmcywgdmlldyk7ICAgICAgICAgICAgIC8vIEFsbGluZW8gZ2xpIG9yZGluYW1lbnRpIGFnbGkgaGVhZGVyXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5yZWZyZXNoQ29sdW1uc1Zpc2liaWxpdHkoaEkubGVhZnMsIHRkcywgdmlldyk7ICAgIC8vIExhdm9ybyBzdWkgVEggZWQgZXZlbnR1YWxtZW50ZSBtb2RpZmljbyBsYSB2aXNpYmlsaXTDoCBhbmNoZSBkZWkgVEQuXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5ldmFsdWF0ZVBpbm5lZENvbHVtbnNXaWR0aCgpOyAgICAgICAgICAgICAgICAgICAgIC8vIFNlIHNvbm8gcHJlc2VudGkgY29sb25uZSBwaW5uYXRlIHZhbHV0YSBsYSBkaW1lbnNpb25lIGRlbCBjb250ZW5pdG9yZVxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0guZ2VuZXJhdGVEZWZhdWx0T3JkZXIoaEkubGVhZnMsIHZpZXcpOyAgICAgICAgICAgICAvLyBHZW5lcm8gbGUgZGlyZXR0aXZlIGRpIG9yZGluYW1lbnRvLCBjaGUgc2lhbm8gZGVmYXVsdCBvIGRlcml2YW50aSBkYWxsYSBBcHBTZWFyY2hcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmV2YWx1YXRlSGVhZGVyR3JvdXBzKGhJKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsdXRvIGkgcmFnZ3J1cHBhbWVudGkgZGVnbGkgaGVhZGVyIHNlIHByZXNlbnRpXHJcblxyXG4gICAgICAgICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICBHZW5lcmF6aW9uZSBiaW5kaW5nIHBlciByaWdoZSBlIGNvbG9ubmUgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblxyXG4gICAgICAgICAgICB0aGlzLmV2YWx1YXRlUm93VGhzKGhJLmxlYWZzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSYWNjb2xnbyBpIFRIXHJcbiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVSb3dUZHMoaEkubGVhZnMsIHRkcyk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhY2NvbGdvIGkgVEQgaW4gY29udGVzdGkgc2VwYXJhdGksIHVuIGNvbnRlc3RvIHBlciBvZ25pIGl0ZW0gbyBncnVwcG9cclxuXHJcbiAgICAgICAgICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgIFVsdGltaSBhZ2dpdXN0bWFlbnRpIGRlaSBiaW5kaW5nICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5hcHBseU9yZGVyaW5nKHZpZXcsIHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGxpY28gbCdvcmRpbmFtZW50byBzdWxsZSBjb2xvbm5lIChub24gQVNDIERFU0MsIG1hIFwicHJpbWEgcXVlc3RhIG8gcXVlbGxhIGNvbG9ubmFcIilcclxuICAgICAgICAgICAgdGhpcy5Nb3ZlVGVtcG9yYXJ5VmFyaWFibGVzVG9SZWFsT25lcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29sbGVnbyBUSCBlIFREIGFnZ2l1c3RhdGkgZmlubyBhZCBvcmEgYWxsZSB2YXJpYWJpbGkgZGkgQmluZGluZyBIVE1MXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guZXZhbHVhdGVTZWxlY3Rpb24oaXRlbXNBbmRHcm91cHMsIHNpKTsgICAgICAgICAgICAgICAgIC8vIFJpYWxsaW5lbyBsZSBpbmZvIGRpIHNlbGV6aW9uZSBkZWdsaSBlbGVtZW50aSBkZWxsYSBWaWV3XHJcblxyXG4gICAgICAgICAgICAvLyBWYWx1dGEgbG8gc3RhdG8gaW5pemlhbGUgZGkgc2VsZXppb25lIGEgcmFuZ2VcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5ldmFsdWF0ZVNpbmdsZUNlbGxTZWxlY3Rpb24oaXRlbXNBbmRHcm91cHMsIGhJLmxlYWZzLCB0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbik7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5SZXNlYXJjaE5lZWRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVzZWFyY2hOZWVkZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICgodGhpcy52aWV3TW9kZSB8fCB0aGlzLmFycmF5TW9kZSkgJiYgIXRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHtcclxuICAgICAgICAgICAgLy8gUmlhbGxpbmVvIGxlIGluZm8gZGkgc2VsZXppb25lIGRlZ2xpIGVsZW1lbnRpIGRlbGxhIFZpZXdcclxuICAgICAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy52aWV3TW9kZSA/IChWaWV3IGFzIEFwcFNlYXJjaDxhbnk+KS5pdGVtcyA6IFZpZXcgYXMgYW55W107XHJcbiAgICAgICAgICAgIGxldCBzaSA9IHRoaXMudmlld01vZGUgPyAoVmlldyBhcyBBcHBTZWFyY2g8YW55Pikuc2VsZWN0aW9uIDogdGhpcy5hcnJheW1vZGVTZWxlY3Rpb247XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guZXZhbHVhdGVTZWxlY3Rpb24oaXRlbXMsIHNpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFBlciBlc3NlcmUgc2ljdXJvIGNoZSBkb3BvIHVuIGJpbmQgZGkgb2dnZXR0aSBsYSBlcy10YWJsZSBhZ2dpb3JuaSBsYSBncmFmaWNhXHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgdGhpcy5GaXJzdEJpbmQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVmZmV0dHVhIGlsIGJpbmRpbmcgZGVnbGkgb2dnZXR0aSBwZXJ2ZW51dGkgZGEgcXVlc3RhIGNoaWFtYXRhIGNvbiBnbGkgb2dnZXR0aSBlZmZldHRpdmFtZW50ZSBkYSBncmFmaWNhcmVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IHZpZXcgVmlldyBkYSBjdWkgc29ubyBhcnJpdmF0aSBnbGkgb2dnZXR0aS4gUHXDsiBlc3NlcmUgbyB1biBhcnJheSBzZSBzb25vIGluICoqYXJyYXlNb2RlKiogbyB1bmEgQXBwU2VhcmNoPFQ+IHNlIHNvbm8gaW4gKip2aWV3TW9kZSoqXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYmluZERpc3BsYXlUb0xvYWRlZEl0ZW1zT3JHcm91cHModmlldzogYW55KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLlRNUEJvdW5kU291cmNlIHx8IHRoaXMuVE1QQm91bmRTb3VyY2UubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5CYXNlSXRlbXNDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSBbXTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXJyYXlNb2RlIHx8ICF0aGlzLlVzZUN1c3RvbUNlbGxzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLlRNUEJvdW5kU291cmNlO1xyXG4gICAgICAgICAgICB0aGlzLkJhc2VJdGVtc0NvdW50ID0gdmlldz8ub2JqZWN0Y291bnQgfHwgdmlldz8ubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBncm91cGluZ0tleXMgPSB2aWV3Py5ncm91cGluZ3M/LmZpbHRlcih0ID0+ICF0LmFnZ3JlZ2F0aW9uKT8ubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgaWYgKGdyb3VwaW5nS2V5cyA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLlRNUEJvdW5kU291cmNlO1xyXG4gICAgICAgICAgICB0aGlzLkJhc2VJdGVtc0NvdW50ID0gdmlldz8ub2JqZWN0Y291bnQgfHwgMDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yb3dHcm91cGluZ19ILmhhbmRsZU5ld0RhdGFPblJvd0dyb3VwaW5nKHZpZXcsIGdyb3VwaW5nS2V5cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIE1ldG9kbyByaWNoaWFtYXRvIHNvbG8gcXVhbmRvICoqVE1QUm93VERzKiogZSAqKlRNUFJvd1RIcyoqIHNvbm8gY29tcGxldGFtZW50ZSBnZW5lcmF0aSBlZCBhZ2dpdXN0YXRpLiBTZXJ2ZSBwZXIgY29sbGVnYXJsaSBhbGxlIHZhcmlhYmlsaSB1c2F0ZSBsYXRvIGJpbmRpbmcgSFRNTCAqL1xyXG4gICAgcHJpdmF0ZSBNb3ZlVGVtcG9yYXJ5VmFyaWFibGVzVG9SZWFsT25lcygpIHtcclxuXHJcbiAgICAgICAgdGhpcy5Sb3dURHMgPSB0aGlzLlRNUFJvd1REcztcclxuICAgICAgICB0aGlzLlJvd1RIcyA9IHRoaXMuVE1QUm93VEhzO1xyXG4gICAgICAgIHRoaXMuUm93VGhHcm91cHMgPSB0aGlzLlRNUFJvd1RoR3JvdXBzID8gdGhpcy5UTVBSb3dUaEdyb3Vwcy5yZXZlcnNlKCkgOiBudWxsO1xyXG4gICAgICAgIHRoaXMuRW1wdHlSb3dUZHMgPSB0aGlzLmlzRW1wdHkodGhpcy5Sb3dURHMpO1xyXG5cclxuICAgICAgICB0aGlzLkNvbHVtbnMuVmlzaWJpbGUgPSB0aGlzLlJvd1RIcy5maWx0ZXIodCA9PiB0LlZpc2libGUpLmxlbmd0aDtcclxuICAgICAgICB0aGlzLkNvbHVtbnMuVmlzaWJsZVVucGlubmVkID0gdGhpcy5Sb3dUSHMuZmlsdGVyKHQgPT4gdC5WaXNpYmxlICYmICF0LlBpbm5lZCkubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMuQ29sdW1ucy5HbG9iYWwgPSB0aGlzLkNvbHVtbnMuVmlzaWJsZVVucGlubmVkICsgKHRoaXMuSGFzUGlubmVkQ29sdW1ucyA/IDEgOiAwKSArICh0aGlzLlNlbGVjdGlvbiA/IDEgOiAwKSArICh0aGlzLlJlbW92YWwgPyAxIDogMCkgKyAodGhpcy5FeHBvcnQgfHwgdGhpcy5IaWRkZW5Db2x1bW5zIHx8IHRoaXMuQ29sdW1uc09yZGVyaW5nIHx8IHRoaXMuQ29ybmVyTWVudU9wdGlvbnMgPyAxIDogMClcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBNZXRvZG8gcGVyIGNhcGlyZSBzZSB1biBvZ2dldHRvIMOoIGNvbXBsZXRhbWVudGUgdnVvdG8gXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkYSBjb250cm9sbGFyZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbCdvZ2dldHRvIMOoIHZ1b3RvLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBpc0VtcHR5KG9iajogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yICh2YXIgXyBpbiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJtZXR0ZSBkaSBzZWxlemlvbmFyZSBvIGRlc2VsZXppb25hcmUgaW4gbWFuaWVyYSBhcmJpdHJhcmlhIGRlZ2xpIG9nZ2V0dGlcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gaXRlbXMgT2dnZXR0aSBkYSBzZWxlemlvbmFyZSBvIGRlc2VsZXppb25hcmVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VsZWN0ICoqdHJ1ZSoqIHBlciBzZWxlemlvbmFybGksICoqZmFsc2UqKiBwZXIgbm9uIHRvY2NhcmxpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTZWxlY3Rpb25TdGF0dXMoaXRlbXM6IGFueVtdLCBhbGw6IGJvb2xlYW4sIHNlbGVjdDogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChhbGwpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLlNlbGVjdEFsbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkltcG9zc2liaWxlIGltcG9zdGFyZSBsYSBzZWxlemlvbmUgY29uIGwnYWxsIHNlbGVjdGlvbiBxdWFuZG8gbCdJbnB1dCBTZWxlY3RBbGwgw6ggZmFsc2VcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBzaSA9ICh0aGlzLlZpZXcgYXMgQXBwU2VhcmNoPGFueT4pPy5zZWxlY3Rpb24gfHwgdGhpcy5hcnJheW1vZGVTZWxlY3Rpb247XHJcbiAgICAgICAgICAgIC8vc2UgZGVzZWxlemlvbm8gY29uIGF0dHVhbGUgc2VsZXppb25lIGFkIGFsbCBvIHNlIHNlbGV6aW9ubyBjb24gYXR0dWFsZSBzZWxlemlvbmUgbWFudWFsZSBkZXZvIHJpY2hpYW1hcmUgbGEgKipzZWxlY3RBbGxPclJlc2V0U2VsZWN0aW9uKipcclxuICAgICAgICAgICAgaWYgKChzaS5hbGwgJiYgIXNlbGVjdCkgfHwgKCFzaS5hbGwgJiYgc2VsZWN0KSlcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guc2VsZWN0QWxsT3JSZXNldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guaGFuZGxlSXRlbXNTZWxlY3Rpb24oaXRlbXMsIHNlbGVjdCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGNoZSBnZXN0aXNjZSBpbCBjYW1iaW8gZGkgT3JkaW5hbWVudG8gZGkgdW5hIGNvbG9ubmFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgSUQgZGVsbGEgY29sb25uYSBpbCBjdWkgb3JpZG5hbWVudG8gw6ggY2FtYmlhdG9cclxuICAgICAqIEBwYXJhbSB7J0RFU0MnIHwgJ0FTQyd9IG9yZGVyIE51b3ZvIG9yZGluZSBzZWxlemlvbmF0byBwZXIgbGEgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdGhPcmRlckNoYW5nZWQoaWQ6IHN0cmluZywgb3JkZXI/OiAnREVTQycgfCAnQVNDJykge1xyXG4gICAgICAgIGlmICghdGhpcy52aWV3TW9kZSAmJiAhdGhpcy5hcnJheU1vZGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdPcmRlciBjaGFuZ2VkIG9uIGEgdGFibGUgbm90IGluIHZpZXdNb2RlIG9yIEFycmF5IG1vZGUuIE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5PcmRlckJ5Q29sdW1uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5oYW5kbGVUSE9yZGVyQ2hhbmdlKGlkLCBvcmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gZGEgY2hpYW1hcmUgb2duaSB2b2x0YSBjaGUgc2kgdnVvbGUgZGFyZSBldmlkZW56YSBhbGwnZXN0ZXJubyBkZWwgYmlzb2dubyBkaSByaWVmZmV0dHVhcmUgbGEgcmljZXJjYVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlc2V0c1BhZ2UgSW5kaWNhIGFsIGxpc3RlbmVyIGNoZSBkZXZlIHJlc2V0dGFyZSBpbCBudW1lcm8gZGkgcGFnaW5hXHJcbiAgICAgKiBAcGFyYW0ge0FwcFNlYXJjaDxhbnk+fSB2aWV3T3ZlcnJpZGUgT3ZlcnJpZGUgZGVsbGEgdmlldyBkYSBlbWV0dGVyZSBwZXIgcXVlc3RhIHJpY2VyY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGVtaXRTZWFyY2hSZXF1ZXN0KHJlc2V0c1BhZ2U6IGJvb2xlYW4sIHZpZXdPdmVycmlkZT86IEFwcFNlYXJjaDxhbnk+KSB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlld01vZGUgJiYgIXZpZXdPdmVycmlkZSkge1xyXG4gICAgICAgICAgICAodGhpcy5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+KS5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2aWV3T3ZlcnJpZGUpIHtcclxuICAgICAgICAgICAgaWYgKHJlc2V0c1BhZ2UpXHJcbiAgICAgICAgICAgICAgICB2aWV3T3ZlcnJpZGUucGFnZSA9IDE7XHJcbiAgICAgICAgICAgIHZpZXdPdmVycmlkZS5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgPSB0cnVlXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlc2VhcmNoSW5Qcm9ncmVzcyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlZpZXcgJiYgIXRoaXMuVmlldy5zZWxmc2VhcmNoICYmIHRoaXMuRXNUYWJsZUhhbmRsZWRTZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGZzZWFyY2ggPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMub25TZWFyY2hSZXF1ZXN0LmVtaXQoZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5vblNlYXJjaFJlcXVlc3QuZW1pdCh2aWV3T3ZlcnJpZGUgPyB2aWV3T3ZlcnJpZGUgOiByZXNldHNQYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnRlbmRvIGRhZ2xpICoqRXNUZHMqKiBiaW5kYXRpIGdlbmVyYSwgYWxsJ2ludGVybm8gZGVsIGRpemlvbmFyaW8gKipUTVBSb3dURHMqKiB0dXR0aSBpIGNvbnRlc3RpIGRlaSB2YXJpIG9nZ2V0dGkuXHJcbiAgICAgKlxyXG4gICAgICogVmVuZ29ubyBlc2NsdXNpIGkgVEQgXCJJbnRlcm5pXCIgaW4gcXVhbnRvIHZlbmdvbm8gZ2VuZXJhdGkgZGFnbGkgb3JpZ2luYWxpIHF1aW5kaSBpbmNsdWRlcmxpIHZvcnJlYmJlIGRpcmUgcmllZmZldHR1YXJlIGxlIG9wZXJhemlvbmkgZHVlIHZvbHRlXHJcbiAgICAgKlxyXG4gICAgICogQ29zdG86IDIgc2NhbiBFc1RocywgMSBzY2FuIEVzVGRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFc1RoRGlyZWN0aXZlW119IHRocyBDb2xvbm5lIGRlbGxhIHRhYmVsbGFcclxuICAgICAqIEBwYXJhbSB7RXNUZERpcmVjdGl2ZVtdfSB0ZHMgQ2VsbGUgZGVsbGEgdGFiZWxsYVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlUm93VGRzKHRoczogRXNUaERpcmVjdGl2ZVtdLCB0ZHM6IEVzVGREaXJlY3RpdmVbXSkge1xyXG4gICAgICAgIGlmICh0ZHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGNvbHVtbnNDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IEVzVGFibGVDb2x1bW4gfSA9IHt9O1xyXG5cclxuICAgICAgICBmb3IgKGxldCBjb2xpID0gMDsgY29saSA8IHRoaXMuQ29sdW1uc0xpc3QubGVuZ3RoOyBjb2xpKyspIHtcclxuICAgICAgICAgICAgbGV0IGNvbCA9IHRoaXMuQ29sdW1uc0xpc3RbY29saV07XHJcbiAgICAgICAgICAgIGNvbHVtbnNDYWNoZVtjb2wuaWRdID0gY29sO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5UTVBSb3dURHMgPSB7fTtcclxuICAgICAgICAvLyBWYXJpYWJpbGUgZCdhcHBvZ2dpbyBwZXIgcGVybWV0dGVybWkgZGkgaW5zZXJpcmUgdHV0dGUgbGUgY29sb25uZSBcIkZpeGVkXCIgZGF2YW50aVxyXG4gICAgICAgIGxldCBjb250ZXh0Rml4ZWRzOiB7IFtjb250ZXh0OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0ZCA9IHRkc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ib3VuZFNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmJvdW5kU291cmNlW2ldO1xyXG4gICAgICAgICAgICAgICAgbGV0IGN0eCA9IGl0ZW0uX2hhc2g7XHJcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gdGQudGQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGggPSB0aGlzLnRoc0NhY2hlW3RkLnRkXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoISF0aClcclxuICAgICAgICAgICAgICAgICAgICB0aC5fcmVmZXJlbmNlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gU2tpcHBhcmUgc2VuemEgdGggKGNhc2lzdGljYSB0YWJlbGxhIGRpbmFtaWNhKVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoICYmIHRoLnRoSWYgJiYgKHRkLnRkSWYgfHwgdGgudGhHcm91cCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdGhDYXN0ZWQgPSA8RXNUaERpcmVjdGl2ZT50aDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaXNGaXhlZCA9IHRoLnRoRml4ZWQgfHwgdGgudGhHcm91cCB8fCB0aC50aFBpbm5lZDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbVRvQWRkID0gaXRlbS5faXRlbSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZEVsZW1lbnQ+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVmdEJvcmRlcjogKDxhbnk+dGhDYXN0ZWQpLl9sYm9yZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0Qm9yZGVyOiAoPGFueT50aENhc3RlZCkuX3Jib3JkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IGtleSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpbm5lZDogY29sdW1uc0NhY2hlW3RkLnRkXS5waW5uZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaW5uZWRXaWR0aDogdGhDYXN0ZWQudGhQaW5uZWRXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwSGVhZGVyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwQWdncmVnYXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzaWJsZTogY29sdW1uc0NhY2hlW3RkLnRkXS52aXNpYmxlLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyYXBzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiB0ZC50ZENsYXNzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSWNvbkNsYXNzOiB0ZC50ZEljb25DbGFzcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbkZpZWxkOiB0ZC50ZENvbmRpdGlvbkZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uVmFsdWU6IHRkLnRkQ29uZGl0aW9uVmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaXRsZTogdGQudGRUaXRsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQ6IHRkLnRkQ29udGVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlOiB0aENhc3RlZC50aEdyb3VwICYmICF0aGlzLlNob3dJdGVtR3JvdXBzQ29sdW1ucyA/IG51bGwgOiB0ZC5UZW1wbGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpOiB0ZC5fbXVsdGksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aVByb3A6IHRkLl9tdWx0aSA/IHRkLnRkLnNwbGl0KCdfJylbMF0gOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlJbmRleDogdGQuX211bHRpID8gdGQudGQuc3BsaXQoJ18nKVsxXSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQ6ICh0ZC50ZEFsaWdubWVudCB8fCB0aC50aEFsaWdubWVudCB8fCB0aGlzLkRlZmF1bHRBbGlnbm1lbnQpLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQ6IHRkLnRkRm9ybWF0IHx8IHRoLnRoRm9ybWF0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlOYW1lOiB0aC50aFByb3BlcnR5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlOiB0aC50aFR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVNvdXJjZTogdGgudGhTb3VyY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wQWNjZXNzb3I6IHRkLnRkUHJvcGVydHlBY2Nlc3NvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgPFRkRWxlbWVudD57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWZ0Qm9yZGVyOiAoPGFueT50aENhc3RlZCkuX2xib3JkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHRCb3JkZXI6ICg8YW55PnRoQ2FzdGVkKS5fcmJvcmQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDoga2V5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlubmVkOiBjb2x1bW5zQ2FjaGVbdGQudGRdLnBpbm5lZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpbm5lZFdpZHRoOiB0aENhc3RlZC50aFBpbm5lZFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBIZWFkZXI6IHRoQ2FzdGVkLnRoR3JvdXAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cEFnZ3JlZ2F0aW9uOiAhIXRoQ2FzdGVkLnRoQWdncmVnYXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXNpYmxlOiBjb2x1bW5zQ2FjaGVbdGQudGRdLnZpc2libGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcmFwczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogdGhDYXN0ZWQudGhHcm91cENsYXNzIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudDogdGhpcy5yb3dHcm91cGluZ19ILmdldEdyb3VwQ2VsbERpc3BsYXkoPEdyb3VwPml0ZW0sIGtleSwgPEVzVGhEaXJlY3RpdmU+dGgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlRNUFJvd1REc1tjdHhdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVE1QUm93VERzW2N0eF0ucHVzaChpdGVtVG9BZGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Sb3dDb250ZXh0cy5wdXNoKGN0eCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVE1QUm93VERzW2N0eF0gPSBbaXRlbVRvQWRkXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dEZpeGVkc1tjdHhdID0gaXNGaXhlZCA/IDEgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2Ugbm9uIGhvIG9nZ2V0dGkgw6ggaW51dGlsZSBjaGUgY29udHJvbGxvIGdsaSBlcnJvcmksIGRhdG8gY2hlIGdsaSBlcy10ZCBub24gZXNpc3RlcmFubm8gZGkgY2VydG8gZSBkaSBjb25zZWd1ZW56YSBnbGkgZXMtdGggbm9uIHNhcmFubm8gcmVmZXJlbnppYXRpXHJcbiAgICAgICAgaWYgKHRoaXMuVE1QQm91bmRTb3VyY2UubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdmFyIGVycnM6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldO1xyXG4gICAgICAgICAgICBpZiAoIXRoLl9yZWZlcmVuY2VkKVxyXG4gICAgICAgICAgICAgICAgZXJycy5wdXNoKHRoLnRoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlcnJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdmFyIGVycklkcyA9IGVycnMuam9pbignLCAnKTtcclxuICAgICAgICAgICAgdGhyb3cgXCJMJ0lEIGRpIHVubyBvIHBpw7kgRXNUaCBub24gaGFubm8gYWxjdW4gRXNUZCBhc3NvY2lhdG86IFwiICsgZXJySWRzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnRlbmRvIGRhZ2xpICoqRXNUaHMqKiBiaW5kYXRpIGdlbmVyYSwgYWxsJ2ludGVybm8gZGVsIGRpemlvbmFyaW8gKipUTVBSb3dUSHMqKiB0dXR0aSBpIGNvbnRlc3RpIGRlaSB2YXJpIG9nZ2V0dGkuXHJcbiAgICAgKlxyXG4gICAgICogVmVuZ29ubyBlc2NsdXNpIGkgVEggXCJJbnRlcm5pXCIgaW4gcXVhbnRvIHZlbmdvbm8gZ2VuZXJhdGkgZGFnbGkgb3JpZ2luYWxpIHF1aW5kaSBpbmNsdWRlcmxpIHZvcnJlYmJlIGRpcmUgcmllZmZldHR1YXJlIGxlIG9wZXJhemlvbmkgZHVlIHZvbHRlXHJcbiAgICAgKlxyXG4gICAgICogQ29zdG86IDEgc2NhbiBFc1RocyArIDEgc2NhbiBDb2x1bW5zTGlzdFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RXNUaERpcmVjdGl2ZVtdfSB0aHMgQ29sb25uZSBkZWxsYSB0YWJlbGxhXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZXZhbHVhdGVSb3dUaHModGhzOiBFc1RoRGlyZWN0aXZlW10pIHtcclxuICAgICAgICBpZiAodGhzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBjb2x1bW5zTGlzdENhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogRXNUYWJsZUNvbHVtbiB9ID0ge307XHJcbiAgICAgICAgbGV0IGNhc3RlZFZpZXcgPSA8QXBwU2VhcmNoPGFueT4+dGhpcy5WaWV3O1xyXG4gICAgICAgIGxldCBncm91cGluZ3NVbmRlZmluZWQgPSB0aGlzLnZpZXdNb2RlICYmIChjYXN0ZWRWaWV3ICYmICFjYXN0ZWRWaWV3Lmdyb3VwaW5ncyB8fCBjYXN0ZWRWaWV3Lmdyb3VwaW5ncy5sZW5ndGggPT0gMCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5Db2x1bW5zTGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgaXRtID0gdGhpcy5Db2x1bW5zTGlzdFtpXTtcclxuICAgICAgICAgICAgY29sdW1uc0xpc3RDYWNoZVtpdG0uaWRdID0gaXRtXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLlRNUFJvd1RIcyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0aCA9IHRoc1tpXTtcclxuICAgICAgICAgICAgbGV0IHRvQWRkOiBUaEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodGgudGhJZiB8fCB0aC50aEdyb3VwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHRoQ2xhc3MgPSAodGgudGhDbGFzcyB8fCBcIlwiKSArICh0aC50aFNocmluayA/IFwiIGFwcC1jb2wtbWluXCIgOiBcIlwiKSArICh0aC50aEdyb3VwID8gXCIgZXN0LWNvbC1taW5cIiA6IFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgdG9BZGQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgUGlubmVkOiBjb2x1bW5zTGlzdENhY2hlW3RoLnRoXS5waW5uZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgRml4ZWQ6IHRoLnRoRml4ZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgUGlubmVkV2lkdGg6IHRoLnRoUGlubmVkV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgSUQ6IHRoLnRoLFxyXG4gICAgICAgICAgICAgICAgICAgIFZpc2libGU6IHRoLnRoVmlzaWJsZSxcclxuICAgICAgICAgICAgICAgICAgICBDbGFzczogdGhDbGFzcyxcclxuICAgICAgICAgICAgICAgICAgICBPcmRlcjogdGgudGhPcmRlcixcclxuICAgICAgICAgICAgICAgICAgICBPcmRlcmFibGU6IHRoLnRoT3JkZXJhYmxlLFxyXG4gICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlOiB0aC5UZW1wbGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQ6ICh0aC50aEFsaWdubWVudCB8fCB0aGlzLkRlZmF1bHRBbGlnbm1lbnQpLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2Ugbm9uIMOoIG5lc3N1biBjb250ZW51dG8gbsOpIG5lc3N1biB0ZW1wbGF0ZSBtb3N0cm8gc2VtcGxpY2VtZW50ZSBsJ0lEIGRlbGwnaGVhZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgQ29udGVudDogdGgudGhTdGF0aWNDb250ZW50ICE9IG51bGwgPyB0aC50aFN0YXRpY0NvbnRlbnQgOiB0aC5UZW1wbGF0ZSA/ICcnIDogdGgudGgsXHJcbiAgICAgICAgICAgICAgICAgICAgV3JhcDogdGgudGhXcmFwLFxyXG4gICAgICAgICAgICAgICAgICAgIExlZnRCb3JkZXI6ICg8YW55PnRoKS5fbGJvcmQsXHJcbiAgICAgICAgICAgICAgICAgICAgUmlnaHRCb3JkZXI6ICg8YW55PnRoKS5fcmJvcmQsXHJcbiAgICAgICAgICAgICAgICAgICAgTXVsdGk6IHRoLl9tdWx0aSxcclxuICAgICAgICAgICAgICAgICAgICBNdWx0aUNvbnRlbnQ6IHRoLl9tdWx0aV9jb250ZW50XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5UTVBSb3dUSHMucHVzaCh0b0FkZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gU2UgaG8gdW4gbW9kZWxsbyBjaGUgZGV2ZSBmdW56aW9uYXJlIGEgcm93Z3JvdXBpbmcgbWEgbm9uIMOoIGFuY29yYSBzdGF0YSBlZmZldHR1YXRhIG5lc3N1bmEgcmljZXJjYSBzdWkgZ3J1cHBpIHByaW5jaXBhbGkgKGdyb3VwaW5nc1VuZGVmaW5lZClcclxuICAgICAgICAgICAgICAgIC8vIGxpIGdlbmVybyBlIG1hbmRvIGxhIHByaW1hIHJpY2VyY2EgY2hlIGRldidlc3NlcmUgc3BlZGl0YSBhbCBiYWNrZW5kIHBlciBpbCBwcmltbyBjYXJpY2FtZW50byBkZWkgZ3J1cHBpXHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBpbmdzVW5kZWZpbmVkICYmICh0aC50aEFnZ3JlZ2F0aW9uIHx8IHRoLnRoR3JvdXApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3VwQWdncmVnYXRpb25zOiBHcm91cE9yQWdncmVnYXRpb25bXSA9IHRoaXMucm93R3JvdXBpbmdfSC5nZXRHcm91cEFnZ3JlZ2F0aW9ucyh0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXN0ZWRWaWV3Lmdyb3VwaW5ncylcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzdGVkVmlldy5ncm91cGluZ3MgPSBncm91cEFnZ3JlZ2F0aW9ucztcclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RlZFZpZXcuZ3JvdXBpbmdzLnB1c2goLi4uZ3JvdXBBZ2dyZWdhdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlJlc2VhcmNoTmVlZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNwb3N0YSBsYSByaWNlcmNhIGRpIHVuYSBwYWdpbmEgaW4gYXZhbnRpIChvIGluZGlldHJvKVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlIE51bWVybyBkaSBwYWdpbmUgZGEgYWdnaXVuZ2VyZSAobyBzb3R0cmFycmUsIHNlIG5lZ2F0aXZvKSBhbGxhIHBhZ2luYSBhdHR1YWxlXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gcGFnZXIgRWxlbWVudG8gZGkgc2VwYXJhemlvbmUgc3UgY3VpIMOoIGVmZmV0dHVhdGEgbGEgcmljZXJjYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkVG9QYWdlR3JvdXAocGFnZTogbnVtYmVyLCBwYWdlcjogR3JvdXBQYWdlcikge1xyXG4gICAgICAgIHRoaXMuZ29Ub1BhZ2VHcm91cChwYWdlci52aWV3LnBhZ2UgKyBwYWdlLCBwYWdlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcG9zdGEgbGEgcmljZXJjYSBhbGxhIHBhZ2luYSBzcGVjaWZpY2F0YVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlIFBhZ2luYSBhIGN1aSBuYXZpZ2FyZVxyXG4gICAgICogQHBhcmFtIHthbnl9IHBhZ2VyIEVsZW1lbnRvIGRpIHNlcGFyYXppb25lIHN1IGN1aSDDqCBlZmZldHR1YXRhIGxhIHJpY2VyY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdvVG9QYWdlR3JvdXAocGFnZTogbnVtYmVyLCBwYWdlcjogR3JvdXBQYWdlcikge1xyXG5cclxuICAgICAgICBsZXQgYXBwU2VhcmNoRWxlbWVudCA9IHBhZ2VyLnZpZXc7XHJcbiAgICAgICAgaWYgKHBhZ2UgPT09IDAgfHwgKHBhZ2UgPiBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzICYmIGFwcFNlYXJjaEVsZW1lbnQucGFnZXMgPiAwKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBhcHBTZWFyY2hFbGVtZW50LnBhZ2UgPSBwYWdlO1xyXG4gICAgICAgIHBhZ2VyLmJ1dHRvbnMgPSB0aGlzLnV0aWxpdGllc19ILmdldFBhZ2VzQXJyYXkoNiwgYXBwU2VhcmNoRWxlbWVudC5wYWdlLCBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdChmYWxzZSwgYXBwU2VhcmNoRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQFRPRE8gU3Bvc3RhcmUgaW4gU2VsZWN0aW9uSGFuZGxlclxyXG4gICAgICogXHJcbiAgICAgKiBHZXN0aXNjZSBpIGNsaWNrIHN1bGxhIHRhYmVsbGEgc29sbyBwZXIgbGUgcmlnaGUgYSBncnVwcG8uIFxyXG4gICAgICogTyByaW11b3ZlIGdsaSBlbGVtZW50aSBhdHR1YWxtZW50ZSBwcmVzZW50aSBvIGNhcmljYSBpbCBjb250ZW51dG8gZGVsIGdydXBwb1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55fSBncm91cCBHcnVwcG8gYmluZGF0byBzdSBjdWkgc2kgw6ggZWZmZXR0dWF0byBpbCBjbGlja1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBsJ29wZXJhaXpvbmUgw6ggYW5kYXRhIGEgYnVvbiBmaW5lLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFuZGxlR3JvdXBDbGljayhncm91cDogR3JvdXApOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgY2FzdGVkID0gdGhpcy5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+O1xyXG4gICAgICAgIGxldCBhbnlHID0gKDxhbnk+Z3JvdXApO1xyXG4gICAgICAgIGFueUcuX2V4cGFuZGVkID0gIWFueUcuX2V4cGFuZGVkO1xyXG5cclxuICAgICAgICAvLyBTb25vIGluIG1vZGFsaXTDoCByYWdncnVwcGFtZW50byB2aXJ0dWFsZSBkYSBhcnJheTogRXNwYW5kZXJlIHNpZ25pZmljYSByZW5kZXJlIHZpc2liaWxpIHR1dHRpIGdsaSBvZ2dldHRpIHJlbGF0aXZpIGEgcXVlc3RvIGdydXBwbywgdmljZXZlcnNhIGlsIGNvbnRyYXJyZVxyXG4gICAgICAgIGlmICh0aGlzLkFycmF5R3JvdXBpbmcpIHtcclxuICAgICAgICAgICAgbGV0IGFsbFJlbGF0aXZlcyA9IHRoaXMuYm91bmRTb3VyY2UuZmlsdGVyKHQgPT5cclxuICAgICAgICAgICAgICAgICh0Ll9ncm91cCAmJiAoKGFueUcuX2V4cGFuZGVkICYmIHQuX3BhcmVudCA9PSBhbnlHLl90aGlzS2V5KSB8fCAoIWFueUcuX2V4cGFuZGVkICYmIHQuX3BhcmVudCAmJiB0Ll9wYXJlbnQuc3RhcnRzV2l0aChhbnlHLl90aGlzS2V5KSkpKSB8fFxyXG4gICAgICAgICAgICAgICAgKHQuX2l0ZW0gJiYgKChhbnlHLl9leHBhbmRlZCAmJiB0Ll90aGlzS2V5ID09IGFueUcuX3RoaXNLZXkpIHx8ICghYW55Ry5fZXhwYW5kZWQgJiYgdC5fdGhpc0tleS5zdGFydHNXaXRoKGFueUcuX3RoaXNLZXkpKSkpKVxyXG4gICAgICAgICAgICBhbGxSZWxhdGl2ZXMuZm9yRWFjaCh0ID0+IHsgdC5fdmlzaWJsZSA9IGFueUcuX2V4cGFuZGVkOyBpZiAodC5fZ3JvdXApIHQuX2V4cGFuZGVkID0gZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhbnlHLl9leHBhbmRlZCkge1xyXG4gICAgICAgICAgICAvLyBSZXNldHRvIGlwcFxyXG4gICAgICAgICAgICBjYXN0ZWQuaXRlbXNwZXJwYWdlb3ZlcnJpZGUgPSAxNTtcclxuICAgICAgICAgICAgaWYgKCFjYXN0ZWQucmVxdWVzdGVkZ3JvdXBzKVxyXG4gICAgICAgICAgICAgICAgY2FzdGVkLnJlcXVlc3RlZGdyb3VwcyA9IFtuZXcgR3JvdXBGaWx0ZXIoZ3JvdXAuY29sdW1uLCBncm91cC52YWx1ZSldO1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBsZXZlbCA9IGFueUcuX2dyb3VwbGV2ZWw7XHJcbiAgICAgICAgICAgICAgICAvLyBzZSBpbCBncnVwcG8gY2xpY2NhdG8gbm9uIGhhIHVuIGxpdmVsbG8gw6ggaWwgcHJpbW8gZ3J1cHBvLCBxdWluZGkgb3JkaW5hbWVudG8gdW5pY29cclxuICAgICAgICAgICAgICAgIC8vIGFsdHJpbWVudGkgZGV2byByaW11b3ZlcmUgdHV0dGkgaSBmaWx0cmkgc3UgbGl2ZWxsaSBzdXBlcmlvcmkgYWwgbGV2ZWwgY2xpY2NhdG8gZSBhZ2dpdW5nZXJlIGlsIGxldmVsIGNsaWNjYXRvXHJcbiAgICAgICAgICAgICAgICBpZiAoIWxldmVsKVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc3RlZC5yZXF1ZXN0ZWRncm91cHMgPSBbbmV3IEdyb3VwRmlsdGVyKGdyb3VwLmNvbHVtbiwgZ3JvdXAudmFsdWUpXTtcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc3RlZC5yZXF1ZXN0ZWRncm91cHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBhbnlHLl9wYXJlbnRSb3V0ZS5mb3JFYWNoKChzdGVwOiBHcm91cFJvdXRlRnJhZ21lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzdGVkLnJlcXVlc3RlZGdyb3Vwcy5wdXNoKG5ldyBHcm91cEZpbHRlcihzdGVwLmNvbHVtbiwgc3RlcC52YWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc3RlZC5yZXF1ZXN0ZWRncm91cHMucHVzaChuZXcgR3JvdXBGaWx0ZXIoZ3JvdXAuY29sdW1uLCBncm91cC52YWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBwYXRoID0gKGFueUcuX3BhcmVudCB8fCAnJykgKyBncm91cC52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNlIGhvIGNoaXVzbyB1biBncnVwcG8gbm9uIG1pIHNlcnZlIHJpZWZmZXR0dWFyZSByaWNlcmNlLCBtaSBiYXN0YSBlbGltaW5hcmUgZGFnbGkgb2dnZXR0aSBiaW5kYXRpIHR1dHRpIGdsaSBlbGVtZW50aSBzb3R0b3N0YW50aSBhIHF1ZWwgZ3J1cHBvXHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLmJvdW5kU291cmNlLmZpbHRlcih0ID0+ICF0Ll9wYXJlbnQgfHwgIXQuX3BhcmVudC5zdGFydHNXaXRoKHBhdGgpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGRldm8gcGVyw7IgYW5jaGUgcmltdW92ZXJlIGV2ZW50dWFsaSBjYWNoZSByZWxhdGl2ZVxyXG4gICAgICAgICAgICB0aGlzLmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZSA9IHRoaXMuZ3JvdXBTZWFyY2hSZXF1ZXN0c0NhY2hlLmZpbHRlcih0ID0+IHQucGF0aCAhPSBwYXRoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlc3Rpc2NlIGxhIHNlbGV6aW9uZSBnbG9iYWxlIGRlZ2xpIG9nZ2V0dGksIHNpYSBwZXIgcGFnaW5hIGNoZSBhIGxpdmVsbG8gZGkgKipTZWxlY3RBbGwqKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2VkVmFsIFZhbG9yZSBmb3J6YXRvIGRpIGNoZWNrIGRhIGFzc2VnbmFyZSBhZ2xpIG9nZ2V0dGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdsb2JhbENoZWNrQ2hhbmdlZChmb3JjZWRWYWw6IGJvb2xlYW4gPSBudWxsKSB7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJTZWxlY3Rpb25TdGF0dXNFeGNsdWRpbmcobnVsbCk7XHJcblxyXG4gICAgICAgIC8vIFByZW5kbyB0dXR0aSBnbGkgZWxlbWVudGkgcHJlc2VudGkgaW4gcXVlc3RhIHZpc3RhLiBTZSBobyBncnVwcGkgcHJlbmRvIHNvbG8gaSBncnVwcGkgYSBsaXZlbGxvIDAsIGFsdHJpbWVudGkgcHJlbmRvIHR1dHRpIGdsaSBvZ2dldHRpIHBlciBzZWxlemlvbmFybGlcclxuICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLmJvdW5kU291cmNlLmZpbmQodCA9PiB0Ll9ncm91cCkgPyB0aGlzLmJvdW5kU291cmNlLmZpbHRlcih0ID0+IHQuX2dyb3VwICYmICF0Ll9wYXJlbnQpIDogdGhpcy5ib3VuZFNvdXJjZTtcclxuICAgICAgICB2YXIgaXRlbVNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uX0guaGFuZGxlSXRlbXNTZWxlY3Rpb24oaXRlbXMsIGZvcmNlZFZhbCwgdGhpcy5nbG9iYWxDaGVjayk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoaXRlbVNlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAVE9ETyBTcG9zdGFyZSBpbiBTZWxlY3Rpb25IYW5kbGVyXHJcbiAgICAgKiBcclxuICAgICAqIEdlc3Rpc2NlIGkgY2xpY2sgc3VsbGEgdGFiZWxsYSwgZ2VzdGVuZG8gZXZlbnR1YWxtZW50ZSBhbmNoZSBnbGkgU2hpZnQgKyBDbGljayBwZXIgc2VsZXppb25hcmUgdW4gcmFuZ2UgZGkgb2dnZXR0aVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55fSBldmVudCBFdmVudG8gbmF0aXZvIEhUTUwgZGVsIGNsaWNrXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIGJpbmRhdG8gc3UgY3VpIHNpIMOoIGVmZmV0dHVhdG8gaWwgY2xpY2tcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbCdvcGVyYWl6b25lIMOoIGFuZGF0YSBhIGJ1b24gZmluZSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhbmRsZUNsaWNrKGV2ZW50OiBhbnksIGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJUZXh0U2VsZWN0aW9uKGV2ZW50KTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG5cclxuICAgICAgICBsZXQgc2VsZWN0ZWRpdGVtczogYW55W10gPSBbXTtcclxuICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgdGhpcy5TaGlmdENsaWNrICYmICF0aGlzLlNpbmdsZVNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRTZWxlY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGxldCBpdGVtcyA9IHRoaXMuYm91bmRTb3VyY2UuZmlsdGVyKHQgPT4gIXQuX2dyb3VwICYmICF0Ll9zZXApO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0U2VsZWN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5fc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkaXRlbXMucHVzaCh0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICgodCA9PSBpdGVtIHx8IHQgPT0gdGhpcy5sYXN0U2VsZWN0ZWQpICYmICFzdGFydFNlbGVjdGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0Ll9zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRpdGVtcy5wdXNoKHQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodCA9PSBpdGVtIHx8IHQgPT0gdGhpcy5sYXN0U2VsZWN0ZWQpICYmIHN0YXJ0U2VsZWN0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpdGVtLl9zZWxlY3RlZCA9ICFpdGVtLl9zZWxlY3RlZDtcclxuICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWQgPSBpdGVtO1xyXG4gICAgICAgICAgICBzZWxlY3RlZGl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaXRlbVNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uX0guaGFuZGxlSXRlbXNTZWxlY3Rpb24oc2VsZWN0ZWRpdGVtcyk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoaXRlbVNlbGVjdGlvbik7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Bvc3RhIGxhIHJpY2VyY2EgZGkgdW5hIHBhZ2luYSBpbiBhdmFudGkgKG8gaW5kZWl0cm8pXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgTnVtZXJvIGRpIHBhZ2luZSBkYSBhZ2dpdW5nZXJlIChvIHNvdHRyYXJyZSwgc2UgbmVnYXRpdm8pIGFsbGEgcGFnaW5hIGF0dHVhbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFRvUGFnZShwYWdlOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgdmlldyA9IHRoaXMuTWFpbkdyb3VwVmlldyA/IHRoaXMuTWFpbkdyb3VwVmlldyA6IHRoaXMuVmlldztcclxuXHJcbiAgICAgICAgdGhpcy5nb1RvUGFnZSgoKHRoaXMuU2VhcmNoVmlldyB8fCB2aWV3KT8ucGFnZSB8fCAwKSArIHBhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Bvc3RhIGxhIHJpY2VyY2EgYWxsYSBwYWdpbmEgc3BlY2lmaWNhdGFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBQYWdpbmEgYSBjdWkgbmF2aWdhcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdvVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIGxldCB2aWV3ID0gdGhpcy5NYWluR3JvdXBWaWV3ID8gdGhpcy5NYWluR3JvdXBWaWV3IDogKHRoaXMuYXJyYXlNb2RlID8gdGhpcy5TZWFyY2hWaWV3IDogdGhpcy5WaWV3KTtcclxuICAgICAgICBpZiAoIXZpZXcucGFnZSB8fCAhdmlldy5wYWdlcylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgYXBwU2VhcmNoRWxlbWVudCA9IHRoaXMuU2VhcmNoVmlldyB8fCB2aWV3O1xyXG4gICAgICAgIGlmIChwYWdlID09PSAwIHx8IChwYWdlID4gYXBwU2VhcmNoRWxlbWVudC5wYWdlcyAmJiBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzID4gMCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgYXBwU2VhcmNoRWxlbWVudC5wYWdlID0gcGFnZTtcclxuICAgICAgICBsZXQgY291bnQgPSAodmlldy5pdGVtcy5sZW5ndGggfHwgdmlldy5ncm91cHM/Lmxlbmd0aCB8fCAwKTtcclxuICAgICAgICBsZXQgaXBwID0gdmlldy5pdGVtc3BlcnBhZ2VvdmVycmlkZSB8fCAxNTtcclxuICAgICAgICB0aGlzLmFycmF5UHVsc2FudGkgPSB0aGlzLnV0aWxpdGllc19ILmdldFBhZ2VzQXJyYXkoNiwgYXBwU2VhcmNoRWxlbWVudC5wYWdlLCBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzLCBjb3VudCwgaXBwKTtcclxuXHJcbiAgICAgICAgbGV0IGhhc0dyb3VwaW5ncyA9ICEhdGhpcy5NYWluR3JvdXBWaWV3O1xyXG4gICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QoZmFsc2UsIGhhc0dyb3VwaW5ncyA/IHZpZXcgOiB0aGlzLlNlYXJjaFZpZXcgPyB0aGlzLlNlYXJjaFZpZXcgOiBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50byByaWNoaWFtYXRvIHN1bCBjYW1iaW8gZGVsbGEgcGFnaW5hemlvbmUuIFZlcnLDoCByaWNoaWFtYXRvIGwnZXZlbnRvICoqZW1pdFNlYXJjaFJlcXVlc3QqKlxyXG4gICAgICogcGVyIGNvbXVuaWNhcmUgYWwgY29tcG9uZW50ZSBjaGUgdXRpbGl6emEgcXVlc3RhIHRhYmVsbGEgY2hlIGkgZGF0aSBzb25vIGRhIGFnZ2lvcm5hcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uSXRlbXNQZXJQYWdlQ2hhbmdlZChuZXdJcHApIHtcclxuICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5WaWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlID0gbmV3SXBwO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG4gICAgICAgIGlmICh0aGlzLk1haW5Hcm91cFZpZXcpXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSwgdGhpcy5NYWluR3JvdXBWaWV3KTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLlNlYXJjaFZpZXcpIHtcclxuICAgICAgICAgICAgLy8gUXVlc3RvIHNlY29uZG8gbWUgc2kgcHXDsiBwb3J0YXJlIGEgbGl2ZWxsbyB1biBwbycgcGnDuSBhbHRvXHJcbiAgICAgICAgICAgIHRoaXMuU2VhcmNoVmlldy5wYWdlID0gMTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlLCB0aGlzLlNlYXJjaFZpZXcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIHN1bCBjYW1iaW8gZGVsbGEgcGFnaW5hemlvbmUuIFZlcnLDoCByaWNoaWFtYXRvIGwnZXZlbnRvICoqZW1pdFNlYXJjaFJlcXVlc3QqKiBjb24gbGEgdmlzdGEgZGVsIHNlcGFyYXRvcmUgKi9cclxuICAgIHB1YmxpYyBvbkdyb3VwSXRlbXNQZXJQYWdlQ2hhbmdlZChwYWdlcjogR3JvdXBQYWdlciwgbmV3SXBwOiBudW1iZXIpIHtcclxuICAgICAgICBwYWdlci52aWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlID0gbmV3SXBwO1xyXG4gICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSwgcGFnZXIudmlldyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiBNZXRvZG8gY2hlIGdlc3Rpc2NlIGxhIG1vZGlmaWNhIGRlbCB0ZW1wbyBzcGVjaWZpY2F0byBwZXIgbCdhZ2dpb3JuYW1lbnRvIGF1dG9tYXRpY28gKi9cclxuICAgIHB1YmxpYyBhdXRvVXBkYXRlQ2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAoIS9eWzEtOV1cXGQqJC8udGVzdCh0aGlzLnNlY29uZHMpKVxyXG4gICAgICAgICAgICB0aGlzLnNlY29uZHMgPSAnMTAnO1xyXG5cclxuICAgICAgICBsZXQgc2Vjb25kc0luTXMgPSBwYXJzZUludCh0aGlzLnNlY29uZHMsIG51bGwpICogMTAwMDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b1VwZGF0ZSlcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVUaW1lciA9IHNldEludGVydmFsKCgpID0+IHsgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdChmYWxzZSk7IH0sIHNlY29uZHNJbk1zKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVUaW1lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gY2hpYW1hdG8gZGFsIGNsaWNrIHN1IHVuYSBkZWxsZSBjb2xvbm5lIGdlbmVyYXRlIGRhbGwnSW5wdXQgKipEeW5hbWljT3BlcmF0aW9ucyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gTCdvZ2dldHRvIHN1IGN1aSB2YSBlZmZldHR1YXRhIGwnb3BlcmF6aW9uZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9waWQgQ29kaWNlIGlkZW50aWZpY2F0aXZvIGRlbGwnb3BlcmF6aW9uZSBkYSBlZmZldHR1YXJzaVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZHluYW1pY09wZXJhdGlvbihpdGVtOiBhbnksIG9waWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMub25EeW5hbWljT3BlcmF0aW9uLmVtaXQoeyBpZDogb3BpZCwgaXRlbTogaXRlbSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgY29udGVudXRvIGRlbGwnRXNUZCBkYSB1dGlsaXp6YXJlIHBlciBsYSBjb2xvbm5hIHNwZWNpZmljYXRhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW4gQ29sb25uYSBwZXIgY3VpIGNlcmNhcmUgbGEgY2VsbGFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5vbWUgZGlyZXR0byBwZXIgY2VyY2FyZSBpbCBURCBjb24gbCdJRC4gUXVlc3RhIHZhcmlhYmlsZSBoYSBwcmlvcml0w6AgcmlzcGV0dG8gYSAqKmNvbHVtbioqXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtUZW1wbGF0ZVJlZjxhbnk+fSBUZW1wbGF0ZSBkYSB1c2FyZSBwZXIgbGEgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmluZEVzVGQoY29sdW1uOiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IG51bGwpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcclxuICAgICAgICB2YXIgRXNUZCA9IHRoaXMuRXNUZHNEaXJlY3RpdmUuZmluZCgoaXRlbSkgPT4gbmFtZSA/IGl0ZW0udGQgPT09IG5hbWUgOiBpdGVtLnRkRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgLy8gTmFtZSBub24gdHJvdmF0bywgZmFsbGJhY2sgYWwgbm9tZSBkZWxsYSBjb2xvbm5hXHJcbiAgICAgICAgaWYgKG5hbWUgJiYgY29sdW1uICYmICFFc1RkKVxyXG4gICAgICAgICAgICBFc1RkID0gdGhpcy5Fc1Rkc0RpcmVjdGl2ZS5maW5kKChpdGVtKSA9PiBpdGVtLnRkRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgcmV0dXJuIEVzVGQgPyBFc1RkLlRlbXBsYXRlIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgY29udGVudXRvIGRlbGwnZWRpdG9yIEVzVGQgZGEgdXRpbGl6emFyZSBwZXIgbGEgY29sb25uYSBzcGVjaWZpY2F0YVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uIENvbG9ubmEgcGVyIGN1aSBjZXJjYXJlIGwnZWRpdG9yXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOb21lIGRpcmV0dG8gcGVyIGNlcmNhcmUgbCdFZGl0b3IgY29uIGwnSUQuIFF1ZXN0YSB2YXJpYWJpbGUgaGEgcHJpb3JpdMOgIHJpc3BldHRvIGEgKipjb2x1bW4qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7VGVtcGxhdGVSZWY8YW55Pn0gVGVtcGxhdGUgZGEgdXNhcmUgcGVyIGxhIGNvbG9ubmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpbmRFZGl0b3IoY29sdW1uOiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IG51bGwpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcclxuICAgICAgICB2YXIgRWRpdG9yID0gdGhpcy5Fc1RkRWRpdG9yRGlyZWN0aXZlcy5maW5kKChpdGVtKSA9PiBuYW1lID8gaXRlbS5lZGl0b3IgPT09IG5hbWUgOiBpdGVtLmVkaXRvckZvclByb3BlcnR5ID09PSBjb2x1bW4pO1xyXG4gICAgICAgIC8vIE5hbWUgbm9uIHRyb3ZhdG8sIGZhbGxiYWNrIGFsIG5vbWUgZGVsbGEgY29sb25uYVxyXG4gICAgICAgIGlmIChuYW1lICYmIGNvbHVtbiAmJiAhRWRpdG9yKVxyXG4gICAgICAgICAgICBFZGl0b3IgPSB0aGlzLkVzVGRFZGl0b3JEaXJlY3RpdmVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZWRpdG9yRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgcmV0dXJuIEVkaXRvciA/IEVkaXRvci5UZW1wbGF0ZSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFcXVpdmFsZW50ZSBkZWwgbWV0b2RvICoqYWRkVG9QYWdlKiogcmlhZGF0dGF0byBwZXIgbGEgbW9kYWxpdMOgIGFycmF5XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgTnVtZXJvIGRpIHBhZ2luZSBkYSBhZ2dpdW5nZXJlIChvIHNvdHRyYXJyZSwgc2UgbmVnYXRpdm8pIGFsbGEgcGFnaW5hIGF0dHVhbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFycmF5QWRkVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuYXJyYXlHb1RvUGFnZSh0aGlzLmFycmF5bW9kZVBhZ2UgKyBwYWdlKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXF1aXZhbGVudGUgZGVsIG1ldG9kbyAqKmdvVG9QYWdlKiogcmlhZGF0dGF0byBwZXIgbGEgbW9kYWxpdMOgIGFycmF5XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgUGFnaW5hIGEgY3VpIG5hdmlnYXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcnJheUdvVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChwYWdlID09PSAwIHx8IHBhZ2UgPiB0aGlzLmFycmF5bW9kZVBhZ2VzKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgdGhpcy5hcnJheW1vZGVQYWdlID0gcGFnZTtcclxuXHJcbiAgICAgICAgLy8gUmlmb3J6byBpbCB3cml0ZXZhbHVlIGluIG1vZG8gY2hlIGlsIGNvZGljZSBwYXNzaSBkYWxsYSBnZXN0aW9uZSBjb21lIHNlIGZvc3NlIGZhdHRhIHJpcGFydGlyZSB1bmEgcmljZXJjYVxyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxXcml0ZVZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXN0aW9uZSBkZWkgY2xpY2sgc3VsbGUgb3B6aW9uaSBkZWwgbWVuw7kgY29udGVzdHVhbGUgaW4gYWx0byBhIGRlc3RyYSBnZW5lcmF0byBkYWxsJ0lucHV0ICoqQ29ybmVyTWVudU9wdGlvbnMqKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb3JuZXJpZCBDb2RpY2UgZGVsbCdvcGVyYXppb25lIHNlbGV6aW9uYXRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3JuZXJBY3Rpb25DbGlja2VkKGNvcm5lcmlkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm9uQ29ybmVyQWN0aW9uLmVtaXQoeyBpZDogY29ybmVyaWQsIGVzdGFibGU6IHRoaXMgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogSW1wb3N0YXppb25lIG1vZGFsaXTDoCBkZWxsJ0VzVGFibGUgXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7J2FycmF5JyB8ICd2aWV3JyB8ICdyZXBvcnQnfSBtb2RlIE1vZGFsaXTDoCBkYSBpbXBvc3RhcmVcclxuICAgICAqKi9cclxuICAgIHByaXZhdGUgc2V0TW9kZShtb2RlOiAnYXJyYXknIHwgJ3ZpZXcnKSB7XHJcbiAgICAgICAgdGhpcy52aWV3TW9kZSA9IG1vZGUgPT0gJ3ZpZXcnO1xyXG4gICAgICAgIHRoaXMuYXJyYXlNb2RlID0gbW9kZSA9PSAnYXJyYXknO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIHBlciBlZmZldHR1YXJlIGNoaWFtYXRlIGludGVybmUgZGkgYWxsaW5lYW1lbnRvIGFsbGEgZnVuemlvbmUgKip3cml0ZVZhbHVlKiosIFxyXG4gICAgICogaW1wb3N0YW5kbyBwcmltYSAqKmludGVybmFsV3JpdGVDYWxsKiogaW4gbW9kbyBkYSBub24gZWZmZXR0dWFyZSBvcGVyYXppb25pIGludXRpbGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGludGVybmFsV3JpdGVWYWx1ZSgpIHtcclxuICAgICAgICB0aGlzLmludGVybmFsV3JpdGVDYWxsID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5WaWV3KTtcclxuICAgICAgICB0aGlzLmludGVybmFsV3JpdGVDYWxsID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIE1ldG9kbyBldmVudHVhbG1lbnRlIHJpY2hpYW1hYmlsZSBhbmNoZSBkYWwgY29tcG9uZW50ZSBlc3Rlcm5vIGNoZSBwZXJtZXR0ZSBkaSBmb3J6YXJlIHVuIHJlZnJlc2ggZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgcHVibGljIGZvcmNlUmVmcmVzaChyZWxhdW5jaFNlYXJjaDogYm9vbGVhbiA9IHRydWUpIHtcclxuXHJcbiAgICAgICAgLy8gU2Ugc29ubyBpbiBtb2RhbGl0w6AgVmlldyB2aWVuZSBtYW50ZW51dG8gaW4gYXV0b21hdGljbyBpbCBudW1lcm8gZGkgcGFnaW5hLCBtYSBwZXIgbGEgbW9kYWxpdMOgIGFycmF5IGRldm8gcHJlbmRlcmUgbGUgaW5mbyBkaSBwYWdpbmF6aW9uZSBwcmltYSBlIHJpYXBwbGljYXJsZSBkb3BvXHJcbiAgICAgICAgbGV0IGFycmF5UGFnZTogbnVtYmVyO1xyXG4gICAgICAgIGxldCBhcnJheUlwcDogbnVtYmVyO1xyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSkge1xyXG4gICAgICAgICAgICBhcnJheVBhZ2UgPSB0aGlzLmFycmF5bW9kZVBhZ2U7XHJcbiAgICAgICAgICAgIGFycmF5SXBwID0gdGhpcy5BcnJheW1vZGVJdGVtc1BlclBhZ2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZighcmVsYXVuY2hTZWFyY2ggJiYgdGhpcy52aWV3TW9kZSlcclxuICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGZzZWFyY2ggPSB0cnVlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5WaWV3KTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLkFycmF5bW9kZUl0ZW1zUGVyUGFnZSA9IGFycmF5SXBwO1xyXG4gICAgICAgICAgICB0aGlzLmFycmF5R29Ub1BhZ2UoYXJyYXlQYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogSW1wb3N0YSBsYSB2aXNpYmlsaXTDoCBkaSB1biBoZWFkZXIgZSBkaSBldmVudHVhbGkgaGVhZGVyIGNvbGxlZ2F0aSBzZSBxdWVzdG8gaGVhZGVyIMOoIHVuIGdydXBwbywgZG9wb2RpY2jDqSBhZ2dpb3JuYSBsJ2VzLXRhYmxlIFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBPckhlYWRlciBIZWFkZXIgZGkgY3VpIHNldHRhcmUgbGEgdmlzaWJpbGl0w6BcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmlzaWJpbGl0eSBWaXNpYmlsaXTDoCBkYSBpbXBvc3RhcmVcclxuICAgICAqKi9cclxuICAgIHB1YmxpYyBzZXRIZWFkZXJWaXNpYmlsaXR5KGdyb3VwT3JIZWFkZXI6IHN0cmluZywgdmlzaWJpbGl0eTogYm9vbGVhbiwgcmVmcmVzaDogYm9vbGVhbiA9IHRydWUsIHJlbGF1bmNoU2VhcmNoOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIGxldCBncm91cE9ySGVhZCA9IHRoaXMudGhzQ2FjaGVbZ3JvdXBPckhlYWRlcl07XHJcbiAgICAgICAgaWYgKCFncm91cE9ySGVhZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBncm91cE9ySGVhZC50aFZpc2libGUgPSB2aXNpYmlsaXR5O1xyXG5cclxuICAgICAgICBsZXQgdGhzQXJyID0gdGhpcy5Fc1Roc0RpcmVjdGl2ZS50b0FycmF5KCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHNBcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoID0gdGhzQXJyW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoLnRoUGFyZW50ID09IGdyb3VwT3JIZWFkZXIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclZpc2liaWxpdHkodGgudGgsIHZpc2liaWxpdHksIGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZWZyZXNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXNlTG9jYWxWaXNpYmlsaXR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5mb3JjZVJlZnJlc2gocmVsYXVuY2hTZWFyY2gpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bnppb25lIGNoZSBpbiBiYXNlIGFpIGNsaWNrIHN1IHVuYSBjZWxsYSBjYXBpc2NlIHNlIHN0byBlZmZldHR1YW5kbyB1bidvcGVyYXppb25lIGRpIHNlbGV6aW9uZSBvIHNlIHN0byBlbnRyYW5kbyBuZWxsJ2VkaXQgZGkgdW5hIGNlbGxhIGNvbiB1biBkb3BwaW8gY2xpY2tcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9ICRldmVudCBFdmVudG8gbmF0aXZvIGphdmFzY3JpcHRcclxuICAgICAqIEBwYXJhbSB7VGRFbGVtZW50fSByb3dJdGVtIFJpZmVyaW1lbnRvIGEgYmluZGVyIGRlbGxhIHJpZ2FcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIEl0ZW0gY2hlIHJhcHByZXNlbnRhIGlsIGNvbnRlc3RvIHN1IGN1aSDDqCBzdGF0byBlZmZldHR1YXRvIHVuIGNsaWNrXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkYkNsaWNrRWRpdE9yU2luZ2xlQ2xpY2tSb3dTZWxlY3Rpb24oJGV2ZW50OiBNb3VzZUV2ZW50LCByb3dJdGVtOiBUZEVsZW1lbnQsIGl0ZW06IGFueSkge1xyXG5cclxuICAgICAgICAvLyBQcmltYSBjb3NhIGRhIGZhcmUgw6ggY29udHJvbGxhcmUgc2UgY2kgc29ubyBkZWkgcmFuZ2UgbGFzY2lhdGkgZGEgb3BlcmF6aW9uaSBwcmVjZWRlbnRpIChzZSBhcHBsaWNhYmlsZSkgZSByaXB1bGlybGlcclxuICAgICAgICBpZiAodGhpcy5yYW5nZVNlbGVjdGVkICYmICEkZXZlbnQuY3RybEtleSAmJiB0aGlzLlNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJjbGVhcmluZyBwcmV2aW91c2x5IHNlbGVjdGVkIHJhbmdlXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG4gICAgICAgICAgICB0aGlzLnJhbmdlU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTW9kYWxpdMOgIEVkaXRhYmxlLCBnZXN0aXNjbyBpIGRvcHBpIGNsaWNrIHNlbnphIHBlcsOyIHJhbGxlbnRhcmUgbGEgbW9kYWxpdMOgIGRpIHNlbGV6aW9uZSBhIHJhbmdlXHJcbiAgICAgICAgaWYgKHRoaXMuRWRpdGFibGUpIHtcclxuICAgICAgICAgICAgLy8gU2Vjb25kbyBjbGljazogc2UgaWwgdGltZXIgbm9uIMOoIHNjYWR1dG8gw6ggdW4gZG9wcGlvIGNsaWNrIGVkIGVzZWd1byBpbCByZXN0b1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jZWxsRGJDbGlja1RpbWVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJoYW5kbGluZyBkb3VibGVjbGljayBvbiBlZGl0YWJsZSBjZWxsOiBcIiArIChyb3dJdGVtLlByb3BlcnR5TmFtZSA/ICdlZGl0IG1vZGUgZm9yIHByb3BlcnR5ICcgKyByb3dJdGVtLlByb3BlcnR5TmFtZSA6ICdubyBwcm9wZXJ0eSBzZXQsIGZhbGxiYWNrIHRvIHNpbXBsZSBjbGljaycpKTtcclxuICAgICAgICAgICAgICAgIGlmIChyb3dJdGVtLlByb3BlcnR5TmFtZSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHVwVXNlckVkaXQocm93SXRlbSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSb3dDbGljaygkZXZlbnQsIGl0ZW0sIHRoaXMuU2VsZWN0aW9uLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJDZWxsQ2xpY2tUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gUHJpbW8gY2xpY2s6IG5vbiBmYSBuaWVudGUgZSBzZSBpbCB0ZW1wbyBwZXIgaWwgc2Vjb25kbyBjbGljayBzY2FkZSByZXNldHRhIHR1dHRvXHJcbiAgICAgICAgICAgIHRoaXMuY2VsbERiQ2xpY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckNlbGxDbGlja1RpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuUmFuZ2VTZWxlY3Rpb24gfHwgIXRoaXMubW91c2VJc0Rvd24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJ0aW1lJ3MgdXAgZm9yIHNlY29uZCBjbGljaywgaGFuZGxpbmcgc2luZ2xlIGNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUm93Q2xpY2soJGV2ZW50LCBpdGVtLCB0aGlzLlNlbGVjdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIHRoaXMuZG91YmxlQ2xpY2tCdWZmZXJNcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJbiBtb2RhbGl0w6AgYSByYW5nZSBsYSBjcmVhemlvbmUgZGVsIHJhbmdlIMOoIGdlc3RpdGEgZGFpIG1vdXNlZG93biwgbW92ZSBlZCB1cC4uLlxyXG4gICAgICAgIC8vIExhIHNlbGV6aW9uZSBkZWxsZSByaWdoZSBpbnZlY2Ugw6ggZ2VzdGl0YSBkYWxsZSBjYXNlbGxpbmUgYSBzaW5pc3RyYVxyXG4gICAgICAgIGlmICh0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFNlIGhvIGZhdHRvIGNsaWNrIGNvbCBjb250cm9sIGF0dGFjY2F0byBlc2NvIHN1Yml0byBkYXRvIGNoZSBkZXZlIHNvbG8gcGVybWV0dGVyZSBsYSBuYXZpZ2F6aW9uZSBkZWkgbGlua1xyXG4gICAgICAgIGlmICgkZXZlbnQuY3RybEtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBUdXR0aSBpIGNsaWNrIHN1IHVuYSBjZWxsYSBnacOgIGluIGVkaXQgbm9uIGRldm9ubyBlZmZldHR1YXJlIGxhIHNlbGV6aW9uZSBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCg8YW55PnJvd0l0ZW0pLl9lZGl0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFBlciBldml0YXJlIGRpIHJhbGxlbnRhcmUgYSBwcmVzY2luZGVyZVxyXG4gICAgICAgIGlmICghdGhpcy5FZGl0YWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJvd0NsaWNrKCRldmVudCwgaXRlbSwgdGhpcy5TZWxlY3Rpb24sIHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFdmVudG8gY2hlIGdlc3Rpc2NlIGlsIGNvbWFuZG8gXCJDb3BpYVwiIGJ1dHRhbmRvIGkgdmFsb3JpIHNlbGV6aW9uYXRpIG5lbGxhIGNsaXBib2FyZCBpbiBiYXNlIGFsIGxvcm8gdGlwbyAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVDb3B5KCkge1xyXG4gICAgICAgIGlmKCF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGV0IHNlbCA9IHRoaXMuc2VsZWN0aW9uX0guZ2V0U2VsZWN0aW9uU3RhdHVzU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbC5sZW5ndGggPiAwICYmIHNlbFswXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb25UZXh0ID0gdGhpcy5zZWxlY3Rpb25fSC5nZXRDbGlwYmFyZFRleHRGcm9tU2VsZWN0aW9uKHNlbCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkU2VydmljZS5jb3B5VGV4dFRvQ2xpcGJvYXJkKHNlbGVjdGlvblRleHQpO1xyXG4gICAgICAgICAgICB0aGlzLm1zZ0V4dHMuc2ltcGxlSW5mbyh0aGlzLmxjLmxvYyhcIlZhbHVlcyBjb3BpZWQgaW4gdGhlIGNsaXBib2FyZFwiKSwgXCJ0b2FzdHJcIiwgMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFdmVudG8gY2hlIGdlc3Rpc2NlIGlsIGNvbWFuZG8gXCJJbmNvbGxhXCIgcHJlbmRlbmRvIGkgZGF0aSBkZWxsYSBjbGlwYm9hcmQgZSBhcHBsaWNhbmRvbGkgYWwgcmFuZ2UgZGkgc2VsZXppb25lIGF0dHVhbGUgaW4gYmFzZSBhbCB0aXBvIGRlbGxlIGNlbGxlIHNvdHRvICovXHJcbiAgICBoYW5kbGVQYXN0ZSgpIHtcclxuICAgICAgICBpZighdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxldCBzZWwgPSB0aGlzLnNlbGVjdGlvbl9ILmdldFNlbGVjdGlvblN0YXR1c1NlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWwubGVuZ3RoID4gMCAmJiBzZWxbMF0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsaXBib2FyZFNlcnZpY2UuZ2V0Q2xpcGJvYXJkKFwibWF0cml4XCIsICh2YWx1ZXM6IHN0cmluZ1tdW10pID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEZpeCBjbGlwYm9hcmQgc2VydmljZSBjaGUgcGFyZSB1biBwbycgc3Ryb256YSwgcmltdW92byBsJ3VsdGltbyBhcnJheSBzZSBtaSBhY2NvcmdvIGNoZSDDqCB1biBzaW5nb2xvIGFycmF5IGNvbiB1biBzb2xvIGVsZW1lbnRvIHZ1b3RvXHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDAgJiYgdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXS5sZW5ndGggPT0gMSAmJiB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdWzBdID09ICcnKVxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5zcGxpY2UodmFsdWVzLmxlbmd0aCAtIDEsIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCAmJiB2YWx1ZXNbMF0ubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBzZSBsYSBtb2RpZmljYSDDqCBhYmlsaXRhdGFcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuRWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tc2dFeHRzLnNpbXBsZVdhcm5pbmcodGhpcy5sYy5sb2MoXCJEYXRhIGZvciB0aGlzIHRhYmxlIGNhbm5vdCBiZSBlZGl0ZWRcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBDb250cm9sbG8gY2hlIHF1ZWxsbyBjaGUgc3RvIGNvcGlhbmRvIHNpYSBkZWxsYSBzdGVzc2EgZGltZW5zaW9uZSBkZWxsYSBzZWxlemlvbmUgc3VsbCdlcy10YWJsZSwgdHJhbm5lIG5lbCBjYXNvIGhvIHVuIHNpbmdvbG8gdmFsb3JlIGRhIGNvcGlhcmVcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKHNlbC5sZW5ndGggIT0gdmFsdWVzLmxlbmd0aCB8fCBzZWxbMF0ubGVuZ3RoICE9IHZhbHVlc1swXS5sZW5ndGgpICYmICh2YWx1ZXMubGVuZ3RoICE9IDEgfHwgdmFsdWVzWzBdLmxlbmd0aCAhPSAxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1zZ0V4dHMuc2ltcGxlV2FybmluZyh0aGlzLmxjLmxvYyhcIlNpemUgb2YgY29waWVkIGRhdGEgaXMgZGlmZmVyZW50IGZyb20gdGhlIHNpemUgb2YgdGhlIHNlbGVjdGlvblwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlIGxlIGRpbWVuc2lvbmkgY29pbmNpZG9ubyBjb3BpbyBkYSB1bmEgcGFydGUgYWxsJ2FsdHJhXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoYW5nZXM6IEVzVGFibGVNb2RlbENoYW5nZVtdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBzZWwubGVuZ3RoOyByKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IHNlbFtyXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCByb3cubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjZWxsID0gcm93W2NdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2UgaG8gdW4gc2luZ29sbyB2YWxvcmUgbG8gYXBwbGljbyBhIHR1dHRhIGxhIHNlbGV6aW9uZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdmFsdWVzLmxlbmd0aCA9PSAxICYmIHZhbHVlc1swXS5sZW5ndGggPT0gMSA/IHZhbHVlc1swXVswXSA6IHZhbHVlc1tyXVtjXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9sZCA9IGNlbGwudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbml1ID0gY2VsbC52YWxfc2V0dGVyKHZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2xkZGF0ZSA9IHRoaXMuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24ob2xkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuaXVkYXRlID0gdGhpcy5kYXRlRXh0cy5nZXREYXRlQ29udmVydGlvbihuaXUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChvbGRkYXRlICYmIG5pdWRhdGUgJiYgb2xkZGF0ZS5pc1NhbWUgJiYgb2xkZGF0ZS5pc1NhbWUobml1ZGF0ZSkpIHx8IG9sZCA9PT0gbml1KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChuZXcgRXNUYWJsZU1vZGVsQ2hhbmdlKGNlbGwuaXRlbSwgY2VsbC5oZWFkZXIsIGNlbGwucHJvcGVydHksIG9sZCwgbml1KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Nb2RlbENoYW5nZS5lbWl0KGNoYW5nZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJpcHVsaXNjZSBpbCB0aW1lciB1dGlsaXp6YXRvIHBlciBjYXBpcmUgc2Ugw6ggc3RhdG8gZWZmZXR0dWF0byB1biBkb3BwaW8gY2xpY2sgbyBtZW5vICovXHJcbiAgICBwcml2YXRlIGNsZWFyQ2VsbENsaWNrVGltZXIoKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2VsbERiQ2xpY2tUaW1lcilcclxuICAgICAgICB0aGlzLmNlbGxEYkNsaWNrVGltZXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlciBjbGljayBzaW5nb2xvIHN1IHVuYSByaWdhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSAkZXZlbnQgRXZlbnRvIG5hdGl2byBqYXZhc2NyaXB0XHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBJdGVtIGNoZSByYXBwcmVzZW50YSBpbCBjb250ZXN0byBzdSBjdWkgw6ggc3RhdG8gZWZmZXR0dWF0byB1biBjbGlja1xyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzZWxlY3Rpb24gSW5kaWNhIHNlIGxhIHNlbGV6aW9uZSDDqCBhdHRpdmFcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW50ZXJuYWxDYWxsIEluZGljYSBzZSBsYSBjaGlhbWF0YSBhIHF1ZXN0YSBmdW56aW9uZSDDqCBpbnRlcm5hOiBwZXJtZXR0ZSBkaSBza2lwcGFyZSBpIGNoZWNrIHN1bGxlIEN1c3RvbUNlbGxzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYW5kbGVSb3dDbGljaygkZXZlbnQ6IGFueSwgaXRlbTogYW55LCBzZWxlY3Rpb246IGJvb2xlYW4sIGludGVybmFsQ2FsbDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgLy8gU2UgaG8gdW4gY3RybCBwcmVtdXRvIGVzY28gY29uIHRydWUgaW4gbW9kbyBkYSBmYXJlIGJ1YmJsaW5nIGRlbGwnZXZlbnRvIGUgbGFzY2lhcmxvIGdlc3RpcmUgYWwgYnJvd3NlciAobGluayBlY2MuLi4pXHJcbiAgICAgICAgLy8gU3Rlc3NhIGNvc2Egc2UgaG8gY3VzdG9tIGNlbGwgZGF0byBjaGUgbGEgZ2VzdGlvbmUgZGVpIGNsaWNrIHZpZW5lIGFmZmlkYXRhIGFpIHNpbmdvbGkgVERcclxuICAgICAgICBpZiAoJGV2ZW50LmN0cmxLZXkgfHwgKHRoaXMuVXNlQ3VzdG9tQ2VsbHMgJiYgIWludGVybmFsQ2FsbCkpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmICFpdGVtLmxvY2tlZCAmJiAhaXRlbS5fc2VwICYmICFpdGVtLl9ncm91cClcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVDbGljaygkZXZlbnQsIGl0ZW0pO1xyXG4gICAgICAgIGVsc2UgaWYgKGl0ZW0uX2dyb3VwKVxyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUdyb3VwQ2xpY2soaXRlbSk7XHJcblxyXG4gICAgICAgIC8vIE9yYSBjaGUgbm9uIMOoIGF0dGFjY2F0byBkaXJldHRhbWVudGUgYWxsJ2h0bWwgZGV2byBmYXJlIHVuIG1hcmtmb3JjaGVjayBmaW5pdGUgbGUgb3BlcmF6aW9uaSBzdWkgZ3JvdXBpbmdcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlc3Rpb25lIGRlbCBjbGljayBkZXN0cm8gc3VsbCdlcy10YWJsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25SaWdodENsaWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLlNlbGVjdGlvbilcclxuICAgICAgICAgICAgdGhpcy5vbk9wZW5Db250ZXh0TWVudS5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMYSBtb2RpZmljYSBkZWxsJ3V0ZW50ZSDDqCBpbml6aWF0YS4gU2kgaW1wb3N0YSBsYSB2YXJpYWJpbGUgcmVsYXRpdmEgYSBcInRydWVcIiBpbiBtb2RvIGRhIG1vc3RyYXJlIGwnaW5wdXQgZGkgdGVzdG9cclxuICAgICAqIFxyXG4gICAgICogRG9wbyBjaGUgbCdpbnB1dCDDqCBhcHBhcnNvLCBkb3BvIHVuIGNpY2xvIGRpIENoYW5nZSBEZXRlY3Rpb24gdmllbmUgYXR0aXZhdG8gaWwgU3ViamVjdCBjb2xsZWdhdG8gYWxsJ2lucHV0IGNoZSBzZXJ2aXLDoCBhIGVmZmV0dHVhcmUgaWwgZm9jdXNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtUZEVsZW1lbnR9IHJvd0l0ZW0gRWxlbWVudG8gZGkgcmlnYSBzdSBjdWkgw6ggc3RhdGEgYXR0aXZhdGEgbGEgbW9kaWZpY2FcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gc29wcmEgaWwgcXVhbGUgw6ggc3RhdGEgYXR0aXZhdGEgbGEgbW9kaWZpY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldHVwVXNlckVkaXQocm93SXRlbTogVGRFbGVtZW50LCBpdGVtOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG4gICAgICAgIGlmICh0aGlzLkVkaXRhYmxlICYmIHJvd0l0ZW0uUHJvcGVydHlOYW1lKSB7XHJcbiAgICAgICAgICAgIGxldCBkeW5Nb2RlID0gdGhpcy5EeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb24/Lmxlbmd0aCA+IDA7XHJcbiAgICAgICAgICAgICg8YW55PnJvd0l0ZW0pLl9lZGl0aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgKDxhbnk+cm93SXRlbSkub2xkX3ZhbHVlID0gZHluTW9kZSA/IGl0ZW0ucHJvcGVydGllc1tyb3dJdGVtLlByb3BlcnR5TmFtZV0gOiBpdGVtW3Jvd0l0ZW0uUHJvcGVydHlOYW1lXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5Gb2N1c1N1YmplY3QubmV4dCgpOyB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExhIG1vZGlmaWNhIGRlbGwndXRlbnRlIMOoIHRlcm1pbmF0YS4gU2kgcmVpbXBvc3RhIGxhIHZhcmlhYmlsZSByZWxhdGl2YSBhIFwiZmFsc2VcIiBpbiBtb2RvIGRhIG5hc2NvbmRlcmUgbCdpbnB1dCBkaSB0ZXN0byBlIHNpIGVtZXR0ZSBsYSBtb2RpZmljYSBkZWwgdmFsb3JlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7VGRFbGVtZW50fSByb3dJdGVtIEVsZW1lbnRvIGRpIHJpZ2Egc3UgY3VpIMOoIHN0YXRhIGF0dGl2YXRhIGxhIG1vZGlmaWNhXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIHNvcHJhIGlsIHF1YWxlIMOoIHN0YXRhIGF0dGl2YXRhIGxhIG1vZGlmaWNhXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sdW1uSW5kZXggSW5kaWNlIGRlbGxhIGNvbG9ubmEgc3UgY3VpIMOoIGF2dmVudXRhIGxhIG1vZGlmaWNhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaW5hbGl6ZVVzZXJFZGl0KHJvd0l0ZW06IFRkRWxlbWVudCwgaXRlbTogYW55LCBjb2x1bW5JbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGR5bk1vZGUgPSB0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbj8ubGVuZ3RoID4gMDtcclxuICAgICAgICBsZXQgcm93SXRtID0gPGFueT5yb3dJdGVtO1xyXG4gICAgICAgIHJvd0l0bS5fZWRpdGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgb2xkID0gcm93SXRtLm9sZF92YWx1ZTtcclxuICAgICAgICBsZXQgbml1ID0gZHluTW9kZSA/IGl0ZW0ucHJvcGVydGllc1tyb3dJdGVtLlByb3BlcnR5TmFtZV0gOiBpdGVtW3Jvd0l0ZW0uUHJvcGVydHlOYW1lXTtcclxuXHJcbiAgICAgICAgbGV0IG9sZGRhdGUgPSB0aGlzLmRhdGVFeHRzLmdldERhdGVDb252ZXJ0aW9uKG9sZCk7XHJcbiAgICAgICAgbGV0IG5pdWRhdGUgPSB0aGlzLmRhdGVFeHRzLmdldERhdGVDb252ZXJ0aW9uKG5pdSk7XHJcbiAgICAgICAgaWYgKChvbGRkYXRlICYmIG5pdWRhdGUgJiYgb2xkZGF0ZS5pc1NhbWUgJiYgb2xkZGF0ZS5pc1NhbWUobml1ZGF0ZSkpIHx8IG9sZCA9PT0gbml1KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZS5lbWl0KFtuZXcgRXNUYWJsZU1vZGVsQ2hhbmdlKGl0ZW0sIHJvd0l0ZW0uSUQsIHJvd0l0ZW0uUHJvcGVydHlOYW1lLCBvbGQsIG5pdSldKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXR1c1tpdGVtLl9vcmRpbmFsXVtjb2x1bW5JbmRleF0udmFsX3NldHRlcihuaXUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJhbmdlIHNlbGVjdGlvbiBFeHBlcmltZW50YWxzXHJcblxyXG4gICAgcHJpdmF0ZSBtb3VzZUlzRG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSByYW5nZVNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIHJhbmdlU3RhcnRXYXNJZ25vcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGZpcnN0Q29vcmRpbmF0ZXM6IHtyb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXJ9ID0gbnVsbDtcclxuXHJcbiAgICBtb3VzZWRvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIHJvd0l0ZW06IGFueSwgXzogYW55KSB7XHJcblxyXG4gICAgICAgIC8vIFRhc3RvIGRpdmVyc28gZGFsIGNsaWNrIHNpbmlzdHJvIC0+IGNpYW8gw6ggc3RhdG8gYmVsbG8gZSBpbnRlbnNvXHJcbiAgICAgICAgaWYoZXZlbnQuYnV0dG9ucyAhPSAxIHx8ICF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFN0byBsYXZvcmFuZG8gc3UgUVVFU1RBIGVzLXRhYmxlXHJcbiAgICAgICAgdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5BY3RpdmVFc3RSZWZlcmVuY2UgPSB0aGlzO1xyXG5cclxuICAgICAgICAvLyBUdXR0aSBpIGNsaWNrIHN1IHVuYSBjZWxsYSBnacOgIGluIGVkaXQgbm9uIGRldm9ubyBlZmZldHR1YXJlIGxhIHNlbGV6aW9uZSBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCg8YW55PnJvd0l0ZW0pLl9lZGl0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMubW91c2VJc0Rvd24gPSB0cnVlO1xyXG5cclxuICAgICAgICBsZXQgY29vcmRzID0gKDxIVE1MRWxlbWVudD5ldmVudC5jdXJyZW50VGFyZ2V0KS5pZC5zcGxpdCgnXycpO1xyXG4gICAgICAgIGxldCByb3cgPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDJdKTtcclxuICAgICAgICBsZXQgY29sdW1uID0gcGFyc2VJbnQoY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAxXSk7XHJcbiAgICAgICAgdGhpcy5maXJzdENvb3JkaW5hdGVzID0geyByb3csIGNvbHVtbiB9O1xyXG4gICAgICAgIC8vIFNlIGhvIGdpw6AgdW4gcmFuZ2UgZGkgc2VsZXppb25lIGlnbm9ybyB0ZW1wb3JhbmVtYWVudGUgcXVlc3RhIHNlbGV6aW9uZSBpbiBtb2RvIGRhIGNhcGlyZSBiZW5lIGNvc2EgZGV2byBmYXJlIGRvcG8gKGNsaWNrIHN1bGxhIHJpZ2EgLyBhbHRyYSBzZWxlemlvbmUpXHJcbiAgICAgICAgLy8gZSBnZXN0aXJlIGxhIGdyYWZpY2EgaW4gbWFuaWVyYSB1biBwbycgcGnDuSBwcmVjaXNhXHJcbiAgICAgICAgaWYgKCF0aGlzLnJhbmdlU2VsZWN0ZWQgfHwgKGV2ZW50LmN0cmxLZXkgfHwgIXRoaXMuU2VsZWN0aW9uKSlcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5zaW5nbGVDZWxsU2VsZWN0aW9uKHsgdmlldzogZXZlbnQudmlldywgcmFuZ2U6IGZhbHNlIH0sIHJvdywgY29sdW1uKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdGFydFdhc0lnbm9yZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhgbW91c2UgZG93biBvbiAke3Jvd306JHtjb2x1bW59YCk7XHJcbiAgICB9XHJcblxyXG4gICAgbW91c2VlbnRlcihldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmKCF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGlmIChldmVudC5idXR0b25zID09IDApXHJcbiAgICAgICAgICAgIHRoaXMubW91c2VJc0Rvd24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubW91c2VJc0Rvd24gJiYgdGhpcy5maXJzdENvb3JkaW5hdGVzKSB7XHJcbiAgICAgICAgICAgIGxldCBpZCA9ICg8SFRNTEVsZW1lbnQ+ZXZlbnQuY3VycmVudFRhcmdldCkuaWQ7XHJcbiAgICAgICAgICAgIGxldCBjb29yZHMgPSBpZC5zcGxpdCgnXycpO1xyXG4gICAgICAgICAgICBsZXQgcm93ID0gcGFyc2VJbnQoY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAyXSk7XHJcbiAgICAgICAgICAgIGxldCBjb2x1bW4gPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDFdKTtcclxuICAgICAgICAgICAgLy8gU2UgaG8gaWdub3JhdG8gbCdpbml6aW8gZGVsbGEgc2VsZXppb25lIG5lbCBtb3VzZWRvd24gbG8gcmVjdXBlcm8gcXVpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJhbmdlU3RhcnRXYXNJZ25vcmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILnNpbmdsZUNlbGxTZWxlY3Rpb24oeyB2aWV3OiBldmVudC52aWV3LCByYW5nZTogZmFsc2UgfSwgdGhpcy5maXJzdENvb3JkaW5hdGVzLnJvdywgdGhpcy5maXJzdENvb3JkaW5hdGVzLmNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJhbmdlU3RhcnRXYXNJZ25vcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5zaW5nbGVDZWxsU2VsZWN0aW9uKHsgdmlldzogZXZlbnQudmlldywgcmFuZ2U6IHRydWUgfSwgcm93LCBjb2x1bW4sIHRoaXMuZmlyc3RDb29yZGluYXRlcyk7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhgbW91c2UgbW92ZSBvdmVyICR7cm93fToke2NvbHVtbn1gKTtcclxuICAgICAgICAgICAgdGhpcy5yYW5nZVNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbW91c2V1cChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmICghdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgaWQgPSAoPEhUTUxFbGVtZW50PmV2ZW50LmN1cnJlbnRUYXJnZXQpLmlkO1xyXG4gICAgICAgIGxldCBjb29yZHMgPSBpZC5zcGxpdCgnXycpO1xyXG4gICAgICAgIGxldCByb3cgPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDJdKTtcclxuICAgICAgICBsZXQgY29sdW1uID0gcGFyc2VJbnQoY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAxXSk7XHJcblxyXG4gICAgICAgIC8vIFNlIGlsIG1vdXNldXAgdmllbmUgZWZmZXR0dWF0byBzdWxsYSBzdGVzc2EgY2VsbGEgZGVsIHByaW1vIG1vdXNlZG93biBlIHNpYW1vIGluIG1vZGFsaXTDoCBkaSBzZWxlemlvbmUgZGVzZWxlemlvbm8gbGEgY2VsbGEgcGVyY2jDqSDDqCB1biBzZW1wbGljZSBjbGlja1xyXG4gICAgICAgIGlmICh0aGlzLm1vdXNlSXNEb3duICYmIHRoaXMuZmlyc3RDb29yZGluYXRlcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maXJzdENvb3JkaW5hdGVzLnJvdyA9PSByb3cgJiYgdGhpcy5maXJzdENvb3JkaW5hdGVzLmNvbHVtbiA9PSBjb2x1bW4gJiYgIWV2ZW50LmN0cmxLZXkgJiYgIXRoaXMucmFuZ2VTdGFydFdhc0lnbm9yZWQgJiYgdGhpcy5TZWxlY3Rpb24pXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILnNpbmdsZUNlbGxTZWxlY3Rpb24oeyB2aWV3OiBldmVudC52aWV3LCByYW5nZTogZmFsc2UgfSwgcm93LCBjb2x1bW4pO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChldmVudC5jdHJsS2V5IHx8ICF0aGlzLlNlbGVjdGlvbilcclxuICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VTZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vdXNlSXNEb3duID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKGBtb3VzZSBsaWZ0ZWQgdXBgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyogUGlhbmdvXHJcbiAgICBwcml2YXRlIEVzVGRzQ2FjaGU6IHsgW2lkOiBzdHJpbmddOiBFc1RkIH0gPSB7fTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2VsbFJlZmVyZW5jZShvYmplY3Q6IGFueSwgY29sdW1uOiBzdHJpbmcpOiBFc1RkIHtcclxuICAgICAgICBsZXQgZmtUaGlzU2hpdEltT3V0ID0gdGhpcy51dGlFeHRzLmRlZXBDbG9uZShvYmplY3QpO1xyXG4gICAgICAgIHRoaXMudXRpbGl0aWVzX0guY2FsY3VsYXRlSGFzaChbZmtUaGlzU2hpdEltT3V0XSk7XHJcbiAgICAgICAgbGV0IHByb3AgPSBjb2x1bW47XHJcbiAgICAgICAgbGV0IGhhc2ggPSBma1RoaXNTaGl0SW1PdXQuX2hhc2g7XHJcblxyXG4gICAgICAgIGxldCB0b1JldCA9IHRoaXMuRXNUZHNDYWNoZVtgJHtwcm9wfV8ke2hhc2h9YF07XHJcbiAgICAgICAgcmV0dXJuIHRvUmV0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWdpc3RlckNlbGwoZXZlbnQ6IEVzVGRSZWZlcmVuY2UpIHtcclxuICAgICAgICB0aGlzLkVzVGRzQ2FjaGVbYCR7ZXZlbnQuaWR9XyR7ZXZlbnQuaGFzaH1gXSA9IGV2ZW50LnNlbGZcclxuICAgIH1cclxuICAgIC8vKiBQaWFuZ28gYW5jb3JhXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBFc1RkUmVmZXJlbmNlIHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBoYXNoOiBzdHJpbmc7IFxyXG4gICAgc2VsZjogRXNUZDtcclxufSJdfQ==
|
|
1750
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNfdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL2VzLXRhYmxlL2VzX3RhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsVUFBVTtBQUNWLE9BQU8sRUFDSCxTQUFTLEVBQUUsZUFBZSxFQUFhLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFDeEYsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLFNBQVMsRUFBYyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFlLE1BQU0sRUFDOUksTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRSxpQkFBaUI7QUFDakIsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBYyxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hJLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSzNELGlCQUFpQjtBQUNqQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFTdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUVqRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFL0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFJbkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFN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QUFLOytCQUVMLEtBQUs7MEJBRUwsS0FBSztxQ0FFTCxLQUFLO2lDQUVMLEtBQUs7Z0NBRUwsS0FBSztvQ0FFTCxLQUFLO3VCQUVMLEtBQUs7NkJBRUwsS0FBSzs2QkFFTCxLQUFLOzZCQUVMLE1BQU07OEJBV04sTUFBTTtpQ0FFTixNQUFNO3dCQUVOLE1BQU07NkJBRU4sTUFBTTs0QkFFTixNQUFNO2dDQUVOLE1BQU07NkJBR04sTUFBTTtpQ0FFTixNQUFNOytCQU9OLFNBQVMsU0FBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7NkJBRS9DLFNBQVMsU0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO29DQVV2QyxLQUFLOztBQTYrQ1YsTUFBTSxPQUFPLGFBQWE7Q0FJekIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgUXVlcnlMaXN0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIElucHV0LFxyXG4gICAgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIENvbnRlbnRDaGlsZCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIFZpZXdFbmNhcHN1bGF0aW9uLCBPcHRpb25hbCwgU2VsZiwgVGVtcGxhdGVSZWYsIEluamVjdFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuLy8gQ29uZmlndXJhemlvbmlcclxuaW1wb3J0IHsgVXRpbGl0eVNlcnZpY2UsIEV4cG9ydFNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlLCBEYXRlU2VydmljZSwgQ3N2SGVhZGVycywgQ2xpcGJvYXJkU2VydmljZSB9IGZyb20gJ0Blc2ZhZW56YS9leHRlbnNpb25zJztcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gJ0Blc2ZhZW56YS9sb2NhbGl6YXRpb25zJztcclxuaW1wb3J0IHsgUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnQGVzZmFlbnphL3ByZWZlcmVuY2VzJztcclxuXHJcbi8vIFBsdWdpbnNcclxuaW1wb3J0IHsgQ29udGV4dE1lbnVDb21wb25lbnQgfSBmcm9tICdAZXNmYWVuemEvbmd4LWNvbnRleHRtZW51JztcclxuXHJcbi8vIE1vZGVsbGkgLyBUaXBpXHJcbmltcG9ydCB7IEFwcFNlYXJjaCB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9BcHBTZWFyY2hcIjtcclxuaW1wb3J0IHsgQXBwT3JkZXJpbmcgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvQXBwT3JkZXJpbmdcIjtcclxuaW1wb3J0IHsgRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uXCI7XHJcbmltcG9ydCB7IENvcm5lck1lbnVPcHRpb24gfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9Db3JuZXJNZW51T3B0aW9uXCI7XHJcbmltcG9ydCB7IEVzVGFibGVPcGVyYXRpb25EZWZpbml0aW9uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvRXNUYWJsZU9wZXJhdGlvbkRlZmluaXRpb25cIjtcclxuaW1wb3J0IHsgRXNUYWJsZUNvbHVtbiB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL0VzVGFibGVDb2x1bW5cIjtcclxuaW1wb3J0IHsgR3JvdXBQYWdlciB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL0dyb3VwUGFnZXJcIjtcclxuaW1wb3J0IHsgR3JvdXBSb3V0ZUZyYWdtZW50IH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvR3JvdXBSb3V0ZUZyYWdtZW50XCI7XHJcbmltcG9ydCB7IFRoRWxlbWVudCB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL1RoRWxlbWVudFwiO1xyXG5pbXBvcnQgeyBQYWdlckluZm9zIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvUGFnZXJJbmZvc1wiO1xyXG5pbXBvcnQgeyBUaEdyb3VwIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvVGhHcm91cFwiO1xyXG5pbXBvcnQgeyBUZEVsZW1lbnQgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9UZEVsZW1lbnRcIjtcclxuaW1wb3J0IHsgSXRlbXNTZWxlY3Rpb24gfSBmcm9tICcuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9JdGVtc1NlbGVjdGlvbic7XHJcbmltcG9ydCB7IEdyb3VwT3JBZ2dyZWdhdGlvbiB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9Hcm91cE9yQWdncmVnYXRpb25cIjtcclxuaW1wb3J0IHsgR3JvdXBGaWx0ZXIgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvR3JvdXBGaWx0ZXJcIjtcclxuaW1wb3J0IHsgR3JvdXAgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvR3JvdXBcIjtcclxuaW1wb3J0IHsgRXNUYWJsZU1vZGVsQ2hhbmdlIH0gZnJvbSAnLi4vLi4vZG9tYWluL2V4dGVybmFscy9Fc1RhYmxlTW9kZWxDaGFuZ2UnO1xyXG5pbXBvcnQgeyBJdGVtUHJvcEVkaXRhYmxlUmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vZG9tYWluL2V4dGVybmFscy9JdGVtUHJvcEVkaXRhYmxlUmVmZXJlbmNlJztcclxuaW1wb3J0IHsgRXNUYWJsZURlZmF1bHRhYmxlIH0gZnJvbSAnLi4vLi4vZG9tYWluL2NvbmZpZ3VyYXRpb24vRXNUYWJsZURlZmF1bHRhYmxlJztcclxuXHJcbi8vIENvbXBvbmVudGkgZSBMb2NhbGl6emF6aW9uZVxyXG5pbXBvcnQgeyBFc1RkIH0gZnJvbSAnLi4vZXMtdGQvZXNfdGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRXNUZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZXNfdGQuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgRXNUaERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZXNfdGguZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgRXNUZEVkaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZXNfdGRfZWRpdG9yLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IElFc1RhYmxlVGVtcGxhdGVXcmFwcGVyIH0gZnJvbSAnLi4vZXMtdGFibGUtdGVtcGxhdGUvZXNfdGFibGVfdGVtcGxhdGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRXNUYWJsZUxvYyB9IGZyb20gJy4vZXNfdGFibGUuY29tcG9uZW50LmxvYyc7XHJcblxyXG4vLyBUb2tlbnNcclxuaW1wb3J0IHsgRVNUX0RFRkFVTFRTLCBFU1RfTE9DQUxFIH0gZnJvbSAnLi4vLi4vdG9rZW5zJztcclxuXHJcbi8vIEhhbmRsZXJzXHJcbmltcG9ydCB7IEV4cG9ydEhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9FeHBvcnRIYW5kbGVyXCI7XHJcbmltcG9ydCB7IENvbHVtbk1ldGFkYXRhSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL0NvbHVtbk1ldGFkYXRhSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBEeW5hbWljTW9kZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9EeW5hbWljTW9kZUhhbmRsZXJcIjtcclxuaW1wb3J0IHsgSGllcmFyY2h5TW9kZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9IaWVyYXJjaHlNb2RlSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBJdGVtc0hhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9JdGVtc0hhbmRsZXJcIjtcclxuaW1wb3J0IHsgUmVwb3J0TW9kZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9SZXBvcnRNb2RlSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBSb3dHcm91cGluZ0hhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9Sb3dHcm91cGluZ0hhbmRsZXJcIjtcclxuaW1wb3J0IHsgU2VsZWN0aW9uSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL1NlbGVjdGlvbkhhbmRsZXJcIjtcclxuaW1wb3J0IHsgVXRpbGl0aWVzSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL1V0aWxpdGllc0hhbmRsZXJcIjtcclxuXHJcbi8vIFNlcnZpY2VcclxuaW1wb3J0IHsgQ29weVBhc3RlRGV0ZWN0b3IgfSBmcm9tICcuLi8uLi9jb3JlL0NvcHlQYXN0ZURldGVjdG9yJztcclxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vLi4vY29yZS9Mb2dnZXInO1xyXG5cclxuLy8gUnhqc1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbi8qKiBDb21wb25lbnRlIGNoZSBwZXJtZXR0ZSBkaSByYXBwcmVzZW50YXJlIHVuYSBncmlnbGlhIGRpIHZhbG9yaSAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZXMtdGFibGUnLFxyXG4gICAgdmlld1Byb3ZpZGVyczogW3sgcHJvdmlkZTogTG9jYWxpemF0aW9uU2VydmljZSwgdXNlQ2xhc3M6IEVzVGFibGVMb2MgfV0sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9lc190YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2VzX3RhYmxlLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRXNUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMge1xyXG5cclxuICAgIC8vIENvbXBvbmVudGkgcGVyIGxhIGdlc3Rpb25lIGRlbGxlIHZhcmllIGZ1bnppb25hbGl0w6AgZGVsbCdlcy10YWJsZVxyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIGV4cG9ydF9IOiBFeHBvcnRIYW5kbGVyO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIGNvbHVtbk1ldGFkYXRhX0g6IENvbHVtbk1ldGFkYXRhSGFuZGxlcjtcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBkeW5hbWljTW9kZV9IOiBEeW5hbWljTW9kZUhhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgaGllcmFyY2h5TW9kZV9IOiBIaWVyYXJjaHlNb2RlSGFuZGxlcjtcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBpdGVtc19IOiBJdGVtc0hhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgcmVwb3J0TW9kZV9IOiBSZXBvcnRNb2RlSGFuZGxlcjtcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyByb3dHcm91cGluZ19IOiBSb3dHcm91cGluZ0hhbmRsZXJcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBzZWxlY3Rpb25fSDogU2VsZWN0aW9uSGFuZGxlcjtcclxuXHJcbiAgICAvLyBTdWJzY3JpYmVycyBwZXIgZ2xpIGV2ZW50aSBkaSBjb3BpYSBlIGluY29sbGFcclxuICAgIC8qKiBAaWdub3JlICovIHByaXZhdGUgY29weVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHJpdmF0ZSBwYXN0ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBAU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcclxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHByZWZTZXJ2aWNlOiBQcmVmZXJlbmNlc1NlcnZpY2UsXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChFU1RfREVGQVVMVFMpIHByaXZhdGUgZGVhZnVsdHM6IEVzVGFibGVEZWZhdWx0YWJsZSxcclxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVTVF9MT0NBTEUpIHB1YmxpYyBsb2NhbGU6IHN0cmluZyxcclxuICAgICAgICBwdWJsaWMgbGM6IExvY2FsaXphdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSB1dGlsaXRpZXNfSDogVXRpbGl0aWVzSGFuZGxlcixcclxuICAgICAgICBwdWJsaWMgdXRpRXh0czogVXRpbGl0eVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBleHBFeHRzOiBFeHBvcnRTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBkYXRlRXh0czogRGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBtc2dFeHRzOiBNZXNzYWdlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGNvcHlQYXN0ZURldGVjdG9yOiBDb3B5UGFzdGVEZXRlY3RvcixcclxuICAgICAgICBwcml2YXRlIGNsaXBib2FyZFNlcnZpY2U6IENsaXBib2FyZFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlcikge1xyXG5cclxuICAgICAgICAvLyBDb3BpYSBlIGluY29sbGEgc2kgZWZmZXR0dWFubyBzb2xvIHNlIGxhIHRhYmVsbGEgYXR0dWFsZSDDqCB1bml2b2NhbWVudGUgc2VsZXppb25hdGFcclxuICAgICAgICB0aGlzLmNvcHlTdWJzY3JpcHRpb24gPSB0aGlzLmNvcHlQYXN0ZURldGVjdG9yLk9uQ29weS5zdWJzY3JpYmUoKCkgPT4geyBpZiAodGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5BY3RpdmVFc3RSZWZlcmVuY2UgPT0gdGhpcykgdGhpcy5oYW5kbGVDb3B5KCk7IH0pO1xyXG4gICAgICAgIHRoaXMucGFzdGVTdWJzY3JpcHRpb24gPSB0aGlzLmNvcHlQYXN0ZURldGVjdG9yLk9uUGFzdGUuc3Vic2NyaWJlKCgpID0+IHsgaWYgKHRoaXMuY29weVBhc3RlRGV0ZWN0b3IuQWN0aXZlRXN0UmVmZXJlbmNlID09IHRoaXMpIHRoaXMuaGFuZGxlUGFzdGUoKTsgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZXhwb3J0X0ggPSBuZXcgRXhwb3J0SGFuZGxlcih0aGlzLCB0aGlzLmV4cEV4dHMsIHRoaXMubXNnRXh0cywgdGhpcy51dGlFeHRzLCB0aGlzLmRhdGVFeHRzKTtcclxuICAgICAgICB0aGlzLnJvd0dyb3VwaW5nX0ggPSBuZXcgUm93R3JvdXBpbmdIYW5kbGVyKHRoaXMsIHRoaXMudXRpbGl0aWVzX0gsIHRoaXMuZGF0ZUV4dHMpO1xyXG4gICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSCA9IG5ldyBDb2x1bW5NZXRhZGF0YUhhbmRsZXIodGhpcywgdGhpcy51dGlsaXRpZXNfSCwgdGhpcy51dGlFeHRzLCB0aGlzLnByZWZTZXJ2aWNlLCB0aGlzLnJvd0dyb3VwaW5nX0gpO1xyXG4gICAgICAgIHRoaXMuZHluYW1pY01vZGVfSCA9IG5ldyBEeW5hbWljTW9kZUhhbmRsZXIodGhpcyk7XHJcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlNb2RlX0ggPSBuZXcgSGllcmFyY2h5TW9kZUhhbmRsZXIodGhpcyk7XHJcbiAgICAgICAgdGhpcy5pdGVtc19IID0gbmV3IEl0ZW1zSGFuZGxlcih0aGlzLCB0aGlzLnV0aWxpdGllc19IKTtcclxuICAgICAgICB0aGlzLnJlcG9ydE1vZGVfSCA9IG5ldyBSZXBvcnRNb2RlSGFuZGxlcih0aGlzLCB0aGlzLnV0aWxpdGllc19IKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9IID0gbmV3IFNlbGVjdGlvbkhhbmRsZXIodGhpcywgdGhpcy5yb3dHcm91cGluZ19IKTtcclxuXHJcbiAgICAgICAgaWYgKG5nQ29udHJvbClcclxuICAgICAgICAgICAgbmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG5cclxuICAgICAgICAvLyBBc3NlZ25hemlvbmUgcGVyIHR1dHRpIGdsaSBJbnB1dCBkaSBkZWZhdWx0XHJcbiAgICAgICAgdGhpcy5Db2x1bW5zUmVzaXphYmxlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkNvbHVtbnNSZXNpemFibGUsIHRoaXMuZGVhZnVsdHM/LkNvbHVtbnNSZXNpemFibGUpO1xyXG4gICAgICAgIHRoaXMuQXV0b1VwZGF0ZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5BdXRvVXBkYXRlLCB0aGlzLmRlYWZ1bHRzPy5BdXRvVXBkYXRlKTtcclxuICAgICAgICB0aGlzLkFsbFNlYXJjaCA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5BbGxTZWFyY2gsIHRoaXMuZGVhZnVsdHM/LkFsbFNlYXJjaCwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5FeHBvcnQgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuRXhwb3J0LCB0aGlzLmRlYWZ1bHRzPy5FeHBvcnQpO1xyXG4gICAgICAgIHRoaXMuSGlkZVBhZ2luZyA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5IaWRlUGFnaW5nLCB0aGlzLmRlYWZ1bHRzPy5IaWRlUGFnaW5nLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5IaWRlUGFnaW5nQ291bnQgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuSGlkZVBhZ2luZ0NvdW50LCB0aGlzLmRlYWZ1bHRzPy5IaWRlUGFnaW5nQ291bnQpO1xyXG4gICAgICAgIHRoaXMuSGlkZVBhZ2luZ0J1dHRvbnMgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuSGlkZVBhZ2luZ0J1dHRvbnMsIHRoaXMuZGVhZnVsdHM/LkhpZGVQYWdpbmdCdXR0b25zKTtcclxuICAgICAgICB0aGlzLkNvbnRhaW5lckNsYXNzID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkNvbnRhaW5lckNsYXNzLCB0aGlzLmRlYWZ1bHRzPy5Db250YWluZXJDbGFzcywgJycpO1xyXG4gICAgICAgIHRoaXMuVGFibGVDbGFzcyA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5UYWJsZUNsYXNzLCB0aGlzLmRlYWZ1bHRzPy5UYWJsZUNsYXNzLCAndGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ob3ZlciB0YWJsZS1zbScpO1xyXG4gICAgICAgIHRoaXMuU2VsZWN0aW9uID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlNlbGVjdGlvbiwgdGhpcy5kZWFmdWx0cz8uU2VsZWN0aW9uKTtcclxuICAgICAgICB0aGlzLlNhdmVQcmVmZXJlbmNlcyA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5TYXZlUHJlZmVyZW5jZXMsIHRoaXMuZGVhZnVsdHM/LlNhdmVQcmVmZXJlbmNlcyk7XHJcbiAgICAgICAgdGhpcy5QYWdpbmdTdHlsZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5QYWdpbmdTdHlsZSwgdGhpcy5kZWFmdWx0cz8uUGFnaW5nU3R5bGUsICdib3R0b20nKTtcclxuICAgICAgICB0aGlzLlJvd0dyb3VwaW5nUGFnaW5nU3R5bGUgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuUm93R3JvdXBpbmdQYWdpbmdTdHlsZSwgdGhpcy5kZWFmdWx0cz8uUm93R3JvdXBpbmdQYWdpbmdTdHlsZSwgJ2xlZnQnKTtcclxuICAgICAgICB0aGlzLlVzZVNlbGVjdGlvbkNhY2hlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlVzZVNlbGVjdGlvbkNhY2hlLCB0aGlzLmRlYWZ1bHRzPy5Vc2VTZWxlY3Rpb25DYWNoZSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5TaG93SXRlbUdyb3Vwc0NvbHVtbnMgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuU2hvd0l0ZW1Hcm91cHNDb2x1bW5zLCB0aGlzLmRlYWZ1bHRzPy5TaG93SXRlbUdyb3Vwc0NvbHVtbnMsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLkFycmF5bW9kZUl0ZW1zUGVyUGFnZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5BcnJheW1vZGVJdGVtc1BlclBhZ2UsIHRoaXMuZGVhZnVsdHM/LkFycmF5bW9kZUl0ZW1zUGVyUGFnZSwgMTUpO1xyXG4gICAgICAgIHRoaXMuQ29sdW1uc1Bpbm5hYmxlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkNvbHVtbnNQaW5uYWJsZSwgdGhpcy5kZWFmdWx0cz8uQ29sdW1uc1Bpbm5hYmxlLCB0cnVlKTtcclxuICAgICAgICB0aGlzLkRlZmF1bHRBbGlnbm1lbnQgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuRGVmYXVsdEFsaWdubWVudCwgdGhpcy5kZWFmdWx0cz8uRGVmYXVsdEFsaWdubWVudCwgJ0xlZnQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogU3ViamVjdCB1dGlsaXp6YXRvIGludGVybmFtZW50ZSBsYXRvIEVzVGFibGUgcGVyIGNhdXNhcmUgaWwgRm9jdXMgbGF0byBjb21wb25lbnRlIGRpIElucHV0ICovXHJcbiAgICBwdWJsaWMgRm9jdXNTdWJqZWN0OiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxyXG4gICAgLyoqIFRpbWVyIGNoZSB2ZXJyw6AgaW1wb3N0YXRvIGEgKipkb3VibGVDbGlja0J1ZmZlck1zKiogcGVyIGNhcGlyZSBzZSDDqCBzdGF0byBlZmZldHR1YXRvIHVuIGNsaWNrIHNpbmdvbG8gbyB1biBkb3VibGVjbGljayAqL1xyXG4gICAgcHJpdmF0ZSBjZWxsRGJDbGlja1RpbWVyOiBhbnk7XHJcbiAgICAvKiogU2UgdmVuZ29ubyBlZmZldHR1YXRpIDIgY2xpY2sgYSBkaXN0YW56YSBpbmZlcmlvcmUgYSBxdWVzdGkgTWlsbGlzZWNvbmRpIHZpZW5lIGNvbnNpZGVyYXRvIHVuIGRvcHBpbyBjbGljayAqL1xyXG4gICAgcHJpdmF0ZSBkb3VibGVDbGlja0J1ZmZlck1zOiBudW1iZXIgPSAyMDA7XHJcbiAgICAvKiogVmlldyBmaW5hbGUgc3UgY3VpIGJpbmRhcnNpIGxhdG8gRnJvbnRlbmQsIGlsIHRpcG8gcHXDsiBlc3NlcmUgSUFwcFNlYXJjaDxhbnk+IChwZXIgbGEgKip2aWV3TW9kZSoqKSwgYW55W10gKHBlciBsJyoqYXJyYXlNb2RlKiopICovXHJcbiAgICBwdWJsaWMgVmlldzogYW55ID0gbnVsbDtcclxuICAgIC8qKiBNb2RlbGxvIGRhIGN1aSBsJ2VzLXRhYmxlIG1vc3RyYSBpIHB1bHNhbnRpIGRpIHBhZ2luYXppb25lIGluIGJhc3NvIGEgZGVzdHJhICovXHJcbiAgICBwdWJsaWMgYXJyYXlQdWxzYW50aTogeyB2YWw6IG51bWJlciwgY3NzQ2xhc3M6IHN0cmluZyB9W107XHJcbiAgICAvKiogSW5kaWNhIHNlIGwnZXMtdGFibGUgZGV2ZSBtb3N0cmFyZSBpbCBjaGVjayBnbG9iYWxlIG5lbGwnaGVhZGVyIHBlciBmYXJlIGlsIFwic2VsZXppb25hIHR1dHRvXCIgKi9cclxuICAgIHB1YmxpYyBnbG9iYWxDaGVjayA9IGZhbHNlO1xyXG4gICAgLyoqIFRpZW5lIGRhIGNvbnRvIGwndWx0aW1vIGVsZW1lbnRvIHNlbGV6aW9uYXRvIGluIG1vZG8gZGEgcG90ZXIgZWZmZXR0dWFyZSBpbCBTSElGVCtDTElDSyAqL1xyXG4gICAgcHJpdmF0ZSBsYXN0U2VsZWN0ZWQ6IGFueSA9IG51bGw7XHJcbiAgICAvKiogQ29udGVnZ2lvIGludGVybm8gcGVyIGlsIG51bWVybyBkaSBlbGVtZW50aSBzZWxlemlvbmF0aSAqL1xyXG4gICAgcHVibGljIHNlbGVjdGVkT2JqZWN0cyA9IDA7XHJcbiAgICAvKiogSW5kaWNhIHNlIMOoIHBvc3NpYmlsZSBlZmZldHR1YXJlIHVuYSBzZWxlemlvbmUgbWFzc2l2YSAqL1xyXG4gICAgcHVibGljIGNhblNlbGVjdEFsbCA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBzZSBpbCBjb21wb25lbnRlIHN0YSBnZXN0ZW5kbyB1biBJQXBwU2VhcmNoPGFueT4gKi9cclxuICAgIHB1YmxpYyB2aWV3TW9kZSA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBzZSBpbCBjb21wb25lbnRlIHN0YSBnZXN0ZW5kbyB1biBhbnlbXSAqL1xyXG4gICAgcHVibGljIGFycmF5TW9kZSA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udGVuaXRvcmUgZGVnbGkgZWxlbWVudGkgZGEgbGlzdGFyZSBsYXRvIGludGVyZmFjY2lhIGRvcG8gdHV0dGUgbGUgZWxhYm9yYXppb25pIGRlbCBjYXNvLFxyXG4gICAgICogZ2VuZXJhbG1lbnRlIG5vbiBzb25vIGFsdHJvIGNoZSB0dXR0aSBnbGkgb2dnZXR0aSBkYSBwcmVzZW50YXJlIGNvbiBpbiBwacO5IGwnaGFzaCBjYWxjb2xhdG8gcGVyIGlkZW50aWZpY2FyZSAxIG9nZ2V0dG8gY29uIGxhIHByb3ByaWEgcmlnYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYm91bmRTb3VyY2U6IGFueVtdID0gW107XHJcbiAgICAvKiogU3Rlc3NhIGNvc2EgZGVsbGEgKipib3VuZFNvdXJjZSoqLCB1dGlsaXp6YXRhIGNvbWUgYXBwb2dnaW8gdGVtcG9yYW5lbyBpbnRlcm5vICovXHJcbiAgICBwdWJsaWMgVE1QQm91bmRTb3VyY2U6IGFueVtdID0gW107XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgXCJGZXR0YVwiIGRpIG9nZ2V0dGkgdXRpbGl6emF0YSBuZWxsJ2VuZGxlc3Mgc2Nyb2xsLCBvZ25pIGVsZW1lbnRvIGRpIHF1ZXN0byBhcnJheSDDqCB1biBibG9jY2hldHRvIGRpIDEwMCBlbGVtZW50aSAqL1xyXG4gICAgcHVibGljIGJvdW5kU3ViU291cmNlczogYW55W10gPSBbXTtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBRdWVzdGEgZnVuZ2UgZGEgaW5kaWNhdG9yZSBwZXIgZ2xpIHNsaWNlIGluc2VyaXRpLCBsYSBsdW5naGV6emEgZG92cmViYmUgZXNzZXJlIGNvcnJpc3BvbmRlbnRlIGEgKipib3VuZFN1YlNvdXJjZXMqKiAqL1xyXG4gICAgcHVibGljIGFkZGVkU2xpY2VzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgLyoqIFZhcmlhYmlsZSBjaGUgaWRlbnRpZmljYSBpbCB2YWxvcmUgZGVsIFwic2VsZXppb25hIFR1dHRvXCIgbmVsbGEgcGFnaW5hemlvbmUgKi9cclxuICAgIHB1YmxpYyBkZWZhdWx0QWxsUGFnZU92ZXJyaWRlID0gOTk5OTk5O1xyXG4gICAgLyoqIFNlcnZlIHBlciB0ZW5lcmUgaW4gbWVtb3JpYSBpbCBjb250ZWdnaW8gcHJlY2VkZW50ZSBlIHJlY3VwZXJhcmxvIGluIGNhc28gZGl2ZW50aSAtMiAodmVyaWZpY2FyZSBjb24gQWxlIHBlcmNow6kgbGEgbG9naWNhIGRlbCAtMikgKi9cclxuICAgIHB1YmxpYyBwcmV2aW91c0NvdW50OiBudW1iZXI7XHJcbiAgICAvKiogSW5kaWNhIHNlIHV0aWxpenphcmUgaWwgc2lzdGVtYSBkaSBhdXRvdXBkYXRlLCBjaW/DqCB1biB0cmlnZ2VyIHRpbWUtaXp6YXRvIGluIGFsdG8gYSBkZXN0cmEgZGVsbGEgdGFiZWxsYSBjaGUgcmlwZXRlIGxlIHJpY2VyY2hlIG9nbmkgWCAqKnNlY29uZHMqKiAqL1xyXG4gICAgcHVibGljIGF1dG9VcGRhdGUgPSBmYWxzZTtcclxuICAgIC8qKiBOdW1lcm8gZGkgc2Vjb25kaSBkYSBmYXJlIHRyYXNjb3JyZXJlIGZyYSB1bmEgcmljZXJjYSBlIGwnYWx0cmEgKi9cclxuICAgIHB1YmxpYyBzZWNvbmRzID0gJzEwJztcclxuICAgIC8qKiBSaWZlcmltZW50byBhbGwnSW50ZXJ2YWwgY2hlIHZpZW5lIGdlbmVyYXRvIHNlICoqYXV0b1VwZGF0ZSoqIMOoIGltcG9zdGF0YSBhIHRydWUgaW4gbW9kbyBkYSBwb3RlcmxvIHJpcHVsaXJlICovXHJcbiAgICBwdWJsaWMgdXBkYXRlVGltZXI6IGFueTtcclxuICAgIC8qKiBJbXBvc3RhdGEgYSB0cnVlIG9nbmkgdm9sdGEgY2hlIHZpZW5lIGF2dmlhdGEgdW5hIHJpY2VyY2EsIGUgYSBmYWxzZSBvZ25pIHZvbHRhIGNoZSB1biBudW92byB2YWxvcmUgdmllbmUgcmljZXZ1dG8gKi9cclxuICAgIHB1YmxpYyByZXNlYXJjaEluUHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBNb2RlbGxvIGRpIGFwcG9nZ2lvIHRlbXBvcmFuZW8gcGVyIGkgKipSb3dURHMqKiAqL1xyXG4gICAgcHVibGljIFRNUFJvd1REczogeyBbY29udGV4dDogc3RyaW5nXTogVGRFbGVtZW50W10gfSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyByYXBwcmVzZW50YW50ZSB1biBkaXppb25hcmlvIGRpIHJpZ2hlIGRlbGxhIHRhYmVsbGEsIGNvbiBjaGlhdmUgbCdoYXNoIGUgdmFsb3JlIGxhIGxpc3RhIGRpIGNlbGxlICovXHJcbiAgICBwdWJsaWMgUm93VERzOiB7IFtjb250ZXh0OiBzdHJpbmddOiBUZEVsZW1lbnRbXSB9ID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgKipSb3dURHMqKiDDqCB1biBvZ2dldHRvIHZ1b3RvIG8gbWVubyAqL1xyXG4gICAgcHVibGljIEVtcHR5Um93VGRzOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIC8qKiBNb2RlbGxvIGRpIGFwcG9nZ2lvIHRlbXBvcmFuZW8gcGVyIGkgKipSb3dUSHMqKiAqL1xyXG4gICAgcHVibGljIFRNUFJvd1RIczogVGhFbGVtZW50W10gPSBudWxsO1xyXG4gICAgLyoqIE1vZGVsbG8gcmFwcHJlc2VudGFudGUgdW4gc2luZ29sbyB0aCBkZWxsYSB0YWJlbGxhLCBnZW5lcmF0byBpbiBiYXNlIGFsbGUgY29uZmlndXJhemlvbmkgZSBhZ2xpIG9nZ2V0dGkgcmljZXZ1dGkgKi9cclxuICAgIHB1YmxpYyBSb3dUSHM6IFRoRWxlbWVudFtdID0gbnVsbDtcclxuICAgIC8qKiBNb2RlbGxvIGRpIGFwcG9nZ2lvIHRlbXBvcmFuZW8gcGVyIGkgKipSb3dUaEdyb3VwcyoqICovXHJcbiAgICBwdWJsaWMgVE1QUm93VGhHcm91cHM6IFRoR3JvdXBbXVtdID0gbnVsbDtcclxuICAgIC8qKiBNb2RlbGxvIHJhcHByZXNlbnRhbnRlIHVuIHNpbmdvbG8gaGVhZGVyIGdyb3VwIGRlbGxhIHRhYmVsbGEuIFF1ZXN0YSBsaXN0YSDDqCBnacOgIG9yZGluYXRhIGUgcHJvbnRhIHBlciBlc3NlcmUgdXRpbGl6emF0YSBpbiBuZ0ZvciAqL1xyXG4gICAgcHVibGljIFJvd1RoR3JvdXBzOiBUaEdyb3VwW11bXSA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaXN0YSBkZWkgY29udGVzdGkuIFVuIGNvbnRlc3RvIG5vbiDDqCBhbHRybyBjaGUgdW4gaGFzaCBwYXJ0aWNvbGFyZSBjYWxjb2xhdG8gc3UgdW4gb2dnZXR0byBjaGUgaWRlbnRpZmljYSB1bml2b2NhbWVudGUgdGFsZSBvZ2dldHRvLlxyXG4gICAgICpcclxuICAgICAqIE9nbnVubyBkaSBxdWVzdGkgY29udGVzdGkgcmFwcHJlc2VudGVyw6AgYSBzdWEgdm9sdGEsIHVuaXZvY2FtZW50ZSwgdW5hIHJpZ2EgYWxsJ2ludGVybm8gZGVsbGEgdGFiZWxsYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUm93Q29udGV4dHM6IGFueVtdID0gW107XHJcbiAgICAvKiogRGlyZXR0aXZlIGRpIG9yZGluYW1lbnRvIGRlbGxlIGNvbG9ubmUgKG5vbiBvcmRpbmFtZW50byBkZWkgZGF0aSBtYSBkZWxsZSBjb2xvbm5lIGluIHNlKSAqL1xyXG4gICAgcHVibGljIE9yZGVyRGlyZWN0aXZlczogc3RyaW5nW10gPSBbXTtcclxuICAgIC8qKiBDb2RpY2UgZGVsbCd1bHRpbW8gb2dnZXR0byBzb2xlemlvbmF0byAqL1xyXG4gICAgcHVibGljIGxhc3RTZWxlY3RlZEl0ZW1JRCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWNpZGUgc2UgdXRpbGl6emFyZSBvIG1lbm8gbGUgQ3VzdG9tQ2VsbHMuIEltcG9zdGFuZG9sbyBhICoqdHJ1ZSoqIGwnZXMtdGFibGUgZGl2ZW50YSBpbiBncmFkbyBkaSBnZXN0aXJlIG5hdGl2YW1lbnRlOlxyXG4gICAgICpcclxuICAgICAqIDEpIE9yZGluYW1lbnRvIGUgdmlzaWJpbGl0w6AgZGVsbGUgY29sb25uZVxyXG4gICAgICpcclxuICAgICAqIDIpIE9yZGluYW1lbnRvIGRlaSBkYXRpXHJcbiAgICAgKlxyXG4gICAgICogMykgTW9kYWxpdMOgIEdlcmFyY2hpY2FcclxuICAgICAqXHJcbiAgICAgKiBlY2MuLi5cclxuICAgICAqIHZpZW5lIGRlZG90dG8gZGFsIHNpc3RlbWEgaW4gYXV0b21hdGljb1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVXNlQ3VzdG9tQ2VsbHM6IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIG9sdHJlIGFsbGUgY29sb25uZSBkaW5hbWljaGUgc3BlY2lmaWNoZSBkaSB1biB0aXBvIGRpIG9nZ2V0dG8gY2kgc29ubyBhbmNoZSBjb2xvbm5lIGRpbmFtaWNoZSBhZ2dpdW50ZSBkYWxsJ3V0ZW50ZVxyXG4gICAgICpcclxuICAgICAqIEVzLiB1bmEgY29sb25uYSBpbiBjdWkgbW9zdHJhcmUgc2VtcHJlIHVuIGljb25jaW5hXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBVc2VyRGVmaW5lZER5bmFtaWNDb2xzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogSW5kaWNhIGNoZSBxdWVzdG8gw6ggaWwgcHJpbW8gQmluZCBkZWxsYSB0YWJlbGxhLCB2aWVuZSBzZXR0YXRvIGEgZmFsc2Ugbm9uIGFwcGVuYSBpbCBwcmltbyBiaW5kIHZpZW5lIHRlcm1pbmF0byBjb24gc3VjY2Vzc28gKi9cclxuICAgIHB1YmxpYyBGaXJzdEJpbmQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLyoqIExpc3RhIGRpIGNvbG9ubmUgY2hlIHNpIHBvc3Nvbm8gdmlzdWFsaXp6YXJlL29yZGluYXJlIGZyYSBkaSBsb3JvICovXHJcbiAgICBwdWJsaWMgQ29sdW1uc0xpc3Q6IEVzVGFibGVDb2x1bW5bXSA9IFtdO1xyXG4gICAgLyoqIFZhcmlhYmlsZSBkJ2FwcG9nZ2lvIHVzYXRhIGRhbGxhIGRpYWxvZyBkaSBzZWxlemlvbmUvbmFzY29uZGltZW50bywgcGVyIGV2aXRhcmUgZGkgZGFubmVnZ2lhcmUgKipDb2x1bW5zTGlzdCoqIGluIGNhc28gZGkgbW9kaWZpY2hlIHBvaSBhbm51bGxhdGUgKi9cclxuICAgIHB1YmxpYyBUTVBDb2x1bW5zTGlzdDogRXNUYWJsZUNvbHVtbltdID0gW107XHJcbiAgICAvKiogVmFsb3JlIGRlbCBjaGVjayBnbG9iYWxlIGRpIHZpc2liaWxpdMOgIHZhbGlkbyBwZXIgdHV0dGUgbGUgY29sb25uZSBpbiAqKkNvbHVtbnNMaXN0KiogKi9cclxuICAgIHB1YmxpYyBnbG9iYWxDb2xWaXNDaGVjayA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSB0dXR0ZSBsZSBkaXJldHRpdmUgcGVyIGdsaSBlZGl0b3IgY3VzdG9tIGRlbGxlIGNlbGxlICovXHJcbiAgICBAQ29udGVudENoaWxkcmVuKEVzVGRFZGl0b3JEaXJlY3RpdmUpIEVzVGRFZGl0b3JEaXJlY3RpdmVzOiBRdWVyeUxpc3Q8RXNUZEVkaXRvckRpcmVjdGl2ZT47XHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgdHV0dGUgbGUgbnVvdmUgZGlyZXR0aXZlICBhc3NlZ25hdGkgYSBkaXJldHRpdmEgKFBlciBsYSBtb2RhbGl0w6AgZGluYW1pY2EgZGVsbCdlcy10YWJsZSkgKi9cclxuICAgIEBDb250ZW50Q2hpbGRyZW4oRXNUZERpcmVjdGl2ZSkgRXNUZHNEaXJlY3RpdmU6IFF1ZXJ5TGlzdDxFc1RkRGlyZWN0aXZlPjtcclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSB0dXR0aSBnbGkgZXMtdGQgYXNzZWduYXRpIGEgZGlyZXR0aXZhIChQZXIgbGEgbW9kYWxpdMOgIGRpbmFtaWNhIGRlbGwnZXMtdGFibGUpICovXHJcbiAgICBAQ29udGVudENoaWxkcmVuKEVzVGhEaXJlY3RpdmUpIEVzVGhzRGlyZWN0aXZlOiBRdWVyeUxpc3Q8RXNUaERpcmVjdGl2ZT47XHJcbiAgICAvKiogSW5wdXQgY29sbGVnYXRvIGEgdW4gdGVtcGxhdGUgY2hlIGNvbnRpZW5lIGxlIGRpcmV0dGl2ZSBwZXIgcmVuZGVyaXp6YXJlIHF1ZXN0YSB0YWJlbGxhLiBzZSBjaSBzb25vICoqRXNUZHNEaXJlY3RpdmUqKiBlICoqRXNUaHNEaXJlY3RpdmUqKiBxdWVzdGkgaGFubm8gbGEgcHJpb3JpdMOgICovXHJcbiAgICBASW5wdXQoKSBFc1RhYmxlVGVtcGxhdGU6IElFc1RhYmxlVGVtcGxhdGVXcmFwcGVyO1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIGxlIGluZm9ybWF6aW9uaSBkZWwgYm9keSAocHVudG8gZGVsbGEgdGFiZWxsYSBkb3ZlIHZlbmdvbm8gbW9zdHJhdGUgbGUgcmlnaGUpICovXHJcbiAgICBAQ29udGVudENoaWxkKCdib2R5JywgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBib2R5UmVmOiBhbnk7XHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgbGUgaW5mb3JtYXppb25pIGRlbGwnaGVhZGVyIChwdW50byBkZWxsYSB0YWJlbGxhIGRvdmUgdmVuZ29ubyBtb3N0cmF0ZSBsZSBpbnRlc3RhemlvbmkgZGVsbGUgcmlnaGUpICovXHJcbiAgICBAQ29udGVudENoaWxkKCdoZWFkZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGhlYWRlclJlZjogYW55O1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIFF1ZXJ5IHBlciByZWN1cGVyYXJlIGxlIGluZm9ybWF6aW9uaSBzdWwgcmFnZ3J1cHBhbWVudG8gZGVnbGkgaGVhZGVyICovXHJcbiAgICBAQ29udGVudENoaWxkKCdoZWFkZXJHcm91cCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgaGVhZGVyR3JvdXBSZWY6IGFueTtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBRdWVyeSBwZXIgcmVjdXBlcmFyZSBsZSBpbmZvcm1hemlvbmkgc3VsIHJhZ2dydXBwYW1lbnRvIGRpIHNlY29uZG8gbGl2ZWxsbyBkZWdsaSBoZWFkZXIgKi9cclxuICAgIEBDb250ZW50Q2hpbGQoJ3NlY29uZGFyeUhlYWRlckdyb3VwJywgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBzZWNvbmRhcnlIZWFkZXJHcm91cFJlZjogYW55O1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIGlsIGNhbXBvIGRpIElucHV0IGF0dHVhbGUuIERvcG8gdW4gZG9wcGlvIGNsaWNrIGxvIGJlY2NvIGUgbG8gZm9jdXNzbyBhcHBlbmEgdGVybWluYSBsYSBjaGFuZ2UgZGV0ZWN0aW9uICovXHJcbiAgICBAVmlld0NoaWxkKCdpbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgaW5wdXRGaWVsZDogRWxlbWVudFJlZjtcclxuICAgIC8qKiBPcHppb25pIGV4dHJhIGNoZSBkZXZvbm8gYXBwYXJpcmUgbmVsIE1lbsO5IGNvbnRlc3R1YWxlIGluIGFsdG8gYSBkZXN0cmEsIHJpY2hpYW1hdG8gZGFpIDMgcGFsbGluaSB2ZXJ0aWNhbGkgKi9cclxuICAgIEBJbnB1dCgpIENvcm5lck1lbnVPcHRpb25zOiBDb3JuZXJNZW51T3B0aW9uW10gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBkZXYnZXNzZXJlIHBvc3NpYmlsZSBlZmZldHR1YXJlIGlsIHJlc2l6ZSBkZWxsZSBjb2xvbm5lICovXHJcbiAgICBASW5wdXQoKSBDb2x1bW5zUmVzaXphYmxlOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgZGV2J2Vzc2VyZSBwb3NzaWJpbGUgZWZmZXR0dWFyZSBpbCBwaW5uaW5nIGRlbGxlIGNvbG9ubmUgKi9cclxuICAgIEBJbnB1dCgpIENvbHVtbnNQaW5uYWJsZTogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIGRldidlc3NlcmUgZGlzcG9uaWJpbGUgaWwgc2lzdGVtYSBkaSBhZ2dpb3JuYW1lbnRvIGF1dG9tYXRpY28gKi9cclxuICAgIEBJbnB1dCgpIEF1dG9VcGRhdGU6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBsJ2FsdGV6emEgY2FibGF0YSBjaGUgZGV2ZSBhc3N1bWVyZSBsYSB0YWJlbGxhLiBFczogXCIxMDBweFwiIHwgXCIxMDAlXCIgLi4uICAqL1xyXG4gICAgQElucHV0KCkgSGVpZ2h0OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBpbCBjb2xvcmUgZGkgc2ZvbmRvIGRlbGxvIHNwYXppbyB2dW90byAobm9uIHJpY29wZXJ0byBkYSBkYXRpKS4gUGFydGljb2xhcm1lbnRlIHV0aWxlIGRhIGltcG9zdGFyZSBpbiBjYXNvIGRpICoqSGVpZ2h0KiogZGl2ZXJzbyBkYSBudWxsICAqL1xyXG4gICAgQElucHV0KCkgRW1wdHlTcGFjZUJhY2tncm91bmRDb2xvcjogc3RyaW5nID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgZGV2J2Vzc2VyZSBsJ2VzdGFibGUgYSBnZXN0aXJlIGxhIHJpY2VyY2EsIGFuY2hlIGxhIHByaW1hLiAgKiovXHJcbiAgICBASW5wdXQoKSBFc1RhYmxlSGFuZGxlZFNlYXJjaDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBpbXBvc3RhcmUgbCdhbHRlenphIG1hc3NpbWEgZGVsbGEgdGFiZWxsYS4gU2UgbnVsbCBsYSBkaW1lbnNpb25lIHNpIGFkYXR0YSBhbCBudW1lcm8gZGkgZWxlbWVudGkgYXR0dWFsbWVudGUgaW4gdmlzdWFsaXp6YXppb25lICovXHJcbiAgICBASW5wdXQoKSBNYXhIZWlnaHQ6IG51bWJlciA9IG51bGw7XHJcbiAgICAvKiogQ2xhc3NpIGRhIGFwcGxpY2FyZSBhbCBjb250ZW5pdG9yZSBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBDb250YWluZXJDbGFzcyA9IG51bGw7XHJcbiAgICAvKiogUGVybWV0dGUgbyBtZW5vIGwnZXhwb3J0IGluIGZvcm1hdG8gWExTWCAqL1xyXG4gICAgQElucHV0KCkgWExTWEV4cG9ydDogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogUGVybWV0dGUgbyBtZW5vIGwnZXhwb3J0IGluIGZvcm1hdG8gQ1NWICovXHJcbiAgICBASW5wdXQoKSBDU1ZFeHBvcnQgPSB0cnVlO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIHZpc3VhbGl6emFyZSBvIG1lbm8gbCdvcHppb25lIGRpIHBhZ2luYXppb25lIFwiVHV0dGlcIiAqL1xyXG4gICAgQElucHV0KCkgQWxsU2VhcmNoID0gbnVsbDtcclxuICAgIC8qKiBEaW1pbnVpc2NlIGdsaSBzcGF6aSBmcmEgdW5hIGNlbGxhIGUgbCdhbHRyYSwgZSBpbnRlcm5hbWVudGUgaWwgcGFkZGluZyBkZWwgZm9udCBpbiBtb2RvIGRhIHByZXNlbnRhcmUgbW9sdGkgcGnDuSBkYXRpIGluIHVuJ3VuaWNhIHBhZ2luYSAqL1xyXG4gICAgQElucHV0KCkgSGlnaENlbGxEZW5zaXR5OiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBBYmlsaXRhIG8gbWVubyBsYSBwb3NzaWJpbGl0w6AgZGkgc2VsZXppb25hcmUgb2dnZXR0aSAqL1xyXG4gICAgQElucHV0KCkgU2VsZWN0aW9uOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBNb3N0cmEgbyBtZW5vIHVuIG1lc3NhZ2dpbyBkaSBMb2FkaW5nIGFsIHByaW1vIGNhcmljYW1lbnRvIGRlbGxhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIFNob3dMb2FkaW5nT25Cb290c3RyYXA6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFNlIGltcG9zdGF0byBhICoqdHJ1ZSoqIGFnZ2l1bmdlIHVuYSBjb2xvbm5hIGNvbiBwdWxzYW50ZSBkaSBlbGltaW5hemlvbmUgcGVyIGVmZmV0dHVhcmUgbCdlbGltaW5hIGRlbGwnb2dnZXR0byByZWxhdGl2byAqL1xyXG4gICAgQElucHV0KCkgUmVtb3ZhbDogYm9vbGVhbiA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25kaXppb25lIGNoZSBuYXNjb25kZSBsJ2ljb25hIGRpIGVsaW1pbmF6aW9uZSBpbnNlcml0YSBpbXBvc3RhbmRvICoqUmVtb3ZhbCoqIGEgdHJ1ZSBxdWFsb3JhIGxhIGNvbmRpemlvbmUgbm9uIHZlbmlzc2UgcmlzcGV0dGF0YVxyXG4gICAgICpcclxuICAgICAqIENvbWUgY29uZGl6aW9uZSBzaSBjb25zaWRlcmEgdW4gc2VtcGxpY2UgY2FtcG8gc3UgY3VpIGVmZmV0dHVhcmUgdW4gY29udHJvbGxvIGJvb2xlYW5vLCBjb21lIGFkIGVzZW1waW8gXCJjYW5yZW1vdmVcIlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBSZW1vdmFsQ29uZGl0aW9uID0gJyc7XHJcbiAgICAvKiogSW5kaWNhIHNlIGFiaWxpdGFyZSBsYSBwb3NzaWJpbGl0w6AgZGkgZXNwb3J0YXJlIGxhIHZpc3RhIGRhdGkgYXR0dWFsZSAqL1xyXG4gICAgQElucHV0KCkgRXhwb3J0OiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgcGVybWV0dGVyZSBsYSBzZWxlemlvbmUgbXVsdGlwbGEgV2luZG93cy1saWtlIGNsaWNjYW5kbyB1biBvZ2dldHRvIGUgZmFjZW5kbyBwb2kgU2hpZnQgKyBjbGljayBzdSB1biBvZ2dldHRvIHN1Y2Nlc3Npdm8gKi9cclxuICAgIEBJbnB1dCgpIFNoaWZ0Q2xpY2s6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBpbCB0ZXN0byBjaGUgdmEgYSBzb3N0aXR1aXJlIFwiT2dnZXR0aSBWaXN1YWxpenphdGlcIiBpbiBjYXNvIHNpIHN0aWEgZmFjZW5kbyBxdWFsY29zYSBkaSBjdXN0b20gKi9cclxuICAgIEBJbnB1dCgpIENvdW50TGFiZWw6IHN0cmluZyA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5hc2NvbmRlcmUgbyBtb3N0cmFyZSBpbCBjb21wb25lbnRlIGRpIHBhZ2luYXppb25lICovXHJcbiAgICBASW5wdXQoKSBIaWRlUGFnaW5nOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgbmFzY29uZGVyZSBvIG1vc3RyYXJlIGlsIGNvbnRlZ2dpbyBkZWdsaSBlbGVtZW50aSB0cm92YXRpICovXHJcbiAgICBASW5wdXQoKSBIaWRlUGFnaW5nQ291bnQ6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBuYXNjb25kZXJlIG8gbW9zdHJhcmUgaSBwdWxzYW50aSBkaSBwYWdpbmF6aW9uZSAqL1xyXG4gICAgQElucHV0KCkgSGlkZVBhZ2luZ0J1dHRvbnM6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFJpZmVyaW1lbnRvIGFsIENvbnRleHRNZW51IChuZ3gtY29udGV4dG1lbnUpIGFzc29jaWF0byBhbCBjbGljayBkZXN0cm8gZGkgdW5vIG8gcGnDuSBlbGVtZW50aSBzZWxlemlvbmF0aSBuZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBDb250ZXh0TWVudTogQ29udGV4dE1lbnVDb21wb25lbnQgPSBudWxsO1xyXG4gICAgLyoqIE5vbWUgZGVsbCdlc3BvcnRhemlvbmUgZ2VuZXJhdGEgZGEgcXVlc3RhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIEV4cG9ydEZpbGVOYW1lID0gJ0V4cG9ydC5jc3YnO1xyXG4gICAgLyoqIENsYXNzZSAoSFRNTCkgZGkgZGVmYXVsdCBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBUYWJsZUNsYXNzID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bnppb25lIGRhIHV0aWxpenphcmUgaW4gZXNwb3J0YXppb25lLiBOZWwgZm9ybWF0byBcIlJlcG9ydFwiIGF2csOgIHVuIHVuaWNvIHBhcmFtZXRybyBcIkZvcm1hdG9cIiBlIG5lc3N1biB2YWxvcmUgZGkgcml0b3Juby5cclxuICAgICAqXHJcbiAgICAgKiBOZWwgZm9ybWF0byBcIlZpZXdcIiBoYSBjb21lIHBhcmFtZXRybyB1bmEgY2FsbGJhY2sgY29uIGkgZGF0aSBjb21wbGV0aSBkYSBlc3BvcnRhcmUgKGRhdG8gY2hlIGRpIGRlZmF1bHQgbGEgcmljZXJjYSDDqCBwYWdpbmF0YSlcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgRXhwb3J0RnVuY3Rpb246IGFueTtcclxuICAgIC8qKiBJbmRpY2EgZGkgZXNwb3J0YXJlIHNvbG8gbGUgY29sb25uZSBhdHR1YWxtZW50ZSB2aXNpYmlsaSBkZWxsYSB2aWV3ICovXHJcbiAgICBASW5wdXQoKSBFeHBvcnRPbmx5VmlzaWJsZUNvbHVtbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBJbmRpY2EgbGEgcHJlc2VuemEgZGkgcmFnZ3J1cHBhbWVudGkgYSBsaXZlbGxvIGRpIGhlYWRlciAqL1xyXG4gICAgQElucHV0KCkgSGFzSGVhZGVyR3JvdXA6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIEluZGljYSBsYSBwcmVzZW56YSBkaSByYWdncnVwcGFtZW50aSBhIGxpdmVsbG8gZGVsIHJhZ2dydXBwYW1lbnRvIHByZWNlZGVudGVtZW50ZSBlc2lzdGVudGUsIGNoaWFyYW1lbnRlIMOoIGluc2Vuc2F0YSBzZW56YSAqKkhhc0hlYWRlckdyb3VwKiogKi9cclxuICAgIEBJbnB1dCgpIEhhc1NlY29uZGFyeUhlYWRlckdyb3VwOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgbmFzY29uZGVyZSBnbGkgSGVhZGVyIGRlbGxhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIEhlYWRlckhpZGRlbjogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5hc2NvbmRlcmUgaWwgQm9keSBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBCb2R5SGlkZGVuOiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBsYSBzZWxlemlvbmUgw6ggdGVtcG9yYW5lYW1lbnRlIGRpc2FiaWxpdGF0YS4gUmlzcGV0dG8gYWxsJ0lucHV0ICoqU2VsZWN0aW9uKiogY2hlIHZpc2l2YW1lbnRlIGdlc3Rpc2NlIHNlIGNpIHNvbm8gbyBubyBnbGkgaW5wdXQgZGkgc2VsZXppb25lLFxyXG4gICAgICogcXVlc3RvIElucHV0IGdlc3Rpc2NlIHNlIHF1ZXN0aSBpbnB1dCBzb25vIGFiaWxpdGF0aSBvIG1lbm9cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgU2VsZWN0aW9uRGlzYWJsZWQ6IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIGZvcnphcmUgaWwgc2lzdGVtYSBkaSBzZWxlemlvbmUgYSBnZXN0aXJlIHVuIGVsZW1lbnRvIHBlciB2b2x0YS5cclxuICAgICAqIFNlbGV6aW9uYXJlIHVuJ2FsdHJhIHJpZ2EgY29uIHVuYSBnacOgIHNlbGV6aW9uYXRhIGFwcGxpY2hlcsOgIGxhIHNlbGV6aW9uZSBhbGxhIG51b3ZhIHJpZ2EsIHJpbXVvdmVuZG9sYSBkYWxsJ2F0dHVhbGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgU2luZ2xlU2VsZWN0aW9uOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBDYWxsYmFjayBjaGUgZGF0byB1biBvZ2dldHRvIHJlc2l0dWlzY2UgbCdldmVudHVhbGUgY2xhc3NlIGRhIGFwcGxpY2FyZSBhbGxhIHJpZ2EgY29sbGVnYXRhIGFsbCdvZ2dldHRvICovXHJcbiAgICBASW5wdXQoKSBSb3dDbGFzc0Fzc2lnbmVyOiBhbnkgPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIG9yZGluYXJlIGkgZGF0aSBpbiBtYW5pZXJhIGRpc2NlbmRlbnRlIG8gYXNjZW5kZW50ZSAqL1xyXG4gICAgQElucHV0KCkgT3JkZXJCeUNvbHVtbjogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogUGVybWV0dGUgZGkgYXZlcmUgcGnDuSBkaXJldHRpdmUgZGkgb3JkaW5hbWVudG8gZGVpIGRhdGkgKi9cclxuICAgIEBJbnB1dCgpIE11bHRpcGxlT3JkZXJpbmdEaXJlY3RpdmVzID0gdHJ1ZTtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBuYXNjb25kZXJlIGxlIGNvbG9ubmUgaW4gYmFzZSBhbGxlIHNlbGV6aW9uaSBlZmZldHR1YXRlIGRhbCBNZW7DuSBjb250ZXN0dWFsZSBpbiBhbHRvIGEgZGVzdHJhICovXHJcbiAgICBASW5wdXQoKSBIaWRkZW5Db2x1bW5zOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSByaW9yZGluYXJlIGxlIGNvbG9ubmUgaW4gYmFzZSBhbGxlIGltcG9zdGF6aW9uaSBlZmZldHR1YXRlIGRhbCBNZW7DuSBjb250ZXN0dWFsZSBpbiBhbHRvIGEgZGVzdHJhICovXHJcbiAgICBASW5wdXQoKSBDb2x1bW5zT3JkZXJpbmc6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIEV2ZW50dWFsZSBzdXBwb3J0byBhbGxlIHJpY2VyY2hlIGFwcGxpY2F0ZSBhbGxhIG1vZGFsaXTDoCBBcnJheSAqL1xyXG4gICAgQElucHV0KCkgU2VhcmNoVmlldyA9IG51bGwgYXMgQXBwU2VhcmNoPGFueT47XHJcbiAgICAvKiogQWJpbGl0YSBvIGRpc2FiaWxpdGEgaWwgc2lzdGVtYSBjaGUgcGVybWV0dGUgZGkgc2VsZXppb25hcmUgdHV0dGkgZ2xpIGVsZW1lbnRpIG5lbGxhIHZpc3RhICovXHJcbiAgICBASW5wdXQoKSBTZWxlY3RBbGw6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFNpbXVsYSBsYSBwYWdpbmF6aW9uZSBhbmNoZSBwZXIgbGUgdGFiZWxsZSBjaGUgZnVuemlvbmFubyBpbiBtb2RhbGl0w6AgQXJyYXkgKi9cclxuICAgIEBJbnB1dCgpIFVzZUFycmF5TW9kZVBhZ2luZyA9IHRydWU7XHJcbiAgICAvKiogRGVmaW5pemlvbmUgZGkgY29sb25uZSBkaW5hbWNoZSBwZXIgbGEgbW9kYWxpdMOgLCBhcHB1bnRvLCBkaW5hbWljYSAqL1xyXG4gICAgQElucHV0KCkgRHluYW1pY1Jvd0NvbHVtbnNEZWZpbml0aW9uOiBFc1RhYmxlQ29sdW1uc0RlZmluaXRpb25bXSA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIG9wZXJhemlvbmkgZGluYW1pY2hlIGdlbmVyaWNoZSBjaGUgcG9zc29ubyBlc3NlcmUgZWZmZXR0dWF0ZSBwZXIgcmlnYS4gQXBwYWlvbm8gY29tZSBjb2xvbm5lIGV4dHJhIHN1bCBsYXRvIHNpbmlzdHJvIGRlbGxhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIER5bmFtaWNPcGVyYXRpb25zOiBFc1RhYmxlT3BlcmF0aW9uRGVmaW5pdGlvbltdID0gW107XHJcbiAgICAvKiogSW5kaWNhIHNlIHZpc3VhbGl6emFyZSBpIGRhdGkgaW4gbWFuaWVyYSBnZXJhcmNoaWNhICovXHJcbiAgICBASW5wdXQoKSBIaWVyYXJjaHk6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIE5vbWUgZGVsbGEgcHJvcHJpZXTDoCBjaGUgY29udGllbmUgbCdJRCBkZWwgcGFkcmUuIERhIHV0aWxpenphcmUgc2UgKipIaWVyYXJjaHkqKiDDqCBpbXBvc3RhdG8gKi9cclxuICAgIEBJbnB1dCgpIFBhcmVudEtleSA9ICcnO1xyXG4gICAgLyoqIE5vbWUgZGVsbGEgcHJvcHJpZXTDoCBjaGUgY29udGllbmUgbCdJRCBkZWxsJ29nZ2V0dG8gYXR0dWFsZS4gRGEgdXRpbGl6emFyZSBzZSAqKkhpZXJhcmNoeSoqIMOoIGltcG9zdGF0byAqL1xyXG4gICAgQElucHV0KCkgT3duS2V5ID0gJyc7XHJcbiAgICAvKiogSW5kaWNhIHNlIHBhcnRpcmUgY29uIHVuIGFsYmVybyBlc3BhbnNvLiBEYSB1dGlsaXp6YXJlIHNlICoqSGllcmFyY2h5Kiogw6ggaW1wb3N0YXRvICovXHJcbiAgICBASW5wdXQoKSBTdGFydHNFeHBhbmRlZCA9IHRydWU7XHJcbiAgICAvKiogSW5kaWNhIHNlIGVmZmV0dHVhcmUgaWwgc2FsdmF0YWdnaW8gZGVsbGUgcHJlZmVyZW56ZSBkaSByaWNlcmNhICovXHJcbiAgICBASW5wdXQoKSBTYXZlUHJlZmVyZW5jZXM6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEFsbGluZWFtZW50byBkaSBkZWZhdWx0IHBlciBjZWxsZSBlIGhlYWRlcnMgKi9cclxuICAgIEBJbnB1dCgpIERlZmF1bHRBbGlnbm1lbnQ6ICdMZWZ0JyB8ICdSaWdodCcgfCAnQ2VudGVyJyA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIGRvdmUgdmlzdWFsaXp6YXJlIGxlIGluZm9ybWF6aW9uaSBkaSBwYWdpbmF6aW9uZSwgc2Ugc29wcmEsIHNvdHRvIG8gaW4gZW50cmFtYmkgKi9cclxuICAgIEBJbnB1dCgpIFBhZ2luZ1N0eWxlOiAnYm90aCcgfCAndG9wJyB8ICdib3R0b20nID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgZG92ZSB2aXN1YWxpenphcmUgbGUgaW5mb3JtYXppb25pIGRpIHBhZ2luYXppb25lLCBzZSBzb3ByYSwgc290dG8gbyBpbiBlbnRyYW1iaSAqL1xyXG4gICAgQElucHV0KCkgUm93R3JvdXBpbmdQYWdpbmdTdHlsZTogJ2xlZnQnIHwgJ3JpZ2h0JyA9IG51bGw7XHJcbiAgICAvKiogUXVhbG9yYSBwZXIgcXVhbHNpYXNpIG1vdGl2byBub24gdmVuaXNzZSB1c2F0byAqKml0ZW1zKiogZGVsbCdBcHBTZWFyY2ggcXVlc3RvIElucHV0IGluZGljYSBxdWFsIMOoIGlsIG5vbWUgZGVsbGEgcHJvcHJpZXTDoCBkYSB1dGlsaXp6YXJlICovXHJcbiAgICBASW5wdXQoKSBJdGVtU291cmNlUHJvcGVydHk6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAvKiogSW5kaWNhIHNlIHV0aWxpenphcmUgbGEgY2FjaGUgZGkgc2VsZXppb25lIGNoZSBwZXJtZXR0ZSBkaSBtYW50ZW5lcmUgZ2xpIHN0YXRpIGRpIHNlbGV6aW9uZSBkZWkgdmFyaSBvZ2dldHRpIG5hdmlnYW5kbyBkYSB1bmEgcGFnaW5hIGFsbCdhbHRyYSAqL1xyXG4gICAgQElucHV0KCkgVXNlU2VsZWN0aW9uQ2FjaGUgPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIGRlY2lkZXJlIHNlLCBpbiBtb2RhbGl0w6AgcmFnZ3J1cHBhbWVudG8sIG1vc3RyYXJlIG8gbWVubyBpbCB2YWxvcmUgZGVsbGUgY29sb25uZSBkaSBncnVwcG8gbmVnbGkgb2dnZXR0aSBmaW5hbGkuIERpIGRlZmF1bHQgc29ubyBuYXNjb3N0aSAqL1xyXG4gICAgQElucHV0KCkgU2hvd0l0ZW1Hcm91cHNDb2x1bW5zID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgY2hlIHR1dHRpIGkgY2FtcGkgY2hlIGRlZmluaXNjb25vIGxlIG1vZGFsaXTDoCBkaSBtb2RpZmljYSBjYW1wbyBwb3Nzb25vIGVzc2VyZSBtb2RpZmljYXRpIGluIGJhc2UgYWxsZSBpbXBvc3RhemlvbmkgKi9cclxuICAgIEBJbnB1dCgpIEVkaXRhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogSW5kaWNhIHNlIMOoIHBvc3NpYmlsZSBlZmZldHR1YXJlIHNlbGV6aW9uaSBhIHJhbmdlIHBlciBwb2kgZmFyY2kgZXZlbnR1YWxtZW50ZSBjb3BpYSBpbmNvbGxhICovXHJcbiAgICBASW5wdXQoKSBSYW5nZVNlbGVjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBpbCBudW1lcm8gZGkgbWlsbGlzZWNvbmRpIHBlciBjdWkgZGVib3VuY2FyZSBpbCB3cml0ZVZhbHVlIHBlciBsYSBtb2RhbGl0w6AgKipFc1RhYmxlSGFuZGxlZFNlYXJjaCoqICovXHJcbiAgICBASW5wdXQoKSBTZWFyY2hUaHJvdHRsZTogbnVtYmVyID0gNTA7XHJcbiAgICAvKiogRXZlbnRvIGNoZSB2aWVuZSByaWNoaWFtYXRvIGFsIGNhbWJpbyBkaSBvcmlkbmFtZW50byBkaSB1bmEgY29sb25uYSAqL1xyXG4gICAgQE91dHB1dCgpIG9uT3JkZXJDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8QXBwT3JkZXJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxBcHBPcmRlcmluZz4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50byBjaGUgdmllbmUgcmljaGlhbWF0byBxdWFuZG8gbCdlcy10YWJsZSByaXRpZW5lIHNpYSBuZWNlc3NhcmlvIHJpLWVmZmV0dHVhcmUgbGEgcmljZXJjYS5cclxuICAgICAqIElsIGJvb2xlYW5vIGRlbGwnZXZlbnRvIGluZGljYSBzZSB2aWVuZSBzdWdnZXJpdG8gZGkgcmVzZXR0YXJlIGxhIHBhZ2luYSBvIG1lbm8uXHJcbiAgICAgKiBcclxuICAgICAqIFNvbG8gaW4gY2FzbyB2ZW5nYSB1dGlsaXp6YXRhIGxhIG1vZGFsaXTDoCBhIHJhZ2dydXBwYW1lbnRpIGRpIHJpZ2hlIHB1w7Igc3VjY2VkZXJlIGNoZSBsJ2VzLXRhYmxlIHBhc3NpIHVuIGludGVybyBBcHBTZWFyY2ggY29tZSBwYXJhbWV0cm8gZGkgcmljZXJjYSxcclxuICAgICAqIGluIHF1ZWwgY2FzbyBsJ2FwcGxpY2F6aW9uZSByaWNldmVudGUgZG92csOgIG9ub3JhcmUgbGEgcmljaGllc3RhIHNwZWRlbmRvIGFsIGJhY2thbmQgbCdvZ2dldHRvIGRpIHJpY2VyY2EgQVMtSVNcclxuICAgICAqIFxyXG4gICAgICogaWwgdGlwbyBkZWxsJ0VtaXR0ZXIgaW52ZWNlIGRpIGVzc2VyZSBbYm9vbGVhbiB8IEFwcFNlYXJjaDxhbnk+XSDDqCBzdGF0byBpbXBvc3RhdG8gYSBcImFueVwiIHBlciBldml0YXJlIHByb2JsZW1pIGRpIHJldHJvY29tcGF0aWJpbGl0w6BcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIG9uU2VhcmNoUmVxdWVzdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIC8qKiBFdmVudG8gY2hlIHBhcnRlIGFkIG9nbmkgbW9kaWZpY2EgZGkgXCJjaGVja2FnZ2lvXCIgaW4gZm9ybWEgZGkgY29tb2RvIGFycmF5LiBFc3BvbmUgbCdvZ2dldHRvIGNvbiBsbyBzdGF0byBkaSBjaGVjayBhdHR1YWxlICovXHJcbiAgICBAT3V0cHV0KCkgb25TZWxlY3Rpb25DaGFuZ2VkOiBFdmVudEVtaXR0ZXI8SXRlbXNTZWxlY3Rpb248YW55Pj4gPSBuZXcgRXZlbnRFbWl0dGVyPEl0ZW1zU2VsZWN0aW9uPGFueT4+KCk7XHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gYWxsJ2VsaW1pbmF6aW9uZSBkaSB1biBvZ2dldHRvICovXHJcbiAgICBAT3V0cHV0KCkgb25SZW1vdmFsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIGFsbCdhbm51bGxhbWVudG8gZGkgdW4nZWxpbWluYXppb25lICovXHJcbiAgICBAT3V0cHV0KCkgb25BYm9ydFJlbW92YWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gYWxsYSBtb2RpZmljYSBkZWkgbW9kZWxsaSBiaW5kYXRpICovXHJcbiAgICBAT3V0cHV0KCkgb25Nb2RlbENoYW5nZTogRXZlbnRFbWl0dGVyPEVzVGFibGVNb2RlbENoYW5nZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8RXNUYWJsZU1vZGVsQ2hhbmdlW10+KCk7XHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gYWxsJ2FwZXJ0dXJhIGRlbCBtZW7DuSBjb250ZXN0dWFsZSAqL1xyXG4gICAgQE91dHB1dCgpIG9uT3BlbkNvbnRleHRNZW51OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIHF1YW5kbyBzaSBjbGljY2Egc3UgdW4gb3B6aW9uZSBkZWZpbml0YSBuZWxsZSAqKkNvcm5lck1lbnVPcHRpb25zKiogKi9cclxuICAgIEBPdXRwdXQoKSBvbkNvcm5lckFjdGlvbjogRXZlbnRFbWl0dGVyPHsgaWQ6IHN0cmluZywgZXN0YWJsZTogYW55IH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmcsIGVzdGFibGU6IGFueSB9PigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIHF1YW5kbyBzaSBjbGljY2Egc3UgdW4gb3B6aW9uZSBkZWZpbml0YSBuZWxsZSAqKkR5bmFtaWNPcGVyYXRpb25zKiogKi9cclxuICAgIEBPdXRwdXQoKSBvbkR5bmFtaWNPcGVyYXRpb246IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmcsIGl0ZW06IGFueSB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nLCBpdGVtOiBhbnkgfT4oKTtcclxuXHJcbiAgICAvKiogRGF0aSBlc3BvcnRhdGkgZGEgbmd4LWNzdiAqL1xyXG4gICAgcHVibGljIGRhdGE6IGFueVtdO1xyXG4gICAgLyoqIEhlYWRlciBkZWkgZGF0aSBlc3BvcnRhdGkgZGEgbmd4LWNzdiAqL1xyXG4gICAgcHVibGljIGhlYWRlcnM6IENzdkhlYWRlcnNbXTtcclxuICAgIC8qKiBFbGVtZW50byBIVE1MIGRhIGNsaWNjYXJlIHBlciBsJ2VzcG9ydGF6aW9uZSAqL1xyXG4gICAgQFZpZXdDaGlsZCgnZXhwb3J0RG93bmxvYWRlcicsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgZXhwb3J0RG93bmxvYWRlcjogRWxlbWVudFJlZjtcclxuICAgIC8qKiBQbGFjZWhvbGRlciBkaSBtZW7DuSBjb250ZXN0dWFsZSBwZXIgcXVhbmRvIG5vbiBjaSBzb25vIG9wemlvbmkgbmVsIHBsYWNlaG9sZGVyIFwiVmVyb1wiICAqL1xyXG4gICAgQFZpZXdDaGlsZCgnZW1wdHlNZW51JywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHRhYmxlRW1wdHlNZW51OiBDb250ZXh0TWVudUNvbXBvbmVudDtcclxuXHJcbiAgICAvKiogU3Vic2NyaXB0aW9uIHN1bGwnYXBlcnR1cmEgZGVsIGNvbnRleHQgbWVudSBkYSByaXB1bGlyZSBhbCBkZXN0cm95IGRlbGxhIGNsYXNzZSAqL1xyXG4gICAgcHJpdmF0ZSBjdHhNZW51U3Vic2NyaXB0aW9uOiBhbnk7XHJcblxyXG4gICAgLyoqIFBhZ2luYSBpbiB2aXN1YWxpenphemlvbmUgKGR1cmFudGUgbGEgcGFnaW5hemlvbmUgaW4gbW9kYWxpdMOgIEFycmF5KSAqL1xyXG4gICAgcHVibGljIGFycmF5bW9kZVBhZ2UgPSAxO1xyXG4gICAgLyoqIE51bWVybyBkaSBwYWdpbmUgKGR1cmFudGUgbGEgcGFnaW5hemlvbmUgaW4gbW9kYWxpdMOgIEFycmF5KSAqL1xyXG4gICAgcHVibGljIGFycmF5bW9kZVBhZ2VzID0gMTtcclxuICAgIC8qKiBPZ2dldHRpIHBlciBvZ25pIHBhZ2luYSAoZHVyYW50ZSBsYSBwYWdpbmF6aW9uZSBpbiBtb2RhbGl0w6AgQXJyYXkpICovXHJcbiAgICBASW5wdXQoKSBBcnJheW1vZGVJdGVtc1BlclBhZ2UgPSBudWxsO1xyXG4gICAgLyoqIE9nZ2V0dG8gZGkgc2VsZXppb25lIHBlciBsYSBtb2RhbGl0w6AgQXJyYXksIGNoZSBkZXZlIGNvbXBvcnRhcnNpIGNvbWUgbGEgY29udHJvcGFydGUgaW4gbW9kYWxpdMOgIFZpZXcgKi9cclxuICAgIHB1YmxpYyBhcnJheW1vZGVTZWxlY3Rpb246IEl0ZW1zU2VsZWN0aW9uPGFueT47XHJcbiAgICAvKiogQ29sb25uZSBkYSB2aXN1YWxpenphcmUgaW4gbW9kYWxpdMOgIGFycmF5ICovXHJcbiAgICBwdWJsaWMgYXJyYXlDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLyoqIE9yZGluZSBkZWxsZSBjb2xvbm5lIGRhIHZpc3VhbGl6emFyZSBpbiBtb2RhbGl0w6AgYXJyYXkgKi9cclxuICAgIHB1YmxpYyBhcnJheUNvbHVtbk9yZGVyaW5nOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLyoqIE9yZGluYW1lbnRpIEFTQy1ERVNDIHN1bGxlIGNvbG9ubmUgaW4gbW9kYWxpdMOgIGFycmF5ICovXHJcbiAgICBwdWJsaWMgYXJyYXlPcmRlcnM6IEFwcE9yZGVyaW5nW10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhcmlhYmlsZSBjaGUgc2VydmUgYSBnZXN0aXJlIGlsIG1vbWVudG8gaW4gY3VpIGwnZXMtdGFibGUgYWdnaW9ybmEgbGEgcGFnaW5hemlvbmUgKHB1bHNhbnRpIGVjYykuXHJcbiAgICAgKiBFc3NlbmRvIG9wZXJhemlvbmkgY29tdW5xdWUgY29zdG9zZSBsZSBlZmZldHR1byBzb2xvIHN1IGJpbmRpbmcgZXN0ZXJuaSwgbm9uIHN1IHJld3JpdGUgZ2VuZXJhdGkgaW50ZXJuYW1lbnRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW50ZXJuYWxXcml0ZUNhbGwgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhY2hlIGNoZSBjb250ZXJyw6AgdHV0dGUgbGUgcmljZXJjaGUgZWZmZXR0dWF0ZSBzdSBncnVwcGkgZGl2ZXJzaSBkYWwgcHJpbW8gZSBzdSBlbGVtZW50aSBjb250ZW51dGkgbmVpIGdydXBwaS5cclxuICAgICAqIEluIGNhc28gZGkgY2FtYmkgZGkgb3JkaW5hbWVudG8gZGVsbGUgY29sb25uZSBkaXZlcnNlIGRhbGxhIHByaW1hIHR1dHRlIGxlIGNoaWFtYXRlIGZhdHRlIGRhbCBzZWNvbmRvIGxpdmVsbG8gaW4gcG9pIGRldm9ubyBlc3NlcmUgcmllc2VndWl0ZSBzZWNvbmRvIGxhIHNlZ3VlbnRlIGxvZ2ljYTpcclxuICAgICAqIFxyXG4gICAgICogXHJcbiAgICAgKiAqKkNhbWJpbyBvcmRpbmFtZW50byBzdWwgcHJpbW8gZ3J1cHBvKio6IHJlbG9hZCBjb21wbGV0bywgbm9uIG1pIG9jY3VwbyBkaSByaXB1bGlyZSBnbGkgZWxlbWVudGkgYmluZGF0aSBpbiBhbGN1biBtb2RvXHJcbiAgICAgKiBcclxuICAgICAqICoqQ2FtYmlvIG9yZGluYW1lbnRvIHN1bGxhIGNvbG9ubmEgcmVsYXRpdmEgYWxsJ04tZXNpbW8gZ3J1cHBvKio6IHJlbG9hZCBjb21wbGV0byBkZWwgY29udGVudXRvIGRlaSBncnVwcGkgcHJlY2VkZW50aSwgcmlwdWxlbmRvIHByZWNlZGVudGVtZW50ZSBcclxuICAgICAqIHR1dHRpIGdsaSBlbGVtZW50aSBjb24gKipfZ3JvdXBsZXZlbCoqID0gTlxyXG4gICAgICogXHJcbiAgICAgKiAqKkNhbWJpbyBvcmRpbmFtZW50byBzdSB1bmEgY29sb25uYSBub24gcmFnZ3J1cHBhdGEqKjogcmVsb2FkIGNvbXBsZXRvIHBlciB0dXR0aSBpIGdydXBwaSBmaW5hbGkgYXBlcnRpLCBkZXZvIHByZWNlZGVudGVtZW50ZSByaXB1bGlyZSB0dXR0aSBnbGkgZWxlbWVudGkgY29uICoqX2l0ZW0qKiA9IHRydWVcclxuICAgICAqIFxyXG4gICAgICogQWx0cmkgZXZlbnRpIG5vbiBkb3ZyZWJiZXJvIHJhcHByZXNlbnRhcmUgcHJvYmxlbWk6XHJcbiAgICAgKiAtIFNlbGV6aW9uZTogbm9uIGNhbWJpYSBudWxsYVxyXG4gICAgICogLSBQYWdpbmF6aW9uZTogY2FtYmlhIGEgbGl2ZWxsbyByb290IHF1aW5kaSB2aWVuZSByaWNhcmljYXRvIHR1dHRvIGNvbXVucXVlLCBzdGVzc28gdmFsZSBwZXIgbGUgcGFnaW5hemlvbmkgaW50ZXJuZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JvdXBTZWFyY2hSZXF1ZXN0c0NhY2hlOiB7IHBhdGg6IHN0cmluZywgcm91dGU6IEdyb3VwUm91dGVGcmFnbWVudFtdLCB2aWV3OiBBcHBTZWFyY2g8YW55PiwgZ3JvdXBfY29sdW1uOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqIFZhcmlhYmlsZSBkJ2FwcG9nZ2lvIHBlciBjYXBpcmUgc2UgYyfDqCBiaXNvZ25vIGRpIHJpLWVmZmV0dHVhcmUgdW5hIHJpY2VyY2EgbyBtZW5vICovXHJcbiAgICBwcml2YXRlIFJlc2VhcmNoTmVlZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogQ29sb25uZSB2aXNpYmlsaSBkZWxsYSB2aXN0YSBhdHR1YWxlLiBWYWxvcml6emF0byBkaSBkZWZhdWx0IGFsIG51bWVybyBtYXNzaW1vIGRpIGNvbG9ubmUgc3VwcG9ydGF0ZSBkYWxsYSB0YWJlbGxhIHBlciBsZSBjYXNpc3RpY2hlIGluIGFzc2VuemEgZGkgY3VzdG9tIGNlbGxzICovXHJcbiAgICBwdWJsaWMgQ29sdW1uczogeyBWaXNpYmlsZTogbnVtYmVyLCBWaXNpYmxlVW5waW5uZWQ6IG51bWJlciwgR2xvYmFsOiBudW1iZXIgfSA9IHsgVmlzaWJpbGU6IDEwMCwgVmlzaWJsZVVucGlubmVkOiAxMDAsIEdsb2JhbDogMTAwIH07XHJcbiAgICAvKiogSW4gY2FzbyBkaSBSb3cgR3JvdXBpbmcgcXVpIHZpZW5lIHNhbHZhdGEgbGEgdmlzdGEgcHJpbmNpcGFsZSBkZWkgZ3J1cHBpIGJhc2UgKi9cclxuICAgIHB1YmxpYyBNYWluR3JvdXBWaWV3OiBBcHBTZWFyY2g8YW55PiA9IG51bGw7XHJcbiAgICAvKiogQ29udGVnZ2lvIGJhc2UgZGVnbGkgb2dnZXR0aS4gSW4gbW9kYWxpdMOgIG5vcm1hbGUgdmllbmUgcmVzZXR0YXRvIGFkIG9nbmkgbnVvdmEgVmlldyBpbnNlcml0YSwgaW4gbW9kYWxpdMOgIFJvd0dyb3VwaW5nIHZpZW5lIHJlc2V0dGF0byBzb2xvIGFkIHVuYSBudW92YSBWaWV3IGRpIGxpdmVsbG8gXCIwXCIgKi9cclxuICAgIHB1YmxpYyBCYXNlSXRlbXNDb3VudCA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIGNpIHNvbm8gZGVsbGUgY29sb25uZSBwaW5uYXRlIGUgdmlzaWJpbGkuIFNlcnZlIHBlciBwb3RlciBzZXR0YXJlIHR1dHRlIGxlIGNvbG9ubmUgcHJpbWEgY2hlIGFycml2aW5vIGRhdGkgYSBwaW5uZWQqL1xyXG4gICAgcHVibGljIEhhc1Bpbm5lZENvbHVtbnM6IGJvb2xlYW5cclxuICAgIC8qKiBMYXJnaGV6emEgY2FsY29sYXRhIGRlbCBjb250YWluZXIgZGVsbGUgY29sb25uZSBwaW5uYXRlICovXHJcbiAgICBwdWJsaWMgUGlubmVkQ29udGFpbmVyV2lkdGg6IG51bWJlcjtcclxuICAgIC8qKiBJbmRpY2Egc2Ugbm9ub3N0YW50ZSBzaWFtbyBpbiBtb2RhbGl0w6AgYXJyYXkgc29ubyBzdGF0aSBpbmRpdmlkdWF0aSBkZWkgZ3J1cHBpLiBJbiB0YWwgY2FzbyBlcy10YWJsZSBzaSBjb21wb3J0YSBkYSBwc2V1ZG8gYmFja2VuZCBlZCBlZmZldHR1YSBsZSBhZ2dyZWdhemlvbmkgZSByYWdncnVwcGFtZW50aSBjb21wbGV0YW1lbnRlIGxhdG8gY2xpZW50ICovXHJcbiAgICBwdWJsaWMgQXJyYXlHcm91cGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBjaGUgbCdlcy10YWJsZSDDqCBiYXNhdGEgc3VsbGUgZGlyZXR0aXZlIChudW92YSBtb2RhbGl0w6ApICovXHJcbiAgICBwdWJsaWMgRGlyZWN0aXZlc0Jhc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogSW5kaWNhIGxvIHN0YXRvIGRpIHNlbGV6aW9uZSBwZXIgc2luZ29sYSBjZWxsYSAqL1xyXG4gICAgcHVibGljIHNlbGVjdGlvblN0YXR1czogeyBbaW5kZXg6IG51bWJlcl06IHsgW2luZGV4OiBudW1iZXJdOiBJdGVtUHJvcEVkaXRhYmxlUmVmZXJlbmNlIH0gfSA9IHt9O1xyXG4gICAgLyoqIENoaWFtYXRhIHJlYWxlIGFsIHdyaXRlVmFsdWUgZG9wbyBpbCBwYXNzYWdnaW8gZGkgKipTZWFyY2hUaHJvdHRsZSoqIG1pbGxpc2Vjb25kaS4gU29sbyBtb2RhbGl0w6AgRXNUYWJsZUhhbmRsZWRTZWFyY2ggKi9cclxuICAgIHByaXZhdGUgY2FsbFRpbWVvdXQgOiBhbnkgPSBudWxsO1xyXG4gICAgLyoqIENhY2hlIGRlaSB0aCBwaXV0dG9zdG8gY2hlIHJpY2FsY29sYXJzZWxpIGRpIGNvbnRpbnVvICovXHJcbiAgICBwcml2YXRlIHRoc0NhY2hlOiAgeyBbaW5kZXg6IHN0cmluZ106IEVzVGhEaXJlY3RpdmUgfSA9IHt9O1xyXG4gICAgLyoqIEluZGljYSBxdWFuZG8gbGEgY2FjaGUgZGVpIHRoIMOoIHN0YXRhIGZpbGxhdGEgYWxtZW5vIGxhIHByaW1hIHZvbHRhICovXHJcbiAgICBwcml2YXRlIHRoc0NhY2hlU2V0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogXHJcbiAgICAgKiBGbGFnIGNoZSwgc2UgKip0cnVlKiosIHBlciB1biBnaXJvIGRpIGJpbmRpbmcgbWFudGllbmUgbGEgdmlzaWJpbGl0w6AgaW1wb3N0YXRhIGxvY2FsbWVudGUsIHBpdXR0b3N0byBjaGUgYWxsaW5lYXJlIGFsbGEgVmlldyBiaW5kYXRhLiBcclxuICAgICAqIFVzYXRhIHBlciBtb2RpZmljYXJlIGluIG1hbmllcmEgcHJvZ3JhbW1hdGljYSBsYSB2aXNpYmlsaXTDoCBkZWxsZSBjb2xvbm5lIGRhbCBtZXRvZG8gKipzZXRIZWFkZXJWaXNpYmlsaXR5KiosIFxyXG4gICAgICogXHJcbiAgICAgKiBEaXNjbGFpbWVyOiAqKk5PTiBNT0RJRklDQVJFKipcclxuICAgICAqKi9cclxuICAgIHB1YmxpYyB1c2VMb2NhbFZpc2liaWxpdHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBPcHppb25pIGRpIHBhZ2luYXppb25lICovXHJcbiAgICBwdWJsaWMgUGFnZXJPcHRpb25zOiBQYWdlckluZm9zID0gbmV3IFBhZ2VySW5mb3MoKVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgLy8gY2xpY2sgZGVzdHJvIHN1IHVuYSByaWdhIGNvbiBzZWxlemlvbmUgYXR0aXZhOiBUaXJvIGZ1b3JpIGlsIGNvbnRleHQgbWVudSBlIHNlbGV6aW9uZSBsJ2VsZW1lbnRvIGNvcnJlbnRlXHJcbiAgICAgICAgdGhpcy5jdHhNZW51U3Vic2NyaXB0aW9uID0gKHRoaXMuQ29udGV4dE1lbnUgfHwgdGhpcy50YWJsZUVtcHR5TWVudSkub3Blbi5zdWJzY3JpYmUodCA9PiB7XHJcbiAgICAgICAgICAgIC8vIEdydXBwaSB2YSBiZW5lLCBvZ2dldHRpIHB1cmUsIG1hIHNlcGFyYXRvcmkgZnJhIGdydXBwaSBwcm9wcmlvIG5vLi4uXHJcbiAgICAgICAgICAgIGlmICh0Lml0ZW0uX3NlcCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgbGV0IHNob3VsZEVtaXQgPSAhdC5pdGVtLl9zZWxlY3RlZDtcclxuXHJcbiAgICAgICAgICAgIHQuaXRlbS5fc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG4gICAgICAgICAgICB2YXIgaXRlbVNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uX0guaGFuZGxlSXRlbXNTZWxlY3Rpb24oW3QuaXRlbV0pO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzaG91bGRFbWl0KVxyXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQuZW1pdChpdGVtU2VsZWN0aW9uKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICAvLyBTZSB1dGlsaXp6byBsYSBuZXcgc3BpY3kgbW9kZSBkZWR1Y28gdHV0dGkgaSBwYXJhbWV0cmkgZGkgbGF2b3JvIHBvc3NpYmlsaSBhbCBjYXJpY2FtZW50byBkZWxsYSB0YWJlbGxhXHJcbiAgICAgICAgLy8gVmVuZ29ubyBzb3ZyYXNjcml0dGUgc29sbyBsZSBwcm9wcmlldMOgIG5vbiBpbXBvc3RhdGUgZGFsbCd1dGVudGVcclxuICAgICAgICBsZXQgdGRzRCA9IHRoaXMuRXNUZHNEaXJlY3RpdmUubGVuZ3RoID09IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGRzRGlyZWN0aXZlPy5sZW5ndGggPiAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Rkc0RpcmVjdGl2ZSA6IHRoaXMuRXNUZHNEaXJlY3RpdmUgOiB0aGlzLkVzVGRzRGlyZWN0aXZlO1xyXG4gICAgICAgIGxldCB0aHNEID0gdGhpcy5Fc1Roc0RpcmVjdGl2ZS5sZW5ndGggPT0gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUaHNEaXJlY3RpdmU/Lmxlbmd0aCA+IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGhzRGlyZWN0aXZlIDogdGhpcy5Fc1Roc0RpcmVjdGl2ZSA6IHRoaXMuRXNUaHNEaXJlY3RpdmU7XHJcbiAgICAgICAgbGV0IHVzZXNUaHNBbmRUZHNEaXJlY3RpdmVzID0gdGRzRCAmJiB0ZHNELmxlbmd0aCA+IDAgJiYgdGhzRCAmJiB0aHNELmxlbmd0aCA+IDA7XHJcbiAgICAgICAgbGV0IGhhc05vQ29udGVudFByb2plY3Rpb24gPSAhdGhpcy5ib2R5UmVmICYmICF0aGlzLmhlYWRlclJlZiAmJiAhdGhpcy5oZWFkZXJHcm91cFJlZiAmJiAhdGhpcy5zZWNvbmRhcnlIZWFkZXJHcm91cFJlZjtcclxuXHJcbiAgICAgICAgaWYgKHVzZXNUaHNBbmRUZHNEaXJlY3RpdmVzIHx8IGhhc05vQ29udGVudFByb2plY3Rpb24pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuVXNlQ3VzdG9tQ2VsbHMgPT0gbnVsbCkgdGhpcy5Vc2VDdXN0b21DZWxscyA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkhpZGRlbkNvbHVtbnMgPT0gbnVsbCAmJiB0aGlzLlVzZUN1c3RvbUNlbGxzKSB0aGlzLkhpZGRlbkNvbHVtbnMgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5Db2x1bW5zT3JkZXJpbmcgPT0gbnVsbCAmJiB0aGlzLlVzZUN1c3RvbUNlbGxzKSB0aGlzLkNvbHVtbnNPcmRlcmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLk9yZGVyQnlDb2x1bW4gPT0gbnVsbCAmJiB0aGlzLlVzZUN1c3RvbUNlbGxzKSB0aGlzLk9yZGVyQnlDb2x1bW4gPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5TZWxlY3RBbGwgPT0gbnVsbCAmJiB0aGlzLlNlbGVjdGlvbikgdGhpcy5TZWxlY3RBbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5TaGlmdENsaWNrID09IG51bGwgJiYgdGhpcy5TZWxlY3Rpb24pIHRoaXMuU2hpZnRDbGljayA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuRGlyZWN0aXZlc0Jhc2VkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUGVyIHBvdGVyIGNhbWJpYXJlIGlsIGxheW91dCBpbiBiYXNlIGFsIGxpdmVsbG8gZ2VyYXJjaGljbyBpbCBjb21wb25lbnRlIGRldmEgYXZlcmUgaWwgcGllbm8gY29udHJvbGxvIGRpIG9nbmkgY2VsbGEsXHJcbiAgICAgICAgLy9jaGUgY29uIHNvbG8gbGEgcHJvaWV6aW9uZSAoc2VuemEgY2VsbGUgY3Vzb3RtKSBub24gw6ggZGlzcG9uaWJpbGVcclxuICAgICAgICBpZiAodGhpcy5IaWVyYXJjaHkgJiYgIXRoaXMuVXNlQ3VzdG9tQ2VsbHMpXHJcbiAgICAgICAgICAgIHRocm93IFwiRXMtdGFibGUgZXJyb3I6IFBlciBwb3RlciB1dGlsaXp6YXJlIGwnZXMtdGFibGUgY29uIFtIaWVyYXJjaHldPVxcXCJ0cnVlXFxcIiDDqCByaWNoaWVzdG8gYW5jaGUgW1VzZUN1c3RvbUNlbGxzXT1cXFwidHJ1ZVxcXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvcHlTdWJzY3JpcHRpb24pXHJcbiAgICAgICAgICAgIHRoaXMuY29weVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wYXN0ZVN1YnNjcmlwdGlvbilcclxuICAgICAgICAgICAgdGhpcy5wYXN0ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdHhNZW51U3Vic2NyaXB0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLmN0eE1lbnVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29weVBhc3RlRGV0ZWN0b3IuQWN0aXZlRXN0UmVmZXJlbmNlID09IHRoaXMpXHJcbiAgICAgICAgICAgIHRoaXMuY29weVBhc3RlRGV0ZWN0b3IuQWN0aXZlRXN0UmVmZXJlbmNlID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBsZXQgbmV3U2VhcmNoVmlldyA9IGNoYW5nZXNbJ1NlYXJjaFZpZXcnXTtcclxuICAgICAgICBpZiAobmV3U2VhcmNoVmlldyAmJiB0aGlzLlNlYXJjaFZpZXcpXHJcbiAgICAgICAgICAgIHRoaXMuYXJyYXlQdWxzYW50aSA9IHRoaXMudXRpbGl0aWVzX0guZ2V0UGFnZXNBcnJheSg2LCB0aGlzLlNlYXJjaFZpZXcucGFnZSwgdGhpcy5TZWFyY2hWaWV3LnBhZ2VzIHx8IDEsIHRoaXMuU2VhcmNoVmlldy5vYmplY3Rjb3VudCwgdGhpcy5TZWFyY2hWaWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm4pOiB2b2lkIHsgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjsgfVxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbik6IHZvaWQgeyB9XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIGNoYW5nZWQoY2xlYXJJdGVtczogYm9vbGVhbiA9IGZhbHNlKSB7IFxyXG4gICAgICAgIGlmKGNsZWFySXRlbXMgJiYgdGhpcy52aWV3TW9kZSlcclxuICAgICAgICAgICAgKDxBcHBTZWFyY2g8YW55Pj50aGlzLlZpZXcpLml0ZW1zID0gW107XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuVmlldyk7IFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgYXN5bmMgd3JpdGVWYWx1ZShvYmo6IGFueSwgdGhyb3R0bGU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5WaWV3ID0gb2JqID8gb2JqIDogbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuRXNUYWJsZUhhbmRsZWRTZWFyY2ggJiYgdGhyb3R0bGUpIHtcclxuICAgICAgICAgICAgaWYodGhpcy5jYWxsVGltZW91dClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNhbGxUaW1lb3V0KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2FsbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy53cml0ZVZhbHVlKG9iaiwgZmFsc2UpOyB9LCB0aGlzLlNlYXJjaFRocm90dGxlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgIFxyXG4gICAgICAgIC8vIE1pIMOoIGFycml2YXRhIGwnQXBwU2VhcmNoIHF1aW5kaSBkaSBzaWN1cm8gbm9uIGhvIHVuYSByaWNlcmNhIGluIHByb2dyZXNzXHJcbiAgICAgICAgdGhpcy5yZXNlYXJjaEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLlZpZXcgJiYgIXRoaXMuU2VhcmNoVmlldykge1xyXG4gICAgICAgICAgICAvLyBTdSB2aWV3IG51bGxhIGV2aXRvIGRpIGZhcmUgcHJlc3NvY2jDqSBxdWFsc2lhc2kgY29zYS4gU2UgYXJyaXZhIHVuIG51bGwgZGV2byBhbmNoZSBhc3NpY3VyYXJtaSBkaSBub24gbW9zdHJhcmUgbnVsbGFcclxuICAgICAgICAgICAgdGhpcy5ib3VuZFNvdXJjZSA9IHRoaXMuVE1QQm91bmRTb3VyY2UgfHwgW107XHJcblxyXG4gICAgICAgICAgICAvLyBQZXIgZXNzZXJlIHNpY3VybyBjaGUgZG9wbyB1biBiaW5kIGRpIG9nZ2V0dGkgbGEgZXMtdGFibGUgYWdnaW9ybmkgbGEgZ3JhZmljYVxyXG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2UgcGVyIHNiYWdsaW8gbCdvZ2dldHRvIGNoZSBtaSBhcnJpdmEgbm9uIMOoIHRpcGl6emF0byAoaW5zdGFuY2VvZiBBcHBTZWFyY2ggcmVzdGl0dWlzY2UgZmFsc2UgYW5jaGUgc2Ugw6ggZGVsIHRpcG8gZ2l1c3RvKVxyXG4gICAgICAgIC8vIGxvIGNvcnJlZ2dvLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICBpZiAodGhpcy5WaWV3ICYmIHR5cGVvZiAodGhpcy5WaWV3IGFzIGFueSkuaXRlbXNwZXJwYWdlb3ZlcnJpZGUgIT0gJ3VuZGVmaW5lZCcgJiYgISh0aGlzLlZpZXcgaW5zdGFuY2VvZiBBcHBTZWFyY2gpKVxyXG4gICAgICAgICAgICAodGhpcy5WaWV3IGFzIGFueSkuX19wcm90b19fID0gbmV3IEFwcFNlYXJjaCgpO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuU2VhcmNoVmlldyAmJiB0eXBlb2YgKHRoaXMuU2VhcmNoVmlldyBhcyBhbnkpLml0ZW1zcGVycGFnZW92ZXJyaWRlICE9ICd1bmRlZmluZWQnICYmICEodGhpcy5TZWFyY2hWaWV3IGluc3RhbmNlb2YgQXBwU2VhcmNoKSlcclxuICAgICAgICAgICAgKHRoaXMuU2VhcmNoVmlldyBhcyBhbnkpLl9fcHJvdG9fXyA9IG5ldyBBcHBTZWFyY2goKTtcclxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgICAgIGlmICh0aGlzLlZpZXcgJiYgdGhpcy5WaWV3IGluc3RhbmNlb2YgQXBwU2VhcmNoKSB7XHJcbiAgICAgICAgICAgIC8vIFNlIGNhbWJpYSBsJ29nZ2V0dG8gaW50ZXJvIHNpZ25pZmljYSBjaGUgaG8gcmltYW5kYXRvIGxhIHJpY2VyY2FcclxuICAgICAgICAgICAgdGhpcy5zZXRNb2RlKCd2aWV3Jyk7XHJcblxyXG4gICAgICAgICAgICBsZXQgZmlyc3RJdGVtR3JvdXBPck5vR3JvdXBpbmcgPSAodGhpcy5WaWV3LnJlcXVlc3RlZGdyb3Vwcz8ubGVuZ3RoIHx8IDApID09IDA7XHJcblxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gU2UgdmVuZ28gZGEgdW5hIHJpY2VyY2EgaW50ZXJuYSBtYW50ZW5nbyBsbyBzdGF0byBkaSBzZWxlemlvbmUgcHJlY2VkZW50ZSAocXVpbmRpIHN1IGNhbWJpbyBwYWdpbmEsIGNhbWJpbyBpcHAsIGVjYy4uLilcclxuICAgICAgICAgICAgLy8gc2UgaW52ZWNlIGwndXRlbnRlIGhhIGZhdHRvIHVuYSByaWNlcmNhIGx1aSAocXVpbmRpIGNhbWJpYW5kbyBmaWx0cmkpLCBzZWNjbyBsZSBpbmZvIGRpIHNlbGV6aW9uZVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuVmlldy5zZWxlY3Rpb24gfHwgKCF0aGlzLlZpZXcuaW50ZXJuYWxzZWFyY2hyZXF1ZXN0ICYmIGZpcnN0SXRlbUdyb3VwT3JOb0dyb3VwaW5nKSB8fCAhdGhpcy5Vc2VTZWxlY3Rpb25DYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5jbGVhclNlbGVjdGlvbkNhY2hlcygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGVjdGlvbiA9IG5ldyBJdGVtc1NlbGVjdGlvbihbXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHRoaXMuVmlldy5zZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLlZpZXcuaW50ZXJuYWxzZWFyY2hyZXF1ZXN0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAvLyBSZWN1cGVybyBQcmVmZXJlbmNlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNhdmVQcmVmZXJlbmNlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5nQ29udHJvbC5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJOb24gcG9zc28gdXRpbGl6emFyZSBsZSBwcmVmZXJlbmNlIHNlbnphIGF2ZXJlIHVuICduYW1lJyBwZXIgcXVlc3RhIHRhYmVsbGFcIik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5wcmVmU2VydmljZSlcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm9uIHBvc3NvIHV0aWxpenphcmUgbGUgcHJlZmVyZW5jZSBzZW56YSBjaGUgaWwgcGFjY2hldHRvIEBlc2ZhZW56YS9wcmVmZXJlbmNlcyBzaWEgaW5zdGFsbGF0b1wiKTtcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwcmVmcyA9IGF3YWl0IHRoaXMucHJlZlNlcnZpY2UuZ2V0SXRlbTx7IGNvbHVtbnM6IHN0cmluZ1tdLCBjb2x1bW5fb3JkZXJpbmc6IHN0cmluZ1tdLCBvcmRlcnM6IEFwcE9yZGVyaW5nW10gfT4oPHN0cmluZz50aGlzLm5nQ29udHJvbC5uYW1lKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNpIGxhIGdlbnRlIHNpIG1ldHRhIGEgc3BhbW1hcmUgcmVmcmVzaCBjb24gbmdpZiBzdHJhbmkgc3VsbCdlc3RhYmxlIGNyZWFuZG9sYSBlIGRpc3RydWdnZW5kb2xhIE4gdm9sdGUgYWwgc2Vjb25kbyBuZWwgdGVtcG8gY2hlIGNpIG1ldHRlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0aXJhcmUgc3UgbGUgcHJlZmVyZW5jZSBkYSBxdWkgc29wcmEgbGEgVmlldyBwb3RyZWJiZSBlc3NlcmUgY2FtYmlhdGFcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5WaWV3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2xzID0gcHJlZnM/LmNvbHVtbnMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cGRhdGVkUHJlZnMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwb3NpdG9yeTogc3RyaW5nW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2U6IHN0cmluZ1tdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucy5tYXAodCA9PiB0LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IGNvbHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gY29scztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IHRoaXMuVmlldy5jb2x1bW5zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBtb2RhbGl0w6AgcmVwb3J0IGRldm8gY29udHJvbGxhcmUgY2hlIHR1dHRlIGxlIGNvbG9ubmUgc2FsdmF0ZSBmYWNjaWFubyBwYXJ0ZSBkZWxsYSB2aXN0YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBtb2RhbGl0w6Agbm9ybWFsZSBpbnZlY2Ugc2UgbGUgcHJlZmVyZW56ZSBmYW5ubyByaWZlcmltZW50byBhIGRlbGxlIGNvbG9ubmUgY2hlIGlvIG5vbiBobyBuZWxsYSBWaWV3IGF0dHVhbGUgc2lnbmlmaWNhIGNoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG8gZmFjZW5kbyByaWZlcmltZW50byBhIHVuYSB2ZXJzaW9uZSB2ZWNjaGlhIGRlbGwnZXMtdGFibGUsIHF1aW5kaSBub24gZmFjY2lvIG9wZXJhemlvbmlcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5LmluZGV4T2Yoc291cmNlW2ldKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRQcmVmcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZSBtaSBiYXNvIHN1IGRpcmV0dGl2ZSBtYSBuZWxsZSBwcmVmZXJlbmNlIMOoIHByZXNlbnRlIGFuY2hlIHNvbG8gdW5hIGNvbG9ubmEgbm9uIHByZXNlbnRlIG5lbGxlIGRpcmV0dGl2ZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdnVvbCBkaXJlIGNoZSBsJ2VzLXRhYmxlIMOoIGNhbWJpYXRhIHF1aW5kaSBub24gaW1wb3N0byBwcmVmZXJlbmNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5Fc1Roc0RpcmVjdGl2ZT8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXBvc2l0b3J5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGhzQ2FjaGVTZXQgJiYgIXRoaXMudGhzQ2FjaGVbcmVwb3NpdG9yeVtpXV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByZWZzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRQcmVmcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WaWV3LmNvbHVtbnMgPSBwcmVmcz8uY29sdW1ucyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5jb2x1bW5fb3JkZXJpbmcgPSBwcmVmcz8uY29sdW1uX29yZGVyaW5nIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2UgbGUgcHJlZiBzb25vIG51bGxlIG5vbiBzb3ZyYXNjcml2byBnbGkgb3JkaW5pIGRhdG8gY2hlIHBvdHJlYmJlIHNlcnZpcmUgbWV0dGVyZSBkZWdsaSBvcmRpbmFtZW50aSBkaSBkZWZhdWx0IGxhdG8gdHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZWZzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5vcmRlcnMgPSBwcmVmcz8ub3JkZXJzIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBMYSBwYWdpbmF6aW9uZSBkZXZvIGZhcmxhIHNvbGFtZW50ZSBxdWFuZG8gcmljaGllZG8gbyB1biBncnVwcG8gcHJpbmNpcGFsZSAoc2Ugc29ubyBpbiByb3cgZ3JvdXBpbmcpIG8gc2Ugbm9uIHJpY2hpZWRvIGdydXBwaSAoaW4gdHV0dGkgbGdpIGFsdHJpIGNhc2kpXHJcbiAgICAgICAgICAgIGlmIChmaXJzdEl0ZW1Hcm91cE9yTm9Hcm91cGluZylcclxuICAgICAgICAgICAgICAgIHRoaXMuYXJyYXlQdWxzYW50aSA9IHRoaXMudXRpbGl0aWVzX0guZ2V0UGFnZXNBcnJheSg2LCB0aGlzLlZpZXcucGFnZSwgdGhpcy5WaWV3LnBhZ2VzIHx8IDEsIHRoaXMuVmlldy5pdGVtcy5sZW5ndGgsIHRoaXMuVmlldy5pdGVtc3BlcnBhZ2VvdmVycmlkZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuVmlldyAmJiAodGhpcy5WaWV3Lmxlbmd0aCAhPSBudWxsICYmIHRoaXMuVmlldy5sZW5ndGggIT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ2FycmF5Jyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuVXNlU2VsZWN0aW9uQ2FjaGUgfHwgIXRoaXMuYXJyYXltb2RlU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uQ2FjaGVzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFycmF5bW9kZVNlbGVjdGlvbiA9IG5ldyBJdGVtc1NlbGVjdGlvbihbXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHRoaXMuYXJyYXltb2RlU2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUmVjdXBlcm8gUHJlZmVyZW5jZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5TYXZlUHJlZmVyZW5jZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uZ0NvbnRyb2wubmFtZSlcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm9uIHBvc3NvIHV0aWxpenphcmUgbGUgcHJlZmVyZW5jZSBzZW56YSBhdmVyZSB1biAnbmFtZScgcGVyIHF1ZXN0YSB0YWJlbGxhXCIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMucHJlZlNlcnZpY2UpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vbiBwb3NzbyB1dGlsaXp6YXJlIGxlIHByZWZlcmVuY2Ugc2VuemEgY2hlIGlsIHBhY2NoZXR0byBAZXNmYWVuemEvcHJlZmVyZW5jZXMgc2lhIGluc3RhbGxhdG9cIik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJlZnMgPSBhd2FpdCB0aGlzLnByZWZTZXJ2aWNlLmdldEl0ZW08eyBjb2x1bW5zOiBzdHJpbmdbXSwgY29sdW1uX29yZGVyaW5nOiBzdHJpbmdbXSwgb3JkZXJzOiBBcHBPcmRlcmluZ1tdIH0+KDxzdHJpbmc+dGhpcy5uZ0NvbnRyb2wubmFtZSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbHMgPSBwcmVmcz8uY29sdW1ucyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZFByZWZzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVwb3NpdG9yeTogc3RyaW5nW107XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZTogc3RyaW5nW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlZpZXcucmVwb3J0X2NvbHVtbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucy5tYXAodCA9PiB0LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gY29scztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBjb2xzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSB0aGlzLlZpZXcuY29sdW1ucztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCByZXBvcnQgYWdnaW9ybm8gbGUgcHJlZmVyZW56ZSBzb2xvIHNlIGMnw6ggYWxtZW5vIHVuYSBjb2xvbm5hLCBhbHRyaW1lbnRpIHZ1b2wgZGlyZSBjaGUgc2kgcGFydGUgZGEgdnVvdGlcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb24gdHV0dGUgbGUgY29sb25uZSBkaXNwb25pYmlsaVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucyAmJiAoc291cmNlPy5sZW5ndGggfHwgMCkgPT0gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByZWZzID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCBub3JtYWxlIGludmVjZSBzZSBsZSBwcmVmZXJlbnplIGZhbm5vIHJpZmVyaW1lbnRvIGEgZGVsbGUgY29sb25uZSBjaGUgaW8gbm9uIGhvIG5lbGxhIFZpZXcgYXR0dWFsZSBzaWduaWZpY2EgY2hlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvIGZhY2VuZG8gcmlmZXJpbWVudG8gYSB1bmEgdmVyc2lvbmUgdmVjY2hpYSBkZWxsJ2VzLXRhYmxlLCBxdWluZGkgbm9uIGZvY2NpbyBvcGVyYXppb25pXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkuaW5kZXhPZihzb3VyY2VbaV0pID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUHJlZnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlZFByZWZzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5jb2x1bW5zID0gcHJlZnM/LmNvbHVtbnMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5jb2x1bW5fb3JkZXJpbmcgPSBwcmVmcz8uY29sdW1uX29yZGVyaW5nIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2UgbGUgcHJlZiBzb25vIG51bGxlIG5vbiBzb3ZyYXNjcml2byBnbGkgb3JkaW5pIGRhdG8gY2hlIHBvdHJlYmJlIHNlcnZpcmUgbWV0dGVyZSBkZWdsaSBvcmRpbmFtZW50aSBkaSBkZWZhdWx0IGxhdG8gdHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlZnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZpZXcub3JkZXJzID0gcHJlZnM/Lm9yZGVycyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNlYXJjaFZpZXcpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmFycmF5UHVsc2FudGkgPSB0aGlzLnV0aWxpdGllc19ILmdldFBhZ2VzQXJyYXkoNiwgdGhpcy5TZWFyY2hWaWV3LnBhZ2UsIHRoaXMuU2VhcmNoVmlldy5wYWdlcyB8fCAxLCB0aGlzLlNlYXJjaFZpZXcuaXRlbXMubGVuZ3RoLCB0aGlzLlNlYXJjaFZpZXcuaXRlbXNwZXJwYWdlb3ZlcnJpZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5maW5hbGl6ZUNvbnRleHQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5wb3N0Qm91bmRTb3VyY2VDYWxjdWxhdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5WaWV3ICYmICF0aGlzLlZpZXcuc2VsZnNlYXJjaCAmJiB0aGlzLkVzVGFibGVIYW5kbGVkU2VhcmNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuVmlldy5zZWxmc2VhcmNoID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLm9uU2VhcmNoUmVxdWVzdC5lbWl0KGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLlZpZXcgJiYgdGhpcy5WaWV3LnNlbGZzZWFyY2ggJiYgdGhpcy5Fc1RhYmxlSGFuZGxlZFNlYXJjaCkge1xyXG4gICAgICAgICAgICB0aGlzLlZpZXcuc2VsZnNlYXJjaCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEZ1bnppb25lIGRpIHRyYWNrYnkgcGVyIGlsIGJvZHkgY2hlIGRvdnJlYmJlIGV2aXRhcmUgaWwgOTAlIGRlbGxlIGNoYW5nZSBkZXRlY3Rpb24gKi9cclxuICAgIHB1YmxpYyBib2R5VHJhY2tCeSA9IChfOiBudW1iZXIsIGl0ZW06IGFueSkgPT4gaXRlbS5faGFzaDtcclxuXHJcbiAgICAvKiogRnVuemlvbmUgZGkgdHJhY2tieSBnZW5lcmljYSBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgY2hlIGhhbm5vIGlsIGNhbXBvIGlkICovXHJcbiAgICBwdWJsaWMgaWRUcmFja0J5ID0gKF86IG51bWJlciwgaXRlbTogYW55KSA9PiBpdGVtLmlkO1xyXG5cclxuICAgICAvKiogRnVuemlvbmUgZGkgdHJhY2tieSBnZW5lcmljYSBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgY2hlIGhhbm5vIGlsIGNhbXBvIFByb3BlcnR5TmFtZSAqL1xyXG4gICAgcHVibGljIFByb3BlcnR5TmFtZVRyYWNrQnkgPSAoXzogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW0uUHJvcGVydHlOYW1lO1xyXG5cclxuICAgIC8qKiBGdW56aW9uZSBkaSB0cmFja2J5IGdlbmVyaWNhIHBlciB0dXR0aSBnbGkgb2dnZXR0aSBjaGUgaGFubm8gaWwgY2FtcG8gSUQgKi9cclxuICAgIHB1YmxpYyBJRFRyYWNrQnkgPSAoXzogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW0uSUQ7XHJcblxyXG4gICAgLyoqIEZ1bnppb25lIGRpIHRyYWNrYnkgZ2VuZXJpY2EgcGVyIHR1dHRpIGdsaSBvZ2dldHRpIGNoZSBoYW5ubyBpbCBjYW1wbyBJRCAqL1xyXG4gICAgcHVibGljIHZhbFRyYWNrQnkgPSAoXzogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW0udmFsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VjY2Vzc2l2YW1lbnRlIGFsIGJpbmQgZGVsIG51b3ZvIGlucHV0IHF1ZXN0YSBmdW56aW9uZSBzaSBvY2N1cGEgZGkgZmluYWxpenphcmUgdHV0dGkgaSBwYXJhbWV0cmkgZGkgZnVuemlvbmFtZW50byBkZWxsJ2VzLXRhYmxlIFxyXG4gICAgICogaW4gYmFzZSBhIElucHV0IC0gTW9kZWxsbywgZSBxdWFsc2lhc2kgYWx0cmEgY29zYSBwb3NzYSBzZXJ2aXJlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmluYWxpemVDb250ZXh0KCkge1xyXG4gICAgICAgIGxldCB2aWV3Q2FzdGVkID0gdGhpcy5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+O1xyXG5cclxuICAgICAgICBsZXQgaGFzUm93R3JvdXBzID0gdmlld0Nhc3RlZCAmJiAodmlld0Nhc3RlZC5ncm91cGluZ3MgJiYgdmlld0Nhc3RlZC5ncm91cGluZ3MuZmlsdGVyKHQgPT4gIXQuYWdncmVnYXRpb24pLmxlbmd0aCA+IDApIHx8ICh0aGlzLmFycmF5TW9kZSAmJiB0aGlzLkVzVGhzRGlyZWN0aXZlLnNvbWUodCA9PiB0LnRoR3JvdXApKTtcclxuXHJcbiAgICAgICAgLy8gU2UgaG8gZGVpIGdydXBwaSBpbiBtb2RhbGl0w6AgYXJyYXkgZGV2byBzaXN0ZW1hcmUgdW4gcG8nIGRpIHZhcmlhYmlsaSBjaGUgZGl2ZW50YW5vIGluc2Vuc2F0ZVxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSAmJiBoYXNSb3dHcm91cHMpXHJcbiAgICAgICAgICAgIHRoaXMuVXNlQXJyYXlNb2RlUGFnaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIFJpZW1waW1lbnRvIGRlbGxhIFRNUEJvdW5kU291cmNlIGNvbiBnbGkgb2dnZXR0aSBjaGUgdmVycmFubm8gcG9pIG1vc3RyYXRpIGFkIGludGVyZmFjY2lhXHJcbiAgICAgICAgdGhpcy5UTVBCb3VuZFNvdXJjZSA9IHRoaXMuaXRlbXNfSC5nZXRJdGVtc0J5TW9kZShmYWxzZSwgIXRoaXMuaW50ZXJuYWxXcml0ZUNhbGwpO1xyXG5cclxuICAgICAgICAvLyBTZSBobyB1bmEgZ2VyYXJjaGlhLCBhc3NlZ25vIGkgbGl2ZWxsaSBnZXJhcmNoaWNpIGFsbGEgVE1QQm91bmRTb3VyY2VcclxuICAgICAgICBpZiAodGhpcy5IaWVyYXJjaHkgJiYgIWhhc1Jvd0dyb3VwcylcclxuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlNb2RlX0guYXNzaWduSGllcmFyY2h5TGV2ZWxzKHRoaXMuVE1QQm91bmRTb3VyY2UpO1xyXG5cclxuICAgICAgICAvLyBMJ2hhc2hpbmcgZGVnbGkgb2dnZXR0aSBsbyBmYWNjaW8gYSBwcmVzY2luZGVyZVxyXG4gICAgICAgIHRoaXMudXRpbGl0aWVzX0guY2FsY3VsYXRlSGFzaCh0aGlzLlRNUEJvdW5kU291cmNlKTtcclxuXHJcbiAgICAgICAgLy8gQXNzZWdubyBhIHVuYSB2YXJpYWJpbGUgbWlhIGwnZXZlbnR1YWxlIG92ZXJyaWRlIHBlciBsYSBjbGFzc2UgZGVsbGEgcmlnYVxyXG4gICAgICAgIC8vIFNlIHBvaSBzb25vIGluIG1vZGFsaXTDoCBnZXJhcmNoaWNhIGluaWV0dG8gYW5jaGUgbGEgY2xhc3NlIHBlciBsYSBjb25maWd1cmF6aW9uZSBkZWwgbGl2ZWxsbyBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCh0aGlzLlRNUEJvdW5kU291cmNlICYmIHRoaXMuUm93Q2xhc3NBc3NpZ25lcikgfHwgdGhpcy5IaWVyYXJjaHkpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLlRNUEJvdW5kU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuVE1QQm91bmRTb3VyY2VbaV07XHJcbiAgICAgICAgICAgICAgICBpdGVtLl9yb3dDbGFzcyA9IHRoaXMuUm93Q2xhc3NBc3NpZ25lciA/IHRoaXMuUm93Q2xhc3NBc3NpZ25lcihpdGVtKSA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICBpdGVtLl9yb3dDbGFzcyArPSB0aGlzLkhpZXJhcmNoeSA/IFwiIGVzdC1yb3ctbHZsLVwiICsgaXRlbS5fbGV2ZWwgOiBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZW5lcmEgbGUgaW5mb3JtemlvbmkgZGkgcGFnaW5hemlvbmUgcGVyIGxhIHZpc3RhIGdsb2JhbGUgZGVsbCdlcy10YWJsZSAqL1xyXG4gICAgcHJpdmF0ZSBzZXR1cFBhZ2luZ0luZm9ybWF0aW9ucygpIHtcclxuXHJcbiAgICAgICAgLy8gRGVmYXVsdCBjaGUgdmFsZ29ubyBkaSBiYXNlLCBwb2kgZXZlbnR1YWxtZW50ZSBtb2RkYXRpIGRhbGxlIGZ1bnppb25pIHNvdHRvXHJcbiAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50ID0gIXRoaXMuSGlkZVBhZ2luZ0NvdW50O1xyXG4gICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gIXRoaXMuSGlkZVBhZ2luZ0J1dHRvbnM7XHJcbiAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd1BhZ2luZyA9ICF0aGlzLkhpZGVQYWdpbmdcclxuICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5Vc2VzVmlldyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSAmJiB0aGlzLlVzZUFycmF5TW9kZVBhZ2luZyAmJiAhdGhpcy5TZWFyY2hWaWV3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlBhZ2VyQ291bnQgPSAoPGFueVtdPnRoaXMuVmlldykubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnMgJiYgdGhpcy5WaWV3Lmxlbmd0aCA+IDEwO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5WaWV3ID0gdGhpcy5WaWV3O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5Vc2VzVmlldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93UGFnaW5nT3B0aW9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmFycmF5TW9kZSAmJiAoIXRoaXMuVXNlQXJyYXlNb2RlUGFnaW5nIHx8IHRoaXMuU2VhcmNoVmlldykpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuU2VhcmNoVmlldykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuVmlldyA9IHRoaXMuU2VhcmNoVmlld1xyXG4gICAgICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuUGFnZXJDb3VudCA9IHRoaXMuU2VhcmNoVmlldy5vYmplY3Rjb3VudCB8fCAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlBhZ2VyQ291bnQgPSAoPGFueVtdPnRoaXMuVmlldykubGVuZ3RoIHx8IDBcclxuXHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnMgJiYgKHRoaXMuVmlldy5sZW5ndGggPiAxMCB8fCAodGhpcy5TZWFyY2hWaWV3Py5vYmplY3Rjb3VudCB8fCAwKSA+IDEwKTtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50ID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50IHx8ICh0aGlzLlZpZXcgJiYgdGhpcy5WaWV3Lmxlbmd0aCkgfHwgKHRoaXMuU2VhcmNoVmlldyAmJiB0aGlzLlNlYXJjaFZpZXcub2JqZWN0Y291bnQgJiYgdGhpcy5TZWFyY2hWaWV3Lm9iamVjdGNvdW50ICE9IC0xKTtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd1BhZ2luZyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dQYWdpbmcgJiYgKHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zIHx8IHRoaXMuUGFnZXJPcHRpb25zLlNob3dDb3VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dQYWdpbmdPcHRpb25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMudmlld01vZGUpIHtcclxuICAgICAgICAgICAgbGV0IHRtcFZpZXcgPSB0aGlzLk1haW5Hcm91cFZpZXcgfHwgdGhpcy5WaWV3O1xyXG4gICAgICAgICAgICBsZXQgY291bnQgPSB0bXBWaWV3Py5ncm91cGNvdW50IHx8IHRtcFZpZXc/Lm9iamVjdGNvdW50O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TZWFyY2hlcyA9IHRtcFZpZXc/Lmdyb3VwY291bnQgIT0gbnVsbCAmJiB0bXBWaWV3Py5ncm91cGNvdW50ICE9IHVuZGVmaW5lZCA/ICdncm91cHMnIDogJ2l0ZW1zJztcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuUGFnZXJDb3VudCA9IGNvdW50IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlZpZXcgPSB0bXBWaWV3O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQgPSB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQgfHwgKHRtcFZpZXcgJiYgY291bnQgJiYgY291bnQgIT0gLTEpO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zICYmICh0bXBWaWV3LnBhZ2luZ2F2YWlsYWJsZSB8fCB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQpO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93UGFnaW5nT3B0aW9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBsYW5jaWF0byBkb3BvIGNoZSBsYSBzb3JnZW50ZSBkYXRpIMOoIHN0YXRhIGNvcnJldHRhbWVudGUgYmluZGF0YSwgc2kgb2NjdXBhIGRpIHJpY2FsY29sYXJlIHR1dHRvIGNpw7IgY2hlIHNlcnZlXHJcbiAgICAgKiBhbGwnZXMtdGFibGUgcGVyIHJlbmRlcml6emFyZSBpIHZhbG9yaSBkYSBtb3N0cmFyZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBvc3RCb3VuZFNvdXJjZUNhbGN1bGF0aW9uKCkge1xyXG4gICAgICAgIC8vIFJlc2V0dG8gdHV0dG8gdHJhbm5lIFJvd1REcyBlIFJvd1RIcyBwZXIgZXZpdGFyZSBmbGlja2VyaW5nLiBSb3dURHMgZSBSb3dUSHMgc2FyYW5ubyBtb2RpZmljYXRlIGFsbCdpbnRlcm5vIGRlbCBwcm9zc2ltbyBjaWNsbyBkaSBDRFxyXG4gICAgICAgIHRoaXMuUm93Q29udGV4dHMgPSBbXTtcclxuICAgICAgICB0aGlzLk9yZGVyRGlyZWN0aXZlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbUlEID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFBvc3RCb3VuZFNvdXJjZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBQZXIgcG90ZXIgZGlzdGluZ3VlcmUgbGUgY2hpYW1hdGUgYSBxdWVzdG8gbWV0b2RvOiBEb3BvIGlsIHNldFRpbWVvdXQgc2UgdXNvIGdsaSBFc1RkL0VzVGggdmVjY2hpLCBzZW56YSBpbCBzZXRUaW1lb3V0IHNlIHVzbyBsZSBudW92ZSBkaXJldHRpdmUgKi9cclxuICAgIHByaXZhdGUgaW50ZXJuYWxQb3N0Qm91bmRTb3VyY2UoKSB7XHJcbiAgICAgICAgbGV0IFZpZXcgPSB0aGlzLlZpZXc7XHJcblxyXG4gICAgICAgIGxldCB0ZHNEID0gdGhpcy5Fc1Rkc0RpcmVjdGl2ZS5sZW5ndGggPT0gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUZHNEaXJlY3RpdmU/Lmxlbmd0aCA+IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGRzRGlyZWN0aXZlIDogdGhpcy5Fc1Rkc0RpcmVjdGl2ZSA6IHRoaXMuRXNUZHNEaXJlY3RpdmU7XHJcbiAgICAgICAgbGV0IHRoc0QgPSB0aGlzLkVzVGhzRGlyZWN0aXZlLmxlbmd0aCA9PSAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Roc0RpcmVjdGl2ZT8ubGVuZ3RoID4gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUaHNEaXJlY3RpdmUgOiB0aGlzLkVzVGhzRGlyZWN0aXZlIDogdGhpcy5Fc1Roc0RpcmVjdGl2ZTtcclxuXHJcbiAgICAgICAgbGV0IHRocyA9IHRoc0QgJiYgdGhzRC5sZW5ndGggPiAwID8gdGhzRC50b0FycmF5KCkgOiBbXTtcclxuICAgICAgICBsZXQgdGRzID0gdGRzRCAmJiB0ZHNELmxlbmd0aCA+IDAgPyB0ZHNELnRvQXJyYXkoKSA6IFtdO1xyXG5cclxuICAgICAgICAvLyBTZSBub24gaG8gY29sb25uZSBkaW5hbWljaGUgbWEgc29ubyBpbiBtb2RhbGl0w6AgZGluYW1pY2EgKGxvIGNhcGlzY28gcGVyY2jDqSBjJ8OoIHVuYSB2aWV3IHBpZW5hIGRpIGdlbmVyaWNpdGVtKSBtZXR0byBpbCBkZWZhdWx0IGRlbGxlIGNvbG9ubmVcclxuICAgICAgICB0aGlzLmR5bmFtaWNNb2RlX0guZXZlbnR1YWxseVJldmlld0R5bmFtaWNDb2x1bW5zKCk7XHJcblxyXG4gICAgICAgIC8vIEdlc3Rpc2NlIGxhIHJpY2hpZXN0YSBwZXIgZ3J1cHBpIG8gcGVyIHNpbmdvbGkgb2dnZXR0aVxyXG4gICAgICAgIHRoaXMuYmluZERpc3BsYXlUb0xvYWRlZEl0ZW1zT3JHcm91cHMoVmlldyk7XHJcblxyXG4gICAgICAgIC8vIFF1ZXN0byBkZXYnZXNzZXJlIHBlciBmb3J6YSBsYW5jaWF0byBkb3BvICoqYmluZERpc3BsYXlUb0xvYWRlZEl0ZW1zT3JHcm91cHMqKiBkYXRvIGNoZSDDqCBsw6wgY2hlIGFsY3VuZSBjb3NlIHZlbmdvbm8gdmFsb3JpenphdGVcclxuICAgICAgICB0aGlzLnNldHVwUGFnaW5nSW5mb3JtYXRpb25zKCk7XHJcblxyXG4gICAgICAgIC8vIE1vbHRlIGNvc2Ugc29ubyBvdnZpYW1lbnRlIGRpc3BvbmliaWxpIHNvbG8gaW4gbW9kYWxpdMOgIFZpZXdcclxuICAgICAgICBpZiAoKHRoaXMudmlld01vZGUgfHwgdGhpcy5hcnJheU1vZGUpICYmIHRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHtcclxuICAgICAgICAgICAgbGV0IHZpZXcgPSB0aGlzLnZpZXdNb2RlID8gVmlldyBhcyBBcHBTZWFyY2g8YW55PiA6IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBpdGVtc0FuZEdyb3VwcyA9IHRoaXMudmlld01vZGUgPyBbLi4uKHZpZXcuaXRlbXMgfHwgW10pLCAuLi4odmlldy5ncm91cHMgfHwgW10pXSA6IFZpZXcgYXMgYW55W107XHJcbiAgICAgICAgICAgIGxldCBzaSA9IHRoaXMudmlld01vZGUgPyB2aWV3LnNlbGVjdGlvbiA6IHRoaXMuYXJyYXltb2RlU2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAvLyBOLkI6IFJpc3BldHRhcmUgbCdvcmRpbmUgZGkgcXVlc3RlIDMgbWFjcm9jYXRlZ29yaWUgw6ggVklUQUxFXHJcblxyXG4gICAgICAgICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICBTaXN0ZW1hemlvbmkgZGkgVEgsIFRELCBlIHZpc2liaWxpdMOgIHZhcmllICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cclxuICAgICAgICAgICAgLy8gU2UgaG8gZGVmaW5pemlvbmkgZGluYW1pY2hlLCBwcmltYSBkaSBxdWFsc2lhc2kgYWx0cmEgY29zYSBkZXZvIHRyYXNmb3JtYXJsZSBpbiB0aC90ZCBpbiBtb2RvIGNoZSBwb2kgaWwgY29kaWNlIHF1aSBzb3R0byBmYWNjaWEgbGUgc3VlIG1hZ2llXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbj8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKFwiR2VuZXJhdGluZyB0aHMgYW5kIHRkcyBmcm9tIER5bmFtaWMgZGVmaW5pdGlvblwiKTtcclxuICAgICAgICAgICAgICAgIGxldCByZXQgPSB0aGlzLmR5bmFtaWNNb2RlX0guZW1pdFRoc0FuZFRkc0Jhc2VkT25EeW5hbWljRGVmaW5pdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhzID0gcmV0LnRocztcclxuICAgICAgICAgICAgICAgIHRkcyA9IHJldC50ZHM7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEdlc3Rpb25lIGRlbGxlIHZpZXcgaW4gbW9kYWxpdMOgIHJlcG9ydCwgaSB0aCBlIGkgdGQgdmVuZ29ubyByaWdlbmVyYXRpIGRhbGxlIGNvbmZpZ3VyYXppb25pIGRlbGxhIHZpZXdcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmFycmF5TW9kZSAmJiB2aWV3LnJlcG9ydF9jb2x1bW5zKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJHZW5lcmF0aW5nIHRocyBhbmQgdGRzIGZyb20gcmVwb3J0IHJlc3VsdHNcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmV0ID0gdGhpcy5yZXBvcnRNb2RlX0guZ2VuZXJhdGVUaHNBbmRUZHNGcm9tVmlldyh2aWV3KTtcclxuICAgICAgICAgICAgICAgIHRocyA9IHJldC50aHM7XHJcbiAgICAgICAgICAgICAgICB0ZHMgPSByZXQudGRzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBFc3BhbmRvIGkgdGggZSBpIHRkIG11bHRpcGxpIGR1cGxpY2FuZG9saVxyXG4gICAgICAgICAgICBsZXQgcmV0ID0gdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmV4cGFuZE11bHRpVGhzQW5kVGRzKHRocywgdGRzLCBpdGVtc0FuZEdyb3Vwcyk7XHJcbiAgICAgICAgICAgIHRocyA9IHJldC5leHBUaHM7XHJcbiAgICAgICAgICAgIHRkcyA9IHJldC5leHBUZHM7XHJcblxyXG4gICAgICAgICAgICAvLyBHZW5lcm8gbGEgY2FjaGUgZGVpIHRoIGRhIHVzYXJlIGRhIHF1aSBpbiBwb2ksIGRvcG8gYXZlcmdsaSBsYXNjaWF0byBmYXJlIGxlIHN1ZSBjb3NlIGluIGNhc28gY2kgc2lhbm8gZGVpIG11bHRpIG8gZGVpIHJlcG9ydFxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aHNDYWNoZVt0aC50aF0gPSB0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnRoc0NhY2hlU2V0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFByZXBhc3NhZ2dpbyBwZXIgdGlyYXJlIGZ1b3JpIHR1dHRlIGxlIGluZm8gdXRpbGkgc3VnbGkgaGVhZGVycyBpbiBtb2RvIGRhIG5vbiByaWNhY29sYXJzZWxpIHNlbXByZSBkb3BvXHJcbiAgICAgICAgICAgIGxldCBoSSA9IHRoaXMuY29sdW1uTWV0YWRhdGFfSC5ldmFsdWF0ZUhlYWRlcnNHcm91cGluZ0luZm9zKHRocyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5hcnJheU1vZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBtb2RhbGl0w6AgYXJyYXkgbm9uIGhvIHVuIGJhY2tlbmQuLi5cclxuICAgICAgICAgICAgICAgIHRoaXMucm93R3JvdXBpbmdfSC5hcnJheU1vZGVSZXZpZXdHcm91cGluZ3MoaEkubGVhZnMpOyAgLy8gLi4uIGkgcmFnZ3J1cHBhbWVudGkgbGkgZGV2byBmYXJlIGxhdG8gY2xpZW50XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0gucmV2aWV3Q29sdW1uc0xpc3QoaEkubGVhZnMpOyAgICAgICAgICAgICAgICAgICAgICAvLyBBZ2dpb3JuYSBsYSBsaXN0YSBkZWxsZSBjb2xvbm5lIGRhIG1vc3RyYXJlIG5lbGxhIGRpYWxvZyBwZXIgb3JkaW5hbWVudG8gZWNjXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5hbGlnbkNvbHVtbnNJZkxvYWRlZFZpZXcodmlldyk7ICAgICAgICAgICAgICAgICAgIC8vIFNlIHN0byBjYXJpY2FuZG8gdW5hIFZpZXcgZGEgaG90cG90YXRvIChxdWluZGkgY29uIHNhdmVkc3RhdGUgPSB0cnVlKSByaWFsbGluZW8gbGEgdmlzaWJpbGl0w6AgZGVsbGUgY29sb25uZSBlIGlsIGxvcm8gb3JkaW5lLlxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0gubW92ZUZpeGVkQ29sdW1uc0F0VGhlQmVnaW5uaW5nKGhJLmxlYWZzLCB0ZHMpOyAgICAvLyBTcG9zdG8gdHV0dGUgbGUgY29zZSBmaXhlZCBhbGwnaW5pemlvIGluIG1vZG8gY2hlIGxhIGNyZWF6aW9uZSBkaSB0aCBlIHRkIHNpYSBwacO5IHNuZWxsYSAoVXRpbGl6emEgbGUgQ29sdW1uc0xpc3QsIHF1aW5kaSBkZXYnZXNzZXJlIHJpY2hpYW1hdGEgUElSTUEgZGkgcmV2aWV3Q29sdW1uc0xpc3QpXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5hbGlnbkhlYWRlcnNPcmRlcmluZyhoSS5sZWFmcywgdmlldyk7ICAgICAgICAgICAgIC8vIEFsbGluZW8gZ2xpIG9yZGluYW1lbnRpIGFnbGkgaGVhZGVyXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5yZWZyZXNoQ29sdW1uc1Zpc2liaWxpdHkoaEkubGVhZnMsIHRkcywgdmlldyk7ICAgIC8vIExhdm9ybyBzdWkgVEggZWQgZXZlbnR1YWxtZW50ZSBtb2RpZmljbyBsYSB2aXNpYmlsaXTDoCBhbmNoZSBkZWkgVEQuXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5ldmFsdWF0ZVBpbm5lZENvbHVtbnNXaWR0aCgpOyAgICAgICAgICAgICAgICAgICAgIC8vIFNlIHNvbm8gcHJlc2VudGkgY29sb25uZSBwaW5uYXRlIHZhbHV0YSBsYSBkaW1lbnNpb25lIGRlbCBjb250ZW5pdG9yZVxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0guZ2VuZXJhdGVEZWZhdWx0T3JkZXIoaEkubGVhZnMsIHZpZXcpOyAgICAgICAgICAgICAvLyBHZW5lcm8gbGUgZGlyZXR0aXZlIGRpIG9yZGluYW1lbnRvLCBjaGUgc2lhbm8gZGVmYXVsdCBvIGRlcml2YW50aSBkYWxsYSBBcHBTZWFyY2hcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmV2YWx1YXRlSGVhZGVyR3JvdXBzKGhJKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsdXRvIGkgcmFnZ3J1cHBhbWVudGkgZGVnbGkgaGVhZGVyIHNlIHByZXNlbnRpXHJcblxyXG4gICAgICAgICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICBHZW5lcmF6aW9uZSBiaW5kaW5nIHBlciByaWdoZSBlIGNvbG9ubmUgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblxyXG4gICAgICAgICAgICB0aGlzLmV2YWx1YXRlUm93VGhzKGhJLmxlYWZzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSYWNjb2xnbyBpIFRIXHJcbiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVSb3dUZHMoaEkubGVhZnMsIHRkcyk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhY2NvbGdvIGkgVEQgaW4gY29udGVzdGkgc2VwYXJhdGksIHVuIGNvbnRlc3RvIHBlciBvZ25pIGl0ZW0gbyBncnVwcG9cclxuXHJcbiAgICAgICAgICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgIFVsdGltaSBhZ2dpdXN0bWFlbnRpIGRlaSBiaW5kaW5nICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5hcHBseU9yZGVyaW5nKHZpZXcsIHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGxpY28gbCdvcmRpbmFtZW50byBzdWxsZSBjb2xvbm5lIChub24gQVNDIERFU0MsIG1hIFwicHJpbWEgcXVlc3RhIG8gcXVlbGxhIGNvbG9ubmFcIilcclxuICAgICAgICAgICAgdGhpcy5Nb3ZlVGVtcG9yYXJ5VmFyaWFibGVzVG9SZWFsT25lcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29sbGVnbyBUSCBlIFREIGFnZ2l1c3RhdGkgZmlubyBhZCBvcmEgYWxsZSB2YXJpYWJpbGkgZGkgQmluZGluZyBIVE1MXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guZXZhbHVhdGVTZWxlY3Rpb24oaXRlbXNBbmRHcm91cHMsIHNpKTsgICAgICAgICAgICAgICAgIC8vIFJpYWxsaW5lbyBsZSBpbmZvIGRpIHNlbGV6aW9uZSBkZWdsaSBlbGVtZW50aSBkZWxsYSBWaWV3XHJcblxyXG4gICAgICAgICAgICAvLyBWYWx1dGEgbG8gc3RhdG8gaW5pemlhbGUgZGkgc2VsZXppb25lIGEgcmFuZ2VcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5ldmFsdWF0ZVNpbmdsZUNlbGxTZWxlY3Rpb24oaXRlbXNBbmRHcm91cHMsIGhJLmxlYWZzLCB0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbik7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5SZXNlYXJjaE5lZWRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVzZWFyY2hOZWVkZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICgodGhpcy52aWV3TW9kZSB8fCB0aGlzLmFycmF5TW9kZSkgJiYgIXRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHtcclxuICAgICAgICAgICAgLy8gUmlhbGxpbmVvIGxlIGluZm8gZGkgc2VsZXppb25lIGRlZ2xpIGVsZW1lbnRpIGRlbGxhIFZpZXdcclxuICAgICAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy52aWV3TW9kZSA/IChWaWV3IGFzIEFwcFNlYXJjaDxhbnk+KS5pdGVtcyA6IFZpZXcgYXMgYW55W107XHJcbiAgICAgICAgICAgIGxldCBzaSA9IHRoaXMudmlld01vZGUgPyAoVmlldyBhcyBBcHBTZWFyY2g8YW55Pikuc2VsZWN0aW9uIDogdGhpcy5hcnJheW1vZGVTZWxlY3Rpb247XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guZXZhbHVhdGVTZWxlY3Rpb24oaXRlbXMsIHNpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFBlciBlc3NlcmUgc2ljdXJvIGNoZSBkb3BvIHVuIGJpbmQgZGkgb2dnZXR0aSBsYSBlcy10YWJsZSBhZ2dpb3JuaSBsYSBncmFmaWNhXHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgdGhpcy5GaXJzdEJpbmQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVmZmV0dHVhIGlsIGJpbmRpbmcgZGVnbGkgb2dnZXR0aSBwZXJ2ZW51dGkgZGEgcXVlc3RhIGNoaWFtYXRhIGNvbiBnbGkgb2dnZXR0aSBlZmZldHRpdmFtZW50ZSBkYSBncmFmaWNhcmVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IHZpZXcgVmlldyBkYSBjdWkgc29ubyBhcnJpdmF0aSBnbGkgb2dnZXR0aS4gUHXDsiBlc3NlcmUgbyB1biBhcnJheSBzZSBzb25vIGluICoqYXJyYXlNb2RlKiogbyB1bmEgQXBwU2VhcmNoPFQ+IHNlIHNvbm8gaW4gKip2aWV3TW9kZSoqXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYmluZERpc3BsYXlUb0xvYWRlZEl0ZW1zT3JHcm91cHModmlldzogYW55KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLlRNUEJvdW5kU291cmNlIHx8IHRoaXMuVE1QQm91bmRTb3VyY2UubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5CYXNlSXRlbXNDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSBbXTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXJyYXlNb2RlIHx8ICF0aGlzLlVzZUN1c3RvbUNlbGxzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLlRNUEJvdW5kU291cmNlO1xyXG4gICAgICAgICAgICB0aGlzLkJhc2VJdGVtc0NvdW50ID0gdmlldz8ub2JqZWN0Y291bnQgfHwgdmlldz8ubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBncm91cGluZ0tleXMgPSB2aWV3Py5ncm91cGluZ3M/LmZpbHRlcih0ID0+ICF0LmFnZ3JlZ2F0aW9uKT8ubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgaWYgKGdyb3VwaW5nS2V5cyA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLlRNUEJvdW5kU291cmNlO1xyXG4gICAgICAgICAgICB0aGlzLkJhc2VJdGVtc0NvdW50ID0gdmlldz8ub2JqZWN0Y291bnQgfHwgMDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yb3dHcm91cGluZ19ILmhhbmRsZU5ld0RhdGFPblJvd0dyb3VwaW5nKHZpZXcsIGdyb3VwaW5nS2V5cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIE1ldG9kbyByaWNoaWFtYXRvIHNvbG8gcXVhbmRvICoqVE1QUm93VERzKiogZSAqKlRNUFJvd1RIcyoqIHNvbm8gY29tcGxldGFtZW50ZSBnZW5lcmF0aSBlZCBhZ2dpdXN0YXRpLiBTZXJ2ZSBwZXIgY29sbGVnYXJsaSBhbGxlIHZhcmlhYmlsaSB1c2F0ZSBsYXRvIGJpbmRpbmcgSFRNTCAqL1xyXG4gICAgcHJpdmF0ZSBNb3ZlVGVtcG9yYXJ5VmFyaWFibGVzVG9SZWFsT25lcygpIHtcclxuXHJcbiAgICAgICAgdGhpcy5Sb3dURHMgPSB0aGlzLlRNUFJvd1REcztcclxuICAgICAgICB0aGlzLlJvd1RIcyA9IHRoaXMuVE1QUm93VEhzO1xyXG4gICAgICAgIHRoaXMuUm93VGhHcm91cHMgPSB0aGlzLlRNUFJvd1RoR3JvdXBzID8gdGhpcy5UTVBSb3dUaEdyb3Vwcy5yZXZlcnNlKCkgOiBudWxsO1xyXG4gICAgICAgIHRoaXMuRW1wdHlSb3dUZHMgPSB0aGlzLmlzRW1wdHkodGhpcy5Sb3dURHMpO1xyXG5cclxuICAgICAgICB0aGlzLkNvbHVtbnMuVmlzaWJpbGUgPSB0aGlzLlJvd1RIcy5maWx0ZXIodCA9PiB0LlZpc2libGUpLmxlbmd0aDtcclxuICAgICAgICB0aGlzLkNvbHVtbnMuVmlzaWJsZVVucGlubmVkID0gdGhpcy5Sb3dUSHMuZmlsdGVyKHQgPT4gdC5WaXNpYmxlICYmICF0LlBpbm5lZCkubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMuQ29sdW1ucy5HbG9iYWwgPSB0aGlzLkNvbHVtbnMuVmlzaWJsZVVucGlubmVkICsgKHRoaXMuSGFzUGlubmVkQ29sdW1ucyA/IDEgOiAwKSArICh0aGlzLlNlbGVjdGlvbiA/IDEgOiAwKSArICh0aGlzLlJlbW92YWwgPyAxIDogMCkgKyAodGhpcy5FeHBvcnQgfHwgdGhpcy5IaWRkZW5Db2x1bW5zIHx8IHRoaXMuQ29sdW1uc09yZGVyaW5nIHx8IHRoaXMuQ29ybmVyTWVudU9wdGlvbnMgPyAxIDogMClcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBNZXRvZG8gcGVyIGNhcGlyZSBzZSB1biBvZ2dldHRvIMOoIGNvbXBsZXRhbWVudGUgdnVvdG8gXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkYSBjb250cm9sbGFyZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbCdvZ2dldHRvIMOoIHZ1b3RvLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBpc0VtcHR5KG9iajogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yICh2YXIgXyBpbiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJtZXR0ZSBkaSBzZWxlemlvbmFyZSBvIGRlc2VsZXppb25hcmUgaW4gbWFuaWVyYSBhcmJpdHJhcmlhIGRlZ2xpIG9nZ2V0dGlcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gaXRlbXMgT2dnZXR0aSBkYSBzZWxlemlvbmFyZSBvIGRlc2VsZXppb25hcmVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VsZWN0ICoqdHJ1ZSoqIHBlciBzZWxlemlvbmFybGksICoqZmFsc2UqKiBwZXIgbm9uIHRvY2NhcmxpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTZWxlY3Rpb25TdGF0dXMoaXRlbXM6IGFueVtdLCBhbGw6IGJvb2xlYW4sIHNlbGVjdDogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChhbGwpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLlNlbGVjdEFsbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkltcG9zc2liaWxlIGltcG9zdGFyZSBsYSBzZWxlemlvbmUgY29uIGwnYWxsIHNlbGVjdGlvbiBxdWFuZG8gbCdJbnB1dCBTZWxlY3RBbGwgw6ggZmFsc2VcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBzaSA9ICh0aGlzLlZpZXcgYXMgQXBwU2VhcmNoPGFueT4pPy5zZWxlY3Rpb24gfHwgdGhpcy5hcnJheW1vZGVTZWxlY3Rpb247XHJcbiAgICAgICAgICAgIC8vc2UgZGVzZWxlemlvbm8gY29uIGF0dHVhbGUgc2VsZXppb25lIGFkIGFsbCBvIHNlIHNlbGV6aW9ubyBjb24gYXR0dWFsZSBzZWxlemlvbmUgbWFudWFsZSBkZXZvIHJpY2hpYW1hcmUgbGEgKipzZWxlY3RBbGxPclJlc2V0U2VsZWN0aW9uKipcclxuICAgICAgICAgICAgaWYgKChzaS5hbGwgJiYgIXNlbGVjdCkgfHwgKCFzaS5hbGwgJiYgc2VsZWN0KSlcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guc2VsZWN0QWxsT3JSZXNldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guaGFuZGxlSXRlbXNTZWxlY3Rpb24oaXRlbXMsIHNlbGVjdCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGNoZSBnZXN0aXNjZSBpbCBjYW1iaW8gZGkgT3JkaW5hbWVudG8gZGkgdW5hIGNvbG9ubmFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgSUQgZGVsbGEgY29sb25uYSBpbCBjdWkgb3JpZG5hbWVudG8gw6ggY2FtYmlhdG9cclxuICAgICAqIEBwYXJhbSB7J0RFU0MnIHwgJ0FTQyd9IG9yZGVyIE51b3ZvIG9yZGluZSBzZWxlemlvbmF0byBwZXIgbGEgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdGhPcmRlckNoYW5nZWQoaWQ6IHN0cmluZywgb3JkZXI/OiAnREVTQycgfCAnQVNDJykge1xyXG4gICAgICAgIGlmICghdGhpcy52aWV3TW9kZSAmJiAhdGhpcy5hcnJheU1vZGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdPcmRlciBjaGFuZ2VkIG9uIGEgdGFibGUgbm90IGluIHZpZXdNb2RlIG9yIEFycmF5IG1vZGUuIE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5PcmRlckJ5Q29sdW1uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5oYW5kbGVUSE9yZGVyQ2hhbmdlKGlkLCBvcmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gZGEgY2hpYW1hcmUgb2duaSB2b2x0YSBjaGUgc2kgdnVvbGUgZGFyZSBldmlkZW56YSBhbGwnZXN0ZXJubyBkZWwgYmlzb2dubyBkaSByaWVmZmV0dHVhcmUgbGEgcmljZXJjYVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlc2V0c1BhZ2UgSW5kaWNhIGFsIGxpc3RlbmVyIGNoZSBkZXZlIHJlc2V0dGFyZSBpbCBudW1lcm8gZGkgcGFnaW5hXHJcbiAgICAgKiBAcGFyYW0ge0FwcFNlYXJjaDxhbnk+fSB2aWV3T3ZlcnJpZGUgT3ZlcnJpZGUgZGVsbGEgdmlldyBkYSBlbWV0dGVyZSBwZXIgcXVlc3RhIHJpY2VyY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGVtaXRTZWFyY2hSZXF1ZXN0KHJlc2V0c1BhZ2U6IGJvb2xlYW4sIHZpZXdPdmVycmlkZT86IEFwcFNlYXJjaDxhbnk+KSB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlld01vZGUgJiYgIXZpZXdPdmVycmlkZSkge1xyXG4gICAgICAgICAgICAodGhpcy5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+KS5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2aWV3T3ZlcnJpZGUpIHtcclxuICAgICAgICAgICAgaWYgKHJlc2V0c1BhZ2UpXHJcbiAgICAgICAgICAgICAgICB2aWV3T3ZlcnJpZGUucGFnZSA9IDE7XHJcbiAgICAgICAgICAgIHZpZXdPdmVycmlkZS5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgPSB0cnVlXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlc2VhcmNoSW5Qcm9ncmVzcyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlZpZXcgJiYgIXRoaXMuVmlldy5zZWxmc2VhcmNoICYmIHRoaXMuRXNUYWJsZUhhbmRsZWRTZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGZzZWFyY2ggPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMub25TZWFyY2hSZXF1ZXN0LmVtaXQoZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5vblNlYXJjaFJlcXVlc3QuZW1pdCh2aWV3T3ZlcnJpZGUgPyB2aWV3T3ZlcnJpZGUgOiByZXNldHNQYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnRlbmRvIGRhZ2xpICoqRXNUZHMqKiBiaW5kYXRpIGdlbmVyYSwgYWxsJ2ludGVybm8gZGVsIGRpemlvbmFyaW8gKipUTVBSb3dURHMqKiB0dXR0aSBpIGNvbnRlc3RpIGRlaSB2YXJpIG9nZ2V0dGkuXHJcbiAgICAgKlxyXG4gICAgICogVmVuZ29ubyBlc2NsdXNpIGkgVEQgXCJJbnRlcm5pXCIgaW4gcXVhbnRvIHZlbmdvbm8gZ2VuZXJhdGkgZGFnbGkgb3JpZ2luYWxpIHF1aW5kaSBpbmNsdWRlcmxpIHZvcnJlYmJlIGRpcmUgcmllZmZldHR1YXJlIGxlIG9wZXJhemlvbmkgZHVlIHZvbHRlXHJcbiAgICAgKlxyXG4gICAgICogQ29zdG86IDIgc2NhbiBFc1RocywgMSBzY2FuIEVzVGRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFc1RoRGlyZWN0aXZlW119IHRocyBDb2xvbm5lIGRlbGxhIHRhYmVsbGFcclxuICAgICAqIEBwYXJhbSB7RXNUZERpcmVjdGl2ZVtdfSB0ZHMgQ2VsbGUgZGVsbGEgdGFiZWxsYVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlUm93VGRzKHRoczogRXNUaERpcmVjdGl2ZVtdLCB0ZHM6IEVzVGREaXJlY3RpdmVbXSkge1xyXG4gICAgICAgIGlmICh0ZHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGNvbHVtbnNDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IEVzVGFibGVDb2x1bW4gfSA9IHt9O1xyXG5cclxuICAgICAgICBmb3IgKGxldCBjb2xpID0gMDsgY29saSA8IHRoaXMuQ29sdW1uc0xpc3QubGVuZ3RoOyBjb2xpKyspIHtcclxuICAgICAgICAgICAgbGV0IGNvbCA9IHRoaXMuQ29sdW1uc0xpc3RbY29saV07XHJcbiAgICAgICAgICAgIGNvbHVtbnNDYWNoZVtjb2wuaWRdID0gY29sO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5UTVBSb3dURHMgPSB7fTtcclxuICAgICAgICAvLyBWYXJpYWJpbGUgZCdhcHBvZ2dpbyBwZXIgcGVybWV0dGVybWkgZGkgaW5zZXJpcmUgdHV0dGUgbGUgY29sb25uZSBcIkZpeGVkXCIgZGF2YW50aVxyXG4gICAgICAgIGxldCBjb250ZXh0Rml4ZWRzOiB7IFtjb250ZXh0OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0ZCA9IHRkc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ib3VuZFNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmJvdW5kU291cmNlW2ldO1xyXG4gICAgICAgICAgICAgICAgbGV0IGN0eCA9IGl0ZW0uX2hhc2g7XHJcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gdGQudGQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGggPSB0aGlzLnRoc0NhY2hlW3RkLnRkXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoISF0aClcclxuICAgICAgICAgICAgICAgICAgICB0aC5fcmVmZXJlbmNlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gU2tpcHBhcmUgc2VuemEgdGggKGNhc2lzdGljYSB0YWJlbGxhIGRpbmFtaWNhKVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoICYmIHRoLnRoSWYgJiYgKHRkLnRkSWYgfHwgdGgudGhHcm91cCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdGhDYXN0ZWQgPSA8RXNUaERpcmVjdGl2ZT50aDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaXNGaXhlZCA9IHRoLnRoRml4ZWQgfHwgdGgudGhHcm91cCB8fCB0aC50aFBpbm5lZDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbVRvQWRkID0gaXRlbS5faXRlbSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZEVsZW1lbnQ+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVmdEJvcmRlcjogKDxhbnk+dGhDYXN0ZWQpLl9sYm9yZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0Qm9yZGVyOiAoPGFueT50aENhc3RlZCkuX3Jib3JkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IGtleSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpbm5lZDogY29sdW1uc0NhY2hlW3RkLnRkXS5waW5uZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaW5uZWRXaWR0aDogdGhDYXN0ZWQudGhQaW5uZWRXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwSGVhZGVyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwQWdncmVnYXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzaWJsZTogY29sdW1uc0NhY2hlW3RkLnRkXS52aXNpYmxlLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyYXBzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiB0ZC50ZENsYXNzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSWNvbkNsYXNzOiB0ZC50ZEljb25DbGFzcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbkZpZWxkOiB0ZC50ZENvbmRpdGlvbkZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uVmFsdWU6IHRkLnRkQ29uZGl0aW9uVmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaXRsZTogdGQudGRUaXRsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQ6IHRkLnRkQ29udGVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlOiB0aENhc3RlZC50aEdyb3VwICYmICF0aGlzLlNob3dJdGVtR3JvdXBzQ29sdW1ucyA/IG51bGwgOiB0ZC5UZW1wbGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpOiB0ZC5fbXVsdGksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aVByb3A6IHRkLl9tdWx0aSA/IHRkLnRkLnNwbGl0KCdfJylbMF0gOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlJbmRleDogdGQuX211bHRpID8gdGQudGQuc3BsaXQoJ18nKVsxXSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQ6ICh0ZC50ZEFsaWdubWVudCB8fCB0aC50aEFsaWdubWVudCB8fCB0aGlzLkRlZmF1bHRBbGlnbm1lbnQpLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQ6IHRkLnRkRm9ybWF0IHx8IHRoLnRoRm9ybWF0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlOYW1lOiB0aC50aFByb3BlcnR5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlOiB0aC50aFR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVNvdXJjZTogdGgudGhTb3VyY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wQWNjZXNzb3I6IHRkLnRkUHJvcGVydHlBY2Nlc3NvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgPFRkRWxlbWVudD57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWZ0Qm9yZGVyOiAoPGFueT50aENhc3RlZCkuX2xib3JkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHRCb3JkZXI6ICg8YW55PnRoQ2FzdGVkKS5fcmJvcmQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDoga2V5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlubmVkOiBjb2x1bW5zQ2FjaGVbdGQudGRdLnBpbm5lZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpbm5lZFdpZHRoOiB0aENhc3RlZC50aFBpbm5lZFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBIZWFkZXI6IHRoQ2FzdGVkLnRoR3JvdXAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cEFnZ3JlZ2F0aW9uOiAhIXRoQ2FzdGVkLnRoQWdncmVnYXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXNpYmxlOiBjb2x1bW5zQ2FjaGVbdGQudGRdLnZpc2libGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcmFwczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogdGhDYXN0ZWQudGhHcm91cENsYXNzIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudDogdGhpcy5yb3dHcm91cGluZ19ILmdldEdyb3VwQ2VsbERpc3BsYXkoPEdyb3VwPml0ZW0sIGtleSwgPEVzVGhEaXJlY3RpdmU+dGgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlRNUFJvd1REc1tjdHhdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVE1QUm93VERzW2N0eF0ucHVzaChpdGVtVG9BZGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Sb3dDb250ZXh0cy5wdXNoKGN0eCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVE1QUm93VERzW2N0eF0gPSBbaXRlbVRvQWRkXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dEZpeGVkc1tjdHhdID0gaXNGaXhlZCA/IDEgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2Ugbm9uIGhvIG9nZ2V0dGkgw6ggaW51dGlsZSBjaGUgY29udHJvbGxvIGdsaSBlcnJvcmksIGRhdG8gY2hlIGdsaSBlcy10ZCBub24gZXNpc3RlcmFubm8gZGkgY2VydG8gZSBkaSBjb25zZWd1ZW56YSBnbGkgZXMtdGggbm9uIHNhcmFubm8gcmVmZXJlbnppYXRpXHJcbiAgICAgICAgaWYgKHRoaXMuVE1QQm91bmRTb3VyY2UubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdmFyIGVycnM6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldO1xyXG4gICAgICAgICAgICBpZiAoIXRoLl9yZWZlcmVuY2VkKVxyXG4gICAgICAgICAgICAgICAgZXJycy5wdXNoKHRoLnRoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlcnJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdmFyIGVycklkcyA9IGVycnMuam9pbignLCAnKTtcclxuICAgICAgICAgICAgdGhyb3cgXCJMJ0lEIGRpIHVubyBvIHBpw7kgRXNUaCBub24gaGFubm8gYWxjdW4gRXNUZCBhc3NvY2lhdG86IFwiICsgZXJySWRzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnRlbmRvIGRhZ2xpICoqRXNUaHMqKiBiaW5kYXRpIGdlbmVyYSwgYWxsJ2ludGVybm8gZGVsIGRpemlvbmFyaW8gKipUTVBSb3dUSHMqKiB0dXR0aSBpIGNvbnRlc3RpIGRlaSB2YXJpIG9nZ2V0dGkuXHJcbiAgICAgKlxyXG4gICAgICogVmVuZ29ubyBlc2NsdXNpIGkgVEggXCJJbnRlcm5pXCIgaW4gcXVhbnRvIHZlbmdvbm8gZ2VuZXJhdGkgZGFnbGkgb3JpZ2luYWxpIHF1aW5kaSBpbmNsdWRlcmxpIHZvcnJlYmJlIGRpcmUgcmllZmZldHR1YXJlIGxlIG9wZXJhemlvbmkgZHVlIHZvbHRlXHJcbiAgICAgKlxyXG4gICAgICogQ29zdG86IDEgc2NhbiBFc1RocyArIDEgc2NhbiBDb2x1bW5zTGlzdFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RXNUaERpcmVjdGl2ZVtdfSB0aHMgQ29sb25uZSBkZWxsYSB0YWJlbGxhXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZXZhbHVhdGVSb3dUaHModGhzOiBFc1RoRGlyZWN0aXZlW10pIHtcclxuICAgICAgICBpZiAodGhzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBjb2x1bW5zTGlzdENhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogRXNUYWJsZUNvbHVtbiB9ID0ge307XHJcbiAgICAgICAgbGV0IGNhc3RlZFZpZXcgPSA8QXBwU2VhcmNoPGFueT4+dGhpcy5WaWV3O1xyXG4gICAgICAgIGxldCBncm91cGluZ3NVbmRlZmluZWQgPSB0aGlzLnZpZXdNb2RlICYmIChjYXN0ZWRWaWV3ICYmICFjYXN0ZWRWaWV3Lmdyb3VwaW5ncyB8fCBjYXN0ZWRWaWV3Lmdyb3VwaW5ncy5sZW5ndGggPT0gMCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5Db2x1bW5zTGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgaXRtID0gdGhpcy5Db2x1bW5zTGlzdFtpXTtcclxuICAgICAgICAgICAgY29sdW1uc0xpc3RDYWNoZVtpdG0uaWRdID0gaXRtXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLlRNUFJvd1RIcyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0aCA9IHRoc1tpXTtcclxuICAgICAgICAgICAgbGV0IHRvQWRkOiBUaEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodGgudGhJZiB8fCB0aC50aEdyb3VwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHRoQ2xhc3MgPSAodGgudGhDbGFzcyB8fCBcIlwiKSArICh0aC50aFNocmluayA/IFwiIGFwcC1jb2wtbWluXCIgOiBcIlwiKSArICh0aC50aEdyb3VwID8gXCIgZXN0LWNvbC1taW5cIiA6IFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgdG9BZGQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgUGlubmVkOiBjb2x1bW5zTGlzdENhY2hlW3RoLnRoXS5waW5uZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgRml4ZWQ6IHRoLnRoRml4ZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgUGlubmVkV2lkdGg6IHRoLnRoUGlubmVkV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgSUQ6IHRoLnRoLFxyXG4gICAgICAgICAgICAgICAgICAgIFZpc2libGU6IHRoLnRoVmlzaWJsZSxcclxuICAgICAgICAgICAgICAgICAgICBDbGFzczogdGhDbGFzcyxcclxuICAgICAgICAgICAgICAgICAgICBPcmRlcjogdGgudGhPcmRlcixcclxuICAgICAgICAgICAgICAgICAgICBPcmRlcmFibGU6IHRoLnRoT3JkZXJhYmxlLFxyXG4gICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlOiB0aC5UZW1wbGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQ6ICh0aC50aEFsaWdubWVudCB8fCB0aGlzLkRlZmF1bHRBbGlnbm1lbnQpLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2Ugbm9uIMOoIG5lc3N1biBjb250ZW51dG8gbsOpIG5lc3N1biB0ZW1wbGF0ZSBtb3N0cm8gc2VtcGxpY2VtZW50ZSBsJ0lEIGRlbGwnaGVhZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgQ29udGVudDogdGgudGhTdGF0aWNDb250ZW50ICE9IG51bGwgPyB0aC50aFN0YXRpY0NvbnRlbnQgOiB0aC5UZW1wbGF0ZSA/ICcnIDogdGgudGgsXHJcbiAgICAgICAgICAgICAgICAgICAgV3JhcDogdGgudGhXcmFwLFxyXG4gICAgICAgICAgICAgICAgICAgIExlZnRCb3JkZXI6ICg8YW55PnRoKS5fbGJvcmQsXHJcbiAgICAgICAgICAgICAgICAgICAgUmlnaHRCb3JkZXI6ICg8YW55PnRoKS5fcmJvcmQsXHJcbiAgICAgICAgICAgICAgICAgICAgTXVsdGk6IHRoLl9tdWx0aSxcclxuICAgICAgICAgICAgICAgICAgICBNdWx0aUNvbnRlbnQ6IHRoLl9tdWx0aV9jb250ZW50XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5UTVBSb3dUSHMucHVzaCh0b0FkZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gU2UgaG8gdW4gbW9kZWxsbyBjaGUgZGV2ZSBmdW56aW9uYXJlIGEgcm93Z3JvdXBpbmcgbWEgbm9uIMOoIGFuY29yYSBzdGF0YSBlZmZldHR1YXRhIG5lc3N1bmEgcmljZXJjYSBzdWkgZ3J1cHBpIHByaW5jaXBhbGkgKGdyb3VwaW5nc1VuZGVmaW5lZClcclxuICAgICAgICAgICAgICAgIC8vIGxpIGdlbmVybyBlIG1hbmRvIGxhIHByaW1hIHJpY2VyY2EgY2hlIGRldidlc3NlcmUgc3BlZGl0YSBhbCBiYWNrZW5kIHBlciBpbCBwcmltbyBjYXJpY2FtZW50byBkZWkgZ3J1cHBpXHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBpbmdzVW5kZWZpbmVkICYmICh0aC50aEFnZ3JlZ2F0aW9uIHx8IHRoLnRoR3JvdXApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3VwQWdncmVnYXRpb25zOiBHcm91cE9yQWdncmVnYXRpb25bXSA9IHRoaXMucm93R3JvdXBpbmdfSC5nZXRHcm91cEFnZ3JlZ2F0aW9ucyh0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXN0ZWRWaWV3Lmdyb3VwaW5ncylcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzdGVkVmlldy5ncm91cGluZ3MgPSBncm91cEFnZ3JlZ2F0aW9ucztcclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RlZFZpZXcuZ3JvdXBpbmdzLnB1c2goLi4uZ3JvdXBBZ2dyZWdhdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlJlc2VhcmNoTmVlZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNwb3N0YSBsYSByaWNlcmNhIGRpIHVuYSBwYWdpbmEgaW4gYXZhbnRpIChvIGluZGlldHJvKVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlIE51bWVybyBkaSBwYWdpbmUgZGEgYWdnaXVuZ2VyZSAobyBzb3R0cmFycmUsIHNlIG5lZ2F0aXZvKSBhbGxhIHBhZ2luYSBhdHR1YWxlXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gcGFnZXIgRWxlbWVudG8gZGkgc2VwYXJhemlvbmUgc3UgY3VpIMOoIGVmZmV0dHVhdGEgbGEgcmljZXJjYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkVG9QYWdlR3JvdXAocGFnZTogbnVtYmVyLCBwYWdlcjogR3JvdXBQYWdlcikge1xyXG4gICAgICAgIHRoaXMuZ29Ub1BhZ2VHcm91cChwYWdlci52aWV3LnBhZ2UgKyBwYWdlLCBwYWdlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcG9zdGEgbGEgcmljZXJjYSBhbGxhIHBhZ2luYSBzcGVjaWZpY2F0YVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlIFBhZ2luYSBhIGN1aSBuYXZpZ2FyZVxyXG4gICAgICogQHBhcmFtIHthbnl9IHBhZ2VyIEVsZW1lbnRvIGRpIHNlcGFyYXppb25lIHN1IGN1aSDDqCBlZmZldHR1YXRhIGxhIHJpY2VyY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdvVG9QYWdlR3JvdXAocGFnZTogbnVtYmVyLCBwYWdlcjogR3JvdXBQYWdlcikge1xyXG5cclxuICAgICAgICBsZXQgYXBwU2VhcmNoRWxlbWVudCA9IHBhZ2VyLnZpZXc7XHJcbiAgICAgICAgaWYgKHBhZ2UgPT09IDAgfHwgKHBhZ2UgPiBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzICYmIGFwcFNlYXJjaEVsZW1lbnQucGFnZXMgPiAwKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBhcHBTZWFyY2hFbGVtZW50LnBhZ2UgPSBwYWdlO1xyXG4gICAgICAgIHBhZ2VyLmJ1dHRvbnMgPSB0aGlzLnV0aWxpdGllc19ILmdldFBhZ2VzQXJyYXkoNiwgYXBwU2VhcmNoRWxlbWVudC5wYWdlLCBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdChmYWxzZSwgYXBwU2VhcmNoRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQFRPRE8gU3Bvc3RhcmUgaW4gU2VsZWN0aW9uSGFuZGxlclxyXG4gICAgICogXHJcbiAgICAgKiBHZXN0aXNjZSBpIGNsaWNrIHN1bGxhIHRhYmVsbGEgc29sbyBwZXIgbGUgcmlnaGUgYSBncnVwcG8uIFxyXG4gICAgICogTyByaW11b3ZlIGdsaSBlbGVtZW50aSBhdHR1YWxtZW50ZSBwcmVzZW50aSBvIGNhcmljYSBpbCBjb250ZW51dG8gZGVsIGdydXBwb1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55fSBncm91cCBHcnVwcG8gYmluZGF0byBzdSBjdWkgc2kgw6ggZWZmZXR0dWF0byBpbCBjbGlja1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBsJ29wZXJhaXpvbmUgw6ggYW5kYXRhIGEgYnVvbiBmaW5lLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFuZGxlR3JvdXBDbGljayhncm91cDogR3JvdXApOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgY2FzdGVkID0gdGhpcy5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+O1xyXG4gICAgICAgIGxldCBhbnlHID0gKDxhbnk+Z3JvdXApO1xyXG4gICAgICAgIGFueUcuX2V4cGFuZGVkID0gIWFueUcuX2V4cGFuZGVkO1xyXG5cclxuICAgICAgICAvLyBTb25vIGluIG1vZGFsaXTDoCByYWdncnVwcGFtZW50byB2aXJ0dWFsZSBkYSBhcnJheTogRXNwYW5kZXJlIHNpZ25pZmljYSByZW5kZXJlIHZpc2liaWxpIHR1dHRpIGdsaSBvZ2dldHRpIHJlbGF0aXZpIGEgcXVlc3RvIGdydXBwbywgdmljZXZlcnNhIGlsIGNvbnRyYXJyZVxyXG4gICAgICAgIGlmICh0aGlzLkFycmF5R3JvdXBpbmcpIHtcclxuICAgICAgICAgICAgbGV0IGFsbFJlbGF0aXZlcyA9IHRoaXMuYm91bmRTb3VyY2UuZmlsdGVyKHQgPT5cclxuICAgICAgICAgICAgICAgICh0Ll9ncm91cCAmJiAoKGFueUcuX2V4cGFuZGVkICYmIHQuX3BhcmVudCA9PSBhbnlHLl90aGlzS2V5KSB8fCAoIWFueUcuX2V4cGFuZGVkICYmIHQuX3BhcmVudCAmJiB0Ll9wYXJlbnQuc3RhcnRzV2l0aChhbnlHLl90aGlzS2V5KSkpKSB8fFxyXG4gICAgICAgICAgICAgICAgKHQuX2l0ZW0gJiYgKChhbnlHLl9leHBhbmRlZCAmJiB0Ll90aGlzS2V5ID09IGFueUcuX3RoaXNLZXkpIHx8ICghYW55Ry5fZXhwYW5kZWQgJiYgdC5fdGhpc0tleS5zdGFydHNXaXRoKGFueUcuX3RoaXNLZXkpKSkpKVxyXG4gICAgICAgICAgICBhbGxSZWxhdGl2ZXMuZm9yRWFjaCh0ID0+IHsgdC5fdmlzaWJsZSA9IGFueUcuX2V4cGFuZGVkOyBpZiAodC5fZ3JvdXApIHQuX2V4cGFuZGVkID0gZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhbnlHLl9leHBhbmRlZCkge1xyXG4gICAgICAgICAgICAvLyBSZXNldHRvIGlwcFxyXG4gICAgICAgICAgICBjYXN0ZWQuaXRlbXNwZXJwYWdlb3ZlcnJpZGUgPSAxNTtcclxuICAgICAgICAgICAgaWYgKCFjYXN0ZWQucmVxdWVzdGVkZ3JvdXBzKVxyXG4gICAgICAgICAgICAgICAgY2FzdGVkLnJlcXVlc3RlZGdyb3VwcyA9IFtuZXcgR3JvdXBGaWx0ZXIoZ3JvdXAuY29sdW1uLCBncm91cC52YWx1ZSldO1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBsZXZlbCA9IGFueUcuX2dyb3VwbGV2ZWw7XHJcbiAgICAgICAgICAgICAgICAvLyBzZSBpbCBncnVwcG8gY2xpY2NhdG8gbm9uIGhhIHVuIGxpdmVsbG8gw6ggaWwgcHJpbW8gZ3J1cHBvLCBxdWluZGkgb3JkaW5hbWVudG8gdW5pY29cclxuICAgICAgICAgICAgICAgIC8vIGFsdHJpbWVudGkgZGV2byByaW11b3ZlcmUgdHV0dGkgaSBmaWx0cmkgc3UgbGl2ZWxsaSBzdXBlcmlvcmkgYWwgbGV2ZWwgY2xpY2NhdG8gZSBhZ2dpdW5nZXJlIGlsIGxldmVsIGNsaWNjYXRvXHJcbiAgICAgICAgICAgICAgICBpZiAoIWxldmVsKVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc3RlZC5yZXF1ZXN0ZWRncm91cHMgPSBbbmV3IEdyb3VwRmlsdGVyKGdyb3VwLmNvbHVtbiwgZ3JvdXAudmFsdWUpXTtcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc3RlZC5yZXF1ZXN0ZWRncm91cHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBhbnlHLl9wYXJlbnRSb3V0ZS5mb3JFYWNoKChzdGVwOiBHcm91cFJvdXRlRnJhZ21lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzdGVkLnJlcXVlc3RlZGdyb3Vwcy5wdXNoKG5ldyBHcm91cEZpbHRlcihzdGVwLmNvbHVtbiwgc3RlcC52YWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc3RlZC5yZXF1ZXN0ZWRncm91cHMucHVzaChuZXcgR3JvdXBGaWx0ZXIoZ3JvdXAuY29sdW1uLCBncm91cC52YWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBwYXRoID0gKGFueUcuX3BhcmVudCB8fCAnJykgKyBncm91cC52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNlIGhvIGNoaXVzbyB1biBncnVwcG8gbm9uIG1pIHNlcnZlIHJpZWZmZXR0dWFyZSByaWNlcmNlLCBtaSBiYXN0YSBlbGltaW5hcmUgZGFnbGkgb2dnZXR0aSBiaW5kYXRpIHR1dHRpIGdsaSBlbGVtZW50aSBzb3R0b3N0YW50aSBhIHF1ZWwgZ3J1cHBvXHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLmJvdW5kU291cmNlLmZpbHRlcih0ID0+ICF0Ll9wYXJlbnQgfHwgIXQuX3BhcmVudC5zdGFydHNXaXRoKHBhdGgpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGRldm8gcGVyw7IgYW5jaGUgcmltdW92ZXJlIGV2ZW50dWFsaSBjYWNoZSByZWxhdGl2ZVxyXG4gICAgICAgICAgICB0aGlzLmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZSA9IHRoaXMuZ3JvdXBTZWFyY2hSZXF1ZXN0c0NhY2hlLmZpbHRlcih0ID0+IHQucGF0aCAhPSBwYXRoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlc3Rpc2NlIGxhIHNlbGV6aW9uZSBnbG9iYWxlIGRlZ2xpIG9nZ2V0dGksIHNpYSBwZXIgcGFnaW5hIGNoZSBhIGxpdmVsbG8gZGkgKipTZWxlY3RBbGwqKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2VkVmFsIFZhbG9yZSBmb3J6YXRvIGRpIGNoZWNrIGRhIGFzc2VnbmFyZSBhZ2xpIG9nZ2V0dGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdsb2JhbENoZWNrQ2hhbmdlZChmb3JjZWRWYWw6IGJvb2xlYW4gPSBudWxsKSB7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJTZWxlY3Rpb25TdGF0dXNFeGNsdWRpbmcobnVsbCk7XHJcblxyXG4gICAgICAgIC8vIFByZW5kbyB0dXR0aSBnbGkgZWxlbWVudGkgcHJlc2VudGkgaW4gcXVlc3RhIHZpc3RhLiBTZSBobyBncnVwcGkgcHJlbmRvIHNvbG8gaSBncnVwcGkgYSBsaXZlbGxvIDAsIGFsdHJpbWVudGkgcHJlbmRvIHR1dHRpIGdsaSBvZ2dldHRpIHBlciBzZWxlemlvbmFybGlcclxuICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLmJvdW5kU291cmNlLmZpbmQodCA9PiB0Ll9ncm91cCkgPyB0aGlzLmJvdW5kU291cmNlLmZpbHRlcih0ID0+IHQuX2dyb3VwICYmICF0Ll9wYXJlbnQpIDogdGhpcy5ib3VuZFNvdXJjZTtcclxuICAgICAgICB2YXIgaXRlbVNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uX0guaGFuZGxlSXRlbXNTZWxlY3Rpb24oaXRlbXMsIGZvcmNlZFZhbCwgdGhpcy5nbG9iYWxDaGVjayk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoaXRlbVNlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAVE9ETyBTcG9zdGFyZSBpbiBTZWxlY3Rpb25IYW5kbGVyXHJcbiAgICAgKiBcclxuICAgICAqIEdlc3Rpc2NlIGkgY2xpY2sgc3VsbGEgdGFiZWxsYSwgZ2VzdGVuZG8gZXZlbnR1YWxtZW50ZSBhbmNoZSBnbGkgU2hpZnQgKyBDbGljayBwZXIgc2VsZXppb25hcmUgdW4gcmFuZ2UgZGkgb2dnZXR0aVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55fSBldmVudCBFdmVudG8gbmF0aXZvIEhUTUwgZGVsIGNsaWNrXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIGJpbmRhdG8gc3UgY3VpIHNpIMOoIGVmZmV0dHVhdG8gaWwgY2xpY2tcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbCdvcGVyYWl6b25lIMOoIGFuZGF0YSBhIGJ1b24gZmluZSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhbmRsZUNsaWNrKGV2ZW50OiBhbnksIGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX0guY2xlYXJUZXh0U2VsZWN0aW9uKGV2ZW50KTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG5cclxuICAgICAgICBsZXQgc2VsZWN0ZWRpdGVtczogYW55W10gPSBbXTtcclxuICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgdGhpcy5TaGlmdENsaWNrICYmICF0aGlzLlNpbmdsZVNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRTZWxlY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGxldCBpdGVtcyA9IHRoaXMuYm91bmRTb3VyY2UuZmlsdGVyKHQgPT4gIXQuX2dyb3VwICYmICF0Ll9zZXApO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0U2VsZWN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5fc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkaXRlbXMucHVzaCh0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICgodCA9PSBpdGVtIHx8IHQgPT0gdGhpcy5sYXN0U2VsZWN0ZWQpICYmICFzdGFydFNlbGVjdGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0Ll9zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRpdGVtcy5wdXNoKHQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodCA9PSBpdGVtIHx8IHQgPT0gdGhpcy5sYXN0U2VsZWN0ZWQpICYmIHN0YXJ0U2VsZWN0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpdGVtLl9zZWxlY3RlZCA9ICFpdGVtLl9zZWxlY3RlZDtcclxuICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWQgPSBpdGVtO1xyXG4gICAgICAgICAgICBzZWxlY3RlZGl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaXRlbVNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uX0guaGFuZGxlSXRlbXNTZWxlY3Rpb24oc2VsZWN0ZWRpdGVtcyk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoaXRlbVNlbGVjdGlvbik7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Bvc3RhIGxhIHJpY2VyY2EgZGkgdW5hIHBhZ2luYSBpbiBhdmFudGkgKG8gaW5kZWl0cm8pXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgTnVtZXJvIGRpIHBhZ2luZSBkYSBhZ2dpdW5nZXJlIChvIHNvdHRyYXJyZSwgc2UgbmVnYXRpdm8pIGFsbGEgcGFnaW5hIGF0dHVhbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFRvUGFnZShwYWdlOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgdmlldyA9IHRoaXMuTWFpbkdyb3VwVmlldyA/IHRoaXMuTWFpbkdyb3VwVmlldyA6IHRoaXMuVmlldztcclxuXHJcbiAgICAgICAgdGhpcy5nb1RvUGFnZSgoKHRoaXMuU2VhcmNoVmlldyB8fCB2aWV3KT8ucGFnZSB8fCAwKSArIHBhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Bvc3RhIGxhIHJpY2VyY2EgYWxsYSBwYWdpbmEgc3BlY2lmaWNhdGFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBQYWdpbmEgYSBjdWkgbmF2aWdhcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdvVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIGxldCB2aWV3ID0gdGhpcy5NYWluR3JvdXBWaWV3ID8gdGhpcy5NYWluR3JvdXBWaWV3IDogKHRoaXMuYXJyYXlNb2RlID8gdGhpcy5TZWFyY2hWaWV3IDogdGhpcy5WaWV3KTtcclxuICAgICAgICBpZiAoIXZpZXcucGFnZSB8fCAhdmlldy5wYWdlcylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgYXBwU2VhcmNoRWxlbWVudCA9IHRoaXMuU2VhcmNoVmlldyB8fCB2aWV3O1xyXG4gICAgICAgIGlmIChwYWdlID09PSAwIHx8IChwYWdlID4gYXBwU2VhcmNoRWxlbWVudC5wYWdlcyAmJiBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzID4gMCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgYXBwU2VhcmNoRWxlbWVudC5wYWdlID0gcGFnZTtcclxuICAgICAgICBsZXQgY291bnQgPSAodmlldy5pdGVtcy5sZW5ndGggfHwgdmlldy5ncm91cHM/Lmxlbmd0aCB8fCAwKTtcclxuICAgICAgICBsZXQgaXBwID0gdmlldy5pdGVtc3BlcnBhZ2VvdmVycmlkZSB8fCAxNTtcclxuICAgICAgICB0aGlzLmFycmF5UHVsc2FudGkgPSB0aGlzLnV0aWxpdGllc19ILmdldFBhZ2VzQXJyYXkoNiwgYXBwU2VhcmNoRWxlbWVudC5wYWdlLCBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzLCBjb3VudCwgaXBwKTtcclxuXHJcbiAgICAgICAgbGV0IGhhc0dyb3VwaW5ncyA9ICEhdGhpcy5NYWluR3JvdXBWaWV3O1xyXG4gICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QoZmFsc2UsIGhhc0dyb3VwaW5ncyA/IHZpZXcgOiB0aGlzLlNlYXJjaFZpZXcgPyB0aGlzLlNlYXJjaFZpZXcgOiBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50byByaWNoaWFtYXRvIHN1bCBjYW1iaW8gZGVsbGEgcGFnaW5hemlvbmUuIFZlcnLDoCByaWNoaWFtYXRvIGwnZXZlbnRvICoqZW1pdFNlYXJjaFJlcXVlc3QqKlxyXG4gICAgICogcGVyIGNvbXVuaWNhcmUgYWwgY29tcG9uZW50ZSBjaGUgdXRpbGl6emEgcXVlc3RhIHRhYmVsbGEgY2hlIGkgZGF0aSBzb25vIGRhIGFnZ2lvcm5hcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uSXRlbXNQZXJQYWdlQ2hhbmdlZChuZXdJcHApIHtcclxuICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5WaWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlID0gbmV3SXBwO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG4gICAgICAgIGlmICh0aGlzLk1haW5Hcm91cFZpZXcpXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSwgdGhpcy5NYWluR3JvdXBWaWV3KTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLlNlYXJjaFZpZXcpIHtcclxuICAgICAgICAgICAgLy8gUXVlc3RvIHNlY29uZG8gbWUgc2kgcHXDsiBwb3J0YXJlIGEgbGl2ZWxsbyB1biBwbycgcGnDuSBhbHRvXHJcbiAgICAgICAgICAgIHRoaXMuU2VhcmNoVmlldy5wYWdlID0gMTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlLCB0aGlzLlNlYXJjaFZpZXcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIHN1bCBjYW1iaW8gZGVsbGEgcGFnaW5hemlvbmUuIFZlcnLDoCByaWNoaWFtYXRvIGwnZXZlbnRvICoqZW1pdFNlYXJjaFJlcXVlc3QqKiBjb24gbGEgdmlzdGEgZGVsIHNlcGFyYXRvcmUgKi9cclxuICAgIHB1YmxpYyBvbkdyb3VwSXRlbXNQZXJQYWdlQ2hhbmdlZChwYWdlcjogR3JvdXBQYWdlciwgbmV3SXBwOiBudW1iZXIpIHtcclxuICAgICAgICBwYWdlci52aWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlID0gbmV3SXBwO1xyXG4gICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSwgcGFnZXIudmlldyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiBNZXRvZG8gY2hlIGdlc3Rpc2NlIGxhIG1vZGlmaWNhIGRlbCB0ZW1wbyBzcGVjaWZpY2F0byBwZXIgbCdhZ2dpb3JuYW1lbnRvIGF1dG9tYXRpY28gKi9cclxuICAgIHB1YmxpYyBhdXRvVXBkYXRlQ2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAoIS9eWzEtOV1cXGQqJC8udGVzdCh0aGlzLnNlY29uZHMpKVxyXG4gICAgICAgICAgICB0aGlzLnNlY29uZHMgPSAnMTAnO1xyXG5cclxuICAgICAgICBsZXQgc2Vjb25kc0luTXMgPSBwYXJzZUludCh0aGlzLnNlY29uZHMsIG51bGwpICogMTAwMDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b1VwZGF0ZSlcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVUaW1lciA9IHNldEludGVydmFsKCgpID0+IHsgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdChmYWxzZSk7IH0sIHNlY29uZHNJbk1zKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVUaW1lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gY2hpYW1hdG8gZGFsIGNsaWNrIHN1IHVuYSBkZWxsZSBjb2xvbm5lIGdlbmVyYXRlIGRhbGwnSW5wdXQgKipEeW5hbWljT3BlcmF0aW9ucyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gTCdvZ2dldHRvIHN1IGN1aSB2YSBlZmZldHR1YXRhIGwnb3BlcmF6aW9uZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9waWQgQ29kaWNlIGlkZW50aWZpY2F0aXZvIGRlbGwnb3BlcmF6aW9uZSBkYSBlZmZldHR1YXJzaVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZHluYW1pY09wZXJhdGlvbihpdGVtOiBhbnksIG9waWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMub25EeW5hbWljT3BlcmF0aW9uLmVtaXQoeyBpZDogb3BpZCwgaXRlbTogaXRlbSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgY29udGVudXRvIGRlbGwnRXNUZCBkYSB1dGlsaXp6YXJlIHBlciBsYSBjb2xvbm5hIHNwZWNpZmljYXRhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW4gQ29sb25uYSBwZXIgY3VpIGNlcmNhcmUgbGEgY2VsbGFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5vbWUgZGlyZXR0byBwZXIgY2VyY2FyZSBpbCBURCBjb24gbCdJRC4gUXVlc3RhIHZhcmlhYmlsZSBoYSBwcmlvcml0w6AgcmlzcGV0dG8gYSAqKmNvbHVtbioqXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtUZW1wbGF0ZVJlZjxhbnk+fSBUZW1wbGF0ZSBkYSB1c2FyZSBwZXIgbGEgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmluZEVzVGQoY29sdW1uOiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IG51bGwpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcclxuICAgICAgICB2YXIgRXNUZCA9IHRoaXMuRXNUZHNEaXJlY3RpdmUuZmluZCgoaXRlbSkgPT4gbmFtZSA/IGl0ZW0udGQgPT09IG5hbWUgOiBpdGVtLnRkRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgLy8gTmFtZSBub24gdHJvdmF0bywgZmFsbGJhY2sgYWwgbm9tZSBkZWxsYSBjb2xvbm5hXHJcbiAgICAgICAgaWYgKG5hbWUgJiYgY29sdW1uICYmICFFc1RkKVxyXG4gICAgICAgICAgICBFc1RkID0gdGhpcy5Fc1Rkc0RpcmVjdGl2ZS5maW5kKChpdGVtKSA9PiBpdGVtLnRkRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgcmV0dXJuIEVzVGQgPyBFc1RkLlRlbXBsYXRlIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgY29udGVudXRvIGRlbGwnZWRpdG9yIEVzVGQgZGEgdXRpbGl6emFyZSBwZXIgbGEgY29sb25uYSBzcGVjaWZpY2F0YVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uIENvbG9ubmEgcGVyIGN1aSBjZXJjYXJlIGwnZWRpdG9yXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOb21lIGRpcmV0dG8gcGVyIGNlcmNhcmUgbCdFZGl0b3IgY29uIGwnSUQuIFF1ZXN0YSB2YXJpYWJpbGUgaGEgcHJpb3JpdMOgIHJpc3BldHRvIGEgKipjb2x1bW4qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7VGVtcGxhdGVSZWY8YW55Pn0gVGVtcGxhdGUgZGEgdXNhcmUgcGVyIGxhIGNvbG9ubmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpbmRFZGl0b3IoY29sdW1uOiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IG51bGwpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcclxuICAgICAgICB2YXIgRWRpdG9yID0gdGhpcy5Fc1RkRWRpdG9yRGlyZWN0aXZlcy5maW5kKChpdGVtKSA9PiBuYW1lID8gaXRlbS5lZGl0b3IgPT09IG5hbWUgOiBpdGVtLmVkaXRvckZvclByb3BlcnR5ID09PSBjb2x1bW4pO1xyXG4gICAgICAgIC8vIE5hbWUgbm9uIHRyb3ZhdG8sIGZhbGxiYWNrIGFsIG5vbWUgZGVsbGEgY29sb25uYVxyXG4gICAgICAgIGlmIChuYW1lICYmIGNvbHVtbiAmJiAhRWRpdG9yKVxyXG4gICAgICAgICAgICBFZGl0b3IgPSB0aGlzLkVzVGRFZGl0b3JEaXJlY3RpdmVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZWRpdG9yRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgcmV0dXJuIEVkaXRvciA/IEVkaXRvci5UZW1wbGF0ZSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFcXVpdmFsZW50ZSBkZWwgbWV0b2RvICoqYWRkVG9QYWdlKiogcmlhZGF0dGF0byBwZXIgbGEgbW9kYWxpdMOgIGFycmF5XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgTnVtZXJvIGRpIHBhZ2luZSBkYSBhZ2dpdW5nZXJlIChvIHNvdHRyYXJyZSwgc2UgbmVnYXRpdm8pIGFsbGEgcGFnaW5hIGF0dHVhbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFycmF5QWRkVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuYXJyYXlHb1RvUGFnZSh0aGlzLmFycmF5bW9kZVBhZ2UgKyBwYWdlKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXF1aXZhbGVudGUgZGVsIG1ldG9kbyAqKmdvVG9QYWdlKiogcmlhZGF0dGF0byBwZXIgbGEgbW9kYWxpdMOgIGFycmF5XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgUGFnaW5hIGEgY3VpIG5hdmlnYXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcnJheUdvVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChwYWdlID09PSAwIHx8IHBhZ2UgPiB0aGlzLmFycmF5bW9kZVBhZ2VzKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgdGhpcy5hcnJheW1vZGVQYWdlID0gcGFnZTtcclxuXHJcbiAgICAgICAgLy8gUmlmb3J6byBpbCB3cml0ZXZhbHVlIGluIG1vZG8gY2hlIGlsIGNvZGljZSBwYXNzaSBkYWxsYSBnZXN0aW9uZSBjb21lIHNlIGZvc3NlIGZhdHRhIHJpcGFydGlyZSB1bmEgcmljZXJjYVxyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxXcml0ZVZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXN0aW9uZSBkZWkgY2xpY2sgc3VsbGUgb3B6aW9uaSBkZWwgbWVuw7kgY29udGVzdHVhbGUgaW4gYWx0byBhIGRlc3RyYSBnZW5lcmF0byBkYWxsJ0lucHV0ICoqQ29ybmVyTWVudU9wdGlvbnMqKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb3JuZXJpZCBDb2RpY2UgZGVsbCdvcGVyYXppb25lIHNlbGV6aW9uYXRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3JuZXJBY3Rpb25DbGlja2VkKGNvcm5lcmlkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm9uQ29ybmVyQWN0aW9uLmVtaXQoeyBpZDogY29ybmVyaWQsIGVzdGFibGU6IHRoaXMgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogSW1wb3N0YXppb25lIG1vZGFsaXTDoCBkZWxsJ0VzVGFibGUgXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7J2FycmF5JyB8ICd2aWV3JyB8ICdyZXBvcnQnfSBtb2RlIE1vZGFsaXTDoCBkYSBpbXBvc3RhcmVcclxuICAgICAqKi9cclxuICAgIHByaXZhdGUgc2V0TW9kZShtb2RlOiAnYXJyYXknIHwgJ3ZpZXcnKSB7XHJcbiAgICAgICAgdGhpcy52aWV3TW9kZSA9IG1vZGUgPT0gJ3ZpZXcnO1xyXG4gICAgICAgIHRoaXMuYXJyYXlNb2RlID0gbW9kZSA9PSAnYXJyYXknO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIHBlciBlZmZldHR1YXJlIGNoaWFtYXRlIGludGVybmUgZGkgYWxsaW5lYW1lbnRvIGFsbGEgZnVuemlvbmUgKip3cml0ZVZhbHVlKiosIFxyXG4gICAgICogaW1wb3N0YW5kbyBwcmltYSAqKmludGVybmFsV3JpdGVDYWxsKiogaW4gbW9kbyBkYSBub24gZWZmZXR0dWFyZSBvcGVyYXppb25pIGludXRpbGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGludGVybmFsV3JpdGVWYWx1ZSgpIHtcclxuICAgICAgICB0aGlzLmludGVybmFsV3JpdGVDYWxsID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5WaWV3KTtcclxuICAgICAgICB0aGlzLmludGVybmFsV3JpdGVDYWxsID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIE1ldG9kbyBldmVudHVhbG1lbnRlIHJpY2hpYW1hYmlsZSBhbmNoZSBkYWwgY29tcG9uZW50ZSBlc3Rlcm5vIGNoZSBwZXJtZXR0ZSBkaSBmb3J6YXJlIHVuIHJlZnJlc2ggZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgcHVibGljIGZvcmNlUmVmcmVzaChyZWxhdW5jaFNlYXJjaDogYm9vbGVhbiA9IHRydWUpIHtcclxuXHJcbiAgICAgICAgLy8gU2Ugc29ubyBpbiBtb2RhbGl0w6AgVmlldyB2aWVuZSBtYW50ZW51dG8gaW4gYXV0b21hdGljbyBpbCBudW1lcm8gZGkgcGFnaW5hLCBtYSBwZXIgbGEgbW9kYWxpdMOgIGFycmF5IGRldm8gcHJlbmRlcmUgbGUgaW5mbyBkaSBwYWdpbmF6aW9uZSBwcmltYSBlIHJpYXBwbGljYXJsZSBkb3BvXHJcbiAgICAgICAgbGV0IGFycmF5UGFnZTogbnVtYmVyO1xyXG4gICAgICAgIGxldCBhcnJheUlwcDogbnVtYmVyO1xyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSkge1xyXG4gICAgICAgICAgICBhcnJheVBhZ2UgPSB0aGlzLmFycmF5bW9kZVBhZ2U7XHJcbiAgICAgICAgICAgIGFycmF5SXBwID0gdGhpcy5BcnJheW1vZGVJdGVtc1BlclBhZ2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZighcmVsYXVuY2hTZWFyY2ggJiYgdGhpcy52aWV3TW9kZSlcclxuICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGZzZWFyY2ggPSB0cnVlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5WaWV3KTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLkFycmF5bW9kZUl0ZW1zUGVyUGFnZSA9IGFycmF5SXBwO1xyXG4gICAgICAgICAgICB0aGlzLmFycmF5R29Ub1BhZ2UoYXJyYXlQYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogSW1wb3N0YSBsYSB2aXNpYmlsaXTDoCBkaSB1biBoZWFkZXIgZSBkaSBldmVudHVhbGkgaGVhZGVyIGNvbGxlZ2F0aSBzZSBxdWVzdG8gaGVhZGVyIMOoIHVuIGdydXBwbywgZG9wb2RpY2jDqSBhZ2dpb3JuYSBsJ2VzLXRhYmxlIFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBPckhlYWRlciBIZWFkZXIgZGkgY3VpIHNldHRhcmUgbGEgdmlzaWJpbGl0w6BcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmlzaWJpbGl0eSBWaXNpYmlsaXTDoCBkYSBpbXBvc3RhcmVcclxuICAgICAqKi9cclxuICAgIHB1YmxpYyBzZXRIZWFkZXJWaXNpYmlsaXR5KGdyb3VwT3JIZWFkZXI6IHN0cmluZywgdmlzaWJpbGl0eTogYm9vbGVhbiwgcmVmcmVzaDogYm9vbGVhbiA9IHRydWUsIHJlbGF1bmNoU2VhcmNoOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIGxldCBncm91cE9ySGVhZCA9IHRoaXMudGhzQ2FjaGVbZ3JvdXBPckhlYWRlcl07XHJcbiAgICAgICAgaWYgKCFncm91cE9ySGVhZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBncm91cE9ySGVhZC50aFZpc2libGUgPSB2aXNpYmlsaXR5O1xyXG5cclxuICAgICAgICBsZXQgdGhzQXJyID0gdGhpcy5Fc1Roc0RpcmVjdGl2ZS50b0FycmF5KCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHNBcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoID0gdGhzQXJyW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoLnRoUGFyZW50ID09IGdyb3VwT3JIZWFkZXIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclZpc2liaWxpdHkodGgudGgsIHZpc2liaWxpdHksIGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZWZyZXNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXNlTG9jYWxWaXNpYmlsaXR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5mb3JjZVJlZnJlc2gocmVsYXVuY2hTZWFyY2gpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bnppb25lIGNoZSBpbiBiYXNlIGFpIGNsaWNrIHN1IHVuYSBjZWxsYSBjYXBpc2NlIHNlIHN0byBlZmZldHR1YW5kbyB1bidvcGVyYXppb25lIGRpIHNlbGV6aW9uZSBvIHNlIHN0byBlbnRyYW5kbyBuZWxsJ2VkaXQgZGkgdW5hIGNlbGxhIGNvbiB1biBkb3BwaW8gY2xpY2tcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9ICRldmVudCBFdmVudG8gbmF0aXZvIGphdmFzY3JpcHRcclxuICAgICAqIEBwYXJhbSB7VGRFbGVtZW50fSByb3dJdGVtIFJpZmVyaW1lbnRvIGEgYmluZGVyIGRlbGxhIHJpZ2FcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIEl0ZW0gY2hlIHJhcHByZXNlbnRhIGlsIGNvbnRlc3RvIHN1IGN1aSDDqCBzdGF0byBlZmZldHR1YXRvIHVuIGNsaWNrXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkYkNsaWNrRWRpdE9yU2luZ2xlQ2xpY2tSb3dTZWxlY3Rpb24oJGV2ZW50OiBNb3VzZUV2ZW50LCByb3dJdGVtOiBUZEVsZW1lbnQsIGl0ZW06IGFueSkge1xyXG5cclxuICAgICAgICAvLyBQcmltYSBjb3NhIGRhIGZhcmUgw6ggY29udHJvbGxhcmUgc2UgY2kgc29ubyBkZWkgcmFuZ2UgbGFzY2lhdGkgZGEgb3BlcmF6aW9uaSBwcmVjZWRlbnRpIChzZSBhcHBsaWNhYmlsZSkgZSByaXB1bGlybGlcclxuICAgICAgICBpZiAodGhpcy5yYW5nZVNlbGVjdGVkICYmICEkZXZlbnQuY3RybEtleSAmJiB0aGlzLlNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJjbGVhcmluZyBwcmV2aW91c2x5IHNlbGVjdGVkIHJhbmdlXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG4gICAgICAgICAgICB0aGlzLnJhbmdlU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTW9kYWxpdMOgIEVkaXRhYmxlLCBnZXN0aXNjbyBpIGRvcHBpIGNsaWNrIHNlbnphIHBlcsOyIHJhbGxlbnRhcmUgbGEgbW9kYWxpdMOgIGRpIHNlbGV6aW9uZSBhIHJhbmdlXHJcbiAgICAgICAgaWYgKHRoaXMuRWRpdGFibGUpIHtcclxuICAgICAgICAgICAgLy8gU2Vjb25kbyBjbGljazogc2UgaWwgdGltZXIgbm9uIMOoIHNjYWR1dG8gw6ggdW4gZG9wcGlvIGNsaWNrIGVkIGVzZWd1byBpbCByZXN0b1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jZWxsRGJDbGlja1RpbWVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJoYW5kbGluZyBkb3VibGVjbGljayBvbiBlZGl0YWJsZSBjZWxsOiBcIiArIChyb3dJdGVtLlByb3BlcnR5TmFtZSA/ICdlZGl0IG1vZGUgZm9yIHByb3BlcnR5ICcgKyByb3dJdGVtLlByb3BlcnR5TmFtZSA6ICdubyBwcm9wZXJ0eSBzZXQsIGZhbGxiYWNrIHRvIHNpbXBsZSBjbGljaycpKTtcclxuICAgICAgICAgICAgICAgIGlmIChyb3dJdGVtLlByb3BlcnR5TmFtZSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHVwVXNlckVkaXQocm93SXRlbSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSb3dDbGljaygkZXZlbnQsIGl0ZW0sIHRoaXMuU2VsZWN0aW9uLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJDZWxsQ2xpY2tUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gUHJpbW8gY2xpY2s6IG5vbiBmYSBuaWVudGUgZSBzZSBpbCB0ZW1wbyBwZXIgaWwgc2Vjb25kbyBjbGljayBzY2FkZSByZXNldHRhIHR1dHRvXHJcbiAgICAgICAgICAgIHRoaXMuY2VsbERiQ2xpY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckNlbGxDbGlja1RpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuUmFuZ2VTZWxlY3Rpb24gfHwgIXRoaXMubW91c2VJc0Rvd24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJ0aW1lJ3MgdXAgZm9yIHNlY29uZCBjbGljaywgaGFuZGxpbmcgc2luZ2xlIGNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUm93Q2xpY2soJGV2ZW50LCBpdGVtLCB0aGlzLlNlbGVjdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIHRoaXMuZG91YmxlQ2xpY2tCdWZmZXJNcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJbiBtb2RhbGl0w6AgYSByYW5nZSBsYSBjcmVhemlvbmUgZGVsIHJhbmdlIMOoIGdlc3RpdGEgZGFpIG1vdXNlZG93biwgbW92ZSBlZCB1cC4uLlxyXG4gICAgICAgIC8vIExhIHNlbGV6aW9uZSBkZWxsZSByaWdoZSBpbnZlY2Ugw6ggZ2VzdGl0YSBkYWxsZSBjYXNlbGxpbmUgYSBzaW5pc3RyYVxyXG4gICAgICAgIGlmICh0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFNlIGhvIGZhdHRvIGNsaWNrIGNvbCBjb250cm9sIGF0dGFjY2F0byBlc2NvIHN1Yml0byBkYXRvIGNoZSBkZXZlIHNvbG8gcGVybWV0dGVyZSBsYSBuYXZpZ2F6aW9uZSBkZWkgbGlua1xyXG4gICAgICAgIGlmICgkZXZlbnQuY3RybEtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBUdXR0aSBpIGNsaWNrIHN1IHVuYSBjZWxsYSBnacOgIGluIGVkaXQgbm9uIGRldm9ubyBlZmZldHR1YXJlIGxhIHNlbGV6aW9uZSBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCg8YW55PnJvd0l0ZW0pLl9lZGl0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFBlciBldml0YXJlIGRpIHJhbGxlbnRhcmUgYSBwcmVzY2luZGVyZVxyXG4gICAgICAgIGlmICghdGhpcy5FZGl0YWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJvd0NsaWNrKCRldmVudCwgaXRlbSwgdGhpcy5TZWxlY3Rpb24sIHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFdmVudG8gY2hlIGdlc3Rpc2NlIGlsIGNvbWFuZG8gXCJDb3BpYVwiIGJ1dHRhbmRvIGkgdmFsb3JpIHNlbGV6aW9uYXRpIG5lbGxhIGNsaXBib2FyZCBpbiBiYXNlIGFsIGxvcm8gdGlwbyAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVDb3B5KCkge1xyXG4gICAgICAgIGlmKCF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGV0IHNlbCA9IHRoaXMuc2VsZWN0aW9uX0guZ2V0U2VsZWN0aW9uU3RhdHVzU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbC5sZW5ndGggPiAwICYmIHNlbFswXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb25UZXh0ID0gdGhpcy5zZWxlY3Rpb25fSC5nZXRDbGlwYmFyZFRleHRGcm9tU2VsZWN0aW9uKHNlbCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkU2VydmljZS5jb3B5VGV4dFRvQ2xpcGJvYXJkKHNlbGVjdGlvblRleHQpO1xyXG4gICAgICAgICAgICB0aGlzLm1zZ0V4dHMuc2ltcGxlSW5mbyh0aGlzLmxjLmxvYyhcIlZhbHVlcyBjb3BpZWQgaW4gdGhlIGNsaXBib2FyZFwiKSwgXCJ0b2FzdHJcIiwgMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFdmVudG8gY2hlIGdlc3Rpc2NlIGlsIGNvbWFuZG8gXCJJbmNvbGxhXCIgcHJlbmRlbmRvIGkgZGF0aSBkZWxsYSBjbGlwYm9hcmQgZSBhcHBsaWNhbmRvbGkgYWwgcmFuZ2UgZGkgc2VsZXppb25lIGF0dHVhbGUgaW4gYmFzZSBhbCB0aXBvIGRlbGxlIGNlbGxlIHNvdHRvICovXHJcbiAgICBoYW5kbGVQYXN0ZSgpIHtcclxuICAgICAgICBpZighdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxldCBzZWwgPSB0aGlzLnNlbGVjdGlvbl9ILmdldFNlbGVjdGlvblN0YXR1c1NlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWwubGVuZ3RoID4gMCAmJiBzZWxbMF0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsaXBib2FyZFNlcnZpY2UuZ2V0Q2xpcGJvYXJkKFwibWF0cml4XCIsICh2YWx1ZXM6IHN0cmluZ1tdW10pID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEZpeCBjbGlwYm9hcmQgc2VydmljZSBjaGUgcGFyZSB1biBwbycgc3Ryb256YSwgcmltdW92byBsJ3VsdGltbyBhcnJheSBzZSBtaSBhY2NvcmdvIGNoZSDDqCB1biBzaW5nb2xvIGFycmF5IGNvbiB1biBzb2xvIGVsZW1lbnRvIHZ1b3RvXHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDAgJiYgdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXS5sZW5ndGggPT0gMSAmJiB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdWzBdID09ICcnKVxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5zcGxpY2UodmFsdWVzLmxlbmd0aCAtIDEsIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCAmJiB2YWx1ZXNbMF0ubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBzZSBsYSBtb2RpZmljYSDDqCBhYmlsaXRhdGFcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuRWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tc2dFeHRzLnNpbXBsZVdhcm5pbmcodGhpcy5sYy5sb2MoXCJEYXRhIGZvciB0aGlzIHRhYmxlIGNhbm5vdCBiZSBlZGl0ZWRcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBDb250cm9sbG8gY2hlIHF1ZWxsbyBjaGUgc3RvIGNvcGlhbmRvIHNpYSBkZWxsYSBzdGVzc2EgZGltZW5zaW9uZSBkZWxsYSBzZWxlemlvbmUgc3VsbCdlcy10YWJsZSwgdHJhbm5lIG5lbCBjYXNvIGhvIHVuIHNpbmdvbG8gdmFsb3JlIGRhIGNvcGlhcmVcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKHNlbC5sZW5ndGggIT0gdmFsdWVzLmxlbmd0aCB8fCBzZWxbMF0ubGVuZ3RoICE9IHZhbHVlc1swXS5sZW5ndGgpICYmICh2YWx1ZXMubGVuZ3RoICE9IDEgfHwgdmFsdWVzWzBdLmxlbmd0aCAhPSAxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1zZ0V4dHMuc2ltcGxlV2FybmluZyh0aGlzLmxjLmxvYyhcIlNpemUgb2YgY29waWVkIGRhdGEgaXMgZGlmZmVyZW50IGZyb20gdGhlIHNpemUgb2YgdGhlIHNlbGVjdGlvblwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlIGxlIGRpbWVuc2lvbmkgY29pbmNpZG9ubyBjb3BpbyBkYSB1bmEgcGFydGUgYWxsJ2FsdHJhXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoYW5nZXM6IEVzVGFibGVNb2RlbENoYW5nZVtdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBzZWwubGVuZ3RoOyByKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IHNlbFtyXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCByb3cubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjZWxsID0gcm93W2NdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2UgaG8gdW4gc2luZ29sbyB2YWxvcmUgbG8gYXBwbGljbyBhIHR1dHRhIGxhIHNlbGV6aW9uZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdmFsdWVzLmxlbmd0aCA9PSAxICYmIHZhbHVlc1swXS5sZW5ndGggPT0gMSA/IHZhbHVlc1swXVswXSA6IHZhbHVlc1tyXVtjXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9sZCA9IGNlbGwudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbml1ID0gY2VsbC52YWxfc2V0dGVyKHZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2xkZGF0ZSA9IHRoaXMuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24ob2xkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuaXVkYXRlID0gdGhpcy5kYXRlRXh0cy5nZXREYXRlQ29udmVydGlvbihuaXUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChvbGRkYXRlICYmIG5pdWRhdGUgJiYgb2xkZGF0ZS5pc1NhbWUgJiYgb2xkZGF0ZS5pc1NhbWUobml1ZGF0ZSkpIHx8IG9sZCA9PT0gbml1KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChuZXcgRXNUYWJsZU1vZGVsQ2hhbmdlKGNlbGwuaXRlbSwgY2VsbC5oZWFkZXIsIGNlbGwucHJvcGVydHksIG9sZCwgbml1KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Nb2RlbENoYW5nZS5lbWl0KGNoYW5nZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJpcHVsaXNjZSBpbCB0aW1lciB1dGlsaXp6YXRvIHBlciBjYXBpcmUgc2Ugw6ggc3RhdG8gZWZmZXR0dWF0byB1biBkb3BwaW8gY2xpY2sgbyBtZW5vICovXHJcbiAgICBwcml2YXRlIGNsZWFyQ2VsbENsaWNrVGltZXIoKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2VsbERiQ2xpY2tUaW1lcilcclxuICAgICAgICB0aGlzLmNlbGxEYkNsaWNrVGltZXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlciBjbGljayBzaW5nb2xvIHN1IHVuYSByaWdhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSAkZXZlbnQgRXZlbnRvIG5hdGl2byBqYXZhc2NyaXB0XHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBJdGVtIGNoZSByYXBwcmVzZW50YSBpbCBjb250ZXN0byBzdSBjdWkgw6ggc3RhdG8gZWZmZXR0dWF0byB1biBjbGlja1xyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzZWxlY3Rpb24gSW5kaWNhIHNlIGxhIHNlbGV6aW9uZSDDqCBhdHRpdmFcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW50ZXJuYWxDYWxsIEluZGljYSBzZSBsYSBjaGlhbWF0YSBhIHF1ZXN0YSBmdW56aW9uZSDDqCBpbnRlcm5hOiBwZXJtZXR0ZSBkaSBza2lwcGFyZSBpIGNoZWNrIHN1bGxlIEN1c3RvbUNlbGxzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYW5kbGVSb3dDbGljaygkZXZlbnQ6IGFueSwgaXRlbTogYW55LCBzZWxlY3Rpb246IGJvb2xlYW4sIGludGVybmFsQ2FsbDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgLy8gU2UgaG8gdW4gY3RybCBwcmVtdXRvIGVzY28gY29uIHRydWUgaW4gbW9kbyBkYSBmYXJlIGJ1YmJsaW5nIGRlbGwnZXZlbnRvIGUgbGFzY2lhcmxvIGdlc3RpcmUgYWwgYnJvd3NlciAobGluayBlY2MuLi4pXHJcbiAgICAgICAgLy8gU3Rlc3NhIGNvc2Egc2UgaG8gY3VzdG9tIGNlbGwgZGF0byBjaGUgbGEgZ2VzdGlvbmUgZGVpIGNsaWNrIHZpZW5lIGFmZmlkYXRhIGFpIHNpbmdvbGkgVERcclxuICAgICAgICBpZiAoJGV2ZW50LmN0cmxLZXkgfHwgKHRoaXMuVXNlQ3VzdG9tQ2VsbHMgJiYgIWludGVybmFsQ2FsbCkpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmICFpdGVtLmxvY2tlZCAmJiAhaXRlbS5fc2VwICYmICFpdGVtLl9ncm91cClcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVDbGljaygkZXZlbnQsIGl0ZW0pO1xyXG4gICAgICAgIGVsc2UgaWYgKGl0ZW0uX2dyb3VwKVxyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUdyb3VwQ2xpY2soaXRlbSk7XHJcblxyXG4gICAgICAgIC8vIE9yYSBjaGUgbm9uIMOoIGF0dGFjY2F0byBkaXJldHRhbWVudGUgYWxsJ2h0bWwgZGV2byBmYXJlIHVuIG1hcmtmb3JjaGVjayBmaW5pdGUgbGUgb3BlcmF6aW9uaSBzdWkgZ3JvdXBpbmdcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlc3Rpb25lIGRlbCBjbGljayBkZXN0cm8gc3VsbCdlcy10YWJsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25SaWdodENsaWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLlNlbGVjdGlvbilcclxuICAgICAgICAgICAgdGhpcy5vbk9wZW5Db250ZXh0TWVudS5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMYSBtb2RpZmljYSBkZWxsJ3V0ZW50ZSDDqCBpbml6aWF0YS4gU2kgaW1wb3N0YSBsYSB2YXJpYWJpbGUgcmVsYXRpdmEgYSBcInRydWVcIiBpbiBtb2RvIGRhIG1vc3RyYXJlIGwnaW5wdXQgZGkgdGVzdG9cclxuICAgICAqIFxyXG4gICAgICogRG9wbyBjaGUgbCdpbnB1dCDDqCBhcHBhcnNvLCBkb3BvIHVuIGNpY2xvIGRpIENoYW5nZSBEZXRlY3Rpb24gdmllbmUgYXR0aXZhdG8gaWwgU3ViamVjdCBjb2xsZWdhdG8gYWxsJ2lucHV0IGNoZSBzZXJ2aXLDoCBhIGVmZmV0dHVhcmUgaWwgZm9jdXNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtUZEVsZW1lbnR9IHJvd0l0ZW0gRWxlbWVudG8gZGkgcmlnYSBzdSBjdWkgw6ggc3RhdGEgYXR0aXZhdGEgbGEgbW9kaWZpY2FcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gc29wcmEgaWwgcXVhbGUgw6ggc3RhdGEgYXR0aXZhdGEgbGEgbW9kaWZpY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldHVwVXNlckVkaXQocm93SXRlbTogVGRFbGVtZW50LCBpdGVtOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG4gICAgICAgIGlmICh0aGlzLkVkaXRhYmxlICYmIHJvd0l0ZW0uUHJvcGVydHlOYW1lKSB7XHJcbiAgICAgICAgICAgIGxldCBkeW5Nb2RlID0gdGhpcy5EeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb24/Lmxlbmd0aCA+IDA7XHJcbiAgICAgICAgICAgICg8YW55PnJvd0l0ZW0pLl9lZGl0aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgKDxhbnk+cm93SXRlbSkub2xkX3ZhbHVlID0gZHluTW9kZSA/IGl0ZW0ucHJvcGVydGllc1tyb3dJdGVtLlByb3BlcnR5TmFtZV0gOiBpdGVtW3Jvd0l0ZW0uUHJvcGVydHlOYW1lXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5Gb2N1c1N1YmplY3QubmV4dCgpOyB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExhIG1vZGlmaWNhIGRlbGwndXRlbnRlIMOoIHRlcm1pbmF0YS4gU2kgcmVpbXBvc3RhIGxhIHZhcmlhYmlsZSByZWxhdGl2YSBhIFwiZmFsc2VcIiBpbiBtb2RvIGRhIG5hc2NvbmRlcmUgbCdpbnB1dCBkaSB0ZXN0byBlIHNpIGVtZXR0ZSBsYSBtb2RpZmljYSBkZWwgdmFsb3JlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7VGRFbGVtZW50fSByb3dJdGVtIEVsZW1lbnRvIGRpIHJpZ2Egc3UgY3VpIMOoIHN0YXRhIGF0dGl2YXRhIGxhIG1vZGlmaWNhXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIHNvcHJhIGlsIHF1YWxlIMOoIHN0YXRhIGF0dGl2YXRhIGxhIG1vZGlmaWNhXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sdW1uSW5kZXggSW5kaWNlIGRlbGxhIGNvbG9ubmEgc3UgY3VpIMOoIGF2dmVudXRhIGxhIG1vZGlmaWNhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaW5hbGl6ZVVzZXJFZGl0KHJvd0l0ZW06IFRkRWxlbWVudCwgaXRlbTogYW55LCBjb2x1bW5JbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGR5bk1vZGUgPSB0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbj8ubGVuZ3RoID4gMDtcclxuICAgICAgICBsZXQgcm93SXRtID0gPGFueT5yb3dJdGVtO1xyXG4gICAgICAgIHJvd0l0bS5fZWRpdGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgb2xkID0gcm93SXRtLm9sZF92YWx1ZTtcclxuICAgICAgICBsZXQgbml1ID0gZHluTW9kZSA/IGl0ZW0ucHJvcGVydGllc1tyb3dJdGVtLlByb3BlcnR5TmFtZV0gOiBpdGVtW3Jvd0l0ZW0uUHJvcGVydHlOYW1lXTtcclxuXHJcbiAgICAgICAgbGV0IG9sZGRhdGUgPSB0aGlzLmRhdGVFeHRzLmdldERhdGVDb252ZXJ0aW9uKG9sZCk7XHJcbiAgICAgICAgbGV0IG5pdWRhdGUgPSB0aGlzLmRhdGVFeHRzLmdldERhdGVDb252ZXJ0aW9uKG5pdSk7XHJcbiAgICAgICAgaWYgKChvbGRkYXRlICYmIG5pdWRhdGUgJiYgb2xkZGF0ZS5pc1NhbWUgJiYgb2xkZGF0ZS5pc1NhbWUobml1ZGF0ZSkpIHx8IG9sZCA9PT0gbml1KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZS5lbWl0KFtuZXcgRXNUYWJsZU1vZGVsQ2hhbmdlKGl0ZW0sIHJvd0l0ZW0uSUQsIHJvd0l0ZW0uUHJvcGVydHlOYW1lLCBvbGQsIG5pdSldKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXR1c1tpdGVtLl9vcmRpbmFsXVtjb2x1bW5JbmRleF0udmFsX3NldHRlcihuaXUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJhbmdlIHNlbGVjdGlvbiBFeHBlcmltZW50YWxzXHJcblxyXG4gICAgcHJpdmF0ZSBtb3VzZUlzRG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSByYW5nZVNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIHJhbmdlU3RhcnRXYXNJZ25vcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGZpcnN0Q29vcmRpbmF0ZXM6IHtyb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXJ9ID0gbnVsbDtcclxuXHJcbiAgICBtb3VzZWRvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIHJvd0l0ZW06IGFueSwgXzogYW55KSB7XHJcblxyXG4gICAgICAgIC8vIFRhc3RvIGRpdmVyc28gZGFsIGNsaWNrIHNpbmlzdHJvIC0+IGNpYW8gw6ggc3RhdG8gYmVsbG8gZSBpbnRlbnNvXHJcbiAgICAgICAgaWYoZXZlbnQuYnV0dG9ucyAhPSAxIHx8ICF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFN0byBsYXZvcmFuZG8gc3UgUVVFU1RBIGVzLXRhYmxlXHJcbiAgICAgICAgdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5BY3RpdmVFc3RSZWZlcmVuY2UgPSB0aGlzO1xyXG5cclxuICAgICAgICAvLyBUdXR0aSBpIGNsaWNrIHN1IHVuYSBjZWxsYSBnacOgIGluIGVkaXQgbm9uIGRldm9ubyBlZmZldHR1YXJlIGxhIHNlbGV6aW9uZSBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCg8YW55PnJvd0l0ZW0pLl9lZGl0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMubW91c2VJc0Rvd24gPSB0cnVlO1xyXG5cclxuICAgICAgICBsZXQgY29vcmRzID0gKDxIVE1MRWxlbWVudD5ldmVudC5jdXJyZW50VGFyZ2V0KS5pZC5zcGxpdCgnXycpO1xyXG4gICAgICAgIGxldCByb3cgPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDJdKTtcclxuICAgICAgICBsZXQgY29sdW1uID0gcGFyc2VJbnQoY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAxXSk7XHJcbiAgICAgICAgdGhpcy5maXJzdENvb3JkaW5hdGVzID0geyByb3csIGNvbHVtbiB9O1xyXG4gICAgICAgIC8vIFNlIGhvIGdpw6AgdW4gcmFuZ2UgZGkgc2VsZXppb25lIGlnbm9ybyB0ZW1wb3JhbmVtYWVudGUgcXVlc3RhIHNlbGV6aW9uZSBpbiBtb2RvIGRhIGNhcGlyZSBiZW5lIGNvc2EgZGV2byBmYXJlIGRvcG8gKGNsaWNrIHN1bGxhIHJpZ2EgLyBhbHRyYSBzZWxlemlvbmUpXHJcbiAgICAgICAgLy8gZSBnZXN0aXJlIGxhIGdyYWZpY2EgaW4gbWFuaWVyYSB1biBwbycgcGnDuSBwcmVjaXNhXHJcbiAgICAgICAgaWYgKCF0aGlzLnJhbmdlU2VsZWN0ZWQgfHwgKGV2ZW50LmN0cmxLZXkgfHwgIXRoaXMuU2VsZWN0aW9uKSlcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5zaW5nbGVDZWxsU2VsZWN0aW9uKHsgdmlldzogZXZlbnQudmlldywgcmFuZ2U6IGZhbHNlIH0sIHJvdywgY29sdW1uKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdGFydFdhc0lnbm9yZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhgbW91c2UgZG93biBvbiAke3Jvd306JHtjb2x1bW59YCk7XHJcbiAgICB9XHJcblxyXG4gICAgbW91c2VlbnRlcihldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmKCF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGlmIChldmVudC5idXR0b25zID09IDApXHJcbiAgICAgICAgICAgIHRoaXMubW91c2VJc0Rvd24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubW91c2VJc0Rvd24gJiYgdGhpcy5maXJzdENvb3JkaW5hdGVzKSB7XHJcbiAgICAgICAgICAgIGxldCBpZCA9ICg8SFRNTEVsZW1lbnQ+ZXZlbnQuY3VycmVudFRhcmdldCkuaWQ7XHJcbiAgICAgICAgICAgIGxldCBjb29yZHMgPSBpZC5zcGxpdCgnXycpO1xyXG4gICAgICAgICAgICBsZXQgcm93ID0gcGFyc2VJbnQoY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAyXSk7XHJcbiAgICAgICAgICAgIGxldCBjb2x1bW4gPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDFdKTtcclxuICAgICAgICAgICAgLy8gU2UgaG8gaWdub3JhdG8gbCdpbml6aW8gZGVsbGEgc2VsZXppb25lIG5lbCBtb3VzZWRvd24gbG8gcmVjdXBlcm8gcXVpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJhbmdlU3RhcnRXYXNJZ25vcmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILnNpbmdsZUNlbGxTZWxlY3Rpb24oeyB2aWV3OiBldmVudC52aWV3LCByYW5nZTogZmFsc2UgfSwgdGhpcy5maXJzdENvb3JkaW5hdGVzLnJvdywgdGhpcy5maXJzdENvb3JkaW5hdGVzLmNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJhbmdlU3RhcnRXYXNJZ25vcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5zaW5nbGVDZWxsU2VsZWN0aW9uKHsgdmlldzogZXZlbnQudmlldywgcmFuZ2U6IHRydWUgfSwgcm93LCBjb2x1bW4sIHRoaXMuZmlyc3RDb29yZGluYXRlcyk7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhgbW91c2UgbW92ZSBvdmVyICR7cm93fToke2NvbHVtbn1gKTtcclxuICAgICAgICAgICAgdGhpcy5yYW5nZVNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbW91c2V1cChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmICghdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgaWQgPSAoPEhUTUxFbGVtZW50PmV2ZW50LmN1cnJlbnRUYXJnZXQpLmlkO1xyXG4gICAgICAgIGxldCBjb29yZHMgPSBpZC5zcGxpdCgnXycpO1xyXG4gICAgICAgIGxldCByb3cgPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDJdKTtcclxuICAgICAgICBsZXQgY29sdW1uID0gcGFyc2VJbnQoY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAxXSk7XHJcblxyXG4gICAgICAgIC8vIFNlIGlsIG1vdXNldXAgdmllbmUgZWZmZXR0dWF0byBzdWxsYSBzdGVzc2EgY2VsbGEgZGVsIHByaW1vIG1vdXNlZG93biBlIHNpYW1vIGluIG1vZGFsaXTDoCBkaSBzZWxlemlvbmUgZGVzZWxlemlvbm8gbGEgY2VsbGEgcGVyY2jDqSDDqCB1biBzZW1wbGljZSBjbGlja1xyXG4gICAgICAgIGlmICh0aGlzLm1vdXNlSXNEb3duICYmIHRoaXMuZmlyc3RDb29yZGluYXRlcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maXJzdENvb3JkaW5hdGVzLnJvdyA9PSByb3cgJiYgdGhpcy5maXJzdENvb3JkaW5hdGVzLmNvbHVtbiA9PSBjb2x1bW4gJiYgIWV2ZW50LmN0cmxLZXkgJiYgIXRoaXMucmFuZ2VTdGFydFdhc0lnbm9yZWQgJiYgdGhpcy5TZWxlY3Rpb24pXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILnNpbmdsZUNlbGxTZWxlY3Rpb24oeyB2aWV3OiBldmVudC52aWV3LCByYW5nZTogZmFsc2UgfSwgcm93LCBjb2x1bW4pO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChldmVudC5jdHJsS2V5IHx8ICF0aGlzLlNlbGVjdGlvbilcclxuICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VTZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vdXNlSXNEb3duID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKGBtb3VzZSBsaWZ0ZWQgdXBgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyogUGlhbmdvXHJcbiAgICBwcml2YXRlIEVzVGRzQ2FjaGU6IHsgW2lkOiBzdHJpbmddOiBFc1RkIH0gPSB7fTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2VsbFJlZmVyZW5jZShvYmplY3Q6IGFueSwgY29sdW1uOiBzdHJpbmcpOiBFc1RkIHtcclxuICAgICAgICBsZXQgZmtUaGlzU2hpdEltT3V0ID0gdGhpcy51dGlFeHRzLmRlZXBDbG9uZShvYmplY3QpO1xyXG4gICAgICAgIHRoaXMudXRpbGl0aWVzX0guY2FsY3VsYXRlSGFzaChbZmtUaGlzU2hpdEltT3V0XSk7XHJcbiAgICAgICAgbGV0IHByb3AgPSBjb2x1bW47XHJcbiAgICAgICAgbGV0IGhhc2ggPSBma1RoaXNTaGl0SW1PdXQuX2hhc2g7XHJcblxyXG4gICAgICAgIGxldCB0b1JldCA9IHRoaXMuRXNUZHNDYWNoZVtgJHtwcm9wfV8ke2hhc2h9YF07XHJcbiAgICAgICAgcmV0dXJuIHRvUmV0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWdpc3RlckNlbGwoZXZlbnQ6IEVzVGRSZWZlcmVuY2UpIHtcclxuICAgICAgICB0aGlzLkVzVGRzQ2FjaGVbYCR7ZXZlbnQuaWR9XyR7ZXZlbnQuaGFzaH1gXSA9IGV2ZW50LnNlbGZcclxuICAgIH1cclxuICAgIC8vKiBQaWFuZ28gYW5jb3JhXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBFc1RkUmVmZXJlbmNlIHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBoYXNoOiBzdHJpbmc7IFxyXG4gICAgc2VsZjogRXNUZDtcclxufSJdfQ==
|