@rivet-health/design-system 32.4.1 → 32.5.0
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/esm2020/lib/table/table/table/table.component.mjs +3 -3
- package/esm2020/lib/visualization/chart/chart.component.mjs +3 -3
- package/fesm2015/rivet-health-design-system.mjs +4 -4
- package/fesm2015/rivet-health-design-system.mjs.map +1 -1
- package/fesm2020/rivet-health-design-system.mjs +4 -4
- package/fesm2020/rivet-health-design-system.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -185,10 +185,10 @@ export class TableComponent {
|
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
187
|
TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
188
|
-
TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableComponent, selector: "riv-table", inputs: { manager: "manager" }, host: { listeners: { "document:keydown": "keyDown($event)", "document:keyup": "keyUp($event)" } }, queries: [{ propertyName: "cellTemplate", first: true, predicate: ["cell"], descendants: true }, { propertyName: "summaryTemplate", first: true, predicate: ["summary"], descendants: true }, { propertyName: "menuTemplate", first: true, predicate: ["menu"], descendants: true }, { propertyName: "selectionTemplate", first: true, predicate: ["selection"], descendants: true }, { propertyName: "headerTemplate", first: true, predicate: ["header"], descendants: true }, { propertyName: "subheaderTemplate", first: true, predicate: ["subheader"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"manager?.state | async; let s\">\n <ng-container *ngIf=\"selectionCalloutPosition | async; let position\">\n <ng-container *ngIf=\"s.selection.selectedCount > 0 && selectionTemplate\">\n <riv-callout\n *riv-overlay\n [anchor]=\"position\"\n [isModal]=\"false\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'top-right'\"\n >\n <ng-container\n *ngTemplateOutlet=\"selectionTemplate; context: { state: s }\"\n ></ng-container>\n </riv-callout>\n </ng-container>\n </ng-container>\n <div class=\"loading-container\">\n <header *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerTemplate; context: { state: s }\"\n ></ng-container>\n </header>\n <riv-loading-cover\n class=\"container-loader-wrapper\"\n [loading]=\"s.load.loading\"\n [errorMessage]=\"s.load.error ? getErrorMessage(s.load.error) : undefined\"\n >\n <div\n class=\"container\"\n [ngClass]=\"{\n 'container-ungrouped': !s.result.isGrouped,\n 'has-header': !s.result.isGrouped && headerTemplate,\n 'without-columns': s.display.columns.length === 0\n }\"\n (rivClientSize)=\"containerSize.next($event)\"\n >\n <riv-zero-state\n *ngIf=\"s.display.columns.length === 0\"\n class=\"no-columns-message\"\n [message]=\"\n 'All columns disabled. Enable at least one column to view table data.'\n \"\n ></riv-zero-state>\n <ng-container\n *ngFor=\"\n let group of s.result.isGrouped\n ? s.result.rowGroups\n : [s.result.rowsAsGroup];\n trackBy: trackByGroup;\n let last = last\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n subheaderTemplate || null;\n context: { state: s, group }\n \"\n ></ng-container>\n <div [ngClass]=\"{ 'subcontainer-grouped': s.result.isGrouped }\">\n <table>\n <thead>\n <tr>\n <th\n *ngIf=\"!!s.selection.allowSelection\"\n class=\"selection-head\"\n >\n <riv-sr-only>Select rows</riv-sr-only>\n <div\n *ngIf=\"\n s.selection.allowSelection !== 'individual' &&\n s.selection.allowSelection === true\n \"\n class=\"checkbox-wrapper\"\n >\n <riv-checkbox\n *ngIf=\"!s.result.isGrouped\"\n [value]=\"s.selection.isAllSelected === true\"\n [indeterminate]=\"\n s.selection.isAllSelected === 'indeterminate'\n \"\n (valueChange)=\"\n manager?.actions?.next({ type: 'allSelectedChange' })\n \"\n ariaLabel=\"Select all rows\"\n ></riv-checkbox>\n <riv-checkbox\n *ngIf=\"s.result.isGrouped\"\n [value]=\"group.selected === true\"\n [indeterminate]=\"group.selected === 'indeterminate'\"\n (valueChange)=\"\n manager?.actions?.next({\n type: 'groupSelectionChange',\n payload: group\n })\n \"\n ariaLabel=\"Select group rows\"\n ></riv-checkbox>\n </div>\n </th>\n <th\n *ngFor=\"let column of s.display.columns; let i = index\"\n [class.pinned]=\"column.pinned\"\n [style.left.px]=\"column.left\"\n [style.width.px]=\"getWidth(column)\"\n draggable=\"true\"\n droppable=\"true\"\n class=\"drop-zone\"\n (dragstart)=\"dragStart(i, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"drop(i, s.display.enabledCount)\"\n [class.dragged-over-left]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i\n \"\n [class.dragged-over-right]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i\n \"\n >\n <div\n *ngIf=\"\n !column.orderable &&\n !column.filterable &&\n !s.display.columnsAreFreezable &&\n !s.display.columnsAreHideable\n \"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n </div>\n <riv-menu\n *ngIf=\"\n column.orderable ||\n column.filterable ||\n s.display.columnsAreFreezable ||\n s.display.columnsAreHideable\n \"\n >\n <ng-template #trigger>\n <button\n type=\"button\"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n [class.active]=\"s.query.order?.column === column.key\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n <span class=\"icon-container\">\n <riv-icon\n [size]=\"12\"\n [name]=\"\n s.query.order?.direction === 'desc'\n ? 'ArrowDown'\n : 'ArrowUp'\n \"\n ></riv-icon>\n </span>\n </button>\n <riv-table-header-resize-handle\n (dragResize)=\"setWidth(column.key, $event)\"\n ></riv-table-header-resize-handle>\n </ng-template>\n <ng-container *ngIf=\"column.orderable\">\n <button\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'asc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'asc',\n column: column.key\n }\n })\n \"\n >\n Sort ascending\n </button>\n <button\n *ngIf=\"s.query.order?.column === column.key\"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: null\n })\n \"\n >\n Remove sort\n </button>\n <button\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'desc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'desc',\n column: column.key\n }\n })\n \"\n >\n Sort descending\n </button>\n </ng-container>\n <riv-menu-divider\n *ngIf=\"column.orderable && column.filterable\"\n ></riv-menu-divider>\n <button\n *ngIf=\"column.filterable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'filterAdd',\n columnKey: column.key\n })\n \"\n >\n Add a filter\n </button>\n <riv-menu-divider\n *ngIf=\"\n (column.orderable || column.filterable) &&\n (s.display.columnsAreFreezable ||\n s.display.columnsAreHideable)\n \"\n ></riv-menu-divider>\n <ng-container *ngIf=\"s.display.columnsAreFreezable\">\n <button\n *ngIf=\"!column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: true,\n index: i,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Freeze up to column\n </button>\n <button\n *ngIf=\"column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: false,\n index: 0,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Un-freeze columns\n </button>\n </ng-container>\n <button\n *ngIf=\"s.display.columnsAreHideable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnEnabledChange',\n column: column.key,\n enabled: false,\n source: 'headerMenu'\n })\n \"\n >\n Hide column\n </button>\n </riv-menu>\n </th>\n <th *ngIf=\"menuTemplate\" class=\"menu-head\">\n <riv-sr-only>Menu</riv-sr-only>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngIf=\"s.result.totalMatchingRowCount > 0; else empty\"\n >\n <ng-container\n *ngFor=\"\n let row of group.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-template #rowBody>\n <td\n *ngIf=\"\n s.selection.allowSelection === true ||\n s.selection.allowSelection === 'individual'\n \"\n class=\"selection-body\"\n (click)=\"$event.preventDefault()\"\n >\n <label\n class=\"checkbox-wrapper\"\n (click)=\"$event.stopPropagation()\"\n >\n <riv-checkbox\n [identifier]=\"'riv-table-selection-' + row.id\"\n [value]=\"row.selected\"\n (valueChange)=\"selectionChange(row.id, $event)\"\n ariaLabel=\"Select row\"\n ></riv-checkbox>\n </label>\n </td>\n <ng-container\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n >\n <ng-container\n *ngIf=\"\n s.display.cellRowSpan(rowIndex, column.key) as span\n \"\n >\n <td\n *ngIf=\"span > 0\"\n [attr.rowspan]=\"span\"\n [class.rs-right-border]=\"\n s.display.needsRightBorder(rowIndex, column.key)\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n (click)=\"handleClick($event, column)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate || null;\n context: { row: row, column: column }\n \"\n ></ng-container>\n </td>\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"menuTemplate\"\n class=\"menu-body\"\n (click)=\"\n $event.stopPropagation(); $event.preventDefault()\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n menuTemplate || null;\n context: { row: row }\n \"\n ></ng-container>\n </td>\n </ng-template>\n <ng-container *ngIf=\"row.rowLink; let rl\">\n <a\n *ngIf=\"isExternalRowLink(rl)\"\n [href]=\"rl.href\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody\"\n ></ng-container>\n </a>\n <a\n *ngIf=\"isInternalRowLink(rl)\"\n [routerLink]=\"rl.routerLink\"\n [queryParams]=\"rl.queryParams\"\n [queryParamsHandling]=\"rl.queryParamsHandling\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n [class.active]=\"rl.active\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody\"\n ></ng-container>\n </a>\n </ng-container>\n <tr\n *ngIf=\"!row.rowLink\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container *ngTemplateOutlet=\"rowBody\"></ng-container>\n </tr>\n </ng-container>\n <tr *ngIf=\"s.display.customSummaryRow\">\n <td\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n summaryTemplate || null;\n context: { column: column }\n \"\n ></ng-container>\n </td>\n </tr>\n </ng-container>\n <ng-template #empty>\n <tr>\n <td [attr.colspan]=\"s.display.columns.length\">\n <riv-zero-state\n *ngIf=\"s.display.zeroStateMessage; let message\"\n [message]=\"message\"\n ></riv-zero-state>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n <div\n class=\"footer\"\n *ngIf=\"\n s.result.isGrouped &&\n group.totalMatchingRowCount > s.query.grouping.countPerGroup &&\n group.rows.length === s.query.grouping.countPerGroup\n \"\n >\n <span\n rivLink\n class=\"footer-link\"\n (click)=\"\n manager?.actions?.next({\n type: 'viewMoreKeyChange',\n viewMoreKey: group.groupData.key.toString()\n })\n \"\n >View all {{ group.totalMatchingRowCount }}</span\n >\n </div>\n <br *ngIf=\"!last\" />\n </ng-container>\n </div>\n <div *ngIf=\"s.query.pagination.showControls\" class=\"pagination\">\n <div class=\"page-size-controls\">\n <ng-container *ngIf=\"!s.result.isGrouped\">\n <span> Results per page: </span>\n <riv-simple-select\n [selectedOption]=\"{\n id: s.query.pagination.pageSize.toString(),\n title: s.query.pagination.pageSize.toString(),\n value: s.query.pagination.pageSize\n }\"\n (selectedOptionChange)=\"\n manager?.actions?.next({\n type: 'pageSizeChange',\n size: $event?.value || 25\n })\n \"\n [optionGroups]=\"pageSizeOptions\"\n [size]=\"'small'\"\n [orderBy]=\"'source'\"\n ></riv-simple-select>\n </ng-container>\n </div>\n <span\n *ngIf=\"s.result.totalMatchingRowCount > 0 && !s.result.isGrouped\"\n class=\"page-data-indicator\"\n >\n {{ s.query.pagination.pageRowStart | rivNumber }}-{{\n s.query.pagination.pageRowEnd | rivNumber\n }}\n of\n {{ s.result.totalMatchingRowCount | rivNumber }}\n </span>\n <div\n *ngIf=\"s.query.pagination.showControls\"\n class=\"pagination-controls\"\n >\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowLeft'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.previous === null\"\n (click)=\"manager?.actions?.next({ type: 'previousPageNavigate' })\"\n ></button>\n <span\n *ngIf=\"s.query.pagination.pages[0] > 0\"\n class=\"truncated-pages left\"\n >\n …\n </span>\n <button\n *ngFor=\"let page of s.query.pagination.pages\"\n class=\"page\"\n type=\"button\"\n [disabled]=\"page === s.query.pagination.page\"\n (click)=\"manager?.actions?.next({ type: 'pageChange', page })\"\n >\n {{ page + 1 }}\n </button>\n <span\n *ngIf=\"\n s.query.pagination.pages[s.query.pagination.pages.length - 1] <\n s.query.pagination.pageCount - 1\n \"\n class=\"truncated-pages right\"\n >\n …\n </span>\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowRight'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.next === null\"\n (click)=\"manager?.actions?.next({ type: 'nextPageNavigate' })\"\n ></button>\n </div>\n </div>\n </riv-loading-cover>\n </div>\n</ng-container>\n", styles: [":host{display:flex;min-height:0}.no-columns-message{position:sticky;inset:0;z-index:var(--loadable-z-index);background-color:var(--surface-light-0)}riv-loading-cover,.loading-container{width:100%;display:grid;grid-template-rows:1fr auto;gap:0}header{border-width:var(--border-width) var(--border-width) 0 var(--border-width);border-style:solid;border-color:var(--border-light);border-top-left-radius:var(--border-radius-medium);border-top-right-radius:var(--border-radius-medium)}header:has(+ div > .subheader){border-bottom-width:var(--border-width);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);margin-bottom:var(--size-large)}header+.container>.subcontainer{border-top-left-radius:0;border-top-right-radius:0}.container-loader-wrapper{min-height:0}.container{overflow:auto}.container.without-columns{overflow:hidden;position:relative}.container-ungrouped{border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-medium)}.container-ungrouped.has-header{border-top-left-radius:0;border-top-right-radius:0}.subcontainer-grouped{overflow:auto;border:var(--border-width) solid var(--border-light);border-top-right-radius:var(--border-radius-medium);border-top-left-radius:var(--border-radius-medium)}.subcontainer-grouped:not(:has(+ .footer)){border-bottom-right-radius:var(--border-radius-medium);border-bottom-left-radius:var(--border-radius-medium)}table{border-collapse:separate;width:100%;table-layout:fixed}thead{position:sticky;top:0;z-index:var(--above-scroll-z-index)}th{border-bottom:var(--border-width) solid var(--border-light);background-color:var(--surface-light-1);position:relative}th:not(:last-child){border-right:var(--border-width) solid var(--border-light)}th.pinned{position:sticky;top:0;z-index:1}th.dragged-over-left:before,th.dragged-over-right:before{content:\"\";position:absolute;top:0;bottom:0;width:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}th.dragged-over-left:before{left:0}th.dragged-over-right:before{right:0}th.selection-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0;vertical-align:middle;height:calc(var(--base-grid-size) * 8 + var(--border-width))}.checkbox-wrapper{display:flex;justify-content:center;align-items:center}label.checkbox-wrapper{cursor:pointer;width:100%;height:100%}th.menu-head{width:var(--size-xxlarge);position:sticky;z-index:1;right:0}th>riv-menu{width:100%}.header-wrapper{font-size:var(--size-medium);font-weight:var(--font-weight-heavy);line-height:1;text-transform:uppercase;letter-spacing:calc(var(--base-grid-size) / 4);padding:var(--size-xsmall) var(--size-small);display:inline-flex;align-items:center;justify-content:center;width:100%;height:calc(var(--base-grid-size) * 8);white-space:nowrap}.header-wrapper.left{justify-content:flex-start}.header-wrapper.right{justify-content:flex-end}button.header-wrapper{transition:background-color var(--short-transition);cursor:pointer}button.header-wrapper:hover{background-color:var(--black-20)}button.header-wrapper .icon-container{overflow:hidden;display:inline-block;width:0;height:1em;opacity:0;padding-left:0;transition:width var(--medium-transition),opacity var(--medium-transition),color var(--medium-transition),padding-left var(--medium-transition)}button.header-wrapper.active .icon-container{width:calc(var(--base-grid-size) * 3.5);padding-left:var(--size-xsmall);opacity:1}button.header-wrapper:hover .icon-container{color:var(--type-light-low-contrast)}button.header-wrapper.active .icon-container{color:var(--brand)}a.row-link{display:table-row;text-decoration:none;color:inherit}a.row-link td{transition:background-color var(--short-transition)}a.row-link:hover td{background-color:var(--surface-light-2)}a.row-link:active td{background-color:var(--surface-light-3)}td{border-bottom:var(--border-width) solid var(--border-light);height:calc(var(--base-grid-size) * 8);padding:var(--size-xxsmall) var(--size-small);font:var(--body-small);vertical-align:middle;text-align:center;background-color:var(--surface-light-0)}tr.grayed td,a.row-link.grayed td{background-color:var(--gray-30)}tbody>*:last-child>td{border-bottom:none}td.pinned{position:sticky;z-index:1}td.pinned:not(:has(+ td.pinned)){border-right:var(--border-width) solid var(--border-light)}td.advanced,td.selection-body,td.menu-body{padding:0;vertical-align:middle}td.selection-body{position:sticky;z-index:1;left:0}td.menu-body{position:sticky;z-index:1;right:0}.pagination{margin-top:var(--size-small);display:flex;justify-content:space-between;gap:var(--size-large)}.page-size-controls,.pagination-controls{display:flex;align-items:center;gap:var(--size-xsmall)}.page-data-indicator{display:flex;align-items:center;flex-grow:1;justify-content:flex-end;font:var(--body-medium);color:var(--type-light-low-contrast)}.page-size-controls span{font:var(--body-medium)}.page{display:flex;align-items:center;justify-content:center;min-width:calc(var(--base-grid-size) * 7.5);height:calc(var(--base-grid-size) * 7.5);padding:var(--size-xxsmall);font:var(--input-medium);color:var(--purp-80);border-radius:var(--border-radius-small);transition:background-color var(--short-transition)}.page:hover,.page:disabled{background-color:var(--black-20)}.page:active:not(:disabled){background-color:var(--black-40)}.page:not(:disabled){cursor:pointer}.truncated-pages{color:var(--type-light-disabled)}.truncated-pages.left{padding-left:var(--size-small)}.truncated-pages.right{padding-right:var(--size-small)}.footer{background-color:var(--surface-light-1);border-bottom:var(--border-width) solid var(--border-light);border-left:var(--border-width) solid var(--border-light);border-right:var(--border-width) solid var(--border-light);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);text-align:right;padding:calc(var(--base-grid-size) / 2);font:var(--body-medium)}.footer-link{margin-right:var(--size-medium)}td[rowspan]:not([rowspan=\"1\"]){border-right:var(--border-width) solid var(--border-light)}td.rs-right-border{border-right:var(--border-width) solid var(--border-light)}a.row-link.active>td{background-color:var(--surface-light-selected)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.ButtonComponent, selector: "[rivButton]", inputs: ["locked", "disabled", "loading", "full", "size", "variant", "icon", "iconPosition", "current"] }, { kind: "component", type: i4.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i5.CheckboxComponent, selector: "riv-checkbox", inputs: ["name", "identifier", "value", "checkedColorToken", "indeterminateColorToken", "checkboxTooltip", "indeterminate", "disabled", "required", "state", "errorMessage", "ariaLabel"], outputs: ["valueChange"] }, { kind: "component", type: i6.IconComponent, selector: "riv-icon", inputs: ["name", "size", "customSize", "strokeWidth"] }, { kind: "component", type: i7.LinkComponent, selector: "[rivLink]", inputs: ["disabled", "locked", "theme", "variant"] }, { kind: "component", type: i8.LoadingCoverComponent, selector: "riv-loading-cover", inputs: ["loading", "loadingSize", "errorMessage"] }, { kind: "component", type: i9.MenuComponent, selector: "riv-menu", inputs: ["preferredPosition"] }, { kind: "component", type: i10.MenuDividerComponent, selector: "riv-menu-divider" }, { kind: "component", type: i11.MenuItemComponent, selector: "[riv-menu-item]", inputs: ["locked", "disabled", "variant"] }, { kind: "directive", type: i12.OverlayDirective, selector: "[riv-overlay]" }, { kind: "component", type: i13.SimpleSelectComponent, selector: "riv-simple-select", inputs: ["optionGroups", "selectedOption", "size", "disabled", "locked", "filterabilityOptions", "orderBy", "placeholder", "maxHeight", "maxWidth", "minHeight", "minWidth", "dividers"], outputs: ["selectedOptionChange"] }, { kind: "directive", type: i14.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "component", type: i15.SrOnlyComponent, selector: "riv-sr-only" }, { kind: "component", type: i16.TableHeaderResizeHandleComponent, selector: "riv-table-header-resize-handle", outputs: ["dragResize"] }, { kind: "component", type: i17.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i18.NumberPipe, name: "rivNumber" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
188
|
+
TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableComponent, selector: "riv-table", inputs: { manager: "manager" }, host: { listeners: { "document:keydown": "keyDown($event)", "document:keyup": "keyUp($event)" } }, queries: [{ propertyName: "cellTemplate", first: true, predicate: ["cell"], descendants: true }, { propertyName: "summaryTemplate", first: true, predicate: ["summary"], descendants: true }, { propertyName: "menuTemplate", first: true, predicate: ["menu"], descendants: true }, { propertyName: "selectionTemplate", first: true, predicate: ["selection"], descendants: true }, { propertyName: "headerTemplate", first: true, predicate: ["header"], descendants: true }, { propertyName: "subheaderTemplate", first: true, predicate: ["subheader"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"manager?.state | async; let s\">\n <ng-container *ngIf=\"selectionCalloutPosition | async; let position\">\n <ng-container *ngIf=\"s.selection.selectedCount > 0 && selectionTemplate\">\n <riv-callout\n *riv-overlay\n [anchor]=\"position\"\n [isModal]=\"false\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'top-right'\"\n >\n <ng-container\n *ngTemplateOutlet=\"selectionTemplate; context: { state: s }\"\n ></ng-container>\n </riv-callout>\n </ng-container>\n </ng-container>\n <div class=\"loading-container\">\n <header *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerTemplate; context: { state: s }\"\n ></ng-container>\n </header>\n <riv-loading-cover\n class=\"container-loader-wrapper\"\n [loading]=\"s.load.loading\"\n [errorMessage]=\"s.load.error ? getErrorMessage(s.load.error) : undefined\"\n >\n <div\n class=\"container\"\n [ngClass]=\"{\n 'container-ungrouped': !s.result.isGrouped,\n 'has-header': !s.result.isGrouped && headerTemplate,\n 'without-columns': s.display.columns.length === 0\n }\"\n (rivClientSize)=\"containerSize.next($event)\"\n >\n <riv-zero-state\n *ngIf=\"s.display.columns.length === 0\"\n class=\"no-columns-message\"\n [message]=\"\n 'All columns disabled. Enable at least one column to view table data.'\n \"\n ></riv-zero-state>\n <ng-container\n *ngFor=\"\n let group of s.result.isGrouped\n ? s.result.rowGroups\n : [s.result.rowsAsGroup];\n trackBy: trackByGroup;\n let last = last\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n subheaderTemplate || null;\n context: { state: s, group }\n \"\n ></ng-container>\n <div [ngClass]=\"{ 'subcontainer-grouped': s.result.isGrouped }\">\n <table>\n <thead>\n <tr>\n <th\n *ngIf=\"!!s.selection.allowSelection\"\n class=\"selection-head\"\n >\n <riv-sr-only>Select rows</riv-sr-only>\n <div\n *ngIf=\"\n s.selection.allowSelection !== 'individual' &&\n s.selection.allowSelection === true\n \"\n class=\"checkbox-wrapper\"\n >\n <riv-checkbox\n *ngIf=\"!s.result.isGrouped\"\n [value]=\"s.selection.isAllSelected === true\"\n [indeterminate]=\"\n s.selection.isAllSelected === 'indeterminate'\n \"\n (valueChange)=\"\n manager?.actions?.next({ type: 'allSelectedChange' })\n \"\n ariaLabel=\"Select all rows\"\n ></riv-checkbox>\n <riv-checkbox\n *ngIf=\"s.result.isGrouped\"\n [value]=\"group.selected === true\"\n [indeterminate]=\"group.selected === 'indeterminate'\"\n (valueChange)=\"\n manager?.actions?.next({\n type: 'groupSelectionChange',\n payload: group\n })\n \"\n ariaLabel=\"Select group rows\"\n ></riv-checkbox>\n </div>\n </th>\n <th\n *ngFor=\"let column of s.display.columns; let i = index\"\n [class.pinned]=\"column.pinned\"\n [style.left.px]=\"column.left\"\n [style.width.px]=\"getWidth(column)\"\n draggable=\"true\"\n droppable=\"true\"\n class=\"drop-zone\"\n (dragstart)=\"dragStart(i, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"drop(i, s.display.enabledCount)\"\n [class.dragged-over-left]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i\n \"\n [class.dragged-over-right]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i\n \"\n >\n <div\n *ngIf=\"\n !column.orderable &&\n !column.filterable &&\n !s.display.columnsAreFreezable &&\n !s.display.columnsAreHideable\n \"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n </div>\n <riv-menu\n *ngIf=\"\n column.orderable ||\n column.filterable ||\n s.display.columnsAreFreezable ||\n s.display.columnsAreHideable\n \"\n >\n <ng-template #trigger>\n <button\n type=\"button\"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n [class.active]=\"s.query.order?.column === column.key\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n <span class=\"icon-container\">\n <riv-icon\n [size]=\"12\"\n [name]=\"\n s.query.order?.direction === 'desc'\n ? 'ArrowDown'\n : 'ArrowUp'\n \"\n ></riv-icon>\n </span>\n </button>\n <riv-table-header-resize-handle\n (dragResize)=\"setWidth(column.key, $event)\"\n ></riv-table-header-resize-handle>\n </ng-template>\n <ng-container *ngIf=\"column.orderable\">\n <button\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'asc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'asc',\n column: column.key\n }\n })\n \"\n >\n Sort ascending\n </button>\n <button\n *ngIf=\"s.query.order?.column === column.key\"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: null\n })\n \"\n >\n Remove sort\n </button>\n <button\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'desc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'desc',\n column: column.key\n }\n })\n \"\n >\n Sort descending\n </button>\n </ng-container>\n <riv-menu-divider\n *ngIf=\"column.orderable && column.filterable\"\n ></riv-menu-divider>\n <button\n *ngIf=\"column.filterable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'filterAdd',\n columnKey: column.key\n })\n \"\n >\n Add a filter\n </button>\n <riv-menu-divider\n *ngIf=\"\n (column.orderable || column.filterable) &&\n (s.display.columnsAreFreezable ||\n s.display.columnsAreHideable)\n \"\n ></riv-menu-divider>\n <ng-container *ngIf=\"s.display.columnsAreFreezable\">\n <button\n *ngIf=\"!column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: true,\n index: i,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Freeze up to column\n </button>\n <button\n *ngIf=\"column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: false,\n index: 0,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Un-freeze columns\n </button>\n </ng-container>\n <button\n *ngIf=\"s.display.columnsAreHideable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnEnabledChange',\n column: column.key,\n enabled: false,\n source: 'headerMenu'\n })\n \"\n >\n Hide column\n </button>\n </riv-menu>\n </th>\n <th *ngIf=\"menuTemplate\" class=\"menu-head\">\n <riv-sr-only>Menu</riv-sr-only>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngIf=\"s.result.totalMatchingRowCount > 0; else empty\"\n >\n <ng-container\n *ngFor=\"\n let row of group.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-template #rowBody>\n <td\n *ngIf=\"\n s.selection.allowSelection === true ||\n s.selection.allowSelection === 'individual'\n \"\n class=\"selection-body\"\n (click)=\"$event.preventDefault()\"\n >\n <label\n class=\"checkbox-wrapper\"\n (click)=\"$event.stopPropagation()\"\n >\n <riv-checkbox\n [identifier]=\"'riv-table-selection-' + row.id\"\n [value]=\"row.selected\"\n (valueChange)=\"selectionChange(row.id, $event)\"\n ariaLabel=\"Select row\"\n ></riv-checkbox>\n </label>\n </td>\n <ng-container\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n >\n <ng-container\n *ngIf=\"\n s.display.cellRowSpan(rowIndex, column.key) as span\n \"\n >\n <td\n *ngIf=\"span > 0\"\n [attr.rowspan]=\"span\"\n [class.rs-right-border]=\"\n s.display.needsRightBorder(rowIndex, column.key)\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n (click)=\"handleClick($event, column)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate || null;\n context: { row: row, column: column }\n \"\n ></ng-container>\n </td>\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"menuTemplate\"\n class=\"menu-body\"\n (click)=\"\n $event.stopPropagation(); $event.preventDefault()\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n menuTemplate || null;\n context: { row: row }\n \"\n ></ng-container>\n </td>\n </ng-template>\n <ng-container *ngIf=\"row.rowLink; let rl\">\n <a\n *ngIf=\"isExternalRowLink(rl)\"\n [href]=\"rl.href\"\n draggable=\"false\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody\"\n ></ng-container>\n </a>\n <a\n *ngIf=\"isInternalRowLink(rl)\"\n draggable=\"false\"\n [routerLink]=\"rl.routerLink\"\n [queryParams]=\"rl.queryParams\"\n [queryParamsHandling]=\"rl.queryParamsHandling\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n [class.active]=\"rl.active\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody\"\n ></ng-container>\n </a>\n </ng-container>\n <tr\n *ngIf=\"!row.rowLink\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container *ngTemplateOutlet=\"rowBody\"></ng-container>\n </tr>\n </ng-container>\n <tr *ngIf=\"s.display.customSummaryRow\">\n <td\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n summaryTemplate || null;\n context: { column: column }\n \"\n ></ng-container>\n </td>\n </tr>\n </ng-container>\n <ng-template #empty>\n <tr>\n <td [attr.colspan]=\"s.display.columns.length\">\n <riv-zero-state\n *ngIf=\"s.display.zeroStateMessage; let message\"\n [message]=\"message\"\n ></riv-zero-state>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n <div\n class=\"footer\"\n *ngIf=\"\n s.result.isGrouped &&\n group.totalMatchingRowCount > s.query.grouping.countPerGroup &&\n group.rows.length === s.query.grouping.countPerGroup\n \"\n >\n <span\n rivLink\n class=\"footer-link\"\n (click)=\"\n manager?.actions?.next({\n type: 'viewMoreKeyChange',\n viewMoreKey: group.groupData.key.toString()\n })\n \"\n >View all {{ group.totalMatchingRowCount }}</span\n >\n </div>\n <br *ngIf=\"!last\" />\n </ng-container>\n </div>\n <div *ngIf=\"s.query.pagination.showControls\" class=\"pagination\">\n <div class=\"page-size-controls\">\n <ng-container *ngIf=\"!s.result.isGrouped\">\n <span> Results per page: </span>\n <riv-simple-select\n [selectedOption]=\"{\n id: s.query.pagination.pageSize.toString(),\n title: s.query.pagination.pageSize.toString(),\n value: s.query.pagination.pageSize\n }\"\n (selectedOptionChange)=\"\n manager?.actions?.next({\n type: 'pageSizeChange',\n size: $event?.value || 25\n })\n \"\n [optionGroups]=\"pageSizeOptions\"\n [size]=\"'small'\"\n [orderBy]=\"'source'\"\n ></riv-simple-select>\n </ng-container>\n </div>\n <span\n *ngIf=\"s.result.totalMatchingRowCount > 0 && !s.result.isGrouped\"\n class=\"page-data-indicator\"\n >\n {{ s.query.pagination.pageRowStart | rivNumber }}-{{\n s.query.pagination.pageRowEnd | rivNumber\n }}\n of\n {{ s.result.totalMatchingRowCount | rivNumber }}\n </span>\n <div\n *ngIf=\"s.query.pagination.showControls\"\n class=\"pagination-controls\"\n >\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowLeft'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.previous === null\"\n (click)=\"manager?.actions?.next({ type: 'previousPageNavigate' })\"\n ></button>\n <span\n *ngIf=\"s.query.pagination.pages[0] > 0\"\n class=\"truncated-pages left\"\n >\n …\n </span>\n <button\n *ngFor=\"let page of s.query.pagination.pages\"\n class=\"page\"\n type=\"button\"\n [disabled]=\"page === s.query.pagination.page\"\n (click)=\"manager?.actions?.next({ type: 'pageChange', page })\"\n >\n {{ page + 1 }}\n </button>\n <span\n *ngIf=\"\n s.query.pagination.pages[s.query.pagination.pages.length - 1] <\n s.query.pagination.pageCount - 1\n \"\n class=\"truncated-pages right\"\n >\n …\n </span>\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowRight'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.next === null\"\n (click)=\"manager?.actions?.next({ type: 'nextPageNavigate' })\"\n ></button>\n </div>\n </div>\n </riv-loading-cover>\n </div>\n</ng-container>\n", styles: [":host{display:flex;min-height:0}.no-columns-message{position:sticky;inset:0;z-index:var(--loadable-z-index);background-color:var(--surface-light-0)}riv-loading-cover,.loading-container{width:100%;display:grid;grid-template-rows:1fr auto;gap:0}header{border-width:var(--border-width) var(--border-width) 0 var(--border-width);border-style:solid;border-color:var(--border-light);border-top-left-radius:var(--border-radius-medium);border-top-right-radius:var(--border-radius-medium)}header:has(+ div > .subheader){border-bottom-width:var(--border-width);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);margin-bottom:var(--size-large)}header+.container>.subcontainer{border-top-left-radius:0;border-top-right-radius:0}.container-loader-wrapper{min-height:0}.container{overflow:auto}.container.without-columns{overflow:hidden;position:relative}.container-ungrouped{border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-medium)}.container-ungrouped.has-header{border-top-left-radius:0;border-top-right-radius:0}.subcontainer-grouped{overflow:auto;border:var(--border-width) solid var(--border-light);border-top-right-radius:var(--border-radius-medium);border-top-left-radius:var(--border-radius-medium)}.subcontainer-grouped:not(:has(+ .footer)){border-bottom-right-radius:var(--border-radius-medium);border-bottom-left-radius:var(--border-radius-medium)}table{border-collapse:separate;width:100%;table-layout:fixed}thead{position:sticky;top:0;z-index:var(--above-scroll-z-index)}th{border-bottom:var(--border-width) solid var(--border-light);background-color:var(--surface-light-1);position:relative}th:not(:last-child){border-right:var(--border-width) solid var(--border-light)}th.pinned{position:sticky;top:0;z-index:1}th.dragged-over-left:before,th.dragged-over-right:before{content:\"\";position:absolute;top:0;bottom:0;width:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}th.dragged-over-left:before{left:0}th.dragged-over-right:before{right:0}th.selection-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0;vertical-align:middle;height:calc(var(--base-grid-size) * 8 + var(--border-width))}.checkbox-wrapper{display:flex;justify-content:center;align-items:center}label.checkbox-wrapper{cursor:pointer;width:100%;height:100%}th.menu-head{width:var(--size-xxlarge);position:sticky;z-index:1;right:0}th>riv-menu{width:100%}.header-wrapper{font-size:var(--size-medium);font-weight:var(--font-weight-heavy);line-height:1;text-transform:uppercase;letter-spacing:calc(var(--base-grid-size) / 4);padding:var(--size-xsmall) var(--size-small);display:inline-flex;align-items:center;justify-content:center;width:100%;height:calc(var(--base-grid-size) * 8);white-space:nowrap}.header-wrapper.left{justify-content:flex-start}.header-wrapper.right{justify-content:flex-end}button.header-wrapper{transition:background-color var(--short-transition);cursor:pointer}button.header-wrapper:hover{background-color:var(--black-20)}button.header-wrapper .icon-container{overflow:hidden;display:inline-block;width:0;height:1em;opacity:0;padding-left:0;transition:width var(--medium-transition),opacity var(--medium-transition),color var(--medium-transition),padding-left var(--medium-transition)}button.header-wrapper.active .icon-container{width:calc(var(--base-grid-size) * 3.5);padding-left:var(--size-xsmall);opacity:1}button.header-wrapper:hover .icon-container{color:var(--type-light-low-contrast)}button.header-wrapper.active .icon-container{color:var(--brand)}a.row-link{display:table-row;text-decoration:none;color:inherit;-webkit-user-select:text;user-select:text}a.row-link td{transition:background-color var(--short-transition);-webkit-user-select:text;user-select:text}a.row-link:hover td{background-color:var(--surface-light-2)}a.row-link:active td{background-color:var(--surface-light-3)}td{border-bottom:var(--border-width) solid var(--border-light);height:calc(var(--base-grid-size) * 8);padding:var(--size-xxsmall) var(--size-small);font:var(--body-small);vertical-align:middle;text-align:center;background-color:var(--surface-light-0)}tr.grayed td,a.row-link.grayed td{background-color:var(--gray-30)}tbody>*:last-child>td{border-bottom:none}td.pinned{position:sticky;z-index:1}td.pinned:not(:has(+ td.pinned)){border-right:var(--border-width) solid var(--border-light)}td.advanced,td.selection-body,td.menu-body{padding:0;vertical-align:middle}td.selection-body{position:sticky;z-index:1;left:0}td.menu-body{position:sticky;z-index:1;right:0}.pagination{margin-top:var(--size-small);display:flex;justify-content:space-between;gap:var(--size-large)}.page-size-controls,.pagination-controls{display:flex;align-items:center;gap:var(--size-xsmall)}.page-data-indicator{display:flex;align-items:center;flex-grow:1;justify-content:flex-end;font:var(--body-medium);color:var(--type-light-low-contrast)}.page-size-controls span{font:var(--body-medium)}.page{display:flex;align-items:center;justify-content:center;min-width:calc(var(--base-grid-size) * 7.5);height:calc(var(--base-grid-size) * 7.5);padding:var(--size-xxsmall);font:var(--input-medium);color:var(--purp-80);border-radius:var(--border-radius-small);transition:background-color var(--short-transition)}.page:hover,.page:disabled{background-color:var(--black-20)}.page:active:not(:disabled){background-color:var(--black-40)}.page:not(:disabled){cursor:pointer}.truncated-pages{color:var(--type-light-disabled)}.truncated-pages.left{padding-left:var(--size-small)}.truncated-pages.right{padding-right:var(--size-small)}.footer{background-color:var(--surface-light-1);border-bottom:var(--border-width) solid var(--border-light);border-left:var(--border-width) solid var(--border-light);border-right:var(--border-width) solid var(--border-light);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);text-align:right;padding:calc(var(--base-grid-size) / 2);font:var(--body-medium)}.footer-link{margin-right:var(--size-medium)}td[rowspan]:not([rowspan=\"1\"]){border-right:var(--border-width) solid var(--border-light)}td.rs-right-border{border-right:var(--border-width) solid var(--border-light)}a.row-link.active>td{background-color:var(--surface-light-selected)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.ButtonComponent, selector: "[rivButton]", inputs: ["locked", "disabled", "loading", "full", "size", "variant", "icon", "iconPosition", "current"] }, { kind: "component", type: i4.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i5.CheckboxComponent, selector: "riv-checkbox", inputs: ["name", "identifier", "value", "checkedColorToken", "indeterminateColorToken", "checkboxTooltip", "indeterminate", "disabled", "required", "state", "errorMessage", "ariaLabel"], outputs: ["valueChange"] }, { kind: "component", type: i6.IconComponent, selector: "riv-icon", inputs: ["name", "size", "customSize", "strokeWidth"] }, { kind: "component", type: i7.LinkComponent, selector: "[rivLink]", inputs: ["disabled", "locked", "theme", "variant"] }, { kind: "component", type: i8.LoadingCoverComponent, selector: "riv-loading-cover", inputs: ["loading", "loadingSize", "errorMessage"] }, { kind: "component", type: i9.MenuComponent, selector: "riv-menu", inputs: ["preferredPosition"] }, { kind: "component", type: i10.MenuDividerComponent, selector: "riv-menu-divider" }, { kind: "component", type: i11.MenuItemComponent, selector: "[riv-menu-item]", inputs: ["locked", "disabled", "variant"] }, { kind: "directive", type: i12.OverlayDirective, selector: "[riv-overlay]" }, { kind: "component", type: i13.SimpleSelectComponent, selector: "riv-simple-select", inputs: ["optionGroups", "selectedOption", "size", "disabled", "locked", "filterabilityOptions", "orderBy", "placeholder", "maxHeight", "maxWidth", "minHeight", "minWidth", "dividers"], outputs: ["selectedOptionChange"] }, { kind: "directive", type: i14.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "component", type: i15.SrOnlyComponent, selector: "riv-sr-only" }, { kind: "component", type: i16.TableHeaderResizeHandleComponent, selector: "riv-table-header-resize-handle", outputs: ["dragResize"] }, { kind: "component", type: i17.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i18.NumberPipe, name: "rivNumber" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
189
189
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableComponent, decorators: [{
|
|
190
190
|
type: Component,
|
|
191
|
-
args: [{ selector: 'riv-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"manager?.state | async; let s\">\n <ng-container *ngIf=\"selectionCalloutPosition | async; let position\">\n <ng-container *ngIf=\"s.selection.selectedCount > 0 && selectionTemplate\">\n <riv-callout\n *riv-overlay\n [anchor]=\"position\"\n [isModal]=\"false\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'top-right'\"\n >\n <ng-container\n *ngTemplateOutlet=\"selectionTemplate; context: { state: s }\"\n ></ng-container>\n </riv-callout>\n </ng-container>\n </ng-container>\n <div class=\"loading-container\">\n <header *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerTemplate; context: { state: s }\"\n ></ng-container>\n </header>\n <riv-loading-cover\n class=\"container-loader-wrapper\"\n [loading]=\"s.load.loading\"\n [errorMessage]=\"s.load.error ? getErrorMessage(s.load.error) : undefined\"\n >\n <div\n class=\"container\"\n [ngClass]=\"{\n 'container-ungrouped': !s.result.isGrouped,\n 'has-header': !s.result.isGrouped && headerTemplate,\n 'without-columns': s.display.columns.length === 0\n }\"\n (rivClientSize)=\"containerSize.next($event)\"\n >\n <riv-zero-state\n *ngIf=\"s.display.columns.length === 0\"\n class=\"no-columns-message\"\n [message]=\"\n 'All columns disabled. Enable at least one column to view table data.'\n \"\n ></riv-zero-state>\n <ng-container\n *ngFor=\"\n let group of s.result.isGrouped\n ? s.result.rowGroups\n : [s.result.rowsAsGroup];\n trackBy: trackByGroup;\n let last = last\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n subheaderTemplate || null;\n context: { state: s, group }\n \"\n ></ng-container>\n <div [ngClass]=\"{ 'subcontainer-grouped': s.result.isGrouped }\">\n <table>\n <thead>\n <tr>\n <th\n *ngIf=\"!!s.selection.allowSelection\"\n class=\"selection-head\"\n >\n <riv-sr-only>Select rows</riv-sr-only>\n <div\n *ngIf=\"\n s.selection.allowSelection !== 'individual' &&\n s.selection.allowSelection === true\n \"\n class=\"checkbox-wrapper\"\n >\n <riv-checkbox\n *ngIf=\"!s.result.isGrouped\"\n [value]=\"s.selection.isAllSelected === true\"\n [indeterminate]=\"\n s.selection.isAllSelected === 'indeterminate'\n \"\n (valueChange)=\"\n manager?.actions?.next({ type: 'allSelectedChange' })\n \"\n ariaLabel=\"Select all rows\"\n ></riv-checkbox>\n <riv-checkbox\n *ngIf=\"s.result.isGrouped\"\n [value]=\"group.selected === true\"\n [indeterminate]=\"group.selected === 'indeterminate'\"\n (valueChange)=\"\n manager?.actions?.next({\n type: 'groupSelectionChange',\n payload: group\n })\n \"\n ariaLabel=\"Select group rows\"\n ></riv-checkbox>\n </div>\n </th>\n <th\n *ngFor=\"let column of s.display.columns; let i = index\"\n [class.pinned]=\"column.pinned\"\n [style.left.px]=\"column.left\"\n [style.width.px]=\"getWidth(column)\"\n draggable=\"true\"\n droppable=\"true\"\n class=\"drop-zone\"\n (dragstart)=\"dragStart(i, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"drop(i, s.display.enabledCount)\"\n [class.dragged-over-left]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i\n \"\n [class.dragged-over-right]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i\n \"\n >\n <div\n *ngIf=\"\n !column.orderable &&\n !column.filterable &&\n !s.display.columnsAreFreezable &&\n !s.display.columnsAreHideable\n \"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n </div>\n <riv-menu\n *ngIf=\"\n column.orderable ||\n column.filterable ||\n s.display.columnsAreFreezable ||\n s.display.columnsAreHideable\n \"\n >\n <ng-template #trigger>\n <button\n type=\"button\"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n [class.active]=\"s.query.order?.column === column.key\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n <span class=\"icon-container\">\n <riv-icon\n [size]=\"12\"\n [name]=\"\n s.query.order?.direction === 'desc'\n ? 'ArrowDown'\n : 'ArrowUp'\n \"\n ></riv-icon>\n </span>\n </button>\n <riv-table-header-resize-handle\n (dragResize)=\"setWidth(column.key, $event)\"\n ></riv-table-header-resize-handle>\n </ng-template>\n <ng-container *ngIf=\"column.orderable\">\n <button\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'asc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'asc',\n column: column.key\n }\n })\n \"\n >\n Sort ascending\n </button>\n <button\n *ngIf=\"s.query.order?.column === column.key\"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: null\n })\n \"\n >\n Remove sort\n </button>\n <button\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'desc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'desc',\n column: column.key\n }\n })\n \"\n >\n Sort descending\n </button>\n </ng-container>\n <riv-menu-divider\n *ngIf=\"column.orderable && column.filterable\"\n ></riv-menu-divider>\n <button\n *ngIf=\"column.filterable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'filterAdd',\n columnKey: column.key\n })\n \"\n >\n Add a filter\n </button>\n <riv-menu-divider\n *ngIf=\"\n (column.orderable || column.filterable) &&\n (s.display.columnsAreFreezable ||\n s.display.columnsAreHideable)\n \"\n ></riv-menu-divider>\n <ng-container *ngIf=\"s.display.columnsAreFreezable\">\n <button\n *ngIf=\"!column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: true,\n index: i,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Freeze up to column\n </button>\n <button\n *ngIf=\"column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: false,\n index: 0,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Un-freeze columns\n </button>\n </ng-container>\n <button\n *ngIf=\"s.display.columnsAreHideable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnEnabledChange',\n column: column.key,\n enabled: false,\n source: 'headerMenu'\n })\n \"\n >\n Hide column\n </button>\n </riv-menu>\n </th>\n <th *ngIf=\"menuTemplate\" class=\"menu-head\">\n <riv-sr-only>Menu</riv-sr-only>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngIf=\"s.result.totalMatchingRowCount > 0; else empty\"\n >\n <ng-container\n *ngFor=\"\n let row of group.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-template #rowBody>\n <td\n *ngIf=\"\n s.selection.allowSelection === true ||\n s.selection.allowSelection === 'individual'\n \"\n class=\"selection-body\"\n (click)=\"$event.preventDefault()\"\n >\n <label\n class=\"checkbox-wrapper\"\n (click)=\"$event.stopPropagation()\"\n >\n <riv-checkbox\n [identifier]=\"'riv-table-selection-' + row.id\"\n [value]=\"row.selected\"\n (valueChange)=\"selectionChange(row.id, $event)\"\n ariaLabel=\"Select row\"\n ></riv-checkbox>\n </label>\n </td>\n <ng-container\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n >\n <ng-container\n *ngIf=\"\n s.display.cellRowSpan(rowIndex, column.key) as span\n \"\n >\n <td\n *ngIf=\"span > 0\"\n [attr.rowspan]=\"span\"\n [class.rs-right-border]=\"\n s.display.needsRightBorder(rowIndex, column.key)\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n (click)=\"handleClick($event, column)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate || null;\n context: { row: row, column: column }\n \"\n ></ng-container>\n </td>\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"menuTemplate\"\n class=\"menu-body\"\n (click)=\"\n $event.stopPropagation(); $event.preventDefault()\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n menuTemplate || null;\n context: { row: row }\n \"\n ></ng-container>\n </td>\n </ng-template>\n <ng-container *ngIf=\"row.rowLink; let rl\">\n <a\n *ngIf=\"isExternalRowLink(rl)\"\n [href]=\"rl.href\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody\"\n ></ng-container>\n </a>\n <a\n *ngIf=\"isInternalRowLink(rl)\"\n [routerLink]=\"rl.routerLink\"\n [queryParams]=\"rl.queryParams\"\n [queryParamsHandling]=\"rl.queryParamsHandling\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n [class.active]=\"rl.active\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody\"\n ></ng-container>\n </a>\n </ng-container>\n <tr\n *ngIf=\"!row.rowLink\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container *ngTemplateOutlet=\"rowBody\"></ng-container>\n </tr>\n </ng-container>\n <tr *ngIf=\"s.display.customSummaryRow\">\n <td\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n summaryTemplate || null;\n context: { column: column }\n \"\n ></ng-container>\n </td>\n </tr>\n </ng-container>\n <ng-template #empty>\n <tr>\n <td [attr.colspan]=\"s.display.columns.length\">\n <riv-zero-state\n *ngIf=\"s.display.zeroStateMessage; let message\"\n [message]=\"message\"\n ></riv-zero-state>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n <div\n class=\"footer\"\n *ngIf=\"\n s.result.isGrouped &&\n group.totalMatchingRowCount > s.query.grouping.countPerGroup &&\n group.rows.length === s.query.grouping.countPerGroup\n \"\n >\n <span\n rivLink\n class=\"footer-link\"\n (click)=\"\n manager?.actions?.next({\n type: 'viewMoreKeyChange',\n viewMoreKey: group.groupData.key.toString()\n })\n \"\n >View all {{ group.totalMatchingRowCount }}</span\n >\n </div>\n <br *ngIf=\"!last\" />\n </ng-container>\n </div>\n <div *ngIf=\"s.query.pagination.showControls\" class=\"pagination\">\n <div class=\"page-size-controls\">\n <ng-container *ngIf=\"!s.result.isGrouped\">\n <span> Results per page: </span>\n <riv-simple-select\n [selectedOption]=\"{\n id: s.query.pagination.pageSize.toString(),\n title: s.query.pagination.pageSize.toString(),\n value: s.query.pagination.pageSize\n }\"\n (selectedOptionChange)=\"\n manager?.actions?.next({\n type: 'pageSizeChange',\n size: $event?.value || 25\n })\n \"\n [optionGroups]=\"pageSizeOptions\"\n [size]=\"'small'\"\n [orderBy]=\"'source'\"\n ></riv-simple-select>\n </ng-container>\n </div>\n <span\n *ngIf=\"s.result.totalMatchingRowCount > 0 && !s.result.isGrouped\"\n class=\"page-data-indicator\"\n >\n {{ s.query.pagination.pageRowStart | rivNumber }}-{{\n s.query.pagination.pageRowEnd | rivNumber\n }}\n of\n {{ s.result.totalMatchingRowCount | rivNumber }}\n </span>\n <div\n *ngIf=\"s.query.pagination.showControls\"\n class=\"pagination-controls\"\n >\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowLeft'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.previous === null\"\n (click)=\"manager?.actions?.next({ type: 'previousPageNavigate' })\"\n ></button>\n <span\n *ngIf=\"s.query.pagination.pages[0] > 0\"\n class=\"truncated-pages left\"\n >\n …\n </span>\n <button\n *ngFor=\"let page of s.query.pagination.pages\"\n class=\"page\"\n type=\"button\"\n [disabled]=\"page === s.query.pagination.page\"\n (click)=\"manager?.actions?.next({ type: 'pageChange', page })\"\n >\n {{ page + 1 }}\n </button>\n <span\n *ngIf=\"\n s.query.pagination.pages[s.query.pagination.pages.length - 1] <\n s.query.pagination.pageCount - 1\n \"\n class=\"truncated-pages right\"\n >\n …\n </span>\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowRight'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.next === null\"\n (click)=\"manager?.actions?.next({ type: 'nextPageNavigate' })\"\n ></button>\n </div>\n </div>\n </riv-loading-cover>\n </div>\n</ng-container>\n", styles: [":host{display:flex;min-height:0}.no-columns-message{position:sticky;inset:0;z-index:var(--loadable-z-index);background-color:var(--surface-light-0)}riv-loading-cover,.loading-container{width:100%;display:grid;grid-template-rows:1fr auto;gap:0}header{border-width:var(--border-width) var(--border-width) 0 var(--border-width);border-style:solid;border-color:var(--border-light);border-top-left-radius:var(--border-radius-medium);border-top-right-radius:var(--border-radius-medium)}header:has(+ div > .subheader){border-bottom-width:var(--border-width);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);margin-bottom:var(--size-large)}header+.container>.subcontainer{border-top-left-radius:0;border-top-right-radius:0}.container-loader-wrapper{min-height:0}.container{overflow:auto}.container.without-columns{overflow:hidden;position:relative}.container-ungrouped{border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-medium)}.container-ungrouped.has-header{border-top-left-radius:0;border-top-right-radius:0}.subcontainer-grouped{overflow:auto;border:var(--border-width) solid var(--border-light);border-top-right-radius:var(--border-radius-medium);border-top-left-radius:var(--border-radius-medium)}.subcontainer-grouped:not(:has(+ .footer)){border-bottom-right-radius:var(--border-radius-medium);border-bottom-left-radius:var(--border-radius-medium)}table{border-collapse:separate;width:100%;table-layout:fixed}thead{position:sticky;top:0;z-index:var(--above-scroll-z-index)}th{border-bottom:var(--border-width) solid var(--border-light);background-color:var(--surface-light-1);position:relative}th:not(:last-child){border-right:var(--border-width) solid var(--border-light)}th.pinned{position:sticky;top:0;z-index:1}th.dragged-over-left:before,th.dragged-over-right:before{content:\"\";position:absolute;top:0;bottom:0;width:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}th.dragged-over-left:before{left:0}th.dragged-over-right:before{right:0}th.selection-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0;vertical-align:middle;height:calc(var(--base-grid-size) * 8 + var(--border-width))}.checkbox-wrapper{display:flex;justify-content:center;align-items:center}label.checkbox-wrapper{cursor:pointer;width:100%;height:100%}th.menu-head{width:var(--size-xxlarge);position:sticky;z-index:1;right:0}th>riv-menu{width:100%}.header-wrapper{font-size:var(--size-medium);font-weight:var(--font-weight-heavy);line-height:1;text-transform:uppercase;letter-spacing:calc(var(--base-grid-size) / 4);padding:var(--size-xsmall) var(--size-small);display:inline-flex;align-items:center;justify-content:center;width:100%;height:calc(var(--base-grid-size) * 8);white-space:nowrap}.header-wrapper.left{justify-content:flex-start}.header-wrapper.right{justify-content:flex-end}button.header-wrapper{transition:background-color var(--short-transition);cursor:pointer}button.header-wrapper:hover{background-color:var(--black-20)}button.header-wrapper .icon-container{overflow:hidden;display:inline-block;width:0;height:1em;opacity:0;padding-left:0;transition:width var(--medium-transition),opacity var(--medium-transition),color var(--medium-transition),padding-left var(--medium-transition)}button.header-wrapper.active .icon-container{width:calc(var(--base-grid-size) * 3.5);padding-left:var(--size-xsmall);opacity:1}button.header-wrapper:hover .icon-container{color:var(--type-light-low-contrast)}button.header-wrapper.active .icon-container{color:var(--brand)}a.row-link{display:table-row;text-decoration:none;color:inherit}a.row-link td{transition:background-color var(--short-transition)}a.row-link:hover td{background-color:var(--surface-light-2)}a.row-link:active td{background-color:var(--surface-light-3)}td{border-bottom:var(--border-width) solid var(--border-light);height:calc(var(--base-grid-size) * 8);padding:var(--size-xxsmall) var(--size-small);font:var(--body-small);vertical-align:middle;text-align:center;background-color:var(--surface-light-0)}tr.grayed td,a.row-link.grayed td{background-color:var(--gray-30)}tbody>*:last-child>td{border-bottom:none}td.pinned{position:sticky;z-index:1}td.pinned:not(:has(+ td.pinned)){border-right:var(--border-width) solid var(--border-light)}td.advanced,td.selection-body,td.menu-body{padding:0;vertical-align:middle}td.selection-body{position:sticky;z-index:1;left:0}td.menu-body{position:sticky;z-index:1;right:0}.pagination{margin-top:var(--size-small);display:flex;justify-content:space-between;gap:var(--size-large)}.page-size-controls,.pagination-controls{display:flex;align-items:center;gap:var(--size-xsmall)}.page-data-indicator{display:flex;align-items:center;flex-grow:1;justify-content:flex-end;font:var(--body-medium);color:var(--type-light-low-contrast)}.page-size-controls span{font:var(--body-medium)}.page{display:flex;align-items:center;justify-content:center;min-width:calc(var(--base-grid-size) * 7.5);height:calc(var(--base-grid-size) * 7.5);padding:var(--size-xxsmall);font:var(--input-medium);color:var(--purp-80);border-radius:var(--border-radius-small);transition:background-color var(--short-transition)}.page:hover,.page:disabled{background-color:var(--black-20)}.page:active:not(:disabled){background-color:var(--black-40)}.page:not(:disabled){cursor:pointer}.truncated-pages{color:var(--type-light-disabled)}.truncated-pages.left{padding-left:var(--size-small)}.truncated-pages.right{padding-right:var(--size-small)}.footer{background-color:var(--surface-light-1);border-bottom:var(--border-width) solid var(--border-light);border-left:var(--border-width) solid var(--border-light);border-right:var(--border-width) solid var(--border-light);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);text-align:right;padding:calc(var(--base-grid-size) / 2);font:var(--body-medium)}.footer-link{margin-right:var(--size-medium)}td[rowspan]:not([rowspan=\"1\"]){border-right:var(--border-width) solid var(--border-light)}td.rs-right-border{border-right:var(--border-width) solid var(--border-light)}a.row-link.active>td{background-color:var(--surface-light-selected)}\n"] }]
|
|
191
|
+
args: [{ selector: 'riv-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"manager?.state | async; let s\">\n <ng-container *ngIf=\"selectionCalloutPosition | async; let position\">\n <ng-container *ngIf=\"s.selection.selectedCount > 0 && selectionTemplate\">\n <riv-callout\n *riv-overlay\n [anchor]=\"position\"\n [isModal]=\"false\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'top-right'\"\n >\n <ng-container\n *ngTemplateOutlet=\"selectionTemplate; context: { state: s }\"\n ></ng-container>\n </riv-callout>\n </ng-container>\n </ng-container>\n <div class=\"loading-container\">\n <header *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerTemplate; context: { state: s }\"\n ></ng-container>\n </header>\n <riv-loading-cover\n class=\"container-loader-wrapper\"\n [loading]=\"s.load.loading\"\n [errorMessage]=\"s.load.error ? getErrorMessage(s.load.error) : undefined\"\n >\n <div\n class=\"container\"\n [ngClass]=\"{\n 'container-ungrouped': !s.result.isGrouped,\n 'has-header': !s.result.isGrouped && headerTemplate,\n 'without-columns': s.display.columns.length === 0\n }\"\n (rivClientSize)=\"containerSize.next($event)\"\n >\n <riv-zero-state\n *ngIf=\"s.display.columns.length === 0\"\n class=\"no-columns-message\"\n [message]=\"\n 'All columns disabled. Enable at least one column to view table data.'\n \"\n ></riv-zero-state>\n <ng-container\n *ngFor=\"\n let group of s.result.isGrouped\n ? s.result.rowGroups\n : [s.result.rowsAsGroup];\n trackBy: trackByGroup;\n let last = last\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n subheaderTemplate || null;\n context: { state: s, group }\n \"\n ></ng-container>\n <div [ngClass]=\"{ 'subcontainer-grouped': s.result.isGrouped }\">\n <table>\n <thead>\n <tr>\n <th\n *ngIf=\"!!s.selection.allowSelection\"\n class=\"selection-head\"\n >\n <riv-sr-only>Select rows</riv-sr-only>\n <div\n *ngIf=\"\n s.selection.allowSelection !== 'individual' &&\n s.selection.allowSelection === true\n \"\n class=\"checkbox-wrapper\"\n >\n <riv-checkbox\n *ngIf=\"!s.result.isGrouped\"\n [value]=\"s.selection.isAllSelected === true\"\n [indeterminate]=\"\n s.selection.isAllSelected === 'indeterminate'\n \"\n (valueChange)=\"\n manager?.actions?.next({ type: 'allSelectedChange' })\n \"\n ariaLabel=\"Select all rows\"\n ></riv-checkbox>\n <riv-checkbox\n *ngIf=\"s.result.isGrouped\"\n [value]=\"group.selected === true\"\n [indeterminate]=\"group.selected === 'indeterminate'\"\n (valueChange)=\"\n manager?.actions?.next({\n type: 'groupSelectionChange',\n payload: group\n })\n \"\n ariaLabel=\"Select group rows\"\n ></riv-checkbox>\n </div>\n </th>\n <th\n *ngFor=\"let column of s.display.columns; let i = index\"\n [class.pinned]=\"column.pinned\"\n [style.left.px]=\"column.left\"\n [style.width.px]=\"getWidth(column)\"\n draggable=\"true\"\n droppable=\"true\"\n class=\"drop-zone\"\n (dragstart)=\"dragStart(i, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"drop(i, s.display.enabledCount)\"\n [class.dragged-over-left]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i\n \"\n [class.dragged-over-right]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i\n \"\n >\n <div\n *ngIf=\"\n !column.orderable &&\n !column.filterable &&\n !s.display.columnsAreFreezable &&\n !s.display.columnsAreHideable\n \"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n </div>\n <riv-menu\n *ngIf=\"\n column.orderable ||\n column.filterable ||\n s.display.columnsAreFreezable ||\n s.display.columnsAreHideable\n \"\n >\n <ng-template #trigger>\n <button\n type=\"button\"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n [class.active]=\"s.query.order?.column === column.key\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n <span class=\"icon-container\">\n <riv-icon\n [size]=\"12\"\n [name]=\"\n s.query.order?.direction === 'desc'\n ? 'ArrowDown'\n : 'ArrowUp'\n \"\n ></riv-icon>\n </span>\n </button>\n <riv-table-header-resize-handle\n (dragResize)=\"setWidth(column.key, $event)\"\n ></riv-table-header-resize-handle>\n </ng-template>\n <ng-container *ngIf=\"column.orderable\">\n <button\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'asc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'asc',\n column: column.key\n }\n })\n \"\n >\n Sort ascending\n </button>\n <button\n *ngIf=\"s.query.order?.column === column.key\"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: null\n })\n \"\n >\n Remove sort\n </button>\n <button\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'desc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'desc',\n column: column.key\n }\n })\n \"\n >\n Sort descending\n </button>\n </ng-container>\n <riv-menu-divider\n *ngIf=\"column.orderable && column.filterable\"\n ></riv-menu-divider>\n <button\n *ngIf=\"column.filterable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'filterAdd',\n columnKey: column.key\n })\n \"\n >\n Add a filter\n </button>\n <riv-menu-divider\n *ngIf=\"\n (column.orderable || column.filterable) &&\n (s.display.columnsAreFreezable ||\n s.display.columnsAreHideable)\n \"\n ></riv-menu-divider>\n <ng-container *ngIf=\"s.display.columnsAreFreezable\">\n <button\n *ngIf=\"!column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: true,\n index: i,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Freeze up to column\n </button>\n <button\n *ngIf=\"column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: false,\n index: 0,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Un-freeze columns\n </button>\n </ng-container>\n <button\n *ngIf=\"s.display.columnsAreHideable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnEnabledChange',\n column: column.key,\n enabled: false,\n source: 'headerMenu'\n })\n \"\n >\n Hide column\n </button>\n </riv-menu>\n </th>\n <th *ngIf=\"menuTemplate\" class=\"menu-head\">\n <riv-sr-only>Menu</riv-sr-only>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngIf=\"s.result.totalMatchingRowCount > 0; else empty\"\n >\n <ng-container\n *ngFor=\"\n let row of group.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-template #rowBody>\n <td\n *ngIf=\"\n s.selection.allowSelection === true ||\n s.selection.allowSelection === 'individual'\n \"\n class=\"selection-body\"\n (click)=\"$event.preventDefault()\"\n >\n <label\n class=\"checkbox-wrapper\"\n (click)=\"$event.stopPropagation()\"\n >\n <riv-checkbox\n [identifier]=\"'riv-table-selection-' + row.id\"\n [value]=\"row.selected\"\n (valueChange)=\"selectionChange(row.id, $event)\"\n ariaLabel=\"Select row\"\n ></riv-checkbox>\n </label>\n </td>\n <ng-container\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n >\n <ng-container\n *ngIf=\"\n s.display.cellRowSpan(rowIndex, column.key) as span\n \"\n >\n <td\n *ngIf=\"span > 0\"\n [attr.rowspan]=\"span\"\n [class.rs-right-border]=\"\n s.display.needsRightBorder(rowIndex, column.key)\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n (click)=\"handleClick($event, column)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate || null;\n context: { row: row, column: column }\n \"\n ></ng-container>\n </td>\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"menuTemplate\"\n class=\"menu-body\"\n (click)=\"\n $event.stopPropagation(); $event.preventDefault()\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n menuTemplate || null;\n context: { row: row }\n \"\n ></ng-container>\n </td>\n </ng-template>\n <ng-container *ngIf=\"row.rowLink; let rl\">\n <a\n *ngIf=\"isExternalRowLink(rl)\"\n [href]=\"rl.href\"\n draggable=\"false\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody\"\n ></ng-container>\n </a>\n <a\n *ngIf=\"isInternalRowLink(rl)\"\n draggable=\"false\"\n [routerLink]=\"rl.routerLink\"\n [queryParams]=\"rl.queryParams\"\n [queryParamsHandling]=\"rl.queryParamsHandling\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n [class.active]=\"rl.active\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody\"\n ></ng-container>\n </a>\n </ng-container>\n <tr\n *ngIf=\"!row.rowLink\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container *ngTemplateOutlet=\"rowBody\"></ng-container>\n </tr>\n </ng-container>\n <tr *ngIf=\"s.display.customSummaryRow\">\n <td\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n summaryTemplate || null;\n context: { column: column }\n \"\n ></ng-container>\n </td>\n </tr>\n </ng-container>\n <ng-template #empty>\n <tr>\n <td [attr.colspan]=\"s.display.columns.length\">\n <riv-zero-state\n *ngIf=\"s.display.zeroStateMessage; let message\"\n [message]=\"message\"\n ></riv-zero-state>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n <div\n class=\"footer\"\n *ngIf=\"\n s.result.isGrouped &&\n group.totalMatchingRowCount > s.query.grouping.countPerGroup &&\n group.rows.length === s.query.grouping.countPerGroup\n \"\n >\n <span\n rivLink\n class=\"footer-link\"\n (click)=\"\n manager?.actions?.next({\n type: 'viewMoreKeyChange',\n viewMoreKey: group.groupData.key.toString()\n })\n \"\n >View all {{ group.totalMatchingRowCount }}</span\n >\n </div>\n <br *ngIf=\"!last\" />\n </ng-container>\n </div>\n <div *ngIf=\"s.query.pagination.showControls\" class=\"pagination\">\n <div class=\"page-size-controls\">\n <ng-container *ngIf=\"!s.result.isGrouped\">\n <span> Results per page: </span>\n <riv-simple-select\n [selectedOption]=\"{\n id: s.query.pagination.pageSize.toString(),\n title: s.query.pagination.pageSize.toString(),\n value: s.query.pagination.pageSize\n }\"\n (selectedOptionChange)=\"\n manager?.actions?.next({\n type: 'pageSizeChange',\n size: $event?.value || 25\n })\n \"\n [optionGroups]=\"pageSizeOptions\"\n [size]=\"'small'\"\n [orderBy]=\"'source'\"\n ></riv-simple-select>\n </ng-container>\n </div>\n <span\n *ngIf=\"s.result.totalMatchingRowCount > 0 && !s.result.isGrouped\"\n class=\"page-data-indicator\"\n >\n {{ s.query.pagination.pageRowStart | rivNumber }}-{{\n s.query.pagination.pageRowEnd | rivNumber\n }}\n of\n {{ s.result.totalMatchingRowCount | rivNumber }}\n </span>\n <div\n *ngIf=\"s.query.pagination.showControls\"\n class=\"pagination-controls\"\n >\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowLeft'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.previous === null\"\n (click)=\"manager?.actions?.next({ type: 'previousPageNavigate' })\"\n ></button>\n <span\n *ngIf=\"s.query.pagination.pages[0] > 0\"\n class=\"truncated-pages left\"\n >\n …\n </span>\n <button\n *ngFor=\"let page of s.query.pagination.pages\"\n class=\"page\"\n type=\"button\"\n [disabled]=\"page === s.query.pagination.page\"\n (click)=\"manager?.actions?.next({ type: 'pageChange', page })\"\n >\n {{ page + 1 }}\n </button>\n <span\n *ngIf=\"\n s.query.pagination.pages[s.query.pagination.pages.length - 1] <\n s.query.pagination.pageCount - 1\n \"\n class=\"truncated-pages right\"\n >\n …\n </span>\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowRight'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.next === null\"\n (click)=\"manager?.actions?.next({ type: 'nextPageNavigate' })\"\n ></button>\n </div>\n </div>\n </riv-loading-cover>\n </div>\n</ng-container>\n", styles: [":host{display:flex;min-height:0}.no-columns-message{position:sticky;inset:0;z-index:var(--loadable-z-index);background-color:var(--surface-light-0)}riv-loading-cover,.loading-container{width:100%;display:grid;grid-template-rows:1fr auto;gap:0}header{border-width:var(--border-width) var(--border-width) 0 var(--border-width);border-style:solid;border-color:var(--border-light);border-top-left-radius:var(--border-radius-medium);border-top-right-radius:var(--border-radius-medium)}header:has(+ div > .subheader){border-bottom-width:var(--border-width);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);margin-bottom:var(--size-large)}header+.container>.subcontainer{border-top-left-radius:0;border-top-right-radius:0}.container-loader-wrapper{min-height:0}.container{overflow:auto}.container.without-columns{overflow:hidden;position:relative}.container-ungrouped{border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-medium)}.container-ungrouped.has-header{border-top-left-radius:0;border-top-right-radius:0}.subcontainer-grouped{overflow:auto;border:var(--border-width) solid var(--border-light);border-top-right-radius:var(--border-radius-medium);border-top-left-radius:var(--border-radius-medium)}.subcontainer-grouped:not(:has(+ .footer)){border-bottom-right-radius:var(--border-radius-medium);border-bottom-left-radius:var(--border-radius-medium)}table{border-collapse:separate;width:100%;table-layout:fixed}thead{position:sticky;top:0;z-index:var(--above-scroll-z-index)}th{border-bottom:var(--border-width) solid var(--border-light);background-color:var(--surface-light-1);position:relative}th:not(:last-child){border-right:var(--border-width) solid var(--border-light)}th.pinned{position:sticky;top:0;z-index:1}th.dragged-over-left:before,th.dragged-over-right:before{content:\"\";position:absolute;top:0;bottom:0;width:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}th.dragged-over-left:before{left:0}th.dragged-over-right:before{right:0}th.selection-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0;vertical-align:middle;height:calc(var(--base-grid-size) * 8 + var(--border-width))}.checkbox-wrapper{display:flex;justify-content:center;align-items:center}label.checkbox-wrapper{cursor:pointer;width:100%;height:100%}th.menu-head{width:var(--size-xxlarge);position:sticky;z-index:1;right:0}th>riv-menu{width:100%}.header-wrapper{font-size:var(--size-medium);font-weight:var(--font-weight-heavy);line-height:1;text-transform:uppercase;letter-spacing:calc(var(--base-grid-size) / 4);padding:var(--size-xsmall) var(--size-small);display:inline-flex;align-items:center;justify-content:center;width:100%;height:calc(var(--base-grid-size) * 8);white-space:nowrap}.header-wrapper.left{justify-content:flex-start}.header-wrapper.right{justify-content:flex-end}button.header-wrapper{transition:background-color var(--short-transition);cursor:pointer}button.header-wrapper:hover{background-color:var(--black-20)}button.header-wrapper .icon-container{overflow:hidden;display:inline-block;width:0;height:1em;opacity:0;padding-left:0;transition:width var(--medium-transition),opacity var(--medium-transition),color var(--medium-transition),padding-left var(--medium-transition)}button.header-wrapper.active .icon-container{width:calc(var(--base-grid-size) * 3.5);padding-left:var(--size-xsmall);opacity:1}button.header-wrapper:hover .icon-container{color:var(--type-light-low-contrast)}button.header-wrapper.active .icon-container{color:var(--brand)}a.row-link{display:table-row;text-decoration:none;color:inherit;-webkit-user-select:text;user-select:text}a.row-link td{transition:background-color var(--short-transition);-webkit-user-select:text;user-select:text}a.row-link:hover td{background-color:var(--surface-light-2)}a.row-link:active td{background-color:var(--surface-light-3)}td{border-bottom:var(--border-width) solid var(--border-light);height:calc(var(--base-grid-size) * 8);padding:var(--size-xxsmall) var(--size-small);font:var(--body-small);vertical-align:middle;text-align:center;background-color:var(--surface-light-0)}tr.grayed td,a.row-link.grayed td{background-color:var(--gray-30)}tbody>*:last-child>td{border-bottom:none}td.pinned{position:sticky;z-index:1}td.pinned:not(:has(+ td.pinned)){border-right:var(--border-width) solid var(--border-light)}td.advanced,td.selection-body,td.menu-body{padding:0;vertical-align:middle}td.selection-body{position:sticky;z-index:1;left:0}td.menu-body{position:sticky;z-index:1;right:0}.pagination{margin-top:var(--size-small);display:flex;justify-content:space-between;gap:var(--size-large)}.page-size-controls,.pagination-controls{display:flex;align-items:center;gap:var(--size-xsmall)}.page-data-indicator{display:flex;align-items:center;flex-grow:1;justify-content:flex-end;font:var(--body-medium);color:var(--type-light-low-contrast)}.page-size-controls span{font:var(--body-medium)}.page{display:flex;align-items:center;justify-content:center;min-width:calc(var(--base-grid-size) * 7.5);height:calc(var(--base-grid-size) * 7.5);padding:var(--size-xxsmall);font:var(--input-medium);color:var(--purp-80);border-radius:var(--border-radius-small);transition:background-color var(--short-transition)}.page:hover,.page:disabled{background-color:var(--black-20)}.page:active:not(:disabled){background-color:var(--black-40)}.page:not(:disabled){cursor:pointer}.truncated-pages{color:var(--type-light-disabled)}.truncated-pages.left{padding-left:var(--size-small)}.truncated-pages.right{padding-right:var(--size-small)}.footer{background-color:var(--surface-light-1);border-bottom:var(--border-width) solid var(--border-light);border-left:var(--border-width) solid var(--border-light);border-right:var(--border-width) solid var(--border-light);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);text-align:right;padding:calc(var(--base-grid-size) / 2);font:var(--body-medium)}.footer-link{margin-right:var(--size-medium)}td[rowspan]:not([rowspan=\"1\"]){border-right:var(--border-width) solid var(--border-light)}td.rs-right-border{border-right:var(--border-width) solid var(--border-light)}a.row-link.active>td{background-color:var(--surface-light-selected)}\n"] }]
|
|
192
192
|
}], propDecorators: { manager: [{
|
|
193
193
|
type: Input
|
|
194
194
|
}], cellTemplate: [{
|
|
@@ -216,4 +216,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
216
216
|
type: HostListener,
|
|
217
217
|
args: ['document:keyup', ['$event']]
|
|
218
218
|
}] } });
|
|
219
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdGFibGUvdGFibGUvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdGFibGUvdGFibGUvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEdBSU4sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBYyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBY3BDLE1BQU0sT0FBTyxjQUFjO0lBTjNCO1FBMENXLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRXhCLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUN2Qyw2QkFBd0IsR0FDL0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUN6RCxDQUFDO1FBaUNKLDhFQUE4RTtRQUM5RSx1RkFBdUY7UUFDdkYscUZBQXFGO1FBQ3JGLHVGQUF1RjtRQUN2RixvRkFBb0Y7UUFDcEYsOEJBQThCO1FBQzlCLG1CQUFjLEdBQUcsQ0FB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QyxtQkFBbUI7WUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkQsSUFBSSxNQUFNLENBQUMsb0JBQW9CO1lBQUUsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNELENBQUM7SUFFRCxpQkFBaUIsQ0FDZixPQUF5QjtRQUV6QixPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxpQkFBaUIsQ0FDZixPQUF5QjtRQUV6QixPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO0lBQ3JDLENBQUM7OzJHQXBPVSxjQUFjOytGQUFkLGNBQWMsdXVCQzVCM0IsNnNzQkFxaUJBOzJGRHpnQmEsY0FBYztrQkFOMUIsU0FBUzsrQkFDRSxXQUFXLG1CQUdKLHVCQUF1QixDQUFDLE1BQU07OEJBVS9DLE9BQU87c0JBRE4sS0FBSztnQkFJTixZQUFZO3NCQURYLFlBQVk7dUJBQUMsTUFBTTtnQkFPcEIsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLFNBQVM7Z0JBTXZCLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxNQUFNO2dCQUlwQixpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsV0FBVztnQkFJekIsY0FBYztzQkFEYixZQUFZO3VCQUFDLFFBQVE7Z0JBSXRCLGlCQUFpQjtzQkFEaEIsWUFBWTt1QkFBQyxXQUFXO2dCQXFLekIsT0FBTztzQkFETixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU01QyxLQUFLO3NCQURKLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgVGVtcGxhdGVSZWYsXG4gIFRyYWNrQnlGdW5jdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgbWFwLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJpdlNlbGVjdCB9IGZyb20gJy4uLy4uLy4uL2lucHV0L3NlbGVjdC9zdGF0ZSc7XG5pbXBvcnQgeyBSaXZUYWJsZSB9IGZyb20gJy4uL3N0YXRlJztcblxudHlwZSBQYWdlU2l6ZU9wdGlvbiA9IHtcbiAgaWQ6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgdmFsdWU6IG51bWJlcjtcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50PFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwID0geyBrZXk6ICcnIH0sXG4+IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIEBJbnB1dCgpXG4gIG1hbmFnZXI/OiBSaXZUYWJsZS5NYW5hZ2VyPFIsIEMsIEYsIEc+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2NlbGwnKVxuICBjZWxsVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7XG4gICAgcm93OiBSaXZUYWJsZS5GdWxsUm93PFI+O1xuICAgIGNvbHVtbjogUml2VGFibGUuRnVsbENvbHVtbjxDPjtcbiAgfT47XG5cbiAgQENvbnRlbnRDaGlsZCgnc3VtbWFyeScpXG4gIHN1bW1hcnlUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHtcbiAgICBjb2x1bW46IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz47XG4gIH0+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ21lbnUnKVxuICBtZW51VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7IHJvdzogUml2VGFibGUuRnVsbFJvdzxSPiB9PjtcblxuICBAQ29udGVudENoaWxkKCdzZWxlY3Rpb24nKVxuICBzZWxlY3Rpb25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHsgc3RhdGU6IFJpdlRhYmxlLkZ1bGxTdGF0ZTxSLCBDLCBGLCBHPiB9PjtcblxuICBAQ29udGVudENoaWxkKCdoZWFkZXInKVxuICBoZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHsgc3RhdGU6IFJpdlRhYmxlLkZ1bGxTdGF0ZTxSLCBDLCBGLCBHPiB9PjtcblxuICBAQ29udGVudENoaWxkKCdzdWJoZWFkZXInKVxuICBzdWJoZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHtcbiAgICBzdGF0ZTogUml2VGFibGUuRnVsbFN0YXRlPFIsIEMsIEYsIEc+O1xuICAgIGdyb3VwOiBSaXZUYWJsZS5Sb3dHcm91cDxSLCBHPjtcbiAgfT47XG5cbiAgcmVhZG9ubHkgZGVzdHJveSA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcmVhZG9ubHkgY29udGFpbmVyU2l6ZSA9IG5ldyBTdWJqZWN0PERPTVJlY3Q+KCk7XG4gIHJlYWRvbmx5IHNlbGVjdGlvbkNhbGxvdXRQb3NpdGlvbjogT2JzZXJ2YWJsZTxET01SZWN0PiA9XG4gICAgdGhpcy5jb250YWluZXJTaXplLnBpcGUoXG4gICAgICBtYXAocmVjdCA9PiBuZXcgRE9NUmVjdChyZWN0LnggKyA0NCwgcmVjdC55IC0gMTIsIDAsIDApKSxcbiAgICApO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLm1hbmFnZXIhLnN0YXRlLCB0aGlzLmNvbnRhaW5lclNpemVdKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSkpXG4gICAgICAuc3Vic2NyaWJlKChbc3RhdGUsIGNvbnRhaW5lclNpemVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyU2l6ZS53aWR0aDtcbiAgICAgICAgY29uc3QgdG90YWxGcm96ZW5XaWR0aCA9IHN1bShcbiAgICAgICAgICBzdGF0ZS5kaXNwbGF5LmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5waW5uZWQpLm1hcChjID0+IGMud2lkdGgpLFxuICAgICAgICApO1xuICAgICAgICBpZiAodG90YWxGcm96ZW5XaWR0aCA+IGNvbnRhaW5lcldpZHRoKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaG93IG1hbnkgY29sdW1ucyBjYW4gYmUgcGlubmVkIHdpdGhvdXQgb3ZlcmZsb3dpbmcuXG4gICAgICAgICAgZm9yIChjb25zdCBbaV0gb2Ygc3RhdGUuZGlzcGxheS5jb2x1bW5zXG4gICAgICAgICAgICAuZmlsdGVyKGMgPT4gYy5waW5uZWQpXG4gICAgICAgICAgICAuZW50cmllcygpKSB7XG4gICAgICAgICAgICBjb25zdCBzbGljZWRGcm96ZW5XaWR0aCA9IHN1bShcbiAgICAgICAgICAgICAgc3RhdGUuZGlzcGxheS5jb2x1bW5zLnNsaWNlKDAsIGkgKyAxKS5tYXAoYyA9PiBjLndpZHRoKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoc2xpY2VkRnJvemVuV2lkdGggPiBjb250YWluZXJXaWR0aCkge1xuICAgICAgICAgICAgICB0aGlzLm1hbmFnZXI/LmFjdGlvbnMubmV4dCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NvbHVtbnNGcmVlemVVcFRvQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICBpbmRleDogaSAtIDEsXG4gICAgICAgICAgICAgICAgZnJlZXplOiBpID4gMCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuaGFuZGxlRHJhZ092ZXIpO1xuICB9XG5cbiAgLy8gV2Ugb25seSBjYXJlIGFib3V0IHdoZW4gd2UgaGF2ZSBlbnRlcmVkIGEgZHJvcCB6b25lIGZvciBhcHBseWluZyBvdXIgdmlzdWFsXG4gIC8vIHRyZWF0bWVudC4gSG93ZXZlciwgaW4gb3JkZXIgdG8gdHJpZ2dlciB0aGUgZHJvcCBldmVudCwgeW91IG11c3QgY2FsbCBwcmV2ZW50RGVmYXVsdFxuICAvLyBvbiB0aGUgZHJhZ292ZXIuIFdlIGFyZSBoYW5kbGluZyB0aGlzIG5hdGl2ZWx5IG9uIHRoZSBkb2N1bWVudCwgb3V0c2lkZSBvZiBhbmd1bGFyXG4gIC8vIGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLiBJZiB3ZSBoYXZlIGEgZHJhZ2dlZE92ZXJDb2x1bW5JZHggYW5kIHdlIGRyYWcgb3ZlciBhblxuICAvLyBlbGVtZW50IHdpdGggY2xhc3MgZHJvcC16b25lLCB3ZSB3aWxsIGFzc3VtZSB5b3Ugd2FudCB0byB0aGUgZHJvcCBlbGVtZW50IGVuYWJsZWRcbiAgLy8gYW5kIHdlIHdpbGwgcHJldmVudERlZmF1bHQuXG4gIGhhbmRsZURyYWdPdmVyID0gKGV2ZW50OiBEcmFnRXZlbnQpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuZHJhZ2dlZE92ZXJDb2x1bW5JZHggIT0gbnVsbCAmJiB0YXJnZXQuY2xvc2VzdCgnLmRyb3Atem9uZScpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfTtcblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuaGFuZGxlRHJhZ092ZXIpO1xuICAgIHRoaXMuZGVzdHJveS5uZXh0KG51bGwpO1xuICB9XG5cbiAgcmVhZG9ubHkgcGFnZVNpemVPcHRpb25zOiBSaXZTZWxlY3QuT3B0aW9uR3JvdXA8UGFnZVNpemVPcHRpb24+W10gPSBbXG4gICAge1xuICAgICAgb3B0aW9uczogUml2VGFibGUucGFnZVNpemVzLm1hcChwYWdlU2l6ZSA9PiAoe1xuICAgICAgICBpZDogcGFnZVNpemUudG9TdHJpbmcoKSxcbiAgICAgICAgdGl0bGU6IHBhZ2VTaXplLnRvU3RyaW5nKCksXG4gICAgICAgIHZhbHVlOiBwYWdlU2l6ZSxcbiAgICAgIH0pKSxcbiAgICB9LFxuICBdO1xuXG4gIHJlYWRvbmx5IHRyYWNrQnlSb3c6IFRyYWNrQnlGdW5jdGlvbjxSaXZUYWJsZS5GdWxsUm93PFI+PiA9IChfLCByb3cpID0+XG4gICAgcm93LmlkO1xuICByZWFkb25seSB0cmFja0J5R3JvdXA6IFRyYWNrQnlGdW5jdGlvbjxSaXZUYWJsZS5Sb3dHcm91cDxSLCBHPj4gPSAoXG4gICAgXyxcbiAgICBncm91cCxcbiAgKSA9PiBncm91cC5ncm91cERhdGEua2V5O1xuICByZWFkb25seSB0cmFja0J5Q29sdW1uOiBUcmFja0J5RnVuY3Rpb248Uml2VGFibGUuRnVsbENvbHVtbjxDPj4gPSAoXG4gICAgXyxcbiAgICBjb2x1bW4sXG4gICkgPT4gY29sdW1uLmtleTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHRlbXBvcmFyeVdpZHRoczogTWFwPEMsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG4gIHNldFdpZHRoKGNvbHVtbjogQywgd2lkdGg6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAod2lkdGggPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHRlbXBvcmFyeVdpZHRoID0gdGhpcy50ZW1wb3JhcnlXaWR0aHMuZ2V0KGNvbHVtbik7XG4gICAgICBpZiAodGVtcG9yYXJ5V2lkdGgpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgICAgIHR5cGU6ICdjb2x1bW5XaWR0aENoYW5nZScsXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHByZWZlcnJlZFdpZHRoOiB0ZW1wb3JhcnlXaWR0aCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLnRlbXBvcmFyeVdpZHRocy5kZWxldGUoY29sdW1uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wb3JhcnlXaWR0aHMuc2V0KGNvbHVtbiwgd2lkdGgpO1xuICAgIH1cbiAgfVxuICBnZXRXaWR0aChjb2x1bW46IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz4pOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnRlbXBvcmFyeVdpZHRocy5oYXMoY29sdW1uLmtleSkpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLnRlbXBvcmFyeVdpZHRocy5nZXQoY29sdW1uLmtleSkhLCBjb2x1bW4ubWluV2lkdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY29sdW1uLndpZHRoO1xuICAgIH1cbiAgfVxuXG4gIGRyYWdnZWRDb2x1bW5JZHg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBkcmFnZ2VkQ29sdW1uS2V5OiBDIHwgbnVsbCA9IG51bGw7XG4gIGRyYWdnZWRPdmVyQ29sdW1uSWR4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBkcmFnU3RhcnQoaWR4OiBudW1iZXIsIGtleTogQykge1xuICAgIHRoaXMuZHJhZ2dlZENvbHVtbklkeCA9IGlkeDtcbiAgICB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgPSBrZXk7XG4gIH1cblxuICBkcmFnT3ZlcihvbnRvSWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLmRyYWdnZWRPdmVyQ29sdW1uSWR4ID0gb250b0lkeDtcbiAgfVxuXG4gIGRyb3Aob250b0lkeDogbnVtYmVyLCBlbmFibGVkQ29sdW1uQ291bnQ6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRyYWdnZWRDb2x1bW5JZHggIT09IG51bGwpIHtcbiAgICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgICAgdHlwZTogJ2NvbHVtbk9yZGVyQ2hhbmdlJyxcbiAgICAgICAgcHJldmlvdXNJbmRleDogdGhpcy5kcmFnZ2VkQ29sdW1uSWR4LFxuICAgICAgICBuZXdJbmRleDogb250b0lkeCxcbiAgICAgICAgc291cmNlOiAndGFibGVEcmFnJyxcbiAgICAgICAgY29sdW1uOiB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBlbmFibGVkID0gb250b0lkeCA8IGVuYWJsZWRDb2x1bW5Db3VudDtcbiAgICAgIHRoaXMuZHJvcEVuYWJsZWRTdGF0ZShlbmFibGVkLCBlbmFibGVkQ29sdW1uQ291bnQpO1xuICAgICAgdGhpcy5kcmFnZ2VkT3ZlckNvbHVtbklkeCA9IG51bGw7XG4gICAgICB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGRyb3BFbmFibGVkU3RhdGUoZW5hYmxlZDogYm9vbGVhbiwgZW5hYmxlZENvbHVtbkNvdW50OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5kcmFnZ2VkQ29sdW1uS2V5ICE9PSBudWxsICYmIHRoaXMuZHJhZ2dlZENvbHVtbklkeCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgaXNFbmFibGVkID0gZW5hYmxlZENvbHVtbkNvdW50ID4gdGhpcy5kcmFnZ2VkQ29sdW1uSWR4O1xuICAgICAgY29uc3Qgc2hvdWxkRmlyZSA9IGVuYWJsZWQgPyAhaXNFbmFibGVkIDogaXNFbmFibGVkO1xuICAgICAgaWYgKHNob3VsZEZpcmUpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgICAgIHR5cGU6ICdjb2x1bW5FbmFibGVkQ2hhbmdlJyxcbiAgICAgICAgICBjb2x1bW46IHRoaXMuZHJhZ2dlZENvbHVtbktleSxcbiAgICAgICAgICBlbmFibGVkOiBlbmFibGVkLFxuICAgICAgICAgIHNvdXJjZTogJ2RyYWdEcm9wJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZHJhZ2dlZE92ZXJDb2x1bW5JZHggPSBudWxsO1xuICAgICAgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRFcnJvck1lc3NhZ2UoZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGUubWVzc2FnZTtcbiAgICBpZiAodHlwZW9mIGUgPT09ICdzdHJpbmcnKSByZXR1cm4gZTtcbiAgICBpZiAodHlwZW9mIGUgPT09ICdvYmplY3QnICYmIGUgIT09IG51bGwpIHJldHVybiBlLnRvU3RyaW5nKCk7XG4gICAgZWxzZSByZXR1cm4gJ0FuIGVycm9yIG9jY3VycmVkLic7XG4gIH1cblxuICBwcml2YXRlIHNoaWZ0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIGtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICB0aGlzLnNoaWZ0ID0gZXZlbnQuc2hpZnRLZXk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXl1cCcsIFsnJGV2ZW50J10pXG4gIGtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgdGhpcy5zaGlmdCA9IGV2ZW50LnNoaWZ0S2V5O1xuICB9XG5cbiAgc2VsZWN0aW9uQ2hhbmdlKHJvd0lkOiBSWydpZCddLCBzZWxlY3RlZDogYm9vbGVhbikge1xuICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgIHR5cGU6ICdyb3dTZWxlY3RlZENoYW5nZScsXG4gICAgICBpZDogcm93SWQsXG4gICAgICBzZWxlY3RlZCxcbiAgICAgIGNvbnRpZ3VvdXM6IHRoaXMuc2hpZnQsXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVDbGljayhldmVudDogTW91c2VFdmVudCwgY29sdW1uOiBSaXZUYWJsZS5GdWxsQ29sdW1uPEM+KSB7XG4gICAgaWYgKGNvbHVtbi5jbGlja1ByZXZlbnREZWZhdWx0KSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChjb2x1bW4uY2xpY2tTdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgaXNFeHRlcm5hbFJvd0xpbmsoXG4gICAgcm93TGluazogUml2VGFibGUuUm93TGluayxcbiAgKTogcm93TGluayBpcyBSaXZUYWJsZS5FeHRlcm5hbFJvd0xpbmsge1xuICAgIHJldHVybiByb3dMaW5rLnR5cGUgPT09ICdleHRlcm5hbCc7XG4gIH1cblxuICBpc0ludGVybmFsUm93TGluayhcbiAgICByb3dMaW5rOiBSaXZUYWJsZS5Sb3dMaW5rLFxuICApOiByb3dMaW5rIGlzIFJpdlRhYmxlLkludGVybmFsUm93TGluayB7XG4gICAgcmV0dXJuIHJvd0xpbmsudHlwZSA9PT0gJ2ludGVybmFsJztcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1hbmFnZXI/LnN0YXRlIHwgYXN5bmM7IGxldCBzXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3Rpb25DYWxsb3V0UG9zaXRpb24gfCBhc3luYzsgbGV0IHBvc2l0aW9uXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInMuc2VsZWN0aW9uLnNlbGVjdGVkQ291bnQgPiAwICYmIHNlbGVjdGlvblRlbXBsYXRlXCI+XG4gICAgICA8cml2LWNhbGxvdXRcbiAgICAgICAgKnJpdi1vdmVybGF5XG4gICAgICAgIFthbmNob3JdPVwicG9zaXRpb25cIlxuICAgICAgICBbaXNNb2RhbF09XCJmYWxzZVwiXG4gICAgICAgIFt0aGVtZV09XCInbGlnaHQnXCJcbiAgICAgICAgW3Nob3dDYXJldF09XCJmYWxzZVwiXG4gICAgICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCIndG9wLXJpZ2h0J1wiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInNlbGVjdGlvblRlbXBsYXRlOyBjb250ZXh0OiB7IHN0YXRlOiBzIH1cIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3Jpdi1jYWxsb3V0PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cImxvYWRpbmctY29udGFpbmVyXCI+XG4gICAgPGhlYWRlciAqbmdJZj1cImhlYWRlclRlbXBsYXRlXCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyVGVtcGxhdGU7IGNvbnRleHQ6IHsgc3RhdGU6IHMgfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9oZWFkZXI+XG4gICAgPHJpdi1sb2FkaW5nLWNvdmVyXG4gICAgICBjbGFzcz1cImNvbnRhaW5lci1sb2FkZXItd3JhcHBlclwiXG4gICAgICBbbG9hZGluZ109XCJzLmxvYWQubG9hZGluZ1wiXG4gICAgICBbZXJyb3JNZXNzYWdlXT1cInMubG9hZC5lcnJvciA/IGdldEVycm9yTWVzc2FnZShzLmxvYWQuZXJyb3IpIDogdW5kZWZpbmVkXCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY29udGFpbmVyXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICdjb250YWluZXItdW5ncm91cGVkJzogIXMucmVzdWx0LmlzR3JvdXBlZCxcbiAgICAgICAgICAnaGFzLWhlYWRlcic6ICFzLnJlc3VsdC5pc0dyb3VwZWQgJiYgaGVhZGVyVGVtcGxhdGUsXG4gICAgICAgICAgJ3dpdGhvdXQtY29sdW1ucyc6IHMuZGlzcGxheS5jb2x1bW5zLmxlbmd0aCA9PT0gMFxuICAgICAgICB9XCJcbiAgICAgICAgKHJpdkNsaWVudFNpemUpPVwiY29udGFpbmVyU2l6ZS5uZXh0KCRldmVudClcIlxuICAgICAgPlxuICAgICAgICA8cml2LXplcm8tc3RhdGVcbiAgICAgICAgICAqbmdJZj1cInMuZGlzcGxheS5jb2x1bW5zLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgY2xhc3M9XCJuby1jb2x1bW5zLW1lc3NhZ2VcIlxuICAgICAgICAgIFttZXNzYWdlXT1cIlxuICAgICAgICAgICAgJ0FsbCBjb2x1bW5zIGRpc2FibGVkLiBFbmFibGUgYXQgbGVhc3Qgb25lIGNvbHVtbiB0byB2aWV3IHRhYmxlIGRhdGEuJ1xuICAgICAgICAgIFwiXG4gICAgICAgID48L3Jpdi16ZXJvLXN0YXRlPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICBsZXQgZ3JvdXAgb2Ygcy5yZXN1bHQuaXNHcm91cGVkXG4gICAgICAgICAgICAgID8gcy5yZXN1bHQucm93R3JvdXBzXG4gICAgICAgICAgICAgIDogW3MucmVzdWx0LnJvd3NBc0dyb3VwXTtcbiAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlHcm91cDtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gbGFzdFxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICBzdWJoZWFkZXJUZW1wbGF0ZSB8fCBudWxsO1xuICAgICAgICAgICAgICBjb250ZXh0OiB7IHN0YXRlOiBzLCBncm91cCB9XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsgJ3N1YmNvbnRhaW5lci1ncm91cGVkJzogcy5yZXN1bHQuaXNHcm91cGVkIH1cIj5cbiAgICAgICAgICAgIDx0YWJsZT5cbiAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiEhcy5zZWxlY3Rpb24uYWxsb3dTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdGlvbi1oZWFkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHJpdi1zci1vbmx5PlNlbGVjdCByb3dzPC9yaXYtc3Itb25seT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzLnNlbGVjdGlvbi5hbGxvd1NlbGVjdGlvbiAhPT0gJ2luZGl2aWR1YWwnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzLnNlbGVjdGlvbi5hbGxvd1NlbGVjdGlvbiA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC13cmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxyaXYtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXMucmVzdWx0LmlzR3JvdXBlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicy5zZWxlY3Rpb24uaXNBbGxTZWxlY3RlZCA9PT0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zZWxlY3Rpb24uaXNBbGxTZWxlY3RlZCA9PT0gJ2luZGV0ZXJtaW5hdGUnXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHsgdHlwZTogJ2FsbFNlbGVjdGVkQ2hhbmdlJyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIlNlbGVjdCBhbGwgcm93c1wiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcml2LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgIDxyaXYtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicy5yZXN1bHQuaXNHcm91cGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJncm91cC5zZWxlY3RlZCA9PT0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJncm91cC5zZWxlY3RlZCA9PT0gJ2luZGV0ZXJtaW5hdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2dyb3VwU2VsZWN0aW9uQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIlNlbGVjdCBncm91cCByb3dzXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHMuZGlzcGxheS5jb2x1bW5zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpbm5lZF09XCJjb2x1bW4ucGlubmVkXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29sdW1uLmxlZnRcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiZ2V0V2lkdGgoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnYWJsZT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBkcm9wcGFibGU9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wLXpvbmVcIlxuICAgICAgICAgICAgICAgICAgICAoZHJhZ3N0YXJ0KT1cImRyYWdTdGFydChpLCBjb2x1bW4ua2V5KVwiXG4gICAgICAgICAgICAgICAgICAgIChkcmFnZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGRyYWdPdmVyKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgKGRyb3ApPVwiZHJvcChpLCBzLmRpc3BsYXkuZW5hYmxlZENvdW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kcmFnZ2VkLW92ZXItbGVmdF09XCJcbiAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkT3ZlckNvbHVtbklkeCA9PT0gaSAmJlxuICAgICAgICAgICAgICAgICAgICAgIGRyYWdnZWRDb2x1bW5JZHggIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkQ29sdW1uSWR4ID4gaVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZHJhZ2dlZC1vdmVyLXJpZ2h0XT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGRyYWdnZWRPdmVyQ29sdW1uSWR4ID09PSBpICYmXG4gICAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZENvbHVtbklkeCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgIGRyYWdnZWRDb2x1bW5JZHggPCBpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIWNvbHVtbi5vcmRlcmFibGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjb2x1bW4uZmlsdGVyYWJsZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXMuZGlzcGxheS5jb2x1bW5zQXJlRnJlZXphYmxlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhcy5kaXNwbGF5LmNvbHVtbnNBcmVIaWRlYWJsZVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmxlZnRdPVwiY29sdW1uLmFsaWdubWVudCA9PT0gJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MucmlnaHRdPVwiY29sdW1uLmFsaWdubWVudCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBzLmRpc3BsYXkuY29sdW1uTmFtZU1hcC5nZXQoY29sdW1uLmtleSkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxyaXYtbWVudVxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4ub3JkZXJhYmxlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZmlsdGVyYWJsZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcy5kaXNwbGF5LmNvbHVtbnNBcmVGcmVlemFibGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuZGlzcGxheS5jb2x1bW5zQXJlSGlkZWFibGVcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0cmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5sZWZ0XT1cImNvbHVtbi5hbGlnbm1lbnQgPT09ICdsZWZ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5yaWdodF09XCJjb2x1bW4uYWxpZ25tZW50ID09PSAncmlnaHQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzLnF1ZXJ5Lm9yZGVyPy5jb2x1bW4gPT09IGNvbHVtbi5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzLmRpc3BsYXkuY29sdW1uTmFtZU1hcC5nZXQoY29sdW1uLmtleSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyaXYtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiMTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucXVlcnkub3JkZXI/LmRpcmVjdGlvbiA9PT0gJ2Rlc2MnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnQXJyb3dEb3duJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ0Fycm93VXAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3Jpdi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxyaXYtdGFibGUtaGVhZGVyLXJlc2l6ZS1oYW5kbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRyYWdSZXNpemUpPVwic2V0V2lkdGgoY29sdW1uLmtleSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtdGFibGUtaGVhZGVyLXJlc2l6ZS1oYW5kbGU+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLm9yZGVyYWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnF1ZXJ5Lm9yZGVyPy5jb2x1bW4gPT09IGNvbHVtbi5rZXkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucXVlcnkub3JkZXI/LmRpcmVjdGlvbiA9PT0gJ2FzYydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29yZGVyQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hlYWRlck1lbnUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdhc2MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi5rZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0IGFzY2VuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicy5xdWVyeS5vcmRlcj8uY29sdW1uID09PSBjb2x1bW4ua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcml2LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnb3JkZXJDaGFuZ2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaGVhZGVyTWVudScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIHNvcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnF1ZXJ5Lm9yZGVyPy5jb2x1bW4gPT09IGNvbHVtbi5rZXkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucXVlcnkub3JkZXI/LmRpcmVjdGlvbiA9PT0gJ2Rlc2MnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICByaXYtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvcmRlckNoYW5nZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdoZWFkZXJNZW51JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnZGVzYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLmtleVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnQgZGVzY2VuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJpdi1tZW51LWRpdmlkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLm9yZGVyYWJsZSAmJiBjb2x1bW4uZmlsdGVyYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcml2LW1lbnUtZGl2aWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5maWx0ZXJhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZmlsdGVyQWRkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5LZXk6IGNvbHVtbi5rZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQWRkIGEgZmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPHJpdi1tZW51LWRpdmlkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb2x1bW4ub3JkZXJhYmxlIHx8IGNvbHVtbi5maWx0ZXJhYmxlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAocy5kaXNwbGF5LmNvbHVtbnNBcmVGcmVlemFibGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmRpc3BsYXkuY29sdW1uc0FyZUhpZGVhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtbWVudS1kaXZpZGVyPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzLmRpc3BsYXkuY29sdW1uc0FyZUZyZWV6YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFjb2x1bW4ucGlubmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcml2LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2x1bW5zRnJlZXplVXBUb0NoYW5nZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlemU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hlYWRlck1lbnUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4ua2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZXplIHVwIHRvIGNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnBpbm5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29sdW1uc0ZyZWV6ZVVwVG9DaGFuZ2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZXplOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaGVhZGVyTWVudScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi5rZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBVbi1mcmVlemUgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzLmRpc3BsYXkuY29sdW1uc0FyZUhpZGVhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29sdW1uRW5hYmxlZENoYW5nZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4ua2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hlYWRlck1lbnUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEhpZGUgY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvcml2LW1lbnU+XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwibWVudVRlbXBsYXRlXCIgY2xhc3M9XCJtZW51LWhlYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHJpdi1zci1vbmx5Pk1lbnU8L3Jpdi1zci1vbmx5PlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzLnJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQgPiAwOyBlbHNlIGVtcHR5XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgIGxldCByb3cgb2YgZ3JvdXAucm93cztcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcm93SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5Um93XG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcm93Qm9keT5cbiAgICAgICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMuc2VsZWN0aW9uLmFsbG93U2VsZWN0aW9uID09PSB0cnVlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMuc2VsZWN0aW9uLmFsbG93U2VsZWN0aW9uID09PSAnaW5kaXZpZHVhbCdcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdGlvbi1ib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3gtd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cml2LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkZW50aWZpZXJdPVwiJ3Jpdi10YWJsZS1zZWxlY3Rpb24tJyArIHJvdy5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJvdy5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInNlbGVjdGlvbkNoYW5nZShyb3cuaWQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIlNlbGVjdCByb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2x1bW4gb2Ygcy5kaXNwbGF5LmNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZGlzcGxheS5jZWxsUm93U3Bhbihyb3dJbmRleCwgY29sdW1uLmtleSkgYXMgc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNwYW4gPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5yb3dzcGFuXT1cInNwYW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5ycy1yaWdodC1ib3JkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmRpc3BsYXkubmVlZHNSaWdodEJvcmRlcihyb3dJbmRleCwgY29sdW1uLmtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5waW5uZWRdPVwiY29sdW1uLnBpbm5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFkdmFuY2VkXT1cImNvbHVtbi5kYXRhVHlwZSA9PT0gJ2FkdmFuY2VkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29sdW1uLmxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS50ZXh0LWFsaWduXT1cImNvbHVtbi5hbGlnbm1lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVDbGljaygkZXZlbnQsIGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFRlbXBsYXRlIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1lbnVUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1lbnUtYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVUZW1wbGF0ZSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgcm93OiByb3cgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3cucm93TGluazsgbGV0IHJsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNFeHRlcm5hbFJvd0xpbmsocmwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cInJsLmhyZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3ctbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZ3JheWVkXT1cInMuZGlzcGxheS5yb3dzQXJlR3JheWVkXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwicm93Qm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzSW50ZXJuYWxSb3dMaW5rKHJsKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJybC5yb3V0ZXJMaW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJybC5xdWVyeVBhcmFtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNIYW5kbGluZ109XCJybC5xdWVyeVBhcmFtc0hhbmRsaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm93LWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmdyYXllZF09XCJzLmRpc3BsYXkucm93c0FyZUdyYXllZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInJsLmFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInJvd0JvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXJvdy5yb3dMaW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZ3JheWVkXT1cInMuZGlzcGxheS5yb3dzQXJlR3JheWVkXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dCb2R5XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDx0ciAqbmdJZj1cInMuZGlzcGxheS5jdXN0b21TdW1tYXJ5Um93XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbHVtbiBvZiBzLmRpc3BsYXkuY29sdW1ucztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5waW5uZWRdPVwiY29sdW1uLnBpbm5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFkdmFuY2VkXT1cImNvbHVtbi5kYXRhVHlwZSA9PT0gJ2FkdmFuY2VkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29sdW1uLmxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS50ZXh0LWFsaWduXT1cImNvbHVtbi5hbGlnbm1lbnRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVRlbXBsYXRlIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgY29sdW1uOiBjb2x1bW4gfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHk+XG4gICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cInMuZGlzcGxheS5jb2x1bW5zLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxyaXYtemVyby1zdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzLmRpc3BsYXkuemVyb1N0YXRlTWVzc2FnZTsgbGV0IG1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW21lc3NhZ2VdPVwibWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcml2LXplcm8tc3RhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZm9vdGVyXCJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIHMucmVzdWx0LmlzR3JvdXBlZCAmJlxuICAgICAgICAgICAgICBncm91cC50b3RhbE1hdGNoaW5nUm93Q291bnQgPiBzLnF1ZXJ5Lmdyb3VwaW5nLmNvdW50UGVyR3JvdXAgJiZcbiAgICAgICAgICAgICAgZ3JvdXAucm93cy5sZW5ndGggPT09IHMucXVlcnkuZ3JvdXBpbmcuY291bnRQZXJHcm91cFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICByaXZMaW5rXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9vdGVyLWxpbmtcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgbWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAndmlld01vcmVLZXlDaGFuZ2UnLFxuICAgICAgICAgICAgICAgICAgdmlld01vcmVLZXk6IGdyb3VwLmdyb3VwRGF0YS5rZXkudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5WaWV3IGFsbCB7eyBncm91cC50b3RhbE1hdGNoaW5nUm93Q291bnQgfX08L3NwYW5cbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnIgKm5nSWY9XCIhbGFzdFwiIC8+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwicy5xdWVyeS5wYWdpbmF0aW9uLnNob3dDb250cm9sc1wiIGNsYXNzPVwicGFnaW5hdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFnZS1zaXplLWNvbnRyb2xzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzLnJlc3VsdC5pc0dyb3VwZWRcIj5cbiAgICAgICAgICAgIDxzcGFuPiBSZXN1bHRzIHBlciBwYWdlOiA8L3NwYW4+XG4gICAgICAgICAgICA8cml2LXNpbXBsZS1zZWxlY3RcbiAgICAgICAgICAgICAgW3NlbGVjdGVkT3B0aW9uXT1cIntcbiAgICAgICAgICAgICAgICBpZDogcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VTaXplLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgdGl0bGU6IHMucXVlcnkucGFnaW5hdGlvbi5wYWdlU2l6ZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZVNpemVcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgIChzZWxlY3RlZE9wdGlvbkNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICBtYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdwYWdlU2l6ZUNoYW5nZScsXG4gICAgICAgICAgICAgICAgICBzaXplOiAkZXZlbnQ/LnZhbHVlIHx8IDI1XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW29wdGlvbkdyb3Vwc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCInc21hbGwnXCJcbiAgICAgICAgICAgICAgW29yZGVyQnldPVwiJ3NvdXJjZSdcIlxuICAgICAgICAgICAgPjwvcml2LXNpbXBsZS1zZWxlY3Q+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3BhblxuICAgICAgICAgICpuZ0lmPVwicy5yZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50ID4gMCAmJiAhcy5yZXN1bHQuaXNHcm91cGVkXCJcbiAgICAgICAgICBjbGFzcz1cInBhZ2UtZGF0YS1pbmRpY2F0b3JcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VSb3dTdGFydCB8IHJpdk51bWJlciB9fS17e1xuICAgICAgICAgICAgcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VSb3dFbmQgfCByaXZOdW1iZXJcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9mXG4gICAgICAgICAge3sgcy5yZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50IHwgcml2TnVtYmVyIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwicy5xdWVyeS5wYWdpbmF0aW9uLnNob3dDb250cm9sc1wiXG4gICAgICAgICAgY2xhc3M9XCJwYWdpbmF0aW9uLWNvbnRyb2xzXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHJpdkJ1dHRvblxuICAgICAgICAgICAgW3ZhcmlhbnRdPVwiJ2Jhc2ljJ1wiXG4gICAgICAgICAgICBbc2l6ZV09XCInc21hbGwnXCJcbiAgICAgICAgICAgIFtpY29uXT1cIidBcnJvd0xlZnQnXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInMucXVlcnkucGFnaW5hdGlvbi5wcmV2aW91cyA9PT0gbnVsbFwiXG4gICAgICAgICAgICAoY2xpY2spPVwibWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7IHR5cGU6ICdwcmV2aW91c1BhZ2VOYXZpZ2F0ZScgfSlcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCJzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZXNbMF0gPiAwXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHJ1bmNhdGVkLXBhZ2VzIGxlZnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgICZoZWxsaXA7XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwYWdlIG9mIHMucXVlcnkucGFnaW5hdGlvbi5wYWdlc1wiXG4gICAgICAgICAgICBjbGFzcz1cInBhZ2VcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwicGFnZSA9PT0gcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoeyB0eXBlOiAncGFnZUNoYW5nZScsIHBhZ2UgfSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHBhZ2UgKyAxIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIHMucXVlcnkucGFnaW5hdGlvbi5wYWdlc1tzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZXMubGVuZ3RoIC0gMV0gPFxuICAgICAgICAgICAgICBzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZUNvdW50IC0gMVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHJ1bmNhdGVkLXBhZ2VzIHJpZ2h0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICAmaGVsbGlwO1xuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICByaXZCdXR0b25cbiAgICAgICAgICAgIFt2YXJpYW50XT1cIidiYXNpYydcIlxuICAgICAgICAgICAgW3NpemVdPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgICBbaWNvbl09XCInQXJyb3dSaWdodCdcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwicy5xdWVyeS5wYWdpbmF0aW9uLm5leHQgPT09IG51bGxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoeyB0eXBlOiAnbmV4dFBhZ2VOYXZpZ2F0ZScgfSlcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3Jpdi1sb2FkaW5nLWNvdmVyPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19
|
|
219
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdGFibGUvdGFibGUvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdGFibGUvdGFibGUvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEdBSU4sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBYyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBY3BDLE1BQU0sT0FBTyxjQUFjO0lBTjNCO1FBMENXLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRXhCLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUN2Qyw2QkFBd0IsR0FDL0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUN6RCxDQUFDO1FBaUNKLDhFQUE4RTtRQUM5RSx1RkFBdUY7UUFDdkYscUZBQXFGO1FBQ3JGLHVGQUF1RjtRQUN2RixvRkFBb0Y7UUFDcEYsOEJBQThCO1FBQzlCLG1CQUFjLEdBQUcsQ0FB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QyxtQkFBbUI7WUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkQsSUFBSSxNQUFNLENBQUMsb0JBQW9CO1lBQUUsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNELENBQUM7SUFFRCxpQkFBaUIsQ0FDZixPQUF5QjtRQUV6QixPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxpQkFBaUIsQ0FDZixPQUF5QjtRQUV6QixPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO0lBQ3JDLENBQUM7OzJHQXBPVSxjQUFjOytGQUFkLGNBQWMsdXVCQzVCM0IsdXlzQkF1aUJBOzJGRDNnQmEsY0FBYztrQkFOMUIsU0FBUzsrQkFDRSxXQUFXLG1CQUdKLHVCQUF1QixDQUFDLE1BQU07OEJBVS9DLE9BQU87c0JBRE4sS0FBSztnQkFJTixZQUFZO3NCQURYLFlBQVk7dUJBQUMsTUFBTTtnQkFPcEIsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLFNBQVM7Z0JBTXZCLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxNQUFNO2dCQUlwQixpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsV0FBVztnQkFJekIsY0FBYztzQkFEYixZQUFZO3VCQUFDLFFBQVE7Z0JBSXRCLGlCQUFpQjtzQkFEaEIsWUFBWTt1QkFBQyxXQUFXO2dCQXFLekIsT0FBTztzQkFETixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU01QyxLQUFLO3NCQURKLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgVGVtcGxhdGVSZWYsXG4gIFRyYWNrQnlGdW5jdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgbWFwLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJpdlNlbGVjdCB9IGZyb20gJy4uLy4uLy4uL2lucHV0L3NlbGVjdC9zdGF0ZSc7XG5pbXBvcnQgeyBSaXZUYWJsZSB9IGZyb20gJy4uL3N0YXRlJztcblxudHlwZSBQYWdlU2l6ZU9wdGlvbiA9IHtcbiAgaWQ6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgdmFsdWU6IG51bWJlcjtcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50PFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwID0geyBrZXk6ICcnIH0sXG4+IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIEBJbnB1dCgpXG4gIG1hbmFnZXI/OiBSaXZUYWJsZS5NYW5hZ2VyPFIsIEMsIEYsIEc+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2NlbGwnKVxuICBjZWxsVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7XG4gICAgcm93OiBSaXZUYWJsZS5GdWxsUm93PFI+O1xuICAgIGNvbHVtbjogUml2VGFibGUuRnVsbENvbHVtbjxDPjtcbiAgfT47XG5cbiAgQENvbnRlbnRDaGlsZCgnc3VtbWFyeScpXG4gIHN1bW1hcnlUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHtcbiAgICBjb2x1bW46IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz47XG4gIH0+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ21lbnUnKVxuICBtZW51VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7IHJvdzogUml2VGFibGUuRnVsbFJvdzxSPiB9PjtcblxuICBAQ29udGVudENoaWxkKCdzZWxlY3Rpb24nKVxuICBzZWxlY3Rpb25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHsgc3RhdGU6IFJpdlRhYmxlLkZ1bGxTdGF0ZTxSLCBDLCBGLCBHPiB9PjtcblxuICBAQ29udGVudENoaWxkKCdoZWFkZXInKVxuICBoZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHsgc3RhdGU6IFJpdlRhYmxlLkZ1bGxTdGF0ZTxSLCBDLCBGLCBHPiB9PjtcblxuICBAQ29udGVudENoaWxkKCdzdWJoZWFkZXInKVxuICBzdWJoZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHtcbiAgICBzdGF0ZTogUml2VGFibGUuRnVsbFN0YXRlPFIsIEMsIEYsIEc+O1xuICAgIGdyb3VwOiBSaXZUYWJsZS5Sb3dHcm91cDxSLCBHPjtcbiAgfT47XG5cbiAgcmVhZG9ubHkgZGVzdHJveSA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcmVhZG9ubHkgY29udGFpbmVyU2l6ZSA9IG5ldyBTdWJqZWN0PERPTVJlY3Q+KCk7XG4gIHJlYWRvbmx5IHNlbGVjdGlvbkNhbGxvdXRQb3NpdGlvbjogT2JzZXJ2YWJsZTxET01SZWN0PiA9XG4gICAgdGhpcy5jb250YWluZXJTaXplLnBpcGUoXG4gICAgICBtYXAocmVjdCA9PiBuZXcgRE9NUmVjdChyZWN0LnggKyA0NCwgcmVjdC55IC0gMTIsIDAsIDApKSxcbiAgICApO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLm1hbmFnZXIhLnN0YXRlLCB0aGlzLmNvbnRhaW5lclNpemVdKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSkpXG4gICAgICAuc3Vic2NyaWJlKChbc3RhdGUsIGNvbnRhaW5lclNpemVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyU2l6ZS53aWR0aDtcbiAgICAgICAgY29uc3QgdG90YWxGcm96ZW5XaWR0aCA9IHN1bShcbiAgICAgICAgICBzdGF0ZS5kaXNwbGF5LmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5waW5uZWQpLm1hcChjID0+IGMud2lkdGgpLFxuICAgICAgICApO1xuICAgICAgICBpZiAodG90YWxGcm96ZW5XaWR0aCA+IGNvbnRhaW5lcldpZHRoKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaG93IG1hbnkgY29sdW1ucyBjYW4gYmUgcGlubmVkIHdpdGhvdXQgb3ZlcmZsb3dpbmcuXG4gICAgICAgICAgZm9yIChjb25zdCBbaV0gb2Ygc3RhdGUuZGlzcGxheS5jb2x1bW5zXG4gICAgICAgICAgICAuZmlsdGVyKGMgPT4gYy5waW5uZWQpXG4gICAgICAgICAgICAuZW50cmllcygpKSB7XG4gICAgICAgICAgICBjb25zdCBzbGljZWRGcm96ZW5XaWR0aCA9IHN1bShcbiAgICAgICAgICAgICAgc3RhdGUuZGlzcGxheS5jb2x1bW5zLnNsaWNlKDAsIGkgKyAxKS5tYXAoYyA9PiBjLndpZHRoKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoc2xpY2VkRnJvemVuV2lkdGggPiBjb250YWluZXJXaWR0aCkge1xuICAgICAgICAgICAgICB0aGlzLm1hbmFnZXI/LmFjdGlvbnMubmV4dCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NvbHVtbnNGcmVlemVVcFRvQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICBpbmRleDogaSAtIDEsXG4gICAgICAgICAgICAgICAgZnJlZXplOiBpID4gMCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuaGFuZGxlRHJhZ092ZXIpO1xuICB9XG5cbiAgLy8gV2Ugb25seSBjYXJlIGFib3V0IHdoZW4gd2UgaGF2ZSBlbnRlcmVkIGEgZHJvcCB6b25lIGZvciBhcHBseWluZyBvdXIgdmlzdWFsXG4gIC8vIHRyZWF0bWVudC4gSG93ZXZlciwgaW4gb3JkZXIgdG8gdHJpZ2dlciB0aGUgZHJvcCBldmVudCwgeW91IG11c3QgY2FsbCBwcmV2ZW50RGVmYXVsdFxuICAvLyBvbiB0aGUgZHJhZ292ZXIuIFdlIGFyZSBoYW5kbGluZyB0aGlzIG5hdGl2ZWx5IG9uIHRoZSBkb2N1bWVudCwgb3V0c2lkZSBvZiBhbmd1bGFyXG4gIC8vIGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLiBJZiB3ZSBoYXZlIGEgZHJhZ2dlZE92ZXJDb2x1bW5JZHggYW5kIHdlIGRyYWcgb3ZlciBhblxuICAvLyBlbGVtZW50IHdpdGggY2xhc3MgZHJvcC16b25lLCB3ZSB3aWxsIGFzc3VtZSB5b3Ugd2FudCB0byB0aGUgZHJvcCBlbGVtZW50IGVuYWJsZWRcbiAgLy8gYW5kIHdlIHdpbGwgcHJldmVudERlZmF1bHQuXG4gIGhhbmRsZURyYWdPdmVyID0gKGV2ZW50OiBEcmFnRXZlbnQpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuZHJhZ2dlZE92ZXJDb2x1bW5JZHggIT0gbnVsbCAmJiB0YXJnZXQuY2xvc2VzdCgnLmRyb3Atem9uZScpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfTtcblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuaGFuZGxlRHJhZ092ZXIpO1xuICAgIHRoaXMuZGVzdHJveS5uZXh0KG51bGwpO1xuICB9XG5cbiAgcmVhZG9ubHkgcGFnZVNpemVPcHRpb25zOiBSaXZTZWxlY3QuT3B0aW9uR3JvdXA8UGFnZVNpemVPcHRpb24+W10gPSBbXG4gICAge1xuICAgICAgb3B0aW9uczogUml2VGFibGUucGFnZVNpemVzLm1hcChwYWdlU2l6ZSA9PiAoe1xuICAgICAgICBpZDogcGFnZVNpemUudG9TdHJpbmcoKSxcbiAgICAgICAgdGl0bGU6IHBhZ2VTaXplLnRvU3RyaW5nKCksXG4gICAgICAgIHZhbHVlOiBwYWdlU2l6ZSxcbiAgICAgIH0pKSxcbiAgICB9LFxuICBdO1xuXG4gIHJlYWRvbmx5IHRyYWNrQnlSb3c6IFRyYWNrQnlGdW5jdGlvbjxSaXZUYWJsZS5GdWxsUm93PFI+PiA9IChfLCByb3cpID0+XG4gICAgcm93LmlkO1xuICByZWFkb25seSB0cmFja0J5R3JvdXA6IFRyYWNrQnlGdW5jdGlvbjxSaXZUYWJsZS5Sb3dHcm91cDxSLCBHPj4gPSAoXG4gICAgXyxcbiAgICBncm91cCxcbiAgKSA9PiBncm91cC5ncm91cERhdGEua2V5O1xuICByZWFkb25seSB0cmFja0J5Q29sdW1uOiBUcmFja0J5RnVuY3Rpb248Uml2VGFibGUuRnVsbENvbHVtbjxDPj4gPSAoXG4gICAgXyxcbiAgICBjb2x1bW4sXG4gICkgPT4gY29sdW1uLmtleTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHRlbXBvcmFyeVdpZHRoczogTWFwPEMsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG4gIHNldFdpZHRoKGNvbHVtbjogQywgd2lkdGg6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAod2lkdGggPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHRlbXBvcmFyeVdpZHRoID0gdGhpcy50ZW1wb3JhcnlXaWR0aHMuZ2V0KGNvbHVtbik7XG4gICAgICBpZiAodGVtcG9yYXJ5V2lkdGgpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgICAgIHR5cGU6ICdjb2x1bW5XaWR0aENoYW5nZScsXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHByZWZlcnJlZFdpZHRoOiB0ZW1wb3JhcnlXaWR0aCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLnRlbXBvcmFyeVdpZHRocy5kZWxldGUoY29sdW1uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wb3JhcnlXaWR0aHMuc2V0KGNvbHVtbiwgd2lkdGgpO1xuICAgIH1cbiAgfVxuICBnZXRXaWR0aChjb2x1bW46IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz4pOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnRlbXBvcmFyeVdpZHRocy5oYXMoY29sdW1uLmtleSkpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLnRlbXBvcmFyeVdpZHRocy5nZXQoY29sdW1uLmtleSkhLCBjb2x1bW4ubWluV2lkdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY29sdW1uLndpZHRoO1xuICAgIH1cbiAgfVxuXG4gIGRyYWdnZWRDb2x1bW5JZHg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBkcmFnZ2VkQ29sdW1uS2V5OiBDIHwgbnVsbCA9IG51bGw7XG4gIGRyYWdnZWRPdmVyQ29sdW1uSWR4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBkcmFnU3RhcnQoaWR4OiBudW1iZXIsIGtleTogQykge1xuICAgIHRoaXMuZHJhZ2dlZENvbHVtbklkeCA9IGlkeDtcbiAgICB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgPSBrZXk7XG4gIH1cblxuICBkcmFnT3ZlcihvbnRvSWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLmRyYWdnZWRPdmVyQ29sdW1uSWR4ID0gb250b0lkeDtcbiAgfVxuXG4gIGRyb3Aob250b0lkeDogbnVtYmVyLCBlbmFibGVkQ29sdW1uQ291bnQ6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRyYWdnZWRDb2x1bW5JZHggIT09IG51bGwpIHtcbiAgICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgICAgdHlwZTogJ2NvbHVtbk9yZGVyQ2hhbmdlJyxcbiAgICAgICAgcHJldmlvdXNJbmRleDogdGhpcy5kcmFnZ2VkQ29sdW1uSWR4LFxuICAgICAgICBuZXdJbmRleDogb250b0lkeCxcbiAgICAgICAgc291cmNlOiAndGFibGVEcmFnJyxcbiAgICAgICAgY29sdW1uOiB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBlbmFibGVkID0gb250b0lkeCA8IGVuYWJsZWRDb2x1bW5Db3VudDtcbiAgICAgIHRoaXMuZHJvcEVuYWJsZWRTdGF0ZShlbmFibGVkLCBlbmFibGVkQ29sdW1uQ291bnQpO1xuICAgICAgdGhpcy5kcmFnZ2VkT3ZlckNvbHVtbklkeCA9IG51bGw7XG4gICAgICB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGRyb3BFbmFibGVkU3RhdGUoZW5hYmxlZDogYm9vbGVhbiwgZW5hYmxlZENvbHVtbkNvdW50OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5kcmFnZ2VkQ29sdW1uS2V5ICE9PSBudWxsICYmIHRoaXMuZHJhZ2dlZENvbHVtbklkeCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgaXNFbmFibGVkID0gZW5hYmxlZENvbHVtbkNvdW50ID4gdGhpcy5kcmFnZ2VkQ29sdW1uSWR4O1xuICAgICAgY29uc3Qgc2hvdWxkRmlyZSA9IGVuYWJsZWQgPyAhaXNFbmFibGVkIDogaXNFbmFibGVkO1xuICAgICAgaWYgKHNob3VsZEZpcmUpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgICAgIHR5cGU6ICdjb2x1bW5FbmFibGVkQ2hhbmdlJyxcbiAgICAgICAgICBjb2x1bW46IHRoaXMuZHJhZ2dlZENvbHVtbktleSxcbiAgICAgICAgICBlbmFibGVkOiBlbmFibGVkLFxuICAgICAgICAgIHNvdXJjZTogJ2RyYWdEcm9wJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZHJhZ2dlZE92ZXJDb2x1bW5JZHggPSBudWxsO1xuICAgICAgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRFcnJvck1lc3NhZ2UoZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGUubWVzc2FnZTtcbiAgICBpZiAodHlwZW9mIGUgPT09ICdzdHJpbmcnKSByZXR1cm4gZTtcbiAgICBpZiAodHlwZW9mIGUgPT09ICdvYmplY3QnICYmIGUgIT09IG51bGwpIHJldHVybiBlLnRvU3RyaW5nKCk7XG4gICAgZWxzZSByZXR1cm4gJ0FuIGVycm9yIG9jY3VycmVkLic7XG4gIH1cblxuICBwcml2YXRlIHNoaWZ0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIGtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICB0aGlzLnNoaWZ0ID0gZXZlbnQuc2hpZnRLZXk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXl1cCcsIFsnJGV2ZW50J10pXG4gIGtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgdGhpcy5zaGlmdCA9IGV2ZW50LnNoaWZ0S2V5O1xuICB9XG5cbiAgc2VsZWN0aW9uQ2hhbmdlKHJvd0lkOiBSWydpZCddLCBzZWxlY3RlZDogYm9vbGVhbikge1xuICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgIHR5cGU6ICdyb3dTZWxlY3RlZENoYW5nZScsXG4gICAgICBpZDogcm93SWQsXG4gICAgICBzZWxlY3RlZCxcbiAgICAgIGNvbnRpZ3VvdXM6IHRoaXMuc2hpZnQsXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVDbGljayhldmVudDogTW91c2VFdmVudCwgY29sdW1uOiBSaXZUYWJsZS5GdWxsQ29sdW1uPEM+KSB7XG4gICAgaWYgKGNvbHVtbi5jbGlja1ByZXZlbnREZWZhdWx0KSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChjb2x1bW4uY2xpY2tTdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgaXNFeHRlcm5hbFJvd0xpbmsoXG4gICAgcm93TGluazogUml2VGFibGUuUm93TGluayxcbiAgKTogcm93TGluayBpcyBSaXZUYWJsZS5FeHRlcm5hbFJvd0xpbmsge1xuICAgIHJldHVybiByb3dMaW5rLnR5cGUgPT09ICdleHRlcm5hbCc7XG4gIH1cblxuICBpc0ludGVybmFsUm93TGluayhcbiAgICByb3dMaW5rOiBSaXZUYWJsZS5Sb3dMaW5rLFxuICApOiByb3dMaW5rIGlzIFJpdlRhYmxlLkludGVybmFsUm93TGluayB7XG4gICAgcmV0dXJuIHJvd0xpbmsudHlwZSA9PT0gJ2ludGVybmFsJztcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1hbmFnZXI/LnN0YXRlIHwgYXN5bmM7IGxldCBzXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3Rpb25DYWxsb3V0UG9zaXRpb24gfCBhc3luYzsgbGV0IHBvc2l0aW9uXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInMuc2VsZWN0aW9uLnNlbGVjdGVkQ291bnQgPiAwICYmIHNlbGVjdGlvblRlbXBsYXRlXCI+XG4gICAgICA8cml2LWNhbGxvdXRcbiAgICAgICAgKnJpdi1vdmVybGF5XG4gICAgICAgIFthbmNob3JdPVwicG9zaXRpb25cIlxuICAgICAgICBbaXNNb2RhbF09XCJmYWxzZVwiXG4gICAgICAgIFt0aGVtZV09XCInbGlnaHQnXCJcbiAgICAgICAgW3Nob3dDYXJldF09XCJmYWxzZVwiXG4gICAgICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCIndG9wLXJpZ2h0J1wiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInNlbGVjdGlvblRlbXBsYXRlOyBjb250ZXh0OiB7IHN0YXRlOiBzIH1cIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3Jpdi1jYWxsb3V0PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cImxvYWRpbmctY29udGFpbmVyXCI+XG4gICAgPGhlYWRlciAqbmdJZj1cImhlYWRlclRlbXBsYXRlXCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyVGVtcGxhdGU7IGNvbnRleHQ6IHsgc3RhdGU6IHMgfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9oZWFkZXI+XG4gICAgPHJpdi1sb2FkaW5nLWNvdmVyXG4gICAgICBjbGFzcz1cImNvbnRhaW5lci1sb2FkZXItd3JhcHBlclwiXG4gICAgICBbbG9hZGluZ109XCJzLmxvYWQubG9hZGluZ1wiXG4gICAgICBbZXJyb3JNZXNzYWdlXT1cInMubG9hZC5lcnJvciA/IGdldEVycm9yTWVzc2FnZShzLmxvYWQuZXJyb3IpIDogdW5kZWZpbmVkXCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY29udGFpbmVyXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICdjb250YWluZXItdW5ncm91cGVkJzogIXMucmVzdWx0LmlzR3JvdXBlZCxcbiAgICAgICAgICAnaGFzLWhlYWRlcic6ICFzLnJlc3VsdC5pc0dyb3VwZWQgJiYgaGVhZGVyVGVtcGxhdGUsXG4gICAgICAgICAgJ3dpdGhvdXQtY29sdW1ucyc6IHMuZGlzcGxheS5jb2x1bW5zLmxlbmd0aCA9PT0gMFxuICAgICAgICB9XCJcbiAgICAgICAgKHJpdkNsaWVudFNpemUpPVwiY29udGFpbmVyU2l6ZS5uZXh0KCRldmVudClcIlxuICAgICAgPlxuICAgICAgICA8cml2LXplcm8tc3RhdGVcbiAgICAgICAgICAqbmdJZj1cInMuZGlzcGxheS5jb2x1bW5zLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgY2xhc3M9XCJuby1jb2x1bW5zLW1lc3NhZ2VcIlxuICAgICAgICAgIFttZXNzYWdlXT1cIlxuICAgICAgICAgICAgJ0FsbCBjb2x1bW5zIGRpc2FibGVkLiBFbmFibGUgYXQgbGVhc3Qgb25lIGNvbHVtbiB0byB2aWV3IHRhYmxlIGRhdGEuJ1xuICAgICAgICAgIFwiXG4gICAgICAgID48L3Jpdi16ZXJvLXN0YXRlPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICBsZXQgZ3JvdXAgb2Ygcy5yZXN1bHQuaXNHcm91cGVkXG4gICAgICAgICAgICAgID8gcy5yZXN1bHQucm93R3JvdXBzXG4gICAgICAgICAgICAgIDogW3MucmVzdWx0LnJvd3NBc0dyb3VwXTtcbiAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlHcm91cDtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gbGFzdFxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICBzdWJoZWFkZXJUZW1wbGF0ZSB8fCBudWxsO1xuICAgICAgICAgICAgICBjb250ZXh0OiB7IHN0YXRlOiBzLCBncm91cCB9XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsgJ3N1YmNvbnRhaW5lci1ncm91cGVkJzogcy5yZXN1bHQuaXNHcm91cGVkIH1cIj5cbiAgICAgICAgICAgIDx0YWJsZT5cbiAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiEhcy5zZWxlY3Rpb24uYWxsb3dTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdGlvbi1oZWFkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHJpdi1zci1vbmx5PlNlbGVjdCByb3dzPC9yaXYtc3Itb25seT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzLnNlbGVjdGlvbi5hbGxvd1NlbGVjdGlvbiAhPT0gJ2luZGl2aWR1YWwnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzLnNlbGVjdGlvbi5hbGxvd1NlbGVjdGlvbiA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC13cmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxyaXYtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXMucmVzdWx0LmlzR3JvdXBlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicy5zZWxlY3Rpb24uaXNBbGxTZWxlY3RlZCA9PT0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zZWxlY3Rpb24uaXNBbGxTZWxlY3RlZCA9PT0gJ2luZGV0ZXJtaW5hdGUnXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHsgdHlwZTogJ2FsbFNlbGVjdGVkQ2hhbmdlJyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIlNlbGVjdCBhbGwgcm93c1wiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcml2LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgIDxyaXYtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicy5yZXN1bHQuaXNHcm91cGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJncm91cC5zZWxlY3RlZCA9PT0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJncm91cC5zZWxlY3RlZCA9PT0gJ2luZGV0ZXJtaW5hdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2dyb3VwU2VsZWN0aW9uQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIlNlbGVjdCBncm91cCByb3dzXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHMuZGlzcGxheS5jb2x1bW5zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpbm5lZF09XCJjb2x1bW4ucGlubmVkXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29sdW1uLmxlZnRcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiZ2V0V2lkdGgoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnYWJsZT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBkcm9wcGFibGU9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wLXpvbmVcIlxuICAgICAgICAgICAgICAgICAgICAoZHJhZ3N0YXJ0KT1cImRyYWdTdGFydChpLCBjb2x1bW4ua2V5KVwiXG4gICAgICAgICAgICAgICAgICAgIChkcmFnZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGRyYWdPdmVyKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgKGRyb3ApPVwiZHJvcChpLCBzLmRpc3BsYXkuZW5hYmxlZENvdW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kcmFnZ2VkLW92ZXItbGVmdF09XCJcbiAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkT3ZlckNvbHVtbklkeCA9PT0gaSAmJlxuICAgICAgICAgICAgICAgICAgICAgIGRyYWdnZWRDb2x1bW5JZHggIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkQ29sdW1uSWR4ID4gaVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZHJhZ2dlZC1vdmVyLXJpZ2h0XT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGRyYWdnZWRPdmVyQ29sdW1uSWR4ID09PSBpICYmXG4gICAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZENvbHVtbklkeCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgIGRyYWdnZWRDb2x1bW5JZHggPCBpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIWNvbHVtbi5vcmRlcmFibGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjb2x1bW4uZmlsdGVyYWJsZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXMuZGlzcGxheS5jb2x1bW5zQXJlRnJlZXphYmxlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhcy5kaXNwbGF5LmNvbHVtbnNBcmVIaWRlYWJsZVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmxlZnRdPVwiY29sdW1uLmFsaWdubWVudCA9PT0gJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MucmlnaHRdPVwiY29sdW1uLmFsaWdubWVudCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBzLmRpc3BsYXkuY29sdW1uTmFtZU1hcC5nZXQoY29sdW1uLmtleSkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxyaXYtbWVudVxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4ub3JkZXJhYmxlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZmlsdGVyYWJsZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcy5kaXNwbGF5LmNvbHVtbnNBcmVGcmVlemFibGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuZGlzcGxheS5jb2x1bW5zQXJlSGlkZWFibGVcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0cmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5sZWZ0XT1cImNvbHVtbi5hbGlnbm1lbnQgPT09ICdsZWZ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5yaWdodF09XCJjb2x1bW4uYWxpZ25tZW50ID09PSAncmlnaHQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzLnF1ZXJ5Lm9yZGVyPy5jb2x1bW4gPT09IGNvbHVtbi5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzLmRpc3BsYXkuY29sdW1uTmFtZU1hcC5nZXQoY29sdW1uLmtleSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyaXYtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiMTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucXVlcnkub3JkZXI/LmRpcmVjdGlvbiA9PT0gJ2Rlc2MnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnQXJyb3dEb3duJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ0Fycm93VXAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3Jpdi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxyaXYtdGFibGUtaGVhZGVyLXJlc2l6ZS1oYW5kbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRyYWdSZXNpemUpPVwic2V0V2lkdGgoY29sdW1uLmtleSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtdGFibGUtaGVhZGVyLXJlc2l6ZS1oYW5kbGU+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLm9yZGVyYWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnF1ZXJ5Lm9yZGVyPy5jb2x1bW4gPT09IGNvbHVtbi5rZXkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucXVlcnkub3JkZXI/LmRpcmVjdGlvbiA9PT0gJ2FzYydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29yZGVyQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hlYWRlck1lbnUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdhc2MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi5rZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0IGFzY2VuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicy5xdWVyeS5vcmRlcj8uY29sdW1uID09PSBjb2x1bW4ua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcml2LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnb3JkZXJDaGFuZ2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaGVhZGVyTWVudScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIHNvcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnF1ZXJ5Lm9yZGVyPy5jb2x1bW4gPT09IGNvbHVtbi5rZXkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucXVlcnkub3JkZXI/LmRpcmVjdGlvbiA9PT0gJ2Rlc2MnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICByaXYtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvcmRlckNoYW5nZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdoZWFkZXJNZW51JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnZGVzYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLmtleVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnQgZGVzY2VuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJpdi1tZW51LWRpdmlkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLm9yZGVyYWJsZSAmJiBjb2x1bW4uZmlsdGVyYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcml2LW1lbnUtZGl2aWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5maWx0ZXJhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZmlsdGVyQWRkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5LZXk6IGNvbHVtbi5rZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQWRkIGEgZmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPHJpdi1tZW51LWRpdmlkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb2x1bW4ub3JkZXJhYmxlIHx8IGNvbHVtbi5maWx0ZXJhYmxlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAocy5kaXNwbGF5LmNvbHVtbnNBcmVGcmVlemFibGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmRpc3BsYXkuY29sdW1uc0FyZUhpZGVhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtbWVudS1kaXZpZGVyPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzLmRpc3BsYXkuY29sdW1uc0FyZUZyZWV6YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFjb2x1bW4ucGlubmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcml2LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2x1bW5zRnJlZXplVXBUb0NoYW5nZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlemU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hlYWRlck1lbnUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4ua2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZXplIHVwIHRvIGNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnBpbm5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29sdW1uc0ZyZWV6ZVVwVG9DaGFuZ2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZXplOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaGVhZGVyTWVudScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi5rZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBVbi1mcmVlemUgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzLmRpc3BsYXkuY29sdW1uc0FyZUhpZGVhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29sdW1uRW5hYmxlZENoYW5nZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4ua2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hlYWRlck1lbnUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEhpZGUgY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvcml2LW1lbnU+XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwibWVudVRlbXBsYXRlXCIgY2xhc3M9XCJtZW51LWhlYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHJpdi1zci1vbmx5Pk1lbnU8L3Jpdi1zci1vbmx5PlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzLnJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQgPiAwOyBlbHNlIGVtcHR5XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgIGxldCByb3cgb2YgZ3JvdXAucm93cztcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcm93SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5Um93XG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcm93Qm9keT5cbiAgICAgICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMuc2VsZWN0aW9uLmFsbG93U2VsZWN0aW9uID09PSB0cnVlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMuc2VsZWN0aW9uLmFsbG93U2VsZWN0aW9uID09PSAnaW5kaXZpZHVhbCdcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdGlvbi1ib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3gtd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cml2LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkZW50aWZpZXJdPVwiJ3Jpdi10YWJsZS1zZWxlY3Rpb24tJyArIHJvdy5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJvdy5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInNlbGVjdGlvbkNoYW5nZShyb3cuaWQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIlNlbGVjdCByb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2x1bW4gb2Ygcy5kaXNwbGF5LmNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZGlzcGxheS5jZWxsUm93U3Bhbihyb3dJbmRleCwgY29sdW1uLmtleSkgYXMgc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNwYW4gPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5yb3dzcGFuXT1cInNwYW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5ycy1yaWdodC1ib3JkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmRpc3BsYXkubmVlZHNSaWdodEJvcmRlcihyb3dJbmRleCwgY29sdW1uLmtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5waW5uZWRdPVwiY29sdW1uLnBpbm5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFkdmFuY2VkXT1cImNvbHVtbi5kYXRhVHlwZSA9PT0gJ2FkdmFuY2VkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29sdW1uLmxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS50ZXh0LWFsaWduXT1cImNvbHVtbi5hbGlnbm1lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVDbGljaygkZXZlbnQsIGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFRlbXBsYXRlIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1lbnVUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1lbnUtYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVUZW1wbGF0ZSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgcm93OiByb3cgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3cucm93TGluazsgbGV0IHJsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNFeHRlcm5hbFJvd0xpbmsocmwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cInJsLmhyZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3ctbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZ3JheWVkXT1cInMuZGlzcGxheS5yb3dzQXJlR3JheWVkXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwicm93Qm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzSW50ZXJuYWxSb3dMaW5rKHJsKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJybC5yb3V0ZXJMaW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJybC5xdWVyeVBhcmFtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNIYW5kbGluZ109XCJybC5xdWVyeVBhcmFtc0hhbmRsaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm93LWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmdyYXllZF09XCJzLmRpc3BsYXkucm93c0FyZUdyYXllZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInJsLmFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInJvd0JvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXJvdy5yb3dMaW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZ3JheWVkXT1cInMuZGlzcGxheS5yb3dzQXJlR3JheWVkXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dCb2R5XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDx0ciAqbmdJZj1cInMuZGlzcGxheS5jdXN0b21TdW1tYXJ5Um93XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbHVtbiBvZiBzLmRpc3BsYXkuY29sdW1ucztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5waW5uZWRdPVwiY29sdW1uLnBpbm5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFkdmFuY2VkXT1cImNvbHVtbi5kYXRhVHlwZSA9PT0gJ2FkdmFuY2VkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29sdW1uLmxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS50ZXh0LWFsaWduXT1cImNvbHVtbi5hbGlnbm1lbnRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVRlbXBsYXRlIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgY29sdW1uOiBjb2x1bW4gfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHk+XG4gICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cInMuZGlzcGxheS5jb2x1bW5zLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxyaXYtemVyby1zdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzLmRpc3BsYXkuemVyb1N0YXRlTWVzc2FnZTsgbGV0IG1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW21lc3NhZ2VdPVwibWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcml2LXplcm8tc3RhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZm9vdGVyXCJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIHMucmVzdWx0LmlzR3JvdXBlZCAmJlxuICAgICAgICAgICAgICBncm91cC50b3RhbE1hdGNoaW5nUm93Q291bnQgPiBzLnF1ZXJ5Lmdyb3VwaW5nLmNvdW50UGVyR3JvdXAgJiZcbiAgICAgICAgICAgICAgZ3JvdXAucm93cy5sZW5ndGggPT09IHMucXVlcnkuZ3JvdXBpbmcuY291bnRQZXJHcm91cFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICByaXZMaW5rXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9vdGVyLWxpbmtcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgbWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAndmlld01vcmVLZXlDaGFuZ2UnLFxuICAgICAgICAgICAgICAgICAgdmlld01vcmVLZXk6IGdyb3VwLmdyb3VwRGF0YS5rZXkudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5WaWV3IGFsbCB7eyBncm91cC50b3RhbE1hdGNoaW5nUm93Q291bnQgfX08L3NwYW5cbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnIgKm5nSWY9XCIhbGFzdFwiIC8+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwicy5xdWVyeS5wYWdpbmF0aW9uLnNob3dDb250cm9sc1wiIGNsYXNzPVwicGFnaW5hdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFnZS1zaXplLWNvbnRyb2xzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzLnJlc3VsdC5pc0dyb3VwZWRcIj5cbiAgICAgICAgICAgIDxzcGFuPiBSZXN1bHRzIHBlciBwYWdlOiA8L3NwYW4+XG4gICAgICAgICAgICA8cml2LXNpbXBsZS1zZWxlY3RcbiAgICAgICAgICAgICAgW3NlbGVjdGVkT3B0aW9uXT1cIntcbiAgICAgICAgICAgICAgICBpZDogcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VTaXplLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgdGl0bGU6IHMucXVlcnkucGFnaW5hdGlvbi5wYWdlU2l6ZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZVNpemVcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgIChzZWxlY3RlZE9wdGlvbkNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICBtYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdwYWdlU2l6ZUNoYW5nZScsXG4gICAgICAgICAgICAgICAgICBzaXplOiAkZXZlbnQ/LnZhbHVlIHx8IDI1XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW29wdGlvbkdyb3Vwc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCInc21hbGwnXCJcbiAgICAgICAgICAgICAgW29yZGVyQnldPVwiJ3NvdXJjZSdcIlxuICAgICAgICAgICAgPjwvcml2LXNpbXBsZS1zZWxlY3Q+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3BhblxuICAgICAgICAgICpuZ0lmPVwicy5yZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50ID4gMCAmJiAhcy5yZXN1bHQuaXNHcm91cGVkXCJcbiAgICAgICAgICBjbGFzcz1cInBhZ2UtZGF0YS1pbmRpY2F0b3JcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VSb3dTdGFydCB8IHJpdk51bWJlciB9fS17e1xuICAgICAgICAgICAgcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VSb3dFbmQgfCByaXZOdW1iZXJcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9mXG4gICAgICAgICAge3sgcy5yZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50IHwgcml2TnVtYmVyIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwicy5xdWVyeS5wYWdpbmF0aW9uLnNob3dDb250cm9sc1wiXG4gICAgICAgICAgY2xhc3M9XCJwYWdpbmF0aW9uLWNvbnRyb2xzXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHJpdkJ1dHRvblxuICAgICAgICAgICAgW3ZhcmlhbnRdPVwiJ2Jhc2ljJ1wiXG4gICAgICAgICAgICBbc2l6ZV09XCInc21hbGwnXCJcbiAgICAgICAgICAgIFtpY29uXT1cIidBcnJvd0xlZnQnXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInMucXVlcnkucGFnaW5hdGlvbi5wcmV2aW91cyA9PT0gbnVsbFwiXG4gICAgICAgICAgICAoY2xpY2spPVwibWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7IHR5cGU6ICdwcmV2aW91c1BhZ2VOYXZpZ2F0ZScgfSlcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCJzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZXNbMF0gPiAwXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHJ1bmNhdGVkLXBhZ2VzIGxlZnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgICZoZWxsaXA7XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwYWdlIG9mIHMucXVlcnkucGFnaW5hdGlvbi5wYWdlc1wiXG4gICAgICAgICAgICBjbGFzcz1cInBhZ2VcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwicGFnZSA9PT0gcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoeyB0eXBlOiAncGFnZUNoYW5nZScsIHBhZ2UgfSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHBhZ2UgKyAxIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIHMucXVlcnkucGFnaW5hdGlvbi5wYWdlc1tzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZXMubGVuZ3RoIC0gMV0gPFxuICAgICAgICAgICAgICBzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZUNvdW50IC0gMVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHJ1bmNhdGVkLXBhZ2VzIHJpZ2h0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICAmaGVsbGlwO1xuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICByaXZCdXR0b25cbiAgICAgICAgICAgIFt2YXJpYW50XT1cIidiYXNpYydcIlxuICAgICAgICAgICAgW3NpemVdPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgICBbaWNvbl09XCInQXJyb3dSaWdodCdcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwicy5xdWVyeS5wYWdpbmF0aW9uLm5leHQgPT09IG51bGxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoeyB0eXBlOiAnbmV4dFBhZ2VOYXZpZ2F0ZScgfSlcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3Jpdi1sb2FkaW5nLWNvdmVyPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19
|